diff options
author | Martin Hosken <martin_hosken@sil.org> | 2016-11-16 00:53:59 +0000 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2016-11-17 17:16:52 +0000 |
commit | 6b35e804198ac45386805e80a3d413ed3405c3b4 (patch) | |
tree | 1132517e5e139e6387016e04d20a5660e8c39064 /i18nlangtag | |
parent | sfx2: let .uno:SignPDF result in a custom infobar text (diff) | |
download | core-6b35e804198ac45386805e80a3d413ed3405c3b4.tar.gz core-6b35e804198ac45386805e80a3d413ed3405c3b4.zip |
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.cxx | 12 | ||||
-rw-r--r-- | i18nlangtag/source/isolang/mslangid.cxx | 26 | ||||
-rw-r--r-- | i18nlangtag/source/languagetag/languagetag.cxx | 45 |
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; |