From dfc28be2487c13be36a90efd778b8d8f179c589d Mon Sep 17 00:00:00 2001 From: Jan Holesovsky Date: Thu, 23 Jul 2020 00:42:42 +0200 Subject: 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 --- configmgr/source/access.cxx | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'configmgr') diff --git a/configmgr/source/access.cxx b/configmgr/source/access.cxx index e07fc8446f51..0308a0361761 100644 --- a/configmgr/source/access.cxx +++ b/configmgr/source/access.cxx @@ -1385,29 +1385,25 @@ rtl::Reference< ChildAccess > Access::getChild(OUString const & name) { locale = comphelper::LibreOfficeKit::getLanguageTag().getBcp47(); if (!locale.isEmpty()) { - // Find best match using an adaptation of RFC 4647 lookup matching - // rules, removing "-" or "_" delimited segments from the end: - for (;;) { - rtl::Reference< ChildAccess > child(getChild(locale)); - if (child.is()) { + // Find the best match using the LanguageTag fallback mechanism + std::vector aFallbacks = LanguageTag(locale).getFallbackStrings(true); + for (const OUString& rFallback : aFallbacks) + { + rtl::Reference child(getChild(rFallback)); + if (child.is()) 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 // xml:lang attributes, look for the first entry with the same first // segment as the requested language tag before falling back to // defaults (see fdo#33638): + assert(aFallbacks.size() > 0); + locale = aFallbacks[aFallbacks.size() - 1]; assert( !locale.isEmpty() && locale.indexOf('-') == -1 && locale.indexOf('_') == -1); + std::vector< rtl::Reference< ChildAccess > > children( getAllChildren()); for (auto const& child : children) -- cgit