diff --git a/include/class.i18n.php b/include/class.i18n.php
index 66d00c0a92d6ebb891bff1029ed2041be89ddddc..11b6f5c805d3f5dd1a2a15a9e2a174bc43e6f56f 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 6b72f071cb8ab87798437b4cce55219a18ef2658..ff3053bdb10b3d805b039e6dd6094132808ae595 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>