summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--i18nlangtag/source/languagetag/languagetag.cxx45
-rw-r--r--include/i18nlangtag/languagetag.hxx31
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