diff options
author | Eike Rathke <erack@redhat.com> | 2022-10-05 01:29:02 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2022-10-05 12:05:01 +0200 |
commit | ecc30ac20f559e47fc4a183942d73913d615ff3f (patch) | |
tree | 51988afc347bf0fefa16be129def29a50733b226 /i18nutil/source | |
parent | 384167ab8501ba5912068c0a9673864552d119f1 (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.cxx | 32 |
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; |