1
0
Fork 0

Load --help output and translated strings from $FG_INSTALL_PREFIX/share/flightgear

$FG_INSTALL_PREFIX represents the FlightGear installation prefix, such
as /usr, /usr/local or /opt/FlightGear on Unix systems. Copying the
--help output and translated strings there avoids having to write to
$FG_ROOT when 'make install' (or some OS-dependent equivalent) is run
from the FlightGear build directory---that would be ugly when $FG_ROOT
points to the FGData Git repository.

In FGLocale::FGLocale(), Translations/locale.xml is loaded using
readProperties() and fatalMessageBox() (in case an error is
encountered). Note that it couldn't be loaded via fgLoadProps() in the
current state, because this function relies on guiErrorMessage() when an
error is encountered, which calls mkDialog(), which itself does
globals->get_subsystem("gui"). This last call can't be done from
FGGlobals' constructor---where the 'globals' pointer is still
NULL---hence the need for a different mechanism not relying on
FGGlobals.

For consistency, and also because it provides a better user experience[1],
load options.xml using the same method instead of with fgLoadProps().

[1] I.e., in case of an error, the user gets to see a graphical popup
    window with an explanatory message before FG exits, assuming he is
    either on Windows, or on Mac, or has Qt support built in FG, as
    opposed to only an SG_LOG() call [because when options.xml is
    loaded, guiErrorMessage() used by fgLoadProps() can't use the 'gui'
    subsystem].
This commit is contained in:
Florent Rougon 2016-12-26 16:56:04 +01:00
parent a6afda53bb
commit 7288628919
2 changed files with 35 additions and 9 deletions

View file

@ -27,6 +27,7 @@
#endif #endif
#include <cstdio> #include <cstdio>
#include <cstdlib>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <simgear/props/props_io.hxx> #include <simgear/props/props_io.hxx>
@ -34,6 +35,7 @@
#include "fg_props.hxx" #include "fg_props.hxx"
#include "locale.hxx" #include "locale.hxx"
#include <GUI/MessageBox.hxx>
using std::vector; using std::vector;
using std::string; using std::string;
@ -42,6 +44,25 @@ FGLocale::FGLocale(SGPropertyNode* root) :
_intl(root->getNode("/sim/intl",0, true)), _intl(root->getNode("/sim/intl",0, true)),
_defaultLocale(_intl->getChild("locale",0, true)) _defaultLocale(_intl->getChild("locale",0, true))
{ {
// Load locale.xml under _intl (which corresponds to /sim/intl). I don't
// pretend it is very useful to have this in the Global Property Tree; I
// am just making it visible under /sim/intl to preserve the previous
// behavior (when locale.xml was in FGData and automatically loaded under
// /sim/intl via an <intl include=... /> in $FG_ROOT/preferences.xml).
SGPath localeXML =
SGPath(FG_INSTALL_PREFIX) / "share/flightgear/Translations/locale.xml";
try {
readProperties(localeXML, _intl);
} catch (const sg_exception &e) {
string msg = "Unable to load '" + localeXML.utf8Str() + "'. "
"Please check that this file exists and is readable.\n\n" +
"Exception information: " + e.getFormattedMessage();
SG_LOG( SG_GENERAL, SG_ALERT, msg );
flightgear::fatalMessageBox(
"FlightGear", "Unable to load translation data.", msg);
exit(EXIT_FAILURE);
}
} }
FGLocale::~FGLocale() FGLocale::~FGLocale()
@ -202,7 +223,7 @@ FGLocale::selectLanguage(const char *language)
bool bool
FGLocale::loadResource(SGPropertyNode* localeNode, const char* resource) FGLocale::loadResource(SGPropertyNode* localeNode, const char* resource)
{ {
SGPath path( globals->get_fg_root() ); SGPath path = SGPath(FG_INSTALL_PREFIX) / "share/flightgear";
SGPropertyNode* stringNode = localeNode->getNode("strings", 0, true); SGPropertyNode* stringNode = localeNode->getNode("strings", 0, true);

View file

@ -2452,14 +2452,18 @@ void Options::showUsage() const
simgear::requestConsole(); // ensure console is shown on Windows simgear::requestConsole(); // ensure console is shown on Windows
cout << endl; cout << endl;
try { SGPath optionsXML =
fgLoadProps("options.xml", &options_root); SGPath(FG_INSTALL_PREFIX) / "share/flightgear/options.xml";
} catch (const sg_exception &) {
cout << "Unable to read the help file." << endl;
cout << "Make sure the file options.xml is located in the FlightGear base directory," << endl;
cout << "and the location of the base directory is specified by setting $FG_ROOT or" << endl;
cout << "by adding --fg-root=path as a program argument." << endl;
try {
readProperties(optionsXML, &options_root);
} catch (const sg_exception &e) {
string msg = "Unable to load '" + optionsXML.utf8Str() + "'. "
"Please check that this file exists and is readable.\n\n" +
"Exception information: " + e.getFormattedMessage();
SG_LOG( SG_GENERAL, SG_ALERT, msg );
flightgear::fatalMessageBox(
"FlightGear", "Unable to load the command-line help file.", msg);
exit(-1); exit(-1);
} }
@ -2472,7 +2476,8 @@ void Options::showUsage() const
if (!locale->loadResource("options")) if (!locale->loadResource("options"))
{ {
cout << "Unable to read the language resource." << endl; SG_LOG( SG_GENERAL, SG_ALERT,
"Unable to read the 'options' language resource." );
exit(-1); exit(-1);
} }