[Libreoffice-commits] core.git: i18nlangtag/qa i18nlangtag/source include/i18nlangtag officecfg/registry svtools/source

Martin Hosken martin_hosken at sil.org
Thu Nov 17 17:17:18 UTC 2016


 i18nlangtag/qa/cppunit/test_languagetag.cxx      |   12 ++++++
 i18nlangtag/source/isolang/mslangid.cxx          |   26 ++++++++++++-
 i18nlangtag/source/languagetag/languagetag.cxx   |   45 +++++++++++++++++++++++
 include/i18nlangtag/languagetag.hxx              |   24 ++++++++++++
 officecfg/registry/schema/org/openoffice/VCL.xcs |   20 ++++++++++
 svtools/source/misc/langtab.cxx                  |   26 +++++++++++++
 6 files changed, 152 insertions(+), 1 deletion(-)

New commits:
commit 6b35e804198ac45386805e80a3d413ed3405c3b4
Author: Martin Hosken <martin_hosken at sil.org>
Date:   Wed Nov 16 00:53:59 2016 +0000

    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 at libreoffice.org>
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx
index 74d93cc..c7a8001 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 71535d6..280d21f 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 f87fe58..899ee5f 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 a1b1bb9..14de1ee 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 0d8afd1..a465889 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 3540c31..272f8ed 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()


More information about the Libreoffice-commits mailing list