summaryrefslogtreecommitdiff
path: root/i18npool
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2012-11-16 22:31:09 +0100
committerEike Rathke <erack@redhat.com>2012-11-16 22:32:19 +0100
commit15e274a37c75eedb6e2fae07e4689cef67cdf2d7 (patch)
tree0094b2632c2d53aa8025832a5863688aa12be7f9 /i18npool
parent43cd14d317dd463a9e7c15fd6bcd6b289f96491f (diff)
added LanguageTag::makeFallback()
Change-Id: I6a89dd2c5e34035ac1e6c9b7e4723d881c5ceaa9
Diffstat (limited to 'i18npool')
-rw-r--r--i18npool/inc/i18npool/languagetag.hxx10
-rw-r--r--i18npool/inc/i18npool/mslangid.hxx11
-rw-r--r--i18npool/source/languagetag/languagetag.cxx43
3 files changed, 56 insertions, 8 deletions
diff --git a/i18npool/inc/i18npool/languagetag.hxx b/i18npool/inc/i18npool/languagetag.hxx
index 552110dc4366..c5ce23254bea 100644
--- a/i18npool/inc/i18npool/languagetag.hxx
+++ b/i18npool/inc/i18npool/languagetag.hxx
@@ -187,6 +187,15 @@ public:
/** Reset with LanguageType MS-LangID. */
void reset( LanguageType nLanguage );
+
+ /** Fall back to a known locale.
+
+ If the current tag does not represent a known (by us) locale, fall back
+ to the most likely locale possible known.
+ If the current tag is known, no change occurs.
+ */
+ LanguageTag & makeFallback();
+
private:
enum Decision
@@ -213,6 +222,7 @@ private:
mutable bool mbCachedLanguage : 1;
mutable bool mbCachedScript : 1;
mutable bool mbCachedCountry : 1;
+ bool mbIsFallback : 1;
void convertLocaleToBcp47();
void convertLocaleToLang();
diff --git a/i18npool/inc/i18npool/mslangid.hxx b/i18npool/inc/i18npool/mslangid.hxx
index 574a07dbabe4..120d9c6313d4 100644
--- a/i18npool/inc/i18npool/mslangid.hxx
+++ b/i18npool/inc/i18npool/mslangid.hxx
@@ -149,6 +149,14 @@ private:
const ::com::sun::star::lang::Locale & rLocale );
+ /** To be used only by LanguageTag. */
+ I18NISOLANG_DLLPRIVATE static LanguageType lookupFallbackLanguage( LanguageType nLang );
+
+ /** To be used only by LanguageTag. */
+ I18NISOLANG_DLLPRIVATE static ::com::sun::star::lang::Locale lookupFallbackLocale(
+ const ::com::sun::star::lang::Locale & rLocale );
+
+
#if I18NPOOL_FORCE_LANGUAGETAG
public:
#endif
@@ -317,12 +325,9 @@ private:
I18NISOLANG_DLLPRIVATE static inline LanguageType simplifySystemLanguages( LanguageType nLang );
// Several locale lookups with fall-back
- I18NISOLANG_DLLPRIVATE static LanguageType lookupFallbackLanguage( LanguageType nLang );
I18NISOLANG_DLLPRIVATE static LanguageType lookupFallbackLanguage(
const ::com::sun::star::lang::Locale & rLocale );
I18NISOLANG_DLLPRIVATE static ::com::sun::star::lang::Locale lookupFallbackLocale( LanguageType nLang );
- I18NISOLANG_DLLPRIVATE static ::com::sun::star::lang::Locale lookupFallbackLocale(
- const ::com::sun::star::lang::Locale & rLocale );
};
diff --git a/i18npool/source/languagetag/languagetag.cxx b/i18npool/source/languagetag/languagetag.cxx
index f863ae2ca7b1..1dcc6bfc2373 100644
--- a/i18npool/source/languagetag/languagetag.cxx
+++ b/i18npool/source/languagetag/languagetag.cxx
@@ -162,7 +162,8 @@ LanguageTag::LanguageTag( const rtl::OUString & rBcp47LanguageTag, bool bCanonic
mbInitializedLangID( false),
mbCachedLanguage( false),
mbCachedScript( false),
- mbCachedCountry( false)
+ mbCachedCountry( false),
+ mbIsFallback( false)
{
theDataRef::get().incRef();
@@ -185,7 +186,8 @@ LanguageTag::LanguageTag( const com::sun::star::lang::Locale & rLocale )
mbInitializedLangID( false),
mbCachedLanguage( false),
mbCachedScript( false),
- mbCachedCountry( false)
+ mbCachedCountry( false),
+ mbIsFallback( false)
{
theDataRef::get().incRef();
}
@@ -204,7 +206,8 @@ LanguageTag::LanguageTag( LanguageType nLanguage )
mbInitializedLangID( !mbSystemLocale),
mbCachedLanguage( false),
mbCachedScript( false),
- mbCachedCountry( false)
+ mbCachedCountry( false),
+ mbIsFallback( false)
{
theDataRef::get().incRef();
}
@@ -224,7 +227,8 @@ LanguageTag::LanguageTag( const rtl::OUString& rLanguage, const rtl::OUString& r
mbInitializedLangID( false),
mbCachedLanguage( false),
mbCachedScript( false),
- mbCachedCountry( false)
+ mbCachedCountry( false),
+ mbIsFallback( false)
{
theDataRef::get().incRef();
}
@@ -249,7 +253,8 @@ LanguageTag::LanguageTag( const LanguageTag & rLanguageTag )
mbInitializedLangID( rLanguageTag.mbInitializedLangID),
mbCachedLanguage( rLanguageTag.mbCachedLanguage),
mbCachedScript( rLanguageTag.mbCachedScript),
- mbCachedCountry( rLanguageTag.mbCachedCountry)
+ mbCachedCountry( rLanguageTag.mbCachedCountry),
+ mbIsFallback( rLanguageTag.mbIsFallback)
{
theDataRef::get().incRef();
}
@@ -276,6 +281,7 @@ LanguageTag& LanguageTag::operator=( const LanguageTag & rLanguageTag )
mbCachedLanguage = rLanguageTag.mbCachedLanguage;
mbCachedScript = rLanguageTag.mbCachedScript;
mbCachedCountry = rLanguageTag.mbCachedCountry;
+ mbIsFallback = rLanguageTag.mbIsFallback;
return *this;
}
@@ -313,6 +319,7 @@ void LanguageTag::resetVars()
mbCachedLanguage = false;
mbCachedScript = false;
mbCachedCountry = false;
+ mbIsFallback = false;
}
@@ -806,4 +813,30 @@ bool LanguageTag::isSystemLocale() const
}
+LanguageTag & LanguageTag::makeFallback()
+{
+ if (!mbIsFallback)
+ {
+ if (mbInitializedLangID)
+ {
+ LanguageType nLang1 = getLanguageType();
+ LanguageType nLang2 = MsLangId::lookupFallbackLanguage( nLang1);
+ if (nLang1 != nLang2)
+ reset( nLang2);
+ }
+ else
+ {
+ const lang::Locale& rLocale1 = getLocale();
+ lang::Locale aLocale2( MsLangId::lookupFallbackLocale( rLocale1));
+ if ( rLocale1.Language != aLocale2.Language ||
+ rLocale1.Country != aLocale2.Country ||
+ rLocale1.Variant != aLocale2.Variant)
+ reset( aLocale2);
+ }
+ mbIsFallback = true;
+ }
+ return *this;
+}
+
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */