1
0
Fork 0

Eric Hofman:

Now the options can be localized as well. This adds a slight problem for
the --language options, but not that much (worst case, the strings are
loaded twice consuming some more memory). I tried to be as accurate as
posiible when copying the options texts, but there might be some
mostakes left.
This commit is contained in:
curt 2002-10-10 15:02:50 +00:00
parent 83314d3f45
commit 470d233f0d
5 changed files with 184 additions and 131 deletions

9
Thanks
View file

@ -172,6 +172,7 @@ Erik Hofman <erik@ehofman.com>
Major overhaul and parameterization of the sound module, to allow
aircraft-specific sound configuration at runtime.
Irix port.
Localization support.
Charlie Hotchkiss <clhotch@pacbell.net>
@ -233,6 +234,7 @@ David Megginson <david@megginson.com>
3D model animation module
initial take of sound-effects module
Random ground cover objects
Vacuum and pitot systems.
Eric Mitchell <mitchell@mars.ark.com>
@ -278,6 +280,8 @@ Curt Olson <curt@flightgear.org>
He has his hands in many of the areas, but is primarily responsible
for the scenery subsystem, as well as much of the infrastructure in
the sim.
Electrical system.
Runway lighting.
Brian Paul
@ -466,6 +470,11 @@ Jean-Claude Wippler <jcw@equi4.com>
http://www.equi4.com/metakit
John Wojnaroski <castle@mminternet.com>
Open Glass Cockpit project
3d clouds
WoodSoup Project http://www.woodsoup.org
[ FlightGear no longer uses woodsoup services, but we appreciate
the support provided to our project during the time they hosted us. ]

View file

@ -228,6 +228,120 @@ string fgBasePackageVersion() {
}
// Initialize the localization
SGPropertyNode *fgInitLocale(const char *language) {
SGPropertyNode *c_node = NULL, *d_node = NULL;
SGPropertyNode *intl = fgGetNode("/sim/intl");
SG_LOG(SG_GENERAL, SG_INFO, "Selecting language: " << language );
// localization not defined
if (!intl)
return NULL;
//
// Select the proper language from the list
//
vector<SGPropertyNode_ptr> locale = intl->getChildren("locale");
for (unsigned int i = 0; i < locale.size(); i++) {
vector<SGPropertyNode_ptr> lang = locale[i]->getChildren("lang");
for (unsigned int j = 0; j < lang.size(); j++) {
if (!strcmp(lang[j]->getStringValue(), language)) {
c_node = locale[i];
break;
}
}
}
// Get the defaults
d_node = intl->getChild("locale");
if (!c_node)
c_node = d_node;
// Check for localized font
SGPropertyNode *font_n = c_node->getNode("font", true);
if ( !strcmp(font_n->getStringValue(), "") )
font_n->setStringValue(d_node->getStringValue("font", "typewriter.txf"));
//
// Load the default strings
//
SGPath d_path( globals->get_fg_root() );
const char *d_path_str = d_node->getStringValue("strings");
if (!d_path_str) {
SG_LOG(SG_GENERAL, SG_ALERT, "Incorrect path in configuration file.");
return NULL;
}
d_path.append(d_path_str);
SG_LOG(SG_GENERAL, SG_INFO, "Reading localized strings from "
<< d_path.str());
SGPropertyNode *strings = c_node->getNode("strings");
try {
readProperties(d_path.str(), strings);
} catch (const sg_exception &e) {
SG_LOG(SG_GENERAL, SG_ALERT, "Unable to read the localized strings");
return NULL;
}
//
// Load the language specific strings
//
if (c_node != d_node) {
SGPath c_path( globals->get_fg_root() );
const char *c_path_str = c_node->getStringValue("strings");
if (!c_path_str) {
SG_LOG(SG_GENERAL, SG_ALERT, "Incorrect path in configuration file.");
return NULL;
}
c_path.append(c_path_str);
SG_LOG(SG_GENERAL, SG_INFO, "Reading localized strings from "
<< c_path.str());
try {
readProperties(c_path.str(), strings);
} catch (const sg_exception &e) {
SG_LOG(SG_GENERAL, SG_ALERT, "Unable to read the localized strings");
return NULL;
}
}
return c_node;
}
// Initialize the localization routines
bool fgDetectLanguage() {
char *language = ::getenv("LANG");
if (language == NULL) {
SG_LOG(SG_GENERAL, SG_INFO, "Unable to detect the language" );
language = "C";
}
SGPropertyNode *locale = fgInitLocale(language);
if (!locale) {
cerr << "No internationalization settings specified in preferences.xml"
<< endl;
return false;
}
globals->set_locale( locale );
return true;
}
// Read in configuration (file and command line)
bool fgInitConfig ( int argc, char **argv ) {
@ -241,6 +355,10 @@ bool fgInitConfig ( int argc, char **argv ) {
readProperties(props_path.str(), globals->get_props());
SG_LOG(SG_INPUT, SG_INFO, "Finished Reading global preferences");
// Detect the required language as early as possible
if (fgDetectLanguage() != true)
return false;
// Read the default aircraft config file.
string aircraft = fgGetString("/sim/aircraft", "");
if (aircraft.size() > 0) {
@ -302,96 +420,6 @@ bool fgInitConfig ( int argc, char **argv ) {
return true;
}
// Initialize the localization
SGPropertyNode *fgInitLocale(const char *language) {
SGPropertyNode *c_node = NULL, *d_node = NULL;
SGPropertyNode *intl = fgGetNode("/sim/intl");
SG_LOG(SG_GENERAL, SG_INFO, "Selecting language: " << language );
// localization not defined
if (!intl)
return NULL;
//
// Select the proper language from the list
//
vector<SGPropertyNode_ptr> locale = intl->getChildren("locale");
for (unsigned int i = 0; i < locale.size(); i++) {
vector<SGPropertyNode_ptr> lang = locale[i]->getChildren("lang");
for (unsigned int j = 0; j < lang.size(); j++) {
if (!strcmp(lang[j]->getStringValue(), language)) {
c_node = locale[i];
break;
}
}
}
// Get the defaults
d_node = intl->getChild("locale");
if (!c_node)
c_node = d_node;
// Check for localized font
SGPropertyNode *font_n = c_node->getNode("font", true);
if ( !strcmp(font_n->getStringValue(), "") )
font_n->setStringValue(d_node->getStringValue("font", "typewriter.txf"));
//
// Load the default strings
//
SGPath d_path( globals->get_fg_root() );
const char *d_path_str = d_node->getStringValue("strings");
if (!d_path_str) {
SG_LOG(SG_GENERAL, SG_ALERT, "Incorrect path in configuration file.");
return NULL;
}
d_path.append(d_path_str);
SG_LOG(SG_GENERAL, SG_INFO, "Reading localized strings from "
<< d_path.str());
SGPropertyNode *strings = c_node->getNode("strings");
try {
readProperties(d_path.str(), strings);
} catch (const sg_exception &e) {
SG_LOG(SG_GENERAL, SG_ALERT, "Unable to read the localized strings");
return NULL;
}
//
// Load the language specific strings
//
if (c_node != d_node) {
SGPath c_path( globals->get_fg_root() );
const char *c_path_str = c_node->getStringValue("strings");
if (!c_path_str) {
SG_LOG(SG_GENERAL, SG_ALERT, "Incorrect path in configuration file.");
return NULL;
}
c_path.append(c_path_str);
SG_LOG(SG_GENERAL, SG_INFO, "Reading localized strings from "
<< c_path.str());
try {
readProperties(c_path.str(), strings);
} catch (const sg_exception &e) {
SG_LOG(SG_GENERAL, SG_ALERT, "Unable to read the localized strings");
return NULL;
}
}
return c_node;
}
// find basic airport location info from airport database
bool fgFindAirportID( const string& id, FGAirport *a ) {

View file

@ -1323,7 +1323,7 @@ static void fgIdleFunction ( void ) {
// sleep(1);
idle_state = 1000;
cout << "Panel visible = " << fgPanelVisible() << endl;
SG_LOG( SG_GENERAL, SG_INFO, "Panel visible = " << fgPanelVisible() );
fgReshape( fgGetInt("/sim/startup/xsize"),
fgGetInt("/sim/startup/ysize") );
}
@ -1533,12 +1533,11 @@ int mainLoop( int argc, char **argv ) {
string base_version = fgBasePackageVersion();
if ( !(base_version == required_version) ) {
// tell the operator how to use this application
fgUsage();
cout << endl << "Base package check failed ... " \
cerr << endl << "Base package check failed ... " \
<< "Found version " << base_version << " at: " \
<< globals->get_fg_root() << endl;
cout << "Please upgrade to version" << required_version << endl;
cerr << "Please upgrade to version" << required_version << endl;
exit(-1);
}
@ -1551,26 +1550,6 @@ int mainLoop( int argc, char **argv ) {
exit(-1);
}
// Initialize the localization routines
if (globals->get_locale() == NULL) {
char *language = getenv("LANG");
if (language == NULL) {
SG_LOG(SG_GENERAL, SG_ALERT, "Unable to detect the language" );
language = "C";
}
SGPropertyNode *locale = fgInitLocale(language);
if (!locale) {
cerr
<< "Not internationalization settings specified in preferences.xml"
<< endl;
return false;
}
globals->set_locale( locale );
}
// Initialize the Window/Graphics environment.
if( !fgGlutInit(&argc, argv) ) {
SG_LOG( SG_GENERAL, SG_ALERT, "GLUT initialization failed ..." );

View file

@ -1164,6 +1164,8 @@ fgParseOptions (const string& path) {
void
fgUsage (bool verbose)
{
SGPropertyNode *locale = globals->get_locale();
SGPropertyNode options_root;
SGPath opath( globals->get_fg_root() );
opath.append( "options.xml" );
@ -1188,7 +1190,7 @@ fgUsage (bool verbose)
exit(-1);
}
SGPropertyNode *usage = options->getNode("usage");
SGPropertyNode *usage = locale->getNode(options->getStringValue("usage"));
if (usage) {
cout << "Usage: " << usage->getStringValue() << endl;
}
@ -1229,25 +1231,54 @@ fgUsage (bool verbose)
snprintf(cstr, 96, "\n --%s\n%32c", tmp.c_str(), ' ');
}
msg += cstr;
SGPropertyNode *desc = option[k]->getNode("description");
if (desc) {
msg += desc->getStringValue();
// There may be more than one <description> tag assosiated
// with one option
for ( unsigned int l = 1;
(desc = option[k]->getNode("description", l, false));
l++ )
{
snprintf(cstr, 96, "\n%32c%s", ' ',
desc->getStringValue());
msg += cstr;
}
msg += '\n';
}
msg += cstr;
vector<SGPropertyNode_ptr>desc =
option[k]->getChildren("description");
if (desc.size() > 0) {
for ( unsigned int l = 0; l < desc.size(); l++) {
// There may be more than one translation line.
string t = desc[l]->getStringValue();
SGPropertyNode *n = locale->getNode("strings");
vector<SGPropertyNode_ptr>trans_desc =
n->getChildren(t.substr(8).c_str());
for ( unsigned int m = 0; m < trans_desc.size(); m++ ) {
string t_str = trans_desc[m]->getStringValue();
if ((m > 0) || ((l > 0) && m == 0)) {
snprintf(cstr, 96, "%32c", ' ');
msg += cstr;
}
// If the string is too large to fit on the screen,
// then split it up in several pieces.
while ( t_str.size() > 47 ) {
unsigned int m = t_str.rfind(' ', 47);
msg += t_str.substr(0, m);
snprintf(cstr, 96, "\n%32c", ' ');
msg += cstr;
t_str.erase(t_str.begin(), t_str.begin() + m + 1);
}
msg += t_str + '\n';
}
}
}
}
}
SGPropertyNode *name = section[j]->getNode("name");
SGPropertyNode *name =
locale->getNode(section[j]->getStringValue("name"));
if (!msg.empty() && name) {
cout << endl << name->getStringValue() << ":" << endl;
cout << msg;

View file

@ -160,10 +160,16 @@ static int gen_vasi_light_map() {
// top half white, bottom half red
env_map[i][j][0] = 255;
if ( i >= half_res ) {
if ( i > half_res ) {
// white
env_map[i][j][1] = 255;
env_map[i][j][2] = 255;
} else if ( i == half_res - 1 || i == half_res ) {
// pink
env_map[i][j][1] = 127;
env_map[i][j][2] = 127;
} else {
// red
env_map[i][j][1] = 0;
env_map[i][j][2] = 0;
}