php使用正则表达式和翻译字典json文件做翻译

需求:把页面中的中文翻译成越南文。
思路:在框架渲染页面的地方(这个地方能获取到页面渲染后的所有html数据,设为$str),使用以下方法。

//翻译中文 读取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://admin.vanmac.zagoo.vn/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;}
}

调用方法

//页面翻译
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等
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

haproxy端口耗尽no free ports

用haproxy配置负载均衡时出现端口不足错误&#xff1b;后端服务连接一会高一会儿低&#xff0c;从0到1w、2w跳变&#xff1b;实际连接数为4w左右&#xff1b; haproxy[8765]: Connect() failed for backend 09e581: no free ports. 问题描述 在请求很少的时候&#xff0c;工作…

人工智能与大数据:驱动现代业务转型的双引擎

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和大数据已成为驱动业务和技术创新的关键力量。它们的结合不仅重塑了传统行业&#xff0c;也催生了新的商业模式和服务方式。 AI与大数据在零售行业的应用 在零售行业&#xff0c;AI和大数据的应用已经成为提…

排序 算法(第4版)

本博客参考算法&#xff08;第4版&#xff09;&#xff1a;算法&#xff08;第4版&#xff09; - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 本文用Java实现相关算法。 我们关注的主要对象是重新排列数组元素的算法&#xff0c;其中每个元素…

No208.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

echarts官网卡?

全网echarts案例资源大总结和echarts的高效使用技巧&#xff08;细节版&#xff09; - 掘金 drawnLine() {let myChart echarts.init(document.getElementById("grade"));// 绘制图表myChart.setOption({title: {left: "center",},tooltip: {trigger: &qu…

数字孪生智慧园区:大数据驱动下的运营管理革新

随着物联网、大数据、云计算等技术的飞速发展&#xff0c;数字孪生技术应运而生&#xff0c;它将物理世界与数字世界紧密连接起来&#xff0c;为各行各业提供了前所未有的解决方案。智慧园区作为城市的重要组成部分&#xff0c;通过数字孪生技术&#xff0c;可以实现更加高效、…

Redis键指令详解

文章目录 基础命令名称匹配过期时间 Redis系列&#xff1a;安装和初步使用 基础命令 键&#xff0c;即Key&#xff0c;是值的索引&#xff0c;如果翻译成钥匙会更容易理解一些&#xff0c;相当于打开数据的钥匙。或者从编程语言的角度出发&#xff0c;键就是变量名&#xff1…

spring cloud之服务通信

openfeign(*) 简介 官网&#xff1a;https://cloud.spring.io/spring-cloud-openfeign/reference/html/Feign是一个声明式的伪HTTP客户端(底层使用RestTemplate)&#xff0c;它使编写web服务客户端变得更容易。使用feign&#xff0c;只需要创建一个接口并对其添加注解。它具有…

Windows Center 检查sts证书

for i in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list); do echo STORE $i

如何在 Windows 10/11 上高质量地将 WAV 转换为 MP3

WAV 几乎完全准确地存储了录音硬件所听到的内容&#xff0c;这使得它变得很大并占用了更多的存储空间。因此&#xff0c;WAV 格式在作为电子邮件附件发送、保存在便携式音频播放器上、通过蓝牙或互联网从一台设备传输到另一台设备等时可能无法正常工作。 如果您遇到 WAV 问题&…

数据库数据恢复—MSSQL报错“附加数据库错误823”如何恢复数据?

数据库故障&分析&#xff1a; MSSQL Server数据库比较常见的报错是“附加数据库错误823”。如果数据库有备份&#xff0c;只需要还原备份即可&#xff1b;如果无备份或者备份不可用&#xff0c;则需要使用专业的数据恢复手段去恢复数据。 MSSQL Server数据库出现“823”的报…

1.jvm基本知识

目录 概述jvm虚拟机三问jvm是什么&#xff1f;java 和 jvm 的关系 为什么学jvm怎么学习为什么jvm调优?什么时候jvm调优调优调什么 结束 概述 相关文章在此总结如下&#xff1a; 文章地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址运行时数据区-字符串…

理工ubuntu20.04电脑配置记录

8188gu无线网卡配置 首先下载github上的文件&#xff0c;进入文件夹 安装make命令 1. 查看usb无线网卡 sudo lsusb|grep 8188 2. 环境准备 sudo apt-get install git make build-essential git dkms linux-headers-$(uname -r) 3. 编译安装 git clone https://github.com…

敏感数据是什么?包含哪些?如何保障安全?

最近看到不少小伙伴在问&#xff0c;敏感数据是什么&#xff1f;包含哪些&#xff1f;如何保障安全&#xff1f;这里我们小编就给大家一一解答一下&#xff0c;仅供参考哦&#xff01; 敏感数据是什么&#xff1f; 敏感数据&#xff0c;是指泄漏后可能会给社会或个人带来严重危…

UE5、CesiumForUnreal实现加载GeoJson绘制墙体(Wall)功能(StaticMesh方式)

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 具体代码2.3 应用测试2.3.1 流动材质2.3.2 蓝图测试3.参考资料1.实现目标 与上一篇以StaticMesh方式实现面类似,本文通过读取GeoJson数据,在UE中以StaticMeshComponent的形式绘制出墙体数据,并支持Editor和Runtime,在Editor下…

C#中.NET Framework 4.8控制台应用通过EF访问已建数据库

目录 一、创建.NET Framework 4.8控制台应用 二、建立数据库 1. 在SSMS中建立数据库Blogging 2.在VS上新建数据库连接 三、安装EF程序包 四、自动生成EF模型和上下文 1.Blog.cs类的模型 2.Post.cs类的模型 3.BloggingContext.cs数据库上下文 五、编写应用程序吧 我们…

流量分析(5.5信息安全铁人三项赛数据赛题解)

黑客通过外部的web服务器攻击到企业内部的系统中&#xff0c;并留下了web后门&#xff0c;通过外部服务器对内部进行了攻击。 目录 黑客攻击的第一个受害主机的网卡IP地址 黑客对URL的哪一个参数实施了SQL注入 第一个受害主机网站数据库的表前缀(加上下划线 例如abc_) 第一…

哔哩哔哩自动引流软件的运行分享,以及涉及到技术与核心代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 大家好&#xff0c;我是一名专注于自动引流软件研发的技术专家。今天&#xff0c;我将与大家分享自动引流软件涉及到的技术与核心代码&#xff0c;希望能为大家提供一些有价值的参…

【postgresql】查看数据中表的信息

切换到postgresql数据库&#xff0c;各种不适应吧。 有个需求需要查询数据表的各种信息。 下面我们一起学习吧。 ●PostgreSQL: Documentation PostgreSQL: Documentation ●pg_namespace 存储名字空间。名字空间是 SQL 模式下层的结构&#xff1a;每个名字空间有独立的关系…

Java排序算法之基数排序

基数排序&#xff08;Radix Sort&#xff09;是一种线性时间复杂度的排序算法&#xff0c;其时间复杂度为O(d(nk))&#xff0c;其中d是数字的位数&#xff0c;k是进制数。基数排序是一种非比较排序算法&#xff0c;它按照数位的大小来进行排序。它可以处理正整数、负整数和小数…