configmgr/source/access.cxx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
New commits: commit 6c4ff1d23ef61e708f3450d1b0ae77cc78cac731 Author: Eike Rathke <er...@redhat.com> AuthorDate: Sun Aug 15 01:44:54 2021 +0200 Commit: Eike Rathke <er...@redhat.com> CommitDate: Sun Aug 15 02:57:21 2021 +0200 Avoid computing LanguageTag fallbacks several hundred times ... over and over again even for known and present locales for each and every localizable config item. Change-Id: I19974c56169f45a7c53ed6b0eede47365e1365dd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120496 Reviewed-by: Eike Rathke <er...@redhat.com> Tested-by: Jenkins diff --git a/configmgr/source/access.cxx b/configmgr/source/access.cxx index 02e3f557c684..28ef91000fb1 100644 --- a/configmgr/source/access.cxx +++ b/configmgr/source/access.cxx @@ -1385,8 +1385,14 @@ rtl::Reference< ChildAccess > Access::getChild(OUString const & name) { locale = comphelper::LibreOfficeKit::getLanguageTag().getBcp47(); if (!locale.isEmpty()) { - // Find the best match using the LanguageTag fallback mechanism - std::vector<OUString> aFallbacks = LanguageTag(locale).getFallbackStrings(true); + // Try exact match first, avoiding all fallback overhead. + rtl::Reference<ChildAccess> directChild(getChild(locale)); + if (directChild.is()) + return directChild; + + // Find the best match using the LanguageTag fallback mechanism, + // excluding the original tag. + std::vector<OUString> aFallbacks = LanguageTag(locale).getFallbackStrings(false); for (const OUString& rFallback : aFallbacks) { rtl::Reference<ChildAccess> child(getChild(rFallback)); @@ -1398,8 +1404,8 @@ rtl::Reference< ChildAccess > Access::getChild(OUString const & name) { // 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]; + if (aFallbacks.size() > 0) + locale = aFallbacks[aFallbacks.size() - 1]; assert( !locale.isEmpty() && locale.indexOf('-') == -1 && locale.indexOf('_') == -1);