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 | |
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>
-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 | ||||
-rw-r--r-- | include/i18nlangtag/languagetag.hxx | 24 | ||||
-rw-r--r-- | officecfg/registry/schema/org/openoffice/VCL.xcs | 20 | ||||
-rw-r--r-- | svtools/source/misc/langtab.cxx | 26 |
6 files changed, 152 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; diff --git a/include/i18nlangtag/languagetag.hxx b/include/i18nlangtag/languagetag.hxx index a1b1bb9104f7..14de1eeaed42 100644 --- a/include/i18nlangtag/languagetag.hxx +++ b/include/i18nlangtag/languagetag.hxx @@ -55,6 +55,24 @@ class I18NLANGTAG_DLLPUBLIC LanguageTag public: + /** ScriptType for a language. + + Used only in onTheFly languages as a way of marking key script behaviours + for the script of the language without having to store and analyse the + script each time. Used primarily from msLangId. + + These need to correspond to the ExtraLanguages.ScriptType template + property in officecfg/registry/schema/org/openoffice/VCL.xcs + */ + enum ScriptType + { + UNKNOWN = 0, + WESTERN = 1, // Copies css::i18n::ScriptType for strong types + CJK = 2, + CTL = 3, + RTL = 4 // implies CTL + }; + /** Init LanguageTag with existing BCP 47 language tag string. @param bCanonicalize @@ -237,6 +255,11 @@ public: */ bool isSystemLocale() const { return mbSystemLocale;} + /** Returns the script type for this language, UNKNOWN if not set */ + ScriptType getScriptType() const; + + /** Sets the script type for this language */ + void setScriptType(ScriptType st); /** Reset with existing BCP 47 language tag string. See ctor. */ LanguageTag & reset( const OUString & rBcp47LanguageTag ); @@ -496,6 +519,7 @@ public: /** If nLang is a generated on-the-fly LangID */ static bool isOnTheFlyID( LanguageType nLang ); + static ScriptType getOnTheFlyScriptType( LanguageType nLang ); /** @ATTENTION: _ONLY_ to be called by the application's configuration! */ static void setConfiguredSystemLanguage( LanguageType nLang ); diff --git a/officecfg/registry/schema/org/openoffice/VCL.xcs b/officecfg/registry/schema/org/openoffice/VCL.xcs index 0d8afd15a9db..a46588965c01 100644 --- a/officecfg/registry/schema/org/openoffice/VCL.xcs +++ b/officecfg/registry/schema/org/openoffice/VCL.xcs @@ -67,6 +67,21 @@ <desc>Specifies an extensible set of options that are ordered into key/value pairs for the VCL. For example, a valid key for describing when ATTools is activated is: "EnableATToolSupport" (valid values = "true", "false").</desc> </info> </group> + <group oor:name="ExtraLanguage"> + <info> + <desc>Specifies an extenisble list of languages that should be added to the various language selection lists</desc> + </info> + <prop oor:name="Name" oor:type="xs:string" oor:nillable="false" oor:localized="true"> + <info> + <desc>Gives the UI name to present to the user</desc> + </info> + </prop> + <prop oor:name="ScriptType" oor:type="xs:int" oor:nillable="false"> + <info> + <desc>Which of the various language lists to include this in: 1 - Western, 2 - Asian, 3 - CTL, 4 - Right to Left (implies CTL). This value corresponds to the concrete enum values in LanguageTag::ScriptType found in i18nlangtag/languagetag.hxx.</desc> + </info> + </prop> + </group> <group oor:name="LocalizedDefaultFonts" oor:extensible="true"> <info> <desc>Contains a localized table of default font lists organized as a set of sets of key/value pairs. The outer set denotes the language (e.g. "en-US") so that default fonts can be declared for different language contexts. Each value is a font list separated by ';'. Default fonts are: CJK_DISPLAY, CJK_HEADING, CJK_PRESENTATION, CJK_SPREADSHEET, CJK_TEXT, CTL_DISPLAY, CTL_HEADING, CTL_PRESENTATION, CTL_SPREADSHEET, CTL_TEXT, FIXED, LATIN_DISPLAY, LATIN_FIXED, LATIN_HEADING, LATIN_PRESENTATION, LATIN_SPREADSHEET, LATIN_TEXT, SANS, SANS_UNICODE, SERIF, SYMBOL, UI_FIXED, UI_SANS. Corresponding font lists: *_DISPLAY, *_HEADING, *_PRESENTATION, *_SPREADSHEET, *_TEXT, SANS, SANS_UNICODE, SERIF,SYMBOL, UI_FIXED, UI_SANS.</desc> @@ -84,6 +99,11 @@ <desc>Contains the settings for VCL (see template description).</desc> </info> </set> + <set oor:name="ExtraLanguages" oor:node-type="ExtraLanguage"> + <info> + <desc>Specifies extra language tags to support</desc> + </info> + </set> <set oor:name="DefaultFonts" oor:node-type="LocalizedDefaultFonts"> <info> <desc>Contains the localized default fonts for VCL (see template description).</desc> diff --git a/svtools/source/misc/langtab.cxx b/svtools/source/misc/langtab.cxx index 3540c316e472..272f8edf3fc6 100644 --- a/svtools/source/misc/langtab.cxx +++ b/svtools/source/misc/langtab.cxx @@ -17,7 +17,10 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/i18n/DirectionProperty.hpp> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/Any.h> #include <i18nlangtag/lang.h> #include <i18nlangtag/mslangid.hxx> @@ -28,6 +31,7 @@ #include <svtools/langtab.hxx> #include <unotools/syslocale.hxx> #include <tools/resary.hxx> +#include <officecfg/VCL.hxx> using namespace ::com::sun::star; @@ -129,6 +133,28 @@ const OUString ApplyLreOrRleEmbedding( const OUString &rText ) SvtLanguageTableImpl::SvtLanguageTableImpl() : ResStringArray( SvtResId( STR_ARR_SVT_LANGUAGE_TABLE ) ) { + auto xNA = officecfg::VCL::ExtraLanguages::get(); + uno::Sequence <OUString> rElementNames = xNA->getElementNames(); + sal_Int32 nLen = rElementNames.getLength(); + for (sal_Int32 i = 0; i < nLen; ++i) + { + OUString aName; + sal_Int32 nType = 0; + uno::Reference <container::XNameAccess> xNB; + xNA->getByName(rElementNames[i]) >>= xNB; + bool bSuccess = (xNB->getByName("Name") >>= aName) && + (xNB->getByName("ScriptType") >>= nType); + if (bSuccess) + { + LanguageTag aLang(rElementNames[i]); + LanguageType nLangType = aLang.getLanguageType(); + if (nType <= LanguageTag::ScriptType::RTL && nType > LanguageTag::ScriptType::UNKNOWN) + aLang.setScriptType(LanguageTag::ScriptType(nType)); + sal_uInt32 nPos = FindIndex(nLangType); + if (nPos == RESARRAY_INDEX_NOTFOUND) + AddItem((aName.isEmpty() ? rElementNames[i] : aName), nLangType); + } + } } SvtLanguageTableImpl::~SvtLanguageTableImpl() |