Fix accidental switch/teleporter behavior changes
[neverball] / share / lang.c
index 03aaf7c..999c239 100644 (file)
  */
 
 #include <string.h>
-#include <stdlib.h>
 #include <locale.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
 
 #include "lang.h"
+#include "common.h"
+#include "base_config.h"
+#include "fs.h"
+
+/*---------------------------------------------------------------------------*/
+
+#define DEFAULT_CODESET "UTF-8"
 
 /*---------------------------------------------------------------------------*/
 
-void lang_init(const char *domain, const char *default_dir)
+void lang_init(const char *domain)
 {
-    char *dir = getenv("NEVERBALL_LOCALE");
+#if ENABLE_NLS
+    char *dir = strdup(getenv("NEVERBALL_LOCALE"));
 
-    setlocale(LC_ALL, "");
+    if (!dir)
+    {
+        if (path_is_abs(CONFIG_LOCALE))
+            dir = strdup(CONFIG_LOCALE);
+        else
+            dir = concat_string(fs_base_dir(), "/", CONFIG_LOCALE, NULL);
+    }
+
+    errno = 0;
 
-    bindtextdomain(domain, dir ? dir : default_dir);
-    bind_textdomain_codeset(domain, "UTF-8");
+    if (!setlocale(LC_ALL, ""))
+    {
+        fprintf(stderr, "Failed to set LC_ALL to native locale: %s\n",
+                errno ? strerror(errno) : "Unknown error");
+    }
+
+    /* The C locale is guaranteed (sort of) to be available. */
+
+    setlocale(LC_NUMERIC, "C");
+
+    bindtextdomain(domain, dir);
+    bind_textdomain_codeset(domain, DEFAULT_CODESET);
     textdomain(domain);
+
+    free(dir);
+#else
+    return;
+#endif
 }
 
 const char *sgettext(const char *msgid)
 {
+#if ENABLE_NLS
     const char *msgval = gettext(msgid);
+#else
+    const char *msgval = msgid;
+#endif
 
     if (msgval == msgid)
     {
@@ -45,4 +82,19 @@ const char *sgettext(const char *msgid)
     return msgval;
 }
 
+const char *get_local_text(const char *msgid)
+{
+#if ENABLE_NLS
+    char *msgstr, *domain = textdomain(NULL);
+
+    bind_textdomain_codeset(domain, "");
+    msgstr = gettext(msgid);
+    bind_textdomain_codeset(domain, DEFAULT_CODESET);
+
+    return msgstr;
+#else
+    return msgid;
+#endif
+}
+
 /*---------------------------------------------------------------------------*/