a648e02
--- a/vcl/unx/source/fontmanager/fontconfig.cxx
a648e02
+++ b/vcl/unx/source/fontmanager/fontconfig.cxx
a648e02
@@ -303,7 +303,7 @@
0d06f47
     boost::unordered_map< rtl::OString, rtl::OString, rtl::OStringHash > m_aFontNameToLocalized;
0d06f47
     boost::unordered_map< rtl::OString, rtl::OString, rtl::OStringHash > m_aLocalizedToCanonical;
0d06f47
 private:
0d06f47
-    void cacheLocalizedFontNames(FcChar8 *origfontname, FcChar8 *bestfontname, const std::vector< lang_and_element > &lang_and_elements);
0d06f47
+    void cacheLocalizedFontNames(const FcChar8 *origfontname, const FcChar8 *bestfontname, const std::vector< lang_and_element > &lang_and_elements);
0d06f47
 };
0d06f47
 
a648e02
 oslGenericFunction FontCfgWrapper::loadSymbol( const char* pSymbol )
a648e02
@@ -665,6 +665,7 @@
0d06f47
 
0d06f47
         std::vector<lang_and_element>::const_iterator aEnd = elements.end();
0d06f47
         bool alreadyclosematch = false;
0d06f47
+        bool found_fallback_englishname = false;
0d06f47
         for( std::vector<lang_and_element>::const_iterator aIter = elements.begin(); aIter != aEnd; ++aIter )
0d06f47
         {
0d06f47
             const char *pLang = (const char*)aIter->first;
a648e02
@@ -676,7 +677,8 @@
0d06f47
             }
0d06f47
             else if( alreadyclosematch )
0d06f47
             {
0d06f47
-                // override candidate only if there is a perfect match
0d06f47
+                // current candidate matches lang of lang-TERRITORY
0d06f47
+                // override candidate only if there is a full match
0d06f47
                 continue;
0d06f47
             }
0d06f47
             else if( rtl_str_compare( pLang, sLangMatch.getStr()) == 0)
a648e02
@@ -685,10 +687,18 @@
0d06f47
                 candidate = aIter->second;
0d06f47
                 alreadyclosematch = true;
0d06f47
             }
0d06f47
+            else if( found_fallback_englishname )
0d06f47
+            {
0d06f47
+                // already found an english fallback, don't override candidate
0d06f47
+                // unless there is a better language match
0d06f47
+                continue;
0d06f47
+            }
0d06f47
             else if( rtl_str_compare( pLang, "en") == 0)
0d06f47
             {
0d06f47
-                // fallback to the english element name
0d06f47
+                // select a fallback candidate of the first english element
0d06f47
+                // name
0d06f47
                 candidate = aIter->second;
0d06f47
+                found_fallback_englishname = true;
0d06f47
             }
0d06f47
         }
0d06f47
         return candidate;
a648e02
@@ -696,7 +706,8 @@
0d06f47
 }
0d06f47
 
0d06f47
 //Set up maps to quickly map between a fonts best UI name and all the rest of its names, and vice versa
0d06f47
-void FontCfgWrapper::cacheLocalizedFontNames(FcChar8 *origfontname, FcChar8 *bestfontname, const std::vector< lang_and_element > &lang_and_elements)
0d06f47
+void FontCfgWrapper::cacheLocalizedFontNames(const FcChar8 *origfontname, const FcChar8 *bestfontname,
0d06f47
+    const std::vector< lang_and_element > &lang_and_elements)
0d06f47
 {
0d06f47
     std::vector<lang_and_element>::const_iterator aEnd = lang_and_elements.end();
0d06f47
     for (std::vector<lang_and_element>::const_iterator aIter = lang_and_elements.begin(); aIter != aEnd; ++aIter)