From f96298413fcac62d5ec64826e9a6e90ff0da3537 Mon Sep 17 00:00:00 2001 From: quantmind-br Date: Sun, 11 Oct 2026 19:29:22 -0300 Subject: [PATCH 1/7] M12: formulas in German, Brazilian Portuguese and Russian, full Spanish table MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The interface language picks the formula language, as in Excel. Each language is a data table in crates/formula/src/input/.rs (function names, booleans, errors, structured reference specifiers and separators) behind one Dialect, so the lexer, parser and display printer take no per-language code: - es (424 names), de (403), pt-BR (412), ru (459), each entry with its source; Microsoft's localized pages are machine-translated, so a name needs two agreeing signals - local error literals (#WERT!, #Н/Д, #¡VALOR!), longest match wins - local table specifiers ([#Kopfzeilen], [#Эта строка]) and separators inside [] - German `.` between array columns; Russian `:` between array rows (no row ranges inside braces), merged with upstream trim references (A1.:.F10, 1.:3) - LET/LAMBDA bindings and workbook names shadow local names case-insensitively in any script - editor autocomplete and argument hints take Unicode names; Insert Function searches and sorts by the local name; help shows the local name with local separators - Czech and French interfaces keep English formulas until they get a table Files, clipboard, engine commands, CLI and MCP keep canonical English syntax. --- README.md | 2 +- ROADMAP.md | 9 +- crates/calc/src/tests.rs | 9 + crates/formula/src/input.rs | 282 ++++++-- crates/formula/src/input/de.rs | 476 +++++++++++++ crates/formula/src/input/es.rs | 506 ++++++++++++++ crates/formula/src/input/pt.rs | 490 +++++++++++++ crates/formula/src/input/ru.rs | 870 ++++++++++++++++++++++++ crates/formula/src/lexer.rs | 26 +- crates/formula/src/parser.rs | 8 +- crates/formula/tests/localized_input.rs | 138 ++++ crates/ui-egui/src/dialogs.rs | 15 +- crates/ui-egui/src/editor.rs | 44 +- crates/ui-egui/src/formula_locale.rs | 10 +- crates/ui-egui/src/i18n.rs | 12 +- crates/ui-egui/tests/formula_locale.rs | 28 +- docs/decisions.md | 17 +- docs/formula-input.md | 78 ++- docs/function-parity.md | 5 +- docs/localization-parity.md | 20 +- 20 files changed, 2910 insertions(+), 135 deletions(-) create mode 100644 crates/formula/src/input/de.rs create mode 100644 crates/formula/src/input/es.rs create mode 100644 crates/formula/src/input/pt.rs create mode 100644 crates/formula/src/input/ru.rs create mode 100644 crates/formula/tests/localized_input.rs diff --git a/README.md b/README.md index 678495f1d..e028acf03 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ cargo run --release -p gridcraft -- --sample sales --control 7979 # + JSON con cargo xtask ci # fmt, clippy, tests, assets, layering, wasm ``` -Choose Español under View → Interface language for [Spanish formula names, decimal commas, and semicolon arguments](docs/formula-input.md). +Choose Español, Deutsch, Português (Brasil) or Русский under View → Interface language for [local formula names, booleans, errors and separators](docs/formula-input.md). Workbooks, clipboard exchange, and programmatic APIs retain canonical English syntax. ### Web diff --git a/ROADMAP.md b/ROADMAP.md index 070552d07..7b8ce5794 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -93,8 +93,11 @@ The ribbon is translated into Japanese, Simplified Chinese, Korean, Brazilian Po and German (266–268 labels each, ~12% of ~2,200 strings; merged 10-10 in #31, #104, #82, German added 10-11), the interface follows the system language, and CJK, Thai and Hebrew text falls back to system fonts -(#38). Dialogs, menus and messages are English; formulas and number formats are en-US only. -Localized German formulas and numbers are in PR #163. Detail: [localization-parity.md](docs/localization-parity.md). +(#38). Dialogs, menus and messages are English. Formulas follow the interface language in +Spanish, German, Brazilian Portuguese and Russian (function names, booleans, errors, table +specifiers and separators at the editor; files keep English: [formula-input.md](docs/formula-input.md)); +number formats are en-US only. PR #163 (German formulas and numbers) is open. Detail: +[localization-parity.md](docs/localization-parity.md). | Language | Code | Status | UI strings | |---|---|---|---| @@ -148,6 +151,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | 2026-10-12 | Ink strokes save as unfilled DrawingML paths and reopen as editable ink with their points, colour and width; icons in #551 remain a follow-up | | 2026-10-12 | The selection outline stays visible when extended to the last row (Ctrl+Shift+Down): its sides are cut to the viewport instead of stroking a 20-million-point rectangle (#687) | | 2026-10-12 | File › Print selects a system printer, copies, duplex and grayscale, submits PDF jobs through craft-print on a worker and shows spooler errors; browser printing and PDF export remain available | +| 2026-10-11 | Formulas in German, Brazilian Portuguese and Russian, and the full Spanish table: 403–459 local function names per language, local booleans, errors and table specifiers, each language's separators, Unicode autocomplete and Insert Function search; files and APIs keep English | | 2026-10-11 | Command-sequence fuzzing: random command sequences checked against undo/redo, XLSX round-trip and full recalculation; fixes for the table, legacy-array, spill, AutoSum, Watch Window and sheet-copy bugs it found | | 2026-10-11 | Password-protected workbooks open: GridCraft asks for the password and decrypts Agile and Standard encryption (#11) | | 2026-10-11 | Text boxes keep their formatting: run size, bold, italic, typeface, text colour and outline, alignment, vertical anchor and "no outline" (#377) | @@ -200,6 +204,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | 2026-10-12 | minor | Progress log: margins dragged on the Page Layout rulers (#792) | | 2026-10-12 | minor | Ink preservation across XLSX save/reopen (ink portion of #551) | | 2026-10-12 | minor | Desktop File > Print now discovers printers and submits PDF jobs through pinned craft-print with printer choice, copies, duplex and grayscale; browser printing and PDF export remain available. Remaining print parity includes page ranges and driver-specific tray/options UI; physical printer fidelity needs hardware validation. | +| 2026-10-11 | minor | Languages: formulas follow the interface language in es, de, pt-BR and ru; progress log row | | 2026-10-11 | minor | Password-encrypted workbooks open (#11); progress log row | | 2026-10-11 | minor | Forecast Sheet (#322); progress log row | | 2026-10-11 | minor | Worksheet functions 505 / 523 (ODD* bond functions); progress log row | diff --git a/crates/calc/src/tests.rs b/crates/calc/src/tests.rs index 196c57de7..bdc0218f9 100644 --- a/crates/calc/src/tests.rs +++ b/crates/calc/src/tests.rs @@ -1266,3 +1266,12 @@ fn offset_extreme_arguments_return_ref() { assert_eq!(crate::evaluate(&wb, 0, c("D1"), formula), Value::Number(expected), "{formula}"); } } + +#[test] +fn formula_language_tables_only_name_functions_the_engine_knows() { + // A typo'd canonical name in a language table would turn a valid local name into #NAME?. + for locale in gridcraft_formula::FormulaLocale::ALL { + let unknown: Vec<&str> = locale.translations().iter().map(|(en, _)| *en).filter(|en| !crate::eval::is_known_function(en)).collect(); + assert!(unknown.is_empty(), "{locale:?}: {unknown:?}"); + } +} diff --git a/crates/formula/src/input.rs b/crates/formula/src/input.rs index 8568023ed..20dadbe50 100644 --- a/crates/formula/src/input.rs +++ b/crates/formula/src/input.rs @@ -1,61 +1,220 @@ //! Localized aliases accepted at user-entry boundaries; file syntax stays English. +//! +//! Each formula language is a [`Dialect`]: function names, booleans, error literals and +//! structured-reference specifiers as that language's Excel spells them, and its separators. +//! Functions a language doesn't list keep their English name, and English names are accepted in +//! every language. + +use gridcraft_core::CellError; use crate::{Expr, ParseError, parser}; -/// Formula-entry syntax selected by the interface language. Other interface languages -/// currently use the canonical English function table until a translation table is supplied. +mod de; +mod es; +mod pt; +mod ru; + +/// Formula-entry syntax selected by the interface language. Interface languages without a +/// formula table (Japanese, Chinese and Korean Excel use English names; Czech, French and Serbian +/// have no table yet) use [`FormulaLocale::En`]. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub enum FormulaLocale { #[default] En, Es, + De, + PtBr, + Ru, +} + +/// One formula language's words and separators. +pub(crate) struct Dialect { + list: char, + decimal: char, + array_column: char, + array_row: char, + bool_true: &'static str, + bool_false: &'static str, + /// Every error literal, as this language spells it. + errors: &'static [(CellError, &'static str)], + /// The local spellings of [`TABLE_ITEMS`], in the same order. + table_items: [&'static str; 5], + /// `(canonical, local)` for the functions spelled differently from English, sorted by the + /// canonical name. + functions: &'static [(&'static str, &'static str)], } -const SPANISH: &[(&str, &str)] = &[ - ("SUM", "SUMA"), - ("AVERAGE", "PROMEDIO"), - ("IF", "SI"), - ("COUNT", "CONTAR"), - ("SUMIF", "SUMAR.SI"), - ("COUNTIF", "CONTAR.SI"), - ("VLOOKUP", "BUSCARV"), - ("TODAY", "HOY"), - ("TRUE", "VERDADERO"), - ("FALSE", "FALSO"), -]; +/// Structured-reference specifiers in canonical syntax. +const TABLE_ITEMS: [&str; 5] = ["#All", "#Data", "#Headers", "#Totals", "#This Row"]; impl FormulaLocale { + pub const ALL: [Self; 5] = [Self::En, Self::Es, Self::De, Self::PtBr, Self::Ru]; + + fn dialect(self) -> Option<&'static Dialect> { + match self { + Self::En => None, + Self::Es => Some(&es::DIALECT), + Self::De => Some(&de::DIALECT), + Self::PtBr => Some(&pt::DIALECT), + Self::Ru => Some(&ru::DIALECT), + } + } + pub fn list_separator(self) -> char { - if self == Self::Es { ';' } else { ',' } + self.dialect().map_or(',', |d| d.list) } pub fn decimal_separator(self) -> char { - if self == Self::Es { ',' } else { '.' } + self.dialect().map_or('.', |d| d.decimal) } pub fn array_column_separator(self) -> char { - if self == Self::Es { '\\' } else { ',' } + self.dialect().map_or(',', |d| d.array_column) + } + pub fn array_row_separator(self) -> char { + self.dialect().map_or(';', |d| d.array_row) } + + /// The local name of a canonical function name (itself when the language keeps English). pub fn function_name(self, canonical: &str) -> &str { - if self == Self::Es { - SPANISH.iter().find(|(en, _)| en.eq_ignore_ascii_case(canonical)).map(|(_, es)| *es).unwrap_or(canonical) - } else { - canonical - } + self.dialect() + .and_then(|d| d.functions.binary_search_by(|(en, _)| cmp_ascii_ignore_case(en, canonical)).ok().and_then(|i| d.functions.get(i))) + .map_or(canonical, |(_, local)| *local) } + + /// The canonical name of a local function name, case-insensitively (itself when it isn't one). pub fn canonical_name(self, localized: &str) -> &str { - if self == Self::Es { - SPANISH.iter().find(|(_, es)| es.eq_ignore_ascii_case(localized)).map(|(en, _)| *en).unwrap_or(localized) + self.dialect().and_then(|d| d.functions.iter().find(|(_, local)| eq_ignore_case(local, localized))).map_or(localized, |(en, _)| *en) + } + + /// `(canonical, local)` for every function this language spells differently from English, + /// sorted by the canonical name. + pub fn translations(self) -> &'static [(&'static str, &'static str)] { + self.dialect().map_or(&[], |d| d.functions) + } + + pub fn boolean_name(self, value: bool) -> &'static str { + match (self.dialect(), value) { + (Some(d), true) => d.bool_true, + (Some(d), false) => d.bool_false, + (None, true) => "TRUE", + (None, false) => "FALSE", + } + } + + /// The boolean a local word spells, case-insensitively. English `TRUE`/`FALSE` are lexed as + /// booleans in every language, so only the local words are matched here. + pub(crate) fn boolean(self, word: &str) -> Option { + let d = self.dialect()?; + if eq_ignore_case(word, d.bool_true) { + Some(true) + } else if eq_ignore_case(word, d.bool_false) { + Some(false) } else { - localized + None + } + } + + pub fn error_name(self, error: CellError) -> &'static str { + self.dialect().and_then(|d| d.errors.iter().find(|(e, _)| *e == error)).map_or_else(|| error.as_str(), |(_, local)| *local) + } + + /// The longest local error literal `text` starts with, and its length in characters. + pub(crate) fn error_prefix(self, text: &str) -> Option<(CellError, usize)> { + let d = self.dialect()?; + d.errors + .iter() + .filter(|(_, local)| starts_with_ignore_case(text, local)) + .map(|(e, local)| (*e, local.chars().count())) + .max_by_key(|(_, len)| *len) + } + + /// Converts the inside of a local structured reference (`[...]` without its outer brackets) + /// to canonical syntax: specifiers in English, `,` between bracketed items. + pub(crate) fn struct_to_canonical(self, inner: &str) -> String { + match self.dialect() { + Some(d) => translate_struct(inner, &d.table_items, &TABLE_ITEMS, d.list, ','), + None => inner.to_string(), } } + + /// Converts the inside of a canonical structured reference to this language. + pub(crate) fn struct_to_local(self, inner: &str) -> String { + match self.dialect() { + Some(d) => translate_struct(inner, &TABLE_ITEMS, &d.table_items, ',', d.list), + None => inner.to_string(), + } + } +} + +fn cmp_ascii_ignore_case(a: &str, b: &str) -> std::cmp::Ordering { + a.bytes().map(|c| c.to_ascii_uppercase()).cmp(b.bytes().map(|c| c.to_ascii_uppercase())) +} + +/// Unicode case-insensitive equality (`zählenwenn` = `ZÄHLENWENN`, `сумм` = `СУММ`). +fn eq_ignore_case(a: &str, b: &str) -> bool { + a.chars().flat_map(char::to_uppercase).eq(b.chars().flat_map(char::to_uppercase)) +} + +fn starts_with_ignore_case(text: &str, prefix: &str) -> bool { + text.chars().take(prefix.chars().count()).flat_map(char::to_uppercase).eq(prefix.chars().flat_map(char::to_uppercase)) +} + +/// Rewrites specifiers (`#Headers` <-> `#Kopfzeilen`) and the separator between bracketed +/// items, leaving column names and `'` escapes alone. +fn translate_struct(inner: &str, from: &[&'static str; 5], to: &[&'static str; 5], from_sep: char, to_sep: char) -> String { + let item = |text: &str| -> Option<&'static str> { from.iter().position(|f| eq_ignore_case(text.trim(), f)).and_then(|i| to.get(i).copied()) }; + if !inner.starts_with('[') { + return item(inner).map_or_else(|| inner.to_string(), str::to_string); + } + let mut out = String::with_capacity(inner.len()); + let mut group = String::new(); + let mut depth = 0usize; + let mut chars = inner.chars(); + while let Some(c) = chars.next() { + match c { + '\'' => { + let target = if depth > 0 { &mut group } else { &mut out }; + target.push(c); + if let Some(escaped) = chars.next() { + target.push(escaped); + } + } + '[' => { + if depth == 0 { + group.clear(); + } else { + group.push(c); + } + depth += 1; + } + ']' if depth > 0 => { + depth -= 1; + if depth == 0 { + out.push('['); + out.push_str(item(&group).unwrap_or(&group)); + out.push(']'); + } else { + group.push(c); + } + } + c if depth == 0 && c == from_sep => out.push(to_sep), + c if depth > 0 => group.push(c), + c => out.push(c), + } + } + if depth > 0 { + // Unbalanced input: keep what was read so the parser reports the error. + out.push('['); + out.push_str(&group); + } + out } /// Parses UI input using the selected function table and separators. Existing names and /// LET/LAMBDA bindings take precedence over aliases. File and API syntax uses [`crate::parse`]. pub fn parse_input(src: &str, locale: FormulaLocale, known_name: impl Fn(&str) -> bool) -> Result { let mut expr = parser::parse_syntax(src, locale)?; - if locale == FormulaLocale::Es { - normalize(&mut expr, &known_name, &mut Vec::new(), 0, false)?; + if locale != FormulaLocale::En { + normalize(&mut expr, locale, &known_name, &mut Vec::new(), 0, false)?; } Ok(expr) } @@ -89,7 +248,7 @@ pub fn print_input(expr: &Expr, locale: FormulaLocale, known_name: impl Fn(&str) return Ok(crate::print(expr)); } let mut expr = expr.clone(); - normalize(&mut expr, &known_name, &mut Vec::new(), 0, true)?; + normalize(&mut expr, locale, &known_name, &mut Vec::new(), 0, true)?; let canonical = crate::print(&expr); let tokens = crate::lexer::tokenize(&canonical).map_err(|e| ParseError { msg: e.msg, pos: e.pos })?; let mut out = String::new(); @@ -108,36 +267,41 @@ pub fn print_input(expr: &Expr, locale: FormulaLocale, known_name: impl Fn(&str) } Tok::Number(_) => out.push_str(&text.replace('.', &locale.decimal_separator().to_string())), Tok::Comma => out.push(if array_depth > 0 { locale.array_column_separator() } else { locale.list_separator() }), + Tok::Semicolon if array_depth > 0 => out.push(locale.array_row_separator()), + Tok::Error(e) => out.push_str(locale.error_name(e)), + Tok::Struct(inner) => { + out.push('['); + out.push_str(&locale.struct_to_local(&inner)); + out.push(']'); + } _ => out.push_str(text), } } Ok(out) } -pub(crate) fn boolean_alias(name: &str) -> Option { - if name.eq_ignore_ascii_case("VERDADERO") { - Some(true) - } else if name.eq_ignore_ascii_case("FALSO") { - Some(false) - } else { - None - } -} - -fn normalize(expr: &mut Expr, known_name: &impl Fn(&str) -> bool, bindings: &mut Vec, depth: usize, display: bool) -> Result<(), ParseError> { +fn normalize( + expr: &mut Expr, + locale: FormulaLocale, + known_name: &impl Fn(&str) -> bool, + bindings: &mut Vec, + depth: usize, + display: bool, +) -> Result<(), ParseError> { if depth > parser::MAX_DEPTH { return Err(ParseError { msg: "formula is nested too deeply".into(), pos: 0 }); } - let bound = |name: &str, bindings: &[String]| bindings.iter().rev().any(|n| n.eq_ignore_ascii_case(name)) || known_name(name); + // Names ignore case in any script, so a binding `zählenwenn` shadows the call `ZÄHLENWENN(…)`. + let bound = |name: &str, bindings: &[String]| bindings.iter().rev().any(|n| eq_ignore_case(n, name)) || known_name(name); match expr { Expr::Bool(value) if display => { - let alias = if *value { "VERDADERO" } else { "FALSO" }; + let alias = locale.boolean_name(*value); if !bound(alias, bindings) { *expr = Expr::Name(alias.into()); } } Expr::Name(name) if !display && !bound(name, bindings) => { - if let Some(value) = boolean_alias(name) { + if let Some(value) = locale.boolean(name) { *expr = Expr::Bool(value); } } @@ -147,13 +311,13 @@ fn normalize(expr: &mut Expr, known_name: &impl Fn(&str) -> bool, bindings: &mut for pair in pairs.chunks_mut(2) { if let [declaration, value] = pair { // The new name is not in scope in its own value expression. - normalize(value, known_name, bindings, depth + 1, display)?; + normalize(value, locale, known_name, bindings, depth + 1, display)?; if let Expr::Name(name) = declaration { bindings.push(name.clone()); } } } - normalize(body, known_name, bindings, depth + 1, display)?; + normalize(body, locale, known_name, bindings, depth + 1, display)?; } bindings.truncate(saved); } @@ -165,34 +329,46 @@ fn normalize(expr: &mut Expr, known_name: &impl Fn(&str) -> bool, bindings: &mut bindings.push(name.clone()); } } - normalize(body, known_name, bindings, depth + 1, display)?; + normalize(body, locale, known_name, bindings, depth + 1, display)?; } bindings.truncate(saved); } Expr::Call(name, args) => { - let alias = if display { FormulaLocale::Es.function_name(name) } else { FormulaLocale::Es.canonical_name(name) }; + let alias = if display { locale.function_name(name) } else { locale.canonical_name(name) }; if !bound(name, bindings) && (!display || !bound(alias, bindings)) { *name = alias.to_string(); } for arg in args { - normalize(arg, known_name, bindings, depth + 1, display)?; + // A worksheet function passed by name (`BYROW(A1:C3;SOMA)`, saved as `_xleta.SUM`) + // is spelled like its call. A local boolean word stays a boolean. + if let Expr::Name(function) = arg + && !bound(function, bindings) + && (display || locale.boolean(function).is_none()) + { + let alias = if display { locale.function_name(function) } else { locale.canonical_name(function) }; + if alias != function.as_str() && (!display || (!bound(alias, bindings) && locale.boolean(alias).is_none())) { + *function = alias.to_string(); + continue; + } + } + normalize(arg, locale, known_name, bindings, depth + 1, display)?; } } Expr::Invoke(callee, args) => { - normalize(callee, known_name, bindings, depth + 1, display)?; + normalize(callee, locale, known_name, bindings, depth + 1, display)?; for arg in args { - normalize(arg, known_name, bindings, depth + 1, display)?; + normalize(arg, locale, known_name, bindings, depth + 1, display)?; } } - Expr::Unary(_, child) | Expr::Paren(child) => normalize(child, known_name, bindings, depth + 1, display)?, + Expr::Unary(_, child) | Expr::Paren(child) => normalize(child, locale, known_name, bindings, depth + 1, display)?, Expr::Binary(_, left, right) => { - normalize(left, known_name, bindings, depth + 1, display)?; - normalize(right, known_name, bindings, depth + 1, display)?; + normalize(left, locale, known_name, bindings, depth + 1, display)?; + normalize(right, locale, known_name, bindings, depth + 1, display)?; } Expr::Array(rows) if display => { for row in rows { for child in row { - normalize(child, known_name, bindings, depth + 1, display)?; + normalize(child, locale, known_name, bindings, depth + 1, display)?; } } } diff --git a/crates/formula/src/input/de.rs b/crates/formula/src/input/de.rs new file mode 100644 index 000000000..bdf4727b2 --- /dev/null +++ b/crates/formula/src/input/de.rs @@ -0,0 +1,476 @@ +//! Deutsch (Deutschland): the formula words German Excel shows (function names, booleans, errors, +//! structured-reference specifiers) and its formula separators. +//! +//! Function names come from Microsoft Support's de-de Excel function pages (retrieved +//! 2026-10-10; the pages are machine-translated): per page, a vote among the title, the meta +//! description, the syntax paragraph (aligned with the en-US page) and `=NAME(` examples, and an +//! entry needs two agreeing signals. Entries marked `reviewed` were decided by hand from the page +//! evidence and independent function-name references. Functions not listed keep their English name. +//! +//! Sources for the other words: +//! - bool: https://support.microsoft.com/de-de/excel/functions/cell-function (WAHR/FALSCH) | https://support.microsoft.com/de-de/excel/is-functions +//! - table_items: https://it-service-ruhr.de/excel-strukturierte-verweise/ ([#Alle] [#Kopfzeilen] [#Daten] [#Ergebnisse] [#Diese Zeile]) | https://fasteasy.at/tippshop/index.php?mp=1&id=1&id2=17&id3=1728 (#Alle #Daten #Kopfzeilen #Ergebnisse, "[#Diese Zeile]") +//! - errors.#WERT!..#NV,#DATEN_ABRUFEN: https://support.microsoft.com/de-de/excel/functions/error-type-function (ERROR.TYPE table) | https://support.microsoft.com/de-de/excel/functions/cubemember-function ("#DATEN_ABRUFEN…") +//! - errors.#SPILL!: https://support.microsoft.com/de-de/excel/how-to-correct-a-spill-error (title "#ÜBERLAUF!-Fehler") +//! - errors.#CALC!: https://support.microsoft.com/de-de/excel/functions/lambda-function ("#KALK!-Fehlermeldung") | https://excelhero.de/funktionen/excel-filter-funktion/ | https://www.tabellenexperte.de/die-neue-filter-funktion-mit-jokersuche/ | https://www.tippscout.de/excel-daten-filtern-ganz-einfach.html + +use super::Dialect; +use gridcraft_core::CellError; + +pub(super) const DIALECT: Dialect = Dialect { + list: ';', + decimal: ',', + array_column: '.', + array_row: ';', + bool_true: "WAHR", + bool_false: "FALSCH", + errors: &[ + (CellError::Null, "#NULL!"), + (CellError::Div0, "#DIV/0!"), + (CellError::Value, "#WERT!"), + (CellError::Ref, "#BEZUG!"), + (CellError::Name, "#NAME?"), + (CellError::Num, "#ZAHL!"), + (CellError::NA, "#NV"), + (CellError::GettingData, "#DATEN_ABRUFEN"), + (CellError::Spill, "#ÜBERLAUF!"), + (CellError::Calc, "#KALK!"), + ], + table_items: ["#Alle", "#Daten", "#Kopfzeilen", "#Ergebnisse", "#Diese Zeile"], + functions: &[ + ("ACCRINT", "AUFGELZINS"), + ("ACCRINTM", "AUFGELZINSF"), + ("ACOS", "ARCCOS"), + ("ACOSH", "ARCCOSHYP"), + ("ACOT", "ARCCOT"), + ("ACOTH", "ARCCOTHYP"), + ("ADDRESS", "ADRESSE"), + ("AGGREGATE", "AGGREGAT"), + ("AMORDEGRC", "AMORDEGRK"), + ("AMORLINC", "AMORLINEARK"), + ("AND", "UND"), + ("ARABIC", "ARABISCH"), + ("AREAS", "BEREICHE"), + ("ARRAYTOTEXT", "MATRIXZUTEXT"), + ("ASIN", "ARCSIN"), + ("ASINH", "ARCSINHYP"), + ("ATAN", "ARCTAN"), + ("ATAN2", "ARCTAN2"), + ("ATANH", "ARCTANHYP"), + ("AVEDEV", "MITTELABW"), + ("AVERAGE", "MITTELWERT"), + ("AVERAGEA", "MITTELWERTA"), + ("AVERAGEIF", "MITTELWERTWENN"), + ("AVERAGEIFS", "MITTELWERTWENNS"), + ("BASE", "BASIS"), + ("BETA.DIST", "BETA.VERT"), + ("BETADIST", "BETAVERT"), + ("BIN2DEC", "BININDEZ"), + ("BIN2HEX", "BININHEX"), + ("BIN2OCT", "BININOKT"), + ("BINOM.DIST", "BINOM.VERT"), + ("BINOM.DIST.RANGE", "BINOM.VERT.BEREICH"), + ("BINOMDIST", "BINOMVERT"), + ("BITAND", "BITUND"), + ("BITLSHIFT", "BITLVERSCHIEB"), + ("BITOR", "BITODER"), + ("BITRSHIFT", "BITRVERSCHIEB"), + ("BITXOR", "BITXODER"), + // reviewed: sidebar link on MS de-de function pages (page body left BYCOL); pairs with BYROW=NACHZEILE | sources: https://support.microsoft.com/de-de/excel/functions/bycol-function + ("BYCOL", "NACHSPALTE"), + // reviewed: sidebar link on MS de-de function pages (page body left BYROW) | sources: https://support.microsoft.com/de-de/excel/functions/byrow-function + ("BYROW", "NACHZEILE"), + ("CEILING", "OBERGRENZE"), + ("CEILING.MATH", "OBERGRENZE.MATHEMATIK"), + ("CEILING.PRECISE", "OBERGRENZE.GENAU"), + ("CELL", "ZELLE"), + ("CHAR", "ZEICHEN"), + ("CHIDIST", "CHIVERT"), + ("CHISQ.DIST", "CHIQU.VERT"), + ("CHISQ.DIST.RT", "CHIQU.VERT.RE"), + ("CHISQ.INV", "CHIQU.INV"), + ("CHISQ.INV.RT", "CHIQU.INV.RE"), + ("CHISQ.TEST", "CHIQU.TEST"), + ("CHOOSE", "WAHL"), + ("CHOOSECOLS", "SPALTENWAHL"), + // reviewed: sidebar link; pairs with CHOOSECOLS=SPALTENWAHL (agreeing vote); page example uses MT variant ZEILENAUSWAHL | sources: https://support.microsoft.com/de-de/excel/functions/chooserows-function + ("CHOOSEROWS", "ZEILENWAHL"), + ("CLEAN", "SÄUBERN"), + ("COLUMN", "SPALTE"), + ("COLUMNS", "SPALTEN"), + ("COMBIN", "KOMBINATIONEN"), + ("COMBINA", "KOMBINATIONEN2"), + ("COMPLEX", "KOMPLEXE"), + ("CONCAT", "TEXTKETTE"), + ("CONCATENATE", "VERKETTEN"), + ("CONFIDENCE", "KONFIDENZ"), + ("CONFIDENCE.NORM", "KONFIDENZ.NORM"), + ("CONFIDENCE.T", "KONFIDENZ.T"), + ("CONVERT", "UMWANDELN"), + ("CORREL", "KORREL"), + ("COSH", "COSHYP"), + ("COTH", "COTHYP"), + ("COUNT", "ANZAHL"), + ("COUNTA", "ANZAHL2"), + // reviewed: page title ANZAHLLEEREZELLEN; meta/syntax ANZAHLLEERE/ANZAHLLEER are MT truncations; en-US COUNTBLANK page | sources: https://support.microsoft.com/de-de/excel/functions/countblank-function + ("COUNTBLANK", "ANZAHLLEEREZELLEN"), + ("COUNTIF", "ZÄHLENWENN"), + ("COUNTIFS", "ZÄHLENWENNS"), + ("COUPDAYBS", "ZINSTERMTAGVA"), + ("COUPDAYS", "ZINSTERMTAGE"), + ("COUPDAYSNC", "ZINSTERMTAGNZ"), + ("COUPNCD", "ZINSTERMNZ"), + ("COUPNUM", "ZINSTERMZAHL"), + ("COUPPCD", "ZINSTERMVZ"), + ("COVAR", "KOVAR"), + ("COVARIANCE.P", "KOVARIANZ.P"), + ("COVARIANCE.S", "KOVARIANZ.S"), + ("CRITBINOM", "KRITBINOM"), + ("CSC", "COSEC"), + ("CSCH", "COSECHYP"), + ("CUBEKPIMEMBER", "CUBEKPIELEMENT"), + ("CUBEMEMBER", "CUBEELEMENT"), + ("CUBEMEMBERPROPERTY", "CUBEELEMENTEIGENSCHAFT"), + ("CUBERANKEDMEMBER", "CUBERANGELEMENT"), + ("CUBESET", "CUBEMENGE"), + ("CUBESETCOUNT", "CUBEMENGENANZAHL"), + ("CUBEVALUE", "CUBEWERT"), + ("CUMIPMT", "KUMZINSZ"), + ("CUMPRINC", "KUMKAPITAL"), + ("DATE", "DATUM"), + ("DATEVALUE", "DATWERT"), + ("DAVERAGE", "DBMITTELWERT"), + ("DAY", "TAG"), + ("DAYS", "TAGE"), + ("DAYS360", "TAGE360"), + ("DB", "GDA2"), + ("DCOUNT", "DBANZAHL"), + ("DCOUNTA", "DBANZAHL2"), + ("DDB", "GDA"), + ("DEC2BIN", "DEZINBIN"), + ("DEC2HEX", "DEZINHEX"), + ("DEC2OCT", "DEZINOKT"), + ("DECIMAL", "DEZIMAL"), + ("DEGREES", "GRAD"), + ("DEVSQ", "SUMQUADABW"), + ("DGET", "DBAUSZUG"), + ("DISC", "DISAGIO"), + ("DMAX", "DBMAX"), + ("DMIN", "DBMIN"), + // reviewed: page title "DM"; German Excel DOLLAR is DM (meta/syntax left English) | sources: https://support.microsoft.com/de-de/excel/functions/dollar-function + ("DOLLAR", "DM"), + ("DOLLARDE", "NOTIERUNGDEZ"), + ("DOLLARFR", "NOTIERUNGBRU"), + ("DPRODUCT", "DBPRODUKT"), + ("DROP", "WEGLASSEN"), + ("DSTDEV", "DBSTDABW"), + ("DSTDEVP", "DBSTDABWN"), + ("DSUM", "DBSUMME"), + ("DVAR", "DBVARIANZ"), + ("DVARP", "DBVARIANZEN"), + ("EDATE", "EDATUM"), + ("EFFECT", "EFFEKTIV"), + ("ENCODEURL", "URLCODIEREN"), + ("EOMONTH", "MONATSENDE"), + ("ERF", "GAUSSFEHLER"), + ("ERF.PRECISE", "GAUSSF.GENAU"), + ("ERFC", "GAUSSFKOMPL"), + ("ERFC.PRECISE", "GAUSSFKOMPL.GENAU"), + ("ERROR.TYPE", "FEHLER.TYP"), + ("EVEN", "GERADE"), + ("EXACT", "IDENTISCH"), + ("EXPAND", "ERWEITERN"), + ("EXPON.DIST", "EXPON.VERT"), + ("EXPONDIST", "EXPONVERT"), + // reviewed: page title F.VERT + sidebar; F.DIST.RT=F.VERT.RE agrees | sources: https://support.microsoft.com/de-de/excel/functions/f-dist-function + ("F.DIST", "F.VERT"), + ("F.DIST.RT", "F.VERT.RE"), + ("F.INV.RT", "F.INV.RE"), + ("FACT", "FAKULTÄT"), + ("FACTDOUBLE", "ZWEIFAKULTÄT"), + ("FALSE", "FALSCH"), + ("FDIST", "FVERT"), + ("FILTERXML", "XMLFILTERN"), + // reviewed: SEARCH page: "…Groß- und Kleinschreibung… können Sie FINDEN verwenden" (FIND page retired) | sources: https://support.microsoft.com/de-de/excel/functions/search-function + ("FIND", "FINDEN"), + // reviewed: B-variant pattern of FINDEN (LINKSB, TEILB, RECHTSB, LÄNGEB, SUCHENB documented); name itself not on a cached page [inferred] | sources: https://support.microsoft.com/de-de/excel/functions/c7912941-af2a-4bdf-a553-d0d89b0a0628 + ("FINDB", "FINDENB"), + ("FIXED", "FEST"), + ("FLOOR", "UNTERGRENZE"), + ("FLOOR.MATH", "UNTERGRENZE.MATHEMATIK"), + ("FLOOR.PRECISE", "UNTERGRENZE.GENAU"), + // reviewed: page: "PROGNOSE.LINEAR(x;Y_Werte;X_Werte) oder SCHÄTZER(x;Y_Werte;X_Werte)"; PROGNOSE replaced SCHÄTZER only as .LINEAR | sources: https://support.microsoft.com/de-de/excel/forecast-and-forecast-linear-functions + ("FORECAST", "SCHÄTZER"), + // reviewed: same page syntax and example =PROGNOSE.LINEAR(30,A2:A6,B2:B6) | sources: https://support.microsoft.com/de-de/excel/forecast-and-forecast-linear-functions + ("FORECAST.LINEAR", "PROGNOSE.LINEAR"), + ("FORMULATEXT", "FORMELTEXT"), + ("FREQUENCY", "HÄUFIGKEIT"), + ("FV", "ZW"), + ("FVSCHEDULE", "ZW2"), + ("GAMMA.DIST", "GAMMA.VERT"), + ("GAMMADIST", "GAMMAVERT"), + ("GAMMALN.PRECISE", "GAMMALN.GENAU"), + ("GCD", "GGT"), + ("GEOMEAN", "GEOMITTEL"), + ("GESTEP", "GGANZZAHL"), + ("GROUPBY", "GRUPPIERENNACH"), + ("GROWTH", "VARIATION"), + ("HARMEAN", "HARMITTEL"), + ("HEX2BIN", "HEXINBIN"), + ("HEX2DEC", "HEXINDEZ"), + ("HEX2OCT", "HEXINOKT"), + ("HLOOKUP", "WVERWEIS"), + ("HOUR", "STUNDE"), + ("HSTACK", "HSTAPELN"), + ("HYPGEOM.DIST", "HYPGEOM.VERT"), + ("HYPGEOMDIST", "HYPGEOMVERT"), + ("IF", "WENN"), + ("IFERROR", "WENNFEHLER"), + ("IFNA", "WENNNV"), + ("IFS", "WENNS"), + ("IMAGINARY", "IMAGINÄRTEIL"), + ("IMCONJUGATE", "IMKONJUGIERTE"), + ("IMCOSH", "IMCOSHYP"), + ("IMCSC", "IMCOSEC"), + ("IMCSCH", "IMCOSECHYP"), + ("IMPOWER", "IMAPOTENZ"), + ("IMPRODUCT", "IMPRODUKT"), + ("IMREAL", "IMREALTEIL"), + ("IMSECH", "IMSECHYP"), + ("IMSINH", "IMSINHYP"), + ("IMSQRT", "IMWURZEL"), + ("IMSUM", "IMSUMME"), + ("INDIRECT", "INDIREKT"), + ("INT", "GANZZAHL"), + ("INTERCEPT", "ACHSENABSCHNITT"), + ("INTRATE", "ZINSSATZ"), + ("IPMT", "ZINSZ"), + ("IRR", "IKV"), + // reviewed: IS-functions page syntax list and examples =ISTLEER(A2) | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISBLANK", "ISTLEER"), + // reviewed: IS-functions page syntax list, example =ISTFEHL(A6) | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISERR", "ISTFEHL"), + // reviewed: IS-functions page syntax list, example =WENN(ISTFEHLER(A1)… | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISERROR", "ISTFEHLER"), + ("ISEVEN", "ISTGERADE"), + ("ISFORMULA", "ISTFORMEL"), + // reviewed: IS-functions page syntax list, example =ISTLOG(WAHR) | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISLOGICAL", "ISTLOG"), + // reviewed: IS-functions page syntax list, example =ISTNV(A4) | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISNA", "ISTNV"), + // reviewed: IS-functions page syntax list ISTKTEXT(Wert) and description row | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISNONTEXT", "ISTKTEXT"), + // reviewed: IS-functions page syntax list, example =ISTZAHL(4) | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISNUMBER", "ISTZAHL"), + ("ISO.CEILING", "ISO.OBERGRENZE"), + // reviewed: live MS page https://support.microsoft.com/de-de/excel/functions/isodd-function: title/syntax/examples ISTUNGERADE (the IS-functions page shows MT-garbled "ISUNGERADE") + ("ISODD", "ISTUNGERADE"), + // reviewed: ISOMITTED page syntax and example | sources: https://support.microsoft.com/de-de/excel/functions/isomitted-function + ("ISOMITTED", "WURDEAUSGELASSEN"), + ("ISOWEEKNUM", "ISOKALENDERWOCHE"), + // reviewed: IS-functions page syntax list, example =ISTBEZUG(G8) | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISREF", "ISTBEZUG"), + // reviewed: IS-functions page syntax list, example =ISTTEXT(A3) | sources: https://support.microsoft.com/de-de/excel/is-functions + ("ISTEXT", "ISTTEXT"), + ("LARGE", "KGRÖSSTE"), + ("LCM", "KGV"), + ("LEFT", "LINKS"), + ("LEFTB", "LINKSB"), + ("LEN", "LÄNGE"), + ("LENB", "LÄNGEB"), + ("LINEST", "RGP"), + ("LOGEST", "RKP"), + ("LOGNORM.DIST", "LOGNORM.VERT"), + ("LOGNORMDIST", "LOGNORMVERT"), + ("LOOKUP", "VERWEIS"), + ("LOWER", "KLEIN"), + // reviewed: sidebar link on MS de-de function pages (page body left MAKEARRAY) | sources: https://support.microsoft.com/de-de/excel/functions/makearray-function + ("MAKEARRAY", "MATRIXERSTELLEN"), + // reviewed: MAP page syntax "=ZUORDNEN (Array1; lambda_or_array<#>)" and example; sidebar says KARTE (MT of the title) – rejected | sources: https://support.microsoft.com/de-de/excel/functions/map-function + ("MAP", "ZUORDNEN"), + ("MATCH", "VERGLEICH"), + ("MAXIFS", "MAXWENNS"), + ("MDETERM", "MDET"), + ("MID", "TEIL"), + ("MIDB", "TEILB"), + ("MINIFS", "MINWENNS"), + ("MINVERSE", "MINV"), + ("MIRR", "QIKV"), + ("MOD", "REST"), + ("MODE", "MODALWERT"), + ("MODE.MULT", "MODUS.VIELF"), + ("MODE.SNGL", "MODUS.EINF"), + ("MONTH", "MONAT"), + ("MROUND", "VRUNDEN"), + ("MULTINOMIAL", "POLYNOMIAL"), + ("MUNIT", "MEINHEIT"), + ("NA", "NV"), + ("NEGBINOM.DIST", "NEGBINOM.VERT"), + ("NEGBINOMDIST", "NEGBINOMVERT"), + ("NETWORKDAYS", "NETTOARBEITSTAGE"), + ("NETWORKDAYS.INTL", "NETTOARBEITSTAGE.INTL"), + ("NORM.DIST", "NORM.VERT"), + ("NORM.S.DIST", "NORM.S.VERT"), + ("NORMDIST", "NORMVERT"), + ("NORMSDIST", "STANDNORMVERT"), + ("NORMSINV", "STANDNORMINV"), + ("NOT", "NICHT"), + ("NOW", "JETZT"), + ("NPER", "ZZR"), + ("NPV", "NBW"), + ("NUMBERVALUE", "ZAHLENWERT"), + ("OCT2BIN", "OKTINBIN"), + ("OCT2DEC", "OKTINDEZ"), + ("OCT2HEX", "OKTINHEX"), + ("ODD", "UNGERADE"), + ("OFFSET", "BEREICH.VERSCHIEBEN"), + ("OR", "ODER"), + ("PERCENTILE", "QUANTIL"), + ("PERCENTILE.EXC", "QUANTIL.EXKL"), + ("PERCENTILE.INC", "QUANTIL.INKL"), + ("PERCENTRANK", "QUANTILSRANG"), + ("PERCENTRANK.EXC", "QUANTILSRANG.EXKL"), + ("PERCENTRANK.INC", "QUANTILSRANG.INKL"), + ("PERMUT", "VARIATIONEN"), + ("PERMUTATIONA", "VARIATIONEN2"), + ("PIVOTBY", "PIVOTMIT"), + ("PMT", "RMZ"), + ("POISSON.DIST", "POISSON.VERT"), + ("POWER", "POTENZ"), + ("PPMT", "KAPZ"), + ("PRICE", "KURS"), + ("PRICEDISC", "KURSDISAGIO"), + ("PRICEMAT", "KURSFÄLLIG"), + ("PROB", "WAHRSCHBEREICH"), + ("PRODUCT", "PRODUKT"), + ("PROPER", "GROSS2"), + ("PV", "BW"), + ("QUARTILE.EXC", "QUARTILE.EXKL"), + ("QUARTILE.INC", "QUARTILE.INKL"), + ("RADIANS", "BOGENMASS"), + ("RAND", "ZUFALLSZAHL"), + ("RANDARRAY", "ZUFALLSMATRIX"), + ("RANDBETWEEN", "ZUFALLSBEREICH"), + ("RANK", "RANG"), + ("RANK.AVG", "RANG.MITTELW"), + ("RANK.EQ", "RANG.GLEICH"), + ("RATE", "ZINS"), + ("RECEIVED", "AUSZAHLUNG"), + ("REPLACE", "ERSETZEN"), + // reviewed: B-variant pattern of ERSETZEN; not named on a cached page [inferred] | sources: https://support.microsoft.com/de-de/excel/functions/replace-function + ("REPLACEB", "ERSETZENB"), + ("REPT", "WIEDERHOLEN"), + ("RIGHT", "RECHTS"), + ("RIGHTB", "RECHTSB"), + ("ROMAN", "RÖMISCH"), + ("ROUND", "RUNDEN"), + ("ROUNDDOWN", "ABRUNDEN"), + ("ROUNDUP", "AUFRUNDEN"), + ("ROW", "ZEILE"), + ("ROWS", "ZEILEN"), + ("RRI", "ZSATZINVEST"), + ("RSQ", "BESTIMMTHEITSMASS"), + ("SEARCH", "SUCHEN"), + ("SEARCHB", "SUCHENB"), + ("SECH", "SECHYP"), + ("SECOND", "SEKUNDE"), + ("SEQUENCE", "SEQUENZ"), + ("SERIESSUM", "POTENZREIHE"), + ("SHEET", "BLATT"), + ("SHEETS", "BLÄTTER"), + ("SIGN", "VORZEICHEN"), + ("SINH", "SINHYP"), + ("SKEW", "SCHIEFE"), + ("SKEW.P", "SCHIEFE.P"), + ("SLN", "LIA"), + ("SLOPE", "STEIGUNG"), + ("SMALL", "KKLEINSTE"), + ("SORT", "SORTIEREN"), + ("SORTBY", "SORTIERENNACH"), + ("SQRT", "WURZEL"), + ("SQRTPI", "WURZELPI"), + ("STANDARDIZE", "STANDARDISIERUNG"), + ("STDEV", "STABW"), + ("STDEV.P", "STABW.N"), + ("STDEV.S", "STABW.S"), + ("STDEVA", "STABWA"), + ("STDEVP", "STABWN"), + ("STDEVPA", "STABWNA"), + ("STEYX", "STFEHLERYX"), + ("SUBSTITUTE", "WECHSELN"), + ("SUBTOTAL", "TEILERGEBNIS"), + ("SUM", "SUMME"), + ("SUMIF", "SUMMEWENN"), + ("SUMIFS", "SUMMEWENNS"), + ("SUMPRODUCT", "SUMMENPRODUKT"), + ("SUMSQ", "QUADRATESUMME"), + ("SUMX2MY2", "SUMMEX2MY2"), + ("SUMX2PY2", "SUMMEX2PY2"), + ("SUMXMY2", "SUMMEXMY2"), + // reviewed: SWITCH page meta + examples + sidebar | sources: https://support.microsoft.com/de-de/excel/functions/switch-function + ("SWITCH", "ERSTERWERT"), + ("SYD", "DIA"), + ("T.DIST", "T.VERT"), + ("T.DIST.2T", "T.VERT.2S"), + ("T.DIST.RT", "T.VERT.RE"), + ("T.INV.2T", "T.INV.2S"), + ("TAKE", "ÜBERNEHMEN"), + ("TANH", "TANHYP"), + ("TBILLEQ", "TBILLÄQUIV"), + ("TBILLPRICE", "TBILLKURS"), + ("TBILLYIELD", "TBILLRENDITE"), + ("TDIST", "TVERT"), + // reviewed: TEXTAFTER page title + meta (TEXTNACH); syntax paragraph left English | sources: https://support.microsoft.com/de-de/excel/functions/textafter-function + ("TEXTAFTER", "TEXTNACH"), + // reviewed: page syntax + examples + sidebar (title/meta left English) | sources: https://support.microsoft.com/de-de/excel/functions/textbefore-function + ("TEXTBEFORE", "TEXTVOR"), + ("TEXTJOIN", "TEXTVERKETTEN"), + // reviewed: page syntax/examples and MS TEXTSPLIT page example =TEXTTEILEN(A1,{",","."}) | sources: https://support.microsoft.com/de-de/excel/functions/textsplit-function | https://support.microsoft.com/de-de/office/textsplit-funktion-b1ca414e-4c21-4ca0-b1b7-bdecace8a6e7 + ("TEXTSPLIT", "TEXTTEILEN"), + ("TIME", "ZEIT"), + ("TIMEVALUE", "ZEITWERT"), + ("TOCOL", "ZUSPALTE"), + ("TODAY", "HEUTE"), + ("TOROW", "ZUZEILE"), + ("TRANSPOSE", "MTRANS"), + ("TRIM", "GLÄTTEN"), + ("TRIMMEAN", "GESTUTZTMITTEL"), + ("TRUE", "WAHR"), + ("TRUNC", "KÜRZEN"), + ("TYPE", "TYP"), + ("UNICHAR", "UNIZEICHEN"), + ("UNIQUE", "EINDEUTIG"), + ("UPPER", "GROSS"), + ("VALUE", "WERT"), + // reviewed: page syntax "WERTZUTEXT(Wert;[Format])" + sidebar; pairs with ARRAYTOTEXT=MATRIXZUTEXT | sources: https://support.microsoft.com/de-de/excel/functions/valuetotext-function + ("VALUETOTEXT", "WERTZUTEXT"), + ("VAR", "VARIANZ"), + ("VARA", "VARIANZA"), + ("VARP", "VARIANZEN"), + ("VARPA", "VARIANZENA"), + ("VLOOKUP", "SVERWEIS"), + ("VSTACK", "VSTAPELN"), + ("WEBSERVICE", "WEBDIENST"), + ("WEEKDAY", "WOCHENTAG"), + ("WEEKNUM", "KALENDERWOCHE"), + ("WEIBULL.DIST", "WEIBULL.VERT"), + ("WORKDAY", "ARBEITSTAG"), + ("WORKDAY.INTL", "ARBEITSTAG.INTL"), + // reviewed: sidebar link (page body left WRAPCOLS) | sources: https://support.microsoft.com/de-de/excel/functions/wrapcols-function + ("WRAPCOLS", "SPALTENUMBRUCH"), + // reviewed: page example =ZEILENUMBRUCH + sidebar | sources: https://support.microsoft.com/de-de/excel/functions/wraprows-function + ("WRAPROWS", "ZEILENUMBRUCH"), + ("XIRR", "XINTZINSFUSS"), + ("XLOOKUP", "XVERWEIS"), + ("XMATCH", "XVERGLEICH"), + ("XNPV", "XKAPITALWERT"), + ("XOR", "XODER"), + ("YEAR", "JAHR"), + ("YEARFRAC", "BRTEILJAHRE"), + ("YIELD", "RENDITE"), + ("YIELDDISC", "RENDITEDIS"), + ("YIELDMAT", "RENDITEFÄLL"), + ("Z.TEST", "G.TEST"), + ("ZTEST", "GTEST"), + ], +}; diff --git a/crates/formula/src/input/es.rs b/crates/formula/src/input/es.rs new file mode 100644 index 000000000..b5a51b142 --- /dev/null +++ b/crates/formula/src/input/es.rs @@ -0,0 +1,506 @@ +//! Español (España): the formula words Spanish Excel shows (function names, booleans, errors, +//! structured-reference specifiers) and its formula separators. +//! +//! Function names come from Microsoft Support's es-es Excel function pages (retrieved +//! 2026-10-10; the pages are machine-translated): per page, a vote among the title, the meta +//! description, the syntax paragraph (aligned with the en-US page) and `=NAME(` examples, and an +//! entry needs two agreeing signals. Entries marked `reviewed` were decided by hand from the page +//! evidence and independent function-name references. Functions not listed keep their English name. +//! +//! Sources for the other words: +//! - bool: https://support.microsoft.com/es-es/excel/functions/true-function | https://raw.githubusercontent.com/PHPOffice/PhpSpreadsheet/master/src/PhpSpreadsheet/Calculation/locale/es/functions | https://raw.githubusercontent.com/handsontable/hyperformula/master/src/i18n/languages/esES.ts +//! - table_items: https://github.com/GrapeCity/spreadjs-resources (SpreadJS v18 ES resource: #Todo,#Datos,#Encabezados,#Totales,#Esta Fila) | https://support.microsoft.com/es-es/excel/using-structured-references-with-excel-tables (lists #Todas for #All; same #Datos,#Encabezados,#Totales,#Esta Fila) +//! - errors.numeric: https://support.microsoft.com/es-es/excel/functions/error-type-function | https://raw.githubusercontent.com/PHPOffice/PhpSpreadsheet/master/src/PhpSpreadsheet/Calculation/locale/es/config | https://github.com/LibreOffice/translations/blob/master/source/es/formula/messages.po +//! - errors.#N/A: https://support.microsoft.com/es-es/excel/functions/na-function (#N/D) | https://raw.githubusercontent.com/handsontable/hyperformula/master/src/i18n/languages/esES.ts (#N/D) | https://github.com/LibreOffice/translations/blob/master/source/es/formula/messages.po (#N/D) | https://es.stackoverflow.com/questions/538707 (cell value #N/D); error-type page table says #N/A +//! - errors.#SPILL!: https://raw.githubusercontent.com/handsontable/hyperformula/master/src/i18n/languages/esES.ts | https://github.com/LibreOffice/translations/blob/master/source/es/formula/messages.po (#¡DESBORDAMIENTO!) | https://support.microsoft.com/es-es/excel/how-to-correct-a-spill-error (drops the ¡) +//! - errors.#CALC!: https://github.com/ibarrasuarez22-ux/MC_regiduria (real Spanish Excel CSV exports contain #¡CALC!) | https://github.com/Carlos1200/gridcalc/blob/main/src/i18n/es.ts +//! - errors.#GETTING_DATA: https://support.microsoft.com/es-es/excel/functions/error-type-function + +use super::Dialect; +use gridcraft_core::CellError; + +pub(super) const DIALECT: Dialect = Dialect { + list: ';', + decimal: ',', + array_column: '\\', + array_row: ';', + bool_true: "VERDADERO", + bool_false: "FALSO", + errors: &[ + (CellError::Null, "#¡NULO!"), + (CellError::Div0, "#¡DIV/0!"), + (CellError::Value, "#¡VALOR!"), + (CellError::Ref, "#¡REF!"), + (CellError::Name, "#¿NOMBRE?"), + (CellError::Num, "#¡NUM!"), + (CellError::NA, "#N/D"), + (CellError::GettingData, "#OBTENIENDO_DATOS"), + (CellError::Spill, "#¡DESBORDAMIENTO!"), + (CellError::Calc, "#¡CALC!"), + ], + table_items: ["#Todo", "#Datos", "#Encabezados", "#Totales", "#Esta fila"], + functions: &[ + ("ACCRINT", "INT.ACUM"), + ("ACCRINTM", "INT.ACUM.V"), + ("ADDRESS", "DIRECCION"), + ("AGGREGATE", "AGREGAR"), + ("AMORDEGRC", "AMORTIZ.PROGRE"), + ("AMORLINC", "AMORTIZ.LIN"), + ("AND", "Y"), + ("ARABIC", "NUMERO.ARABE"), + ("ARRAYTOTEXT", "MATRIZATEXTO"), + ("ASIN", "ASENO"), + ("ASINH", "ASENOH"), + ("AVEDEV", "DESVPROM"), + ("AVERAGE", "PROMEDIO"), + ("AVERAGEA", "PROMEDIOA"), + ("AVERAGEIF", "PROMEDIO.SI"), + ("AVERAGEIFS", "PROMEDIO.SI.CONJUNTO"), + ("BETA.DIST", "DISTR.BETA.N"), + ("BETA.INV", "INV.BETA.N"), + ("BETADIST", "DISTR.BETA"), + ("BETAINV", "DISTR.BETA.INV"), + ("BIN2DEC", "BIN.A.DEC"), + ("BIN2HEX", "BIN.A.HEX"), + ("BIN2OCT", "BIN.A.OCT"), + ("BINOM.DIST", "DISTR.BINOM.N"), + ("BINOM.DIST.RANGE", "DISTR.BINOM.SERIE"), + ("BINOM.INV", "INV.BINOM"), + ("BINOMDIST", "DISTR.BINOM"), + ("BITAND", "BIT.Y"), + ("BITLSHIFT", "BIT.DESPLIZQDA"), + ("BITOR", "BIT.O"), + ("BITRSHIFT", "BIT.DESPLDCHA"), + ("BITXOR", "BIT.XO"), + ("CEILING", "MULTIPLO.SUPERIOR"), + // reviewed: vote was truncated "MATH"; page title/examples MULTIPLO.SUPERIOR.MAT; ONLYOFFICE, zekke, PhpSpreadsheet agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("CEILING.MATH", "MULTIPLO.SUPERIOR.MAT"), + ("CEILING.PRECISE", "MULTIPLO.SUPERIOR.EXACTO"), + ("CELL", "CELDA"), + ("CHAR", "CARACTER"), + ("CHIDIST", "DISTR.CHI"), + ("CHIINV", "PRUEBA.CHI.INV"), + ("CHISQ.DIST", "DISTR.CHICUAD"), + ("CHISQ.DIST.RT", "DISTR.CHICUAD.CD"), + ("CHISQ.INV", "INV.CHICUAD"), + ("CHISQ.INV.RT", "INV.CHICUAD.CD"), + ("CHISQ.TEST", "PRUEBA.CHICUAD"), + ("CHITEST", "PRUEBA.CHI"), + ("CHOOSE", "ELEGIR"), + ("CHOOSECOLS", "ELEGIRCOLS"), + // reviewed: page example ELEGIRFILAS; ONLYOFFICE, zekke agree; page syntax is untranslated MT | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("CHOOSEROWS", "ELEGIRFILAS"), + ("CLEAN", "LIMPIAR"), + ("CODE", "CODIGO"), + ("COLUMN", "COLUMNA"), + ("COLUMNS", "COLUMNAS"), + ("COMBIN", "COMBINAT"), + ("COMPLEX", "COMPLEJO"), + ("CONCATENATE", "CONCATENAR"), + ("CONFIDENCE", "INTERVALO.CONFIANZA"), + ("CONFIDENCE.NORM", "INTERVALO.CONFIANZA.NORM"), + ("CONFIDENCE.T", "INTERVALO.CONFIANZA.T"), + ("CONVERT", "CONVERTIR"), + ("CORREL", "COEF.DE.CORREL"), + ("COUNT", "CONTAR"), + ("COUNTA", "CONTARA"), + ("COUNTBLANK", "CONTAR.BLANCO"), + ("COUNTIF", "CONTAR.SI"), + ("COUNTIFS", "CONTAR.SI.CONJUNTO"), + ("COUPDAYBS", "CUPON.DIAS.L1"), + ("COUPDAYS", "CUPON.DIAS"), + ("COUPDAYSNC", "CUPON.DIAS.L2"), + ("COUPNCD", "CUPON.FECHA.L2"), + ("COUPNUM", "CUPON.NUM"), + ("COUPPCD", "CUPON.FECHA.L1"), + ("COVARIANCE.P", "COVARIANZA.P"), + ("COVARIANCE.S", "COVARIANZA.M"), + ("CRITBINOM", "BINOM.CRIT"), + ("CUBEKPIMEMBER", "MIEMBROKPICUBO"), + ("CUBEMEMBER", "MIEMBROCUBO"), + ("CUBEMEMBERPROPERTY", "PROPIEDADMIEMBROCUBO"), + ("CUBERANKEDMEMBER", "MIEMBRORANGOCUBO"), + ("CUBESET", "CONJUNTOCUBO"), + ("CUBESETCOUNT", "RECUENTOCONJUNTOCUBO"), + ("CUBEVALUE", "VALORCUBO"), + ("CUMIPMT", "PAGO.INT.ENTRE"), + ("CUMPRINC", "PAGO.PRINC.ENTRE"), + ("DATE", "FECHA"), + ("DATEDIF", "SIFECHA"), + ("DATEVALUE", "FECHANUMERO"), + ("DAVERAGE", "BDPROMEDIO"), + ("DAY", "DIA"), + ("DAYS", "DIAS"), + ("DAYS360", "DIAS360"), + ("DCOUNT", "BDCONTAR"), + ("DCOUNTA", "BDCONTARA"), + ("DEC2BIN", "DEC.A.BIN"), + ("DEC2HEX", "DEC.A.HEX"), + ("DEC2OCT", "DEC.A.OCT"), + ("DECIMAL", "CONV.DECIMAL"), + ("DEGREES", "GRADOS"), + ("DEVSQ", "DESVIA2"), + ("DGET", "BDEXTRAER"), + ("DISC", "TASA.DESC"), + ("DMAX", "BDMAX"), + ("DMIN", "BDMIN"), + ("DOLLAR", "MONEDA"), + ("DOLLARDE", "MONEDA.DEC"), + ("DOLLARFR", "MONEDA.FRAC"), + ("DPRODUCT", "BDPRODUCTO"), + // reviewed: page syntax/examples EXCLUIR; ONLYOFFICE, zekke agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("DROP", "EXCLUIR"), + ("DSTDEV", "BDDESVEST"), + ("DSTDEVP", "BDDESVESTP"), + ("DSUM", "BDSUMA"), + ("DURATION", "DURACION"), + ("DVAR", "BDVAR"), + ("DVARP", "BDVARP"), + ("EDATE", "FECHA.MES"), + ("EFFECT", "INT.EFECTIVO"), + // reviewed: page syntax URLCODIF(texto); zekke, PhpSpreadsheet agree; title is untranslated MT | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ENCODEURL", "URLCODIF"), + ("EOMONTH", "FIN.MES"), + ("ERF", "FUN.ERROR"), + ("ERF.PRECISE", "FUN.ERROR.EXACTO"), + ("ERFC", "FUN.ERROR.COMPL"), + ("ERFC.PRECISE", "FUN.ERROR.COMPL.EXACTO"), + ("ERROR.TYPE", "TIPO.DE.ERROR"), + ("EVEN", "REDONDEA.PAR"), + ("EXACT", "IGUAL"), + // reviewed: page syntax/examples and nav; ONLYOFFICE, zekke agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("EXPAND", "EXPANDIR"), + ("EXPON.DIST", "DISTR.EXP.N"), + ("EXPONDIST", "DISTR.EXP"), + ("F.DIST", "DISTR.F.N"), + ("F.DIST.RT", "DISTR.F.CD"), + ("F.INV", "INV.F"), + ("F.INV.RT", "INV.F.CD"), + ("F.TEST", "PRUEBA.F.N"), + ("FACTDOUBLE", "FACT.DOBLE"), + ("FALSE", "FALSO"), + ("FDIST", "DISTR.F"), + ("FILTER", "FILTRAR"), + // reviewed: page meta/syntax; zekke, PhpSpreadsheet agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("FILTERXML", "XMLFILTRO"), + // reviewed: FIND/FINDB page absent/retired in cache; ONLYOFFICE, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("FIND", "ENCONTRAR"), + // reviewed: B-variant of ENCONTRAR; ONLYOFFICE only (zekke has English FINDB) | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("FINDB", "ENCONTRARB"), + ("FINV", "DISTR.F.INV"), + ("FISHERINV", "PRUEBA.FISHER.INV"), + ("FIXED", "DECIMAL"), + ("FLOOR", "MULTIPLO.INFERIOR"), + ("FLOOR.MATH", "MULTIPLO.INFERIOR.MAT"), + ("FLOOR.PRECISE", "MULTIPLO.INFERIOR.EXACTO"), + ("FORECAST", "PRONOSTICO"), + // reviewed: page syntax and meta; PhpSpreadsheet agrees | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("FORECAST.LINEAR", "PRONOSTICO.LINEAL"), + ("FORMULATEXT", "FORMULATEXTO"), + ("FREQUENCY", "FRECUENCIA"), + ("FTEST", "PRUEBA.F"), + ("FV", "VF"), + ("FVSCHEDULE", "VF.PLAN"), + ("GAMMA.DIST", "DISTR.GAMMA.N"), + ("GAMMA.INV", "INV.GAMMA"), + ("GAMMADIST", "DISTR.GAMMA"), + ("GAMMAINV", "DISTR.GAMMA.INV"), + ("GAMMALN", "GAMMA.LN"), + ("GAMMALN.PRECISE", "GAMMA.LN.EXACTO"), + ("GCD", "M.C.D"), + ("GEOMEAN", "MEDIA.GEOM"), + ("GESTEP", "MAYOR.O.IGUAL"), + ("GROUPBY", "AGRUPARPOR"), + ("GROWTH", "CRECIMIENTO"), + ("HARMEAN", "MEDIA.ARMO"), + ("HEX2BIN", "HEX.A.BIN"), + ("HEX2DEC", "HEX.A.DEC"), + ("HEX2OCT", "HEX.A.OCT"), + ("HLOOKUP", "BUSCARH"), + // reviewed: page title/syntax/examples HORA; all independent sources agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("HOUR", "HORA"), + ("HSTACK", "APILARH"), + ("HYPERLINK", "HIPERVINCULO"), + ("HYPGEOM.DIST", "DISTR.HIPERGEOM.N"), + ("HYPGEOMDIST", "DISTR.HIPERGEOM"), + ("IF", "SI"), + ("IFERROR", "SI.ERROR"), + ("IFNA", "SI.ND"), + ("IFS", "SI.CONJUNTO"), + ("IMABS", "IM.ABS"), + ("IMAGINARY", "IMAGINARIO"), + ("IMARGUMENT", "IM.ANGULO"), + ("IMCONJUGATE", "IM.CONJUGADA"), + ("IMCOS", "IM.COS"), + ("IMCOSH", "IM.COSH"), + ("IMCOT", "IM.COT"), + ("IMCSC", "IM.CSC"), + ("IMCSCH", "IM.CSCH"), + ("IMDIV", "IM.DIV"), + ("IMEXP", "IM.EXP"), + ("IMLN", "IM.LN"), + ("IMLOG10", "IM.LOG10"), + ("IMLOG2", "IM.LOG2"), + ("IMPOWER", "IM.POT"), + ("IMPRODUCT", "IM.PRODUCT"), + ("IMREAL", "IM.REAL"), + ("IMSEC", "IM.SEC"), + ("IMSECH", "IM.SECH"), + ("IMSIN", "IM.SENO"), + ("IMSINH", "IM.SENOH"), + ("IMSQRT", "IM.RAIZ2"), + ("IMSUB", "IM.SUSTR"), + ("IMSUM", "IM.SUM"), + ("IMTAN", "IM.TAN"), + ("INDEX", "INDICE"), + ("INDIRECT", "INDIRECTO"), + ("INT", "ENTERO"), + ("INTERCEPT", "INTERSECCION.EJE"), + ("INTRATE", "TASA.INT"), + ("IPMT", "PAGOINT"), + ("IRR", "TIR"), + // reviewed: IS* page examples/meta list ESBLANCO; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISBLANK", "ESBLANCO"), + // reviewed: IS* page examples/meta list ESERR; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISERR", "ESERR"), + // reviewed: IS* page examples/meta list ESERROR; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISERROR", "ESERROR"), + ("ISEVEN", "ES.PAR"), + ("ISFORMULA", "ESFORMULA"), + // reviewed: IS* page examples/meta list ESLOGICO; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISLOGICAL", "ESLOGICO"), + // reviewed: IS* page examples/meta list ESNOD; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISNA", "ESNOD"), + // reviewed: IS* page examples/meta list ESNOTEXTO; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISNONTEXT", "ESNOTEXTO"), + // reviewed: IS* page examples/meta list ESNUMERO; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISNUMBER", "ESNUMERO"), + ("ISO.CEILING", "MULTIPLO.SUPERIOR.ISO"), + ("ISODD", "ES.IMPAR"), + ("ISOWEEKNUM", "ISO.NUM.DE.SEMANA"), + ("ISPMT", "INT.PAGO.DIR"), + // reviewed: IS* page examples/meta list ESREF; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISREF", "ESREF"), + // reviewed: IS* page examples/meta list ESTEXTO; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("ISTEXT", "ESTEXTO"), + ("KURT", "CURTOSIS"), + ("LARGE", "K.ESIMO.MAYOR"), + ("LCM", "M.C.M"), + ("LEFT", "IZQUIERDA"), + ("LEFTB", "IZQUIERDAB"), + // reviewed: page meta/syntax: LARGO(texto), LARGOB; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree; vote picked English page title | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("LEN", "LARGO"), + // reviewed: page meta says LARGOB devuelve el número de bytes; ONLYOFFICE, zekke agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("LENB", "LARGOB"), + ("LINEST", "ESTIMACION.LINEAL"), + ("LOGEST", "ESTIMACION.LOGARITMICA"), + ("LOGINV", "DISTR.LOG.INV"), + ("LOGNORM.DIST", "DISTR.LOGNORM"), + ("LOGNORM.INV", "INV.LOGNORM"), + ("LOGNORMDIST", "DISTR.LOG.NORM"), + ("LOOKUP", "BUSCAR"), + ("LOWER", "MINUSC"), + ("MATCH", "COINCIDIR"), + ("MAXIFS", "MAX.SI.CONJUNTO"), + ("MDURATION", "DURACION.MODIF"), + ("MEDIAN", "MEDIANA"), + ("MID", "EXTRAE"), + ("MIDB", "EXTRAEB"), + ("MINIFS", "MIN.SI.CONJUNTO"), + ("MINUTE", "MINUTO"), + ("MINVERSE", "MINVERSA"), + ("MIRR", "TIRM"), + ("MOD", "RESIDUO"), + ("MODE", "MODA"), + ("MODE.MULT", "MODA.VARIOS"), + ("MODE.SNGL", "MODA.UNO"), + ("MONTH", "MES"), + ("MROUND", "REDOND.MULT"), + ("MUNIT", "M.UNIDAD"), + ("NA", "NOD"), + ("NETWORKDAYS", "DIAS.LAB"), + ("NETWORKDAYS.INTL", "DIAS.LAB.INTL"), + ("NOMINAL", "TASA.NOMINAL"), + ("NORM.DIST", "DISTR.NORM.N"), + ("NORM.INV", "INV.NORM"), + ("NORM.S.DIST", "DISTR.NORM.ESTAND.N"), + ("NORM.S.INV", "INV.NORM.ESTAND"), + ("NORMDIST", "DISTR.NORM"), + ("NORMINV", "DISTR.NORM.INV"), + ("NORMSDIST", "DISTR.NORM.ESTAND"), + ("NORMSINV", "DISTR.NORM.ESTAND.INV"), + ("NOT", "NO"), + ("NOW", "AHORA"), + ("NPV", "VNA"), + ("NUMBERVALUE", "VALOR.NUMERO"), + ("OCT2BIN", "OCT.A.BIN"), + ("OCT2DEC", "OCT.A.DEC"), + ("OCT2HEX", "OCT.A.HEX"), + ("ODD", "REDONDEA.IMPAR"), + ("OFFSET", "DESREF"), + ("OR", "O"), + ("PDURATION", "P.DURACION"), + ("PERCENTILE", "PERCENTIL"), + // reviewed: vote was truncated "EXC"; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula and Microsoft nav list agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("PERCENTILE.EXC", "PERCENTIL.EXC"), + ("PERCENTILE.INC", "PERCENTIL.INC"), + ("PERCENTRANK", "RANGO.PERCENTIL"), + ("PERCENTRANK.EXC", "RANGO.PERCENTIL.EXC"), + ("PERCENTRANK.INC", "RANGO.PERCENTIL.INC"), + ("PERMUT", "PERMUTACIONES"), + ("PERMUTATIONA", "PERMUTACIONES.A"), + ("PHI", "FI"), + ("PHONETIC", "FONETICO"), + ("PIVOTBY", "PIVOTARPOR"), + ("PMT", "PAGO"), + ("POWER", "POTENCIA"), + ("PPMT", "PAGOPRIN"), + ("PRICE", "PRECIO"), + ("PRICEDISC", "PRECIO.DESCUENTO"), + ("PRICEMAT", "PRECIO.VENCIMIENTO"), + ("PROB", "PROBABILIDAD"), + ("PRODUCT", "PRODUCTO"), + ("PROPER", "NOMPROPIO"), + ("PV", "VA"), + ("QUARTILE", "CUARTIL"), + ("QUARTILE.EXC", "CUARTIL.EXC"), + ("QUARTILE.INC", "CUARTIL.INC"), + ("QUOTIENT", "COCIENTE"), + ("RADIANS", "RADIANES"), + // reviewed: vote was truncated "ALEAT"; page examples contain ALEATORIO; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("RAND", "ALEATORIO"), + ("RANDARRAY", "MATRIZALEAT"), + ("RANDBETWEEN", "ALEATORIO.ENTRE"), + ("RANK", "JERARQUIA"), + ("RANK.AVG", "JERARQUIA.MEDIA"), + ("RANK.EQ", "JERARQUIA.EQV"), + ("RATE", "TASA"), + ("RECEIVED", "CANTIDAD.RECIBIDA"), + ("REGEXEXTRACT", "REGEXEXTRACCION"), + // reviewed: page title/meta; ONLYOFFICE agrees (zekke English) | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("REGEXREPLACE", "REGEXREEMPLAZAR"), + // reviewed: page title/meta; ONLYOFFICE agrees (zekke English) | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("REGEXTEST", "REGEXPRUEBA"), + ("REPLACE", "REEMPLAZAR"), + // reviewed: REEMPLAZAR page meta lists REEMPLAZARB; ONLYOFFICE, zekke agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("REPLACEB", "REEMPLAZARB"), + ("REPT", "REPETIR"), + ("RIGHT", "DERECHA"), + ("RIGHTB", "DERECHAB"), + ("ROMAN", "NUMERO.ROMANO"), + ("ROUND", "REDONDEAR"), + ("ROUNDDOWN", "REDONDEAR.MENOS"), + ("ROUNDUP", "REDONDEAR.MAS"), + ("ROW", "FILA"), + ("ROWS", "FILAS"), + ("RSQ", "COEFICIENTE.R2"), + ("SEARCH", "HALLAR"), + ("SEARCHB", "HALLARB"), + ("SECOND", "SEGUNDO"), + ("SEQUENCE", "SECUENCIA"), + ("SERIESSUM", "SUMA.SERIES"), + ("SHEET", "HOJA"), + ("SHEETS", "HOJAS"), + ("SIGN", "SIGNO"), + ("SIN", "SENO"), + // reviewed: page syntax SENOH(número); ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree; consistent with SENO/ASENOH | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("SINH", "SENOH"), + ("SKEW", "COEFICIENTE.ASIMETRIA"), + ("SKEW.P", "COEFICIENTE.ASIMETRIA.P"), + ("SLOPE", "PENDIENTE"), + ("SMALL", "K.ESIMO.MENOR"), + ("SORT", "ORDENAR"), + ("SORTBY", "ORDENARPOR"), + ("SQRT", "RAIZ"), + ("SQRTPI", "RAIZ2PI"), + ("STANDARDIZE", "NORMALIZACION"), + ("STDEV", "DESVEST"), + ("STDEV.P", "DESVEST.P"), + ("STDEV.S", "DESVEST.M"), + ("STDEVA", "DESVESTA"), + ("STDEVP", "DESVESTP"), + ("STDEVPA", "DESVESTPA"), + ("STEYX", "ERROR.TIPICO.XY"), + ("SUBSTITUTE", "SUSTITUIR"), + ("SUBTOTAL", "SUBTOTALES"), + ("SUM", "SUMA"), + ("SUMIF", "SUMAR.SI"), + ("SUMIFS", "SUMAR.SI.CONJUNTO"), + ("SUMPRODUCT", "SUMAPRODUCTO"), + ("SUMSQ", "SUMA.CUADRADOS"), + ("SUMX2MY2", "SUMAX2MENOSY2"), + ("SUMX2PY2", "SUMAX2MASY2"), + ("SUMXMY2", "SUMAXMENOSY2"), + ("SWITCH", "CAMBIAR"), + ("T.DIST", "DISTR.T.N"), + ("T.DIST.2T", "DISTR.T.2C"), + ("T.DIST.RT", "DISTR.T.CD"), + ("T.INV", "INV.T"), + ("T.INV.2T", "INV.T.2C"), + ("T.TEST", "PRUEBA.T.N"), + ("TAKE", "TOMAR"), + // reviewed: syntax+examples+Microsoft nav list say TEST; page title/meta and ONLYOFFICE say TES; zekke/PhpSpreadsheet/HyperFormula say TEST | sources: MS nav+syntax, PhpSpreadsheet, zekke, HyperFormula (TEST); ONLYOFFICE TES + ("TBILLEQ", "LETRA.DE.TEST.EQV.A.BONO"), + ("TBILLPRICE", "LETRA.DE.TES.PRECIO"), + ("TBILLYIELD", "LETRA.DE.TES.RENDTO"), + ("TDIST", "DISTR.T"), + ("TEXT", "TEXTO"), + // reviewed: page meta and example TEXTODESPUES; ONLYOFFICE, zekke agree; syntax line is untranslated MT | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("TEXTAFTER", "TEXTODESPUES"), + // reviewed: page example TEXTOANTES; ONLYOFFICE, zekke agree; syntax line is untranslated MT | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("TEXTBEFORE", "TEXTOANTES"), + ("TEXTJOIN", "UNIRCADENAS"), + // reviewed: page syntax/examples, nav; ONLYOFFICE, zekke agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("TEXTSPLIT", "DIVIDIRTEXTO"), + // reviewed: page meta/examples NSHORA (HORA is HOUR); ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("TIME", "NSHORA"), + ("TIMEVALUE", "HORANUMERO"), + ("TINV", "DISTR.T.INV"), + // reviewed: page syntax/examples, nav; ONLYOFFICE, zekke agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("TOCOL", "ENCOL"), + ("TODAY", "HOY"), + // reviewed: Microsoft nav list ENFILA; ONLYOFFICE, zekke agree; page body untranslated MT | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("TOROW", "ENFILA"), + ("TRANSPOSE", "TRANSPONER"), + ("TREND", "TENDENCIA"), + ("TRIM", "ESPACIOS"), + ("TRIMMEAN", "MEDIA.ACOTADA"), + // reviewed: page meta/examples VERDADERO; all independent sources agree; vote picked truncated "VERDAD" | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("TRUE", "VERDADERO"), + ("TRUNC", "TRUNCAR"), + ("TTEST", "PRUEBA.T"), + ("TYPE", "TIPO"), + ("UNICHAR", "UNICAR"), + // reviewed: page title "Función UNICOS" and meta; HyperFormula UNICOS; ONLYOFFICE/zekke only have English fallback | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("UNIQUE", "UNICOS"), + ("UPPER", "MAYUSC"), + ("VALUE", "VALOR"), + ("VALUETOTEXT", "VALORATEXTO"), + ("VDB", "DVS"), + ("VLOOKUP", "BUSCARV"), + ("VSTACK", "APILARV"), + ("WEBSERVICE", "SERVICIOWEB"), + ("WEEKDAY", "DIASEM"), + ("WEEKNUM", "NUM.DE.SEMANA"), + ("WEIBULL", "DIST.WEIBULL"), + ("WEIBULL.DIST", "DISTR.WEIBULL"), + ("WORKDAY", "DIA.LAB"), + ("WORKDAY.INTL", "DIA.LAB.INTL"), + // reviewed: Microsoft nav list AJUSTARCOLS + ONLYOFFICE; zekke English; page body untranslated MT | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("WRAPCOLS", "AJUSTARCOLS"), + // reviewed: Microsoft nav list AJUSTARFILAS + ONLYOFFICE; zekke English; page body untranslated MT | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + ("WRAPROWS", "AJUSTARFILAS"), + ("XIRR", "TIR.NO.PER"), + ("XLOOKUP", "BUSCARX"), + ("XMATCH", "COINCIDIRX"), + ("XNPV", "VNA.NO.PER"), + ("XOR", "XO"), + ("YEAR", "AÑO"), + ("YEARFRAC", "FRAC.AÑO"), + ("YIELD", "RENDTO"), + ("YIELDDISC", "RENDTO.DESC"), + ("YIELDMAT", "RENDTO.VENCTO"), + ("Z.TEST", "PRUEBA.Z.N"), + ("ZTEST", "PRUEBA.Z"), + ], +}; diff --git a/crates/formula/src/input/pt.rs b/crates/formula/src/input/pt.rs new file mode 100644 index 000000000..92a8df797 --- /dev/null +++ b/crates/formula/src/input/pt.rs @@ -0,0 +1,490 @@ +//! Português (Brasil): the formula words Brazilian Portuguese Excel shows (function names, booleans, errors, +//! structured-reference specifiers) and its formula separators. +//! +//! Function names come from Microsoft Support's pt-br Excel function pages (retrieved +//! 2026-10-10; the pages are machine-translated): per page, a vote among the title, the meta +//! description, the syntax paragraph (aligned with the en-US page) and `=NAME(` examples, and an +//! entry needs two agreeing signals. Entries marked `reviewed` were decided by hand from the page +//! evidence and independent function-name references. Functions not listed keep their English name. +//! +//! Sources for the other words: +//! - bool/errors: https://support.microsoft.com/pt-br/excel/functions/error-type-function +//! - errors.#GETTING_DATA: https://support.microsoft.com/pt-br/excel/functions/cubesetcount-function | tudoexcel.com.br +//! - errors.#SPILL!: https://support.microsoft.com/pt-br/excel/how-to-correct-a-spill-error | https://www.guiadoexcel.com.br/erro-despejar-no-excel-o-porque-ocorre-como-corrigir-e-evitar/ | https://ninjadoexcel.com.br/ +//! - errors.#CALC!: https://support.microsoft.com/pt-br/excel/how-to-correct-a-calc-error (page keeps #CALC!) +//! - table_items: https://support.microsoft.com/pt-br/excel/using-structured-references-with-excel-tables | blogs [[#Tudo];...] [#Cabeçalhos] + +use super::Dialect; +use gridcraft_core::CellError; + +pub(super) const DIALECT: Dialect = Dialect { + list: ';', + decimal: ',', + array_column: '\\', + array_row: ';', + bool_true: "VERDADEIRO", + bool_false: "FALSO", + errors: &[ + (CellError::Null, "#NULO!"), + (CellError::Div0, "#DIV/0!"), + (CellError::Value, "#VALOR!"), + (CellError::Ref, "#REF!"), + (CellError::Name, "#NOME?"), + (CellError::Num, "#NÚM!"), + (CellError::NA, "#N/D"), + (CellError::GettingData, "#OBTENDO_DADOS"), + (CellError::Spill, "#DESPEJAR!"), + (CellError::Calc, "#CALC!"), + ], + table_items: ["#Tudo", "#Dados", "#Cabeçalhos", "#Totais", "#Esta Linha"], + functions: &[ + ("ACCRINT", "JUROSACUM"), + ("ACCRINTM", "JUROSACUMV"), + ("ADDRESS", "ENDEREÇO"), + ("AGGREGATE", "AGREGAR"), + ("AND", "E"), + ("ARABIC", "ARÁBICO"), + ("AREAS", "ÁREAS"), + ("ARRAYTOTEXT", "MATRIZPARATEXTO"), + ("ASIN", "ASEN"), + ("ASINH", "ASENH"), + ("AVEDEV", "DESV.MÉDIO"), + ("AVERAGE", "MÉDIA"), + ("AVERAGEA", "MÉDIAA"), + ("AVERAGEIF", "MÉDIASE"), + ("AVERAGEIFS", "MÉDIASES"), + ("BETA.DIST", "DIST.BETA"), + ("BETA.INV", "INV.BETA"), + ("BETADIST", "DISTBETA"), + ("BETAINV", "BETA.ACUM.INV"), + ("BIN2DEC", "BINADEC"), + ("BIN2HEX", "BINAHEX"), + ("BIN2OCT", "BINAOCT"), + ("BINOM.DIST", "DISTR.BINOM"), + ("BINOM.DIST.RANGE", "INTERV.DISTR.BINOM"), + ("BINOM.INV", "INV.BINOM"), + ("BINOMDIST", "DISTRBINOM"), + ("BITLSHIFT", "DESLOCESQBIT"), + ("BITRSHIFT", "DESLOCDIRBIT"), + ("CEILING", "TETO"), + // reviewed: MS title/examples give TETO.MAT; real blog formula uses TETO.MAT + ("CEILING.MATH", "TETO.MAT"), + ("CEILING.PRECISE", "TETO.PRECISO"), + ("CELL", "CÉL"), + ("CHAR", "CARACT"), + ("CHIDIST", "DIST.QUI"), + ("CHIINV", "INV.QUI"), + ("CHISQ.DIST", "DIST.QUIQUA"), + ("CHISQ.DIST.RT", "DIST.QUIQUA.CD"), + ("CHISQ.INV", "INV.QUIQUA"), + ("CHISQ.INV.RT", "INV.QUIQUA.CD"), + ("CHISQ.TEST", "TESTE.QUIQUA"), + ("CHITEST", "TESTE.QUI"), + ("CHOOSE", "ESCOLHER"), + ("CHOOSECOLS", "ESCOLHERCOLS"), + // reviewed: real formulas | sources: https://www.guiadoexcel.com.br/funcao-escolherlins-excel/ + ("CHOOSEROWS", "ESCOLHERLINS"), + ("CLEAN", "TIRAR"), + ("CODE", "CÓDIGO"), + ("COLUMN", "COL"), + ("COLUMNS", "COLS"), + ("COMPLEX", "COMPLEXO"), + ("CONCATENATE", "CONCATENAR"), + ("CONFIDENCE", "INT.CONFIANÇA"), + ("CONFIDENCE.NORM", "INT.CONFIANÇA.NORM"), + ("CONFIDENCE.T", "INT.CONFIANÇA.T"), + ("CONVERT", "CONVERTER"), + ("COUNT", "CONT.NÚM"), + ("COUNTA", "CONT.VALORES"), + // reviewed: MS title; 5 blog pages + ("COUNTBLANK", "CONTAR.VAZIO"), + // reviewed: MS syntax/examples CONT.SE; ~139 blog pages use CONT.SE in formulas + ("COUNTIF", "CONT.SE"), + ("COUNTIFS", "CONT.SES"), + ("COUPDAYBS", "CUPDIASINLIQ"), + ("COUPDAYS", "CUPDIAS"), + ("COUPDAYSNC", "CUPDIASPRÓX"), + ("COUPNCD", "CUPDATAPRÓX"), + ("COUPNUM", "CUPNÚM"), + ("COUPPCD", "CUPDATAANT"), + ("COVARIANCE.P", "COVARIAÇÃO.P"), + ("COVARIANCE.S", "COVARIAÇÃO.S"), + ("CRITBINOM", "CRIT.BINOM"), + ("CSC", "COSEC"), + ("CSCH", "COSECH"), + ("CUBEKPIMEMBER", "MEMBROKPICUBO"), + ("CUBEMEMBER", "MEMBROCUBO"), + ("CUBEMEMBERPROPERTY", "PROPRIEDADEMEMBROCUBO"), + ("CUBERANKEDMEMBER", "MEMBROCLASSIFICADOCUBO"), + ("CUBESET", "CONJUNTOCUBO"), + ("CUBESETCOUNT", "CONTAGEMCONJUNTOCUBO"), + ("CUBEVALUE", "VALORCUBO"), + ("CUMIPMT", "PGTOJURACUM"), + ("CUMPRINC", "PGTOCAPACUM"), + ("DATE", "DATA"), + ("DATEDIF", "DATADIF"), + ("DATEVALUE", "DATA.VALOR"), + ("DAVERAGE", "BDMÉDIA"), + ("DAY", "DIA"), + ("DAYS", "DIAS"), + ("DAYS360", "DIAS360"), + ("DB", "BD"), + ("DCOUNT", "BDCONTAR"), + ("DCOUNTA", "BDCONTARA"), + ("DDB", "BDD"), + ("DEC2BIN", "DECABIN"), + ("DEC2HEX", "DECAHEX"), + ("DEC2OCT", "DECAOCT"), + ("DEGREES", "GRAUS"), + ("DEVSQ", "DESVQ"), + ("DGET", "BDEXTRAIR"), + ("DISC", "DESC"), + ("DMAX", "BDMÁX"), + ("DMIN", "BDMÍN"), + ("DOLLAR", "MOEDA"), + ("DOLLARDE", "MOEDADEC"), + ("DOLLARFR", "MOEDAFRA"), + ("DPRODUCT", "BDMULTIPL"), + // reviewed: blog formulas + ("DROP", "DESCARTAR"), + ("DSTDEV", "BDEST"), + ("DSTDEVP", "BDDESVPA"), + ("DSUM", "BDSOMA"), + ("DURATION", "DURAÇÃO"), + ("DVAR", "BDVAREST"), + ("DVARP", "BDVARP"), + ("EDATE", "DATAM"), + ("EFFECT", "EFETIVA"), + ("ENCODEURL", "CODIFURL"), + ("EOMONTH", "FIMMÊS"), + ("ERF", "FUNERRO"), + ("ERF.PRECISE", "FUNERRO.PRECISO"), + ("ERFC", "FUNERROCOMPL"), + ("ERFC.PRECISE", "FUNERROCOMPL.PRECISO"), + ("ERROR.TYPE", "TIPO.ERRO"), + ("EVEN", "PAR"), + ("EXACT", "EXATO"), + // reviewed: real formulas | sources: https://www.guiadoexcel.com.br/funcao-expandir-excel/ + ("EXPAND", "EXPANDIR"), + ("EXPON.DIST", "DISTR.EXPON"), + ("EXPONDIST", "DISTEXPON"), + ("F.DIST", "DIST.F"), + ("F.DIST.RT", "DIST.F.CD"), + ("F.INV", "INV.F"), + ("F.INV.RT", "INV.F.CD"), + ("F.TEST", "TESTE.F"), + ("FACT", "FATORIAL"), + ("FACTDOUBLE", "FATDUPLO"), + ("FALSE", "FALSO"), + ("FDIST", "DISTF"), + ("FILTER", "FILTRO"), + ("FILTERXML", "FILTROXML"), + // reviewed: blog formulas use PROCURAR (MS vote weak) | sources: https://www.guiadoexcel.com.br/funcoes-de-texto/ + ("FIND", "PROCURAR"), + // reviewed: B-variant of PROCURAR; follows ESQUERDAB/DIREITAB/NÚM.CARACTB/LOCALIZARB pattern; no direct source for the B form + ("FINDB", "PROCURARB"), + ("FINV", "INVF"), + // reviewed: MS syntax/examples; blog | sources: https://www.guiadoexcel.com.br/funcoes-de-texto/ + ("FIXED", "DEF.NÚM.DEC"), + ("FLOOR", "ARREDMULTB"), + ("FLOOR.MATH", "ARREDMULTB.MAT"), + ("FLOOR.PRECISE", "ARREDMULTB.PRECISO"), + ("FORECAST", "PREVISÃO"), + ("FORECAST.LINEAR", "PREVISÃO.LINEAR"), + ("FORMULATEXT", "FÓRMULATEXTO"), + ("FREQUENCY", "FREQÜÊNCIA"), + ("FTEST", "TESTEF"), + ("FV", "VF"), + ("FVSCHEDULE", "VFPLANO"), + ("GAMMA", "GAMA"), + ("GAMMA.DIST", "DIST.GAMA"), + ("GAMMA.INV", "INV.GAMA"), + ("GAMMADIST", "DISTGAMA"), + ("GAMMAINV", "INVGAMA"), + ("GAMMALN", "LNGAMA"), + ("GAMMALN.PRECISE", "LNGAMA.PRECISO"), + ("GCD", "MDC"), + ("GEOMEAN", "MÉDIA.GEOMÉTRICA"), + ("GESTEP", "DEGRAU"), + // reviewed: blog | sources: https://ninjadoexcel.com.br/funcao-agruparpor-no-excel/ + ("GROUPBY", "AGRUPARPOR"), + ("GROWTH", "CRESCIMENTO"), + ("HARMEAN", "MÉDIA.HARMÔNICA"), + ("HEX2BIN", "HEXABIN"), + ("HEX2DEC", "HEXADEC"), + ("HEX2OCT", "HEXAOCT"), + ("HLOOKUP", "PROCH"), + ("HOUR", "HORA"), + ("HSTACK", "EMPILHARH"), + // reviewed: ~12 blog pages use HIPERLINK in formulas + ("HYPERLINK", "HIPERLINK"), + ("HYPGEOM.DIST", "DIST.HIPERGEOM.N"), + ("HYPGEOMDIST", "DIST.HIPERGEOM"), + ("IF", "SE"), + ("IFERROR", "SEERRO"), + ("IFNA", "SENÃODISP"), + ("IFS", "SES"), + ("IMAGINARY", "IMAGINÁRIO"), + ("IMARGUMENT", "IMARG"), + ("IMCONJUGATE", "IMCONJ"), + ("IMCSC", "IMCOSEC"), + ("IMCSCH", "IMCOSECH"), + ("IMPOWER", "IMPOT"), + ("IMPRODUCT", "IMPROD"), + ("IMSIN", "IMSENO"), + ("IMSINH", "IMSENH"), + ("IMSQRT", "IMRAIZ"), + ("IMSUB", "IMSUBTR"), + ("IMSUM", "IMSOMA"), + ("INDEX", "ÍNDICE"), + ("INDIRECT", "INDIRETO"), + ("INFO", "INFORMAÇÃO"), + ("INTERCEPT", "INTERCEPÇÃO"), + ("INTRATE", "TAXAJUROS"), + ("IPMT", "IPGTO"), + ("IRR", "TIR"), + // reviewed: blog formulas ÉCÉL.VAZIA; MS is-functions table + ("ISBLANK", "ÉCÉL.VAZIA"), + // reviewed: MS is-functions table: ÉERRO = "exceto #N/D" (ISERR) | sources: https://support.microsoft.com/pt-br/excel/is-functions + ("ISERR", "ÉERRO"), + // reviewed: blog formulas show ÉERROS = ISERROR; ÉERRO is ISERR + ("ISERROR", "ÉERROS"), + ("ISEVEN", "ÉPAR"), + ("ISFORMULA", "ÉFÓRMULA"), + // reviewed: MS is-functions table and blogs + ("ISLOGICAL", "ÉLÓGICO"), + // reviewed: MS is-functions table and blogs + ("ISNA", "É.NÃO.DISP"), + // reviewed: MS is-functions table and blogs + ("ISNONTEXT", "É.NÃO.TEXTO"), + // reviewed: 34 blog pages use ÉNÚM; MS table ÉNÚMERO is MT noise + ("ISNUMBER", "ÉNÚM"), + ("ISO.CEILING", "ISO.TETO"), + // reviewed: blog formulas; MS iseven page gives ÉPAR for ISEVEN + ("ISODD", "ÉIMPAR"), + ("ISOWEEKNUM", "NÚMSEMANAISO"), + ("ISPMT", "ÉPGTO"), + // reviewed: MS is-functions table + ("ISREF", "ÉREF"), + // reviewed: MS is-functions table and blogs + ("ISTEXT", "ÉTEXTO"), + ("KURT", "CURT"), + ("LARGE", "MAIOR"), + ("LCM", "MMC"), + ("LEFT", "ESQUERDA"), + ("LEFTB", "ESQUERDAB"), + ("LEN", "NÚM.CARACT"), + ("LENB", "NÚM.CARACTB"), + ("LINEST", "PROJ.LIN"), + ("LOGEST", "PROJ.LOG"), + ("LOGINV", "INVLOG"), + ("LOGNORM.DIST", "DIST.LOGNORMAL.N"), + ("LOGNORM.INV", "INV.LOGNORMAL"), + ("LOGNORMDIST", "DIST.LOGNORMAL"), + ("LOOKUP", "PROC"), + ("LOWER", "MINÚSCULA"), + ("MATCH", "CORRESP"), + ("MAX", "MÁXIMO"), + ("MAXA", "MÁXIMOA"), + ("MAXIFS", "MÁXIMOSES"), + ("MDETERM", "MATRIZ.DETERM"), + ("MDURATION", "MDURAÇÃO"), + ("MEDIAN", "MED"), + ("MID", "EXT.TEXTO"), + // reviewed: B-variant of EXT.TEXTO; pattern ESQUERDAB/DIREITAB; no direct source + ("MIDB", "EXT.TEXTOB"), + ("MIN", "MÍNIMO"), + ("MINA", "MÍNIMOA"), + ("MINIFS", "MÍNIMOSES"), + ("MINUTE", "MINUTO"), + ("MINVERSE", "MATRIZ.INVERSO"), + ("MIRR", "MTIR"), + ("MMULT", "MATRIZ.MULT"), + ("MODE", "MODO"), + ("MODE.MULT", "MODO.MULT"), + ("MODE.SNGL", "MODO.ÚNICO"), + ("MONTH", "MÊS"), + ("MROUND", "MARRED"), + ("NA", "NÃO.DISP"), + ("NEGBINOM.DIST", "DIST.BIN.NEG.N"), + ("NEGBINOMDIST", "DIST.BIN.NEG"), + ("NETWORKDAYS", "DIATRABALHOTOTAL"), + ("NETWORKDAYS.INTL", "DIATRABALHOTOTAL.INTL"), + ("NORM.DIST", "DIST.NORM.N"), + ("NORM.INV", "INV.NORM.N"), + ("NORM.S.DIST", "DIST.NORMP.N"), + ("NORM.S.INV", "INV.NORMP.N"), + ("NORMDIST", "DISTNORM"), + ("NORMINV", "INV.NORM"), + ("NORMSDIST", "DISTNORMP"), + ("NORMSINV", "INV.NORMP"), + ("NOT", "NÃO"), + ("NOW", "AGORA"), + ("NPV", "VPL"), + ("NUMBERVALUE", "VALORNUMÉRICO"), + ("OCT2BIN", "OCTABIN"), + ("OCT2DEC", "OCTADEC"), + ("OCT2HEX", "OCTAHEX"), + ("ODD", "ÍMPAR"), + ("OFFSET", "DESLOC"), + ("OR", "OU"), + ("PDURATION", "DURAÇÃOP"), + ("PERCENTILE", "PERCENTIL"), + // reviewed: vote wrongly gave EXC; MS title/syntax + ("PERCENTILE.EXC", "PERCENTIL.EXC"), + ("PERCENTILE.INC", "PERCENTIL.INC"), + ("PERCENTRANK", "ORDEM.PORCENTUAL"), + ("PERCENTRANK.EXC", "ORDEM.PORCENTUAL.EXC"), + ("PERCENTRANK.INC", "ORDEM.PORCENTUAL.INC"), + ("PERMUTATIONA", "PERMUTAS"), + ("PHONETIC", "FONÉTICA"), + // reviewed: blog | sources: https://ninjadoexcel.com.br/novidade-funcao-pivotar-do-excel/ + ("PIVOTBY", "PIVOTAR"), + ("PMT", "PGTO"), + ("POISSON.DIST", "DIST.POISSON"), + ("POWER", "POTÊNCIA"), + ("PPMT", "PPGTO"), + ("PRICE", "PREÇO"), + ("PRICEDISC", "PREÇODESC"), + ("PRICEMAT", "PREÇOVENC"), + ("PRODUCT", "MULT"), + ("PROPER", "PRI.MAIÚSCULA"), + ("PV", "VP"), + ("QUARTILE", "QUARTIL"), + ("QUARTILE.EXC", "QUARTIL.EXC"), + ("QUARTILE.INC", "QUARTIL.INC"), + ("QUOTIENT", "QUOCIENTE"), + ("RADIANS", "RADIANOS"), + ("RAND", "ALEATÓRIO"), + ("RANDARRAY", "MATRIZALEATÓRIA"), + ("RANDBETWEEN", "ALEATÓRIOENTRE"), + ("RANK", "ORDEM"), + ("RANK.AVG", "ORDEM.MÉD"), + ("RANK.EQ", "ORDEM.EQ"), + ("RATE", "TAXA"), + ("RECEIVED", "RECEBER"), + // reviewed: real formula in blog | sources: https://www.guiadoexcel.com.br/como-usar-procx-e-regex-excel/ + ("REGEXREPLACE", "REGEX.SUBSTITUIR"), + // reviewed: real formula in blog | sources: https://www.guiadoexcel.com.br/como-usar-procx-e-regex-excel/ + ("REGEXTEST", "REGEX.TESTAR"), + ("REPLACE", "MUDAR"), + // reviewed: B-variant of MUDAR; pattern ESQUERDAB/DIREITAB; no direct source + ("REPLACEB", "MUDARB"), + ("RIGHT", "DIREITA"), + ("RIGHTB", "DIREITAB"), + ("ROMAN", "ROMANO"), + ("ROUND", "ARRED"), + ("ROUNDDOWN", "ARREDONDAR.PARA.BAIXO"), + ("ROUNDUP", "ARREDONDAR.PARA.CIMA"), + ("ROW", "LIN"), + ("ROWS", "LINS"), + ("RRI", "TAXAJURO"), + ("RSQ", "RQUAD"), + ("SEARCH", "LOCALIZAR"), + ("SEARCHB", "LOCALIZARB"), + ("SECOND", "SEGUNDO"), + ("SEQUENCE", "SEQUÊNCIA"), + ("SERIESSUM", "SOMASEQÜÊNCIA"), + ("SHEET", "PLAN"), + ("SHEETS", "PLANS"), + ("SIGN", "SINAL"), + ("SIN", "SEN"), + ("SINH", "SENH"), + ("SKEW", "DISTORÇÃO"), + ("SKEW.P", "DISTORÇÃO.P"), + ("SLN", "DPD"), + ("SLOPE", "INCLINAÇÃO"), + ("SMALL", "MENOR"), + ("SORT", "CLASSIFICAR"), + ("SORTBY", "CLASSIFICARPOR"), + ("SQRT", "RAIZ"), + ("SQRTPI", "RAIZPI"), + ("STANDARDIZE", "PADRONIZAR"), + ("STDEV", "DESVPAD"), + ("STDEV.P", "DESVPAD.P"), + ("STDEV.S", "DESVPAD.A"), + ("STDEVA", "DESVPADA"), + ("STDEVP", "DESVPADP"), + ("STDEVPA", "DESVPADPA"), + ("STEYX", "EPADYX"), + ("SUBSTITUTE", "SUBSTITUIR"), + ("SUM", "SOMA"), + ("SUMIF", "SOMASE"), + ("SUMIFS", "SOMASES"), + ("SUMPRODUCT", "SOMARPRODUTO"), + ("SUMSQ", "SOMAQUAD"), + ("SUMX2MY2", "SOMAX2DY2"), + ("SUMX2PY2", "SOMAX2SY2"), + ("SUMXMY2", "SOMAXMY2"), + ("SWITCH", "PARÂMETRO"), + ("SYD", "SDA"), + ("T.DIST", "DIST.T"), + ("T.DIST.2T", "DIST.T.BC"), + ("T.DIST.RT", "DIST.T.CD"), + ("T.INV", "INV.T"), + ("T.INV.2T", "INV.T.BC"), + ("T.TEST", "TESTE.T"), + // reviewed: real formulas | sources: https://www.guiadoexcel.com.br/funcao-pegar-excel/ + ("TAKE", "PEGAR"), + ("TBILLEQ", "OTN"), + ("TBILLPRICE", "OTNVALOR"), + ("TBILLYIELD", "OTNLUCRO"), + ("TDIST", "DISTT"), + ("TEXT", "TEXTO"), + // reviewed: 23 blog pages + ("TEXTAFTER", "TEXTODEPOIS"), + // reviewed: 19 blog pages + ("TEXTBEFORE", "TEXTOANTES"), + ("TEXTJOIN", "UNIRTEXTO"), + // reviewed: MS syntax/examples; 23 blog pages; older TEXTODIVISÃO kept as alias | sources: https://ninjadoexcel.com.br/como-dividir-texto-no-excel-funcao-dividirtexto/ + ("TEXTSPLIT", "DIVIDIRTEXTO"), + ("TIME", "TEMPO"), + ("TIMEVALUE", "VALOR.TEMPO"), + ("TINV", "INVT"), + // reviewed: real formulas | sources: https://www.hashtagtreinamentos.com/funcoes-paracol-e-paralin-excel + ("TOCOL", "PARACOL"), + ("TODAY", "HOJE"), + // reviewed: real formulas | sources: https://www.hashtagtreinamentos.com/funcoes-paracol-e-paralin-excel + ("TOROW", "PARALIN"), + ("TRANSPOSE", "TRANSPOR"), + // reviewed: blog formulas + ("TREND", "TENDÊNCIA"), + ("TRIM", "ARRUMAR"), + ("TRIMMEAN", "MÉDIA.INTERNA"), + ("TRUE", "VERDADEIRO"), + ("TRUNC", "TRUNCAR"), + ("TTEST", "TESTET"), + ("TYPE", "TIPO"), + ("UNICHAR", "CARACTUNICODE"), + ("UNIQUE", "ÚNICO"), + ("UPPER", "MAIÚSCULA"), + ("VALUE", "VALOR"), + ("VALUETOTEXT", "VALORPARATEXTO"), + // reviewed: MS title/examples only (no blog source) + ("VAR", "VAREST"), + ("VAR.S", "VAR.A"), + ("VDB", "BDV"), + ("VLOOKUP", "PROCV"), + ("VSTACK", "EMPILHARV"), + ("WEBSERVICE", "SERVIÇOWEB"), + ("WEEKDAY", "DIA.DA.SEMANA"), + ("WEEKNUM", "NÚMSEMANA"), + ("WEIBULL.DIST", "DIST.WEIBULL"), + ("WORKDAY", "DIATRABALHO"), + ("WORKDAY.INTL", "DIATRABALHO.INTL"), + ("WRAPCOLS", "QUEBRARCOLS"), + // reviewed: blog; sibling WRAPCOLS=QUEBRARCOLS + ("WRAPROWS", "QUEBRARLINS"), + ("XIRR", "XTIR"), + ("XLOOKUP", "PROCX"), + ("XMATCH", "CORRESPX"), + ("XNPV", "XVPL"), + ("YEAR", "ANO"), + ("YEARFRAC", "FRAÇÃOANO"), + ("YIELD", "LUCRO"), + ("YIELDDISC", "LUCRODESC"), + ("YIELDMAT", "LUCROVENC"), + ("Z.TEST", "TESTE.Z"), + ("ZTEST", "TESTEZ"), + ], +}; diff --git a/crates/formula/src/input/ru.rs b/crates/formula/src/input/ru.rs new file mode 100644 index 000000000..677341320 --- /dev/null +++ b/crates/formula/src/input/ru.rs @@ -0,0 +1,870 @@ +//! Русский (Россия): the formula words Russian Excel shows (function names, booleans, errors, +//! structured-reference specifiers) and its formula separators. +//! +//! Function names come from Microsoft Support's ru-ru Excel function pages (retrieved +//! 2026-10-10; the pages are machine-translated): per page, a vote among the title, the meta +//! description, the syntax paragraph (aligned with the en-US page) and `=NAME(` examples, and an +//! entry needs two agreeing signals. Entries marked `reviewed` were decided by hand from the page +//! evidence and independent function-name references. Functions not listed keep their English name. +//! +//! Unless an entry says otherwise, `reviewed` means: At least two independent function translation references agree; conflicting machine-translated spellings rejected. +//! +//! Sources for the other words: +//! - bool: https://support.microsoft.com/ru-ru/excel/functions/address-function (a1 argument: ИСТИНА / ЛОЖЬ) +//! - errors: https://support.microsoft.com/ru-ru/excel/functions/error-type-function +//! - errors.#SPILL!: https://support.microsoft.com/ru-ru/excel/how-to-correct-a-spill-error +//! - table_items: https://support.microsoft.com/ru-ru/excel/using-structured-references-with-excel-tables +//! - errors.#CALC!: https://www.planetaexcel.ru/techniques/25/9457/ | https://coddy.tech/docs/ru/excel/filter (empty FILTER result -> #ВЫЧИСЛ!, English #CALC!) +//! - errors.#REF!: https://excel-academy.ru/faq/kak-ispravit-oshibki-ssyilka-i-imya-v-excel/ | https://coddy.tech/docs/ru/excel/ref-error | https://support.microsoft.com/ru-ru/excel/functions/sum-function (ERROR.TYPE table truncates spelling to #ССЫЛ!, corrected using independent formula examples) + +use super::Dialect; +use gridcraft_core::CellError; + +pub(super) const DIALECT: Dialect = Dialect { + list: ';', + decimal: ',', + array_column: ';', + array_row: ':', + bool_true: "ИСТИНА", + bool_false: "ЛОЖЬ", + errors: &[ + (CellError::Null, "#ПУСТО!"), + (CellError::Div0, "#ДЕЛ/0!"), + (CellError::Value, "#ЗНАЧ!"), + (CellError::Ref, "#ССЫЛКА!"), + (CellError::Name, "#ИМЯ?"), + (CellError::Num, "#ЧИСЛО!"), + (CellError::NA, "#Н/Д"), + (CellError::GettingData, "#ОЖИДАНИЕ_ДАННЫХ"), + (CellError::Spill, "#ПЕРЕНОС!"), + (CellError::Calc, "#ВЫЧИСЛ!"), + ], + table_items: ["#Все", "#Данные", "#Заголовки", "#Итого", "#Эта строка"], + functions: &[ + ("ACCRINT", "НАКОПДОХОД"), + ("ACCRINTM", "НАКОПДОХОДПОГАШ"), + ("ADDRESS", "АДРЕС"), + ("AGGREGATE", "АГРЕГАТ"), + ("AMORDEGRC", "АМОРУМ"), + ("AMORLINC", "АМОРУВ"), + ("AND", "И"), + ("ARABIC", "АРАБСКОЕ"), + ("AREAS", "ОБЛАСТИ"), + ("ARRAYTOTEXT", "МАССИВВТЕКСТ"), + ("AVEDEV", "СРОТКЛ"), + ("AVERAGE", "СРЗНАЧ"), + ("AVERAGEA", "СРЗНАЧА"), + ("AVERAGEIF", "СРЗНАЧЕСЛИ"), + ("AVERAGEIFS", "СРЗНАЧЕСЛИМН"), + ("BASE", "ОСНОВАНИЕ"), + ("BESSELI", "БЕССЕЛЬ.I"), + ("BESSELJ", "БЕССЕЛЬ.J"), + ("BESSELK", "БЕССЕЛЬ.K"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("BESSELY", "БЕССЕЛЬ.Y"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("BETA.DIST", "БЕТА.РАСП"), + ("BETA.INV", "БЕТА.ОБР"), + ("BETADIST", "БЕТАРАСП"), + ("BETAINV", "БЕТАОБР"), + ("BIN2DEC", "ДВ.В.ДЕС"), + ("BIN2HEX", "ДВ.В.ШЕСТН"), + ("BIN2OCT", "ДВ.В.ВОСЬМ"), + ("BINOM.DIST", "БИНОМ.РАСП"), + ("BINOM.DIST.RANGE", "БИНОМ.РАСП.ДИАП"), + ("BINOM.INV", "БИНОМ.ОБР"), + ("BINOMDIST", "БИНОМРАСП"), + ("BITAND", "БИТ.И"), + ("BITLSHIFT", "БИТ.СДВИГЛ"), + ("BITOR", "БИТ.ИЛИ"), + ("BITRSHIFT", "БИТ.СДВИГП"), + ("BITXOR", "БИТ.ИСКЛИЛИ"), + ("CEILING", "ОКРВВЕРХ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("CEILING.MATH", "ОКРВВЕРХ.МАТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("CEILING.PRECISE", "ОКРВВЕРХ.ТОЧН"), + ("CELL", "ЯЧЕЙКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("CHAR", "СИМВОЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("CHIDIST", "ХИ2РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("CHIINV", "ХИ2ОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("CHISQ.DIST", "ХИ2.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("CHISQ.DIST.RT", "ХИ2.РАСП.ПХ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("CHISQ.INV", "ХИ2.ОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("CHISQ.INV.RT", "ХИ2.ОБР.ПХ"), + ("CHISQ.TEST", "ХИ2.ТЕСТ"), + ("CHITEST", "ХИ2ТЕСТ"), + ("CHOOSE", "ВЫБОР"), + ("CHOOSECOLS", "ВЫБОРСТОЛБЦ"), + ("CLEAN", "ПЕЧСИМВ"), + ("CODE", "КОДСИМВ"), + ("COLUMN", "СТОЛБЕЦ"), + ("COLUMNS", "ЧИСЛСТОЛБ"), + ("COMBIN", "ЧИСЛКОМБ"), + ("COMBINA", "ЧИСЛКОМБА"), + ("COMPLEX", "КОМПЛЕКСН"), + // reviewed: Title and metadata agree; syntax/examples incorrectly copied from CONCATENATE; common function table corroborates СЦЕП | sources: https://support.microsoft.com/ru-ru/excel/functions/concat-function | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ + ("CONCAT", "СЦЕП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("CONCATENATE", "СЦЕПИТЬ"), + ("CONFIDENCE", "ДОВЕРИТ"), + ("CONFIDENCE.NORM", "ДОВЕРИТ.НОРМ"), + ("CONFIDENCE.T", "ДОВЕРИТ.СТЬЮДЕНТ"), + ("CONVERT", "ПРЕОБР"), + ("CORREL", "КОРРЕЛ"), + ("COUNT", "СЧЁТ"), + ("COUNTA", "СЧЁТЗ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("COUNTBLANK", "СЧИТАТЬПУСТОТЫ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("COUNTIF", "СЧЁТЕСЛИ"), + ("COUNTIFS", "СЧЁТЕСЛИМН"), + ("COUPDAYBS", "ДНЕЙКУПОНДО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("COUPDAYS", "ДНЕЙКУПОН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("COUPDAYSNC", "ДНЕЙКУПОНПОСЛЕ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("COUPNCD", "ДАТАКУПОНПОСЛЕ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("COUPNUM", "ЧИСЛКУПОН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("COUPPCD", "ДАТАКУПОНДО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("COVAR", "КОВАР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("COVARIANCE.P", "КОВАРИАЦИЯ.Г"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("COVARIANCE.S", "КОВАРИАЦИЯ.В"), + ("CRITBINOM", "КРИТБИНОМ"), + ("CUBEKPIMEMBER", "КУБЭЛЕМЕНТКИП"), + ("CUBEMEMBER", "КУБЭЛЕМЕНТ"), + // reviewed: Microsoft title, metadata and examples agree with Functiontranslator; syntax incorrectly says КУБПОРЭЛЕМЕНТ (CUBERANKEDMEMBER) | sources: https://support.microsoft.com/ru-ru/excel/functions/cubememberproperty-function | https://functiontranslator.com/ru/ + ("CUBEMEMBERPROPERTY", "КУБСВОЙСТВОЭЛЕМЕНТА"), + ("CUBERANKEDMEMBER", "КУБПОРЭЛЕМЕНТ"), + ("CUBESET", "КУБМНОЖ"), + ("CUBESETCOUNT", "КУБЧИСЛОЭЛМНОЖ"), + ("CUBEVALUE", "КУБЗНАЧЕНИЕ"), + ("CUMIPMT", "ОБЩПЛАТ"), + ("CUMPRINC", "ОБЩДОХОД"), + ("DATE", "ДАТА"), + ("DATEDIF", "РАЗНДАТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("DATEVALUE", "ДАТАЗНАЧ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DAVERAGE", "ДСРЗНАЧ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("DAY", "ДЕНЬ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("DAYS", "ДНИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DAYS360", "ДНЕЙ360"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DB", "ФУО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DCOUNT", "БСЧЁТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DCOUNTA", "БСЧЁТА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DDB", "ДДОБ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("DEC2BIN", "ДЕС.В.ДВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("DEC2HEX", "ДЕС.В.ШЕСТН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DEC2OCT", "ДЕС.В.ВОСЬМ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DECIMAL", "ДЕС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DEGREES", "ГРАДУСЫ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DELTA", "ДЕЛЬТА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DEVSQ", "КВАДРОТКЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DGET", "БИЗВЛЕЧЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DISC", "СКИДКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DMAX", "ДМАКС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DMIN", "ДМИН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DOLLAR", "РУБЛЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DOLLARDE", "РУБЛЬ.ДЕС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DOLLARFR", "РУБЛЬ.ДРОБЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DPRODUCT", "БДПРОИЗВЕД"), + // reviewed: Microsoft title and meta give the Russian name; the syntax and examples were left untranslated (English name) | sources: https://support.microsoft.com/ru-ru/excel/functions/drop-function + ("DROP", "СБРОСИТЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DSTDEV", "ДСТАНДОТКЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DSTDEVP", "ДСТАНДОТКЛП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DSUM", "БДСУММ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DURATION", "ДЛИТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DVAR", "БДДИСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("DVARP", "БДДИСПП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("EDATE", "ДАТАМЕС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("EFFECT", "ЭФФЕКТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("ENCODEURL", "КОДИР.URL"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("EOMONTH", "КОНМЕСЯЦА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("ERF", "ФОШ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("ERF.PRECISE", "ФОШ.ТОЧН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("ERFC", "ДФОШ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("ERFC.PRECISE", "ДФОШ.ТОЧН"), + ("ERROR.TYPE", "ТИП.ОШИБКИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("EVEN", "ЧЁТН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("EXACT", "СОВПАД"), + ("EXPAND", "РАЗВЕРНУТЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("EXPON.DIST", "ЭКСП.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("EXPONDIST", "ЭКСПРАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("F.DIST", "F.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("F.DIST.RT", "F.РАСП.ПХ"), + ("F.INV", "F.ОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("F.INV.RT", "F.ОБР.ПХ"), + ("F.TEST", "F.ТЕСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("FACT", "ФАКТР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("FACTDOUBLE", "ДВФАКТР"), + ("FALSE", "ЛОЖЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("FDIST", "FРАСП"), + // reviewed: Microsoft calc-error page and independent dynamic-array article show literal ФИЛЬТР formulas | sources: https://support.microsoft.com/ru-ru/excel/how-to-correct-a-calc-error | https://www.planetaexcel.ru/techniques/25/9457/ + ("FILTER", "ФИЛЬТР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("FILTERXML", "ФИЛЬТР.XML"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("FIND", "НАЙТИ"), + // reviewed: Two independent function tables agree (the Microsoft page could not be fetched) | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("FINDB", "НАЙТИБ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("FINV", "FРАСПОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("FISHER", "ФИШЕР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("FISHERINV", "ФИШЕРОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("FIXED", "ФИКСИРОВАННЫЙ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("FLOOR", "ОКРВНИЗ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("FLOOR.MATH", "ОКРВНИЗ.МАТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("FLOOR.PRECISE", "ОКРВНИЗ.ТОЧН"), + ("FORECAST", "ПРЕДСКАЗ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("FORECAST.LINEAR", "ПРЕДСКАЗ.ЛИНЕЙН"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("FORMULATEXT", "Ф.ТЕКСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("FREQUENCY", "ЧАСТОТА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("FTEST", "ФТЕСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("FV", "БС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("FVSCHEDULE", "БЗРАСПИС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GAMMA", "ГАММА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GAMMA.DIST", "ГАММА.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GAMMA.INV", "ГАММА.ОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GAMMADIST", "ГАММАРАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GAMMAINV", "ГАММАОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GAMMALN", "ГАММАНЛОГ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GAMMALN.PRECISE", "ГАММАНЛОГ.ТОЧН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("GAUSS", "ГАУСС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GCD", "НОД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GEOMEAN", "СРГЕОМ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("GESTEP", "ПОРОГ"), + ("GROUPBY", "ГРУПППО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("GROWTH", "РОСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("HARMEAN", "СРГАРМ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("HEX2BIN", "ШЕСТН.В.ДВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("HEX2DEC", "ШЕСТН.В.ДЕС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("HEX2OCT", "ШЕСТН.В.ВОСЬМ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("HLOOKUP", "ГПР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("HOUR", "ЧАС"), + ("HSTACK", "ГСТОЛБИК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("HYPERLINK", "ГИПЕРССЫЛКА"), + ("HYPGEOM.DIST", "ГИПЕРГЕОМ.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("HYPGEOMDIST", "ГИПЕРГЕОМЕТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("IF", "ЕСЛИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("IFERROR", "ЕСЛИОШИБКА"), + // reviewed: Microsoft title, meta and syntax agree, with Excel Academy and the excelworld title; two dictionaries and the excelworld syntax line spell ЕСЛИНД (kept as an alias) | sources: https://support.microsoft.com/ru-ru/excel/functions/ifna-function | https://excel-academy.ru/tools/excel-functions/ | http://www.excelworld.ru/publ/funcs/boolean/ifna/11-1-0-118 + ("IFNA", "ЕСНД"), + // reviewed: Microsoft meta and examples, a worked formula on mister-office and a function table agree; the page title УСЛОВИЯ is a machine translation (kept as an alias) | sources: https://support.microsoft.com/ru-ru/excel/functions/ifs-function (meta, examples) | https://mister-office.com/funktsii-excel/ifs-eslimn.html (=E8*ЕСЛИМН(...)) | https://functiontranslator.com/ru/ + ("IFS", "ЕСЛИМН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMABS", "МНИМ.ABS"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMAGINARY", "МНИМ.ЧАСТЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMARGUMENT", "МНИМ.АРГУМЕНТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMCONJUGATE", "МНИМ.СОПРЯЖ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMCOS", "МНИМ.COS"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMCOSH", "МНИМ.COSH"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMCOT", "МНИМ.COT"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMCSC", "МНИМ.CSC"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMCSCH", "МНИМ.CSCH"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMDIV", "МНИМ.ДЕЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMEXP", "МНИМ.EXP"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMLN", "МНИМ.LN"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMLOG10", "МНИМ.LOG10"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMLOG2", "МНИМ.LOG2"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMPOWER", "МНИМ.СТЕПЕНЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMPRODUCT", "МНИМ.ПРОИЗВЕД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMREAL", "МНИМ.ВЕЩ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMSEC", "МНИМ.SEC"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMSECH", "МНИМ.SECH"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMSIN", "МНИМ.SIN"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMSINH", "МНИМ.SINH"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMSQRT", "МНИМ.КОРЕНЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMSUB", "МНИМ.РАЗН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMSUM", "МНИМ.СУММ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IMTAN", "МНИМ.TAN"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("INDEX", "ИНДЕКС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("INDIRECT", "ДВССЫЛ"), + ("INFO", "ИНФОРМ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("INT", "ЦЕЛОЕ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("INTERCEPT", "ОТРЕЗОК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("INTRATE", "ИНОРМА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IPMT", "ПРПЛТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("IRR", "ВСД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISBLANK", "ЕПУСТО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("ISERR", "ЕОШ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISERROR", "ЕОШИБКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISEVEN", "ЕЧЁТН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("ISFORMULA", "ЕФОРМУЛА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISLOGICAL", "ЕЛОГИЧ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISNA", "ЕНД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISNONTEXT", "ЕНЕТЕКСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISNUMBER", "ЕЧИСЛО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("ISO.CEILING", "ISO.ОКРВВЕРХ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISODD", "ЕНЕЧЁТ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISOWEEKNUM", "НОМНЕДЕЛИ.ISO"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("ISPMT", "ПРОЦПЛАТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("ISREF", "ЕССЫЛКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ISTEXT", "ЕТЕКСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("KURT", "ЭКСЦЕСС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("LARGE", "НАИБОЛЬШИЙ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("LCM", "НОК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("LEFT", "ЛЕВСИМВ"), + // reviewed: Microsoft page names it ("Функция ЛЕВБ является нерекомендуемой"); two function tables agree | sources: https://support.microsoft.com/ru-ru/excel/functions/left-function | https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("LEFTB", "ЛЕВБ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("LEN", "ДЛСТР"), + // reviewed: Microsoft page names it ("Функция ДЛИНБ является нерекомендуемой"); two function tables agree | sources: https://support.microsoft.com/ru-ru/excel/functions/len-function | https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("LENB", "ДЛИНБ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("LINEST", "ЛИНЕЙН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("LOGEST", "ЛГРФПРИБЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("LOGINV", "ЛОГНОРМОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("LOGNORM.DIST", "ЛОГНОРМ.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("LOGNORM.INV", "ЛОГНОРМ.ОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("LOGNORMDIST", "ЛОГНОРМРАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("LOOKUP", "ПРОСМОТР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("LOWER", "СТРОЧН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MATCH", "ПОИСКПОЗ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MAX", "МАКС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MAXA", "МАКСА"), + // reviewed | sources: https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MAXIFS", "МАКСЕСЛИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MDETERM", "МОПРЕД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MDURATION", "МДЛИТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MEDIAN", "МЕДИАНА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MID", "ПСТР"), + // reviewed: Microsoft page names it ("Функция ПСТРБ является нерекомендуемой"); two function tables agree | sources: https://support.microsoft.com/ru-ru/excel/functions/mid-function | https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("MIDB", "ПСТРБ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MIN", "МИН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MINA", "МИНА"), + // reviewed | sources: https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MINIFS", "МИНЕСЛИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MINUTE", "МИНУТЫ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MINVERSE", "МОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MIRR", "МВСД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MMULT", "МУМНОЖ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MOD", "ОСТАТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MODE", "МОДА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MODE.MULT", "МОДА.НСК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MODE.SNGL", "МОДА.ОДН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MONTH", "МЕСЯЦ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("MROUND", "ОКРУГЛТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MULTINOMIAL", "МУЛЬТИНОМ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("MUNIT", "МЕДИН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("N", "Ч"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("NA", "НД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("NEGBINOM.DIST", "ОТРБИНОМ.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("NEGBINOMDIST", "ОТРБИНОМРАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("NETWORKDAYS", "ЧИСТРАБДНИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("NETWORKDAYS.INTL", "ЧИСТРАБДНИ.МЕЖД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NOMINAL", "НОМИНАЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NORM.DIST", "НОРМ.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NORM.INV", "НОРМ.ОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NORM.S.DIST", "НОРМ.СТ.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NORM.S.INV", "НОРМ.СТ.ОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("NORMDIST", "НОРМРАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("NORMINV", "НОРМОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NORMSDIST", "НОРМСТРАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NORMSINV", "НОРМСТОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("NOT", "НЕ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("NOW", "ТДАТА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NPER", "КПЕР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NPV", "ЧПС"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("NUMBERVALUE", "ЧЗНАЧ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("OCT2BIN", "ВОСЬМ.В.ДВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("OCT2DEC", "ВОСЬМ.В.ДЕС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("OCT2HEX", "ВОСЬМ.В.ШЕСТН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ODD", "НЕЧЁТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("OFFSET", "СМЕЩ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("OR", "ИЛИ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PDURATION", "ПДЛИТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PERCENTILE", "ПЕРСЕНТИЛЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PERCENTILE.EXC", "ПРОЦЕНТИЛЬ.ИСКЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PERCENTILE.INC", "ПРОЦЕНТИЛЬ.ВКЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PERCENTRANK", "ПРОЦЕНТРАНГ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PERCENTRANK.EXC", "ПРОЦЕНТРАНГ.ИСКЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PERCENTRANK.INC", "ПРОЦЕНТРАНГ.ВКЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PERMUT", "ПЕРЕСТ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PERMUTATIONA", "ПЕРЕСТА"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PHI", "ФИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PI", "ПИ"), + ("PIVOTBY", "СВОДПО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PMT", "ПЛТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("POISSON", "ПУАССОН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("POISSON.DIST", "ПУАССОН.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("POWER", "СТЕПЕНЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PPMT", "ОСПЛТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PRICE", "ЦЕНА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PRICEDISC", "ЦЕНАСКИДКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PRICEMAT", "ЦЕНАПОГАШ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PROB", "ВЕРОЯТНОСТЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PRODUCT", "ПРОИЗВЕД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("PROPER", "ПРОПНАЧ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("PV", "ПС"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("QUARTILE", "КВАРТИЛЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("QUARTILE.EXC", "КВАРТИЛЬ.ИСКЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("QUARTILE.INC", "КВАРТИЛЬ.ВКЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("QUOTIENT", "ЧАСТНОЕ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("RADIANS", "РАДИАНЫ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("RAND", "СЛЧИС"), + ("RANDARRAY", "СЛУЧМАССИВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("RANDBETWEEN", "СЛУЧМЕЖДУ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("RANK", "РАНГ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("RANK.AVG", "РАНГ.СР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("RANK.EQ", "РАНГ.РВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("RATE", "СТАВКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("RECEIVED", "ПОЛУЧЕНО"), + ("REGEXEXTRACT", "РЕГИЗВЛЕЧЬ"), + ("REGEXREPLACE", "РЕГЗАМЕНИТЬ"), + ("REGEXTEST", "РЕГТЕСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("REPLACE", "ЗАМЕНИТЬ"), + // reviewed: Microsoft page names it ("Функция ЗАМЕНИТЬБ является нерекомендуемой"); two function tables agree | sources: https://support.microsoft.com/ru-ru/excel/functions/replace-function | https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("REPLACEB", "ЗАМЕНИТЬБ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("REPT", "ПОВТОР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("RIGHT", "ПРАВСИМВ"), + // reviewed: Microsoft page names it ("Функция ПРАВБ является нерекомендуемой"); two function tables agree | sources: https://support.microsoft.com/ru-ru/excel/functions/right-function | https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("RIGHTB", "ПРАВБ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ROMAN", "РИМСКОЕ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ROUND", "ОКРУГЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ROUNDDOWN", "ОКРУГЛВНИЗ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ROUNDUP", "ОКРУГЛВВЕРХ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ROW", "СТРОКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("ROWS", "ЧСТРОК"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("RRI", "ЭКВ.СТАВКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("RSQ", "КВПИРСОН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SEARCH", "ПОИСК"), + // reviewed: Microsoft page names it ("Функция ПОИСКБ является нерекомендуемой"); two function tables agree | sources: https://support.microsoft.com/ru-ru/excel/functions/search-function | https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("SEARCHB", "ПОИСКБ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SECOND", "СЕКУНДЫ"), + ("SEQUENCE", "ПОСЛЕДОВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("SERIESSUM", "РЯД.СУММ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SHEET", "ЛИСТ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SHEETS", "ЛИСТЫ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SIGN", "ЗНАК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SKEW", "СКОС"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SKEW.P", "СКОС.Г"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SLN", "АПЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SLOPE", "НАКЛОН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SMALL", "НАИМЕНЬШИЙ"), + // reviewed: Independent article explicitly pairs English and Russian names and shows function syntax | sources: https://www.planetaexcel.ru/techniques/25/9457/ + ("SORT", "СОРТ"), + ("SORTBY", "СОРТПО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SQRT", "КОРЕНЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SQRTPI", "КОРЕНЬПИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("STANDARDIZE", "НОРМАЛИЗАЦИЯ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("STDEV", "СТАНДОТКЛОН"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("STDEV.P", "СТАНДОТКЛОН.Г"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("STDEV.S", "СТАНДОТКЛОН.В"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("STDEVA", "СТАНДОТКЛОНА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("STDEVP", "СТАНДОТКЛОНП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("STDEVPA", "СТАНДОТКЛОНПА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("STEYX", "СТОШYX"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SUBSTITUTE", "ПОДСТАВИТЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SUBTOTAL", "ПРОМЕЖУТОЧНЫЕ.ИТОГИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SUM", "СУММ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SUMIF", "СУММЕСЛИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SUMIFS", "СУММЕСЛИМН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SUMPRODUCT", "СУММПРОИЗВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SUMSQ", "СУММКВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SUMX2MY2", "СУММРАЗНКВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SUMX2PY2", "СУММСУММКВ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SUMXMY2", "СУММКВРАЗН"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("SWITCH", "ПЕРЕКЛЮЧ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("SYD", "АСЧ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("T", "Т"), + // reviewed: Independent detailed syntax and Microsoft syntax distinguish T.DIST from obsolete TDIST; both broad translation tables incorrectly conflate the pair | sources: https://www.formulafind.com/ru/функции/статистические/student-rasp-function | https://support.microsoft.com/ru-ru/excel/functions/t-dist-function + ("T.DIST", "СТЬЮДЕНТ.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("T.DIST.2T", "СТЬЮДЕНТ.РАСП.2Х"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("T.DIST.RT", "СТЬЮДЕНТ.РАСП.ПХ"), + ("T.INV", "СТЬЮДЕНТ.ОБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("T.INV.2T", "СТЬЮДЕНТ.ОБР.2Х"), + ("T.TEST", "СТЬЮДЕНТ.ТЕСТ"), + // reviewed: Microsoft title and meta give the Russian name; the syntax and examples were left untranslated (English name) | sources: https://support.microsoft.com/ru-ru/excel/functions/take-function + ("TAKE", "ВЗЯТЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("TBILLEQ", "РАВНОКЧЕК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("TBILLPRICE", "ЦЕНАКЧЕК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("TBILLYIELD", "ДОХОДКЧЕК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("TDIST", "СТЬЮДРАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("TEXT", "ТЕКСТ"), + ("TEXTAFTER", "ТЕКСТПОСЛЕ"), + ("TEXTBEFORE", "ТЕКСТДО"), + // reviewed | sources: https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("TEXTJOIN", "ОБЪЕДИНИТЬ"), + // reviewed: Microsoft syntax and examples give the Russian name; the title and meta were left untranslated (English name) | sources: https://support.microsoft.com/ru-ru/excel/functions/textsplit-function + ("TEXTSPLIT", "ТЕКСТРАЗД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("TIME", "ВРЕМЯ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("TIMEVALUE", "ВРЕМЗНАЧ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("TINV", "СТЬЮДРАСПОБР"), + ("TOCOL", "ПОСТОЛБЦ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("TODAY", "СЕГОДНЯ"), + ("TOROW", "ПОСТРОК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("TRANSPOSE", "ТРАНСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("TREND", "ТЕНДЕНЦИЯ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("TRIM", "СЖПРОБЕЛЫ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("TRIMMEAN", "УРЕЗСРЕДНЕЕ"), + ("TRUE", "ИСТИНА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("TRUNC", "ОТБР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("TTEST", "ТТЕСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("TYPE", "ТИП"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("UNICHAR", "ЮНИСИМВ"), + // reviewed: Independent article explicitly pairs English and Russian names and shows function syntax | sources: https://www.planetaexcel.ru/techniques/25/9457/ + ("UNIQUE", "УНИК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("UPPER", "ПРОПИСН"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("VALUE", "ЗНАЧЕН"), + // reviewed: Microsoft title, meta, syntax and examples all agree; the function tables only list the English name | sources: https://support.microsoft.com/ru-ru/excel/functions/valuetotext-function + ("VALUETOTEXT", "ЗНАЧЕНИЕВТЕКСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("VAR", "ДИСП"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("VAR.P", "ДИСП.Г"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("VAR.S", "ДИСП.В"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("VARA", "ДИСПА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("VARP", "ДИСПР"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("VARPA", "ДИСПРА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("VDB", "ПУО"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("VLOOKUP", "ВПР"), + ("VSTACK", "ВСТОЛБИК"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("WEBSERVICE", "ВЕБСЛУЖБА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("WEEKDAY", "ДЕНЬНЕД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("WEEKNUM", "НОМНЕДЕЛИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("WEIBULL", "ВЕЙБУЛЛ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("WEIBULL.DIST", "ВЕЙБУЛЛ.РАСП"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("WORKDAY", "РАБДЕНЬ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("WORKDAY.INTL", "РАБДЕНЬ.МЕЖД"), + // reviewed: Microsoft syntax and examples give the Russian name; the title and meta were left untranslated (English name) | sources: https://support.microsoft.com/ru-ru/excel/functions/wrapcols-function + ("WRAPCOLS", "СВЕРНСТОЛБЦ"), + // reviewed: Microsoft syntax and examples give the Russian name; the title and meta were left untranslated (English name) | sources: https://support.microsoft.com/ru-ru/excel/functions/wraprows-function + ("WRAPROWS", "СВЕРНСТРОК"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("XIRR", "ЧИСТВНДОХ"), + ("XLOOKUP", "ПРОСМОТРX"), + // reviewed: Microsoft title, meta, syntax and examples all agree (Latin X, like ПРОСМОТРX); the function tables only list the English name | sources: https://support.microsoft.com/ru-ru/excel/functions/xmatch-function + ("XMATCH", "ПОИСКПОЗX"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("XNPV", "ЧИСТНЗ"), + // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("XOR", "ИСКЛИЛИ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ + ("YEAR", "ГОД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("YEARFRAC", "ДОЛЯГОДА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("YIELD", "ДОХОД"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("YIELDDISC", "ДОХОДСКИДКА"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ + ("YIELDMAT", "ДОХОДПОГАШ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("Z.TEST", "Z.ТЕСТ"), + // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ + ("ZTEST", "ZТЕСТ"), + ], +}; diff --git a/crates/formula/src/lexer.rs b/crates/formula/src/lexer.rs index 4c41d3609..f11f08946 100644 --- a/crates/formula/src/lexer.rs +++ b/crates/formula/src/lexer.rs @@ -160,12 +160,17 @@ pub fn tokenize_locale(src: &str, locale: crate::FormulaLocale) -> Result= t.len() && rest.get(..t.len()).is_some_and(|p| p.eq_ignore_ascii_case(t)) { - found = Some(e); + found = Some((e, t.chars().count())); break; } } - let Some(e) = found else { return Err(LexError { msg: "unknown error literal".into(), pos: start }) }; - let len = e.as_str().chars().count(); + // The language's own spelling (`#NV`, `#Н/Д`); the longer match wins. + if let Some((e, len)) = locale.error_prefix(rest) + && found.is_none_or(|(_, english)| len > english) + { + found = Some((e, len)); + } + let Some((e, len)) = found else { return Err(LexError { msg: "unknown error literal".into(), pos: start }) }; // `#REF!A1` style is not valid; `#REF!` is an error literal. push(&mut out, Tok::Error(e), i + len); i += len; @@ -192,7 +197,8 @@ pub fn tokenize_locale(src: &str, locale: crate::FormulaLocale) -> Result j += 1, } } - let inner = src.get(pos_of(i + 1)..pos_of(j.saturating_sub(1))).unwrap_or("").to_string(); + let inner = src.get(pos_of(i + 1)..pos_of(j.saturating_sub(1))).unwrap_or(""); + let inner = if locale == crate::FormulaLocale::En { inner.to_string() } else { locale.struct_to_canonical(inner) }; push(&mut out, Tok::Struct(inner), j); i = j; } @@ -213,8 +219,11 @@ pub fn tokenize_locale(src: &str, locale: crate::FormulaLocale) -> Result 0 && locale.array_row_separator() == ':'; + let is_row_ref = !rows_by_colon && { let mut k = j; if ch(k) == Some('.') && ch(k + 1) == Some(':') { k += 1; @@ -290,7 +299,10 @@ pub fn tokenize_locale(src: &str, locale: crate::FormulaLocale) -> Result { - if ch(i + 1) == Some('.') && starts_range_end(ch(i + 2)) { + if array_depth > 0 && locale.array_row_separator() == ':' { + push(&mut out, Tok::Semicolon, i + 1); + i += 1; + } else if ch(i + 1) == Some('.') && starts_range_end(ch(i + 2)) { push(&mut out, Tok::Trim(TrimMode::Trailing), i + 2); i += 2; } else { diff --git a/crates/formula/src/parser.rs b/crates/formula/src/parser.rs index 3ea97085e..459af1dc8 100644 --- a/crates/formula/src/parser.rs +++ b/crates/formula/src/parser.rs @@ -27,7 +27,7 @@ pub(crate) fn parse_syntax(src: &str, locale: crate::FormulaLocale) -> Result Ok(e), @@ -67,7 +67,7 @@ struct Parser { toks: Vec, i: usize, depth: usize, - input: bool, + locale: crate::FormulaLocale, } fn word_is_cols(w: &str) -> Option<(u32, bool)> { @@ -384,7 +384,9 @@ impl Parser { }, Tok::Text(s) => Expr::Text(Arc::from(s)), Tok::Bool(b) => Expr::Bool(b), - Tok::Word(w) if self.input => crate::input::boolean_alias(&w) + Tok::Word(w) => self + .locale + .boolean(&w) .map(Expr::Bool) .ok_or_else(|| self.err(format!("array constants may only contain constants, found {}", describe(&Tok::Word(w)))))?, Tok::Error(e) => Expr::Error(e), diff --git a/crates/formula/tests/localized_input.rs b/crates/formula/tests/localized_input.rs new file mode 100644 index 000000000..002a90755 --- /dev/null +++ b/crates/formula/tests/localized_input.rs @@ -0,0 +1,138 @@ +//! German, Brazilian Portuguese, Russian and the full Spanish table: entry and display syntax. +use gridcraft_core::CellError; +use gridcraft_formula::FormulaLocale::{self, De, Es, PtBr, Ru}; +use gridcraft_formula::{parse, parse_input, print, print_input}; + +const LOCALIZED: [FormulaLocale; 4] = [Es, De, PtBr, Ru]; + +fn canonical(src: &str, locale: FormulaLocale) -> String { + print(&parse_input(src, locale, |_| false).unwrap_or_else(|e| panic!("{locale:?} `{src}`: {e}"))) +} + +fn shown(canonical: &str, locale: FormulaLocale) -> String { + print_input(&parse(canonical).unwrap(), locale, |_| false).unwrap() +} + +#[test] +fn each_language_spells_formulas_like_its_excel() { + for (locale, local, english) in [ + (De, "SUMME(A1;2,5)", "SUM(A1,2.5)"), + (De, "WENN(WAHR;SVERWEIS(A2;D:E;2;FALSCH);#NV)", "IF(TRUE,VLOOKUP(A2,D:E,2,FALSE),#N/A)"), + (De, "SUMME({1.2;3,5.4})", "SUM({1,2;3.5,4})"), + (De, "ZÄHLENWENN(Tabelle1[[#Kopfzeilen];[Spalte1]];\">1,5\")", "COUNTIF(Tabelle1[[#Headers],[Spalte1]],\">1,5\")"), + (De, "WENNFEHLER(1/0;#WERT!)", "IFERROR(1/0,#VALUE!)"), + (PtBr, "SE(VERDADEIRO;SOMA(1,5;2);#N/D)", "IF(TRUE,SUM(1.5,2),#N/A)"), + (PtBr, "PROCV(A2;Tabela1[#Tudo];2;FALSO)", "VLOOKUP(A2,Tabela1[#All],2,FALSE)"), + (PtBr, "SOMA({1\\2;3\\4})", "SUM({1,2;3,4})"), + (Ru, "СУММ({1;2:3;4})", "SUM({1,2;3,4})"), + (Ru, "СУММ(Таблица1[[#Итого];[Сумма]])", "SUM(Таблица1[[#Totals],[Сумма]])"), + (Es, "CONTAR.SI.CONJUNTO(A1:A3;\">1\")", "COUNTIFS(A1:A3,\">1\")"), + (Es, "SI.ERROR(1/0;#¡VALOR!)", "IFERROR(1/0,#VALUE!)"), + ] { + assert_eq!(canonical(local, locale), english, "{locale:?} entry"); + assert_eq!(shown(english, locale), local, "{locale:?} display"); + } +} + +#[test] +fn every_language_round_trips_canonical_formulas() { + for formula in [ + "SUM(1.5,-2.25,A1:B2 B2:C3)", + r#"IF(AND(TRUE,NOT(FALSE)),"a,b;c",#DIV/0!)"#, + r#"{1.5,TRUE;#N/A,"x;y"}"#, + "SUM((A1,B1),Sheet2!A:A)", + "Table1[[#This Row],[a]]+SUM(Table1[#Totals])+Table1[[#Headers],[a]:[b]]", + "LET(x,1,LAMBDA(y,x+y)(2))", + "XLOOKUP(1,A:A,B:B,#N/A)+IFNA(#GETTING_DATA,#SPILL!)", + "SUM(1:3)+ROWS($2:$2)", + "CEILING.MATH(2.5)+T.TEST(A1:A3,B1:B3,2,1)", + "BYROW(A1:B2,SUM)+GROUPBY(A1:A3,B1:B3,AVERAGE)", + ] { + let expected = print(&parse(formula).unwrap()); + for locale in FormulaLocale::ALL { + let local = shown(formula, locale); + assert_eq!(canonical(&local, locale), expected, "{locale:?}: {formula} shown as {local}"); + } + } +} + +#[test] +fn english_names_and_any_letter_case_are_accepted() { + assert_eq!(canonical("SUM(1;2)+SUMME(3)", De), "SUM(1,2)+SUM(3)"); + assert_eq!(canonical("zählenwenn(A1:A3;1)", De), "COUNTIF(A1:A3,1)"); + assert_eq!(canonical("сумм(1;2)+#н/д", Ru), "SUM(1,2)+#N/A"); + assert_eq!(canonical("{истина:ложь}", Ru), "{TRUE;FALSE}"); + // A local name that is another function's English name means the local function, as in + // Spanish Excel: DECIMAL is FIXED there, and the base conversion is CONV.DECIMAL. + assert_eq!(canonical("DECIMAL(1,5;1)", Es), "FIXED(1.5,1)"); + assert_eq!(canonical("CONV.DECIMAL(\"FF\";16)", Es), "DECIMAL(\"FF\",16)"); + // English separators are not the language's syntax. + assert!(parse_input("SUMME(1.5;2)", De, |_| false).is_err()); + assert!(parse_input("SUM(1,2)", Ru, |_| false).is_ok_and(|e| print(&e) == "SUM(1.2)")); +} + +#[test] +fn names_shadow_local_function_names_in_any_script() { + assert_eq!(canonical("LET(zählenwenn;LAMBDA(x;x*2);ZÄHLENWENN(3))", De), "LET(zählenwenn,LAMBDA(x,x*2),ZÄHLENWENN(3))"); + let known = |name: &str| name == "СУММ"; + assert_eq!(print(&parse_input("СУММ(1)", Ru, known).unwrap()), "СУММ(1)"); + assert_eq!(print_input(&parse("SUM(1)").unwrap(), Ru, known).unwrap(), "SUM(1)"); +} + +#[test] +fn functions_passed_by_name_are_spelled_in_the_language() { + // GROUPBY(…,SUM) and BYROW(…,SUM) take a worksheet function by name, saved as `_xleta.SUM`. + assert_eq!(canonical("NACHZEILE(A1:B3;SUMME)", De), "BYROW(A1:B3,SUM)"); + assert_eq!(canonical("AGRUPARPOR(A2:A9;B2:B9;soma)", PtBr), "GROUPBY(A2:A9,B2:B9,SUM)"); + assert_eq!(shown("_xlfn.GROUPBY(A2:A9,B2:B9,_xleta.SUM)", PtBr), "AGRUPARPOR(A2:A9;B2:B9;SOMA)"); + // A defined name with the local spelling is still the name. + let known = |name: &str| name == "SUMME"; + assert_eq!(print(&parse_input("NACHZEILE(A1:B3;SUMME)", De, known).unwrap()), "BYROW(A1:B3,SUMME)"); + assert_eq!(print_input(&parse("BYROW(A1:B3,SUM)").unwrap(), De, known).unwrap(), "NACHZEILE(A1:B3;SUM)"); +} + +#[test] +fn language_tables_are_sorted_unique_and_unambiguous() { + for locale in LOCALIZED { + let table = locale.translations(); + assert!(table.len() > 400, "{locale:?}: {} names", table.len()); + assert!(table.windows(2).all(|w| w[0].0 < w[1].0), "{locale:?}: not sorted by canonical name"); + let mut locals: Vec = table.iter().map(|(_, local)| local.to_uppercase()).collect(); + locals.sort(); + let all = locals.len(); + locals.dedup(); + assert_eq!(locals.len(), all, "{locale:?}: two functions share a local name"); + for (en, local) in table { + assert_ne!(en, local, "{locale:?}: {en} is listed though it keeps its English name"); + assert_eq!(locale.function_name(en), *local); + assert_eq!(locale.canonical_name(local), *en); + // The TRUE() and FALSE() functions are spelled like the booleans; nothing else may be. + let upper = local.to_uppercase(); + let boolean = upper == locale.boolean_name(true) || upper == locale.boolean_name(false); + assert_eq!(boolean, matches!(*en, "TRUE" | "FALSE"), "{locale:?}: {en} = {local}"); + } + for e in CellError::ALL { + assert_eq!(canonical(locale.error_name(e), locale), e.as_str(), "{locale:?}"); + } + } +} + +#[test] +fn malformed_localized_input_is_an_error() { + for (locale, bad) in [ + (De, "SUMME({1.}"), + (De, "Tabelle1[[#Kopfzeilen];"), + (De, "#WERT"), + (Ru, "{ИСТИНА:"), + (Ru, "СУММ(1:"), + (PtBr, "SOMA(1,"), + (PtBr, "{SOMA(1)}"), + (Es, "#¡VALOR"), + ] { + assert!(parse_input(bad, locale, |_| false).is_err(), "{locale:?}: {bad}"); + } + for locale in LOCALIZED { + let chain = format!("{}+", locale.boolean_name(true)).repeat(300) + "1"; + assert!(parse_input(&chain, locale, |_| false).is_err(), "{locale:?}"); + } +} diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index fb899c702..d16a9a6bf 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -1753,16 +1753,21 @@ fn insert_function(app: &mut SheetApp, ui: &mut egui::Ui, d: &mut Dialog, confir }); let locale = app.ui.language.formula_locale(); let list = gridcraft_engine::cmd::formulas::function_list(); - let q = d.search.to_ascii_lowercase(); - let hits: Vec<&Json> = list + // Unicode lower case: local names and searches are not ASCII (`zählenwenn`, `сумм`). + let q = d.search.to_lowercase(); + let mut hits: Vec<&Json> = list .iter() .filter(|f| { q.is_empty() - || f["name"].as_str().is_some_and(|n| locale.function_name(n).to_ascii_lowercase().contains(&q)) - || f["description"].as_str().is_some_and(|n| n.to_ascii_lowercase().contains(&q)) + || f["name"].as_str().is_some_and(|n| locale.function_name(n).to_lowercase().contains(&q)) + || f["description"].as_str().is_some_and(|n| n.to_lowercase().contains(&q)) }) - .take(300) .collect(); + if locale != gridcraft_engine::formula::FormulaLocale::En { + // The list is sorted by English name; list it by the name shown. + hits.sort_by_cached_key(|&f| locale.function_name(f["name"].as_str().unwrap_or(""))); + } + hits.truncate(300); egui::ScrollArea::vertical().max_height(260.0).show(ui, |ui| { for (i, f) in hits.iter().enumerate() { let name = locale.function_name(f["name"].as_str().unwrap_or("")); diff --git a/crates/ui-egui/src/editor.rs b/crates/ui-egui/src/editor.rs index 4aada2953..1b57a484a 100644 --- a/crates/ui-egui/src/editor.rs +++ b/crates/ui-egui/src/editor.rs @@ -114,14 +114,18 @@ impl EditState { return; } let before = self.text.get(..self.byte_caret()).unwrap_or(""); - let word: String = - before.chars().rev().take_while(|c| c.is_ascii_alphanumeric() || *c == '.' || *c == '_').collect::().chars().rev().collect(); + let word: String = before.chars().rev().take_while(|c| is_name_char(*c)).collect::().chars().rev().collect(); if word.is_empty() || word.chars().next().is_some_and(|c| c.is_ascii_digit()) { return; } - let u = word.to_ascii_uppercase(); + // Unicode upper case: local function names (`ZÄHLENWENN`, `СУММ`) are not ASCII. + let u = word.to_uppercase(); // Not after a column letter of a reference like A1 (digits follow) – fine either way. - self.autocomplete = names.iter().filter(|n| n.starts_with(&u)).take(12).cloned().collect(); + // Sorted by the name shown, since a local name sits where its English name sorts. + let mut hits: Vec<&String> = names.iter().filter(|n| n.starts_with(&u)).collect(); + hits.sort_unstable(); + hits.dedup(); + self.autocomplete = hits.into_iter().take(12).cloned().collect(); if self.autocomplete.len() == 1 && self.autocomplete[0] == u { self.autocomplete.clear(); } @@ -133,7 +137,7 @@ impl EditState { let Some(name) = self.autocomplete.get(self.ac_index).cloned() else { return false }; let caret_b = self.byte_caret(); let before = self.text.get(..caret_b).unwrap_or(""); - let wlen: usize = before.chars().rev().take_while(|c| c.is_ascii_alphanumeric() || *c == '.' || *c == '_').map(char::len_utf8).sum(); + let wlen: usize = before.chars().rev().take_while(|c| is_name_char(*c)).map(char::len_utf8).sum(); let start = caret_b - wlen; let (Some(a), Some(b)) = (self.text.get(..start), self.text.get(caret_b..)) else { return false }; self.text = format!("{a}{name}({b}"); @@ -170,18 +174,11 @@ impl EditState { '{' | '[' => depth -= 1, '(' => { if depth == 0 { - let name: String = chars[..i] - .iter() - .rev() - .take_while(|c| c.is_ascii_alphanumeric() || **c == '.' || **c == '_') - .collect::() - .chars() - .rev() - .collect(); + let name: String = chars[..i].iter().rev().take_while(|c| is_name_char(**c)).collect::().chars().rev().collect(); if name.is_empty() { return None; } - return Some((name.to_ascii_uppercase(), arg)); + return Some((name.to_uppercase(), arg)); } depth -= 1; } @@ -193,6 +190,11 @@ impl EditState { } } +/// A character of a function name as typed: letters of any script, digits, `.` and `_`. +fn is_name_char(c: char) -> bool { + c.is_alphanumeric() || c == '.' || c == '_' +} + /// References in formula text with their byte spans and colour index (same reference text ⇒ /// same colour), for colouring the editor and outlining ranges on the grid. pub fn formula_refs(text: &str) -> Vec<(usize, usize, RangeRef, Option, usize)> { @@ -321,6 +323,20 @@ mod tests { assert_eq!(e.current_function(), Some(("SUM".into(), 1))); } + #[test] + fn autocomplete_and_hints_take_local_names_in_any_script() { + // Local names arrive in English order (ZÄHLENWENNS is COUNTIFS); the list shows them sorted. + let names: Vec = ["ZÄHLENWENNS", "ZÄHLENWENN", "ZEIT", "СУММ"].iter().map(|s| s.to_string()).collect(); + let mut e = EditState::new(0, CellRef::new(0, 0), "=zähl".into(), true, false); + e.update_autocomplete(&names); + assert_eq!(e.autocomplete, ["ZÄHLENWENN", "ZÄHLENWENNS"]); + assert!(e.accept_autocomplete()); + assert_eq!(e.text, "=ZÄHLENWENN("); + let mut e = EditState::new(0, CellRef::new(0, 0), "=ЕСЛИ(A1>0;сумм(B1;".into(), true, false); + e.locale = gridcraft_engine::formula::FormulaLocale::Ru; + assert_eq!(e.current_function(), Some(("СУММ".into(), 1))); + } + #[test] fn ref_spans() { let r = formula_refs("=A1+B2:C3*a1+Sheet2!D4"); diff --git a/crates/ui-egui/src/formula_locale.rs b/crates/ui-egui/src/formula_locale.rs index 6e833b95d..0490451a7 100644 --- a/crates/ui-egui/src/formula_locale.rs +++ b/crates/ui-egui/src/formula_locale.rs @@ -86,8 +86,8 @@ fn hide_udf_prefix(text: &str, locale: FormulaLocale) -> String { out } -// Descriptions/signatures for the supported Spanish function table; untranslated functions -// retain their English help. Parameter punctuation follows the same locale as entry. +// Descriptions/signatures for common Spanish functions; other functions keep their English help +// under their local name. Parameter punctuation follows the same locale as entry. const SPANISH_HELP: &[(&str, &str, &str)] = &[ ("SUM", "SUMA(número1; [número2]; ...)", "Suma los números."), ("AVERAGE", "PROMEDIO(número1; [número2]; ...)", "Devuelve el promedio de los números."), @@ -108,7 +108,11 @@ pub(crate) fn signature(name: &str, locale: FormulaLocale) -> Option { { return Some((*signature).into()); } - crate::formula_bar::function_signature(canonical).map(|s| s.replace(',', &locale.list_separator().to_string())) + let signature = crate::formula_bar::function_signature(canonical)?.replace(',', &locale.list_separator().to_string()); + Some(match signature.strip_prefix(canonical) { + Some(params) if locale != FormulaLocale::En => format!("{}{params}", locale.function_name(canonical)), + _ => signature, + }) } pub(crate) fn description(name: &str, locale: FormulaLocale) -> Option { diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 061698df9..69e870385 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -108,8 +108,18 @@ impl Language { } } + /// The formula language this interface language enters and shows. Japanese, Chinese and + /// Korean Excel use English function names; Czech, French and Serbian have no function table + /// yet. pub fn formula_locale(self) -> gridcraft_engine::formula::FormulaLocale { - if self == Self::Es { gridcraft_engine::formula::FormulaLocale::Es } else { gridcraft_engine::formula::FormulaLocale::En } + use gridcraft_engine::formula::FormulaLocale; + match self { + Self::Es => FormulaLocale::Es, + Self::De => FormulaLocale::De, + Self::PtBr => FormulaLocale::PtBr, + Self::Ru => FormulaLocale::Ru, + Self::En | Self::Zh | Self::Ja | Self::Ko | Self::Cs | Self::Fr | Self::Sr => FormulaLocale::En, + } } /// Translates an interface label; untranslated labels fall back to English. diff --git a/crates/ui-egui/tests/formula_locale.rs b/crates/ui-egui/tests/formula_locale.rs index 855869377..16ffb837f 100644 --- a/crates/ui-egui/tests/formula_locale.rs +++ b/crates/ui-egui/tests/formula_locale.rs @@ -172,20 +172,40 @@ fn canonical_engine_templates_enter_the_selected_formula_language() { } #[test] -fn portuguese_interface_retains_its_canonical_formula_fallback() { +fn portuguese_interface_enters_and_shows_portuguese_formulas() { let mut app = app(); app.run("app.language.set", json!({"code":"pt-BR"})).unwrap(); assert_eq!(app.ui.language, Language::PtBr); assert_eq!(app.ui.language.tr("Data"), "Dados"); - assert!(enter(&mut app, "=SUM(1.5,2.25)")); + assert!(enter(&mut app, "=SOMA(1,5;2,25)")); + assert_eq!(formula(&app), "SUM(1.5,2.25)"); app.begin_edit(None, true); - assert_eq!(app.editor.as_ref().unwrap().text, "=SUM(1.5,2.25)"); - assert!(!enter(&mut app, "=SUMA(1;2)")); + assert_eq!(app.editor.as_ref().unwrap().text, "=SOMA(1,5;2,25)"); + app.cancel_edit(); + // English separators are not Portuguese syntax. + assert!(!enter(&mut app, "=SUM(1.5,2.25)")); let restored: UiState = serde_json::from_str(&serde_json::to_string(&app.ui).unwrap()).unwrap(); assert_eq!(restored.language, Language::PtBr); assert_eq!(Language::Es.tr("Page Layout|Orientation"), "Orientación"); } +#[test] +fn german_and_russian_interfaces_enter_and_show_their_formulas() { + for (code, local, canonical, value) in [ + ("de", "=WENN(WAHR;SUMME({1.2;3,5.4});#NV)", "IF(TRUE,SUM({1,2;3.5,4}),#N/A)", 10.5), + ("ru", "=ЕСЛИ(ИСТИНА;СУММ({1;2:3;4});#Н/Д)", "IF(TRUE,SUM({1,2;3,4}),#N/A)", 10.0), + ] { + let mut app = app(); + app.run("app.language.set", json!({"code": code})).unwrap(); + assert!(enter(&mut app, local), "{code}"); + assert_eq!(formula(&app), canonical, "{code}"); + assert_eq!(app.session.active().unwrap().wb.active().unwrap().value(CellRef::new(0, 0)), Value::Number(value), "{code}"); + app.begin_edit(None, true); + assert_eq!(app.editor.as_ref().unwrap().text, local, "{code}"); + app.cancel_edit(); + } +} + #[test] fn czech_interface_retains_its_canonical_formula_fallback() { // The Czech table translates interface labels only: formulas keep canonical English names, diff --git a/docs/decisions.md b/docs/decisions.md index 7b0a99a38..c15b4a67f 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -3,13 +3,16 @@ ## Formula localization uses the existing interface preference PR #98 builds on the persisted `UiState.language` introduced by #31 and extended by #104. -Español selects the Spanish function table and list/decimal separators; there is no competing -locale setting. Formula syntax without a supplied translation table falls back to English. -The editor translates to canonical English before engine commands, and translates back only -for display. API, clipboard and XLSX syntax remain stable. Existing names override aliases. - -The revision is based directly on main after #31/#104 and Portuguese interface support (#82) -merged. Those locales retain their existing formula fallback; this change adds only Spanish. +Español, Deutsch, Português (Brasil) and Русский select their function table and separators; +there is no competing locale setting. Formula syntax without a translation table (English, +Japanese, Chinese, Korean, and for now Czech, French and Serbian) stays English. The editor +translates to canonical English before engine commands, and translates back only for display. +API, clipboard and XLSX syntax remain stable. Existing names override aliases. + +Each formula language is data (`crates/formula/src/input/.rs`: names, booleans, +errors, table specifiers, separators) behind one `Dialect` table, so a language is added by a +data file and one `FormulaLocale` variant, without new parsing code. Every entry carries its +source; Microsoft's localized pages are machine-translated, so names need two agreeing signals. ## Preserve array evaluation when exporting formulas (#64) diff --git a/docs/formula-input.md b/docs/formula-input.md index e07132c8d..6e60a151b 100644 --- a/docs/formula-input.md +++ b/docs/formula-input.md @@ -1,34 +1,52 @@ # Formula language -View → Interface language is the existing, persisted language preference. Choose **Español** -for Spanish formula entry and display. On first run the preference follows the system language. -English and the other interface languages currently use the English formula table and separators. +View → Interface language is the existing, persisted language preference, and it also picks the +formula language, as in Excel: function names follow the display language. On first run the +preference follows the system language. -| Spanish | Canonical English | +| Interface language | Formula language | | --- | --- | -| `SUMA` | `SUM` | -| `PROMEDIO` | `AVERAGE` | -| `SI` | `IF` | -| `CONTAR` | `COUNT` | -| `SUMAR.SI` | `SUMIF` | -| `CONTAR.SI` | `COUNTIF` | -| `BUSCARV` | `VLOOKUP` | -| `HOY` | `TODAY` | -| `VERDADERO`, `FALSO` | `TRUE`, `FALSE` (literals or function calls) | - -Names are case-insensitive. Spanish formulas use decimal commas (`1,5`), semicolon arguments -and reference unions, and backslashes between array columns (`{1\2;3\4}`). For example, -`=SI(VERDADERO;SUMA(1,5;2,25);0)` evaluates to 3.75. English mode retains comma arguments, -decimal points and comma array columns; it does not silently translate Spanish aliases. - -The cell editor, formula bar, Show Formulas, autocomplete, the Formula ribbon, Insert Function, and argument hints -use the selected formula language. Common Spanish function help is translated; functions -without a Spanish entry retain their English names/help. General interface labels and errors -fall back to English where Spanish translations are not provided. An edit captures its language -when it starts so switching the preference cannot reinterpret unfinished input. +| Español | Spanish | +| Deutsch | German | +| Português (Brasil) | Brazilian Portuguese | +| Русский | Russian | +| English, 日本語, 中文, 한국어 | English (Japanese, Chinese and Korean Excel use English function names) | +| Čeština, Français | English for now: these languages have no function table yet | + +## What changes per language + +| | English | Spanish | German | Portuguese (Brazil) | Russian | +| --- | --- | --- | --- | --- | --- | +| Example | `SUM`, `IF`, `VLOOKUP` | `SUMA`, `SI`, `BUSCARV` | `SUMME`, `WENN`, `SVERWEIS` | `SOMA`, `SE`, `PROCV` | `СУММ`, `ЕСЛИ`, `ВПР` | +| Function names translated | — | 424 | 403 | 412 | 459 | +| Booleans | `TRUE`, `FALSE` | `VERDADERO`, `FALSO` | `WAHR`, `FALSCH` | `VERDADEIRO`, `FALSO` | `ИСТИНА`, `ЛОЖЬ` | +| Errors (e.g.) | `#VALUE!`, `#N/A` | `#¡VALOR!`, `#N/D` | `#WERT!`, `#NV` | `#VALOR!`, `#N/D` | `#ЗНАЧ!`, `#Н/Д` | +| Arguments and unions | `,` | `;` | `;` | `;` | `;` | +| Decimal separator | `.` | `,` | `,` | `,` | `,` | +| Array columns / rows | `,` / `;` | `\` / `;` | `.` / `;` | `\` / `;` | `;` / `:` | +| Table specifiers (e.g.) | `#Headers`, `#This Row` | `#Encabezados`, `#Esta fila` | `#Kopfzeilen`, `#Diese Zeile` | `#Cabeçalhos`, `#Esta Linha` | `#Заголовки`, `#Эта строка` | + +For example, `=SI(VERDADERO;SUMA(1,5;2,25);0)` (Spanish), `=WENN(WAHR;SUMME({1.2;3,5.4});#NV)` +(German) and `=ЕСЛИ(ИСТИНА;СУММ({1;2:3;4});#Н/Д)` (Russian) are stored as +`IF(TRUE,SUM(1.5,2.25),0)`, `IF(TRUE,SUM({1,2;3.5,4}),#N/A)` and `IF(TRUE,SUM({1,2;3,4}),#N/A)`. + +Names, booleans and errors are case-insensitive in any script (`zählenwenn`, `сумм`). Functions +without a local name keep their English name, and canonical English names, booleans and errors +are also accepted with the language's separators. English mode retains comma arguments, decimal +points and comma array columns; it does not silently translate local names. A function passed by +name (`BYROW(A1:C3;SOMA)`, `GROUPBY(…;SUMME)`) uses the same local name as its call. + +## Where it applies + +The cell editor, formula bar, Show Formulas, autocomplete, the Formula ribbon, Insert Function +(searched and sorted by the local name), and argument hints use the selected formula language. +Common Spanish function help is translated; other help stays English, shown under the local +function name with the language's separators. General interface labels and errors fall back to +English where translations are not provided. An edit captures its language when it starts so +switching the preference cannot reinterpret unfinished input. Workbook/sheet names, table names, LET bindings and LAMBDA parameters take precedence over -aliases. Text, sheet names and table column names are unchanged. When a localized spelling +local names. Text, sheet names and table column names are unchanged. When a localized spelling would collide with a name, displayed formulas retain the canonical spelling to preserve meaning. Stored formulas, XLSX import/export, engine commands, control/API calls, CLI evaluation and @@ -36,3 +54,13 @@ clipboard exchange retain strict English syntax. This also applies to advanced d Name Manager and conditional-format rules. Localization happens at the cell/formula-bar editor boundary, including filling the selected range with Ctrl+Enter; it does not change the workbook format or teach the calculation engine ambiguous aliases. + +## Where the names come from + +Each table lives in `crates/formula/src/input/.rs` with its sources. Function names +come from Microsoft Support's localized Excel function pages, which are machine-translated and +sometimes wrong, so an entry needs two agreeing signals on its page (title, description, syntax +paragraph aligned with the English page, examples); entries marked `reviewed` were decided by +hand against independent function-name references. Booleans, errors and table specifiers cite +their sources per item. The tables have not yet been checked against a running localized Excel +or by native speakers; corrections are one-line edits with a source. diff --git a/docs/function-parity.md b/docs/function-parity.md index 760ffd6ac..76b00688d 100644 --- a/docs/function-parity.md +++ b/docs/function-parity.md @@ -1,6 +1,6 @@ # Function parity: worksheet functions and formulas -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-12 · **Change:** minor (USDOLLAR added as a compatibility function; MIRR, COUNTIF and INDIRECT edge cases match Excel 365) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-13 · **Change:** minor (formulas in es, de, pt-BR and ru) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 Excel's worksheet functions, category by category, against GridCraft's function library. Part of [target-app-parity.md](target-app-parity.md); gaps feed [gaps.md](gaps.md). @@ -82,7 +82,7 @@ PIVOTBY, REGEXTEST…) are all present. | Iterative calculation for circular references | done: with Enable Iterative Calculation on (`formulas.calculationOptions` `{iterative, maxIterations, maxChange}`, saved as ``), loops are evaluated again from their previous values (blank = 0) until no cell on a loop changes by Maximum Change or Maximum Iterations is reached; off, cycles give `#CIRC!`. Differences: no Options dialog yet (command only); GridCraft recalculates on open, so a loop that never settles (`=A1+1`) advances again each time the file is opened | | 15-significant-digit comparison semantics | **missing** (#57: `=0.1+0.2=0.3` is FALSE) | | External workbook references (`[Book.xlsx]Sheet1!A1`) | parsed; links dropped on open, no update | -| Localized function names and `;` separators | **missing** (#45); en-US only | +| Localized function names and `;` separators | partial (#45): Spanish, German, Brazilian Portuguese and Russian at the editor (names, booleans, errors, table specifiers, separators); files stay English ([formula-input.md](formula-input.md)); French, Czech and Serbian formulas stay English | | Error values | the seven classic errors plus `#SPILL!`, `#CALC!`, `#GETTING_DATA` done; `#FIELD!`, `#BLOCKED!`, `#CONNECT!`, `#BUSY!`, `#UNKNOWN!`, `#PYTHON!` missing (minor: they come from data types, cloud and Python features) | ## Depth (estimated) @@ -108,6 +108,7 @@ workbooks; results checked in as data, not Excel files) and fixing what it finds | Date | Change | Summary | |---|---|---| +| 2026-10-13 | minor | Localized function names and `;` separators: partial, formulas follow the interface language in es, de, pt-BR and ru | | 2026-10-12 | minor | USDOLLAR added as a Compatibility function (not on Microsoft's list, so the counts don't change); MIRR with no positive flow is -1, COUNTIF's bare `"<="` / `">="` skip empty strings, INDIRECT with `a1` = FALSE gives `#REF!` for A1-style text (#738) | | 2026-10-11 | minor | TEXT / number formats fixed against Excel-cached results: fraction literals and zero fractions, `0` denominators zero padded, `?` pads the thousands separator, booleans use the text section (226 mismatches → 0 in 352 TEXT cells) | | 2026-10-11 | minor | Iterative calculation: circular references iterate up to Maximum Iterations / Maximum Change when enabled | diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 09197ff6c..6e8948d5e 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-12 · **Change:** minor (Format Cells dialog looks its labels up in the catalog) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-12 · **Change:** minor (formulas in es, de, pt-BR and ru) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 Per-language status against Excel, which ships its UI in dozens of languages (Windows language packs cover 100+), with localized function names, argument separators, number and date formats, @@ -21,10 +21,13 @@ right-to-left sheets and full complex-script support. Part of - **About 2,200 user-visible strings** in all (heuristic source scan: ~1,700 UI and command strings plus ~500 function descriptions), so each shipped language covers **~12%** (measured count / estimated total). -- **en-US only formulas and formats.** Function names, `,` argument separator, `.` decimal - separator, en-US number and date formats (`crates/numfmt` says "en-US only"). Users ask for - localized function names and `;` separators (#45). German with localized numbers and formulas - is in PR #163 (open). +- **Formulas follow the interface language in Spanish, German, Brazilian Portuguese and + Russian** (#45): function names (403–459 per language), booleans, errors, table specifiers and + separators, at the editor boundary only; files and APIs keep canonical English + ([formula-input.md](formula-input.md)). The names come from machine-translated Microsoft pages + (two agreeing signals per entry, sources in `crates/formula/src/input/`) and have no native + review. French, Czech and Serbian formulas stay English. Number and date formats are en-US only + (`crates/numfmt` says "en-US only"); PR #163 (German formulas and numbers) is open. - **Script support.** System-font fallback for CJK, Thai and Hebrew landed in #38 (closes #32; #142 is still open pending confirmation). There is no complex-text shaping: Arabic and Devanagari don't join or reorder, and there is no bidirectional layout. **Sheet Right-to-Left** @@ -67,9 +70,9 @@ language (none so far) and of localized function names. 1. Extend the catalog from the ribbon to every user-visible string (dialogs, menus, task panes, status and error messages, command labels, function descriptions), with a missing-key check in `cargo xtask ci`. Language switching and the system-language default already exist (#31). -2. Locale-aware formulas: localized function-name tables and separators at the formula-bar - boundary only (files keep en-US invariant names), locale number and date formats, list - separators in CSV. +2. Locale-aware formulas: function tables and separators exist for es, de, pt-BR and ru at the + formula-bar boundary (files keep canonical names); still missing: tables for French and the + other languages, locale number and date formats, list separators in CSV. 3. Text shaping and fallback: a shaping engine for grid, editor and PDF text (Arabic, Devanagari, Thai), system font fallback for CJK, bidirectional runs, right-to-left sheet tabs and printing; embedded subset fonts in PDF. @@ -80,6 +83,7 @@ language (none so far) and of localized function names. |---|---|---| | 2026-10-12 | minor | Format Cells looks up its tabs, labels, options and note through `Language::tr` (Fill tab keyed `Format Cells\|Fill`); dialog titles and OK/Cancel too. Labels already in a table (Number, Currency, Fill…) show translated; the rest fall back to English until the tables add them | | 2026-10-12 | minor | Brazilian Portuguese catalog (`i18n/pt.rs`) grows from 377 to 923 entries: every key the other catalogs translate, including the dialog strings #669 starts looking up (~42%) | +| 2026-10-11 | minor | Formulas follow the interface language in es, de, pt-BR and ru (names, booleans, errors, table specifiers, separators); infrastructure item 2 partly done | | 2026-10-11 | minor | German ribbon catalog (`i18n/de.rs`, 266 labels, ~12%); `de` locale tags (de-DE, de-AT, de-CH…) resolve to German. PR #163 (localized German formulas/numbers) still open | | 2026-10-11 | minor | Sheet Right-to-Left mirrors the grid (#146) | | 2026-10-11 | minor | Czech (cs) ribbon table: 266 labels (~12%), menus only | From be5390d39c3ecc2121acf4672d3129c17b8c8a90 Mon Sep 17 00:00:00 2001 From: quantmind-br Date: Tue, 13 Oct 2026 19:55:56 -0300 Subject: [PATCH 2/7] M12: French formula table MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Français selects French formula syntax: 398 local function names from Microsoft's fr-fr function pages (two agreeing signals per entry, 35 reviewed by hand), VRAI/FAUX, French errors and table specifiers, ';' between arguments and array rows, ',' decimals and '.' between array columns. Separators, SOMME, TEXTE, AUJOURDHUI, LIGNES, #VALEUR! and four specifiers were observed in French Excel 2013 (#191). --- README.md | 2 +- ROADMAP.md | 4 +- crates/formula/src/input.rs | 9 +- crates/formula/src/input/fr.rs | 481 ++++++++++++++++++++++++ crates/formula/tests/localized_input.rs | 18 +- crates/ui-egui/src/i18n.rs | 6 +- docs/decisions.md | 6 +- docs/formula-input.md | 29 +- docs/function-parity.md | 6 +- docs/localization-parity.md | 18 +- 10 files changed, 540 insertions(+), 39 deletions(-) create mode 100644 crates/formula/src/input/fr.rs diff --git a/README.md b/README.md index e028acf03..b7de73e27 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ cargo run --release -p gridcraft -- --sample sales --control 7979 # + JSON con cargo xtask ci # fmt, clippy, tests, assets, layering, wasm ``` -Choose Español, Deutsch, Português (Brasil) or Русский under View → Interface language for [local formula names, booleans, errors and separators](docs/formula-input.md). +Choose Español, Deutsch, Português (Brasil), Русский or Français under View → Interface language for [local formula names, booleans, errors and separators](docs/formula-input.md). Workbooks, clipboard exchange, and programmatic APIs retain canonical English syntax. ### Web diff --git a/ROADMAP.md b/ROADMAP.md index 7b8ce5794..517d5baf8 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -94,7 +94,7 @@ and German (266–268 labels each, ~12% of ~2,200 strings; merged 10-10 in #31, added 10-11), the interface follows the system language, and CJK, Thai and Hebrew text falls back to system fonts (#38). Dialogs, menus and messages are English. Formulas follow the interface language in -Spanish, German, Brazilian Portuguese and Russian (function names, booleans, errors, table +Spanish, German, Brazilian Portuguese, Russian and French (function names, booleans, errors, table specifiers and separators at the editor; files keep English: [formula-input.md](docs/formula-input.md)); number formats are en-US only. PR #163 (German formulas and numbers) is open. Detail: [localization-parity.md](docs/localization-parity.md). @@ -135,6 +135,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | Date | What landed | |---|---| +| 2026-10-13 | Formulas in French: 398 local function names, `VRAI`/`FAUX`, French errors and table specifiers, `;` arguments and `.` array columns; separators checked in French Excel 2013 (#191) | | 2026-10-12 | Rows auto-fit oversized fonts: opening a file and whole-row/column formatting grow non-custom rows to their tallest font (#833) | | 2026-10-12 | Number formats: parsing a format code is linear in its length (long runs of `[`, `,` or `/` no longer take quadratic time), and an unclosed `[` is a literal when splitting sections as well as when tokenizing (#810) | | 2026-10-12 | Number formats: a fraction denominator with 65,536 zeros no longer crashes; format codes are capped at 255 characters like Excel (longer codes display as General, `TEXT` gives `#VALUE!`) (#807) | @@ -197,6 +198,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | Date | Change | Summary | |---|---|---| +| 2026-10-13 | minor | Languages: French formula table; progress log row | | 2026-10-12 | minor | Rows auto-fit oversized fonts on open and whole-row/column formatting (#833); progress log row | | 2026-10-12 | minor | Progress log: multi-area row/column delete (#758) | | 2026-10-12 | trivial | Progress log: XLSX chart sheets kept on save (#727) | diff --git a/crates/formula/src/input.rs b/crates/formula/src/input.rs index 20dadbe50..11a83c07a 100644 --- a/crates/formula/src/input.rs +++ b/crates/formula/src/input.rs @@ -11,12 +11,13 @@ use crate::{Expr, ParseError, parser}; mod de; mod es; +mod fr; mod pt; mod ru; /// Formula-entry syntax selected by the interface language. Interface languages without a -/// formula table (Japanese, Chinese and Korean Excel use English names; Czech, French and Serbian -/// have no table yet) use [`FormulaLocale::En`]. +/// formula table (Japanese, Chinese and Korean Excel use English names; Czech and Serbian have no +/// table yet) use [`FormulaLocale::En`]. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub enum FormulaLocale { #[default] @@ -25,6 +26,7 @@ pub enum FormulaLocale { De, PtBr, Ru, + Fr, } /// One formula language's words and separators. @@ -48,7 +50,7 @@ pub(crate) struct Dialect { const TABLE_ITEMS: [&str; 5] = ["#All", "#Data", "#Headers", "#Totals", "#This Row"]; impl FormulaLocale { - pub const ALL: [Self; 5] = [Self::En, Self::Es, Self::De, Self::PtBr, Self::Ru]; + pub const ALL: [Self; 6] = [Self::En, Self::Es, Self::De, Self::PtBr, Self::Ru, Self::Fr]; fn dialect(self) -> Option<&'static Dialect> { match self { @@ -57,6 +59,7 @@ impl FormulaLocale { Self::De => Some(&de::DIALECT), Self::PtBr => Some(&pt::DIALECT), Self::Ru => Some(&ru::DIALECT), + Self::Fr => Some(&fr::DIALECT), } } diff --git a/crates/formula/src/input/fr.rs b/crates/formula/src/input/fr.rs new file mode 100644 index 000000000..ada6081d0 --- /dev/null +++ b/crates/formula/src/input/fr.rs @@ -0,0 +1,481 @@ +//! Français (France): the formula words French Excel shows (function names, booleans, errors, +//! structured-reference specifiers) and its formula separators. +//! +//! Function names come from Microsoft Support's fr-fr Excel function pages (retrieved +//! 2026-10-10; the pages are machine-translated): per page, a vote among the title, the meta +//! description, the syntax paragraph (aligned with the en-US page) and `=NAME(` examples, and an +//! entry needs two agreeing signals. Entries marked `reviewed` were decided by hand from the page +//! evidence and independent function-name references. Functions not listed keep their English name. +//! +//! Observed in French Excel 2013 (https://github.com/storytold/gridcraft/pull/191#issuecomment-6156382053): +//! `SOMME`, `TEXTE`, `AUJOURDHUI`, `LIGNES`, `#VALEUR!`, `;` between arguments and rows, `,` as the +//! decimal separator (`=SOMME({1,2;3,4})` is 4,6), `\` between array columns is a syntax error, and +//! the specifiers `#Tout`, `#Données`, `#En-têtes`, `#Totaux`. +//! +//! Sources for the other words: +//! - bool: https://support.microsoft.com/fr-fr/excel/functions/true-function | https://support.microsoft.com/fr-fr/excel/functions/false-function +//! - table_items: https://support.microsoft.com/fr-fr/excel/using-structured-references-with-excel-tables (item table + examples [[#Tout];...], [#En-têtes], [#Données], [#Totaux], [#Cette ligne]) +//! - errors (except #SPILL!, #CALC!): https://support.microsoft.com/fr-fr/excel/functions/error-type-function (ERROR.TYPE table; #CHARGEMENT_DONNEES is error number 8) | https://www.morpheus-formation.fr/blog/excel/types-erreurs/ +//! - errors.#SPILL!: https://support.microsoft.com/fr-fr/excel/dynamic-array-formulas-and-spilled-array-behavior | https://www.morpheus-formation.fr/blog/excel/erreur-propagation-excel/ | https://ledojo.club/apprendre-excel/lexique/erreur-propagation +//! - errors.#CALC!: https://support.microsoft.com/fr-fr/excel/how-to-correct-a-calc-error | https://www.morpheus-formation.fr/blog/excel/types-erreurs/ +//! - array columns: https://support.microsoft.com/fr-fr/excel/use-array-constants-in-array-formulas (={1.2.3.4;5.6.7.8;9.10.11.12}) + +use super::Dialect; +use gridcraft_core::CellError; + +pub(super) const DIALECT: Dialect = Dialect { + list: ';', + decimal: ',', + array_column: '.', + array_row: ';', + bool_true: "VRAI", + bool_false: "FAUX", + errors: &[ + (CellError::Null, "#NUL!"), + (CellError::Div0, "#DIV/0!"), + (CellError::Value, "#VALEUR!"), + (CellError::Ref, "#REF!"), + (CellError::Name, "#NOM?"), + (CellError::Num, "#NOMBRE!"), + (CellError::NA, "#N/A"), + (CellError::GettingData, "#CHARGEMENT_DONNEES"), + (CellError::Spill, "#PROPAGATION!"), + (CellError::Calc, "#CALC!"), + ], + table_items: ["#Tout", "#Données", "#En-têtes", "#Totaux", "#Cette ligne"], + functions: &[ + ("ACCRINT", "INTERET.ACC"), + ("ACCRINTM", "INTERET.ACC.MAT"), + ("ADDRESS", "ADRESSE"), + ("AGGREGATE", "AGREGAT"), + ("AND", "ET"), + ("ARABIC", "CHIFFRE.ARABE"), + ("AREAS", "ZONES"), + ("ARRAYTOTEXT", "TABLEAU.EN.TEXTE"), + ("AVEDEV", "ECART.MOYEN"), + ("AVERAGE", "MOYENNE"), + ("AVERAGEIF", "MOYENNE.SI"), + ("AVERAGEIFS", "MOYENNE.SI.ENS"), + ("BETA.DIST", "LOI.BETA.N"), + ("BETA.INV", "BETA.INVERSE.N"), + ("BETADIST", "LOI.BETA"), + ("BETAINV", "BETA.INVERSE"), + ("BIN2DEC", "BINDEC"), + ("BIN2HEX", "BINHEX"), + ("BIN2OCT", "BINOCT"), + ("BINOM.DIST", "LOI.BINOMIALE.N"), + ("BINOM.DIST.RANGE", "LOI.BINOMIALE.SERIE"), + ("BINOM.INV", "LOI.BINOMIALE.INVERSE"), + ("BINOMDIST", "LOI.BINOMIALE"), + ("BITAND", "BITET"), + ("BITLSHIFT", "BITDECALG"), + ("BITOR", "BITOU"), + ("BITRSHIFT", "BITDECALD"), + ("BITXOR", "BITOUEXCLUSIF"), + ("CEILING", "PLAFOND"), + ("CEILING.MATH", "PLAFOND.MATH"), + ("CEILING.PRECISE", "PLAFOND.PRECIS"), + ("CELL", "CELLULE"), + ("CHAR", "CAR"), + ("CHIDIST", "LOI.KHIDEUX"), + ("CHIINV", "KHIDEUX.INVERSE"), + ("CHISQ.DIST", "LOI.KHIDEUX.N"), + ("CHISQ.DIST.RT", "LOI.KHIDEUX.DROITE"), + ("CHISQ.INV", "LOI.KHIDEUX.INVERSE"), + ("CHISQ.INV.RT", "LOI.KHIDEUX.INVERSE.DROITE"), + ("CHITEST", "TEST.KHIDEUX"), + ("CHOOSE", "CHOISIR"), + ("CHOOSECOLS", "CHOISIRCOLS"), + ("CHOOSEROWS", "CHOISIRLIGNES"), + ("CLEAN", "EPURAGE"), + ("COLUMN", "COLONNE"), + ("COLUMNS", "COLONNES"), + ("COMPLEX", "COMPLEXE"), + ("CONCATENATE", "CONCATENER"), + ("CONFIDENCE", "INTERVALLE.CONFIANCE"), + ("CONFIDENCE.NORM", "INTERVALLE.CONFIANCE.NORMAL"), + ("CONFIDENCE.T", "INTERVALLE.CONFIANCE.STUDENT"), + ("CORREL", "COEFFICIENT.CORRELATION"), + ("COUNT", "NB"), + ("COUNTA", "NBVAL"), + ("COUNTBLANK", "NB.VIDE"), + ("COUNTIF", "NB.SI"), + ("COUNTIFS", "NB.SI.ENS"), + ("COUPDAYBS", "NB.JOURS.COUPON.PREC"), + ("COUPDAYS", "NB.JOURS.COUPONS"), + ("COUPDAYSNC", "NB.JOURS.COUPON.SUIV"), + ("COUPNCD", "DATE.COUPON.SUIV"), + ("COUPNUM", "NB.COUPONS"), + ("COUPPCD", "DATE.COUPON.PREC"), + ("COVAR", "COVARIANCE"), + ("COVARIANCE.P", "COVARIANCE.PEARSON"), + ("COVARIANCE.S", "COVARIANCE.STANDARD"), + ("CRITBINOM", "CRITERE.LOI.BINOMIALE"), + ("CUBEKPIMEMBER", "MEMBREKPICUBE"), + ("CUBEMEMBER", "MEMBRECUBE"), + ("CUBEMEMBERPROPERTY", "PROPRIETEMEMBRECUBE"), + ("CUBERANKEDMEMBER", "RANGMEMBRECUBE"), + ("CUBESET", "JEUCUBE"), + ("CUBESETCOUNT", "NBJEUCUBE"), + ("CUBEVALUE", "VALEURCUBE"), + ("CUMIPMT", "CUMUL.INTER"), + ("CUMPRINC", "CUMUL.PRINCPER"), + ("DATEVALUE", "DATEVAL"), + ("DAVERAGE", "BDMOYENNE"), + ("DAY", "JOUR"), + ("DAYS", "JOURS"), + ("DAYS360", "JOURS360"), + ("DCOUNT", "BDNB"), + ("DCOUNTA", "BDNBVAL"), + ("DEC2BIN", "DECBIN"), + ("DEC2HEX", "DECHEX"), + ("DEC2OCT", "DECOCT"), + ("DEGREES", "DEGRES"), + ("DEVSQ", "SOMME.CARRES.ECARTS"), + // reviewed: MS page syntax + title BDLIRE (meta/examples keep English DGET); matches ledojo table | sources: https://support.microsoft.com/fr-fr/excel/functions/dget-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("DGET", "BDLIRE"), + ("DISC", "TAUX.ESCOMPTE"), + ("DMAX", "BDMAX"), + ("DMIN", "BDMIN"), + ("DOLLAR", "DEVISE"), + ("DOLLARDE", "PRIX.DEC"), + ("DOLLARFR", "PRIX.FRAC"), + ("DPRODUCT", "BDPRODUIT"), + // reviewed: MS page syntax/examples EXCLURE (title/meta English); ledojo + tutosurexcel agree | sources: https://support.microsoft.com/fr-fr/excel/functions/drop-function | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("DROP", "EXCLURE"), + ("DSTDEV", "BDECARTYPE"), + ("DSTDEVP", "BDECARTYPEP"), + ("DSUM", "BDSOMME"), + ("DURATION", "DUREE"), + ("DVAR", "BDVAR"), + ("DVARP", "BDVARP"), + ("EDATE", "MOIS.DECALER"), + ("EFFECT", "TAUX.EFFECTIF"), + // reviewed: MS page title and meta use URLENCODAGE (body syntax stayed English); ledojo | sources: https://support.microsoft.com/fr-fr/excel/functions/encodeurl-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("ENCODEURL", "URLENCODAGE"), + ("EOMONTH", "FIN.MOIS"), + ("ERF.PRECISE", "ERF.PRECIS"), + ("ERFC.PRECISE", "ERFC.PRECIS"), + ("ERROR.TYPE", "TYPE.ERREUR"), + ("EVEN", "PAIR"), + // reviewed: MS page syntax/examples ETENDRE; ledojo agrees. tutosurexcel says DEVELOPPER (disagrees) | sources: https://support.microsoft.com/fr-fr/excel/functions/expand-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("EXPAND", "ETENDRE"), + ("EXPON.DIST", "LOI.EXPONENTIELLE.N"), + ("EXPONDIST", "LOI.EXPONENTIELLE"), + ("F.DIST", "LOI.F.N"), + ("F.DIST.RT", "LOI.F.DROITE"), + ("F.INV", "INVERSE.LOI.F.N"), + ("F.INV.RT", "INVERSE.LOI.F.DROITE"), + ("FALSE", "FAUX"), + ("FDIST", "LOI.F"), + ("FILTER", "FILTRE"), + ("FILTERXML", "FILTRE.XML"), + // reviewed: FIND page retired; ledojo + tutosurexcel list TROUVE; Microsoft fr SEARCH/FIND pages use TROUVE | sources: https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("FIND", "TROUVE"), + // reviewed: pattern: every B variant on the fr pages is base name + B (GAUCHEB, DROITEB, STXTB, REMPLACERB); no page names TROUVEB literally | sources: https://support.microsoft.com/fr-fr/excel/functions/left-function + ("FINDB", "TROUVEB"), + ("FINV", "INVERSE.LOI.F"), + ("FISHERINV", "FISHER.INVERSE"), + ("FIXED", "CTXT"), + ("FLOOR", "PLANCHER"), + ("FLOOR.MATH", "PLANCHER.MATH"), + ("FLOOR.PRECISE", "PLANCHER.PRECIS"), + ("FORECAST", "PREVISION"), + // reviewed: MS page syntax PREVISION.LINEAIRE (title has accents, Excel stores unaccented); ledojo + tutosurexcel | sources: https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("FORECAST.LINEAR", "PREVISION.LINEAIRE"), + ("FORMULATEXT", "FORMULETEXTE"), + ("FREQUENCY", "FREQUENCE"), + ("FTEST", "TEST.F"), + ("FV", "VC"), + ("FVSCHEDULE", "VC.PAIEMENTS"), + ("GAMMA.DIST", "LOI.GAMMA.N"), + ("GAMMA.INV", "LOI.GAMMA.INVERSE.N"), + ("GAMMADIST", "LOI.GAMMA"), + ("GAMMAINV", "LOI.GAMMA.INVERSE"), + ("GAMMALN", "LNGAMMA"), + ("GAMMALN.PRECISE", "LNGAMMA.PRECIS"), + ("GCD", "PGCD"), + ("GEOMEAN", "MOYENNE.GEOMETRIQUE"), + ("GESTEP", "SUP.SEUIL"), + ("GROUPBY", "GROUPER.PAR"), + ("GROWTH", "CROISSANCE"), + ("HARMEAN", "MOYENNE.HARMONIQUE"), + ("HEX2BIN", "HEXBIN"), + ("HEX2DEC", "HEXDEC"), + ("HEX2OCT", "HEXOCT"), + ("HLOOKUP", "RECHERCHEH"), + ("HOUR", "HEURE"), + ("HSTACK", "ASSEMB.H"), + ("HYPERLINK", "LIEN_HYPERTEXTE"), + ("HYPGEOM.DIST", "LOI.HYPERGEOMETRIQUE.N"), + ("HYPGEOMDIST", "LOI.HYPERGEOMETRIQUE"), + ("IF", "SI"), + ("IFERROR", "SIERREUR"), + ("IFNA", "SI.NON.DISP"), + // reviewed: MS page title SI.CONDITIONS; ledojo + tutosurexcel | sources: https://support.microsoft.com/fr-fr/excel/functions/ifs-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("IFS", "SI.CONDITIONS"), + ("IMABS", "COMPLEXE.MODULE"), + ("IMAGINARY", "COMPLEXE.IMAGINAIRE"), + ("IMARGUMENT", "COMPLEXE.ARGUMENT"), + ("IMCONJUGATE", "COMPLEXE.CONJUGUE"), + ("IMCOS", "COMPLEXE.COS"), + ("IMCOSH", "COMPLEXE.COSH"), + ("IMCOT", "COMPLEXE.COT"), + ("IMCSC", "COMPLEXE.CSC"), + ("IMCSCH", "COMPLEXE.CSCH"), + ("IMDIV", "COMPLEXE.DIV"), + ("IMEXP", "COMPLEXE.EXP"), + ("IMLN", "COMPLEXE.LN"), + ("IMLOG10", "COMPLEXE.LOG10"), + ("IMLOG2", "COMPLEXE.LOG2"), + ("IMPOWER", "COMPLEXE.PUISSANCE"), + ("IMPRODUCT", "COMPLEXE.PRODUIT"), + ("IMREAL", "COMPLEXE.REEL"), + ("IMSEC", "COMPLEXE.SEC"), + ("IMSECH", "COMPLEXE.SECH"), + ("IMSIN", "COMPLEXE.SIN"), + ("IMSINH", "COMPLEXE.SINH"), + ("IMSQRT", "COMPLEXE.RACINE"), + ("IMSUB", "COMPLEXE.DIFFERENCE"), + ("IMSUM", "COMPLEXE.SOMME"), + ("IMTAN", "COMPLEXE.TAN"), + ("INFO", "INFORMATIONS"), + ("INT", "ENT"), + ("INTERCEPT", "ORDONNEE.ORIGINE"), + ("INTRATE", "TAUX.INTERET"), + ("IPMT", "INTPER"), + ("IRR", "TRI"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISBLANK", "ESTVIDE"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISERR", "ESTERR"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISERROR", "ESTERREUR"), + ("ISEVEN", "EST.PAIR"), + ("ISFORMULA", "ESTFORMULE"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISLOGICAL", "ESTLOGIQUE"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISNA", "ESTNA"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISNONTEXT", "ESTNONTEXTE"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISNUMBER", "ESTNUM"), + ("ISO.CEILING", "ISO.PLAFOND"), + // reviewed: page missing/weak; ledojo + MS alphabetical index EST.IMPAIR (tutosurexcel ESTIMPAIR is a typo: ISEVEN page proves EST.PAIR dotted form) | sources: https://ledojo.club/apprendre-excel/formules/francais-anglais | https://support.microsoft.com/fr-fr/office/-b3944572-255d-4efb-bb96-c6d90033e188 + ("ISODD", "EST.IMPAIR"), + ("ISOWEEKNUM", "NO.SEMAINE.ISO"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISREF", "ESTREF"), + // reviewed: IS* page covers all nine functions (examples list ESTVIDE...); ledojo + tutosurexcel + MS alphabetical index agree | sources: https://support.microsoft.com/fr-fr/excel/is-functions | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("ISTEXT", "ESTTEXTE"), + ("KURT", "KURTOSIS"), + ("LARGE", "GRANDE.VALEUR"), + ("LCM", "PPCM"), + ("LEFT", "GAUCHE"), + ("LEFTB", "GAUCHEB"), + ("LEN", "NBCAR"), + // reviewed: pattern NBCAR+B (LEN page text mentions LENB; GAUCHEB/DROITEB/STXTB/REMPLACERB confirmed on pages) | sources: https://support.microsoft.com/fr-fr/excel/functions/len-function + ("LENB", "NBCARB"), + ("LINEST", "DROITEREG"), + ("LOGEST", "LOGREG"), + ("LOGINV", "LOI.LOGNORMALE.INVERSE"), + ("LOGNORM.DIST", "LOI.LOGNORMALE.N"), + ("LOGNORM.INV", "LOI.LOGNORMALE.INVERSE.N"), + ("LOGNORMDIST", "LOI.LOGNORMALE"), + ("LOOKUP", "RECHERCHE"), + ("LOWER", "MINUSCULE"), + ("MATCH", "EQUIV"), + ("MAXIFS", "MAX.SI.ENS"), + ("MDETERM", "DETERMAT"), + ("MDURATION", "DUREE.MODIFIEE"), + ("MEDIAN", "MEDIANE"), + // reviewed: MS page syntax/examples STXT (title/meta English); ledojo + tutosurexcel | sources: https://support.microsoft.com/fr-fr/excel/functions/mid-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("MID", "STXT"), + // reviewed: MS MID page text names STXTB | sources: https://support.microsoft.com/fr-fr/excel/functions/mid-function + ("MIDB", "STXTB"), + ("MINIFS", "MIN.SI.ENS"), + ("MINVERSE", "INVERSEMAT"), + ("MIRR", "TRIM"), + ("MMULT", "PRODUITMAT"), + ("MODE.MULT", "MODE.MULTIPLE"), + ("MODE.SNGL", "MODE.SIMPLE"), + ("MONTH", "MOIS"), + ("MROUND", "ARRONDI.AU.MULTIPLE"), + ("MULTINOMIAL", "MULTINOMIALE"), + ("MUNIT", "MATRICE.UNITAIRE"), + ("NEGBINOM.DIST", "LOI.BINOMIALE.NEG.N"), + ("NEGBINOMDIST", "LOI.BINOMIALE.NEG"), + ("NETWORKDAYS", "NB.JOURS.OUVRES"), + ("NETWORKDAYS.INTL", "NB.JOURS.OUVRES.INTL"), + ("NOMINAL", "TAUX.NOMINAL"), + ("NORM.DIST", "LOI.NORMALE.N"), + ("NORM.INV", "LOI.NORMALE.INVERSE.N"), + ("NORM.S.DIST", "LOI.NORMALE.STANDARD.N"), + ("NORM.S.INV", "LOI.NORMALE.STANDARD.INVERSE.N"), + ("NORMDIST", "LOI.NORMALE"), + ("NORMINV", "LOI.NORMALE.INVERSE"), + ("NORMSDIST", "LOI.NORMALE.STANDARD"), + ("NORMSINV", "LOI.NORMALE.STANDARD.INVERSE"), + // reviewed: MS page title NON; ledojo + tutosurexcel | sources: https://support.microsoft.com/fr-fr/excel/functions/not-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("NOT", "NON"), + ("NOW", "MAINTENANT"), + ("NPER", "NPM"), + ("NPV", "VAN"), + ("NUMBERVALUE", "VALEURNOMBRE"), + ("OCT2BIN", "OCTBIN"), + ("OCT2DEC", "OCTDEC"), + ("OCT2HEX", "OCTHEX"), + ("ODD", "IMPAIR"), + ("OFFSET", "DECALER"), + ("OR", "OU"), + ("PDURATION", "PDUREE"), + ("PERCENTILE", "CENTILE"), + // reviewed: MS page title; ledojo + MS index (vote "EXC" was a split-token artifact) | sources: https://support.microsoft.com/fr-fr/excel/functions/percentile-exc-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("PERCENTILE.EXC", "CENTILE.EXCLURE"), + ("PERCENTILE.INC", "CENTILE.INCLURE"), + ("PERCENTRANK", "RANG.POURCENTAGE"), + ("PERCENTRANK.EXC", "RANG.POURCENTAGE.EXCLURE"), + ("PERCENTRANK.INC", "RANG.POURCENTAGE.INCLURE"), + ("PERMUT", "PERMUTATION"), + // reviewed: MS page title/syntax PHONETIQUE; ledojo (unaccented; Excel names are unaccented except where listed) | sources: https://support.microsoft.com/fr-fr/excel/functions/phonetic-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("PHONETIC", "PHONETIQUE"), + ("PIVOTBY", "PIVOTER.PAR"), + ("PMT", "VPM"), + ("POISSON", "LOI.POISSON"), + ("POISSON.DIST", "LOI.POISSON.N"), + ("POWER", "PUISSANCE"), + ("PPMT", "PRINCPER"), + ("PRICE", "PRIX.TITRE"), + ("PRICEDISC", "VALEUR.ENCAISSEMENT"), + ("PRICEMAT", "PRIX.TITRE.ECHEANCE"), + ("PROB", "PROBABILITE"), + ("PRODUCT", "PRODUIT"), + ("PROPER", "NOMPROPRE"), + ("PV", "VA"), + ("QUARTILE.EXC", "QUARTILE.EXCLURE"), + ("QUARTILE.INC", "QUARTILE.INCLURE"), + ("RAND", "ALEA"), + ("RANDARRAY", "TABLEAU.ALEA"), + ("RANDBETWEEN", "ALEA.ENTRE.BORNES"), + ("RANK", "RANG"), + ("RANK.AVG", "MOYENNE.RANG"), + ("RANK.EQ", "EQUATION.RANG"), + ("RATE", "TAUX"), + ("RECEIVED", "VALEUR.NOMINALE"), + // reviewed: MS fr pages left English; ledojo table + lecfomasque article using =REGEX.EXTRAIRE(...) | sources: https://ledojo.club/apprendre-excel/formules/francais-anglais | https://www.lecfomasque.com/decouvrez-les-fonctions-regex-dans-excel/ + ("REGEXEXTRACT", "REGEX.EXTRAIRE"), + // reviewed: same as REGEXEXTRACT | sources: https://ledojo.club/apprendre-excel/formules/francais-anglais | https://www.lecfomasque.com/decouvrez-les-fonctions-regex-dans-excel/ + ("REGEXREPLACE", "REGEX.REMPLACER"), + // reviewed: same as REGEXEXTRACT | sources: https://ledojo.club/apprendre-excel/formules/francais-anglais | https://www.lecfomasque.com/decouvrez-les-fonctions-regex-dans-excel/ + ("REGEXTEST", "REGEX.TEST"), + ("REPLACE", "REMPLACER"), + ("REPLACEB", "REMPLACERB"), + ("RIGHT", "DROITE"), + ("RIGHTB", "DROITEB"), + ("ROMAN", "ROMAIN"), + ("ROUND", "ARRONDI"), + ("ROUNDDOWN", "ARRONDI.INF"), + ("ROUNDUP", "ARRONDI.SUP"), + ("ROW", "LIGNE"), + ("ROWS", "LIGNES"), + ("RRI", "TAUX.INT.EQUIV"), + ("RSQ", "COEFFICIENT.DETERMINATION"), + ("SEARCH", "CHERCHE"), + // reviewed: pattern CHERCHE+B; the fr SEARCH page text says CHERCHERB which looks like a machine-translation slip | sources: https://support.microsoft.com/fr-fr/excel/functions/search-function + ("SEARCHB", "CHERCHEB"), + ("SECOND", "SECONDE"), + ("SERIESSUM", "SOMME.SERIES"), + ("SHEET", "FEUILLE"), + ("SHEETS", "FEUILLES"), + ("SIGN", "SIGNE"), + ("SKEW", "COEFFICIENT.ASYMETRIE"), + ("SKEW.P", "COEFFICIENT.ASYMETRIE.P"), + ("SLN", "AMORLIN"), + ("SLOPE", "PENTE"), + ("SMALL", "PETITE.VALEUR"), + ("SORT", "TRIER"), + ("SORTBY", "TRIERPAR"), + ("SQRT", "RACINE"), + ("SQRTPI", "RACINE.PI"), + ("STANDARDIZE", "CENTREE.REDUITE"), + ("STDEV", "ECARTYPE"), + ("STDEV.P", "ECARTYPE.PEARSON"), + ("STDEV.S", "ECARTYPE.STANDARD"), + ("STDEVP", "ECARTYPEP"), + ("STEYX", "ERREUR.TYPE.XY"), + ("SUBSTITUTE", "SUBSTITUE"), + ("SUBTOTAL", "SOUS.TOTAL"), + ("SUM", "SOMME"), + ("SUMIF", "SOMME.SI"), + ("SUMIFS", "SOMME.SI.ENS"), + ("SUMPRODUCT", "SOMMEPROD"), + ("SUMSQ", "SOMME.CARRES"), + ("SUMX2MY2", "SOMME.X2MY2"), + ("SUMX2PY2", "SOMME.X2PY2"), + ("SUMXMY2", "SOMME.XMY2"), + ("SWITCH", "SI.MULTIPLE"), + ("T.DIST", "LOI.STUDENT.N"), + ("T.DIST.2T", "LOI.STUDENT.BILATERALE"), + ("T.DIST.RT", "LOI.STUDENT.DROITE"), + ("T.INV", "LOI.STUDENT.INVERSE.N"), + ("T.INV.2T", "LOI.STUDENT.INVERSE.BILATERALE"), + // reviewed: MS page body/index PRENDRE (title English); ledojo + tutosurexcel | sources: https://support.microsoft.com/fr-fr/excel/functions/take-function | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("TAKE", "PRENDRE"), + ("TBILLEQ", "TAUX.ESCOMPTE.R"), + ("TBILLPRICE", "PRIX.BON.TRESOR"), + ("TBILLYIELD", "RENDEMENT.BON.TRESOR"), + ("TDIST", "LOI.STUDENT"), + ("TEXT", "TEXTE"), + ("TEXTAFTER", "TEXTE.APRES"), + ("TEXTBEFORE", "TEXTE.AVANT"), + ("TEXTJOIN", "JOINDRE.TEXTE"), + // reviewed: MS page syntax/examples; ledojo + tutosurexcel | sources: https://support.microsoft.com/fr-fr/excel/functions/textsplit-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("TEXTSPLIT", "FRACTIONNER.TEXTE"), + ("TIME", "TEMPS"), + ("TIMEVALUE", "TEMPSVAL"), + ("TINV", "LOI.STUDENT.INVERSE"), + // reviewed: MS alphabetical index; ledojo + tutosurexcel | sources: https://support.microsoft.com/fr-fr/office/-b3944572-255d-4efb-bb96-c6d90033e188 | https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ + ("TOCOL", "DANSCOL"), + ("TODAY", "AUJOURDHUI"), + ("TOROW", "DANSLIGNE"), + ("TREND", "TENDANCE"), + ("TRIM", "SUPPRESPACE"), + ("TRIMMEAN", "MOYENNE.REDUITE"), + ("TRUE", "VRAI"), + ("TRUNC", "TRONQUE"), + ("TTEST", "TEST.STUDENT"), + ("UNICHAR", "UNICAR"), + ("UPPER", "MAJUSCULE"), + ("VALUE", "CNUM"), + ("VALUETOTEXT", "VALEUR.EN.TEXTE"), + // reviewed: MS VAR.P page syntax VAR.P.N (French Excel names VAR.P .N, like LOI.NORMALE.N) | sources: https://support.microsoft.com/fr-fr/excel/functions/var-p-function + ("VAR.P", "VAR.P.N"), + // reviewed: MS VARP page syntax VAR.P; ledojo VAR.P <-> VARP | sources: https://support.microsoft.com/fr-fr/excel/functions/varp-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("VARP", "VAR.P"), + ("VLOOKUP", "RECHERCHEV"), + ("VSTACK", "ASSEMB.V"), + ("WEBSERVICE", "SERVICEWEB"), + ("WEEKDAY", "JOURSEM"), + ("WEEKNUM", "NO.SEMAINE"), + ("WEIBULL", "LOI.WEIBULL"), + ("WEIBULL.DIST", "LOI.WEIBULL.N"), + ("WORKDAY", "SERIE.JOUR.OUVRE"), + ("WORKDAY.INTL", "SERIE.JOUR.OUVRE.INTL"), + // reviewed: MS page syntax ORGA.COLS; ledojo + tutosurexcel | sources: https://support.microsoft.com/fr-fr/excel/functions/wrapcols-function | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("WRAPCOLS", "ORGA.COLS"), + // reviewed: MS index; ledojo + tutosurexcel | sources: https://support.microsoft.com/fr-fr/office/-b3944572-255d-4efb-bb96-c6d90033e188 | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("WRAPROWS", "ORGA.LIGNES"), + ("XIRR", "TRI.PAIEMENTS"), + ("XLOOKUP", "RECHERCHEX"), + ("XMATCH", "EQUIVX"), + ("XNPV", "VAN.PAIEMENTS"), + ("XOR", "OUX"), + ("YEAR", "ANNEE"), + ("YEARFRAC", "FRACTION.ANNEE"), + ("YIELD", "RENDEMENT.TITRE"), + ("YIELDDISC", "RENDEMENT.SIMPLE"), + ("YIELDMAT", "RENDEMENT.TITRE.ECHEANCE"), + ("ZTEST", "TEST.Z"), + ], +}; diff --git a/crates/formula/tests/localized_input.rs b/crates/formula/tests/localized_input.rs index 002a90755..27e542518 100644 --- a/crates/formula/tests/localized_input.rs +++ b/crates/formula/tests/localized_input.rs @@ -1,9 +1,10 @@ -//! German, Brazilian Portuguese, Russian and the full Spanish table: entry and display syntax. +//! German, Brazilian Portuguese, Russian, French and the full Spanish table: entry and display +//! syntax. use gridcraft_core::CellError; -use gridcraft_formula::FormulaLocale::{self, De, Es, PtBr, Ru}; +use gridcraft_formula::FormulaLocale::{self, De, Es, Fr, PtBr, Ru}; use gridcraft_formula::{parse, parse_input, print, print_input}; -const LOCALIZED: [FormulaLocale; 4] = [Es, De, PtBr, Ru]; +const LOCALIZED: [FormulaLocale; 5] = [Es, De, PtBr, Ru, Fr]; fn canonical(src: &str, locale: FormulaLocale) -> String { print(&parse_input(src, locale, |_| false).unwrap_or_else(|e| panic!("{locale:?} `{src}`: {e}"))) @@ -28,6 +29,12 @@ fn each_language_spells_formulas_like_its_excel() { (Ru, "СУММ(Таблица1[[#Итого];[Сумма]])", "SUM(Таблица1[[#Totals],[Сумма]])"), (Es, "CONTAR.SI.CONJUNTO(A1:A3;\">1\")", "COUNTIFS(A1:A3,\">1\")"), (Es, "SI.ERROR(1/0;#¡VALOR!)", "IFERROR(1/0,#VALUE!)"), + // Observed in French Excel 2013 (#191): decimal commas, `;` between arguments and rows. + (Fr, "SOMME(1,5;2)+SOMME({1,2;3,4})", "SUM(1.5,2)+SUM({1.2;3.4})"), + (Fr, "TEXTE(AUJOURDHUI();\"jj/mm/aaaa\")", "TEXT(TODAY(),\"jj/mm/aaaa\")"), + (Fr, "LIGNES(Tableau1[#Tout])-LIGNES(Tableau1[[#En-têtes];[Nom]])", "ROWS(Tableau1[#All])-ROWS(Tableau1[[#Headers],[Nom]])"), + (Fr, "SI(VRAI;RECHERCHEV(A2;D:E;2;FAUX);#N/A)", "IF(TRUE,VLOOKUP(A2,D:E,2,FALSE),#N/A)"), + (Fr, "SOMME({1.2;3,5.4})+SIERREUR(1/0;#VALEUR!)", "SUM({1,2;3.5,4})+IFERROR(1/0,#VALUE!)"), ] { assert_eq!(canonical(local, locale), english, "{locale:?} entry"); assert_eq!(shown(english, locale), local, "{locale:?} display"); @@ -66,6 +73,9 @@ fn english_names_and_any_letter_case_are_accepted() { // Spanish Excel: DECIMAL is FIXED there, and the base conversion is CONV.DECIMAL. assert_eq!(canonical("DECIMAL(1,5;1)", Es), "FIXED(1.5,1)"); assert_eq!(canonical("CONV.DECIMAL(\"FF\";16)", Es), "DECIMAL(\"FF\",16)"); + // French TRIM is MIRR, and the English TRIM is SUPPRESPACE. + assert_eq!(canonical("TRIM(A1:A3;0,1;0,1)&SUPPRESPACE(B1)", Fr), "MIRR(A1:A3,0.1,0.1)&TRIM(B1)"); + assert_eq!(shown("TRIM(MIRR(A1:A3,0.1,0.1))", Fr), "SUPPRESPACE(TRIM(A1:A3;0,1;0,1))"); // English separators are not the language's syntax. assert!(parse_input("SUMME(1.5;2)", De, |_| false).is_err()); assert!(parse_input("SUM(1,2)", Ru, |_| false).is_ok_and(|e| print(&e) == "SUM(1.2)")); @@ -95,7 +105,7 @@ fn functions_passed_by_name_are_spelled_in_the_language() { fn language_tables_are_sorted_unique_and_unambiguous() { for locale in LOCALIZED { let table = locale.translations(); - assert!(table.len() > 400, "{locale:?}: {} names", table.len()); + assert!(table.len() > 350, "{locale:?}: {} names", table.len()); assert!(table.windows(2).all(|w| w[0].0 < w[1].0), "{locale:?}: not sorted by canonical name"); let mut locals: Vec = table.iter().map(|(_, local)| local.to_uppercase()).collect(); locals.sort(); diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 69e870385..714a10bf4 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -109,8 +109,7 @@ impl Language { } /// The formula language this interface language enters and shows. Japanese, Chinese and - /// Korean Excel use English function names; Czech, French and Serbian have no function table - /// yet. + /// Korean Excel use English function names; Czech and Serbian have no function table yet. pub fn formula_locale(self) -> gridcraft_engine::formula::FormulaLocale { use gridcraft_engine::formula::FormulaLocale; match self { @@ -118,7 +117,8 @@ impl Language { Self::De => FormulaLocale::De, Self::PtBr => FormulaLocale::PtBr, Self::Ru => FormulaLocale::Ru, - Self::En | Self::Zh | Self::Ja | Self::Ko | Self::Cs | Self::Fr | Self::Sr => FormulaLocale::En, + Self::Fr => FormulaLocale::Fr, + Self::En | Self::Zh | Self::Ja | Self::Ko | Self::Cs | Self::Sr => FormulaLocale::En, } } diff --git a/docs/decisions.md b/docs/decisions.md index c15b4a67f..a9789101f 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -3,9 +3,9 @@ ## Formula localization uses the existing interface preference PR #98 builds on the persisted `UiState.language` introduced by #31 and extended by #104. -Español, Deutsch, Português (Brasil) and Русский select their function table and separators; -there is no competing locale setting. Formula syntax without a translation table (English, -Japanese, Chinese, Korean, and for now Czech, French and Serbian) stays English. The editor +Español, Deutsch, Português (Brasil), Русский and Français select their function table and +separators; there is no competing locale setting. Formula syntax without a translation table +(English, Japanese, Chinese, Korean, and for now Czech and Serbian) stays English. The editor translates to canonical English before engine commands, and translates back only for display. API, clipboard and XLSX syntax remain stable. Existing names override aliases. diff --git a/docs/formula-input.md b/docs/formula-input.md index 6e60a151b..e15d13369 100644 --- a/docs/formula-input.md +++ b/docs/formula-input.md @@ -10,21 +10,22 @@ preference follows the system language. | Deutsch | German | | Português (Brasil) | Brazilian Portuguese | | Русский | Russian | +| Français | French | | English, 日本語, 中文, 한국어 | English (Japanese, Chinese and Korean Excel use English function names) | -| Čeština, Français | English for now: these languages have no function table yet | +| Čeština | English for now: Czech has no function table yet | ## What changes per language -| | English | Spanish | German | Portuguese (Brazil) | Russian | -| --- | --- | --- | --- | --- | --- | -| Example | `SUM`, `IF`, `VLOOKUP` | `SUMA`, `SI`, `BUSCARV` | `SUMME`, `WENN`, `SVERWEIS` | `SOMA`, `SE`, `PROCV` | `СУММ`, `ЕСЛИ`, `ВПР` | -| Function names translated | — | 424 | 403 | 412 | 459 | -| Booleans | `TRUE`, `FALSE` | `VERDADERO`, `FALSO` | `WAHR`, `FALSCH` | `VERDADEIRO`, `FALSO` | `ИСТИНА`, `ЛОЖЬ` | -| Errors (e.g.) | `#VALUE!`, `#N/A` | `#¡VALOR!`, `#N/D` | `#WERT!`, `#NV` | `#VALOR!`, `#N/D` | `#ЗНАЧ!`, `#Н/Д` | -| Arguments and unions | `,` | `;` | `;` | `;` | `;` | -| Decimal separator | `.` | `,` | `,` | `,` | `,` | -| Array columns / rows | `,` / `;` | `\` / `;` | `.` / `;` | `\` / `;` | `;` / `:` | -| Table specifiers (e.g.) | `#Headers`, `#This Row` | `#Encabezados`, `#Esta fila` | `#Kopfzeilen`, `#Diese Zeile` | `#Cabeçalhos`, `#Esta Linha` | `#Заголовки`, `#Эта строка` | +| | English | Spanish | German | Portuguese (Brazil) | Russian | French | +| --- | --- | --- | --- | --- | --- | --- | +| Example | `SUM`, `IF`, `VLOOKUP` | `SUMA`, `SI`, `BUSCARV` | `SUMME`, `WENN`, `SVERWEIS` | `SOMA`, `SE`, `PROCV` | `СУММ`, `ЕСЛИ`, `ВПР` | `SOMME`, `SI`, `RECHERCHEV` | +| Function names translated | — | 424 | 403 | 412 | 459 | 398 | +| Booleans | `TRUE`, `FALSE` | `VERDADERO`, `FALSO` | `WAHR`, `FALSCH` | `VERDADEIRO`, `FALSO` | `ИСТИНА`, `ЛОЖЬ` | `VRAI`, `FAUX` | +| Errors (e.g.) | `#VALUE!`, `#N/A` | `#¡VALOR!`, `#N/D` | `#WERT!`, `#NV` | `#VALOR!`, `#N/D` | `#ЗНАЧ!`, `#Н/Д` | `#VALEUR!`, `#N/A` | +| Arguments and unions | `,` | `;` | `;` | `;` | `;` | `;` | +| Decimal separator | `.` | `,` | `,` | `,` | `,` | `,` | +| Array columns / rows | `,` / `;` | `\` / `;` | `.` / `;` | `\` / `;` | `;` / `:` | `.` / `;` | +| Table specifiers (e.g.) | `#Headers`, `#This Row` | `#Encabezados`, `#Esta fila` | `#Kopfzeilen`, `#Diese Zeile` | `#Cabeçalhos`, `#Esta Linha` | `#Заголовки`, `#Эта строка` | `#En-têtes`, `#Cette ligne` | For example, `=SI(VERDADERO;SUMA(1,5;2,25);0)` (Spanish), `=WENN(WAHR;SUMME({1.2;3,5.4});#NV)` (German) and `=ЕСЛИ(ИСТИНА;СУММ({1;2:3;4});#Н/Д)` (Russian) are stored as @@ -62,5 +63,7 @@ come from Microsoft Support's localized Excel function pages, which are machine- sometimes wrong, so an entry needs two agreeing signals on its page (title, description, syntax paragraph aligned with the English page, examples); entries marked `reviewed` were decided by hand against independent function-name references. Booleans, errors and table specifiers cite -their sources per item. The tables have not yet been checked against a running localized Excel -or by native speakers; corrections are one-line edits with a source. +their sources per item. French separators, `SOMME`, `TEXTE`, `AUJOURDHUI`, `LIGNES`, `#VALEUR!` +and four table specifiers were checked in French Excel 2013 by a French user (#191); the other +tables have not yet been checked against a running localized Excel or by native speakers; +corrections are one-line edits with a source. diff --git a/docs/function-parity.md b/docs/function-parity.md index 76b00688d..46f469abf 100644 --- a/docs/function-parity.md +++ b/docs/function-parity.md @@ -1,6 +1,6 @@ # Function parity: worksheet functions and formulas -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-13 · **Change:** minor (formulas in es, de, pt-BR and ru) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-13 · **Change:** minor (formulas in es, de, pt-BR, ru and fr) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 Excel's worksheet functions, category by category, against GridCraft's function library. Part of [target-app-parity.md](target-app-parity.md); gaps feed [gaps.md](gaps.md). @@ -82,7 +82,7 @@ PIVOTBY, REGEXTEST…) are all present. | Iterative calculation for circular references | done: with Enable Iterative Calculation on (`formulas.calculationOptions` `{iterative, maxIterations, maxChange}`, saved as ``), loops are evaluated again from their previous values (blank = 0) until no cell on a loop changes by Maximum Change or Maximum Iterations is reached; off, cycles give `#CIRC!`. Differences: no Options dialog yet (command only); GridCraft recalculates on open, so a loop that never settles (`=A1+1`) advances again each time the file is opened | | 15-significant-digit comparison semantics | **missing** (#57: `=0.1+0.2=0.3` is FALSE) | | External workbook references (`[Book.xlsx]Sheet1!A1`) | parsed; links dropped on open, no update | -| Localized function names and `;` separators | partial (#45): Spanish, German, Brazilian Portuguese and Russian at the editor (names, booleans, errors, table specifiers, separators); files stay English ([formula-input.md](formula-input.md)); French, Czech and Serbian formulas stay English | +| Localized function names and `;` separators | partial (#45): Spanish, German, Brazilian Portuguese, Russian and French at the editor (names, booleans, errors, table specifiers, separators); files stay English ([formula-input.md](formula-input.md)); Czech and Serbian formulas stay English | | Error values | the seven classic errors plus `#SPILL!`, `#CALC!`, `#GETTING_DATA` done; `#FIELD!`, `#BLOCKED!`, `#CONNECT!`, `#BUSY!`, `#UNKNOWN!`, `#PYTHON!` missing (minor: they come from data types, cloud and Python features) | ## Depth (estimated) @@ -108,7 +108,7 @@ workbooks; results checked in as data, not Excel files) and fixing what it finds | Date | Change | Summary | |---|---|---| -| 2026-10-13 | minor | Localized function names and `;` separators: partial, formulas follow the interface language in es, de, pt-BR and ru | +| 2026-10-13 | minor | Localized function names and `;` separators: partial, formulas follow the interface language in es, de, pt-BR, ru and fr | | 2026-10-12 | minor | USDOLLAR added as a Compatibility function (not on Microsoft's list, so the counts don't change); MIRR with no positive flow is -1, COUNTIF's bare `"<="` / `">="` skip empty strings, INDIRECT with `a1` = FALSE gives `#REF!` for A1-style text (#738) | | 2026-10-11 | minor | TEXT / number formats fixed against Excel-cached results: fraction literals and zero fractions, `0` denominators zero padded, `?` pads the thousands separator, booleans use the text section (226 mismatches → 0 in 352 TEXT cells) | | 2026-10-11 | minor | Iterative calculation: circular references iterate up to Maximum Iterations / Maximum Change when enabled | diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 6e8948d5e..f72d40338 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-12 · **Change:** minor (formulas in es, de, pt-BR and ru) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (formulas in es, de, pt-BR, ru and fr) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 Per-language status against Excel, which ships its UI in dozens of languages (Windows language packs cover 100+), with localized function names, argument separators, number and date formats, @@ -21,12 +21,13 @@ right-to-left sheets and full complex-script support. Part of - **About 2,200 user-visible strings** in all (heuristic source scan: ~1,700 UI and command strings plus ~500 function descriptions), so each shipped language covers **~12%** (measured count / estimated total). -- **Formulas follow the interface language in Spanish, German, Brazilian Portuguese and - Russian** (#45): function names (403–459 per language), booleans, errors, table specifiers and - separators, at the editor boundary only; files and APIs keep canonical English +- **Formulas follow the interface language in Spanish, German, Brazilian Portuguese, Russian + and French** (#45): function names (398–459 per language), booleans, errors, table specifiers + and separators, at the editor boundary only; files and APIs keep canonical English ([formula-input.md](formula-input.md)). The names come from machine-translated Microsoft pages - (two agreeing signals per entry, sources in `crates/formula/src/input/`) and have no native - review. French, Czech and Serbian formulas stay English. Number and date formats are en-US only + (two agreeing signals per entry, sources in `crates/formula/src/input/`); only the French + separators and a few French words were checked in a running Excel (#191). Czech and Serbian + formulas stay English. Number and date formats are en-US only (`crates/numfmt` says "en-US only"); PR #163 (German formulas and numbers) is open. - **Script support.** System-font fallback for CJK, Thai and Hebrew landed in #38 (closes #32; #142 is still open pending confirmation). There is no complex-text shaping: Arabic and @@ -70,8 +71,8 @@ language (none so far) and of localized function names. 1. Extend the catalog from the ribbon to every user-visible string (dialogs, menus, task panes, status and error messages, command labels, function descriptions), with a missing-key check in `cargo xtask ci`. Language switching and the system-language default already exist (#31). -2. Locale-aware formulas: function tables and separators exist for es, de, pt-BR and ru at the - formula-bar boundary (files keep canonical names); still missing: tables for French and the +2. Locale-aware formulas: function tables and separators exist for es, de, pt-BR, ru and fr at + the formula-bar boundary (files keep canonical names); still missing: tables for Czech and the other languages, locale number and date formats, list separators in CSV. 3. Text shaping and fallback: a shaping engine for grid, editor and PDF text (Arabic, Devanagari, Thai), system font fallback for CJK, bidirectional runs, right-to-left sheet tabs and printing; @@ -81,6 +82,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| +| 2026-10-13 | minor | French formula table: 398 local function names, `VRAI`/`FAUX`, French errors and table specifiers, `.` between array columns; separators and a few words checked in French Excel 2013 (#191) | | 2026-10-12 | minor | Format Cells looks up its tabs, labels, options and note through `Language::tr` (Fill tab keyed `Format Cells\|Fill`); dialog titles and OK/Cancel too. Labels already in a table (Number, Currency, Fill…) show translated; the rest fall back to English until the tables add them | | 2026-10-12 | minor | Brazilian Portuguese catalog (`i18n/pt.rs`) grows from 377 to 923 entries: every key the other catalogs translate, including the dialog strings #669 starts looking up (~42%) | | 2026-10-11 | minor | Formulas follow the interface language in es, de, pt-BR and ru (names, booleans, errors, table specifiers, separators); infrastructure item 2 partly done | From d6da75727c941e40191c9d63a002122739f2df18 Mon Sep 17 00:00:00 2001 From: quantmind-br Date: Tue, 13 Oct 2026 21:55:39 -0300 Subject: [PATCH 3/7] M12: French B-function names and later functions French Excel 2024 gives #NOM? for NBCARB, CHERCHEB and TROUVEB, the names that were inferred from the base name + B pattern (#191). The French names are LENB (unchanged), CHERCHERB and TROUVERB, as in Microsoft's French text-function reference, perfectxl and auditexcel. Adds the functions added after the table was collected: the four ODD* bond functions (PRIX/REND.PCOUPON/DCOUPON.IRREG) and the four PREVISION.ETS* functions, each from the Microsoft fr-fr page and ledojo. PERCENTOF and TRIMRANGE keep English: the two sources disagree. --- ROADMAP.md | 2 +- crates/formula/src/input/fr.rs | 24 ++++++++++++++++++------ crates/formula/tests/localized_input.rs | 2 ++ docs/formula-input.md | 7 ++++--- docs/localization-parity.md | 4 ++-- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 517d5baf8..e85fb0618 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -135,7 +135,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | Date | What landed | |---|---| -| 2026-10-13 | Formulas in French: 398 local function names, `VRAI`/`FAUX`, French errors and table specifiers, `;` arguments and `.` array columns; separators checked in French Excel 2013 (#191) | +| 2026-10-13 | Formulas in French: 405 local function names, `VRAI`/`FAUX`, French errors and table specifiers, `;` arguments and `.` array columns; separators and some names checked in French Excel 2013 and 2024 (#191) | | 2026-10-12 | Rows auto-fit oversized fonts: opening a file and whole-row/column formatting grow non-custom rows to their tallest font (#833) | | 2026-10-12 | Number formats: parsing a format code is linear in its length (long runs of `[`, `,` or `/` no longer take quadratic time), and an unclosed `[` is a literal when splitting sections as well as when tokenizing (#810) | | 2026-10-12 | Number formats: a fraction denominator with 65,536 zeros no longer crashes; format codes are capped at 255 characters like Excel (longer codes display as General, `TEXT` gives `#VALUE!`) (#807) | diff --git a/crates/formula/src/input/fr.rs b/crates/formula/src/input/fr.rs index ada6081d0..6e692e350 100644 --- a/crates/formula/src/input/fr.rs +++ b/crates/formula/src/input/fr.rs @@ -12,6 +12,11 @@ //! decimal separator (`=SOMME({1,2;3,4})` is 4,6), `\` between array columns is a syntax error, and //! the specifiers `#Tout`, `#Données`, `#En-têtes`, `#Totaux`. //! +//! Checked in French Excel 2024 (https://github.com/storytold/gridcraft/pull/191#issuecomment-6158296916): +//! `TROUVE`, `STXT`, `STXTB`, `NBCAR`, `ESTNUM`, `EST.IMPAIR`, `ESTREF`, `ESTTEXTE`, +//! `FRACTIONNER.TEXTE`, `VAR.P.N`, `VAR.P`, `PHONETIQUE` and `SI.CONDITIONS` exist; `NBCARB`, +//! `CHERCHEB` and `TROUVEB` give `#NOM?` (the names below are `LENB`, `CHERCHERB`, `TROUVERB`). +//! //! Sources for the other words: //! - bool: https://support.microsoft.com/fr-fr/excel/functions/true-function | https://support.microsoft.com/fr-fr/excel/functions/false-function //! - table_items: https://support.microsoft.com/fr-fr/excel/using-structured-references-with-excel-tables (item table + examples [[#Tout];...], [#En-têtes], [#Données], [#Totaux], [#Cette ligne]) @@ -172,8 +177,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("FILTERXML", "FILTRE.XML"), // reviewed: FIND page retired; ledojo + tutosurexcel list TROUVE; Microsoft fr SEARCH/FIND pages use TROUVE | sources: https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ ("FIND", "TROUVE"), - // reviewed: pattern: every B variant on the fr pages is base name + B (GAUCHEB, DROITEB, STXTB, REMPLACERB); no page names TROUVEB literally | sources: https://support.microsoft.com/fr-fr/excel/functions/left-function - ("FINDB", "TROUVEB"), + // reviewed: TROUVEB is #NOM? in French Excel 2024 (#191) | sources: https://support.microsoft.com/fr-fr/excel/text-functions-reference ("TROUVE, TROUVERB") | https://www.perfectxl.com/academy/functions/translations/english-french/ | https://www.auditexcel.co.za/blog/excel-functions-french/ + ("FINDB", "TROUVERB"), ("FINV", "INVERSE.LOI.F"), ("FISHERINV", "FISHER.INVERSE"), ("FIXED", "CTXT"), @@ -181,6 +186,11 @@ pub(super) const DIALECT: Dialect = Dialect { ("FLOOR.MATH", "PLANCHER.MATH"), ("FLOOR.PRECISE", "PLANCHER.PRECIS"), ("FORECAST", "PREVISION"), + ("FORECAST.ETS", "PREVISION.ETS"), + ("FORECAST.ETS.CONFINT", "PREVISION.ETS.CONFINT"), + // reviewed: the fr reference page lists the four PREVISION.ETS* functions; ledojo pairs this one with FORECAST.ETS.SEASONALITY | sources: https://support.microsoft.com/fr-fr/excel/forecasting-functions-reference | https://ledojo.club/apprendre-excel/formules/francais-anglais + ("FORECAST.ETS.SEASONALITY", "PREVISION.ETS.CARACTERESAISONNIER"), + ("FORECAST.ETS.STAT", "PREVISION.ETS.STAT"), // reviewed: MS page syntax PREVISION.LINEAIRE (title has accents, Excel stores unaccented); ledojo + tutosurexcel | sources: https://ledojo.club/apprendre-excel/formules/francais-anglais | https://tutosurexcel.com/fonctions-excel-francais-anglais/ ("FORECAST.LINEAR", "PREVISION.LINEAIRE"), ("FORMULATEXT", "FORMULETEXTE"), @@ -275,8 +285,6 @@ pub(super) const DIALECT: Dialect = Dialect { ("LEFT", "GAUCHE"), ("LEFTB", "GAUCHEB"), ("LEN", "NBCAR"), - // reviewed: pattern NBCAR+B (LEN page text mentions LENB; GAUCHEB/DROITEB/STXTB/REMPLACERB confirmed on pages) | sources: https://support.microsoft.com/fr-fr/excel/functions/len-function - ("LENB", "NBCARB"), ("LINEST", "DROITEREG"), ("LOGEST", "LOGREG"), ("LOGINV", "LOI.LOGNORMALE.INVERSE"), @@ -327,6 +335,10 @@ pub(super) const DIALECT: Dialect = Dialect { ("OCT2DEC", "OCTDEC"), ("OCT2HEX", "OCTHEX"), ("ODD", "IMPAIR"), + ("ODDFPRICE", "PRIX.PCOUPON.IRREG"), + ("ODDFYIELD", "REND.PCOUPON.IRREG"), + ("ODDLPRICE", "PRIX.DCOUPON.IRREG"), + ("ODDLYIELD", "REND.DCOUPON.IRREG"), ("OFFSET", "DECALER"), ("OR", "OU"), ("PDURATION", "PDUREE"), @@ -382,8 +394,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("RRI", "TAUX.INT.EQUIV"), ("RSQ", "COEFFICIENT.DETERMINATION"), ("SEARCH", "CHERCHE"), - // reviewed: pattern CHERCHE+B; the fr SEARCH page text says CHERCHERB which looks like a machine-translation slip | sources: https://support.microsoft.com/fr-fr/excel/functions/search-function - ("SEARCHB", "CHERCHEB"), + // reviewed: CHERCHEB is #NOM? in French Excel 2024 (#191); the SEARCH page's "La fonction CHERCHERB est obsolète" was right | sources: https://support.microsoft.com/fr-fr/excel/text-functions-reference ("CHERCHE, CHERCHERB") | https://www.perfectxl.com/academy/functions/translations/english-french/ | https://www.auditexcel.co.za/blog/excel-functions-french/ + ("SEARCHB", "CHERCHERB"), ("SECOND", "SECONDE"), ("SERIESSUM", "SOMME.SERIES"), ("SHEET", "FEUILLE"), diff --git a/crates/formula/tests/localized_input.rs b/crates/formula/tests/localized_input.rs index 27e542518..7e43391b2 100644 --- a/crates/formula/tests/localized_input.rs +++ b/crates/formula/tests/localized_input.rs @@ -35,6 +35,8 @@ fn each_language_spells_formulas_like_its_excel() { (Fr, "LIGNES(Tableau1[#Tout])-LIGNES(Tableau1[[#En-têtes];[Nom]])", "ROWS(Tableau1[#All])-ROWS(Tableau1[[#Headers],[Nom]])"), (Fr, "SI(VRAI;RECHERCHEV(A2;D:E;2;FAUX);#N/A)", "IF(TRUE,VLOOKUP(A2,D:E,2,FALSE),#N/A)"), (Fr, "SOMME({1.2;3,5.4})+SIERREUR(1/0;#VALEUR!)", "SUM({1,2;3.5,4})+IFERROR(1/0,#VALUE!)"), + // French Excel 2024 (#191): STXTB exists, NBCARB/CHERCHEB/TROUVEB are #NOM?. + (Fr, "STXTB(A1;2;1)&CHERCHERB(\"b\";A1)&TROUVERB(\"b\";A1)&LENB(A1)", "MIDB(A1,2,1)&SEARCHB(\"b\",A1)&FINDB(\"b\",A1)&LENB(A1)"), ] { assert_eq!(canonical(local, locale), english, "{locale:?} entry"); assert_eq!(shown(english, locale), local, "{locale:?} display"); diff --git a/docs/formula-input.md b/docs/formula-input.md index e15d13369..7378025e8 100644 --- a/docs/formula-input.md +++ b/docs/formula-input.md @@ -19,7 +19,7 @@ preference follows the system language. | | English | Spanish | German | Portuguese (Brazil) | Russian | French | | --- | --- | --- | --- | --- | --- | --- | | Example | `SUM`, `IF`, `VLOOKUP` | `SUMA`, `SI`, `BUSCARV` | `SUMME`, `WENN`, `SVERWEIS` | `SOMA`, `SE`, `PROCV` | `СУММ`, `ЕСЛИ`, `ВПР` | `SOMME`, `SI`, `RECHERCHEV` | -| Function names translated | — | 424 | 403 | 412 | 459 | 398 | +| Function names translated | — | 424 | 403 | 412 | 459 | 405 | | Booleans | `TRUE`, `FALSE` | `VERDADERO`, `FALSO` | `WAHR`, `FALSCH` | `VERDADEIRO`, `FALSO` | `ИСТИНА`, `ЛОЖЬ` | `VRAI`, `FAUX` | | Errors (e.g.) | `#VALUE!`, `#N/A` | `#¡VALOR!`, `#N/D` | `#WERT!`, `#NV` | `#VALOR!`, `#N/D` | `#ЗНАЧ!`, `#Н/Д` | `#VALEUR!`, `#N/A` | | Arguments and unions | `,` | `;` | `;` | `;` | `;` | `;` | @@ -63,7 +63,8 @@ come from Microsoft Support's localized Excel function pages, which are machine- sometimes wrong, so an entry needs two agreeing signals on its page (title, description, syntax paragraph aligned with the English page, examples); entries marked `reviewed` were decided by hand against independent function-name references. Booleans, errors and table specifiers cite -their sources per item. French separators, `SOMME`, `TEXTE`, `AUJOURDHUI`, `LIGNES`, `#VALEUR!` -and four table specifiers were checked in French Excel 2013 by a French user (#191); the other +their sources per item. A French user checked the French separators, `SOMME`, `TEXTE`, +`AUJOURDHUI`, `LIGNES`, `#VALEUR!` and four table specifiers in French Excel 2013, and 16 more +function names in French Excel 2024, three of which were wrong and are fixed (#191); the other tables have not yet been checked against a running localized Excel or by native speakers; corrections are one-line edits with a source. diff --git a/docs/localization-parity.md b/docs/localization-parity.md index f72d40338..f579c2881 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -22,7 +22,7 @@ right-to-left sheets and full complex-script support. Part of strings plus ~500 function descriptions), so each shipped language covers **~12%** (measured count / estimated total). - **Formulas follow the interface language in Spanish, German, Brazilian Portuguese, Russian - and French** (#45): function names (398–459 per language), booleans, errors, table specifiers + and French** (#45): function names (403–459 per language), booleans, errors, table specifiers and separators, at the editor boundary only; files and APIs keep canonical English ([formula-input.md](formula-input.md)). The names come from machine-translated Microsoft pages (two agreeing signals per entry, sources in `crates/formula/src/input/`); only the French @@ -82,7 +82,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| -| 2026-10-13 | minor | French formula table: 398 local function names, `VRAI`/`FAUX`, French errors and table specifiers, `.` between array columns; separators and a few words checked in French Excel 2013 (#191) | +| 2026-10-13 | minor | French formula table: 405 local function names, `VRAI`/`FAUX`, French errors and table specifiers, `.` between array columns; separators and some names checked in French Excel 2013 and 2024 (#191) | | 2026-10-12 | minor | Format Cells looks up its tabs, labels, options and note through `Language::tr` (Fill tab keyed `Format Cells\|Fill`); dialog titles and OK/Cancel too. Labels already in a table (Number, Currency, Fill…) show translated; the rest fall back to English until the tables add them | | 2026-10-12 | minor | Brazilian Portuguese catalog (`i18n/pt.rs`) grows from 377 to 923 entries: every key the other catalogs translate, including the dialog strings #669 starts looking up (~42%) | | 2026-10-11 | minor | Formulas follow the interface language in es, de, pt-BR and ru (names, booleans, errors, table specifiers, separators); infrastructure item 2 partly done | From 66b9a98c850c2b4a5916c1d6d86bd35b963ff3fc Mon Sep 17 00:00:00 2001 From: quantmind-br Date: Wed, 14 Oct 2026 20:15:55 -0300 Subject: [PATCH 4/7] M12: later functions in the German, Spanish, Portuguese and Russian tables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Name the functions the four tables were missing, each from a Microsoft page plus an independent reference (excel-translator, perfectxl, native tutorials and user formulas); where they disagree the function keeps its English name. - de (413): UNREGER.KURS/REND, UNREGLE.KURS/REND, PROGNOSE.ETS*, PROZENTVON, ABSCHNBEREICH. - es (434): PRECIO.PER.IRREGULAR.1/2, RENDTO.PER.IRREGULAR.1/2, PRONOSTICO.ETS, .CONFINT, .ESTACIONALIDAD, PORCENTAJEDE, RECORTAR.RANGO, TEXTOBAHT. FORECAST.ETS.STAT stays English (Microsoft's page gives both ESTADISTICA and STAT). - pt-BR (420): PREÇOPRIMINC, LUCROPRIMINC, PREÇOÚLTINC, LUCROÚLTINC, PREVISÃO.ETS*, PORCENTAGEMDE, CONVERTEREURO. REGEXTEST and REGEXREPLACE stay English, as in Brazilian Excel, and REPLACEB is SUBSTITUIRB, not the pattern-guessed MUDARB. - ru (471): ЦЕНАПЕРВНЕРЕГ, ДОХОДПЕРВНЕРЕГ, ЦЕНАПОСЛНЕРЕГ, ДОХОДПОСЛНЕРЕГ, ПРЕДСКАЗ.ETS*, ПРОЦЕНТ, УРЕЗДИАПАЗОН, ДОЛЛСША, БАТТЕКСТ. FORECAST.ETS.CONFINT keeps the Cyrillic Е Excel spells it with. The remaining pattern-derived byte-function names (FINDENB, ERSETZENB, PROCURARB, EXT.TEXTOB, ENCONTRARB) now cite two sources. The table test types and shows every name back. --- ROADMAP.md | 1 + crates/formula/src/input/de.rs | 24 +++++++++++++++++-- crates/formula/src/input/es.rs | 22 ++++++++++++++++- crates/formula/src/input/pt.rs | 32 ++++++++++++++++++------- crates/formula/src/input/ru.rs | 24 +++++++++++++++++++ crates/formula/tests/localized_input.rs | 3 +++ docs/formula-input.md | 11 +++++---- docs/localization-parity.md | 5 ++-- 8 files changed, 105 insertions(+), 17 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index e85fb0618..914b9c6a2 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -135,6 +135,7 @@ Ranked; estimates in Opus 5.5 agent-hours. Detail and the full beta-gate list in | Date | What landed | |---|---| +| 2026-10-14 | Formulas in German, Spanish, Brazilian Portuguese and Russian name the functions their tables were missing (bond functions with an odd period, `FORECAST.ETS*`, `PERCENTOF`, `TRIMRANGE`…), each from two sources: 413, 434, 420 and 471 names; Brazilian `REGEXTEST`/`REGEXREPLACE` stay English, `REPLACEB` is `SUBSTITUIRB` | | 2026-10-13 | Formulas in French: 405 local function names, `VRAI`/`FAUX`, French errors and table specifiers, `;` arguments and `.` array columns; separators and some names checked in French Excel 2013 and 2024 (#191) | | 2026-10-12 | Rows auto-fit oversized fonts: opening a file and whole-row/column formatting grow non-custom rows to their tallest font (#833) | | 2026-10-12 | Number formats: parsing a format code is linear in its length (long runs of `[`, `,` or `/` no longer take quadratic time), and an unclosed `[` is a literal when splitting sections as well as when tokenizing (#810) | diff --git a/crates/formula/src/input/de.rs b/crates/formula/src/input/de.rs index bdf4727b2..04cdd9693 100644 --- a/crates/formula/src/input/de.rs +++ b/crates/formula/src/input/de.rs @@ -193,7 +193,7 @@ pub(super) const DIALECT: Dialect = Dialect { ("FILTERXML", "XMLFILTERN"), // reviewed: SEARCH page: "…Groß- und Kleinschreibung… können Sie FINDEN verwenden" (FIND page retired) | sources: https://support.microsoft.com/de-de/excel/functions/search-function ("FIND", "FINDEN"), - // reviewed: B-variant pattern of FINDEN (LINKSB, TEILB, RECHTSB, LÄNGEB, SUCHENB documented); name itself not on a cached page [inferred] | sources: https://support.microsoft.com/de-de/excel/functions/c7912941-af2a-4bdf-a553-d0d89b0a0628 + // reviewed: MS text-functions reference "FINDEN, FINDENB"; perfectxl and excel-translator agree | sources: https://support.microsoft.com/de-de/excel/text-functions-reference | https://www.perfectxl.com/academy/functions/translations/english-german/ | https://en.excel-translator.de/functions/text/ ("FINDB", "FINDENB"), ("FIXED", "FEST"), ("FLOOR", "UNTERGRENZE"), @@ -201,6 +201,14 @@ pub(super) const DIALECT: Dialect = Dialect { ("FLOOR.PRECISE", "UNTERGRENZE.GENAU"), // reviewed: page: "PROGNOSE.LINEAR(x;Y_Werte;X_Werte) oder SCHÄTZER(x;Y_Werte;X_Werte)"; PROGNOSE replaced SCHÄTZER only as .LINEAR | sources: https://support.microsoft.com/de-de/excel/forecast-and-forecast-linear-functions ("FORECAST", "SCHÄTZER"), + // reviewed: MS page title and syntax PROGNOSE.ETS; excel-translator statistical table and excel-for-you agree | sources: https://support.microsoft.com/de-de/excel/functions/forecast-ets-function | https://en.excel-translator.de/functions/statistical/ | https://excel-for-you.com/excel-funktionen-deutsch-englisch/ + ("FORECAST.ETS", "PROGNOSE.ETS"), + // reviewed: MS page syntax PROGNOSE.ETS.KONFINT; excel-translator and excel-for-you agree | sources: https://support.microsoft.com/de-de/excel/functions/forecast-ets-confint-function | https://en.excel-translator.de/functions/statistical/ | https://excel-for-you.com/excel-funktionen-deutsch-englisch/ + ("FORECAST.ETS.CONFINT", "PROGNOSE.ETS.KONFINT"), + // reviewed: MS page syntax PROGNOSE.ETS.SAISONALITÄT; excel-translator and excel-for-you agree | sources: https://support.microsoft.com/de-de/excel/functions/forecast-ets-seasonality-function | https://en.excel-translator.de/functions/statistical/ | https://excel-for-you.com/excel-funktionen-deutsch-englisch/ + ("FORECAST.ETS.SEASONALITY", "PROGNOSE.ETS.SAISONALITÄT"), + // reviewed: MS page syntax PROGNOSE.ETS.STAT; excel-translator and excel-for-you agree | sources: https://support.microsoft.com/de-de/excel/functions/forecast-ets-stat-function | https://en.excel-translator.de/functions/statistical/ | https://excel-for-you.com/excel-funktionen-deutsch-englisch/ + ("FORECAST.ETS.STAT", "PROGNOSE.ETS.STAT"), // reviewed: same page syntax and example =PROGNOSE.LINEAR(30,A2:A6,B2:B6) | sources: https://support.microsoft.com/de-de/excel/forecast-and-forecast-linear-functions ("FORECAST.LINEAR", "PROGNOSE.LINEAR"), ("FORMULATEXT", "FORMELTEXT"), @@ -323,11 +331,21 @@ pub(super) const DIALECT: Dialect = Dialect { ("OCT2DEC", "OKTINDEZ"), ("OCT2HEX", "OKTINHEX"), ("ODD", "UNGERADE"), + // reviewed: MS page title and example =UNREGER.KURS(; perfectxl, excel-translator and excel-for-you agree | sources: https://support.microsoft.com/de-de/excel/functions/oddfprice-function | https://www.perfectxl.com/academy/functions/translations/english-german/ | https://en.excel-translator.de/functions/financial/ + ("ODDFPRICE", "UNREGER.KURS"), + // reviewed: MS page syntax UNREGER.REND; perfectxl and excel-translator agree | sources: https://support.microsoft.com/de-de/excel/functions/oddfyield-function | https://www.perfectxl.com/academy/functions/translations/english-german/ | https://en.excel-translator.de/functions/financial/ + ("ODDFYIELD", "UNREGER.REND"), + // reviewed: MS page syntax UNREGLE.KURS; perfectxl and excel-translator agree | sources: https://support.microsoft.com/de-de/excel/functions/oddlprice-function | https://www.perfectxl.com/academy/functions/translations/english-german/ | https://en.excel-translator.de/functions/financial/ + ("ODDLPRICE", "UNREGLE.KURS"), + // reviewed: MS page syntax UNREGLE.REND; perfectxl and excel-translator agree | sources: https://support.microsoft.com/de-de/excel/functions/oddlyield-function | https://www.perfectxl.com/academy/functions/translations/english-german/ | https://en.excel-translator.de/functions/financial/ + ("ODDLYIELD", "UNREGLE.REND"), ("OFFSET", "BEREICH.VERSCHIEBEN"), ("OR", "ODER"), ("PERCENTILE", "QUANTIL"), ("PERCENTILE.EXC", "QUANTIL.EXKL"), ("PERCENTILE.INC", "QUANTIL.INKL"), + // reviewed: MS page title and example =PROZENTVON(; excel-nervt uses it inside GRUPPIERENNACH/PIVOTMIT; excel-for-you agrees | sources: https://support.microsoft.com/de-de/excel/functions/percentof-function | https://excel-nervt.de/tag/prozentvon/ | https://excel-for-you.com/excel-funktionen-deutsch-englisch/ + ("PERCENTOF", "PROZENTVON"), ("PERCENTRANK", "QUANTILSRANG"), ("PERCENTRANK.EXC", "QUANTILSRANG.EXKL"), ("PERCENTRANK.INC", "QUANTILSRANG.INKL"), @@ -357,7 +375,7 @@ pub(super) const DIALECT: Dialect = Dialect { ("RATE", "ZINS"), ("RECEIVED", "AUSZAHLUNG"), ("REPLACE", "ERSETZEN"), - // reviewed: B-variant pattern of ERSETZEN; not named on a cached page [inferred] | sources: https://support.microsoft.com/de-de/excel/functions/replace-function + // reviewed: MS text-functions reference "ERSETZEN, ERSETZENB"; perfectxl and excel-translator agree | sources: https://support.microsoft.com/de-de/excel/text-functions-reference | https://www.perfectxl.com/academy/functions/translations/english-german/ | https://en.excel-translator.de/functions/text/ ("REPLACEB", "ERSETZENB"), ("REPT", "WIEDERHOLEN"), ("RIGHT", "RECHTS"), @@ -435,6 +453,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("TRANSPOSE", "MTRANS"), ("TRIM", "GLÄTTEN"), ("TRIMMEAN", "GESTUTZTMITTEL"), + // reviewed: soprani.at names ABSCHNBEREICH as the German TRIMRANGE; excelarete and excel-for-you agree. The MS page title says GESTUTZTBEREICH but its syntax and examples keep TRIMRANGE (MT) | sources: https://blog.soprani.at/2025/04/27/leerzellen-abschneiden-wenn-ein-punkt-nicht-funktioniert/ | https://excel-for-you.com/excel-funktionen-deutsch-englisch/ | https://support.microsoft.com/de-de/excel/functions/trimrange-function + ("TRIMRANGE", "ABSCHNBEREICH"), ("TRUE", "WAHR"), ("TRUNC", "KÜRZEN"), ("TYPE", "TYP"), diff --git a/crates/formula/src/input/es.rs b/crates/formula/src/input/es.rs index b5a51b142..516f63fb7 100644 --- a/crates/formula/src/input/es.rs +++ b/crates/formula/src/input/es.rs @@ -56,6 +56,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("AVERAGEA", "PROMEDIOA"), ("AVERAGEIF", "PROMEDIO.SI"), ("AVERAGEIFS", "PROMEDIO.SI.CONJUNTO"), + // reviewed: perfectxl and excel-translator text table TEXTOBAHT; MS example =TEXTOBAHT(A2) | sources: https://www.perfectxl.com/academy/functions/translations/english-spanish/ | https://en.excel-translator.de/functions/text/ | https://support.microsoft.com/es-es/excel/functions/bahttext-function + ("BAHTTEXT", "TEXTOBAHT"), ("BETA.DIST", "DISTR.BETA.N"), ("BETA.INV", "INV.BETA.N"), ("BETADIST", "DISTR.BETA"), @@ -185,7 +187,7 @@ pub(super) const DIALECT: Dialect = Dialect { ("FILTERXML", "XMLFILTRO"), // reviewed: FIND/FINDB page absent/retired in cache; ONLYOFFICE, PhpSpreadsheet, HyperFormula agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json ("FIND", "ENCONTRAR"), - // reviewed: B-variant of ENCONTRAR; ONLYOFFICE only (zekke has English FINDB) | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json + // reviewed: MS text-functions reference "Funciones ENCONTRAR y ENCONTRARB"; perfectxl, excel-translator and ONLYOFFICE agree (zekke has English FINDB) | sources: https://support.microsoft.com/es-es/excel/text-functions-reference | https://www.perfectxl.com/academy/functions/translations/english-spanish/ | https://en.excel-translator.de/functions/text/ ("FINDB", "ENCONTRARB"), ("FINV", "DISTR.F.INV"), ("FISHERINV", "PRUEBA.FISHER.INV"), @@ -194,6 +196,12 @@ pub(super) const DIALECT: Dialect = Dialect { ("FLOOR.MATH", "MULTIPLO.INFERIOR.MAT"), ("FLOOR.PRECISE", "MULTIPLO.INFERIOR.EXACTO"), ("FORECAST", "PRONOSTICO"), + // reviewed: MS page syntax PRONOSTICO.ETS; excel-translator statistical table agrees | sources: https://support.microsoft.com/es-es/excel/functions/forecast-ets-function | https://en.excel-translator.de/functions/statistical/ + ("FORECAST.ETS", "PRONOSTICO.ETS"), + // reviewed: MS page syntax PRONOSTICO.ETS.CONFINT; excel-translator agrees | sources: https://support.microsoft.com/es-es/excel/functions/forecast-ets-confint-function | https://en.excel-translator.de/functions/statistical/ + ("FORECAST.ETS.CONFINT", "PRONOSTICO.ETS.CONFINT"), + // reviewed: MS page syntax PRONOSTICO.ETS.ESTACIONALIDAD; excel-translator agrees. FORECAST.ETS.STAT stays English: the MS title says PRONOSTICO.ETS.ESTADISTICA, its body and excel-translator PRONOSTICO.ETS.STAT | sources: https://support.microsoft.com/es-es/excel/functions/forecast-ets-seasonality-function | https://en.excel-translator.de/functions/statistical/ + ("FORECAST.ETS.SEASONALITY", "PRONOSTICO.ETS.ESTACIONALIDAD"), // reviewed: page syntax and meta; PhpSpreadsheet agrees | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json ("FORECAST.LINEAR", "PRONOSTICO.LINEAL"), ("FORMULATEXT", "FORMULATEXTO"), @@ -337,6 +345,14 @@ pub(super) const DIALECT: Dialect = Dialect { ("OCT2DEC", "OCT.A.DEC"), ("OCT2HEX", "OCT.A.HEX"), ("ODD", "REDONDEA.IMPAR"), + // reviewed: perfectxl and excel-translator financial table; MS example =PRECIO.PER.IRREGULAR.1( | sources: https://www.perfectxl.com/academy/functions/translations/english-spanish/ | https://en.excel-translator.de/functions/financial/ | https://support.microsoft.com/es-es/excel/functions/oddfprice-function + ("ODDFPRICE", "PRECIO.PER.IRREGULAR.1"), + // reviewed: perfectxl and excel-translator financial table; MS example =RENDTO.PER.IRREGULAR.1( | sources: https://www.perfectxl.com/academy/functions/translations/english-spanish/ | https://en.excel-translator.de/functions/financial/ | https://support.microsoft.com/es-es/excel/functions/oddfyield-function + ("ODDFYIELD", "RENDTO.PER.IRREGULAR.1"), + // reviewed: perfectxl and excel-translator financial table; MS example =PRECIO.PER.IRREGULAR.2( | sources: https://www.perfectxl.com/academy/functions/translations/english-spanish/ | https://en.excel-translator.de/functions/financial/ | https://support.microsoft.com/es-es/excel/functions/oddlprice-function + ("ODDLPRICE", "PRECIO.PER.IRREGULAR.2"), + // reviewed: perfectxl and excel-translator financial table; MS example =RENDTO.PER.IRREGULAR.2( | sources: https://www.perfectxl.com/academy/functions/translations/english-spanish/ | https://en.excel-translator.de/functions/financial/ | https://support.microsoft.com/es-es/excel/functions/oddlyield-function + ("ODDLYIELD", "RENDTO.PER.IRREGULAR.2"), ("OFFSET", "DESREF"), ("OR", "O"), ("PDURATION", "P.DURACION"), @@ -344,6 +360,8 @@ pub(super) const DIALECT: Dialect = Dialect { // reviewed: vote was truncated "EXC"; ONLYOFFICE, zekke, PhpSpreadsheet, HyperFormula and Microsoft nav list agree | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json ("PERCENTILE.EXC", "PERCENTIL.EXC"), ("PERCENTILE.INC", "PERCENTIL.INC"), + // reviewed: a user formula =AGRUPARPOR(A1:A15;D1:D15;PORCENTAJEDE;;1) on Microsoft Q&A; desafiandoexcel and exceleinfo agree (the MS function page keeps PERCENTOF) | sources: https://learn.microsoft.com/es-es/answers/questions/5373070/funci-n-agruparpor | https://desafiandoexcel.com/funciones-de-excel/funcion-porcentajede-en-excel/ + ("PERCENTOF", "PORCENTAJEDE"), ("PERCENTRANK", "RANGO.PERCENTIL"), ("PERCENTRANK.EXC", "RANGO.PERCENTIL.EXC"), ("PERCENTRANK.INC", "RANGO.PERCENTIL.INC"), @@ -465,6 +483,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("TREND", "TENDENCIA"), ("TRIM", "ESPACIOS"), ("TRIMMEAN", "MEDIA.ACOTADA"), + // reviewed: MS page title RECORTAR.RANGO (syntax line garbled); desafiandoexcel and mundo-datos agree | sources: https://support.microsoft.com/es-es/excel/functions/trimrange-function | https://desafiandoexcel.com/funciones-de-excel/funcion-recortar-rango-en-excel/ | https://mundo-datos.com/recortar-rango/ + ("TRIMRANGE", "RECORTAR.RANGO"), // reviewed: page meta/examples VERDADERO; all independent sources agree; vote picked truncated "VERDAD" | sources: OO=https://raw.githubusercontent.com/ONLYOFFICE/web-apps/master/apps/spreadsheeteditor/main/resources/formula-lang/es.json | ZK=https://raw.githubusercontent.com/zekke-io/zekke/main/src/lib/spreadsheets/function-names/es.json ("TRUE", "VERDADERO"), ("TRUNC", "TRUNCAR"), diff --git a/crates/formula/src/input/pt.rs b/crates/formula/src/input/pt.rs index 92a8df797..5c5b1c822 100644 --- a/crates/formula/src/input/pt.rs +++ b/crates/formula/src/input/pt.rs @@ -162,6 +162,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("ERFC", "FUNERROCOMPL"), ("ERFC.PRECISE", "FUNERROCOMPL.PRECISO"), ("ERROR.TYPE", "TIPO.ERRO"), + // reviewed: MS page title and syntax CONVERTEREURO; usuariosdoexcel agrees | sources: https://support.microsoft.com/pt-br/excel/functions/euroconvert-function | https://usuariosdoexcel.wordpress.com/lista-de-funcoes-do-excel/ + ("EUROCONVERT", "CONVERTEREURO"), ("EVEN", "PAR"), ("EXACT", "EXATO"), // reviewed: real formulas | sources: https://www.guiadoexcel.com.br/funcao-expandir-excel/ @@ -181,7 +183,7 @@ pub(super) const DIALECT: Dialect = Dialect { ("FILTERXML", "FILTROXML"), // reviewed: blog formulas use PROCURAR (MS vote weak) | sources: https://www.guiadoexcel.com.br/funcoes-de-texto/ ("FIND", "PROCURAR"), - // reviewed: B-variant of PROCURAR; follows ESQUERDAB/DIREITAB/NÚM.CARACTB/LOCALIZARB pattern; no direct source for the B form + // reviewed: MS text-functions reference "Funções PROCURAR e PROCURARB"; excelcalcula (old pt-BR Microsoft article) and excel-translator agree | sources: https://support.microsoft.com/pt-br/excel/text-functions-reference | http://excelcalcula.blogspot.com/2012/10/funcao-de-texto-procurar.html | https://en.excel-translator.de/functions/text/ ("FINDB", "PROCURARB"), ("FINV", "INVF"), // reviewed: MS syntax/examples; blog | sources: https://www.guiadoexcel.com.br/funcoes-de-texto/ @@ -190,6 +192,14 @@ pub(super) const DIALECT: Dialect = Dialect { ("FLOOR.MATH", "ARREDMULTB.MAT"), ("FLOOR.PRECISE", "ARREDMULTB.PRECISO"), ("FORECAST", "PREVISÃO"), + // reviewed: MS page title PREVISÃO.ETS; excel-translator (pt-BR column) and usuariosdoexcel agree | sources: https://support.microsoft.com/pt-br/excel/functions/forecast-ets-function | https://en.excel-translator.de/functions/statistical/ | https://usuariosdoexcel.wordpress.com/lista-de-funcoes-do-excel/ + ("FORECAST.ETS", "PREVISÃO.ETS"), + // reviewed: MS page title PREVISÃO.ETS.CONFINT; excel-translator and usuariosdoexcel agree | sources: https://support.microsoft.com/pt-br/excel/functions/forecast-ets-confint-function | https://en.excel-translator.de/functions/statistical/ | https://usuariosdoexcel.wordpress.com/lista-de-funcoes-do-excel/ + ("FORECAST.ETS.CONFINT", "PREVISÃO.ETS.CONFINT"), + // reviewed: MS page title PREVISÃO.ETS.SAZONALIDADE; excel-translator and usuariosdoexcel agree | sources: https://support.microsoft.com/pt-br/excel/functions/forecast-ets-seasonality-function | https://en.excel-translator.de/functions/statistical/ | https://usuariosdoexcel.wordpress.com/lista-de-funcoes-do-excel/ + ("FORECAST.ETS.SEASONALITY", "PREVISÃO.ETS.SAZONALIDADE"), + // reviewed: MS page title PREVISÃO.ETS.STAT; excel-translator (pt-BR; pt-PT has ESTATÍSTICA) and usuariosdoexcel agree | sources: https://support.microsoft.com/pt-br/excel/functions/forecast-ets-stat-function | https://en.excel-translator.de/functions/statistical/ | https://usuariosdoexcel.wordpress.com/lista-de-funcoes-do-excel/ + ("FORECAST.ETS.STAT", "PREVISÃO.ETS.STAT"), ("FORECAST.LINEAR", "PREVISÃO.LINEAR"), ("FORMULATEXT", "FÓRMULATEXTO"), ("FREQUENCY", "FREQÜÊNCIA"), @@ -291,7 +301,7 @@ pub(super) const DIALECT: Dialect = Dialect { ("MDURATION", "MDURAÇÃO"), ("MEDIAN", "MED"), ("MID", "EXT.TEXTO"), - // reviewed: B-variant of EXT.TEXTO; pattern ESQUERDAB/DIREITAB; no direct source + // reviewed: MS text-functions reference "Funções EXT.TEXTO, EXT.TEXTOB"; excelcalcula, excel-translator and LibreOffice pt-BR agree | sources: https://support.microsoft.com/pt-br/excel/text-functions-reference | http://excelcalcula.blogspot.com/2012/10/funcao-de-texto-exttexto.html | https://en.excel-translator.de/functions/text/ ("MIDB", "EXT.TEXTOB"), ("MIN", "MÍNIMO"), ("MINA", "MÍNIMOA"), @@ -326,6 +336,14 @@ pub(super) const DIALECT: Dialect = Dialect { ("OCT2DEC", "OCTADEC"), ("OCT2HEX", "OCTAHEX"), ("ODD", "ÍMPAR"), + // reviewed: MS page title PREÇOPRIMINC; excel-translator, doutoresdoexcel and usuariosdoexcel agree | sources: https://support.microsoft.com/pt-br/excel/functions/oddfprice-function | https://en.excel-translator.de/functions/financial/ | https://www.doutoresdoexcel.com.br/traducao-de-formulas-excel/ + ("ODDFPRICE", "PREÇOPRIMINC"), + // reviewed: MS page title LUCROPRIMINC; excel-translator, doutoresdoexcel and usuariosdoexcel agree | sources: https://support.microsoft.com/pt-br/excel/functions/oddfyield-function | https://en.excel-translator.de/functions/financial/ | https://www.doutoresdoexcel.com.br/traducao-de-formulas-excel/ + ("ODDFYIELD", "LUCROPRIMINC"), + // reviewed: MS page title PREÇOÚLTINC; excel-translator and doutoresdoexcel agree | sources: https://support.microsoft.com/pt-br/excel/functions/oddlprice-function | https://en.excel-translator.de/functions/financial/ | https://www.doutoresdoexcel.com.br/traducao-de-formulas-excel/ + ("ODDLPRICE", "PREÇOÚLTINC"), + // reviewed: MS page title LUCROÚLTINC; excel-translator and usuariosdoexcel agree | sources: https://support.microsoft.com/pt-br/excel/functions/oddlyield-function | https://en.excel-translator.de/functions/financial/ | https://usuariosdoexcel.wordpress.com/lista-de-funcoes-do-excel/ + ("ODDLYIELD", "LUCROÚLTINC"), ("OFFSET", "DESLOC"), ("OR", "OU"), ("PDURATION", "DURAÇÃOP"), @@ -333,6 +351,8 @@ pub(super) const DIALECT: Dialect = Dialect { // reviewed: vote wrongly gave EXC; MS title/syntax ("PERCENTILE.EXC", "PERCENTIL.EXC"), ("PERCENTILE.INC", "PERCENTIL.INC"), + // reviewed: MS page title and example =PORCENTAGEMDE(; guiadoexcel uses it in AGRUPAR(…;EMPILHARH(SOMA;PORCENTAGEMDE);…); hashtagtreinamentos names it | sources: https://support.microsoft.com/pt-br/excel/functions/percentof-function | https://www.guiadoexcel.com.br/funcao-porcentagemde-percentof-excel/ | https://www.hashtagtreinamentos.com/novas-formulas-excel + ("PERCENTOF", "PORCENTAGEMDE"), ("PERCENTRANK", "ORDEM.PORCENTUAL"), ("PERCENTRANK.EXC", "ORDEM.PORCENTUAL.EXC"), ("PERCENTRANK.INC", "ORDEM.PORCENTUAL.INC"), @@ -363,13 +383,9 @@ pub(super) const DIALECT: Dialect = Dialect { ("RANK.EQ", "ORDEM.EQ"), ("RATE", "TAXA"), ("RECEIVED", "RECEBER"), - // reviewed: real formula in blog | sources: https://www.guiadoexcel.com.br/como-usar-procx-e-regex-excel/ - ("REGEXREPLACE", "REGEX.SUBSTITUIR"), - // reviewed: real formula in blog | sources: https://www.guiadoexcel.com.br/como-usar-procx-e-regex-excel/ - ("REGEXTEST", "REGEX.TESTAR"), ("REPLACE", "MUDAR"), - // reviewed: B-variant of MUDAR; pattern ESQUERDAB/DIREITAB; no direct source - ("REPLACEB", "MUDARB"), + // reviewed: MS text-functions reference "Funções MUDAR, SUBSTITUIRB"; excelcalcula (old pt-BR Microsoft article), LibreOffice pt-BR and excel-translator agree; the earlier MUDARB was a pattern guess | sources: https://support.microsoft.com/pt-br/excel/text-functions-reference | http://excelcalcula.blogspot.com/2012/10/funcao-de-texto-mudar.html | https://raw.githubusercontent.com/LibreOffice/translations/master/source/pt-BR/formula/messages.po + ("REPLACEB", "SUBSTITUIRB"), ("RIGHT", "DIREITA"), ("RIGHTB", "DIREITAB"), ("ROMAN", "ROMANO"), diff --git a/crates/formula/src/input/ru.rs b/crates/formula/src/input/ru.rs index 677341320..ca131442b 100644 --- a/crates/formula/src/input/ru.rs +++ b/crates/formula/src/input/ru.rs @@ -56,6 +56,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("AVERAGEA", "СРЗНАЧА"), ("AVERAGEIF", "СРЗНАЧЕСЛИ"), ("AVERAGEIFS", "СРЗНАЧЕСЛИМН"), + // reviewed: perfectxl and excel-translator text table; MS page title and example =БАТТЕКСТ(A2) | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://en.excel-translator.de/functions/text/ | https://support.microsoft.com/ru-ru/excel/functions/bahttext-function + ("BAHTTEXT", "БАТТЕКСТ"), ("BASE", "ОСНОВАНИЕ"), ("BESSELI", "БЕССЕЛЬ.I"), ("BESSELJ", "БЕССЕЛЬ.J"), @@ -282,6 +284,14 @@ pub(super) const DIALECT: Dialect = Dialect { // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ ("FLOOR.PRECISE", "ОКРВНИЗ.ТОЧН"), ("FORECAST", "ПРЕДСКАЗ"), + // reviewed: MS page syntax ПРЕДСКАЗ.ETS (Latin ETS); excel-translator statistical table agrees | sources: https://support.microsoft.com/ru-ru/excel/functions/forecast-ets-function | https://en.excel-translator.de/functions/statistical/ + ("FORECAST.ETS", "ПРЕДСКАЗ.ETS"), + // reviewed: MS page title and syntax, excel-translator and a planetaexcel reader formula all spell it with a Cyrillic Е before a Latin TS | sources: https://support.microsoft.com/ru-ru/excel/functions/forecast-ets-confint-function | https://en.excel-translator.de/functions/statistical/ | https://www.planetaexcel.ru/techniques/25/2823/ + ("FORECAST.ETS.CONFINT", "ПРЕДСКАЗ.ЕTS.ДОВИНТЕРВАЛ"), + // reviewed: MS page syntax ПРЕДСКАЗ.ETS.СЕЗОННОСТЬ; excel-translator agrees | sources: https://support.microsoft.com/ru-ru/excel/functions/forecast-ets-seasonality-function | https://en.excel-translator.de/functions/statistical/ + ("FORECAST.ETS.SEASONALITY", "ПРЕДСКАЗ.ETS.СЕЗОННОСТЬ"), + // reviewed: MS page syntax ПРЕДСКАЗ.ETS.СТАТ; excel-translator agrees | sources: https://support.microsoft.com/ru-ru/excel/functions/forecast-ets-stat-function | https://en.excel-translator.de/functions/statistical/ + ("FORECAST.ETS.STAT", "ПРЕДСКАЗ.ETS.СТАТ"), // reviewed | sources: https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ ("FORECAST.LINEAR", "ПРЕДСКАЗ.ЛИНЕЙН"), // reviewed | sources: https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ @@ -566,6 +576,14 @@ pub(super) const DIALECT: Dialect = Dialect { ("OCT2HEX", "ВОСЬМ.В.ШЕСТН"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ ("ODD", "НЕЧЁТ"), + // reviewed: perfectxl, excel-translator and excelworld agree; MS example =ЦЕНАПЕРВНЕРЕГ( | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://en.excel-translator.de/functions/financial/ | http://www.excelworld.ru/stuff/worksheet_function/list_worksheet_function/all_worksheet_function/16-1-0-3 + ("ODDFPRICE", "ЦЕНАПЕРВНЕРЕГ"), + // reviewed: perfectxl, excel-translator and excelworld agree; MS example =ДОХОДПЕРВНЕРЕГ( | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://en.excel-translator.de/functions/financial/ | http://www.excelworld.ru/stuff/worksheet_function/list_worksheet_function/all_worksheet_function/16-1-0-3 + ("ODDFYIELD", "ДОХОДПЕРВНЕРЕГ"), + // reviewed: perfectxl, excel-translator and excelworld agree; MS example =ЦЕНАПОСЛНЕРЕГ( | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://en.excel-translator.de/functions/financial/ | http://www.excelworld.ru/stuff/worksheet_function/list_worksheet_function/all_worksheet_function/16-1-0-3 + ("ODDLPRICE", "ЦЕНАПОСЛНЕРЕГ"), + // reviewed: perfectxl, excel-translator and excelworld agree; MS example =ДОХОДПОСЛНЕРЕГ( | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://en.excel-translator.de/functions/financial/ | http://www.excelworld.ru/stuff/worksheet_function/list_worksheet_function/all_worksheet_function/16-1-0-3 + ("ODDLYIELD", "ДОХОДПОСЛНЕРЕГ"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ ("OFFSET", "СМЕЩ"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ @@ -578,6 +596,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("PERCENTILE.EXC", "ПРОЦЕНТИЛЬ.ИСКЛ"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ ("PERCENTILE.INC", "ПРОЦЕНТИЛЬ.ВКЛ"), + // reviewed: MS page title and example =ПРОЦЕНТ(; shagabutdinov uses it as the СВОДПО aggregator | sources: https://support.microsoft.com/ru-ru/excel/functions/percentof-function | https://shagabutdinov.ru/tpost/zjc1ca6uy1-funktsii-grupppo-groupby-i-svodpo-pivotb + ("PERCENTOF", "ПРОЦЕНТ"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ ("PERCENTRANK", "ПРОЦЕНТРАНГ"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ @@ -791,6 +811,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("TRIM", "СЖПРОБЕЛЫ"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ ("TRIMMEAN", "УРЕЗСРЕДНЕЕ"), + // reviewed: MS page title and example =УРЕЗДИАПАЗОН(; shagabutdinov: "Новая функция УРЕЗДИАПАЗОН (TRIMRANGE)" | sources: https://support.microsoft.com/ru-ru/excel/functions/trimrange-function | https://shagabutdinov.ru/tpost/i65crd6tu1-novaya-funktsiya-urezdiapazon-trimrange + ("TRIMRANGE", "УРЕЗДИАПАЗОН"), ("TRUE", "ИСТИНА"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ ("TRUNC", "ОТБР"), @@ -804,6 +826,8 @@ pub(super) const DIALECT: Dialect = Dialect { ("UNIQUE", "УНИК"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://easy-excel.com/excel-in-other-languages/excel-functions-in-russian/ | https://excel-academy.ru/tools/excel-functions/ ("UPPER", "ПРОПИСН"), + // reviewed: excel-translator hidden-function table and excelworld list ДОЛЛСША | sources: https://en.excel-translator.de/functions/hidden/ | http://www.excelworld.ru/stuff/worksheet_function/list_worksheet_function/all_worksheet_function/16-1-0-3 + ("USDOLLAR", "ДОЛЛСША"), // reviewed | sources: https://www.perfectxl.com/academy/functions/translations/english-russian/ | https://functiontranslator.com/ru/ | https://excel-academy.ru/tools/excel-functions/ ("VALUE", "ЗНАЧЕН"), // reviewed: Microsoft title, meta, syntax and examples all agree; the function tables only list the English name | sources: https://support.microsoft.com/ru-ru/excel/functions/valuetotext-function diff --git a/crates/formula/tests/localized_input.rs b/crates/formula/tests/localized_input.rs index 7e43391b2..64e94f574 100644 --- a/crates/formula/tests/localized_input.rs +++ b/crates/formula/tests/localized_input.rs @@ -122,6 +122,9 @@ fn language_tables_are_sorted_unique_and_unambiguous() { let upper = local.to_uppercase(); let boolean = upper == locale.boolean_name(true) || upper == locale.boolean_name(false); assert_eq!(boolean, matches!(*en, "TRUE" | "FALSE"), "{locale:?}: {en} = {local}"); + // Every name can be typed (dots, digits, accents, mixed scripts) and shown back. + assert_eq!(canonical(&format!("{}(A1)", local.to_lowercase()), locale), format!("{en}(A1)")); + assert_eq!(shown(&format!("{en}(A1)"), locale), format!("{local}(A1)")); } for e in CellError::ALL { assert_eq!(canonical(locale.error_name(e), locale), e.as_str(), "{locale:?}"); diff --git a/docs/formula-input.md b/docs/formula-input.md index 7378025e8..45067e1cd 100644 --- a/docs/formula-input.md +++ b/docs/formula-input.md @@ -19,7 +19,7 @@ preference follows the system language. | | English | Spanish | German | Portuguese (Brazil) | Russian | French | | --- | --- | --- | --- | --- | --- | --- | | Example | `SUM`, `IF`, `VLOOKUP` | `SUMA`, `SI`, `BUSCARV` | `SUMME`, `WENN`, `SVERWEIS` | `SOMA`, `SE`, `PROCV` | `СУММ`, `ЕСЛИ`, `ВПР` | `SOMME`, `SI`, `RECHERCHEV` | -| Function names translated | — | 424 | 403 | 412 | 459 | 405 | +| Function names translated | — | 434 | 413 | 420 | 471 | 405 | | Booleans | `TRUE`, `FALSE` | `VERDADERO`, `FALSO` | `WAHR`, `FALSCH` | `VERDADEIRO`, `FALSO` | `ИСТИНА`, `ЛОЖЬ` | `VRAI`, `FAUX` | | Errors (e.g.) | `#VALUE!`, `#N/A` | `#¡VALOR!`, `#N/D` | `#WERT!`, `#NV` | `#VALOR!`, `#N/D` | `#ЗНАЧ!`, `#Н/Д` | `#VALEUR!`, `#N/A` | | Arguments and unions | `,` | `;` | `;` | `;` | `;` | `;` | @@ -65,6 +65,9 @@ paragraph aligned with the English page, examples); entries marked `reviewed` we hand against independent function-name references. Booleans, errors and table specifiers cite their sources per item. A French user checked the French separators, `SOMME`, `TEXTE`, `AUJOURDHUI`, `LIGNES`, `#VALEUR!` and four table specifiers in French Excel 2013, and 16 more -function names in French Excel 2024, three of which were wrong and are fixed (#191); the other -tables have not yet been checked against a running localized Excel or by native speakers; -corrections are one-line edits with a source. +function names in French Excel 2024, three of which were wrong and are fixed (#191). Functions +added to Excel after the tables were first built (the irregular-period bond functions, the +`FORECAST.ETS` family, `PERCENTOF`, `TRIMRANGE`…) were checked name by name against a Microsoft +page and a non-Microsoft reference in each language; where they disagree the function keeps its +English name. The other tables have not yet been checked against a running localized Excel or +by native speakers; corrections are one-line edits with a source. diff --git a/docs/localization-parity.md b/docs/localization-parity.md index f579c2881..6a0445c23 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,6 @@ # Localization parity -> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (formulas in es, de, pt-BR, ru and fr) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** minor (formulas in es, de, pt-BR, ru and fr; later functions in es, de, pt-BR and ru) · **Target:** Microsoft Excel (Microsoft 365), Excel for Mac 16.113.4 Per-language status against Excel, which ships its UI in dozens of languages (Windows language packs cover 100+), with localized function names, argument separators, number and date formats, @@ -22,7 +22,7 @@ right-to-left sheets and full complex-script support. Part of strings plus ~500 function descriptions), so each shipped language covers **~12%** (measured count / estimated total). - **Formulas follow the interface language in Spanish, German, Brazilian Portuguese, Russian - and French** (#45): function names (403–459 per language), booleans, errors, table specifiers + and French** (#45): function names (405–471 per language), booleans, errors, table specifiers and separators, at the editor boundary only; files and APIs keep canonical English ([formula-input.md](formula-input.md)). The names come from machine-translated Microsoft pages (two agreeing signals per entry, sources in `crates/formula/src/input/`); only the French @@ -82,6 +82,7 @@ language (none so far) and of localized function names. | Date | Change | Summary | |---|---|---| +| 2026-10-14 | minor | Later functions in the German, Spanish, Brazilian Portuguese and Russian formula tables (bond functions with an odd first or last period, `FORECAST.ETS*`, `PERCENTOF`, `TRIMRANGE`, `BAHTTEXT`, `USDOLLAR`, `CONVERTEREURO`), each from a Microsoft page plus an independent reference: 413, 434, 420 and 471 names. Brazilian `REGEXTEST`/`REGEXREPLACE` stay English as in Brazilian Excel, and `REPLACEB` is `SUBSTITUIRB`, not the guessed `MUDARB` | | 2026-10-13 | minor | French formula table: 405 local function names, `VRAI`/`FAUX`, French errors and table specifiers, `.` between array columns; separators and some names checked in French Excel 2013 and 2024 (#191) | | 2026-10-12 | minor | Format Cells looks up its tabs, labels, options and note through `Language::tr` (Fill tab keyed `Format Cells\|Fill`); dialog titles and OK/Cancel too. Labels already in a table (Number, Currency, Fill…) show translated; the rest fall back to English until the tables add them | | 2026-10-12 | minor | Brazilian Portuguese catalog (`i18n/pt.rs`) grows from 377 to 923 entries: every key the other catalogs translate, including the dialog strings #669 starts looking up (~42%) | From 6cdbcd7a02e448e6fb8694d6d93cb2dc849f99d5 Mon Sep 17 00:00:00 2001 From: quantmind-br Date: Wed, 14 Oct 2026 21:15:46 -0300 Subject: [PATCH 5/7] M12: French names retested in Excel 2024 RedDevilMan retested 13 French names in French Excel 2024 (#443): PRENDRE, EXCLURE, ETENDRE, DANSCOL, ORGA.COLS, CENTILE.EXCLURE, PREVISION.LINEAIRE, FILTRE, RECHERCHEX, TROUVERB, CHERCHERB, LENB and URLENCODAGE all work. Record them in fr.rs and the French tests, with the separators that Excel took from its Windows region. --- crates/formula/src/input/fr.rs | 5 +++++ crates/formula/tests/localized_input.rs | 14 +++++++++++++- docs/formula-input.md | 4 ++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/crates/formula/src/input/fr.rs b/crates/formula/src/input/fr.rs index 6e692e350..e873e2bbb 100644 --- a/crates/formula/src/input/fr.rs +++ b/crates/formula/src/input/fr.rs @@ -16,6 +16,11 @@ //! `TROUVE`, `STXT`, `STXTB`, `NBCAR`, `ESTNUM`, `EST.IMPAIR`, `ESTREF`, `ESTTEXTE`, //! `FRACTIONNER.TEXTE`, `VAR.P.N`, `VAR.P`, `PHONETIQUE` and `SI.CONDITIONS` exist; `NBCARB`, //! `CHERCHEB` and `TROUVEB` give `#NOM?` (the names below are `LENB`, `CHERCHERB`, `TROUVERB`). +//! Retested in the same Excel (https://github.com/storytold/gridcraft/pull/443#issuecomment-6181287747): +//! `PRENDRE`, `EXCLURE`, `ETENDRE`, `DANSCOL`, `ORGA.COLS`, `CENTILE.EXCLURE`, `PREVISION.LINEAIRE`, +//! `FILTRE`, `RECHERCHEX`, `TROUVERB`, `CHERCHERB`, `LENB` and `URLENCODAGE` work. That Excel takes +//! `,` between arguments and `.` as the decimal, from its Windows regional format ("English +//! (Europe)", system separators on), not from the French interface. //! //! Sources for the other words: //! - bool: https://support.microsoft.com/fr-fr/excel/functions/true-function | https://support.microsoft.com/fr-fr/excel/functions/false-function diff --git a/crates/formula/tests/localized_input.rs b/crates/formula/tests/localized_input.rs index 64e94f574..810c88a72 100644 --- a/crates/formula/tests/localized_input.rs +++ b/crates/formula/tests/localized_input.rs @@ -35,8 +35,20 @@ fn each_language_spells_formulas_like_its_excel() { (Fr, "LIGNES(Tableau1[#Tout])-LIGNES(Tableau1[[#En-têtes];[Nom]])", "ROWS(Tableau1[#All])-ROWS(Tableau1[[#Headers],[Nom]])"), (Fr, "SI(VRAI;RECHERCHEV(A2;D:E;2;FAUX);#N/A)", "IF(TRUE,VLOOKUP(A2,D:E,2,FALSE),#N/A)"), (Fr, "SOMME({1.2;3,5.4})+SIERREUR(1/0;#VALEUR!)", "SUM({1,2;3.5,4})+IFERROR(1/0,#VALUE!)"), - // French Excel 2024 (#191): STXTB exists, NBCARB/CHERCHEB/TROUVEB are #NOM?. + // French Excel 2024 (#191, #443): STXTB exists, NBCARB/CHERCHEB/TROUVEB are #NOM?, and the + // names below were retested there with that Excel's region separators. (Fr, "STXTB(A1;2;1)&CHERCHERB(\"b\";A1)&TROUVERB(\"b\";A1)&LENB(A1)", "MIDB(A1,2,1)&SEARCHB(\"b\",A1)&FINDB(\"b\",A1)&LENB(A1)"), + ( + Fr, + "SOMME(PRENDRE(A1:A6;2);EXCLURE(A1:A6;4);ETENDRE(A1:A2;3;1;0);DANSCOL(A1:A6);ORGA.COLS(A1:A6;3))", + "SUM(TAKE(A1:A6,2),DROP(A1:A6,4),EXPAND(A1:A2,3,1,0),TOCOL(A1:A6),WRAPCOLS(A1:A6,3))", + ), + ( + Fr, + "CENTILE.EXCLURE(A1:A6;0,5)+PREVISION.LINEAIRE(7;A1:A6;A1:A6)+SOMME(FILTRE(A1:A6;A1:A6>4))+RECHERCHEX(3;A1:A6;A1:A6)", + "PERCENTILE.EXC(A1:A6,0.5)+FORECAST.LINEAR(7,A1:A6,A1:A6)+SUM(FILTER(A1:A6,A1:A6>4))+XLOOKUP(3,A1:A6,A1:A6)", + ), + (Fr, "URLENCODAGE(\"a b\")", "ENCODEURL(\"a b\")"), ] { assert_eq!(canonical(local, locale), english, "{locale:?} entry"); assert_eq!(shown(english, locale), local, "{locale:?} display"); diff --git a/docs/formula-input.md b/docs/formula-input.md index 45067e1cd..df99c2a99 100644 --- a/docs/formula-input.md +++ b/docs/formula-input.md @@ -64,8 +64,8 @@ sometimes wrong, so an entry needs two agreeing signals on its page (title, desc paragraph aligned with the English page, examples); entries marked `reviewed` were decided by hand against independent function-name references. Booleans, errors and table specifiers cite their sources per item. A French user checked the French separators, `SOMME`, `TEXTE`, -`AUJOURDHUI`, `LIGNES`, `#VALEUR!` and four table specifiers in French Excel 2013, and 16 more -function names in French Excel 2024, three of which were wrong and are fixed (#191). Functions +`AUJOURDHUI`, `LIGNES`, `#VALEUR!` and four table specifiers in French Excel 2013, and 29 more +function names in French Excel 2024, three of which were wrong and are fixed (#191, #443). Functions added to Excel after the tables were first built (the irregular-period bond functions, the `FORECAST.ETS` family, `PERCENTOF`, `TRIMRANGE`…) were checked name by name against a Microsoft page and a non-Microsoft reference in each language; where they disagree the function keeps its From af114aa14ed444dbcef2421172cf830ce6641b90 Mon Sep 17 00:00:00 2001 From: quantmind-br Date: Wed, 14 Oct 2026 21:47:48 -0300 Subject: [PATCH 6/7] M12: nine more French names checked in Excel 2024 RedDevilMan checked ESTVIDE, ESTERR, ESTERREUR, ESTLOGIQUE, ESTNA, ESTNONTEXTE, NON, ORGA.LIGNES and BDLIRE in French Excel 2024 (#443): all work. Record them, and that TEXTE format codes followed that Excel's English region (dd/mm/yyyy works, jj/mm/aaaa is #VALEUR!). --- crates/formula/src/input/fr.rs | 7 ++++++- crates/formula/tests/localized_input.rs | 6 ++++++ docs/formula-input.md | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/formula/src/input/fr.rs b/crates/formula/src/input/fr.rs index e873e2bbb..9cbc3d7a1 100644 --- a/crates/formula/src/input/fr.rs +++ b/crates/formula/src/input/fr.rs @@ -20,7 +20,12 @@ //! `PRENDRE`, `EXCLURE`, `ETENDRE`, `DANSCOL`, `ORGA.COLS`, `CENTILE.EXCLURE`, `PREVISION.LINEAIRE`, //! `FILTRE`, `RECHERCHEX`, `TROUVERB`, `CHERCHERB`, `LENB` and `URLENCODAGE` work. That Excel takes //! `,` between arguments and `.` as the decimal, from its Windows regional format ("English -//! (Europe)", system separators on), not from the French interface. +//! (Europe)", system separators on), not from the French interface. So does `TEXTE`: there +//! `"dd/mm/yyyy"` works and `"jj/mm/aaaa"` is `#VALEUR!`, the reverse of Excel 2013 with a French +//! region; format codes inside strings are never translated here. +//! Also checked there (https://github.com/storytold/gridcraft/pull/443#issuecomment-6181684117): +//! `ESTVIDE`, `ESTERR`, `ESTERREUR`, `ESTLOGIQUE`, `ESTNA`, `ESTNONTEXTE`, `NON`, `ORGA.LIGNES` and +//! `BDLIRE`. //! //! Sources for the other words: //! - bool: https://support.microsoft.com/fr-fr/excel/functions/true-function | https://support.microsoft.com/fr-fr/excel/functions/false-function diff --git a/crates/formula/tests/localized_input.rs b/crates/formula/tests/localized_input.rs index 810c88a72..c3c443bfb 100644 --- a/crates/formula/tests/localized_input.rs +++ b/crates/formula/tests/localized_input.rs @@ -49,6 +49,12 @@ fn each_language_spells_formulas_like_its_excel() { "PERCENTILE.EXC(A1:A6,0.5)+FORECAST.LINEAR(7,A1:A6,A1:A6)+SUM(FILTER(A1:A6,A1:A6>4))+XLOOKUP(3,A1:A6,A1:A6)", ), (Fr, "URLENCODAGE(\"a b\")", "ENCODEURL(\"a b\")"), + ( + Fr, + "ET(ESTVIDE(Z1);ESTERR(1/0);ESTERREUR(1/0);ESTLOGIQUE(VRAI);ESTNA(#N/A);ESTNONTEXTE(1);NON(FAUX))", + "AND(ISBLANK(Z1),ISERR(1/0),ISERROR(1/0),ISLOGICAL(TRUE),ISNA(#N/A),ISNONTEXT(1),NOT(FALSE))", + ), + (Fr, "ORGA.LIGNES(A1:A6;3)+BDLIRE(F1:G3;\"b\";I1:I2)", "WRAPROWS(A1:A6,3)+DGET(F1:G3,\"b\",I1:I2)"), ] { assert_eq!(canonical(local, locale), english, "{locale:?} entry"); assert_eq!(shown(english, locale), local, "{locale:?} display"); diff --git a/docs/formula-input.md b/docs/formula-input.md index df99c2a99..c2a3dc933 100644 --- a/docs/formula-input.md +++ b/docs/formula-input.md @@ -64,7 +64,7 @@ sometimes wrong, so an entry needs two agreeing signals on its page (title, desc paragraph aligned with the English page, examples); entries marked `reviewed` were decided by hand against independent function-name references. Booleans, errors and table specifiers cite their sources per item. A French user checked the French separators, `SOMME`, `TEXTE`, -`AUJOURDHUI`, `LIGNES`, `#VALEUR!` and four table specifiers in French Excel 2013, and 29 more +`AUJOURDHUI`, `LIGNES`, `#VALEUR!` and four table specifiers in French Excel 2013, and 38 more function names in French Excel 2024, three of which were wrong and are fixed (#191, #443). Functions added to Excel after the tables were first built (the irregular-period bond functions, the `FORECAST.ETS` family, `PERCENTOF`, `TRIMRANGE`…) were checked name by name against a Microsoft From 79ec0281ab64cf8a5fc4b6266d2fef86fb71a1fd Mon Sep 17 00:00:00 2001 From: quantmind-br Date: Wed, 14 Oct 2026 22:23:50 -0300 Subject: [PATCH 7/7] M12: French separators and TEXTE codes switch with the region RedDevilMan switched only the Windows regional format of his French Excel 2024 to French (France) (#443): =SOMME(1,5;2) is 3,5, =COLONNES({1.2.3}) is 3, confirming . between array columns, and TEXTE takes jj/mm/aaaa and refuses dd/mm/yyyy. --- crates/formula/src/input/fr.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/formula/src/input/fr.rs b/crates/formula/src/input/fr.rs index 9cbc3d7a1..86d615311 100644 --- a/crates/formula/src/input/fr.rs +++ b/crates/formula/src/input/fr.rs @@ -21,8 +21,11 @@ //! `FILTRE`, `RECHERCHEX`, `TROUVERB`, `CHERCHERB`, `LENB` and `URLENCODAGE` work. That Excel takes //! `,` between arguments and `.` as the decimal, from its Windows regional format ("English //! (Europe)", system separators on), not from the French interface. So does `TEXTE`: there -//! `"dd/mm/yyyy"` works and `"jj/mm/aaaa"` is `#VALEUR!`, the reverse of Excel 2013 with a French -//! region; format codes inside strings are never translated here. +//! `"dd/mm/yyyy"` works and `"jj/mm/aaaa"` is `#VALEUR!`; format codes inside strings are never +//! translated here. With only the regional format switched to French (France) +//! (https://github.com/storytold/gridcraft/pull/443#issuecomment-6182189162), the same Excel gives +//! `=SOMME(1,5;2)` 3,5, `=COLONNES({1.2.3})` 3 (`.` between array columns), `=INDEX({1.2;3.4,1};2;2)` +//! 4,1, and `TEXTE` takes `"jj/mm/aaaa"` and refuses `"dd/mm/yyyy"`. //! Also checked there (https://github.com/storytold/gridcraft/pull/443#issuecomment-6181684117): //! `ESTVIDE`, `ESTERR`, `ESTERREUR`, `ESTLOGIQUE`, `ESTNA`, `ESTNONTEXTE`, `NON`, `ORGA.LIGNES` and //! `BDLIRE`.