[Libreoffice-commits] core.git: Branch 'libreoffice-6-0' - 2 commits - svl/source
Eike Rathke
erack at redhat.com
Wed Dec 13 11:44:01 UTC 2017
svl/source/numbers/zforlist.cxx | 4
svl/source/numbers/zforscan.cxx | 211 ++++++++++++++++++++++------------------
svl/source/numbers/zforscan.hxx | 12 ++
3 files changed, 134 insertions(+), 93 deletions(-)
New commits:
commit c1293b4fa344096b4de6b8648a0409ca5811eccc
Author: Eike Rathke <erack at redhat.com>
Date: Tue Dec 12 21:13:18 2017 +0100
Resolves: tdf#114185 force KeywordLocalization::LocaleLegacy
... in GetPreviewStringGuess() that is used in Calc TEXT()
spreadsheet function, if the format code didn't resolve as English
or the format code needs to be (re)parsed otherwise as locale
dependent.
Also SvNumberFormatterServiceObj::convertNumberToPreviewString()
(XNumberFormatPreviewer::convertNumberToPreviewString()) if
bAllowEnglish==true.
Change-Id: I7c4b1a610d2bcb20fe0f0ae06efc81f998cae048
(cherry picked from commit b2cd9dd31183c45942c2f522104654ff1f8e6889)
Reviewed-on: https://gerrit.libreoffice.org/46352
Reviewed-by: Eike Rathke <erack at redhat.com>
Tested-by: Eike Rathke <erack at redhat.com>
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index a6e7af89562f..f20c83f57c90 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -1730,6 +1730,8 @@ bool SvNumberFormatter::GetPreviewStringGuess( const OUString& sFormatString,
pEntry->GetFormatstring() ) )
{
// other Format
+ // Force locale's keywords.
+ pFormatScanner->ChangeIntl( ImpSvNumberformatScan::KeywordLocalization::LocaleLegacy );
sTmpString = sFormatString;
pEntry.reset(new SvNumberformat( sTmpString, pFormatScanner,
pStringScanner, nCheckPos, eLnge ));
@@ -1750,6 +1752,8 @@ bool SvNumberFormatter::GetPreviewStringGuess( const OUString& sFormatString,
pEntry2->GetFormatstring() ) )
{
// other Format
+ // Force locale's keywords.
+ pFormatScanner->ChangeIntl( ImpSvNumberformatScan::KeywordLocalization::LocaleLegacy );
sTmpString = sFormatString;
pEntry.reset(new SvNumberformat( sTmpString, pFormatScanner,
pStringScanner, nCheckPos, eLnge ));
commit 4e34b003bc8908e0f9f78e8ed5e84e7a5e42a6ca
Author: Eike Rathke <erack at redhat.com>
Date: Tue Dec 12 20:43:18 2017 +0100
Prepare ImpSvNumberformatScan with KeywordLocalization context, tdf#114185
Change-Id: I3942a7de52bcedf491da83407791fcd0080aaf4d
(cherry picked from commit 482182fd0331a0be371f8f58dc74aa05a68f0a1d)
Reviewed-on: https://gerrit.libreoffice.org/46351
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Eike Rathke <erack at redhat.com>
diff --git a/svl/source/numbers/zforscan.cxx b/svl/source/numbers/zforscan.cxx
index a48063f7df24..ed3edf731096 100644
--- a/svl/source/numbers/zforscan.cxx
+++ b/svl/source/numbers/zforscan.cxx
@@ -111,6 +111,7 @@ ImpSvNumberformatScan::ImpSvNumberformatScan( SvNumberFormatter* pFormatterP )
, eNewLnge(LANGUAGE_DONTKNOW)
, eTmpLnge(LANGUAGE_DONTKNOW)
, nCurrPos(-1)
+ , meKeywordLocalization(KeywordLocalization::AllowEnglish)
{
pFormatter = pFormatterP;
xNFC = css::i18n::NumberFormatMapper::create( pFormatter->GetComponentContext() );
@@ -160,8 +161,9 @@ ImpSvNumberformatScan::~ImpSvNumberformatScan()
Reset();
}
-void ImpSvNumberformatScan::ChangeIntl()
+void ImpSvNumberformatScan::ChangeIntl( KeywordLocalization eKeywordLocalization )
{
+ meKeywordLocalization = eKeywordLocalization;
bKeywordsNeedInit = true;
bCompatCurNeedInit = true;
// may be initialized by InitSpecialKeyword()
@@ -298,7 +300,10 @@ void ImpSvNumberformatScan::SetDependentKeywords()
{
sKeyword[NF_KEY_THAI_T] = sEnglishKeyword[NF_KEY_THAI_T];
}
- if ( eLang.anyOf(
+
+ const bool bL10n = (meKeywordLocalization != KeywordLocalization::EnglishOnly);
+
+ if ( bL10n && eLang.anyOf(
LANGUAGE_GERMAN,
LANGUAGE_GERMAN_SWISS,
LANGUAGE_GERMAN_AUSTRIAN,
@@ -335,7 +340,7 @@ void ImpSvNumberformatScan::SetDependentKeywords()
else
{
// day
- if ( eLang.anyOf(
+ if ( bL10n && eLang.anyOf(
LANGUAGE_ITALIAN,
LANGUAGE_ITALIAN_SWISS))
{
@@ -348,7 +353,7 @@ void ImpSvNumberformatScan::SetDependentKeywords()
sKeyword[NF_KEY_GG] = "XX";
sKeyword[NF_KEY_GGG] = "XXX";
}
- else if ( eLang.anyOf(
+ else if ( bL10n && eLang.anyOf(
LANGUAGE_FRENCH,
LANGUAGE_FRENCH_BELGIAN,
LANGUAGE_FRENCH_CANADIAN,
@@ -361,7 +366,7 @@ void ImpSvNumberformatScan::SetDependentKeywords()
sKeyword[NF_KEY_DDD] = "JJJ";
sKeyword[NF_KEY_DDDD] = "JJJJ";
}
- else if ( eLang == LANGUAGE_FINNISH )
+ else if ( bL10n && eLang == LANGUAGE_FINNISH )
{
sKeyword[NF_KEY_D] = "P";
sKeyword[NF_KEY_DD] = "PP";
@@ -376,7 +381,7 @@ void ImpSvNumberformatScan::SetDependentKeywords()
sKeyword[NF_KEY_DDDD] = sEnglishKeyword[NF_KEY_DDDD];
}
// month
- if ( eLang == LANGUAGE_FINNISH )
+ if ( bL10n && eLang == LANGUAGE_FINNISH )
{
sKeyword[NF_KEY_M] = "K";
sKeyword[NF_KEY_MM] = "KK";
@@ -393,7 +398,7 @@ void ImpSvNumberformatScan::SetDependentKeywords()
sKeyword[NF_KEY_MMMMM] = sEnglishKeyword[NF_KEY_MMMMM];
}
// year
- if ( eLang.anyOf(
+ if ( bL10n && eLang.anyOf(
LANGUAGE_ITALIAN,
LANGUAGE_ITALIAN_SWISS,
LANGUAGE_FRENCH,
@@ -431,14 +436,14 @@ void ImpSvNumberformatScan::SetDependentKeywords()
sKeyword[NF_KEY_AAA] = "OOO";
sKeyword[NF_KEY_AAAA] = "OOOO";
}
- else if ( eLang.anyOf(
+ else if ( bL10n && eLang.anyOf(
LANGUAGE_DUTCH,
LANGUAGE_DUTCH_BELGIAN))
{
sKeyword[NF_KEY_YY] = "JJ";
sKeyword[NF_KEY_YYYY] = "JJJJ";
}
- else if ( eLang == LANGUAGE_FINNISH )
+ else if ( bL10n && eLang == LANGUAGE_FINNISH )
{
sKeyword[NF_KEY_YY] = "VV";
sKeyword[NF_KEY_YYYY] = "VVVV";
@@ -449,14 +454,14 @@ void ImpSvNumberformatScan::SetDependentKeywords()
sKeyword[NF_KEY_YYYY] = sEnglishKeyword[NF_KEY_YYYY];
}
// hour
- if ( eLang.anyOf(
+ if ( bL10n && eLang.anyOf(
LANGUAGE_DUTCH,
LANGUAGE_DUTCH_BELGIAN))
{
sKeyword[NF_KEY_H] = "U";
sKeyword[NF_KEY_HH] = "UU";
}
- else if ( eLang.anyOf(
+ else if ( bL10n && eLang.anyOf(
LANGUAGE_FINNISH,
LANGUAGE_SWEDISH,
LANGUAGE_SWEDISH_FINLAND,
@@ -475,7 +480,7 @@ void ImpSvNumberformatScan::SetDependentKeywords()
}
// boolean
sKeyword[NF_KEY_BOOLEAN] = sEnglishKeyword[NF_KEY_BOOLEAN];
- // colours
+ // colours, *only* localized in German
sKeyword[NF_KEY_COLOR] = sEnglishKeyword[NF_KEY_COLOR];
sKeyword[NF_KEY_BLACK] = sEnglishKeyword[NF_KEY_BLACK];
sKeyword[NF_KEY_BLUE] = sEnglishKeyword[NF_KEY_BLUE];
@@ -523,22 +528,25 @@ Color* ImpSvNumberformatScan::GetColor(OUString& sStr)
{
i++;
}
- LanguageType eLang = pFormatter->GetLocaleData()->getLoadedLanguageTag().getLanguageType( false);
- if ( i >= NF_MAX_DEFAULT_COLORS && eLang.anyOf(
- LANGUAGE_GERMAN,
- LANGUAGE_GERMAN_SWISS,
- LANGUAGE_GERMAN_AUSTRIAN,
- LANGUAGE_GERMAN_LUXEMBOURG,
- LANGUAGE_GERMAN_LIECHTENSTEIN )) // only German use localized color names
+ if (i >= NF_MAX_DEFAULT_COLORS && meKeywordLocalization == KeywordLocalization::AllowEnglish)
{
- size_t j = 0;
- while ( j < NF_MAX_DEFAULT_COLORS && sString != sEnglishKeyword[NF_KEY_FIRSTCOLOR + j] )
- {
- ++j;
- }
- if ( j < NF_MAX_DEFAULT_COLORS )
- {
- i = j;
+ LanguageType eLang = pFormatter->GetLocaleData()->getLoadedLanguageTag().getLanguageType( false);
+ if ( eLang.anyOf(
+ LANGUAGE_GERMAN,
+ LANGUAGE_GERMAN_SWISS,
+ LANGUAGE_GERMAN_AUSTRIAN,
+ LANGUAGE_GERMAN_LUXEMBOURG,
+ LANGUAGE_GERMAN_LIECHTENSTEIN )) // only German uses localized color names
+ {
+ size_t j = 0;
+ while ( j < NF_MAX_DEFAULT_COLORS && sString != sEnglishKeyword[NF_KEY_FIRSTCOLOR + j] )
+ {
+ ++j;
+ }
+ if ( j < NF_MAX_DEFAULT_COLORS )
+ {
+ i = j;
+ }
}
}
@@ -546,18 +554,25 @@ Color* ImpSvNumberformatScan::GetColor(OUString& sStr)
if (i >= NF_MAX_DEFAULT_COLORS)
{
const OUString& rColorWord = rKeyword[NF_KEY_COLOR];
- if (sString.startsWith(rColorWord) || sString.startsWith(sEnglishKeyword[NF_KEY_COLOR]))
+ bool bL10n = true;
+ if ((bL10n = sString.startsWith(rColorWord)) ||
+ ((meKeywordLocalization == KeywordLocalization::AllowEnglish) &&
+ sString.startsWith(sEnglishKeyword[NF_KEY_COLOR])))
{
- sal_Int32 nPos = sString.startsWith(rColorWord) ?
- rColorWord.getLength() :
- sEnglishKeyword[NF_KEY_COLOR].getLength();
+ sal_Int32 nPos = (bL10n ? rColorWord.getLength() : sEnglishKeyword[NF_KEY_COLOR].getLength());
sStr = sStr.copy(nPos);
sStr = comphelper::string::strip(sStr, ' ');
if (bConvertMode)
{
+ /* TODO: this is awkward, only German has colors translated, so
+ * actually we'd need to convert only between German and any
+ * other and vice versa, and only the word COLOR <-> FARBE
+ * without all the locale switching mumbo jumbo. */
+ KeywordLocalization eSaveKL = meKeywordLocalization; // gets overwritten by ChangeIntl()
pFormatter->ChangeIntl(eNewLnge);
sStr = GetKeywords()[NF_KEY_COLOR] + sStr; // Color -> FARBE
pFormatter->ChangeIntl(eTmpLnge);
+ meKeywordLocalization = eSaveKL;
}
else
{
@@ -581,9 +596,15 @@ Color* ImpSvNumberformatScan::GetColor(OUString& sStr)
sStr.clear();
if (bConvertMode)
{
+ /* TODO: this is awkward, only German has colors translated, so
+ * actually we'd need to convert only between German and any
+ * other and vice versa, and only the few color words
+ * without all the locale switching mumbo jumbo. */
+ KeywordLocalization eSaveKL = meKeywordLocalization; // gets overwritten by ChangeIntl()
pFormatter->ChangeIntl(eNewLnge);
sStr = GetKeywords()[NF_KEY_FIRSTCOLOR+i]; // red -> rot
pFormatter->ChangeIntl(eTmpLnge);
+ meKeywordLocalization = eSaveKL;
}
else
{
@@ -599,7 +620,9 @@ short ImpSvNumberformatScan::GetKeyWord( const OUString& sSymbol, sal_Int32 nPos
OUString sString = pFormatter->GetCharClass()->uppercase( sSymbol, nPos, sSymbol.getLength() - nPos );
const NfKeywordTable & rKeyword = GetKeywords();
// #77026# for the Xcl perverts: the GENERAL keyword is recognized anywhere
- if ( sString.startsWith( rKeyword[NF_KEY_GENERAL] ) || sString.startsWith( sEnglishKeyword[NF_KEY_GENERAL] ) )
+ if ( sString.startsWith( rKeyword[NF_KEY_GENERAL] ) ||
+ ((meKeywordLocalization == KeywordLocalization::AllowEnglish) &&
+ sString.startsWith( sEnglishKeyword[NF_KEY_GENERAL])))
{
return NF_KEY_GENERAL;
}
@@ -637,70 +660,74 @@ short ImpSvNumberformatScan::GetKeyWord( const OUString& sSymbol, sal_Int32 nPos
return j;
}
}
- LanguageType eLang = pFormatter->GetLocaleData()->getLoadedLanguageTag().getLanguageType( false);
- if ( i == 0 && eLang.anyOf( LANGUAGE_GERMAN,
- LANGUAGE_GERMAN_SWISS,
- LANGUAGE_GERMAN_AUSTRIAN,
- LANGUAGE_GERMAN_LUXEMBOURG,
- LANGUAGE_GERMAN_LIECHTENSTEIN,
- LANGUAGE_DUTCH,
- LANGUAGE_DUTCH_BELGIAN,
- LANGUAGE_FRENCH,
- LANGUAGE_FRENCH_BELGIAN,
- LANGUAGE_FRENCH_CANADIAN,
- LANGUAGE_FRENCH_SWISS,
- LANGUAGE_FRENCH_LUXEMBOURG,
- LANGUAGE_FRENCH_MONACO,
- LANGUAGE_FINNISH,
- LANGUAGE_ITALIAN,
- LANGUAGE_ITALIAN_SWISS,
- LANGUAGE_DANISH,
- LANGUAGE_NORWEGIAN,
- LANGUAGE_NORWEGIAN_BOKMAL,
- LANGUAGE_NORWEGIAN_NYNORSK,
- LANGUAGE_SWEDISH,
- LANGUAGE_SWEDISH_FINLAND,
- LANGUAGE_PORTUGUESE,
- LANGUAGE_PORTUGUESE_BRAZILIAN,
- LANGUAGE_SPANISH_MODERN,
- LANGUAGE_SPANISH_DATED,
- LANGUAGE_SPANISH_MEXICAN,
- LANGUAGE_SPANISH_GUATEMALA,
- LANGUAGE_SPANISH_COSTARICA,
- LANGUAGE_SPANISH_PANAMA,
- LANGUAGE_SPANISH_DOMINICAN_REPUBLIC,
- LANGUAGE_SPANISH_VENEZUELA,
- LANGUAGE_SPANISH_COLOMBIA,
- LANGUAGE_SPANISH_PERU,
- LANGUAGE_SPANISH_ARGENTINA,
- LANGUAGE_SPANISH_ECUADOR,
- LANGUAGE_SPANISH_CHILE,
- LANGUAGE_SPANISH_URUGUAY,
- LANGUAGE_SPANISH_PARAGUAY,
- LANGUAGE_SPANISH_BOLIVIA,
- LANGUAGE_SPANISH_EL_SALVADOR,
- LANGUAGE_SPANISH_HONDURAS,
- LANGUAGE_SPANISH_NICARAGUA,
- LANGUAGE_SPANISH_PUERTO_RICO ) )
- {
- // no localized keyword, try English keywords
- i = NF_KEY_LASTKEYWORD;
- while ( i > 0 && sString.indexOf(sEnglishKeyword[i]) != 0 )
+ if (i == 0 && meKeywordLocalization == KeywordLocalization::AllowEnglish)
+ {
+ // No localized (if so) keyword, try English keywords if keywords
+ // are localized.
+ LanguageType eLang = pFormatter->GetLocaleData()->getLoadedLanguageTag().getLanguageType( false);
+ if ( eLang.anyOf( LANGUAGE_GERMAN,
+ LANGUAGE_GERMAN_SWISS,
+ LANGUAGE_GERMAN_AUSTRIAN,
+ LANGUAGE_GERMAN_LUXEMBOURG,
+ LANGUAGE_GERMAN_LIECHTENSTEIN,
+ LANGUAGE_DUTCH,
+ LANGUAGE_DUTCH_BELGIAN,
+ LANGUAGE_FRENCH,
+ LANGUAGE_FRENCH_BELGIAN,
+ LANGUAGE_FRENCH_CANADIAN,
+ LANGUAGE_FRENCH_SWISS,
+ LANGUAGE_FRENCH_LUXEMBOURG,
+ LANGUAGE_FRENCH_MONACO,
+ LANGUAGE_FINNISH,
+ LANGUAGE_ITALIAN,
+ LANGUAGE_ITALIAN_SWISS,
+ LANGUAGE_DANISH,
+ LANGUAGE_NORWEGIAN,
+ LANGUAGE_NORWEGIAN_BOKMAL,
+ LANGUAGE_NORWEGIAN_NYNORSK,
+ LANGUAGE_SWEDISH,
+ LANGUAGE_SWEDISH_FINLAND,
+ LANGUAGE_PORTUGUESE,
+ LANGUAGE_PORTUGUESE_BRAZILIAN,
+ LANGUAGE_SPANISH_MODERN,
+ LANGUAGE_SPANISH_DATED,
+ LANGUAGE_SPANISH_MEXICAN,
+ LANGUAGE_SPANISH_GUATEMALA,
+ LANGUAGE_SPANISH_COSTARICA,
+ LANGUAGE_SPANISH_PANAMA,
+ LANGUAGE_SPANISH_DOMINICAN_REPUBLIC,
+ LANGUAGE_SPANISH_VENEZUELA,
+ LANGUAGE_SPANISH_COLOMBIA,
+ LANGUAGE_SPANISH_PERU,
+ LANGUAGE_SPANISH_ARGENTINA,
+ LANGUAGE_SPANISH_ECUADOR,
+ LANGUAGE_SPANISH_CHILE,
+ LANGUAGE_SPANISH_URUGUAY,
+ LANGUAGE_SPANISH_PARAGUAY,
+ LANGUAGE_SPANISH_BOLIVIA,
+ LANGUAGE_SPANISH_EL_SALVADOR,
+ LANGUAGE_SPANISH_HONDURAS,
+ LANGUAGE_SPANISH_NICARAGUA,
+ LANGUAGE_SPANISH_PUERTO_RICO ) )
{
- i--;
- }
- if ( i > NF_KEY_LASTOLDKEYWORD && sString != sEnglishKeyword[i] )
- {
- // found something, but maybe it's something else?
- // e.g. new NNN is found in NNNN, for NNNN we must search on
- short j = i - 1;
- while ( j > 0 && sString.indexOf(sEnglishKeyword[j]) != 0 )
+ i = NF_KEY_LASTKEYWORD;
+ while ( i > 0 && sString.indexOf(sEnglishKeyword[i]) != 0 )
{
- j--;
+ i--;
}
- if ( j && sEnglishKeyword[j].getLength() > sEnglishKeyword[i].getLength() )
+ if ( i > NF_KEY_LASTOLDKEYWORD && sString != sEnglishKeyword[i] )
{
- return j;
+ // found something, but maybe it's something else?
+ // e.g. new NNN is found in NNNN, for NNNN we must search on
+ short j = i - 1;
+ while ( j > 0 && sString.indexOf(sEnglishKeyword[j]) != 0 )
+ {
+ j--;
+ }
+ if ( j && sEnglishKeyword[j].getLength() > sEnglishKeyword[i].getLength() )
+ {
+ return j;
+ }
}
}
}
diff --git a/svl/source/numbers/zforscan.hxx b/svl/source/numbers/zforscan.hxx
index 54c59323836f..e5eeab899d24 100644
--- a/svl/source/numbers/zforscan.hxx
+++ b/svl/source/numbers/zforscan.hxx
@@ -40,9 +40,17 @@ class ImpSvNumberformatScan
{
public:
+ /** Specify what keyword localization is allowed when scanning the format code. */
+ enum class KeywordLocalization
+ {
+ LocaleLegacy, ///< unfortunately localized in few locales, otherwise English
+ EnglishOnly, ///< only English, no localized keywords
+ AllowEnglish ///< allow English keywords as well as localized keywords
+ };
+
explicit ImpSvNumberformatScan( SvNumberFormatter* pFormatter );
~ImpSvNumberformatScan();
- void ChangeIntl(); // Replaces Keywords
+ void ChangeIntl( KeywordLocalization eKeywordLocalization = KeywordLocalization::AllowEnglish ); // Replaces Keywords
void ChangeNullDate(sal_uInt16 nDay, sal_uInt16 nMonth, sal_Int16 nYear); // Replaces reference date
void ChangeStandardPrec(sal_uInt16 nPrec); // Replaces standard precision
@@ -210,6 +218,8 @@ private: // Private section
sal_uInt8 nNatNumModifier; // Thai T speciality
+ KeywordLocalization meKeywordLocalization; ///< which keywords localization to scan
+
// Copy assignment is forbidden and not implemented.
ImpSvNumberformatScan (const ImpSvNumberformatScan &) = delete;
ImpSvNumberformatScan & operator= (const ImpSvNumberformatScan &) = delete;
More information about the Libreoffice-commits
mailing list