Refactor Unix locale creation code
Just extract the code trying to find the matching locale into its own function. This commit is best viewed with --color-moved git option.
This commit is contained in:
@@ -96,6 +96,55 @@ locale_t TryCreateLocaleWithUTF8(wxLocaleIdent& locId)
|
|||||||
return loc;
|
return loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try finding a locale for the given identifier, modifying the argument to
|
||||||
|
// match the found locale if necessary.
|
||||||
|
locale_t TryCreateMatchingLocale(wxLocaleIdent& locId)
|
||||||
|
{
|
||||||
|
locale_t loc = TryCreateLocaleWithUTF8(locId);
|
||||||
|
if ( !loc )
|
||||||
|
{
|
||||||
|
// Try to find a variant of this locale available on this system: first
|
||||||
|
// of all, using just the language, without the territory, typically
|
||||||
|
// does _not_ work under Linux, so try adding one if we don't have it.
|
||||||
|
if ( locId.GetRegion().empty() )
|
||||||
|
{
|
||||||
|
const wxString lang = locId.GetLanguage();
|
||||||
|
|
||||||
|
const wxLanguageInfos& infos = wxGetLanguageInfos();
|
||||||
|
for ( wxLanguageInfos::const_iterator it = infos.begin();
|
||||||
|
it != infos.end();
|
||||||
|
++it )
|
||||||
|
{
|
||||||
|
const wxString& fullname = it->CanonicalName;
|
||||||
|
if ( fullname.BeforeFirst('_') == lang )
|
||||||
|
{
|
||||||
|
// We never have encoding in our canonical names, but we
|
||||||
|
// can have modifiers, so get rid of them if necessary.
|
||||||
|
const wxString&
|
||||||
|
region = fullname.AfterFirst('_').BeforeFirst('@');
|
||||||
|
if ( !region.empty() )
|
||||||
|
{
|
||||||
|
loc = TryCreateLocaleWithUTF8(locId.Region(region));
|
||||||
|
if ( loc )
|
||||||
|
{
|
||||||
|
// We take the first available region, we don't
|
||||||
|
// have enough data to know how to prioritize them
|
||||||
|
// (and wouldn't want to start any geopolitical
|
||||||
|
// disputes).
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't bother reverting region to the old value as it will
|
||||||
|
// be overwritten during the next loop iteration anyhow.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return loc;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // HAVE_LOCALE_T
|
#endif // HAVE_LOCALE_T
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
@@ -353,48 +402,7 @@ wxUILocaleImpl* wxUILocaleImpl::CreateForLocale(const wxLocaleIdent& locIdOrig)
|
|||||||
// Make a copy of it because it can be modified below.
|
// Make a copy of it because it can be modified below.
|
||||||
wxLocaleIdent locId = locIdOrig;
|
wxLocaleIdent locId = locIdOrig;
|
||||||
|
|
||||||
locale_t loc = TryCreateLocaleWithUTF8(locId);
|
const locale_t loc = TryCreateMatchingLocale(locId);
|
||||||
if ( !loc )
|
|
||||||
{
|
|
||||||
// Try to find a variant of this locale available on this system: first
|
|
||||||
// of all, using just the language, without the territory, typically
|
|
||||||
// does _not_ work under Linux, so try adding one if we don't have it.
|
|
||||||
if ( locId.GetRegion().empty() )
|
|
||||||
{
|
|
||||||
const wxString lang = locId.GetLanguage();
|
|
||||||
|
|
||||||
const wxLanguageInfos& infos = wxGetLanguageInfos();
|
|
||||||
for ( wxLanguageInfos::const_iterator it = infos.begin();
|
|
||||||
it != infos.end();
|
|
||||||
++it )
|
|
||||||
{
|
|
||||||
const wxString& fullname = it->CanonicalName;
|
|
||||||
if ( fullname.BeforeFirst('_') == lang )
|
|
||||||
{
|
|
||||||
// We never have encoding in our canonical names, but we
|
|
||||||
// can have modifiers, so get rid of them if necessary.
|
|
||||||
const wxString&
|
|
||||||
region = fullname.AfterFirst('_').BeforeFirst('@');
|
|
||||||
if ( !region.empty() )
|
|
||||||
{
|
|
||||||
loc = TryCreateLocaleWithUTF8(locId.Region(region));
|
|
||||||
if ( loc )
|
|
||||||
{
|
|
||||||
// We take the first available region, we don't
|
|
||||||
// have enough data to know how to prioritize them
|
|
||||||
// (and wouldn't want to start any geopolitical
|
|
||||||
// disputes).
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't bother reverting region to the old value as it will
|
|
||||||
// be overwritten during the next loop iteration anyhow.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !loc )
|
if ( !loc )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user