diff --git a/src/utils/formulasTranslater.json b/src/utils/formulasTranslater.json new file mode 100644 index 00000000..3d6872af --- /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..f5851397 100644 --- a/src/utils/internal.js +++ b/src/utils/internal.js @@ -9,7 +9,8 @@ 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; @@ -105,6 +106,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 +226,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 +280,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) {