<?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;
|
}
|