Files
fc/server/tools/lang/lang_srv.php
T
2026-05-23 22:10:14 +08:00

99 lines
3.2 KiB
PHP

<?php
/**----------------------------------------------------+
* 服务端多语言版本处理
* @author whjing2012@gmail.com
+-----------------------------------------------------*/
// 给指定文件注入语言版本控制函数
function srv_infun($file, $is_next = false){
if(is_dir($file)){
fordir($file, __FUNCTION__, array($is_next), $is_next);
return;
}
if(!is_file($file) || !preg_match('/.*\.[eh]rl$/',$file) || is_filter($file)) return;
echo "doing ==> $file\n";
$str = read_file($file);
$pattern = array(
'/(?<!\?T\()(<<\".*\">>).*(?!->)/iuU' => 'srv_str_infun_add_T',
'/(?<=\?T\()(\".*\")/iuU' => 'srv_str_infun_add_T'
);
$saveFlag = 0;
foreach($pattern as $patternKey => $callfun){
$tmpSaveFlag = 0;
$tmpSaveFlag = srv_str_infun($str, $patternKey, $callfun);
$saveFlag = $tmpSaveFlag + $saveFlag;
}
if($saveFlag) {
save_file($file, $str);
echo colorize("saved ==> $file\n");
} else
echo colorize("skipped ==> $file\n");
}
// 指定内容注入
function srv_str_infun(&$str, $pattern, $callfun){
preg_match_all($pattern, $str, $ret);
$arr = array();
foreach($ret[1] as $v){
if(isset($arr[$v]) || !preg_match('/.*[\x{4e00}-\x{9fa5}]+.*/u', $v)) continue;
$str = call_user_func_array($callfun, array($v, $str));
$arr[$v] = 1;
// echo("===$v\n");
}
return count($arr) > 0;
}
// 添加宏T
function srv_str_infun_add_T($val, &$str){
// $str = str_replace($val, "?T(${val})", $str);
$slashVal = str_replace("/", "\/", preg_quote($val));
$pattern = "/(?<!\\?T\\()(${slashVal})(?!.*\->)/iuU";
/* echo "val:${val}\n"; */
/* echo "slashVal:${slashVal}\n"; */
/* echo "pattern:${pattern}\n"; */
$str = preg_replace($pattern, "?T(${val})", $str);
return $str;
}
// 添加Erlang二进制标识<<>>
function srv_str_infun_add_bin($val, &$str){
$slashVal = str_replace("/", "\/", preg_quote($val));
$pattern = "/(?<=\?T\()(${slashVal})(?!.*\->)/iuU";
/* echo "val:${val}\n"; */
/* echo "slashVal:${slashVal}\n"; */
/* echo "pattern:${pattern}\n"; */
$str = preg_replace($pattern, "<<${val}>>", $str);
return $str;
}
// 获取语言版本信息
function srv_match($file, &$arr, $is_next = false){
if(is_dir($file)){
fordir($file, __FUNCTION__, array(&$arr, $is_next), $is_next);
return;
}
echo("doing==>$file\n");
$str = read_file($file);
preg_match_all('/\?T\(<?<?\"(.*[\x{4e00}-\x{9fa5}]+.*)\">?>?\)/iuU', $str, $ret);
foreach($ret[1] as $k => $v){
echo("srv_match==>$v\n");
$arr[trim($v)] = 1;
}
}
// 导出翻译文件
function srv_lang($lang){
$all = get_file_array(LANG_DATA."/$lang/".LANG_DATA_ALL);
$srv = get_file_array(LANG_DATA."/$lang/".LANG_DATA_SRV);
$str = "%% 多语言版本\n\n";
$str .= "-module(lang).\n";
$str .= "-export([get/1]).\n";
foreach($srv as $k=>$v){
if(!isset($all[$k])) continue;
$str .= "\nget(<<\"$k\">>) -> <<\"{$all[$k]}\">>;";
}
$str .= "\nget(Str) when is_list(Str) -> ?MODULE:get(list_to_binary(Str));";
$str .= "\nget(Str) -> Str.";
save_file(LANG_DATA."/$lang/".LANG_DATA_CONF_SRV, $str);
}