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;
 }

Reply via email to