From b51e22b520226eb54cf8dcbef3baeec5fc7805a9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 10 May 2019 13:46:35 +0200 Subject: [libcalamares] Implement locale lookups for 2-character codes --- src/libcalamares/locale/Lookup.cpp | 57 ++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/src/libcalamares/locale/Lookup.cpp b/src/libcalamares/locale/Lookup.cpp index 849668742..d38d417d4 100644 --- a/src/libcalamares/locale/Lookup.cpp +++ b/src/libcalamares/locale/Lookup.cpp @@ -22,30 +22,69 @@ namespace Calamares { + +struct TwoChar +{ + TwoChar( const QString& code ) + : cc1(0) + , cc2(0) + { + if ( code.length() == 2 ) + { + cc1 = code[0].toLatin1(); + cc2 = code[1].toLatin1(); + } + } + + char cc1; + char cc2; +}; + +static const CountryData* lookup( TwoChar c ) +{ + if ( !c.cc1 ) + return nullptr; + + const CountryData* p = std::find_if(country_data_table, country_data_table + country_data_size, + [c=c]( const CountryData& d ){ return (d.cc1 == c.cc1) && (d.cc2 == c.cc2); } + ); + if ( p == country_data_table + country_data_size ) + return nullptr; + return p; +} QLocale::Country countryForCode(const QString& code) { - return QLocale::Country::AnyCountry; + const CountryData* p = lookup( TwoChar( code ) ); + return p ? p->c : QLocale::Country::AnyCountry; } -QLocale countryLocale(const QString& code) +QLocale::Language languageForCountry(const QString& code) { - return QLocale(); + const CountryData* p = lookup( TwoChar( code ) ); + return p ? p->l : QLocale::Language::AnyLanguage; } -QLocale::Language languageForCountry(const QString& code) +QPair countryData(const QString& code) { - return QLocale::Language::AnyLanguage; + const CountryData* p = lookup( TwoChar( code ) ); + return p ? qMakePair( p->c, p->l ) : qMakePair( QLocale::Country::AnyCountry, QLocale::Language::AnyLanguage ); } -QLocale::Language languageForCountry(QLocale::Country country) +QLocale countryLocale(const QString& code) { - return QLocale::Language::AnyLanguage; + auto p = countryData( code ); + return QLocale( p.second, p.first ); } -QPair countryData(const QString& code) +QLocale::Language languageForCountry(QLocale::Country country) { - return qMakePair( QLocale::Country::AnyCountry, QLocale::Language::AnyLanguage ); + const CountryData* p = std::find_if(country_data_table, country_data_table + country_data_size, + [c=country]( const CountryData& d ){ return d.c == c; } + ); + if ( p == country_data_table + country_data_size ) + return QLocale::Language::AnyLanguage; + return p->l; } } // namespace -- cgit v1.2.2