configmgr: Use a proper LanguageTag-based locale fallback mechanism.
Without this, zh-Hant-TW locale used via the LibreOfficeKit was reduced to zh-Hant and further to zh, which was interpreted as zh-CN, causing incorrect strings particularly in the sidebar. Change-Id: I58e53f71d13824e422a7b3634f3822d55090f8ee Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99203 Tested-by: Jenkins Reviewed-by: Andras Timar <andras.timar@collabora.com>
This commit is contained in:
committed by
Andras Timar
parent
7ee6e771e2
commit
dfc28be248
@@ -1385,29 +1385,25 @@ rtl::Reference< ChildAccess > Access::getChild(OUString const & name) {
|
|||||||
locale = comphelper::LibreOfficeKit::getLanguageTag().getBcp47();
|
locale = comphelper::LibreOfficeKit::getLanguageTag().getBcp47();
|
||||||
|
|
||||||
if (!locale.isEmpty()) {
|
if (!locale.isEmpty()) {
|
||||||
// Find best match using an adaptation of RFC 4647 lookup matching
|
// Find the best match using the LanguageTag fallback mechanism
|
||||||
// rules, removing "-" or "_" delimited segments from the end:
|
std::vector<OUString> aFallbacks = LanguageTag(locale).getFallbackStrings(true);
|
||||||
for (;;) {
|
for (const OUString& rFallback : aFallbacks)
|
||||||
rtl::Reference< ChildAccess > child(getChild(locale));
|
{
|
||||||
if (child.is()) {
|
rtl::Reference<ChildAccess> child(getChild(rFallback));
|
||||||
|
if (child.is())
|
||||||
return child;
|
return child;
|
||||||
}
|
|
||||||
sal_Int32 i = locale.getLength() - 1;
|
|
||||||
while (i > 0 && locale[i] != '-' && locale[i] != '_') {
|
|
||||||
--i;
|
|
||||||
}
|
|
||||||
if (i <= 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
locale = locale.copy(0, i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// As a workaround for broken xcu data that does not use shortest
|
// As a workaround for broken xcu data that does not use shortest
|
||||||
// xml:lang attributes, look for the first entry with the same first
|
// xml:lang attributes, look for the first entry with the same first
|
||||||
// segment as the requested language tag before falling back to
|
// segment as the requested language tag before falling back to
|
||||||
// defaults (see fdo#33638):
|
// defaults (see fdo#33638):
|
||||||
|
assert(aFallbacks.size() > 0);
|
||||||
|
locale = aFallbacks[aFallbacks.size() - 1];
|
||||||
assert(
|
assert(
|
||||||
!locale.isEmpty() && locale.indexOf('-') == -1 &&
|
!locale.isEmpty() && locale.indexOf('-') == -1 &&
|
||||||
locale.indexOf('_') == -1);
|
locale.indexOf('_') == -1);
|
||||||
|
|
||||||
std::vector< rtl::Reference< ChildAccess > > children(
|
std::vector< rtl::Reference< ChildAccess > > children(
|
||||||
getAllChildren());
|
getAllChildren());
|
||||||
for (auto const& child : children)
|
for (auto const& child : children)
|
||||||
|
Reference in New Issue
Block a user