summaryrefslogtreecommitdiff
path: root/i18nlangtag
diff options
context:
space:
mode:
authorMartin Hosken <martin_hosken@sil.org>2016-11-16 00:53:59 +0000
committerStephan Bergmann <sbergman@redhat.com>2016-11-17 17:16:52 +0000
commit6b35e804198ac45386805e80a3d413ed3405c3b4 (patch)
tree1132517e5e139e6387016e04d20a5660e8c39064 /i18nlangtag
parent3b94229fb74dfe43e2b7349d6f580dc375f28814 (diff)
Fix tdf#103855 add language codes and names to language lists from extensions
Rationale for changes to languagetag.hxx can be found in the bug tdf#103855. Change-Id: I7fa7c8a3f7b219ce08df69a3965f544ae156beab Reviewed-on: https://gerrit.libreoffice.org/30882 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'i18nlangtag')
-rw-r--r--i18nlangtag/qa/cppunit/test_languagetag.cxx12
-rw-r--r--i18nlangtag/source/isolang/mslangid.cxx26
-rw-r--r--i18nlangtag/source/languagetag/languagetag.cxx45
3 files changed, 82 insertions, 1 deletions
diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx
index 74d93cc5de2f..c7a8001e4ad7 100644
--- a/i18nlangtag/qa/cppunit/test_languagetag.cxx
+++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx
@@ -23,6 +23,7 @@
#include <osl/file.hxx>
#include <com/sun/star/lang/Locale.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
using namespace com::sun::star;
@@ -518,6 +519,17 @@ void TestLanguageTag::testAllTags()
CPPUNIT_ASSERT( LanguageTag::isOnTheFlyID( qty.getLanguageType()) );
}
+ // 'qtx' is an unknown new mslangid
+ {
+ OUString s_qtx( "qtx" );
+ LanguageTag qtx( s_qtx );
+ qtx.setScriptType( LanguageTag::ScriptType::RTL );
+ LanguageType n_qtx = qtx.getLanguageType();
+ CPPUNIT_ASSERT_EQUAL( MsLangId::getScriptType(n_qtx), css::i18n::ScriptType::COMPLEX );
+ CPPUNIT_ASSERT( MsLangId::isRightToLeft(n_qtx) );
+ CPPUNIT_ASSERT( !MsLangId::isCJK(n_qtx) );
+ }
+
// 'x-comment' is a privateuse known "locale"
{
OUString s_xcomment( "x-comment" );
diff --git a/i18nlangtag/source/isolang/mslangid.cxx b/i18nlangtag/source/isolang/mslangid.cxx
index 71535d6bd711..280d21f11ba5 100644
--- a/i18nlangtag/source/isolang/mslangid.cxx
+++ b/i18nlangtag/source/isolang/mslangid.cxx
@@ -230,6 +230,8 @@ bool MsLangId::isRightToLeft( LanguageType nLang )
default:
break;
}
+ if (LanguageTag::isOnTheFlyID(nLang))
+ return LanguageTag::getOnTheFlyScriptType(nLang) == LanguageTag::ScriptType::RTL;
return false;
}
@@ -303,6 +305,8 @@ bool MsLangId::isCJK( LanguageType nLang )
default:
break;
}
+ if (LanguageTag::isOnTheFlyID(nLang))
+ return LanguageTag::getOnTheFlyScriptType(nLang) == LanguageTag::ScriptType::CJK;
return false;
}
@@ -340,6 +344,7 @@ bool MsLangId::needsSequenceChecking( LanguageType nLang )
sal_Int16 MsLangId::getScriptType( LanguageType nLang )
{
sal_Int16 nScript;
+
switch( nLang )
{
// CTL
@@ -429,7 +434,26 @@ sal_Int16 MsLangId::getScriptType( LanguageType nLang )
// Western (actually not necessarily Latin but also Cyrillic,
// for example)
default:
- nScript = css::i18n::ScriptType::LATIN;
+ if (LanguageTag::isOnTheFlyID(nLang))
+ {
+ switch (LanguageTag::getOnTheFlyScriptType(nLang))
+ {
+ case LanguageTag::ScriptType::CJK :
+ nScript = css::i18n::ScriptType::ASIAN;
+ break;
+ case LanguageTag::ScriptType::CTL :
+ case LanguageTag::ScriptType::RTL :
+ nScript = css::i18n::ScriptType::COMPLEX;
+ break;
+ case LanguageTag::ScriptType::WESTERN :
+ case LanguageTag::ScriptType::UNKNOWN :
+ default:
+ nScript = css::i18n::ScriptType::LATIN;
+ break;
+ }
+ }
+ else
+ nScript = css::i18n::ScriptType::LATIN;
}
break;
}
diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx
index f87fe583f64b..899ee5f08e89 100644
--- a/i18nlangtag/source/languagetag/languagetag.cxx
+++ b/i18nlangtag/source/languagetag/languagetag.cxx
@@ -267,6 +267,7 @@ private:
mutable OUString maCachedVariants; ///< cache getVariants()
mutable lt_tag_t* mpImplLangtag; ///< liblangtag pointer
mutable LanguageType mnLangID;
+ mutable LanguageTag::ScriptType meScriptType;
mutable Decision meIsValid;
mutable Decision meIsIsoLocale;
mutable Decision meIsIsoODF;
@@ -288,6 +289,9 @@ private:
OUString const & getVariants() const;
bool hasScript() const;
+ void setScriptType(LanguageTag::ScriptType st);
+ LanguageTag::ScriptType getScriptType() const;
+
bool isIsoLocale() const;
bool isIsoODF() const;
bool isValidBcp47() const;
@@ -364,6 +368,7 @@ private:
/** Convert Locale to BCP 47 string without resolving system and creating
temporary LanguageTag instances. */
static OUString convertToBcp47( const css::lang::Locale& rLocale );
+
};
@@ -373,6 +378,7 @@ LanguageTagImpl::LanguageTagImpl( const LanguageTag & rLanguageTag )
maBcp47( rLanguageTag.maBcp47),
mpImplLangtag( nullptr),
mnLangID( rLanguageTag.mnLangID),
+ meScriptType( LanguageTag::ScriptType::UNKNOWN),
meIsValid( DECISION_DONTKNOW),
meIsIsoLocale( DECISION_DONTKNOW),
meIsIsoODF( DECISION_DONTKNOW),
@@ -400,6 +406,7 @@ LanguageTagImpl::LanguageTagImpl( const LanguageTagImpl & rLanguageTagImpl )
mpImplLangtag( rLanguageTagImpl.mpImplLangtag ?
lt_tag_copy( rLanguageTagImpl.mpImplLangtag) : nullptr),
mnLangID( rLanguageTagImpl.mnLangID),
+ meScriptType( rLanguageTagImpl.meScriptType),
meIsValid( rLanguageTagImpl.meIsValid),
meIsIsoLocale( rLanguageTagImpl.meIsIsoLocale),
meIsIsoODF( rLanguageTagImpl.meIsIsoODF),
@@ -434,6 +441,7 @@ LanguageTagImpl& LanguageTagImpl::operator=( const LanguageTagImpl & rLanguageTa
lt_tag_copy( rLanguageTagImpl.mpImplLangtag) : nullptr;
lt_tag_unref(oldTag);
mnLangID = rLanguageTagImpl.mnLangID;
+ meScriptType = rLanguageTagImpl.meScriptType;
meIsValid = rLanguageTagImpl.meIsValid;
meIsIsoLocale = rLanguageTagImpl.meIsIsoLocale;
meIsIsoODF = rLanguageTagImpl.meIsIsoODF;
@@ -701,6 +709,18 @@ LanguageTag::ImplPtr LanguageTagImpl::registerOnTheFly( LanguageType nRegisterID
return pImpl;
}
+
+LanguageTag::ScriptType LanguageTag::getOnTheFlyScriptType( LanguageType nRegisterID )
+{
+ const MapLangID& rMapLangID = theMapLangID::get();
+ MapLangID::const_iterator itID( rMapLangID.find( nRegisterID));
+ if (itID != rMapLangID.end())
+ return (*itID).second->getScriptType();
+ else
+ return UNKNOWN;
+}
+
+
// static
void LanguageTag::setConfiguredSystemLanguage( LanguageType nLang )
{
@@ -1949,6 +1969,31 @@ bool LanguageTag::hasScript() const
}
+LanguageTag::ScriptType LanguageTagImpl::getScriptType() const
+{
+ return meScriptType;
+}
+
+
+LanguageTag::ScriptType LanguageTag::getScriptType() const
+{
+ return getImpl()->getScriptType();
+}
+
+
+void LanguageTagImpl::setScriptType(LanguageTag::ScriptType st)
+{
+ if (meScriptType == LanguageTag::ScriptType::UNKNOWN) // poor man's clash resolution
+ meScriptType = st;
+}
+
+
+void LanguageTag::setScriptType(LanguageTag::ScriptType st)
+{
+ getImpl()->setScriptType(st);
+}
+
+
bool LanguageTagImpl::cacheSimpleLSCV()
{
OUString aLanguage, aScript, aCountry, aVariants;