Browse Source

Update language selection

QGC4.4
Don Gagne 3 years ago committed by Don Gagne
parent
commit
17e4bd2824
  1. 68
      src/QGCApplication.cc
  2. 8
      src/QmlControls/ScreenToolsController.cc
  3. 13
      src/Settings/App.SettingsGroup.json
  4. 103
      src/Settings/AppSettings.cc
  5. 12
      src/Settings/AppSettings.h
  6. 6
      src/ui/preferences/GeneralSettings.qml

68
src/QGCApplication.cc

@ -383,71 +383,9 @@ void QGCApplication::setLanguage() @@ -383,71 +383,9 @@ void QGCApplication::setLanguage()
_locale = QLocale::system();
qDebug() << "System reported locale:" << _locale << "; Name" << _locale.name() << "; Preffered (used in maps): " << (QLocale::system().uiLanguages().length() > 0 ? QLocale::system().uiLanguages()[0] : "None");
int langID = AppSettings::_languageID();
//-- See App.SettinsGroup.json for index
if(langID) {
switch(langID) {
case 1:
_locale = QLocale(QLocale::Bulgarian);
break;
case 2:
_locale = QLocale(QLocale::Chinese);
break;
case 3:
_locale = QLocale(QLocale::Dutch);
break;
case 4:
_locale = QLocale(QLocale::English);
break;
case 5:
_locale = QLocale(QLocale::Finnish);
break;
case 6:
_locale = QLocale(QLocale::French);
break;
case 7:
_locale = QLocale(QLocale::German);
break;
case 8:
_locale = QLocale(QLocale::Greek);
break;
case 9:
_locale = QLocale(QLocale::Hebrew);
break;
case 10:
_locale = QLocale(QLocale::Italian);
break;
case 11:
_locale = QLocale(QLocale::Japanese);
break;
case 12:
_locale = QLocale(QLocale::Korean);
break;
case 13:
_locale = QLocale(QLocale::NorwegianBokmal);
break;
case 14:
_locale = QLocale(QLocale::Polish);
break;
case 15:
_locale = QLocale(QLocale::Portuguese);
break;
case 16:
_locale = QLocale(QLocale::Russian);
break;
case 17:
_locale = QLocale(QLocale::Spanish);
break;
case 18:
_locale = QLocale(QLocale::Swedish);
break;
case 19:
_locale = QLocale(QLocale::Turkish);
break;
case 20:
_locale = QLocale(QLocale::Azerbaijani);
break;
}
QLocale::Language possibleLocale = AppSettings::_qLocaleLanguageID();
if (possibleLocale != QLocale::AnyLanguage) {
_locale = QLocale(possibleLocale);
}
//-- We have specific fonts for Korean
if(_locale == QLocale::Korean) {

8
src/QmlControls/ScreenToolsController.cc

@ -55,8 +55,8 @@ QString @@ -55,8 +55,8 @@ QString
ScreenToolsController::normalFontFamily() const
{
//-- See App.SettinsGroup.json for index
int langID = qgcApp()->toolbox()->settingsManager()->appSettings()->language()->rawValue().toInt();
if(langID == 6 /*Korean*/) {
int langID = qgcApp()->toolbox()->settingsManager()->appSettings()->qLocaleLanguage()->rawValue().toInt();
if(langID == QLocale::Korean) {
return QString("NanumGothic");
} else {
return QString("Open Sans");
@ -67,8 +67,8 @@ QString @@ -67,8 +67,8 @@ QString
ScreenToolsController::boldFontFamily() const
{
//-- See App.SettinsGroup.json for index
int langID = qgcApp()->toolbox()->settingsManager()->appSettings()->language()->rawValue().toInt();
if(langID == 6 /*Korean*/) {
int langID = qgcApp()->toolbox()->settingsManager()->appSettings()->qLocaleLanguage()->rawValue().toInt();
if(langID == QLocale::Korean) {
return QString("NanumGothic");
} else {
return QString("Open Sans Semibold");

13
src/Settings/App.SettingsGroup.json

@ -277,12 +277,13 @@ @@ -277,12 +277,13 @@
"default": false
},
{
"name": "language",
"shortDesc": "Language",
"type": "uint32",
"enumStrings": "System,български (Bulgarian),中文 (Chinese),Nederlands (Dutch),English,Suomi (Finnish),Français (French),Deutsche (German),Ελληνικά (Greek), עברית (Hebrew),Italiano (Italian),日本人 (Japanese),한국어 (Korean),Norsk (Norwegian),Polskie (Polish),Português (Portuguese),Pусский (Russian),Español (Spanish),Svenska (Swedish),Türk (Turkish),Azerbaijani (Azerbaijani)",
"enumValues": "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20",
"default": 0
"name": "qLocaleLanguage",
"shortDesc": "Language",
"type": "uint32",
"enumStrings": "System,Azerbaijani (Azerbaijani),български (Bulgarian),中文 (Chinese),Nederlands (Dutch),English,Suomi (Finnish),Français (French),Deutsche (German),Ελληνικά (Greek), עברית (Hebrew),Italiano (Italian),日本人 (Japanese),한국어 (Korean),Norsk (Norwegian),Polskie (Polish),Português (Portuguese),Pусский (Russian),Español (Spanish),Svenska (Swedish),Türk (Turkish)",
"enumValues": "0,12,20,25,30,31,36,37,42,43,48,58,59,66,85,90,91,96,111,114,125",
"comment": "enumValues uses Qt QLocale::Language values",
"default": 0
},
{
"name": "disableAllPersistence",

103
src/Settings/AppSettings.cc

@ -35,6 +35,20 @@ const char* AppSettings::videoDirectory = QT_TRANSLATE_NOOP("AppSettin @@ -35,6 +35,20 @@ const char* AppSettings::videoDirectory = QT_TRANSLATE_NOOP("AppSettin
const char* AppSettings::photoDirectory = QT_TRANSLATE_NOOP("AppSettings", "Photo");
const char* AppSettings::crashDirectory = QT_TRANSLATE_NOOP("AppSettings", "CrashLogs");
// Release languages are 90%+ complete
QList<int> AppSettings::_rgReleaseLanguages = {
QLocale::AnyLanguage, // System
QLocale::Chinese,
QLocale::English,
QLocale::Korean,
QLocale::Azerbaijani,
};
// Partial languages are 40%+ complete
QList<int> AppSettings::_rgPartialLanguages = {
QLocale::German,
QLocale::Turkish,
};
DECLARE_SETTINGGROUP(App, "")
{
qmlRegisterUncreatableType<AppSettings>("QGroundControl.SettingsManager", 1, 0, "AppSettings", "Reference only");
@ -94,9 +108,6 @@ DECLARE_SETTINGGROUP(App, "") @@ -94,9 +108,6 @@ DECLARE_SETTINGGROUP(App, "")
connect(savePathFact, &Fact::rawValueChanged, this, &AppSettings::_checkSavePathDirectories);
_checkSavePathDirectories();
//-- Keep track of language changes
SettingsFact* languageFact = qobject_cast<SettingsFact*>(language());
connect(languageFact, &Fact::rawValueChanged, this, &AppSettings::_languageChanged);
}
DECLARE_SETTINGSFACT(AppSettings, offlineEditingFirmwareClass)
@ -131,7 +142,6 @@ DECLARE_SETTINGSFACT(AppSettings, apmStartMavlinkStreams) @@ -131,7 +142,6 @@ DECLARE_SETTINGSFACT(AppSettings, apmStartMavlinkStreams)
DECLARE_SETTINGSFACT(AppSettings, enableTaisync)
DECLARE_SETTINGSFACT(AppSettings, enableTaisyncVideo)
DECLARE_SETTINGSFACT(AppSettings, enableMicrohard)
DECLARE_SETTINGSFACT(AppSettings, language)
DECLARE_SETTINGSFACT(AppSettings, disableAllPersistence)
DECLARE_SETTINGSFACT(AppSettings, usePairing)
DECLARE_SETTINGSFACT(AppSettings, saveCsvTelemetry)
@ -148,7 +158,57 @@ DECLARE_SETTINGSFACT_NO_FUNC(AppSettings, indoorPalette) @@ -148,7 +158,57 @@ DECLARE_SETTINGSFACT_NO_FUNC(AppSettings, indoorPalette)
return _indoorPaletteFact;
}
void AppSettings::_languageChanged()
DECLARE_SETTINGSFACT_NO_FUNC(AppSettings, qLocaleLanguage)
{
if (!_qLocaleLanguageFact) {
_qLocaleLanguageFact = _createSettingsFact(qLocaleLanguageName);
connect(_qLocaleLanguageFact, &Fact::rawValueChanged, this, &AppSettings::_qLocaleLanguageChanged);
FactMetaData* metaData = _qLocaleLanguageFact->metaData();
QStringList rgOriginalStrings = metaData->enumStrings();
QVariantList rgOriginalValues = metaData->enumValues();
QStringList rgUpdatedStrings;
QVariantList rgUpdatedValues;
#ifdef DAILY_BUILD
// Daily builds include selection of all languages and mark non-release languages as testing only
for (int i=0; i<rgOriginalStrings.count(); i++) {
int languageId = rgOriginalValues[i].toInt();
QString updatedString = rgOriginalStrings[i];
if (_rgPartialLanguages.contains(languageId)) {
updatedString += tr(" (Partial)");
} else if (!_rgReleaseLanguages.contains(languageId)) {
updatedString += tr(" (Testing Only)");
}
rgUpdatedStrings.append(updatedString);
rgUpdatedValues.append(rgOriginalValues[i]);
}
#else
// Stable builds only allow released and partial language selection
for (int i=0; i<rgOriginalStrings.count(); i++) {
bool addToList = false;
int languageId = rgOriginalValues[i].toInt();
QString updatedString = rgOriginalStrings[i];
if (_rgPartialLanguages.contains(languageId)) {
addToList = true;
updatedString += tr(" (Partial)");
} else if (_rgReleaseLanguages.contains(languageId)) {
addToList = true;
}
if (addToList) {
rgUpdatedStrings.append(updatedString);
rgUpdatedValues.append(rgOriginalValues[i]);
}
}
#endif
metaData->setEnumInfo(rgUpdatedStrings, rgUpdatedValues);
}
return _qLocaleLanguageFact;
}
void AppSettings::_qLocaleLanguageChanged()
{
qgcApp()->setLanguage();
}
@ -275,10 +335,35 @@ void AppSettings::firstRunPromptIdsMarkIdAsShown(int id) @@ -275,10 +335,35 @@ void AppSettings::firstRunPromptIdsMarkIdAsShown(int id)
}
}
int AppSettings::_languageID(void)
/// Hack to provide language settings as early in the boot process as possible. Must be known
/// prior to loading any json files.
QLocale::Language AppSettings::_qLocaleLanguageID(void)
{
// Hack to provide language settings as early in the boot process as possible. Must be know
// prior to loading any json files.
QSettings settings;
return settings.value("language", 0).toInt();
if (settings.childKeys().contains("language")) {
// We need to convert to the new settings key/values
#if 0
// Old vales
"enumStrings": "System,български (Bulgarian),中文 (Chinese),Nederlands (Dutch),English,Suomi (Finnish),Français (French),Deutsche (German),Ελληνικά (Greek), עברית (Hebrew),Italiano (Italian),日本人 (Japanese),한국어 (Korean),Norsk (Norwegian),Polskie (Polish),Português (Portuguese),Pусский (Russian),Español (Spanish),Svenska (Swedish),Türk (Turkish),Azerbaijani (Azerbaijani)",
"enumValues": "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20",
#endif
static QList<int> rgNewValues = { 0,20,25,30,31,36,37,42,43,48,58,59,66,85,90,91,96,111,114,125,15 };
int oldValue = settings.value("language").toInt();
settings.setValue(qLocaleLanguageName, rgNewValues[oldValue]);
settings.remove("language");
}
QLocale::Language id = settings.value(qLocaleLanguageName, QLocale::AnyLanguage).value<QLocale::Language>();
if (id == QLocale::AnyLanguage) {
#ifndef DAILY_BUILD
// Stable builds only support released and partial languages
if (!_rgReleaseLanguages.contains(id) && _rgPartialLanguages.contains(id)) {
id = QLocale::English;
}
#endif
}
return id;
}

12
src/Settings/AppSettings.h

@ -58,7 +58,7 @@ public: @@ -58,7 +58,7 @@ public:
DEFINE_SETTINGFACT(enableTaisync)
DEFINE_SETTINGFACT(enableTaisyncVideo)
DEFINE_SETTINGFACT(enableMicrohard)
DEFINE_SETTINGFACT(language)
DEFINE_SETTINGFACT(qLocaleLanguage)
DEFINE_SETTINGFACT(disableAllPersistence)
DEFINE_SETTINGFACT(usePairing)
DEFINE_SETTINGFACT(saveCsvTelemetry)
@ -121,11 +121,11 @@ public: @@ -121,11 +121,11 @@ public:
static const char* photoDirectory;
static const char* crashDirectory;
// Returns the current language setting bypassing the standard SettingsGroup path. This should only be used
// Returns the current qLocaleLanguage setting bypassing the standard SettingsGroup path. This should only be used
// by QGCApplication::setLanguage to query the language setting as early in the boot process as possible.
// Specfically prior to any JSON files being loaded such that JSON file can be translated. Also since this
// is a one-off mechanism custom build overrides for language are not currently supported.
static int _languageID(void);
static QLocale::Language _qLocaleLanguageID(void);
signals:
void savePathsChanged();
@ -133,5 +133,9 @@ signals: @@ -133,5 +133,9 @@ signals:
private slots:
void _indoorPaletteChanged();
void _checkSavePathDirectories();
void _languageChanged();
void _qLocaleLanguageChanged();
private:
static QList<int> _rgReleaseLanguages;
static QList<int> _rgPartialLanguages;
};

6
src/ui/preferences/GeneralSettings.qml

@ -466,13 +466,13 @@ Rectangle { @@ -466,13 +466,13 @@ Rectangle {
QGCLabel {
text: qsTr("Language")
visible: QGroundControl.settingsManager.appSettings.language.visible
visible: QGroundControl.settingsManager.appSettings.qLocaleLanguage.visible
}
FactComboBox {
Layout.preferredWidth: _comboFieldWidth
fact: QGroundControl.settingsManager.appSettings.language
fact: QGroundControl.settingsManager.appSettings.qLocaleLanguage
indexModel: false
visible: QGroundControl.settingsManager.appSettings.language.visible
visible: QGroundControl.settingsManager.appSettings.qLocaleLanguage.visible
}
QGCLabel {

Loading…
Cancel
Save