summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
-rw-r--r--include/i18nlangtag/languagetag.hxx24
-rw-r--r--officecfg/registry/schema/org/openoffice/VCL.xcs20
-rw-r--r--svtools/source/misc/langtab.cxx26
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()