From 9efb666af2419a86a8a66f21f1ccaafe0ca27f07 Mon Sep 17 00:00:00 2001
From: Jared Hancock <jared@osticket.com>
Date: Tue, 8 Jul 2014 10:44:23 -0500
Subject: [PATCH] i18n: Display language selection with local names

---
 include/class.i18n.php        | 37 +++++++++++++++++++++++++++++------
 include/staff/profile.inc.php |  2 +-
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/include/class.i18n.php b/include/class.i18n.php
index 66d00c0a9..11b6f5c80 100644
--- a/include/class.i18n.php
+++ b/include/class.i18n.php
@@ -158,10 +158,39 @@ class Internationalization {
     }
 
     static function getLanguageDescription($lang) {
+        global $thisstaff, $thisclient;
+
         $langs = self::availableLanguages();
         $lang = strtolower($lang);
-        if (isset($langs[$lang]))
-            return $langs[$lang]['desc'];
+        if (isset($langs[$lang])) {
+            $info = &$langs[$lang];
+            if (!isset($info['desc'])) {
+                if (extension_loaded('intl')) {
+                    if ($thisstaff)
+                        $lang = $thisstaff->getLanguage();
+                    elseif ($thisclient)
+                        $lang = $thisclient->getLanguage();
+                    else
+                        $lang = self::getDefaultLanguage();
+                    list($simple_lang,) = explode('_', $lang);
+                    $info['desc'] = sprintf("%s%s",
+                        // Display the localized name of the language
+                        Locale::getDisplayName($info['code'], $info['code']),
+                        // If the major language differes from the user's,
+                        // display the language in the user's language
+                        (strpos($simple_lang, $info['lang']) === false
+                            ? sprintf(' (%s)', Locale::getDisplayName($info['code'], $lang)) : '')
+                    );
+                }
+                else {
+                    $info['desc'] = sprintf("%s%s (%s)",
+                        $info['nativeName'],
+                        $info['locale'] ? sprintf(' - %s', $info['locale']) : '',
+                        $info['name']);
+                }
+            }
+            return $info['desc'];
+        }
         else
             return $lang;
     }
@@ -192,10 +221,6 @@ class Internationalization {
                     'locale' => $locale,
                     'path' => $f,
                     'code' => $base,
-                    'desc' => sprintf("%s%s (%s)",
-                        $langs[$code]['nativeName'],
-                        $locale ? sprintf(' - %s', $locale) : '',
-                        $langs[$code]['name']),
                 );
             }
         }
diff --git a/include/staff/profile.inc.php b/include/staff/profile.inc.php
index 6b72f071c..ff3053bdb 100644
--- a/include/staff/profile.inc.php
+++ b/include/staff/profile.inc.php
@@ -112,7 +112,7 @@ $info['id']=$staff->getId();
 <?php foreach($langs as $l) {
     $selected = ($info['lang'] == $l['code']) ? 'selected="selected"' : ''; ?>
                     <option value="<?php echo $l['code']; ?>" <?php echo $selected;
-                        ?>><?php echo $l['desc']; ?></option>
+                        ?>><?php echo Internationalization::getLanguageDescription($l['code']); ?></option>
 <?php } ?>
                 </select>
                 <span class="error">&nbsp;<?php echo $errors['lang']; ?></span>
-- 
GitLab