diff options
-rw-r--r-- | i18nlangtag/source/languagetag/languagetag.cxx | 45 | ||||
-rw-r--r-- | include/i18nlangtag/languagetag.hxx | 31 |
2 files changed, 74 insertions, 2 deletions
diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index 13e25f8b8197..4aefa79e6c8d 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -1312,4 +1312,49 @@ LanguageTag::Extraction LanguageTag::simpleExtract( const OUString& rBcp47, } +// static +::std::vector< com::sun::star::lang::Locale >::const_iterator LanguageTag::getMatchingFallback( + const ::std::vector< com::sun::star::lang::Locale > & rList, + const com::sun::star::lang::Locale & rReference ) +{ + if (rList.empty()) + return rList.end(); + + ::std::vector< lang::Locale >::const_iterator it; + + // Try the simple case first without constructing fallbacks. + for (it = rList.begin(); it != rList.end(); ++it) + { + if ( (*it).Language == rReference.Language && + (*it).Country == rReference.Country && + (*it).Variant == rReference.Variant) + return it; // exact match + } + + // Now for each reference fallback test the fallbacks of the list in order. + ::std::vector< OUString > aFallbacks( LanguageTag( rReference).getFallbackStrings()); + aFallbacks.erase( aFallbacks.begin()); // first is full BCP47, we already checked that + ::std::vector< ::std::vector< OUString > > aListFallbacks( rList.size()); + for (it = rList.begin(); it != rList.end(); ++it) + { + ::std::vector< OUString > aTmp( LanguageTag( *it).getFallbackStrings()); + aListFallbacks.push_back( aTmp); + } + for (::std::vector< OUString >::const_iterator rfb( aFallbacks.begin()); rfb != aFallbacks.end(); ++rfb) + { + for (::std::vector< ::std::vector< OUString > >::const_iterator lfb( aListFallbacks.begin()); + lfb != aListFallbacks.end(); ++lfb) + { + for (::std::vector< OUString >::const_iterator fb( (*lfb).begin()); fb != (*lfb).end(); ++fb) + { + if (*rfb == *fb) + return rList.begin() + (lfb - aListFallbacks.begin()); + } + } + } + + // No match found. + return rList.end(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/i18nlangtag/languagetag.hxx b/include/i18nlangtag/languagetag.hxx index d779f9d921bf..bbda176a8f20 100644 --- a/include/i18nlangtag/languagetag.hxx +++ b/include/i18nlangtag/languagetag.hxx @@ -273,7 +273,7 @@ public: ::std::vector< OUString > getFallbackStrings() const; - /** @short search for an equal or at least for a similar locale in a list + /** @short Search for an equal or at least for a similar locale in a list of possible ones. @descr First search for a locale that is equal to the reference @@ -306,12 +306,39 @@ public: @return An iterator that points to the found element inside the given locale list. If no matching locale could be found it points to - the end of the list. + the beginning of the list. */ static ::std::vector< OUString >::const_iterator getFallback( const ::std::vector< OUString > & rList, const OUString & rReference ); + /** @short Search for an equal or for a similar locale in a list + of possible ones where at least the language matches. + + @descr First search for a locale that is equal to the reference + locale. + + If the reference locale could not be located, check for + "similar" locales, in the same order as obtained by + getFallbackStrings(). + + If no locale matches, rList.end() is returned. + + @param rList + the vector of possible locales. + + @param rReference + the reference locale. + + @return An iterator that points to the found element inside the given + locale list. If no matching locale could be found it points to + the end of the list. + */ + static ::std::vector< com::sun::star::lang::Locale >::const_iterator getMatchingFallback( + const ::std::vector< com::sun::star::lang::Locale > & rList, + const com::sun::star::lang::Locale & rReference ); + + /** Test equality of two LanguageTag, possibly resolving system locale. @param bResolveSystem |