1
0
Fork 0

Fix translation of migration-notification dialog.

Was being shown before locale was selected, so always using default
translation. Fixed by deferring the dialog, and also added an assert
for debug builds, if trying to access translated string too early.
This commit is contained in:
James Turner 2020-06-17 10:57:34 +01:00
parent 42ed210c9c
commit 00d34b67e1
4 changed files with 29 additions and 14 deletions

View file

@ -787,15 +787,9 @@ static void tryAutosaveMigration(const SGPath& userDataPath, SGPropertyNode* pro
// copy remaining props out // copy remaining props out
copyProperties(&oldProps, props); copyProperties(&oldProps, props);
// inform the user // we can't inform the user yet, becuase embedded resources and the locale
FGLocale *locale = globals->get_locale(); // are not done. So we set a flag and check it once those things are done.
const auto title = locale->getLocalizedString("settings-migration-title", "sys", "Settings migrated"); fgSetBool("/sim/autosave-migration/did-migrate", true);
const auto msg = locale->getLocalizedString("settings-migration-text", "sys",
"Saved settings were migrated from a previous version of FlightGear. "
"If you encounter any problems when using the system, try restoring "
"the default settings, before reporting a problem. "
"Saved settings can affect the appearance, performance and features of the simulator.");
flightgear::modalMessageBox(title, msg);
} }
// Load user settings from the autosave file (normally in $FG_HOME) // Load user settings from the autosave file (normally in $FG_HOME)

View file

@ -231,11 +231,11 @@ FGLocale::selectLanguage(const char *language)
loadResource("tips"); loadResource("tips");
if (!_currentLocale) _inited = true;
{ if (!_currentLocale && !_currentLocaleString.empty()) {
SG_LOG(SG_GENERAL, SG_ALERT, SG_LOG(SG_GENERAL, SG_WARN,
"System locale not found or no internationalization settings specified in defaults.xml. Using default (en)." ); "System locale not found or no internationalization settings specified in defaults.xml. Using default (en).");
return false; return false;
} }
return true; return true;
@ -347,6 +347,7 @@ FGLocale::getLocalizedString(SGPropertyNode *localeNode, const char* id, const c
std::string std::string
FGLocale::getLocalizedString(const char* id, const char* resource, const char* Default) FGLocale::getLocalizedString(const char* id, const char* resource, const char* Default)
{ {
assert(_inited);
if (id && resource) if (id && resource)
{ {
std::string s; std::string s;
@ -371,6 +372,7 @@ FGLocale::getLocalizedString(const char* id, const char* resource, const char* D
std::string std::string
FGLocale::getLocalizedStringWithIndex(const char* id, const char* resource, unsigned int index) const FGLocale::getLocalizedStringWithIndex(const char* id, const char* resource, unsigned int index) const
{ {
assert(_inited);
if (id && resource) { if (id && resource) {
std::string s; std::string s;
if (_currentLocale) { if (_currentLocale) {
@ -404,6 +406,7 @@ FGLocale::getLocalizedStrings(SGPropertyNode *localeNode, const char* id, const
size_t FGLocale::getLocalizedStringCount(const char* id, const char* resource) const size_t FGLocale::getLocalizedStringCount(const char* id, const char* resource) const
{ {
assert(_inited);
if (_currentLocale) { if (_currentLocale) {
SGPropertyNode* resourceNode = _currentLocale->getNode("strings",0, true)->getNode(resource); SGPropertyNode* resourceNode = _currentLocale->getNode("strings",0, true)->getNode(resource);
if (resourceNode) { if (resourceNode) {
@ -427,6 +430,7 @@ size_t FGLocale::getLocalizedStringCount(const char* id, const char* resource) c
simgear::PropertyList simgear::PropertyList
FGLocale::getLocalizedStrings(const char* id, const char* resource) FGLocale::getLocalizedStrings(const char* id, const char* resource)
{ {
assert(_inited);
if (id && resource) if (id && resource)
{ {
if (_currentLocale) if (_currentLocale)
@ -450,6 +454,7 @@ FGLocale::getLocalizedStrings(const char* id, const char* resource)
const char* const char*
FGLocale::getDefaultFont(const char* fallbackFont) FGLocale::getDefaultFont(const char* fallbackFont)
{ {
assert(_inited);
const char* font = nullptr; const char* font = nullptr;
if (_currentLocale) if (_currentLocale)
{ {
@ -478,6 +483,7 @@ std::string FGLocale::localizedPrintf(const char* id, const char* resource, ...
std::string FGLocale::vlocalizedPrintf(const char* id, const char* resource, va_list args) std::string FGLocale::vlocalizedPrintf(const char* id, const char* resource, va_list args)
{ {
assert(_inited);
std::string format = getLocalizedString(id, resource); std::string format = getLocalizedString(id, resource);
int len = ::vsnprintf(nullptr, 0, format.c_str(), args); int len = ::vsnprintf(nullptr, 0, format.c_str(), args);
char* buf = (char*) alloca(len); char* buf = (char*) alloca(len);

View file

@ -153,6 +153,8 @@ private:
* such part, return a copy of the input string. * such part, return a copy of the input string.
*/ */
static std::string removeEncodingPart(const std::string& locale); static std::string removeEncodingPart(const std::string& locale);
bool _inited = false;
}; };
// global translation wrappers // global translation wrappers

View file

@ -686,6 +686,19 @@ int fgMainInit( int argc, char **argv )
SG_LOG(SG_GENERAL, SG_INFO, SG_LOG(SG_GENERAL, SG_INFO,
"EmbeddedResourceManager: selected locale '" << locale << "'"); "EmbeddedResourceManager: selected locale '" << locale << "'");
if (fgGetBool("/sim/autosave-migration/did-migrate", false)) {
// inform the user we did migration. This is the earliest point
// we can do it, since now the locale is set
auto locale = globals->get_locale();
const auto title = locale->getLocalizedString("settings-migration-title", "sys", "Settings migrated");
const auto msg = locale->getLocalizedString("settings-migration-text", "sys",
"Saved settings were migrated from a previous version of FlightGear. "
"If you encounter any problems when using the system, try restoring "
"the default settings, before reporting a problem. "
"Saved settings can affect the appearance, performance and features of the simulator.");
flightgear::modalMessageBox(title, msg);
}
// Copy the property nodes for the menus added by registered add-ons // Copy the property nodes for the menus added by registered add-ons
addons::AddonManager::instance()->addAddonMenusToFGMenubar(); addons::AddonManager::instance()->addAddonMenusToFGMenubar();