项目都做完了,领导要求国际化????--JAVA后端篇

springboot项目国际化相信各位小伙伴都会,很简单,但是怎么项目都做完了,领导却要求国际化文件就很头疼了

国际化的SpringBoot代码:

第一步:创建工具类

/*** 获取i18n资源文件** @author bims*/
public class MessageUtils
{/*** 根据消息键和参数 获取消息 委托给spring messageSource** @param code 消息键* @param args 参数* @return 获取国际化翻译值*/public static String message(String code, Object... args){MessageSource messageSource = SpringUtils.getBean(MessageSource.class);return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());}public static String message(String code, Locale locale, Object... args){try{//SpringUtilsMessageSource messageSource = SpringUtils.getBean(MessageSource.class);if(locale==null){locale=LocaleContextHolder.getLocale();}return messageSource.getMessage(code, args,locale );}catch (Exception e){return code;}}
}

对于Bean的处理在SpringUtils中是这样的:

    /*** 获取类型为requiredType的对象** @param clz* @return* @throws org.springframework.beans.BeansException**/public static <T> T getBean(Class<T> clz) throws BeansException{T result = (T) beanFactory.getBean(clz);return result;}

第二步:配置yml 

# Spring配置
spring:# 资源信息messages:# 国际化资源文件路径basename: static/i18n/message,static/i18n/store,static/i18n/menu

第三步:创建Python扫描工程--尽力了啊,有些实在匹配不上规则,大佬的话可以自己研究

import os
import re# 遍历目录及其子目录下的所有.java文件
def scan_java_files(root_dir):java_files = []for root, _, files in os.walk(root_dir):for file in files:if file.endswith('.java'):java_files.append(os.path.join(root, file))return java_files# 判断是否为注释行
def is_comment_line(line):# 抓取每行的关键词,碰到返回的就翻译,这样拼装格式的可能不会翻译,自己研究吧return ((line.count("AjaxResult.")>0 or line.count("ajaxResult.")>0 orline.strip().startswith("throw new")) and not line.count(".format") >0 and not line.count('getErrorUS')>0)def extract_outer_parentheses_parts(input_string):arrs = input_string.split("+");res = []for arr in arrs:if arr.strip().startswith('"') and arr.strip().endswith('"'):passelse:res.append(arr)return res# 扫描并翻译Java工程中的中文字符
def translate_java_project(root_dir):java_files = scan_java_files(root_dir)translated_texts = {}translated_china_texts = {}leng = 0for java_file in java_files:# 去掉domian数据if java_file.count("domain") > 0:continuewith open(java_file, 'r', encoding='utf-8') as file:content_lines = file.readlines()flag = 0flag2 = 0for line in content_lines:pattern = re.compile(r'[\u4e00-\u9fff]')# 查找字符串中是否有中文字符match = re.search(pattern, line)if is_comment_line(line) and match:flag2 = 1if "com.xxx.common.utils.MessageUtils" in line:flag = 1# 更新Java文件中的中文字符为国际化键with open(java_file, 'w', encoding='utf-8') as file:for line in content_lines:if flag == 0 and flag2 == 1 and "package" in line:line += '\n' + "import com.xxx.common.utils.MessageUtils;"if is_comment_line(line):pattern = re.compile(r'[\u4e00-\u9fff]')# 查找字符串中是否有中文字符match = re.search(pattern, line)if match:arrs = get_params(line)n = len(arrs)for i in range(n):chinese_chars = re.findall(r'([\u4e00-\u9fa5]+)', arrs[i])if len(chinese_chars) > 0:chinese_str = ''.join(chinese_chars)chinese_text = convert_string(arrs[i])if chinese_str not in translated_china_texts:translated_china_texts[chinese_str] = chinese_textstr = 'MessageUtils.message("' + chinese_str + '"'params = extract_outer_parentheses_parts(arrs[i])if len(params) > 0:for param in params:str += ("," + param)str += ")"arrs[i] = strflag2 = 1print(arrs)print("变更前:" + line)match = re.search(r'\((.*)\)', line)if match:content_inside_brackets = match.group(1)line = line.replace(content_inside_brackets, ",".join(arrs))print("变更后:" + line)file.write(line)# 写入i18n文件with open('messages.text', 'w', encoding='utf-8') as i18n_file:for chinese_text, translated_text in translated_china_texts.items():i18n_file.write(f'{chinese_text}={translated_text}\n')with open('messages_zh_cn.text', 'w', encoding='utf-8') as i18n_file:for chinese_text, translated_text in translated_china_texts.items():i18n_file.write(f'{chinese_text}={translated_text}\n')with open('messages_en_us.text', 'w', encoding='utf-8') as i18n_file:for chinese_text, translated_text in translated_texts.items():i18n_file.write(f'{chinese_text}=\n')def get_params(method_string):match = re.search(r'\((.*)\)', method_string)if match:content_inside_brackets = match.group(1)arr = content_inside_brackets.split(",")indices = [i for i, item in enumerate(arr) if item.count('"') % 2 != 0]arr2 = [indices[i:i + 2] for i in range(0, len(indices), 2)]for start, end in arr2:corrected_str = ','.join(arr[start:end + 1])arr[start:end + 1] = [corrected_str] * (end + 1 - start)arr = [x for i, x in enumerate(arr) if x not in arr[:i]]return arrelse:return []
def convert_string(input_string):arrs = input_string.split("+");input_string = ""index = 0for arr in arrs:print(arr)if arr.strip().startswith('"') and arr.strip().endswith('"'):input_string += arr.replace('"', '')else:input_string+='{'+(str(index))+"}"index += 1return input_stringdef get_line(line,translated_china_texts,flag2):arrs = get_params(line)n = len(arrs)for i in range(n):chinese_chars = re.findall(r'([\u4e00-\u9fa5]+)', arrs[i])if len(chinese_chars) > 0:chinese_str = ''.join(chinese_chars)chinese_text = convert_string(arrs[i])if chinese_str not in translated_china_texts:translated_china_texts[chinese_str] = chinese_textstr = 'MessageUtils.message("' + chinese_str + '"'params = extract_outer_parentheses_parts(arrs[i])if len(params) > 0:for param in params:str += ("," + param)str += ")"arrs[i] = strflag2 = 1print(arrs)print("变更前:" + line)match = re.search(r'\((.*)\)', line)if match:content_inside_brackets = match.group(1)line = line.replace(content_inside_brackets,",".join(arrs))print("变更后:" + line)
if __name__ == '__main__':translate_java_project('G:\\xxx\\xxx')# input_string = 'e.getA(sds)+"案件,比,萨饼"+e.getA(sds)+e.getB(asa)+e.getC(asd)'# print(convert_string('"运行时异常:" + serviceException.getServiceMsg()'))# print(extract_outer_parentheses_parts('500,"运行时异常:" + serviceException.getServiceMsg()'))# print(get_params('  throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));'))# print(get_line('                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));',{},flag2=0))# print(has_unmatched_parentheses("wesf()csd"))# get_test('throw new ServiceException("500", "未获取到字段缓存数据");')

    关注公众号:资小库,问题快速答疑解惑

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

循环队列的实现【C语言】

用数组实现循环队列 题目&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 分析 循环队列&#xff0c;队列满则不能再插入数据&#xff0c;队列为空则不能再出数据。 多开一个空间方便区分队列为空和队列为满的情况。 如果要存K个数据只开K个空间&a…

IEC104转BACnet网关:实现电力监控与楼宇自动化的无缝对接

在电力监控和楼宇自控领域&#xff0c;IEC104和BACnet作为两种重要的通信协议扮演着重要的角色。随着不同系统之间的数据交换与集成需求的不断增长&#xff0c;深圳市钡铼技术有限公司推出IEC104转BACnet网关来实现这两种协议之间的无缝转换&#xff0c;助力电力监控和楼宇自控…

leetcode日记(47)螺旋矩阵Ⅱ

这题思路不难&#xff0c;就是找规律太难了。 我首先的思路是一行一行来&#xff0c;根据规律填入下一行的数组&#xff0c;第i行是由前i个数字&#xff08;n-2*i&#xff09;个增序数列后i个数字组成&#xff0c;后来觉得太难找规律了就换了一种思路。 思路大致是先计算出需…

C#、Net6、WebApi报表方案

目录 1 Pdf表单方案 1.1出现如下错误提示: 1.2 字体路径使用 2 Docx报表模板方案 2.1 pdf方案缺陷 2.2 解决方案 3 Spire.Doc报表方案 3.1 Docx方案缺陷 3.2 解决方案 4 插入复选框 5 WebApi文件流下载接口 6 软件获取方式 1 Pdf表单方案 使用【Adobe Acrobat P…

MongoDB教程(二十三):关于MongoDB自增机制

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

raise JSONDecodeError(“Expecting value”, s, err.value) from None

raise JSONDecodeError(“Expecting value”, s, err.value) from None 目录 raise JSONDecodeError(“Expecting value”, s, err.value) from None 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是…

ISO 50001能源管理体系:企业可持续发展的新引擎

在全球范围内&#xff0c;能源管理正成为企业战略规划的重要组成部分。ISO 50001能源管理体系&#xff08;EnMS&#xff09;作为一项国际标准&#xff0c;为企业提供了一套系统的方法&#xff0c;帮助其提高能源绩效&#xff0c;降低能源消耗&#xff0c;减少碳排放。通过有效实…

Feign-微服务通信(Feign远程调⽤ Feign简介 基本使⽤ ⾃定义配置 Feign使⽤优化)

目录 一、Feign远程调⽤ 二、Feign简介 三、基本使⽤ 1. 加⼊Fegin的依赖 2. 在主类上添加Fegin的注解 3. 创建⼀个service&#xff0c; 并使⽤Fegin实现微服务调⽤ 4. 修改controller代码&#xff0c;并启动验证 5. 重启order微服务,查看效果 四、⾃定义配置…

oncoPredict:根据细胞系筛选数据预测体内或癌症患者药物反应和生物标志物

在14年的时候&#xff0c;oncoPredict函数的开发团队在Genome Biology上发了一篇文章。 这篇文章的核心目的是阐释了使用治疗前基线肿瘤基因表达数据去预测患者化疗反应。开发团队发现使用细胞系去预测临床样本的药物反应是可行的。 鉴于之前的理论&#xff0c;该研究团队首先…

C语言开关迷宫

目录 注意事项开头程序程序的流程图程序的效果结尾 注意事项 程序里有关字符’\033’的输出都关于Sunshine-Linux的其中一篇博客——《printf函数高级用法设置打印字体颜色和背景色等》 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来看一下我用C语言编译的开…

昇思25天学习打卡营第23天|munger85

FCN图像语义分割 FCN-8s表示从8倍下采样的特征图通过上采样恢复到原图尺寸的网络结构。现在下载数据集&#xff0c;这种8倍的比较好。 from download import download url “https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/dataset_fcn8s.t…

2024年用户口碑超佳的硬U盘数据恢复工具榜

U盘一个体积小小却能携带大量文件、视频的日常存储好物&#xff0c;你肯定也有吧。不知道你有没有遇到过U盘里数据丢失的情况&#xff0c;这时候U盘数据恢复工具就能帮我们走出这种困境。 1.U盘F0XIT数据恢复大师 一键直达>>https://www.pdf365.cn/foxit-restore/ 这…

自动驾驶-机器人-slam-定位面经和面试知识系列05之常考公式推导(02)

这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客&#xff08;牛客上某些文章上会附上内推码&#xff09;也会同步…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《面向东北地区调频指标两段式火储联合调频策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

浅谈断言之XML断言

浅谈断言之XML断言 XML断言是JMeter的一个组件&#xff0c;用于验证请求的响应数据是否符合XML结构。这对于测试返回XML格式数据的Web服务特别有用。 如何添加XML断言&#xff1f; 要在JMeter测试计划中添加XML断言&#xff0c;遵循以下步骤&#xff1a; 打开测试计划&…

C#知识|账号管理系统:将修改账号信息提交到数据库

哈喽,你好啊,我是雷工! 昨天练习了账号管理系统-修改账号按钮功能的实现: 《修改账号按钮功能的实现》; 接下来继续学习,如何将修改完的信息提交到数据库, 以下为学习笔记。 01 实现功能 ①:当修改完信息,点击【提交修改】按钮时,将修改完的信息保存到SQLServer数…

Qt调用谷歌拼音输入插件

要在Qt中调用谷歌拼音输入插件 编译谷歌拼音输入法源码&#xff1a; 可以通过编译谷歌拼音输入法的源码来实现在Qt中的应用。以下是一些步骤&#xff1a; 下载QtInputMethod_GooglePinyin源码&#xff0c;例如从Gitee获取。 使用MinGW64或MSVC2019_64构建套件编译源码。 编译完…

Cyberchef基础概念之-循环语句操作-Jump/Label

在本专栏的前面的文章介绍了fork,merge,subsection,register等多种概念来解决实际场景的问题。本文将介绍的Jump/Label的操作类似于编程语言中的for和while的功能&#xff0c;相信在学会使用jump操作后&#xff0c;将有助于解决更为复杂的数据处理问题。 本文将详细的介绍该操…

小程序的运营方法:从入门到精通

随着科技的快速发展&#xff0c;小程序已成为我们日常生活和工作中不可或缺的一部分。小程序无需下载安装&#xff0c;即用即走的特点深受用户喜爱。那么&#xff0c;如何运营好一个小程序呢&#xff1f;下面就为大家分享一些小程序的运营方法。 一、明确目标用户 在运营小程序…

【计算机网络】单臂路由实现VLAN间路由实验

一&#xff1a;实验目的 1&#xff1a;掌握如何在路由器端口上划分子接口&#xff0c;封装dot1q协议&#xff0c;实现VLAN间的路由。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS-C服务器、网线、Windows 2019/2003操作系统的计算机等。具体为&#xff1a;路由器…