#include <windows.h>
#endif
+#include <cstdio>
#include <boost/foreach.hpp>
#include <simgear/props/props_io.hxx>
return result;
}
#elif __APPLE__
-
-// determine locale / langauge on Mac
-#include <CoreFoundation/CoreFoundation.h>
-
-string_list
-FGLocale::getUserLanguage()
-{
- string_list result;
- CFArrayRef langs = CFLocaleCopyPreferredLanguages();
-
- char buffer[64];
- for (int i=0; i<CFArrayGetCount(langs); ++i) {
- CFStringRef s = (CFStringRef) CFArrayGetValueAtIndex(langs, i);
- CFStringGetCString(s, buffer, 64, kCFStringEncodingASCII);
- result.push_back(buffer);
- }
-
- CFRelease(langs);
- return result;
-}
-
+// implemented in CocoaHelpers.mm
#else
/**
* Determine locale/language settings on Linux/Unix.
}
- SGPropertyNode *locale = NULL;
+ _currentLocale = NULL;
BOOST_FOREACH(string lang, languages) {
- locale = findLocaleNode(lang);
- if (locale) {
+ SG_LOG(SG_GENERAL, SG_DEBUG, "trying to find locale for " << lang );
+ _currentLocale = findLocaleNode(lang);
+ if (_currentLocale) {
+ SG_LOG(SG_GENERAL, SG_DEBUG, "found locale for " << lang << " at " << _currentLocale->getPath() );
break;
}
}
- if (!locale)
+ // load resource for system messages (translations for fgfs internal messages)
+ loadResource("sys");
+
+ // load resource for atc messages
+ loadResource("atc");
+
+ if (!_currentLocale)
{
SG_LOG(SG_GENERAL, SG_ALERT,
- "No internationalization settings specified in preferences.xml" );
+ "System locale not found or no internationalization settings specified in preferences.xml. Using default (en)." );
return false;
}
- _currentLocale = locale;
-
- // load resource for system messages (translations for fgfs internal messages)
- loadResource("sys");
-
return true;
}
if (!path_str)
{
SG_LOG(SG_GENERAL, SG_WARN, "No path in " << stringNode->getPath() << "/" << resource << ".");
- return NULL;
+ return false;
}
path.append(path_str);
if (_currentLocale)
{
simgear::PropertyList s = getLocalizedStrings(_currentLocale, id, resource);
- if (s.size())
+ if (! s.empty())
return s;
}
if (_defaultLocale)
{
simgear::PropertyList s = getLocalizedStrings(_defaultLocale, id, resource);
- if (s.size())
+ if (! s.empty())
return s;
}
}
return fallbackFont;
}
+std::string FGLocale::localizedPrintf(const char* id, const char* resource, ... )
+{
+ va_list args;
+ va_start(args, resource);
+ string r = vlocalizedPrintf(id, resource, args);
+ va_end(args);
+ return r;
+}
+
+std::string FGLocale::vlocalizedPrintf(const char* id, const char* resource, va_list args)
+{
+ const char* format = getLocalizedString(id, resource);
+ int len = ::vsprintf(NULL, format, args);
+ char* buf = (char*) alloca(len);
+ ::vsprintf(buf, format, args);
+ return std::string(buf);
+}
+
// Simple UTF8 to Latin1 encoder.
void FGLocale::utf8toLatin1(string& s)
{
pos++;
}
}
+
+const char* fgTrMsg(const char* key)
+{
+ return globals->get_locale()->getLocalizedString(key, "message");
+}
+
+std::string fgTrPrintfMsg(const char* key, ...)
+{
+ va_list args;
+ va_start(args, key);
+ string r = globals->get_locale()->vlocalizedPrintf(key, "message", args);
+ va_end(args);
+ return r;
+
+}