Loading... 需求:把页面中的中文翻译成越南文。 思路:在框架渲染页面的地方(这个地方能获取到页面渲染后的所有html数据,设为$str),使用以下方法。 ```php //翻译中文 读取json文件,使用正则表达式替换中文 public static function pregReplaceChinese($str,,$toLanguageType = 'vietnam',$isNotHtml = false){ if(empty($str)){ return $str; } else { //翻译字典json文件 例子 //$jsonFile ='{ // "追风剑": "Truy Phong Kiếm", // "追风镯": "Truy Phong Trạc" //}'; //0、翻译前准备 正则关键字符数组,避免影响到后面正则替换翻译 $regexChars = ['^', '$', '.', '|', '?', '*', '+', '(', ')', '[', ']', '/', '-']; $unicodeChars = ['%u005e','%u0024','%u002e','%u007c','%u003f','%u002a','%u002b','%u0028','%u0029','%u005b','%u005d','%u002f','%u002d']; $oldContent = $str; //1、获取翻译关键字的json文件,将其转换为数组 $jsonFile = 'http://xxx/language/vietnam.json'; $fyChars = file_get_contents($jsonFile); $jsonArr = json_decode(str_replace($regexChars,$unicodeChars,$fyChars), true);//翻译json文件转换为数组 if (is_string($str)) { $str = str_replace($regexChars,$unicodeChars,$str);//正则关键字符替换 } //1-1、非页面翻译 if ($isNotHtml) { // 处理数组(如道具数组)翻译 if (is_array($str)) { $jsonArr = json_decode($fyChars, true);//翻译json文件转换为数组 foreach($str as $key => $item){ if (!empty($jsonArr[$item['name']])) { $str[$key]['name'] = $jsonArr[$item['name']]; } } return $str; } // 处理Excel表格内容和表格文件名称翻译 if (strpos($str,'交易ID') !== false || strpos($str,',') !== false) { $str = iconv('gbk', 'utf-8', $str); if (strpos($str,'交易ID') !== false) { $str = str_replace('交易ID','交易id',$str); } $arr[0] = explode(',',$str); } if (empty($arr[0])) { preg_match_all('/[\x{4e00}-\x{9fa5}]+/u', $str, $arr); } } else { //2、获取页面中的>任意内容<,将其转换为数组 $pattern = '/>[\s\S]*?<|title="([^"]+)"|value="([^"]+)"/'; preg_match_all($pattern, $str, $arr); } //3、使用正则表达式preg_replace翻译替换中文处理,需要生成的两个关联数组,且索引保持一致才能进行顺序替换,其中匹配翻译的数组,当没有找到翻译关键字则设置为当前关键字 $patterns = [];//需要翻译的数组 $replaces = [];//匹配翻译的数组 foreach($arr[0] as $item){ $itemArr = []; $item = trim(str_replace(['>','<','title=','value='],'',$item)); if(empty($item) || strstr($item, "u005d%u002e") || strstr($item, "'u005d'") || strstr($item, "'%u0029;")|| strstr($item, "}%u0029;") || strstr($item, "html") || strstr($item, "function ") || strstr($item, "label {") || strstr($item, "+json") || strstr($item, "%u002a")){//可能是页面代码如html、js/css代码 continue; } $item = trim($item, '"'); if (strpos($item,' 数量:') !== false) {//邮件列表道具翻译特殊处理 $itArr = explode('%u002e',$item);// %u002e--| foreach ($itArr as $it1) { $it1Arr = array_filter(explode(' ',$it1)); foreach ($it1Arr as $it2) { $it2Arr = array_filter(explode(':',$it2)); foreach ($it2Arr as $it3) { if (strpos($it3,'数量') !== false) { $it3 = ' '.$it3.':'; } if (strpos($it3,'物品') !== false) { if (strpos($it3,'充值额度%u0029') !== false) {//例 (不增加充值额度)物品 $it4Arr = explode('%u0029',$it3); $itemArr[] = $it4Arr[0].'%u0029'; $itemArr[] = $it4Arr[1].':'; continue; } else { $it3 = $it3.':'; } } $itemArr[] = $it3; } } } } if (strstr($item, " 总充值")) {//处理个别翻译 $itemArr[] = '总充值'; } if (!isset($itemArr[$item])) { $itemArr[$item] = $item; } foreach ($itemArr as $item) { self::arrayAss($jsonArr,$patterns,$replaces,$item); } } //数组按照键值长度 倒叙排序 uksort($patterns, function($a, $b) { return strlen($a) < strlen($b); }); uksort($replaces, function($a, $b) { return strlen($a) < strlen($b); }); $content = preg_replace($patterns, $replaces, $str); if(!empty($content)){ $content = str_replace($unicodeChars,$regexChars,$content); if (strpos($content,'<|/|d|i|v|>|') !== false) {//有些页面经过转换后 出现多余| $content = str_replace('|','',$content); } } else { $content = $oldContent; } return $content; } } //拼接原字符串和翻译字符串的数组 public static function arrayAss($jsonArr,&$patterns,&$replaces,$item){ $patterns[$item] = '/'.$item.'/'; if (!empty($jsonArr[$item])) { $replaces[$item] = $jsonArr[$item]; } else { $replaces[$item] = $item; } } ``` 调用方法 ```php //页面翻译 if (Tool::isvietnam()) {//翻译(用户点击了翻译按钮,Tool::isvietnam()方法是从缓存中获取用户是否点击了翻译按钮) $content = Tool::pregReplaceChinese($content); } //或者 Excel内容/文件名(纯中文)翻译 if (Tool::isvietnam()) {//翻译 $filename = Tool::pregReplaceChinese($filename,'vietnam',true);//Excel文件名 $data = Tool::pregReplaceChinese($data,'vietnam',true);//Excel内容字符串 交易ID,x,x,商品名称,x,x等 } ``` 最后修改:2023 年 11 月 15 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏