24#include <com/sun/star/container/XNameAccess.hpp>
25#include <com/sun/star/i18n/DirectionProperty.hpp>
26#include <com/sun/star/i18n/ScriptType.hpp>
27#include <com/sun/star/uno/Sequence.hxx>
28#include <com/sun/star/uno/Any.h>
45#include <officecfg/VCL.hxx>
52class SvtLanguageTableImpl
55 std::vector<std::pair<OUString, LanguageType>> m_aStrings;
56 void AddItem(
const OUString& rLanguage,
const LanguageType eType)
58 m_aStrings.emplace_back(rLanguage, eType);
63 SvtLanguageTableImpl();
68 sal_uInt32 GetEntryCount()
const;
76 const size_t nItems = m_aStrings.size();
77 for (
size_t i = 0;
i < nItems; ++
i)
79 if (m_aStrings[i].second == nValue)
84 void AddEntry(
const OUString& rString,
const LanguageType eType);
87SvtLanguageTableImpl& theLanguageTable()
89 static SvtLanguageTableImpl aTable;
96 const sal_Int32 nLen = rText.getLength();
102 constexpr sal_Unicode cPopDirectionalFormat = 0x202C;
107 if (cChar == cLRE_Embedding || cChar == cRLE_Embedding)
121 bool bIsRtlText =
false;
122 for (sal_Int32
i = 0;
i < nLen && !bFound; ++
i)
127 case i18n::DirectionProperty_LEFT_TO_RIGHT :
128 case i18n::DirectionProperty_LEFT_TO_RIGHT_EMBEDDING :
129 case i18n::DirectionProperty_LEFT_TO_RIGHT_OVERRIDE :
130 case i18n::DirectionProperty_EUROPEAN_NUMBER :
131 case i18n::DirectionProperty_ARABIC_NUMBER :
138 case i18n::DirectionProperty_RIGHT_TO_LEFT :
139 case i18n::DirectionProperty_RIGHT_TO_LEFT_ARABIC :
140 case i18n::DirectionProperty_RIGHT_TO_LEFT_EMBEDDING :
141 case i18n::DirectionProperty_RIGHT_TO_LEFT_OVERRIDE :
157 cStart = cRLE_Embedding;
160 OUString aRes( rText );
163 aRes = OUStringChar(cStart) + aRes
164 + OUStringChar(cPopDirectionalFormat);
180 return OUString::Concat(
"{") +
aStr +
"}";
191SvtLanguageTableImpl::SvtLanguageTableImpl()
195 m_aStrings.emplace_back(
SvtResId(STR_ARR_SVT_LANGUAGE_TABLE[i].first), STR_ARR_SVT_LANGUAGE_TABLE[
i].second);
198 auto xNA = officecfg::VCL::ExtraLanguages::get();
199 const uno::Sequence <OUString> rElementNames = xNA->getElementNames();
200 for (
const OUString& rBcp47 : rElementNames)
204 uno::Reference <container::XNameAccess> xNB;
205 xNA->getByName(rBcp47) >>= xNB;
206 bool bSuccess = (xNB->getByName(
"Name") >>=
aName) &&
207 (xNB->getByName(
"ScriptType") >>=
nType);
214 sal_uInt32
nPos = FindIndex(nLangType);
215 if (nPos == RESARRAY_INDEX_NOTFOUND)
221bool SvtLanguageTableImpl::HasType(
const LanguageType eType )
const
224 sal_uInt32
nPos = FindIndex(eLang);
231 return theLanguageTable().HasType(
eType );
234OUString SvtLanguageTableImpl::GetString(
const LanguageType eType )
const
238 FindIndex(LANGUAGE_SYSTEM) : FindIndex( nLang));
240 if ( RESARRAY_INDEX_NOTFOUND != nPos && nPos < GetEntryCount() )
241 return m_aStrings[
nPos].first;
245 SAL_WARN(
"svtools.misc",
"Language: 0x"
247 <<
" with unknown name, so returning generated: "
251 const_cast<SvtLanguageTableImpl*
>(
this)->AddEntry( sLangTag, nLang);
258 return theLanguageTable().GetString(
eType );
261LanguageType SvtLanguageTableImpl::GetType( std::u16string_view rStr )
const
264 sal_uInt32
nCount = GetEntryCount();
266 for ( sal_uInt32 i = 0;
i <
nCount; ++
i )
268 if (m_aStrings[i].first == rStr)
279 return theLanguageTable().GetType( rStr );
282sal_uInt32 SvtLanguageTableImpl::GetEntryCount()
const
284 return m_aStrings.size();
289 return theLanguageTable().GetEntryCount();
293LanguageType SvtLanguageTableImpl::GetTypeAtIndex( sal_uInt32 nIndex )
const
296 if (nIndex < GetEntryCount())
303 return theLanguageTable().GetTypeAtIndex(
nIndex);
306void SvtLanguageTableImpl::AddEntry(
const OUString& rString,
const LanguageType eType )
316 switch (nScriptClass)
320 assert(!
"unexpected ScriptType");
322 case css::i18n::ScriptType::WEAK:
323 case css::i18n::ScriptType::LATIN:
326 case css::i18n::ScriptType::ASIAN:
329 case css::i18n::ScriptType::COMPLEX:
337 aLanguageTag.setScriptType( eScriptType);
339 AddItem( rString, eType);
static const AllSettings & GetSettings()
css::i18n::DirectionProperty getCharacterDirection(const OUString &rStr, sal_Int32 nPos) const
static OUString getDisplayName(const LanguageTag &rLanguageTag, const LanguageTag &rDisplayLanguage)
LanguageType getLanguageType(bool bResolveSystem=true) const
const OUString & getBcp47(bool bResolveSystem=true) const
static bool isOnTheFlyID(LanguageType nLang)
static ScriptType getOnTheFlyScriptType(LanguageType nLang)
static LanguageType getReplacementForObsoleteLanguage(LanguageType nLang)
static void AddLanguageTag(const LanguageTag &rLanguageTag)
Add a language tag to the table.
static sal_uInt32 GetLanguageEntryCount()
static OUString GetLanguageString(const LanguageType eType)
Obtain the UI name for a LanguageType of a language/locale (string resource STR_ARR_SVT_LANGUAGE_TABL...
static LanguageType GetLanguageTypeAtIndex(sal_uInt32 nIndex)
static bool HasLanguageType(const LanguageType eType)
static LanguageType GetLanguageType(std::u16string_view rStr)
Obtain the LanguageType for a UI name of a language/locale (string resource STR_ARR_SVT_LANGUAGE_TABL...
const CharClass & GetCharClass() const
static sal_Int16 getScriptClassFromLanguageTag(const LanguageTag &rLanguageTag)
#define LANGUAGE_PROCESS_OR_USER_DEFAULT
#define LANGUAGE_DONTKNOW
static OUString lcl_getDescription(const LanguageTag &rTag)
OUString ApplyLreOrRleEmbedding(const OUString &rText)
#define SAL_WARN(area, stream)
#define SAL_N_ELEMENTS(arr)
OUString GetString(int nId)
#define RESARRAY_INDEX_NOTFOUND
OUString SvtResId(TranslateId aId)