diff options
author | Julien Nabet <serval2412@yahoo.fr> | 2018-08-11 00:23:25 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2018-08-17 20:01:10 +0200 |
commit | 13db6e8671c36e1a028d6a8ad63f518e60f84870 (patch) | |
tree | 86560571d00c9069c33449865211606da9b6be14 /i18npool | |
parent | da0dc858fc05e7f1d6a60ca61f722044e688d4f8 (diff) |
tdf#119117: get phonebook sort work by tweaking ICU call mechanism
Using "phonebook" as variant does't work with de_DE
since it gives de_DE_PHONEBOOK whereas icu expects de__PHONEBOOK
See http://userguide.icu-project.org/locale#TOC-Variant-code,
Level 2 canonicalization, 8.
So let variant empty and use the fourth arg of icuLocale "keywords"
See constructors in http://icu-project.org/apiref/icu4c/classicu_1_1Locale.html
Change-Id: I6c216c86cdd32abfa477c14a80d1b8794b536900
Reviewed-on: https://gerrit.libreoffice.org/58870
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'i18npool')
-rw-r--r-- | i18npool/source/collator/collator_unicode.cxx | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/i18npool/source/collator/collator_unicode.cxx b/i18npool/source/collator/collator_unicode.cxx index 5bbe015e4d5e..d3e189a5ff1d 100644 --- a/i18npool/source/collator/collator_unicode.cxx +++ b/i18npool/source/collator/collator_unicode.cxx @@ -367,10 +367,18 @@ Collator_Unicode::loadCollatorAlgorithm(const OUString& rAlgorithm, const lang:: /** ICU collators are loaded using a locale only. ICU uses Variant as collation algorithm name (like de__PHONEBOOK locale), note the empty territory (Country) designator in this special - case here. The icu::Locale constructor changes the algorithm name to + case here. + But sometimes the mapping fails, eg for German (from Germany) phonebook, we'll have "de_DE_PHONEBOOK" + this one won't be remapping to collation keyword specifiers "de@collation=phonebook" + See http://userguide.icu-project.org/locale#TOC-Variant-code, Level 2 canonicalization, 8. + So let variant empty and use the fourth arg of icuLocale "keywords" + See LanguageTagIcu::getIcuLocale from i18nlangtag/source/languagetag/languagetagicu.cxx + The icu::Locale constructor changes the algorithm name to uppercase itself, so we don't have to bother with that. */ - icu::Locale icuLocale( LanguageTagIcu::getIcuLocale( LanguageTag( rLocale), rAlgorithm)); + icu::Locale icuLocale( LanguageTagIcu::getIcuLocale( LanguageTag( rLocale), + "", rAlgorithm.isEmpty() ? OUString("") : "collation=" + rAlgorithm)); + // load ICU collator collator.reset( static_cast<icu::RuleBasedCollator*>( icu::Collator::createInstance(icuLocale, status) ) ); if (! U_SUCCESS(status)) throw RuntimeException(); |