|
|
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)
|