diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index 972eaeb82..eac356cbd 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -787,15 +787,9 @@ static void tryAutosaveMigration(const SGPath& userDataPath, SGPropertyNode* pro // copy remaining props out copyProperties(&oldProps, props); - // inform the user - FGLocale *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); + // we can't inform the user yet, becuase embedded resources and the locale + // are not done. So we set a flag and check it once those things are done. + fgSetBool("/sim/autosave-migration/did-migrate", true); } // Load user settings from the autosave file (normally in $FG_HOME) diff --git a/src/Main/locale.cxx b/src/Main/locale.cxx index 2b2edbb3f..7626a8010 100644 --- a/src/Main/locale.cxx +++ b/src/Main/locale.cxx @@ -231,11 +231,11 @@ FGLocale::selectLanguage(const char *language) loadResource("tips"); - if (!_currentLocale) - { - SG_LOG(SG_GENERAL, SG_ALERT, - "System locale not found or no internationalization settings specified in defaults.xml. Using default (en)." ); - return false; + _inited = true; + if (!_currentLocale && !_currentLocaleString.empty()) { + SG_LOG(SG_GENERAL, SG_WARN, + "System locale not found or no internationalization settings specified in defaults.xml. Using default (en)."); + return false; } return true; @@ -347,6 +347,7 @@ FGLocale::getLocalizedString(SGPropertyNode *localeNode, const char* id, const c std::string FGLocale::getLocalizedString(const char* id, const char* resource, const char* Default) { + assert(_inited); if (id && resource) { std::string s; @@ -371,6 +372,7 @@ FGLocale::getLocalizedString(const char* id, const char* resource, const char* D std::string FGLocale::getLocalizedStringWithIndex(const char* id, const char* resource, unsigned int index) const { + assert(_inited); if (id && resource) { std::string s; 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 { + assert(_inited); if (_currentLocale) { SGPropertyNode* resourceNode = _currentLocale->getNode("strings",0, true)->getNode(resource); if (resourceNode) { @@ -427,6 +430,7 @@ size_t FGLocale::getLocalizedStringCount(const char* id, const char* resource) c simgear::PropertyList FGLocale::getLocalizedStrings(const char* id, const char* resource) { + assert(_inited); if (id && resource) { if (_currentLocale) @@ -450,6 +454,7 @@ FGLocale::getLocalizedStrings(const char* id, const char* resource) const char* FGLocale::getDefaultFont(const char* fallbackFont) { + assert(_inited); const char* font = nullptr; 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) { + assert(_inited); std::string format = getLocalizedString(id, resource); int len = ::vsnprintf(nullptr, 0, format.c_str(), args); char* buf = (char*) alloca(len); diff --git a/src/Main/locale.hxx b/src/Main/locale.hxx index b720954af..3bc25d70a 100644 --- a/src/Main/locale.hxx +++ b/src/Main/locale.hxx @@ -153,6 +153,8 @@ private: * such part, return a copy of the input string. */ static std::string removeEncodingPart(const std::string& locale); + + bool _inited = false; }; // global translation wrappers diff --git a/src/Main/main.cxx b/src/Main/main.cxx index ad437dcc3..36cd04231 100755 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -686,6 +686,19 @@ int fgMainInit( int argc, char **argv ) SG_LOG(SG_GENERAL, SG_INFO, "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 addons::AddonManager::instance()->addAddonMenusToFGMenubar();