formula/source/core/api/FormulaCompiler.cxx | 61 +++++++++++++++++++++------- 1 file changed, 46 insertions(+), 15 deletions(-)
New commits: commit c94a870f22a59bfce6ea828a0ea12b3ac567548d Author: Jaume Pujantell <jaume.pujant...@collabora.com> AuthorDate: Mon May 20 16:50:34 2024 +0200 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Tue May 21 11:24:07 2024 +0200 lok: translate formula bar functions to each locale On calc the native formula symbols were loaded once on start-up and assumed to not change. This adds a map language to symbols when LOK is active and chooses the correct set of symbols on each call. Change-Id: I821fb3ad4a06d764399e3fdf4a2ec628909312db Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167870 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Jaume Pujantell <jaume.pujant...@collabora.com> (cherry picked from commit 421ef056cf5e991ae3072cd1acb5ef23aa7c780a) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167825 Tested-by: Jenkins diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index e10e8f6a0f95..001430c370da 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -31,6 +31,7 @@ #include <unotools/charclass.hxx> #include <vcl/svapp.hxx> #include <vcl/settings.hxx> +#include <comphelper/lok.hxx> #include <comphelper/processfactory.hxx> #include <com/sun/star/sheet/FormulaOpCodeMapEntry.hpp> #include <com/sun/star/sheet/FormulaMapGroup.hpp> @@ -965,28 +966,58 @@ FormulaCompiler::OpCodeMapPtr FormulaCompiler::CreateOpCodeMap( static bool lcl_fillNativeSymbols( FormulaCompiler::NonConstOpCodeMapPtr& xMap, FormulaCompiler::InitSymbols eWhat = FormulaCompiler::InitSymbols::INIT ) { static OpCodeMapData aSymbolMap; + static std::map<OUString, OpCodeMapData> aLocaleSymbolMap; std::unique_lock aGuard(aSymbolMap.maMtx); - if (eWhat == FormulaCompiler::InitSymbols::ASK) + if (comphelper::LibreOfficeKit::isActive()) { - return bool(aSymbolMap.mxSymbolMap); - } - else if (eWhat == FormulaCompiler::InitSymbols::DESTROY) - { - aSymbolMap.mxSymbolMap.reset(); + OUString langauge = comphelper::LibreOfficeKit::getLanguageTag().getLanguage(); + if (eWhat == FormulaCompiler::InitSymbols::ASK) + { + return aLocaleSymbolMap.contains(langauge) + && bool(aLocaleSymbolMap[langauge].mxSymbolMap); + } + else if (eWhat == FormulaCompiler::InitSymbols::DESTROY) + { + aLocaleSymbolMap[langauge].mxSymbolMap.reset(); + } + else if (!aLocaleSymbolMap[langauge].mxSymbolMap) + { + // Core + aLocaleSymbolMap[langauge].mxSymbolMap = std::make_shared<FormulaCompiler::OpCodeMap>( + SC_OPCODE_LAST_OPCODE_ID + 1, true, FormulaGrammar::GRAM_NATIVE_UI); + OpCodeList aOpCodeListSymbols(RID_STRLIST_FUNCTION_NAMES_SYMBOLS, + aLocaleSymbolMap[langauge].mxSymbolMap); + OpCodeList aOpCodeListNative(RID_STRLIST_FUNCTION_NAMES, + aLocaleSymbolMap[langauge].mxSymbolMap); + // No AddInMap for native core mapping. + } + + xMap = aLocaleSymbolMap[langauge].mxSymbolMap; } - else if (!aSymbolMap.mxSymbolMap) + else { - // Core - aSymbolMap.mxSymbolMap = - std::make_shared<FormulaCompiler::OpCodeMap>( + if (eWhat == FormulaCompiler::InitSymbols::ASK) + { + return bool(aSymbolMap.mxSymbolMap); + } + else if (eWhat == FormulaCompiler::InitSymbols::DESTROY) + { + aSymbolMap.mxSymbolMap.reset(); + } + else if (!aSymbolMap.mxSymbolMap) + { + // Core + aSymbolMap.mxSymbolMap = std::make_shared<FormulaCompiler::OpCodeMap>( SC_OPCODE_LAST_OPCODE_ID + 1, true, FormulaGrammar::GRAM_NATIVE_UI); - OpCodeList aOpCodeListSymbols(RID_STRLIST_FUNCTION_NAMES_SYMBOLS, aSymbolMap.mxSymbolMap); - OpCodeList aOpCodeListNative(RID_STRLIST_FUNCTION_NAMES, aSymbolMap.mxSymbolMap); - // No AddInMap for native core mapping. - } + OpCodeList aOpCodeListSymbols(RID_STRLIST_FUNCTION_NAMES_SYMBOLS, + aSymbolMap.mxSymbolMap); + OpCodeList aOpCodeListNative(RID_STRLIST_FUNCTION_NAMES, aSymbolMap.mxSymbolMap); + // No AddInMap for native core mapping. + } - xMap = aSymbolMap.mxSymbolMap; + xMap = aSymbolMap.mxSymbolMap; + } return true; }