From dac3b134b3719e5bf669914a91a806dcb7c85e17 Mon Sep 17 00:00:00 2001 From: lhotejc Date: Tue, 2 Sep 2025 22:10:25 +0200 Subject: [PATCH 1/2] Add translating --- src/utils/formulasTranslater.json | 122 ++++++++++++++++++++++++++++++ src/utils/internal.js | 22 +++++- 2 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 src/utils/formulasTranslater.json diff --git a/src/utils/formulasTranslater.json b/src/utils/formulasTranslater.json new file mode 100644 index 00000000..dd571295 --- /dev/null +++ b/src/utils/formulasTranslater.json @@ -0,0 +1,122 @@ +{ + "fr_FR": { + "SOMME": "SUM", + "MOYENNE": "AVERAGE", + "MIN": "MIN", + "MAX": "MAX", + "SI": "IF", + "ET": "AND", + "OU": "OR", + "NON": "NOT", + "NB": "COUNT", + "NBVAL": "COUNTA", + "PRODUIT": "PRODUCT", + "ARRONDI": "ROUND", + "ARRONDI.INF": "ROUNDDOWN", + "ARRONDI.SUP": "ROUNDUP", + "SOMME.SI": "SUMIF", + "SOMME.SI.ENS": "SUMIFS", + "MOYENNE.SI": "AVERAGEIF", + "MOYENNE.SI.ENS": "AVERAGEIFS", + "NB.SI": "COUNTIF", + "NB.SI.ENS": "COUNTIFS", + "CONCATENER": "CONCATENATE", + "CONCAT": "CONCAT", + "TEXTE": "TEXT", + "GAUCHE": "LEFT", + "DROITE": "RIGHT", + "STXT": "MID", + "CHERCHE": "SEARCH", + "TROUVE": "FIND", + "SUBSTITUE": "SUBSTITUTE", + "REMPLACER": "REPLACE", + "MAJUSCULE": "UPPER", + "MINUSCULE": "LOWER", + "NOMPROPRE": "PROPER", + "AUJOURDHUI": "TODAY", + "MAINTENANT": "NOW", + "DATE": "DATE", + "ANNEE": "YEAR", + "MOIS": "MONTH", + "JOUR": "DAY", + "HEURE": "HOUR", + "MINUTE": "MINUTE", + "SECONDE": "SECOND", + "ABS": "ABS", + "MOD": "MOD", + "PUISSANCE": "POWER", + "RANG": "RANK", + "ALEA": "RAND", + "ALEA.ENTRE.BORNES": "RANDBETWEEN", + "SIERREUR": "IFERROR", + "ESTERREUR": "ISERROR", + "ESTNUM": "ISNUMBER", + "ESTTEXTE": "ISTEXT", + "ESTVIDE": "ISBLANK", + "NB.JOURS.OUVRES": "NETWORKDAYS", + "NB.JOURS.OUVRES.INTL": "NETWORKDAYS.INTL", + "JOURSEM": "WEEKDAY", + "NB.JOURS": "DAYS", + "NB.JOURS360": "DAYS360" + }, + "es_ES": { + "SUMA": "SUM", + "PROMEDIO": "AVERAGE", + "MIN": "MIN", + "MAX": "MAX", + "SI": "IF", + "Y": "AND", + "O": "OR", + "NO": "NOT", + "CONTAR": "COUNT", + "CONTARA": "COUNTA", + "PRODUCTO": "PRODUCT", + "REDONDEAR": "ROUND", + "REDONDEAR.MENOS": "ROUNDDOWN", + "REDONDEAR.MAS": "ROUNDUP", + "SUMAR.SI": "SUMIF", + "SUMAR.SI.CONJUNTO": "SUMIFS", + "PROMEDIO.SI": "AVERAGEIF", + "PROMEDIO.SI.CONJUNTO": "AVERAGEIFS", + "CONTAR.SI": "COUNTIF", + "CONTAR.SI.CONJUNTO": "COUNTIFS", + "CONCATENAR": "CONCATENATE", + "CONCAT": "CONCAT", + "TEXTO": "TEXT", + "IZQUIERDA": "LEFT", + "DERECHA": "RIGHT", + "EXTRAE": "MID", + "HALLAR": "SEARCH", + "ENCONTRAR": "FIND", + "SUSTITUIR": "SUBSTITUTE", + "REEMPLAZAR": "REPLACE", + "MAYUSC": "UPPER", + "MINUSC": "LOWER", + "NOMPROPIO": "PROPER", + "HOY": "TODAY", + "AHORA": "NOW", + "FECHA": "DATE", + "AÑO": "YEAR", + "MES": "MONTH", + "DIA": "DAY", + "HORA": "HOUR", + "MINUTO": "MINUTE", + "SEGUNDO": "SECOND", + "ABS": "ABS", + "RESIDUO": "MOD", + "POTENCIA": "POWER", + "JERARQUIA": "RANK", + "ALEATORIO": "RAND", + "ALEATORIO.ENTRE": "RANDBETWEEN", + "SI.ERROR": "IFERROR", + "ESERROR": "ISERROR", + "ESNUMERO": "ISNUMBER", + "ESTEXTO": "ISTEXT", + "ESBLANCO": "ISBLANK", + "DIAS.LAB": "NETWORKDAYS", + "DIAS.LAB.INTL": "NETWORKDAYS.INTL", + "DIASEM": "WEEKDAY", + "DIAS": "DAYS", + "DIAS360": "DAYS360" + } +} diff --git a/src/utils/internal.js b/src/utils/internal.js index f84317f0..f1334de8 100644 --- a/src/utils/internal.js +++ b/src/utils/internal.js @@ -9,7 +9,9 @@ import { getFreezeWidth } from './freeze.js'; import { updatePagination } from './pagination.js'; import { setFooter } from './footer.js'; import { getColumnNameFromId, getIdFromColumnName } from './internalHelpers.js'; - +import formulasTranslater from './formulasTranslater.json'; +const locale = + (navigator.language || navigator.userLanguage).replace("-", "_") || "en_US"; export const updateTable = function () { const obj = this; @@ -71,6 +73,7 @@ export const updateTable = function () { }, 0); }; + /** * Trying to extract a number from a string */ @@ -105,6 +108,19 @@ const parseNumber = function (value, columnNumber) { return value; }; +/** + * Use a dictionary to translate formula names + * @param {} formula + * @returns + */ +function translateFormula(formula) { + const dict = formulasTranslater[locale] || {}; + return formula.replace(/^=([A-ZÉÈÀÙÂÊÎÔÛÇ]+)\s*\(/i, function (match, p1) { + const fn = dict[p1.toUpperCase()]; + return fn ? "=" + fn + "(" : match; + }); +} + /** * Parse formulas */ @@ -212,7 +228,7 @@ export const executeFormula = function (expression, x, y) { if (typeof formulaResults[tokens[i]] !== 'undefined') { value = formulaResults[tokens[i]]; } else { - value = execute(value, position[0], position[1]); + value = execute(translateFormula(value), position[0], position[1]); formulaResults[tokens[i]] = value; } } @@ -266,7 +282,7 @@ export const executeFormula = function (expression, x, y) { } }; - return execute(expression, x, y); + return execute(translateFormula(expression), x, y); }; export const parseValue = function (i, j, value, cell) { From 568bb7c63152738b20b784cdadf12c9d3aac75a4 Mon Sep 17 00:00:00 2001 From: lhotejc Date: Tue, 2 Sep 2025 22:28:31 +0200 Subject: [PATCH 2/2] lint + format --- src/utils/formulasTranslater.json | 240 +++++++++++++++--------------- src/utils/internal.js | 14 +- 2 files changed, 126 insertions(+), 128 deletions(-) diff --git a/src/utils/formulasTranslater.json b/src/utils/formulasTranslater.json index dd571295..3d6872af 100644 --- a/src/utils/formulasTranslater.json +++ b/src/utils/formulasTranslater.json @@ -1,122 +1,122 @@ { - "fr_FR": { - "SOMME": "SUM", - "MOYENNE": "AVERAGE", - "MIN": "MIN", - "MAX": "MAX", - "SI": "IF", - "ET": "AND", - "OU": "OR", - "NON": "NOT", - "NB": "COUNT", - "NBVAL": "COUNTA", - "PRODUIT": "PRODUCT", - "ARRONDI": "ROUND", - "ARRONDI.INF": "ROUNDDOWN", - "ARRONDI.SUP": "ROUNDUP", - "SOMME.SI": "SUMIF", - "SOMME.SI.ENS": "SUMIFS", - "MOYENNE.SI": "AVERAGEIF", - "MOYENNE.SI.ENS": "AVERAGEIFS", - "NB.SI": "COUNTIF", - "NB.SI.ENS": "COUNTIFS", - "CONCATENER": "CONCATENATE", - "CONCAT": "CONCAT", - "TEXTE": "TEXT", - "GAUCHE": "LEFT", - "DROITE": "RIGHT", - "STXT": "MID", - "CHERCHE": "SEARCH", - "TROUVE": "FIND", - "SUBSTITUE": "SUBSTITUTE", - "REMPLACER": "REPLACE", - "MAJUSCULE": "UPPER", - "MINUSCULE": "LOWER", - "NOMPROPRE": "PROPER", - "AUJOURDHUI": "TODAY", - "MAINTENANT": "NOW", - "DATE": "DATE", - "ANNEE": "YEAR", - "MOIS": "MONTH", - "JOUR": "DAY", - "HEURE": "HOUR", - "MINUTE": "MINUTE", - "SECONDE": "SECOND", - "ABS": "ABS", - "MOD": "MOD", - "PUISSANCE": "POWER", - "RANG": "RANK", - "ALEA": "RAND", - "ALEA.ENTRE.BORNES": "RANDBETWEEN", - "SIERREUR": "IFERROR", - "ESTERREUR": "ISERROR", - "ESTNUM": "ISNUMBER", - "ESTTEXTE": "ISTEXT", - "ESTVIDE": "ISBLANK", - "NB.JOURS.OUVRES": "NETWORKDAYS", - "NB.JOURS.OUVRES.INTL": "NETWORKDAYS.INTL", - "JOURSEM": "WEEKDAY", - "NB.JOURS": "DAYS", - "NB.JOURS360": "DAYS360" - }, - "es_ES": { - "SUMA": "SUM", - "PROMEDIO": "AVERAGE", - "MIN": "MIN", - "MAX": "MAX", - "SI": "IF", - "Y": "AND", - "O": "OR", - "NO": "NOT", - "CONTAR": "COUNT", - "CONTARA": "COUNTA", - "PRODUCTO": "PRODUCT", - "REDONDEAR": "ROUND", - "REDONDEAR.MENOS": "ROUNDDOWN", - "REDONDEAR.MAS": "ROUNDUP", - "SUMAR.SI": "SUMIF", - "SUMAR.SI.CONJUNTO": "SUMIFS", - "PROMEDIO.SI": "AVERAGEIF", - "PROMEDIO.SI.CONJUNTO": "AVERAGEIFS", - "CONTAR.SI": "COUNTIF", - "CONTAR.SI.CONJUNTO": "COUNTIFS", - "CONCATENAR": "CONCATENATE", - "CONCAT": "CONCAT", - "TEXTO": "TEXT", - "IZQUIERDA": "LEFT", - "DERECHA": "RIGHT", - "EXTRAE": "MID", - "HALLAR": "SEARCH", - "ENCONTRAR": "FIND", - "SUSTITUIR": "SUBSTITUTE", - "REEMPLAZAR": "REPLACE", - "MAYUSC": "UPPER", - "MINUSC": "LOWER", - "NOMPROPIO": "PROPER", - "HOY": "TODAY", - "AHORA": "NOW", - "FECHA": "DATE", - "AÑO": "YEAR", - "MES": "MONTH", - "DIA": "DAY", - "HORA": "HOUR", - "MINUTO": "MINUTE", - "SEGUNDO": "SECOND", - "ABS": "ABS", - "RESIDUO": "MOD", - "POTENCIA": "POWER", - "JERARQUIA": "RANK", - "ALEATORIO": "RAND", - "ALEATORIO.ENTRE": "RANDBETWEEN", - "SI.ERROR": "IFERROR", - "ESERROR": "ISERROR", - "ESNUMERO": "ISNUMBER", - "ESTEXTO": "ISTEXT", - "ESBLANCO": "ISBLANK", - "DIAS.LAB": "NETWORKDAYS", - "DIAS.LAB.INTL": "NETWORKDAYS.INTL", - "DIASEM": "WEEKDAY", - "DIAS": "DAYS", - "DIAS360": "DAYS360" - } + "fr_FR": { + "SOMME": "SUM", + "MOYENNE": "AVERAGE", + "MIN": "MIN", + "MAX": "MAX", + "SI": "IF", + "ET": "AND", + "OU": "OR", + "NON": "NOT", + "NB": "COUNT", + "NBVAL": "COUNTA", + "PRODUIT": "PRODUCT", + "ARRONDI": "ROUND", + "ARRONDI.INF": "ROUNDDOWN", + "ARRONDI.SUP": "ROUNDUP", + "SOMME.SI": "SUMIF", + "SOMME.SI.ENS": "SUMIFS", + "MOYENNE.SI": "AVERAGEIF", + "MOYENNE.SI.ENS": "AVERAGEIFS", + "NB.SI": "COUNTIF", + "NB.SI.ENS": "COUNTIFS", + "CONCATENER": "CONCATENATE", + "CONCAT": "CONCAT", + "TEXTE": "TEXT", + "GAUCHE": "LEFT", + "DROITE": "RIGHT", + "STXT": "MID", + "CHERCHE": "SEARCH", + "TROUVE": "FIND", + "SUBSTITUE": "SUBSTITUTE", + "REMPLACER": "REPLACE", + "MAJUSCULE": "UPPER", + "MINUSCULE": "LOWER", + "NOMPROPRE": "PROPER", + "AUJOURDHUI": "TODAY", + "MAINTENANT": "NOW", + "DATE": "DATE", + "ANNEE": "YEAR", + "MOIS": "MONTH", + "JOUR": "DAY", + "HEURE": "HOUR", + "MINUTE": "MINUTE", + "SECONDE": "SECOND", + "ABS": "ABS", + "MOD": "MOD", + "PUISSANCE": "POWER", + "RANG": "RANK", + "ALEA": "RAND", + "ALEA.ENTRE.BORNES": "RANDBETWEEN", + "SIERREUR": "IFERROR", + "ESTERREUR": "ISERROR", + "ESTNUM": "ISNUMBER", + "ESTTEXTE": "ISTEXT", + "ESTVIDE": "ISBLANK", + "NB.JOURS.OUVRES": "NETWORKDAYS", + "NB.JOURS.OUVRES.INTL": "NETWORKDAYS.INTL", + "JOURSEM": "WEEKDAY", + "NB.JOURS": "DAYS", + "NB.JOURS360": "DAYS360" + }, + "es_ES": { + "SUMA": "SUM", + "PROMEDIO": "AVERAGE", + "MIN": "MIN", + "MAX": "MAX", + "SI": "IF", + "Y": "AND", + "O": "OR", + "NO": "NOT", + "CONTAR": "COUNT", + "CONTARA": "COUNTA", + "PRODUCTO": "PRODUCT", + "REDONDEAR": "ROUND", + "REDONDEAR.MENOS": "ROUNDDOWN", + "REDONDEAR.MAS": "ROUNDUP", + "SUMAR.SI": "SUMIF", + "SUMAR.SI.CONJUNTO": "SUMIFS", + "PROMEDIO.SI": "AVERAGEIF", + "PROMEDIO.SI.CONJUNTO": "AVERAGEIFS", + "CONTAR.SI": "COUNTIF", + "CONTAR.SI.CONJUNTO": "COUNTIFS", + "CONCATENAR": "CONCATENATE", + "CONCAT": "CONCAT", + "TEXTO": "TEXT", + "IZQUIERDA": "LEFT", + "DERECHA": "RIGHT", + "EXTRAE": "MID", + "HALLAR": "SEARCH", + "ENCONTRAR": "FIND", + "SUSTITUIR": "SUBSTITUTE", + "REEMPLAZAR": "REPLACE", + "MAYUSC": "UPPER", + "MINUSC": "LOWER", + "NOMPROPIO": "PROPER", + "HOY": "TODAY", + "AHORA": "NOW", + "FECHA": "DATE", + "AÑO": "YEAR", + "MES": "MONTH", + "DIA": "DAY", + "HORA": "HOUR", + "MINUTO": "MINUTE", + "SEGUNDO": "SECOND", + "ABS": "ABS", + "RESIDUO": "MOD", + "POTENCIA": "POWER", + "JERARQUIA": "RANK", + "ALEATORIO": "RAND", + "ALEATORIO.ENTRE": "RANDBETWEEN", + "SI.ERROR": "IFERROR", + "ESERROR": "ISERROR", + "ESNUMERO": "ISNUMBER", + "ESTEXTO": "ISTEXT", + "ESBLANCO": "ISBLANK", + "DIAS.LAB": "NETWORKDAYS", + "DIAS.LAB.INTL": "NETWORKDAYS.INTL", + "DIASEM": "WEEKDAY", + "DIAS": "DAYS", + "DIAS360": "DAYS360" + } } diff --git a/src/utils/internal.js b/src/utils/internal.js index f1334de8..f5851397 100644 --- a/src/utils/internal.js +++ b/src/utils/internal.js @@ -10,8 +10,7 @@ import { updatePagination } from './pagination.js'; import { setFooter } from './footer.js'; import { getColumnNameFromId, getIdFromColumnName } from './internalHelpers.js'; import formulasTranslater from './formulasTranslater.json'; -const locale = - (navigator.language || navigator.userLanguage).replace("-", "_") || "en_US"; +const locale = (navigator.language || navigator.userLanguage).replace('-', '_') || 'en_US'; export const updateTable = function () { const obj = this; @@ -73,7 +72,6 @@ export const updateTable = function () { }, 0); }; - /** * Trying to extract a number from a string */ @@ -114,11 +112,11 @@ const parseNumber = function (value, columnNumber) { * @returns */ function translateFormula(formula) { - const dict = formulasTranslater[locale] || {}; - return formula.replace(/^=([A-ZÉÈÀÙÂÊÎÔÛÇ]+)\s*\(/i, function (match, p1) { - const fn = dict[p1.toUpperCase()]; - return fn ? "=" + fn + "(" : match; - }); + const dict = formulasTranslater[locale] || {}; + return formula.replace(/^=([A-ZÉÈÀÙÂÊÎÔÛÇ]+)\s*\(/i, function (match, p1) { + const fn = dict[p1.toUpperCase()]; + return fn ? '=' + fn + '(' : match; + }); } /**