项目都做完了,领导要求国际化????--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", "未获取到字段缓存数据");')
关注公众号:资小库,问题快速答疑解惑
相关文章:

项目都做完了,领导要求国际化????--JAVA后端篇
springboot项目国际化相信各位小伙伴都会,很简单,但是怎么项目都做完了,领导却要求国际化文件就很头疼了 国际化的SpringBoot代码: 第一步:创建工具类 /*** 获取i18n资源文件** author bims*/ public class Message…...

国内备受好评PostgreSQL数据库性能如何?
为什么国内很多数据库采用PostgreSQL数据库作为基础,再次开发自己的产品呢?不仅仅是因为PostgreSQL数据库开源免费、PostgreSQL 数据库的性能也是相当出色的,具有以下几个方面的特点: 1. 处理大规模数据: - 能够有效地管理和处…...

彻底搞懂前端跨域解决方案
一、浏览器的同源策略 1、同源策略概述 同源策略是浏览器为确保资料安全,而遵循的一种策略,该策略对访问资源进行了一些限制。 2、什么是源(origin)? 3、示例 4、同源请求 5、非同源请求 二、跨域会受到哪些限制 1…...

Kafka基础概念
MQ消息中间件 1)总览: 消息中间件 这里我们主要学习的是kafka的基础概念 具体参考黑马头条:https://www.bilibili.com/video/BV1Qs4y1v7x4/?spm_id_from333.337.search-card.all.click 2)消息中间件对比 3)Kafka介…...

【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models
1 引言 现有3D生成模型: 3D点云:大量离散的3D点组成的数据表示形式; 多边形网格:一系列相连的多边形组成的3D模型; 水平集场:使用数值函数来表示物体的边界,并根据函数值的正负来确定物体内部…...

《如鸢》开通官号,女性向游戏爆款预定
今天,备受瞩目的沉浸式剧情卡牌手游《如鸢》正式开通了官方社媒账号并发布了玩家信。 《如鸢》由灵犀互娱倾力打造,游戏不仅拥有跌宕起伏的权谋剧情,更采用Live2D技术,为玩家带来沉浸式的游戏体验,吸引了众多玩家关注。…...
OpenAI再下一城:发布Voice Engine,可使用文本和参考语音合成说话者的新语音!
转自 机器学习算法工程师 OpenAI又发布了一个最新的工作:Voice Engine。Voice Engine可以使用文本输入和单个 15 秒音频样本生成听起来自然且与原始说话者非常相似的语音。而且,一个小型模型仅通过一个 15 秒的样本就能创造出富有情感且逼真的语音。Voi…...
KVM高级功能部署
一、概述 KVM(Kernel-based Virtual Machine)是一种基于内核的虚拟化技术,它依赖于CPU的虚拟化扩展(如Intel VT和AMD-V)来实现虚拟机的创建、管理和调度。KVM虚拟化技术因其高效、稳定的特点,在云计算和企…...
【C语言】柔性数组(打开前所未见的大门)
文章目录 前言柔性数组1.1 概念1.2 柔性数组的特点1.3 柔性数组的使用1.4 柔性数组的优势 总结 前言 说到柔性数组,相信有很多学过C语言的读者都不知道这是个什么东西。不过没有关系,相信本章能够带你从到认识到掌握柔性数组,做一个充满知识…...

设计模式17-适配模式
设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化?如何既能利用现…...
react ant Input defaultValue={value}设置了value值以后,但是defalult没有赋值上,输入框也没有显示
在 React 中,defaultValue 是一个非受控属性,而 value 是一个受控属性。这两个属性都可以用于设置 Input 组件的值,但是它们的工作方式有所不同。 value:这是一个受控属性,意味着输入框的值由 React 状态控制。每当状态…...
大模型开发如何把一段文字变成一组token?
在大模型开发中,将一段文字变成一组token通常称为"tokenization"(分词)。这是自然语言处理中的一个关键步骤,主要是将连续的文本划分成离散的单元(token),这些单元可以是单词、子词或…...
【MSYS】Windows Terminal 集成
Windows Terminal 集成 MSYS2安装在默认位置C:\msys64打开Windows Terminal打开JSON配置文件文件。 添加如下配置: "profiles": {"defaults": {},"list": [{"guid": "{71160544-14d8-4194-af25-d05feeac7233}"…...

Python酷库之旅-第三方库Pandas(056)
目录 一、用法精讲 211、pandas.Series.truncate方法 211-1、语法 211-2、参数 211-3、功能 211-4、返回值 211-5、说明 211-6、用法 211-6-1、数据准备 211-6-2、代码示例 211-6-3、结果输出 212、pandas.Series.where方法 212-1、语法 212-2、参数 212-3、功能…...

ZBrush入门使用介绍——4、笔刷选项说明
大家好,我是阿赵。 这次来看看ZBrush的笔刷的选项用法。 一、选择笔刷 点击笔刷,可以打开笔刷选择面板。 在最上面的Quick Pick,有最近使用过的笔刷,可以快速的选择。下面有很多可以选择的笔刷。但由于笔刷太多,…...

Java每日一练,技术成长不间断
目录 题目1.下列关于继承的哪项叙述是正确的?2.Java的跨平台特性是指它的源代码可以在多个平台运行。()3.以下 _____ 不是 Object 类的方法4.以下代码:5.下面哪个流类不属于面向字符的流()总结 题目 选自牛…...

传知代码-上下位关系自动检测方法(论文复现)
代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文复现论文 Hearst patterns revisited: Automatic hypernym detection from large text corpora[1] 提出的文本中上位词检测方法。 在自然语言处理中,上下位关系(Is-a Relations…...

从零开始的MicroPython(二) GPIO及代码应用
上一篇:http://t.csdnimg.cn/mg2Qt 文章目录 ESP32(NodeMCU-32S)简介引脚注意事项 类与对象的概念MicroPython的GPIO使用文档解释machine.PinPin.irq 点灯 ESP32(NodeMCU-32S) 简介 NodeMCU-32S 是安信可基于 ESP32-32S 模组所设计的核心开发板。该开发板延续了 N…...

嵌入式day15
数组指针 能够指向整个数组 一维数组: &a,考察a的数据类型 int(*p)[10]:表示一个指向长度为10的一维整型数组的指针 二维数组: 指向函数的指针 函数的函数名,即为函数的入口地址&#x…...

【电池管理系统(BMS)-01】 | 电池管理系统简介,动力电池和储能电池区别
🎩 欢迎来到技术探索的奇幻世界👨💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...