formula/source/core/api/FormulaCompiler.cxx |   14 ++++++++++++--
 include/formula/FormulaCompiler.hxx         |   16 +++++++++++-----
 sc/source/core/tool/compiler.cxx            |    8 ++++----
 3 files changed, 27 insertions(+), 11 deletions(-)

New commits:
commit fdc28c4b2b42c2028f3a6bf7cfc18c94ee072969
Author:     Eike Rathke <[email protected]>
AuthorDate: Sun Jan 1 15:35:16 2023 +0100
Commit:     Mike Kaganski <[email protected]>
CommitDate: Wed Jan 11 16:31:06 2023 +0000

    Resolves: tdf#151886 Use default locale with English function names again
    
    Automatically switching to en-US locale when using English
    function names caused too much confusion. There also might be the
    possibility that the '.' dot decimal separator clashes with the
    inline array column separator in some locales.
    
    A proper solution would make this user-specified and if set also
    adjust the separators to the common English ones. For now keep the
    default locale again as it previously was the case.
    
    Change-Id: Ic4712c6609c14f35cf0d1d842ac7443806a6e115
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144924
    Reviewed-by: Eike Rathke <[email protected]>
    Tested-by: Jenkins
    (cherry picked from commit cf8cfee9d4e64dba6a14dde16f08a7699fdff863)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144906
    Reviewed-by: Mike Kaganski <[email protected]>

diff --git a/formula/source/core/api/FormulaCompiler.cxx 
b/formula/source/core/api/FormulaCompiler.cxx
index 192cb56173fc..b39e618a5b1e 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -1313,7 +1313,17 @@ void FormulaCompiler::OpCodeMap::copyFrom( const 
OpCodeMap& r )
         maExternalHashMap = r.maExternalHashMap;
         maReverseExternalHashMap = r.maReverseExternalHashMap;
         mbCore = r.mbCore;
-        mbEnglish = r.mbEnglish;
+        if (mbEnglish != r.mbEnglish)
+        {
+            // For now keep mbEnglishLocale setting, which is false for a
+            // non-English native map we're copying to.
+            /* TODO:
+            if (!mbEnglish && r.mbEnglish)
+                mbEnglishLocale = "getUseEnglishLocaleFromConfiguration()";
+            or set from outside i.e. via ScCompiler.
+            */
+            mbEnglish = r.mbEnglish;
+        }
     }
 }
 
@@ -2644,7 +2654,7 @@ const FormulaToken* 
FormulaCompiler::CreateStringFromToken( OUStringBuffer& rBuf
 
 void FormulaCompiler::AppendDouble( OUStringBuffer& rBuffer, double fVal ) 
const
 {
-    if ( mxSymbols->isEnglish() )
+    if ( mxSymbols->isEnglishLocale() )
     {
         ::rtl::math::doubleToUStringBuffer( rBuffer, fVal,
                 rtl_math_StringFormat_Automatic,
diff --git a/include/formula/FormulaCompiler.hxx 
b/include/formula/FormulaCompiler.hxx
index d94dbd40d399..08710f561b5a 100644
--- a/include/formula/FormulaCompiler.hxx
+++ b/include/formula/FormulaCompiler.hxx
@@ -83,12 +83,13 @@ public:
     {
         OpCodeHashMap           maHashMap;                  /// Hash map of 
symbols, OUString -> OpCode
         std::unique_ptr<OUString[]> mpTable;                /// Array of 
symbols, OpCode -> OUString, offset==OpCode
-        ExternalHashMap         maExternalHashMap;         /// Hash map of 
ocExternal, Filter String -> AddIn String
-        ExternalHashMap         maReverseExternalHashMap;  /// Hash map of 
ocExternal, AddIn String -> Filter String
+        ExternalHashMap         maExternalHashMap;          /// Hash map of 
ocExternal, Filter String -> AddIn String
+        ExternalHashMap         maReverseExternalHashMap;   /// Hash map of 
ocExternal, AddIn String -> Filter String
         FormulaGrammar::Grammar meGrammar;                  /// Grammar, 
language and reference convention
         sal_uInt16              mnSymbols;                  /// Count of 
OpCode symbols
-        bool                    mbCore      : 1;            /// If mapping was 
setup by core, not filters
-        bool                    mbEnglish   : 1;            /// If English 
symbols and external names
+        bool                    mbCore          : 1;        /// If mapping was 
setup by core, not filters
+        bool                    mbEnglish       : 1;        /// If English 
symbols and external names
+        bool                    mbEnglishLocale : 1;        /// If English 
locale for numbers
 
         OpCodeMap( const OpCodeMap& ) = delete;
         OpCodeMap& operator=( const OpCodeMap& ) = delete;
@@ -101,7 +102,8 @@ public:
             meGrammar( eGrammar),
             mnSymbols( nSymbols),
             mbCore( bCore),
-            mbEnglish ( FormulaGrammar::isEnglish(eGrammar) )
+            mbEnglish ( FormulaGrammar::isEnglish(eGrammar) ),
+            mbEnglishLocale ( mbEnglish )
         {
         }
 
@@ -145,6 +147,10 @@ public:
             be English as well)? */
         bool isEnglish() const { return mbEnglish; }
 
+        /** Are inline numbers parsed/formatted in en-US locale, as opposed
+            to default locale? */
+        bool isEnglishLocale() const { return mbEnglishLocale; }
+
         /// Is it an ODF 1.1 compatibility mapping?
         bool isPODF() const { return FormulaGrammar::isPODF( meGrammar); }
 
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 1180c559881b..cdb7dedff68e 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -2156,8 +2156,8 @@ std::vector<ScCompiler::Whitespace> 
ScCompiler::NextSymbol(bool bInArray)
     sal_Unicode cSep = mxSymbols->getSymbolChar( ocSep);
     sal_Unicode cArrayColSep = mxSymbols->getSymbolChar( ocArrayColSep);
     sal_Unicode cArrayRowSep = mxSymbols->getSymbolChar( ocArrayRowSep);
-    sal_Unicode cDecSep = (mxSymbols->isEnglish() ? '.' : 
ScGlobal::getLocaleData().getNumDecimalSep()[0]);
-    sal_Unicode cDecSepAlt = (mxSymbols->isEnglish() ? 0 : 
ScGlobal::getLocaleData().getNumDecimalSepAlt().toChar());
+    sal_Unicode cDecSep = (mxSymbols->isEnglishLocale() ? '.' : 
ScGlobal::getLocaleData().getNumDecimalSep()[0]);
+    sal_Unicode cDecSepAlt = (mxSymbols->isEnglishLocale() ? 0 : 
ScGlobal::getLocaleData().getNumDecimalSepAlt().toChar());
 
     // special symbols specific to address convention used
     sal_Unicode cSheetPrefix = 
pConv->getSpecialSymbol(ScCompiler::Convention::ABS_SHEET_PREFIX);
@@ -3170,7 +3170,7 @@ bool ScCompiler::ParseValue( const OUString& rSym )
     }
 
     double fVal;
-    sal_uInt32 nIndex = mxSymbols->isEnglish() ? 
mpFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US) : 0;
+    sal_uInt32 nIndex = mxSymbols->isEnglishLocale() ? 
mpFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US) : 0;
 
     if (!mpFormatter->IsNumberFormat(rSym, nIndex, fVal))
         return false;
@@ -3427,7 +3427,7 @@ bool ScCompiler::ParseReference( const OUString& rName, 
const OUString* pErrRef
     mnCurrentSheetTab = -1;
 
     sal_Unicode ch1 = rName[0];
-    sal_Unicode cDecSep = ( mxSymbols->isEnglish() ? '.' : 
ScGlobal::getLocaleData().getNumDecimalSep()[0] );
+    sal_Unicode cDecSep = ( mxSymbols->isEnglishLocale() ? '.' : 
ScGlobal::getLocaleData().getNumDecimalSep()[0] );
     if ( ch1 == cDecSep )
         return false;
     // Code further down checks only if cDecSep=='.' so simply obtaining the

Reply via email to