Switch to language_code instead of language _order key
This commit is contained in:
+50
-10
@@ -4,13 +4,15 @@
|
|||||||
#include <HardwareSerial.h>
|
#include <HardwareSerial.h>
|
||||||
#include <Serialization.h>
|
#include <Serialization.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "I18nStrings.h"
|
#include "I18nStrings.h"
|
||||||
|
|
||||||
using namespace i18n_strings;
|
using namespace i18n_strings;
|
||||||
|
|
||||||
// Settings file path
|
// Settings file path
|
||||||
static constexpr const char* SETTINGS_FILE = "/.crosspoint/language.bin";
|
static constexpr const char* SETTINGS_FILE = "/.crosspoint/language.bin";
|
||||||
static constexpr uint8_t SETTINGS_VERSION = 1;
|
static constexpr uint8_t SETTINGS_VERSION = 2;
|
||||||
|
|
||||||
I18n& I18n::getInstance() {
|
I18n& I18n::getInstance() {
|
||||||
static I18n instance;
|
static I18n instance;
|
||||||
@@ -44,6 +46,14 @@ const char* I18n::getLanguageName(Language lang) const {
|
|||||||
return LANGUAGE_NAMES[index];
|
return LANGUAGE_NAMES[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* I18n::getLanguageCode(Language lang) const {
|
||||||
|
const auto index = static_cast<size_t>(lang);
|
||||||
|
if (index >= static_cast<size_t>(Language::_COUNT)) {
|
||||||
|
return LANGUAGE_CODES[0];
|
||||||
|
}
|
||||||
|
return LANGUAGE_CODES[index];
|
||||||
|
}
|
||||||
|
|
||||||
void I18n::saveSettings() {
|
void I18n::saveSettings() {
|
||||||
Storage.mkdir("/.crosspoint");
|
Storage.mkdir("/.crosspoint");
|
||||||
|
|
||||||
@@ -54,10 +64,11 @@ void I18n::saveSettings() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
serialization::writePod(file, SETTINGS_VERSION);
|
serialization::writePod(file, SETTINGS_VERSION);
|
||||||
serialization::writePod(file, static_cast<uint8_t>(_language));
|
serialization::writeString(file, getLanguageCode(_language));
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
Serial.printf("[I18N] Settings saved: language=%d\n", static_cast<int>(_language));
|
Serial.printf("[I18N] Settings saved: language=%d code=%s\n", static_cast<int>(_language),
|
||||||
|
getLanguageCode(_language));
|
||||||
}
|
}
|
||||||
|
|
||||||
void I18n::loadSettings() {
|
void I18n::loadSettings() {
|
||||||
@@ -69,19 +80,48 @@ void I18n::loadSettings() {
|
|||||||
|
|
||||||
uint8_t version;
|
uint8_t version;
|
||||||
serialization::readPod(file, version);
|
serialization::readPod(file, version);
|
||||||
if (version != SETTINGS_VERSION) {
|
|
||||||
Serial.printf("[I18N] Settings version mismatch\n");
|
if (version == SETTINGS_VERSION) {
|
||||||
|
std::string code;
|
||||||
|
serialization::readString(file, code);
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < getLanguageCount(); i++) {
|
||||||
|
if (code == LANGUAGE_CODES[i]) {
|
||||||
|
_language = static_cast<Language>(i);
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found) {
|
||||||
|
Serial.printf("[I18N] Loaded language code: %s (%d)\n", code.c_str(), static_cast<int>(_language));
|
||||||
|
} else {
|
||||||
|
Serial.printf("[I18N] Unknown language code in settings: %s\n", code.c_str());
|
||||||
|
}
|
||||||
file.close();
|
file.close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t lang;
|
// Legacy migration path: version 1 stored language enum index directly.
|
||||||
serialization::readPod(file, lang);
|
if (version == 1) {
|
||||||
if (lang < static_cast<size_t>(Language::_COUNT)) {
|
uint8_t lang;
|
||||||
_language = static_cast<Language>(lang);
|
serialization::readPod(file, lang);
|
||||||
Serial.printf("[I18N] Loaded language: %d\n", static_cast<int>(_language));
|
if (lang < static_cast<size_t>(Language::_COUNT)) {
|
||||||
|
_language = static_cast<Language>(lang);
|
||||||
|
Serial.printf("[I18N] Migrating v1 language index: %d -> %s\n", static_cast<int>(_language),
|
||||||
|
getLanguageCode(_language));
|
||||||
|
file.close();
|
||||||
|
saveSettings();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
Serial.printf("[I18N] Invalid v1 language index: %d\n", static_cast<int>(lang));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Serial.printf("[I18N] Settings version mismatch: %d\n", static_cast<int>(version));
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ class I18n {
|
|||||||
|
|
||||||
Language getLanguage() const { return _language; }
|
Language getLanguage() const { return _language; }
|
||||||
void setLanguage(Language lang);
|
void setLanguage(Language lang);
|
||||||
|
const char* getLanguageCode(Language lang) const;
|
||||||
const char* getLanguageName(Language lang) const;
|
const char* getLanguageName(Language lang) const;
|
||||||
|
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
|
|||||||
@@ -471,6 +471,10 @@ def generate_keys_header(
|
|||||||
lines.append("")
|
lines.append("")
|
||||||
|
|
||||||
# Extern declarations
|
# Extern declarations
|
||||||
|
lines.append("// Language codes (defined in I18nStrings.cpp)")
|
||||||
|
lines.append("extern const char* const LANGUAGE_CODES[];")
|
||||||
|
lines.append("")
|
||||||
|
|
||||||
lines.append("// Language display names (defined in I18nStrings.cpp)")
|
lines.append("// Language display names (defined in I18nStrings.cpp)")
|
||||||
lines.append("extern const char* const LANGUAGE_NAMES[];")
|
lines.append("extern const char* const LANGUAGE_NAMES[];")
|
||||||
lines.append("")
|
lines.append("")
|
||||||
@@ -592,6 +596,14 @@ def generate_strings_cpp(
|
|||||||
"",
|
"",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# LANGUAGE_NAMES array
|
||||||
|
lines.append("// Language codes")
|
||||||
|
lines.append("const char* const LANGUAGE_CODES[] = {")
|
||||||
|
for code in languages:
|
||||||
|
_append_string_entry(lines, code)
|
||||||
|
lines.append("};")
|
||||||
|
lines.append("")
|
||||||
|
|
||||||
# LANGUAGE_NAMES array
|
# LANGUAGE_NAMES array
|
||||||
lines.append("// Language display names")
|
lines.append("// Language display names")
|
||||||
lines.append("const char* const LANGUAGE_NAMES[] = {")
|
lines.append("const char* const LANGUAGE_NAMES[] = {")
|
||||||
|
|||||||
Reference in New Issue
Block a user