[libcalamares]: stronger type for translation name
QString -> Id for translations in the external API, to avoid accidentally converting a QLocale name (e.g. ca_ES) into a Calamares translation name. This preserves special-cases like ca@valencia and sr@latin.
This commit is contained in:
parent
bc9d8fb13a
commit
559c53b09c
@ -78,7 +78,7 @@ CalamaresApplication::init()
|
|||||||
initQmlPath();
|
initQmlPath();
|
||||||
initBranding();
|
initBranding();
|
||||||
|
|
||||||
CalamaresUtils::installTranslator( QLocale::system(), QString() );
|
CalamaresUtils::installTranslator();
|
||||||
|
|
||||||
setQuitOnLastWindowClosed( false );
|
setQuitOnLastWindowClosed( false );
|
||||||
setWindowIcon( QIcon( Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductIcon ) ) );
|
setWindowIcon( QIcon( Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductIcon ) ) );
|
||||||
|
@ -46,6 +46,11 @@ public:
|
|||||||
IfNeededWithCountry
|
IfNeededWithCountry
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Id
|
||||||
|
{
|
||||||
|
QString name;
|
||||||
|
};
|
||||||
|
|
||||||
/** @brief Empty locale. This uses the system-default locale. */
|
/** @brief Empty locale. This uses the system-default locale. */
|
||||||
Translation( QObject* parent = nullptr );
|
Translation( QObject* parent = nullptr );
|
||||||
|
|
||||||
@ -82,7 +87,7 @@ public:
|
|||||||
QLocale locale() const { return m_locale; }
|
QLocale locale() const { return m_locale; }
|
||||||
|
|
||||||
QString name() const { return m_locale.name(); }
|
QString name() const { return m_locale.name(); }
|
||||||
QString id() const { return m_localeId; }
|
Id id() const { return { m_localeId }; }
|
||||||
|
|
||||||
/// @brief Convenience accessor to the language part of the locale
|
/// @brief Convenience accessor to the language part of the locale
|
||||||
QLocale::Language language() const { return m_locale.language(); }
|
QLocale::Language language() const { return m_locale.language(); }
|
||||||
|
@ -28,29 +28,8 @@ static bool s_allowLocalTranslations = false;
|
|||||||
*/
|
*/
|
||||||
struct TranslationLoader
|
struct TranslationLoader
|
||||||
{
|
{
|
||||||
static QString mungeLocaleName( const QLocale& locale )
|
TranslationLoader( const QString& locale )
|
||||||
{
|
: m_localeName( locale )
|
||||||
QString localeName = locale.name();
|
|
||||||
localeName.replace( "-", "_" );
|
|
||||||
|
|
||||||
if ( localeName == "C" )
|
|
||||||
{
|
|
||||||
localeName = "en";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special case of sr@latin
|
|
||||||
//
|
|
||||||
// See top-level CMakeLists.txt about special cases for translation loading.
|
|
||||||
if ( locale.language() == QLocale::Language::Serbian && locale.script() == QLocale::Script::LatinScript )
|
|
||||||
{
|
|
||||||
localeName = QStringLiteral( "sr@latin" );
|
|
||||||
}
|
|
||||||
return localeName;
|
|
||||||
}
|
|
||||||
|
|
||||||
TranslationLoader( const QLocale& locale )
|
|
||||||
: m_locale( locale )
|
|
||||||
, m_localeName( mungeLocaleName( locale ) )
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,14 +37,13 @@ struct TranslationLoader
|
|||||||
/// @brief Loads @p translator with the specific translations of this type
|
/// @brief Loads @p translator with the specific translations of this type
|
||||||
virtual bool tryLoad( QTranslator* translator ) = 0;
|
virtual bool tryLoad( QTranslator* translator ) = 0;
|
||||||
|
|
||||||
const QLocale& m_locale;
|
|
||||||
QString m_localeName;
|
QString m_localeName;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @brief Loads translations for branding
|
/// @brief Loads translations for branding
|
||||||
struct BrandingLoader : public TranslationLoader
|
struct BrandingLoader : public TranslationLoader
|
||||||
{
|
{
|
||||||
BrandingLoader( const QLocale& locale, const QString& prefix )
|
BrandingLoader( const QString& locale, const QString& prefix )
|
||||||
: TranslationLoader( locale )
|
: TranslationLoader( locale )
|
||||||
, m_prefix( prefix )
|
, m_prefix( prefix )
|
||||||
{
|
{
|
||||||
@ -106,7 +84,7 @@ BrandingLoader::tryLoad( QTranslator* translator )
|
|||||||
{
|
{
|
||||||
QString filenameBase( m_prefix );
|
QString filenameBase( m_prefix );
|
||||||
filenameBase.remove( 0, m_prefix.lastIndexOf( QDir::separator() ) + 1 );
|
filenameBase.remove( 0, m_prefix.lastIndexOf( QDir::separator() ) + 1 );
|
||||||
if ( translator->load( m_locale, filenameBase, "_", brandingTranslationsDir.absolutePath() ) )
|
if ( translator->load( m_localeName, filenameBase, "_", brandingTranslationsDir.absolutePath() ) )
|
||||||
{
|
{
|
||||||
cDebug() << Logger::SubEntry << "Branding using locale:" << m_localeName;
|
cDebug() << Logger::SubEntry << "Branding using locale:" << m_localeName;
|
||||||
return true;
|
return true;
|
||||||
@ -189,26 +167,32 @@ static QTranslator* s_tztranslator = nullptr;
|
|||||||
static QString s_translatorLocaleName;
|
static QString s_translatorLocaleName;
|
||||||
|
|
||||||
void
|
void
|
||||||
installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix )
|
installTranslator( const CalamaresUtils::Locale::Translation::Id& locale, const QString& brandingTranslationsPrefix )
|
||||||
{
|
{
|
||||||
loadSingletonTranslator( BrandingLoader( locale, brandingTranslationsPrefix ), s_brandingTranslator );
|
s_translatorLocaleName = locale.name;
|
||||||
loadSingletonTranslator( TZLoader( locale ), s_tztranslator );
|
|
||||||
loadSingletonTranslator( CalamaresLoader( locale ), s_translator );
|
|
||||||
|
|
||||||
s_translatorLocaleName = CalamaresLoader::mungeLocaleName( locale );
|
loadSingletonTranslator( BrandingLoader( locale.name, brandingTranslationsPrefix ), s_brandingTranslator );
|
||||||
|
loadSingletonTranslator( TZLoader( locale.name ), s_tztranslator );
|
||||||
|
loadSingletonTranslator( CalamaresLoader( locale.name ), s_translator );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
installTranslator()
|
||||||
|
{
|
||||||
|
// Just wrap it up like an Id
|
||||||
|
installTranslator( { QLocale::system().name() }, QString() );
|
||||||
|
}
|
||||||
|
|
||||||
QString
|
CalamaresUtils::Locale::Translation::Id
|
||||||
translatorLocaleName()
|
translatorLocaleName()
|
||||||
{
|
{
|
||||||
return s_translatorLocaleName;
|
return { s_translatorLocaleName };
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
loadTranslator( const QLocale& locale, const QString& prefix, QTranslator* translator )
|
loadTranslator( const CalamaresUtils::Locale::Translation::Id& locale, const QString& prefix, QTranslator* translator )
|
||||||
{
|
{
|
||||||
return ::tryLoad( translator, prefix, locale.name() );
|
return ::tryLoad( translator, prefix, locale.name );
|
||||||
}
|
}
|
||||||
|
|
||||||
Retranslator::Retranslator( QObject* parent )
|
Retranslator::Retranslator( QObject* parent )
|
||||||
|
@ -12,8 +12,8 @@
|
|||||||
#define UTILS_RETRANSLATOR_H
|
#define UTILS_RETRANSLATOR_H
|
||||||
|
|
||||||
#include "DllMacro.h"
|
#include "DllMacro.h"
|
||||||
|
#include "locale/Translation.h"
|
||||||
|
|
||||||
#include <QList>
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
@ -25,12 +25,15 @@ class QTranslator;
|
|||||||
|
|
||||||
namespace CalamaresUtils
|
namespace CalamaresUtils
|
||||||
{
|
{
|
||||||
/**
|
/** @brief changes the application language.
|
||||||
* @brief installTranslator changes the application language.
|
* @param locale the new locale (names as defined by Calamares).
|
||||||
* @param locale the new locale.
|
|
||||||
* @param brandingTranslationsPrefix the branding path prefix, from Calamares::Branding.
|
* @param brandingTranslationsPrefix the branding path prefix, from Calamares::Branding.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT void installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix );
|
DLLEXPORT void installTranslator( const CalamaresUtils::Locale::Translation::Id& locale, const QString& brandingTranslationsPrefix );
|
||||||
|
|
||||||
|
/** @brief Initializes the translations with the current system settings
|
||||||
|
*/
|
||||||
|
DLLEXPORT void installTranslator();
|
||||||
|
|
||||||
/** @brief The name of the (locale of the) most recently installed translator
|
/** @brief The name of the (locale of the) most recently installed translator
|
||||||
*
|
*
|
||||||
@ -38,7 +41,7 @@ DLLEXPORT void installTranslator( const QLocale& locale, const QString& branding
|
|||||||
* QLocale passed in, because Calamares will munge some names and
|
* QLocale passed in, because Calamares will munge some names and
|
||||||
* may remap translations.
|
* may remap translations.
|
||||||
*/
|
*/
|
||||||
DLLEXPORT QString translatorLocaleName();
|
DLLEXPORT CalamaresUtils::Locale::Translation::Id translatorLocaleName();
|
||||||
|
|
||||||
/** @brief Loads <prefix><locale> translations into the given @p translator
|
/** @brief Loads <prefix><locale> translations into the given @p translator
|
||||||
*
|
*
|
||||||
@ -53,7 +56,7 @@ DLLEXPORT QString translatorLocaleName();
|
|||||||
*
|
*
|
||||||
* @returns @c true on success
|
* @returns @c true on success
|
||||||
*/
|
*/
|
||||||
DLLEXPORT bool loadTranslator( const QLocale& locale, const QString& prefix, QTranslator* translator );
|
DLLEXPORT bool loadTranslator( const CalamaresUtils::Locale::Translation::Id& locale, const QString& prefix, QTranslator* translator );
|
||||||
|
|
||||||
/** @brief Set @p allow to true to load translations from current dir.
|
/** @brief Set @p allow to true to load translations from current dir.
|
||||||
*
|
*
|
||||||
|
@ -27,7 +27,7 @@ retranslateKeyboardModels()
|
|||||||
{
|
{
|
||||||
s_kbtranslator = new QTranslator;
|
s_kbtranslator = new QTranslator;
|
||||||
}
|
}
|
||||||
(void)CalamaresUtils::loadTranslator( QLocale(), QStringLiteral( "kb_" ), s_kbtranslator );
|
(void)CalamaresUtils::loadTranslator( CalamaresUtils::translatorLocaleName(), QStringLiteral( "kb_" ), s_kbtranslator );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -150,10 +150,10 @@ Config::initLanguages()
|
|||||||
|
|
||||||
if ( matchedLocaleIndex >= 0 )
|
if ( matchedLocaleIndex >= 0 )
|
||||||
{
|
{
|
||||||
QString name = m_languages->locale( matchedLocaleIndex ).name();
|
auto languageId = m_languages->locale( matchedLocaleIndex ).id();
|
||||||
cDebug() << Logger::SubEntry << "Matched with index" << matchedLocaleIndex << name;
|
cDebug() << Logger::SubEntry << "Matched with index" << matchedLocaleIndex << languageId.name;
|
||||||
|
|
||||||
CalamaresUtils::installTranslator( name, Calamares::Branding::instance()->translationsDirectory() );
|
CalamaresUtils::installTranslator( languageId, Calamares::Branding::instance()->translationsDirectory() );
|
||||||
setLocaleIndex( matchedLocaleIndex );
|
setLocaleIndex( matchedLocaleIndex );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -188,16 +188,16 @@ Config::setLocaleIndex( int index )
|
|||||||
|
|
||||||
m_localeIndex = index;
|
m_localeIndex = index;
|
||||||
|
|
||||||
const auto& selectedLocale = m_languages->locale( m_localeIndex ).locale();
|
const auto& selectedTranslation = m_languages->locale( m_localeIndex );
|
||||||
cDebug() << "Index" << index << "Selected locale" << selectedLocale;
|
cDebug() << "Index" << index << "Selected locale" << selectedTranslation.id().name;
|
||||||
|
|
||||||
QLocale::setDefault( selectedLocale );
|
QLocale::setDefault( selectedTranslation.locale() );
|
||||||
CalamaresUtils::installTranslator( selectedLocale, Calamares::Branding::instance()->translationsDirectory() );
|
CalamaresUtils::installTranslator( selectedTranslation.id(), Calamares::Branding::instance()->translationsDirectory() );
|
||||||
if ( Calamares::JobQueue::instance() && Calamares::JobQueue::instance()->globalStorage() )
|
if ( Calamares::JobQueue::instance() && Calamares::JobQueue::instance()->globalStorage() )
|
||||||
{
|
{
|
||||||
CalamaresUtils::Locale::insertGS( *Calamares::JobQueue::instance()->globalStorage(),
|
CalamaresUtils::Locale::insertGS( *Calamares::JobQueue::instance()->globalStorage(),
|
||||||
QStringLiteral( "LANG" ),
|
QStringLiteral( "LANG" ),
|
||||||
CalamaresUtils::translatorLocaleName() );
|
CalamaresUtils::translatorLocaleName().name );
|
||||||
}
|
}
|
||||||
emit localeIndexChanged( m_localeIndex );
|
emit localeIndexChanged( m_localeIndex );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user