]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Add private API for mapping Apple language ID to POSIX locale ID.
authorMichael R Sweet <michaelrsweet@gmail.com>
Thu, 26 Jan 2017 20:36:50 +0000 (15:36 -0500)
committerMichael R Sweet <michaelrsweet@gmail.com>
Thu, 26 Jan 2017 20:36:50 +0000 (15:36 -0500)
cups/language-private.h
cups/language.c

index 291bf09154f75ec72930099854afe302fb6c86f6..07aff8528f1c860789f4ddf2c404b2409f2ea6ac 100644 (file)
@@ -22,6 +22,9 @@
 
 #  include <stdio.h>
 #  include <cups/transcode.h>
+#  ifdef __APPLE__
+#    include <CoreFoundation/CoreFoundation.h>
+#  endif /* __APPLE__ */
 
 #  ifdef __cplusplus
 extern "C" {
@@ -51,8 +54,8 @@ typedef struct _cups_message_s                /**** Message catalog entry ****/
  */
 
 #  ifdef __APPLE__
-extern const char      *_cupsAppleLanguage(const char *locale, char *language,
-                                           size_t langsize);
+extern const char      *_cupsAppleLanguage(const char *locale, char *language, size_t langsize);
+extern const char      *_cupsAppleLocale(CFStringRef languageName, char *locale, size_t localesize);
 #  endif /* __APPLE__ */
 extern void            _cupsCharmapFlush(void);
 extern const char      *_cupsEncodingName(cups_encoding_t encoding);
index bf38d194ed0cc2ec99a23182114b729f22148ddb..1a592f547115a7deeef31d06fd99ce31249c090f 100644 (file)
@@ -118,11 +118,13 @@ typedef struct
 } _apple_language_locale_t;
 
 static const _apple_language_locale_t apple_language_locale[] =
-{                                      /* Locale to language ID LUT */
-  { "en",      "en_US" },
-  { "nb",      "no" },
-  { "zh-Hans", "zh_CN" },
-  { "zh-Hant", "zh_TW" }
+{                                      /* Language to locale ID LUT */
+  { "en",         "en_US" },
+  { "nb",         "no" },
+  { "nb_NO",      "no" },
+  { "zh-Hans",    "zh_CN" },
+  { "zh-Hant",    "zh_TW" },
+  { "zh-Hant_CN", "zh_TW" }
 };
 #endif /* __APPLE__ */
 
@@ -239,6 +241,75 @@ _cupsAppleLanguage(const char *locale,     /* I - Locale ID */
 
   return (language);
 }
+
+
+/*
+ * '_cupsAppleLocale()' - Get the locale associated with an Apple language ID.
+ */
+
+const char *                                   /* O - Locale */
+_cupsAppleLocale(CFStringRef languageName,     /* I - Apple language ID */
+                 char        *locale,          /* I - Buffer for locale */
+                size_t      localesize)        /* I - Size of buffer */
+{
+  int          i;                      /* Looping var */
+  CFStringRef  localeName;             /* Locale as a CF string */
+
+
+  localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(kCFAllocatorDefault, languageName);
+
+  if (localeName)
+  {
+   /*
+    * Copy the locale name and tweak as needed...
+    */
+
+    if (!CFStringGetCString(localeName, locale, (CFIndex)localesize, kCFStringEncodingASCII))
+      *locale = '\0';
+
+    CFRelease(localeName);
+
+   /*
+    * Map new language identifiers to locales...
+    */
+
+    for (i = 0;
+        i < (int)(sizeof(apple_language_locale) /
+                  sizeof(apple_language_locale[0]));
+        i ++)
+    {
+      if (!strcmp(locale, apple_language_locale[i].language))
+      {
+       strlcpy(locale, apple_language_locale[i].locale, localesize);
+       break;
+      }
+    }
+  }
+  else
+  {
+   /*
+    * Just try the Apple language name...
+    */
+
+    if (!CFStringGetCString(languageName, locale, (CFIndex)localesize, kCFStringEncodingASCII))
+      *locale = '\0';
+  }
+
+  if (!*locale)
+    return (NULL);
+
+ /*
+  * Convert language subtag into region subtag...
+  */
+
+  if (locale[2] == '-')
+    locale[2] = '_';
+
+  if (!strchr(locale, '.'))
+    strlcat(locale, ".UTF-8", localesize);
+
+  return (locale);
+}
 #endif /* __APPLE__ */
 
 
@@ -1134,13 +1205,11 @@ _cupsMessageNew(void *context)          /* I - User data */
 static const char *                    /* O - Locale string */
 appleLangDefault(void)
 {
-  int                  i;              /* Looping var */
   CFBundleRef          bundle;         /* Main bundle (if any) */
   CFArrayRef           bundleList;     /* List of localizations in bundle */
   CFPropertyListRef    localizationList = NULL;
                                        /* List of localization data */
   CFStringRef          languageName;   /* Current name */
-  CFStringRef          localeName;     /* Canonical from of name */
   char                 *lang;          /* LANG environment variable */
   _cups_globals_t      *cg = _cupsGlobals();
                                        /* Pointer to library globals */
@@ -1225,49 +1294,11 @@ appleLangDefault(void)
        if (languageName &&
            CFGetTypeID(languageName) == CFStringGetTypeID())
        {
-         localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(
-                          kCFAllocatorDefault, languageName);
-
-         if (localeName)
-         {
-           CFStringGetCString(localeName, cg->language, sizeof(cg->language),
-                              kCFStringEncodingASCII);
-           CFRelease(localeName);
-
+         if (_cupsAppleLocale(languageName, cg->language, sizeof(cg->language)))
            DEBUG_printf(("3appleLangDefault: cg->language=\"%s\"",
                          cg->language));
-
-          /*
-           * Map new language identifiers to locales...
-           */
-
-           for (i = 0;
-                i < (int)(sizeof(apple_language_locale) /
-                          sizeof(apple_language_locale[0]));
-                i ++)
-           {
-             if (!strcmp(cg->language, apple_language_locale[i].language))
-             {
-               DEBUG_printf(("3appleLangDefault: mapping \"%s\" to \"%s\"...",
-                             cg->language, apple_language_locale[i].locale));
-               strlcpy(cg->language, apple_language_locale[i].locale,
-                       sizeof(cg->language));
-               break;
-             }
-           }
-
-          /*
-           * Convert language subtag into region subtag...
-           */
-
-           if (cg->language[2] == '-')
-             cg->language[2] = '_';
-
-           if (!strchr(cg->language, '.'))
-             strlcat(cg->language, ".UTF-8", sizeof(cg->language));
-         }
          else
-           DEBUG_puts("3appleLangDefault: Unable to get localeName.");
+           DEBUG_puts("3appleLangDefault: Unable to get locale.");
        }
       }