[Libreoffice-commits] core.git: i18npool/inc i18npool/source

Eike Rathke erack at redhat.com
Wed Mar 27 14:20:27 PDT 2013


 i18npool/inc/i18npool/languagetag.hxx       |   40 +++++++++++++++++++++++
 i18npool/source/languagetag/languagetag.cxx |   47 ++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)

New commits:
commit a1554c121f5f810c77b70ece3d11522a48091d0f
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Mar 27 22:18:32 2013 +0100

    added LanguageTag::getFallback()
    
    Similar to comphelper::Locale::getFallback() but implemented
    differently. comphelper::Locale is to be removed later.
    
    Change-Id: I99dc7b51029df102705f2608245c91d81dc96788

diff --git a/i18npool/inc/i18npool/languagetag.hxx b/i18npool/inc/i18npool/languagetag.hxx
index 4d99e72..eb1a518 100644
--- a/i18npool/inc/i18npool/languagetag.hxx
+++ b/i18npool/inc/i18npool/languagetag.hxx
@@ -236,6 +236,46 @@ public:
      */
     ::std::vector< OUString >       getFallbackStrings() const;
 
+
+    /** @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
+                locale. (means: same BCP47 string)
+
+                If the reference locale could not be located, check for
+                "similar" locales, in the same order as obtained by
+                getFallbackStrings().
+
+                If no similar locale could be located, we search for a locale
+                "en-US" inside the given locale list.
+
+                If "en-US" could not be located, we search for a locale "en"
+                inside the given list.
+
+                If no "same" nor any "similar" locale could be found, we try
+                "x-default" and "x-no-translate" explicitly. Sometimes
+                variables don't use real localization. For example, in case the
+                localized value is a fix product name.
+
+                If no locale matched until then, we use any other locale that
+                exists inside the set of given ones, namely the first
+                encountered!
+
+        @param  rList
+                the vector of possible locales as BCP47 strings.
+
+        @param  rReference
+                the reference locale, BCP47 string.
+
+        @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< OUString >::const_iterator getFallback( const ::std::vector< OUString > & rList,
+                                                                  const OUString & rReference );
+
+
     /** Test equality of two LanguageTag, possibly resolving system locale.
 
         @param bResolveSystem
diff --git a/i18npool/source/languagetag/languagetag.cxx b/i18npool/source/languagetag/languagetag.cxx
index 7b284b5..be6e228 100644
--- a/i18npool/source/languagetag/languagetag.cxx
+++ b/i18npool/source/languagetag/languagetag.cxx
@@ -1159,4 +1159,51 @@ LanguageTag::Extraction LanguageTag::simpleExtract( const OUString& rBcp47,
 }
 
 
+// static
+::std::vector< OUString >::const_iterator LanguageTag::getFallback(
+        const ::std::vector< OUString > & rList, const OUString & rReference )
+{
+    if (rList.empty())
+        return rList.end();
+
+    ::std::vector< OUString >::const_iterator it;
+
+    // Try the simple case first without constructing fallbacks.
+    for (it = rList.begin(); it != rList.end(); ++it)
+    {
+        if (*it == rReference)
+            return it;  // exact match
+    }
+
+    ::std::vector< OUString > aFallbacks( LanguageTag( rReference).getFallbackStrings());
+    aFallbacks.erase( aFallbacks.begin());  // first is full BCP47, we already checked that
+    if (rReference != "en-US")
+        aFallbacks.push_back( "en-US");
+    if (rReference != "en")
+        aFallbacks.push_back( "en");
+    if (rReference != "x-default")
+        aFallbacks.push_back( "x-default");
+    if (rReference != "x-no-translate")
+        aFallbacks.push_back( "x-no-translate");
+    /* TODO: the original comphelper::Locale::getFallback() code had
+     * "x-notranslate" instead of "x-no-translate", but all .xcu files use
+     * "x-no-translate" and "x-notranslate" apparently was never used anywhere.
+     * Did that ever work? Was it supposed to work at all like this? */
+
+    for (::std::vector< OUString >::const_iterator fb = aFallbacks.begin(); fb != aFallbacks.end(); ++fb)
+    {
+        for (it = rList.begin(); it != rList.end(); ++it)
+        {
+            if (*it == *fb)
+                return it;  // fallback found
+        }
+    }
+
+    // Did not find anything so return something of the list, the first value
+    // will do as well as any other as none did match any of the possible
+    // fallbacks.
+    return rList.begin();
+}
+
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list