summaryrefslogtreecommitdiff
path: root/i18nutil/source
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2022-10-05 01:29:02 +0200
committerEike Rathke <erack@redhat.com>2022-10-05 12:05:01 +0200
commitecc30ac20f559e47fc4a183942d73913d615ff3f (patch)
tree51988afc347bf0fefa16be129def29a50733b226 /i18nutil/source
parent384167ab8501ba5912068c0a9673864552d119f1 (diff)
Introduce unicode::getScriptClassFromLanguageTag()
Change-Id: Ifb932ff2aabc5767571433627314f0b29c35c471 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140953 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins
Diffstat (limited to 'i18nutil/source')
-rw-r--r--i18nutil/source/utility/unicode.cxx32
1 files changed, 32 insertions, 0 deletions
diff --git a/i18nutil/source/utility/unicode.cxx b/i18nutil/source/utility/unicode.cxx
index 5e479989eae9..33f1ca2f190e 100644
--- a/i18nutil/source/utility/unicode.cxx
+++ b/i18nutil/source/utility/unicode.cxx
@@ -24,6 +24,7 @@
#include <i18nutil/unicode.hxx>
#include <sal/log.hxx>
#include <unicode/numfmt.h>
+#include <unicode/uchar.h>
#include "unicode_data.h"
#include <rtl/character.hxx>
#include <o3tl/string_view.hxx>
@@ -190,6 +191,37 @@ sal_Int16 unicode::getScriptClassFromUScriptCode(UScriptCode eScript)
return nRet;
}
+sal_Int16 unicode::getScriptClassFromLanguageTag( const LanguageTag& rLanguageTag )
+{
+ static UScriptCode nMaxScript = static_cast<UScriptCode>(u_getIntPropertyMaxValue(UCHAR_SCRIPT));
+ constexpr int32_t nBuf = 42;
+ UScriptCode aBuf[nBuf];
+ if (rLanguageTag.hasScript())
+ {
+ aBuf[0] = static_cast<UScriptCode>(u_getPropertyValueEnum( UCHAR_SCRIPT,
+ OUStringToOString( rLanguageTag.getScript(), RTL_TEXTENCODING_ASCII_US).getStr()));
+ }
+ else
+ {
+ OUString aName;
+ if (rLanguageTag.getCountry().isEmpty())
+ aName = rLanguageTag.getLanguage();
+ else
+ aName = rLanguageTag.getLanguage() + "-" + rLanguageTag.getCountry();
+ UErrorCode status = U_ZERO_ERROR;
+ const int32_t nScripts = uscript_getCode(
+ OUStringToOString( aName, RTL_TEXTENCODING_ASCII_US).getStr(),
+ aBuf, nBuf, &status);
+ // U_BUFFER_OVERFLOW_ERROR would be set with too many scripts for buffer
+ // and required capacity returned, but really..
+ if (nScripts == 0 || !U_SUCCESS(status))
+ return css::i18n::ScriptType::LATIN;
+ }
+ if (aBuf[0] > nMaxScript)
+ return css::i18n::ScriptType::COMPLEX;
+ return getScriptClassFromUScriptCode( aBuf[0]);
+}
+
OString unicode::getExemplarLanguageForUScriptCode(UScriptCode eScript)
{
OString sRet;