Kaydet (Commit) 15e274a3 authored tarafından Eike Rathke's avatar Eike Rathke

added LanguageTag::makeFallback()

Change-Id: I6a89dd2c5e34035ac1e6c9b7e4723d881c5ceaa9
üst 43cd14d3
......@@ -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();
......
......@@ -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 );
};
......
......@@ -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: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment