项目都做完了,领导要求国际化????--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机器学习爱好者 🗣️ 互动与支持:💬评论 &…...
OpenGL之标准化设备坐标(Normalized Device Coordinate =NDC)
NDC坐标本质是比例1. 设备无关性NDC 使图形渲染与屏幕分辨率无关。无论屏幕是 1280720 还是 19201080,同样的 NDC 坐标都会渲染出相同比例的图形(图形会随着分辨率变化而自动拉伸),表现如下:┌────────────…...
3步轻松上手BepInEx:Unity插件框架新手必备指南
3步轻松上手BepInEx:Unity插件框架新手必备指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的插件框架,能帮助开发者轻…...
你还在用QGIS导出再读Python?实时对接Google Earth Engine的Python SDK深度调优(延迟<800ms,吞吐量提升17倍)
第一章:Python 遥感数据分析遥感数据具有多源、多时相、高维度和大体积的特点,Python 凭借其丰富的科学计算生态(如 NumPy、SciPy、GDAL/OGR、rasterio、xarray 和 scikit-learn)已成为遥感信息提取与分析的主流工具。本章聚焦于使…...
深度学习 三次浪潮、三大驱动力与神经科学的恩怨(二)
1. 一个领域,多个名字 很多人以为"深度学习"是一个全新的领域。事实上,它的历史可以追溯到 20 世纪 40 年代——只不过在不同时期,它被叫过完全不同的名字: 1940s-1960s:被称为控制论(Cybernetic…...
【Hot 100 刷题计划】 LeetCode 138. 随机链表的复制 | C++ 链表深拷贝题解
LeetCode 138. 随机链表的复制 | C 哈希表 DFS 深拷贝题解 📌 题目描述 题目级别:中等 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 请你构造这个链表的深拷…...
【离线无忧】PyAutoGUI内网环境高效安装指南
1. 为什么需要离线安装PyAutoGUI? 最近接手了一个自动化测试项目,需要在完全隔离的内网环境中部署PyAutoGUI。刚开始觉得这不过是个普通的Python包,直到发现服务器连pip都跑不通时才意识到问题的严重性。这种场景在企业开发中其实非常常见—…...
如何用SVGnest提升材料利用率:从问题到解决方案的完整指南
如何用SVGnest提升材料利用率:从问题到解决方案的完整指南 【免费下载链接】SVGnest An open source vector nesting tool 项目地址: https://gitcode.com/gh_mirrors/sv/SVGnest 制造业材料浪费的隐形成本:您的企业是否正在损失30%利润ÿ…...
车辆信号震动信号的滤波、幅值与能量分析——基于测试台采集文件ssjlbpp.m等的研究
车辆信号的震动信号的滤波、幅值以及能量分析,信号是利用测试台采集回来的 文件列表: ssjlbpp.m cxssjlbpp.m ssj.m fuzhissj.m翻了翻硬盘里压箱底的车辆测试台数据,哦对,还有那堆当时随手起的.mat之外的.m文件:ssjlbp…...
Revit插件开发效率革命:热重载技术如何彻底改变你的开发流程
Revit插件开发效率革命:热重载技术如何彻底改变你的开发流程 【免费下载链接】RevitAddInManager Revit AddinManager update .NET assemblies without restart Revit for developer. 项目地址: https://gitcode.com/gh_mirrors/re/RevitAddInManager RevitA…...
苹果内购订阅的“时间陷阱”:如何正确处理UTC与东八区的时间转换(附Java代码)
苹果订阅时间戳的时区陷阱:UTC与东八区转换的实战指南 1. 为什么时间戳处理如此重要? 在苹果应用内购(IAP)订阅系统中,时间戳处理看似简单,实则暗藏玄机。许多开发者都曾踩过这样的坑:用户明明购…...
