| <?php | 
|   | 
| namespace Lang; | 
|   | 
| include_once "/Common/CommFunc.php"; | 
|   | 
| \CommFunc\SessionStart(); | 
|   | 
| $langArray = array( | 
|     "zh_CN" => "中文", | 
|     "vi_VN" => "Việt nam", | 
|     // "zh_TW" => "繁体", | 
|     // "en" => "English", | 
|     // "ko" => "한글", | 
| ); | 
|   | 
| /** | 
|  * 设置语言翻译文件域名 | 
|  * @param string $domain PO翻译文件域名 | 
|  */ | 
| function setLangDomain($domain) | 
| { | 
|     $lang = getLang(); | 
|     // 翻译文件修改热更: 由于php有缓存,所以无法热更翻译,故只能用改名字的方式加载不一样的翻译文件版本进行热更 | 
|     if ($lang) { | 
|         $poPath = $_SERVER['DOCUMENT_ROOT'] . "/language/" . $lang . "/LC_MESSAGES/"; | 
|         $poList = glob($poPath . $domain . "*.po"); // 只判断po文件 | 
|         $verInt = 0; | 
|         foreach ($poList as $value) { | 
|             $startIndex = strripos($value, $domain) + strlen($domain); | 
|             $ver = str_replace(".po", "", substr($value, $startIndex)); | 
|             if (!$ver || !is_numeric($ver)) { | 
|                 continue; | 
|             } | 
|             if ($verInt < intval($ver)) { | 
|                 $verInt = intval($ver); | 
|             } | 
|         } | 
|         if ($verInt > 0) { | 
|             $domain = $domain . $verInt; | 
|         } | 
|     } | 
|   | 
|     // I18N 程序范例开始  | 
|     // define('wwwbase', $domain); // 定义要用的mo文件名称,常规来说,我们都把PACKAGE的名称定义和程序名称相同。  | 
|   | 
|     bindtextdomain($domain, './language');  //设置某个域的mo文件路径  | 
|     textdomain($domain); | 
|   | 
|     putenv('LANG=' . $lang); | 
|     setlocale(LC_ALL, $lang); // 指定要用的语系,如:en_US、zh_CN、zh_TW  | 
|   | 
| } | 
|   | 
| /** | 
|  * 获取php文件po翻译文件域名称 | 
|  */ | 
| function getphppodomain() | 
| { | 
|     return "gmt"; | 
| } | 
|   | 
| /** | 
|  * 获取js脚本文件po翻译文件域名称 | 
|  */ | 
| function getjspodomain() | 
| { | 
|     return "gmtjs"; | 
| } | 
|   | 
| /** | 
|  * 显示选择切换语言 | 
|  */ | 
| function showSelectLang() | 
| { | 
|     global $langArray; | 
|   | 
|     $lang = getLang(); | 
|     echo "<select onchange=\"window.location.href=this.options[selectedIndex].value\" >"; | 
|     foreach ($langArray as $key => $value) { | 
|         echo "<option value=\"/language/setlang.php?lang=" . $key . "\""; | 
|         if ($lang && $lang == $key) { | 
|             echo " selected=\"selected\""; | 
|         } | 
|         echo ">" . $value . "</option>"; | 
|     } | 
|     echo "</select>"; | 
| } | 
|   | 
| function getLangDefault() | 
| { | 
|     // 默认中文或可扩展其他逻辑 | 
|     return "zh_CN"; | 
| } | 
| /** | 
|  * 获取当前页面语言 | 
|  * @return string 默认中文zh_CN; 越南文vi_VN | 
|  */ | 
| function getLang() | 
| { | 
|     // $lang = $_COOKIE["lang"]; | 
|     $lang = $_SESSION['lang']; | 
|     if (!$lang) { | 
|         $lang  = setLang(getLangDefault()); | 
|     } | 
|     return $lang; | 
| } | 
|   | 
| function setLang($lang) | 
| { | 
|     global $langArray; | 
|   | 
|     if (!array_key_exists($lang, $langArray)) { | 
|         return; | 
|     } | 
|   | 
|     // setcookie("lang", $lang, time() + 99 * 365 * 24 * 3600); | 
|     \CommFunc\SessionSave(array("lang" => $lang)); | 
|     setLangDomain(getphppodomain()); | 
|     return $lang; | 
| } | 
|   | 
| setLangDomain(getphppodomain()); | 
|   | 
| #============================================================================ | 
| static $pomsg = null; | 
| function gettext($text) | 
| { | 
|     // return _($text); // 理论上应该直接使用 _("xxx") 获取,由于php升级5.5后暂时无法正常翻译,不明原因,暂自己写一个解析po翻译文件函数 | 
|     global $pomsg; | 
|     if ($pomsg == null) { | 
|         $lang = getLang(); | 
|         $pofile = $_SERVER['DOCUMENT_ROOT'] . "/language/" . $lang . "/LC_MESSAGES/" . getphppodomain() . ".po"; | 
|         $pomsg = array(); | 
|         if (file_exists($pofile)) { | 
|             // msgid 及 msgstr 都可能会有多行的情况 | 
|             $msgid = ""; | 
|             $msgstr = ""; | 
|             $msgType = ""; | 
|             foreach (file($pofile) as $line) { | 
|                 // echo $line . "<br/>"; | 
|                 if (substr($line, 0, 5) == "msgid") { | 
|                     if ($msgid != "" && $msgstr != "") { | 
|                         $pomsg[$msgid] = $msgstr; | 
|                     } | 
|                     $msgid = substr($line, 7, -2); | 
|                     $msgstr = ""; | 
|                     $msgType = "id"; | 
|                 } else if (substr($line, 0, 6) == "msgstr") { | 
|                     if ($msgid == "") { | 
|                         $msgType = ""; | 
|                     } else { | 
|                         $msgstr = substr($line, 8, -2); | 
|                         $msgType = "str"; | 
|                     } | 
|                 } else if (substr($line, 0, 1) == "\"") { | 
|                     if ($msgType == "id") { | 
|                         $msgid .= substr($line, 1, -2); | 
|                     } else if ($msgType == "str") { | 
|                         $msgstr .= substr($line, 1, -2); | 
|                     } | 
|                 } | 
|             } | 
|             // 最后一条 | 
|             if ($msgid != "" && $msgstr != "") { | 
|                 $pomsg[$msgid] = $msgstr; | 
|             } | 
|             // echo "pomsg:" . \CommFunc\MyJson_encode($pomsg) . "<hr/>"; | 
|         } | 
|     } | 
|     if (array_key_exists($text, $pomsg)) { | 
|         return $pomsg[$text]; | 
|     } | 
|     return $text; | 
| } |