ecere/i18n; ide: Improved adapting to LANGUAGE env. variable
authorJerome St-Louis <jerome@ecere.com>
Thu, 27 Mar 2014 03:45:12 +0000 (23:45 -0400)
committerJerome St-Louis <jerome@ecere.com>
Thu, 27 Mar 2014 03:45:12 +0000 (23:45 -0400)
- i18n: Fixed a bug preventing genericLocale to work on app executable
- Understanding generic 'zh' as 'zh_CN'
- Saving IDE settings language value on startup
- Handling LANGUAGE value with multiple locales separating by : (only first is looked at for now)
- Applying same logic to checked language menu items as translation loading code (generic locales to use e.g. en for en_CA)
- Ensuring an item is checked (default to english if no locale is found)

ecere/src/sys/i18n.ec
ide/src/IDESettings.ec
ide/src/ide.ec

index 8edf4e3..e31f8fa 100644 (file)
@@ -50,10 +50,15 @@ public dllexport void LoadTranslatedStrings(String moduleName, char * name)
    if(locale)
    {
       char * dot;
+      char * colon;
       if(language != locale)
          strcpy(language, locale);
       dot = strstr(language, ".");
       if(dot) *dot = 0;
+
+      // TODO: Try multiple languages defined in LANGUAGE
+      colon = strstr(language, ":");
+      if(colon) *colon = 0;
       locale = language;
    }
    if(locale)
@@ -63,6 +68,8 @@ public dllexport void LoadTranslatedStrings(String moduleName, char * name)
       under = strchr(genericLocale, '_');
       if(under)
          *under = 0;
+      if(!strcmpi(genericLocale, "zh"))
+         strcpy(genericLocale, "zh_CN");
    }
 
    if(moduleName)
@@ -95,7 +102,7 @@ public dllexport void LoadTranslatedStrings(String moduleName, char * name)
       if(moduleName)
          sprintf(fileName, "<:%s>locale/%s.mo", moduleName, genericLocale);
       else
-         sprintf(fileName, ":locale/%s.mo", name, genericLocale);
+         sprintf(fileName, ":locale/%s.mo", genericLocale);
       f = FileOpen(fileName, read);
       if(!f)
       {
index 0247be8..296ddc3 100644 (file)
@@ -1162,12 +1162,30 @@ Array<LanguageOption> languages
 
 String GetLanguageString()
 {
+   char * dot, * colon;
+   static char lang[256];
    String language = getenv("ECERE_LANGUAGE");
    if(!language) language = getenv("LANGUAGE");
    if(!language) language = getenv("LC_ALL");
    if(!language) language = getenv("LC_MESSAGES");
    if(!language) language = getenv("LANG");
    if(!language) language = "";
+   if(language && (colon = strchr(language, ':')))
+   {
+      if(lang != language)
+         strncpy(lang, language, sizeof(lang));
+      lang[sizeof(lang)-1] = 0;
+      lang[colon - language] = 0;
+      language = lang;
+   }
+   if(language && (dot = strchr(language, '.')))
+   {
+      if(lang != language)
+         strncpy(lang, language, sizeof(lang));
+      lang[sizeof(lang)-1] = 0;
+      lang[dot - language] = 0;
+      language = lang;
+   }
    return language;
 }
 
index 9cfb6f7..22afd71 100644 (file)
@@ -3699,7 +3699,10 @@ class IDEApp : GuiApplication
 
       // Default to language specified by environment if no language selected
       if(!ideSettings.language)
+      {
          ideSettings.language = GetLanguageString();
+         settingsContainer.Save();
+      }
 
       // Default to home directory if no directory yet set up
       if(!ideSettings.ideProjectFileDialogLocation[0])
@@ -3748,6 +3751,7 @@ class IDEApp : GuiApplication
       {
          String language = ideSettings.language;
          int i = 0;
+         bool found = false;
 
          ide.languageItems = new MenuItem[languages.count];
          for(l : languages)
@@ -3780,11 +3784,57 @@ class IDEApp : GuiApplication
                   return true;
                }
             };
-            if(((!language || !language[0]) && i == 0) ||
-               (language && !strcmpi(l.code, language)))
-               ide.languageItems[i].checked = true;
             i++;
          }
+
+         // Try to find country-specific language first
+         if(language)
+         {
+            i = 0;
+            for(l : languages)
+            {
+               if(!strcmpi(l.code, language) || (i == 0 && !strcmpi("en", language)))
+               {
+                  ide.languageItems[i].checked = true;
+                  found = true;
+                  break;
+               }
+               i++;
+            }
+         }
+
+         // Try generalizing locale
+         if(!found && language)
+         {
+            char * under;
+            char genericLocale[256];
+            i = 0;
+            strncpy(genericLocale, language, sizeof(genericLocale));
+            genericLocale[sizeof(genericLocale)] = 0;
+
+            under = strchr(genericLocale, '_');
+            if(under)
+               *under = 0;
+            if(!strcmpi(genericLocale, "zh"))
+               strcpy(genericLocale, "zh_CN");
+            if(strcmp(genericLocale, language))
+            {
+               for(l : languages)
+               {
+                  if(!strcmpi(l.code, genericLocale) || (i == 0 && !strcmpi("en", genericLocale)))
+                  {
+                     ide.languageItems[i].checked = true;
+                     found = true;
+                     break;
+                  }
+                  i++;
+               }
+            }
+         }
+
+         if(!found)
+            ide.languageItems[0].checked = true;
+
          MenuDivider { ide.languageMenu };
          MenuItem
          {