]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/locale.cxx
Interim windows build fix
[flightgear.git] / src / Main / locale.cxx
index cdf4f6912bbcbab73630ba97f1d28a7207b8a4e5..f4eac4b6bee63c4774e43377a77c480cb3981454 100644 (file)
@@ -26,6 +26,7 @@
 #include <windows.h>
 #endif
 
+#include <cstdio>
 #include <boost/foreach.hpp>
 
 #include <simgear/props/props_io.hxx>
@@ -89,27 +90,7 @@ FGLocale::getUserLanguage()
     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.
@@ -190,26 +171,29 @@ FGLocale::selectLanguage(const char *language)
     }
 
     
-    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;
 }
 
@@ -226,7 +210,7 @@ FGLocale::loadResource(SGPropertyNode* localeNode, const char* resource)
     if (!path_str)
     {
         SG_LOG(SG_GENERAL, SG_WARN, "No path in " << stringNode->getPath() << "/" << resource << ".");
-        return NULL;
+        return false;
     }
 
     path.append(path_str);
@@ -313,14 +297,14 @@ FGLocale::getLocalizedStrings(const char* id, const char* resource)
         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;
         }
     }
@@ -348,6 +332,24 @@ FGLocale::getDefaultFont(const char* fallbackFont)
     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)
 {
@@ -397,3 +399,18 @@ 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;
+    
+}