项目都做完了,领导要求国际化????--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://www.mzph.cn/bicheng/50659.shtml

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

相关文章

MATLAB怎么实现多条曲线共用一个图例

y1 sin(x); y2 3*sin(x); y3 cos(x); y4 3*cos(x); 例子&#xff1a;如果我们有4条曲线&#xff0c;分布是cos类和sin类&#xff0c;我们的图例就想区分是cos类还是sin类。 第一步&#xff08;关键步骤&#xff09; 我们要把我们所需要的类别曲线先画一遍&#xff0c; …

《Programming from the Ground Up》阅读笔记:p75-p87

《Programming from the Ground Up》学习第4天&#xff0c;p75-p87总结&#xff0c;总计13页。 一、技术总结 1.persistent data p75, Data which is stored in files is called persistent data, because it persists in files that remain on disk even when the program …

用 apifox cli 命令行运行本地接口出现TypeError:Invalid IP address: undefined

用 apifox cli 命令行运行本地接口出现TypeError:Invalid IP address: undefined&#xff0c;客户端运行是通过的但命令行运行会报错 修改端口也是一样报错&#xff0c;地址修改为127.0.0.1会报错connect ECONNREFUSED 127.0.0.1:8080 解决方法&#xff1a;不用localhost&…

智能合约在能源行业中的应用:促进可再生能源的发展与利用

随着全球能源需求的增长和环境保护意识的提升&#xff0c;可再生能源作为替代传统能源的重要选择&#xff0c;正逐步成为能源供应的主流。本文将探讨智能合约在能源行业中的应用&#xff0c;特别是如何通过智能合约促进可再生能源的发展与利用。 可再生能源的重要性与挑战 可再…

react中使用forwardRef获取子组件中的节点以及子组件的方法(useImperativeHandle的使用)

1.forwardRef的使用 import { forwardRef, useRef } from "react"const Son forwardRef((props, ref)> {return (<input type"text" ref{ref} id"kannoId"/>) })function ForwardRef() {const sonRef useRef(null)const showRef ()…

Javascript前端面试基础5【每日更10】

let与var的区别 let命令不存在变量提升&#xff0c;如果在let前使用&#xff0c;会导致报错&#xff08;var存在变量提升&#xff09;如果块区中存在let和const命令&#xff0c;就会形成封闭作用域不允许重复声明&#xff0c;因此&#xff0c;不能在函数内部重新声明参数 m…

基于Qt的视频剪辑

在Qt中进行视频剪辑可以通过多种方式实现&#xff0c;但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤&#xff1a; 使用FFmpeg FFmpeg是一个非常强大的多媒体框架&#xff0c;可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…

YOLOv8魔改核心-模型yaml文件解析与网络结构打印

前言 本篇文章主要用于记录学习YOLOv8中网络模型yaml文件&#xff0c;我们一般只知道如何去训练模型&#xff0c;和配置yaml文件&#xff0c;但是对于yaml文件是如何输入到模型里&#xff0c;模型如何将yaml文件解析出来的确是不知道的&#xff0c;下面我们从yaml文件来讲解&a…

python+vue3+onlyoffice在线文档系统实战20240726笔记,左侧菜单实现和最近文档基本实现

解决右侧高度过高的问题 解决方案&#xff1a;去掉右侧顶部和底部。 实现左侧菜单 最近文档&#xff0c;纯粹文档 我的文档&#xff0c;既包括文件夹也包括文件 共享文档&#xff0c;别人分享给我的 基本实现代码&#xff1a; 渲染效果&#xff1a; 简单优化 设置默认菜…

RT-Thread Studio搭建 Renesa Version Board开发环境

目录 概述 1 认识Version Board 1.1 Vision-Board简介 1.2 Vision-Board的资源 2 搭建Version Board开发环境 2.1 RT Thread Studio 2.2 安装SDK 3 开发环境验证 3.1 创建项目 3.2 编译和下载 概述 本文主要介绍使用RT-Thread Studio搭建 Renesa Version Board开发环…

c语言第四天笔记

关于 混合操作&#xff0c;不同计算结果推理 第一种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 13 第二种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 7 7 前面的7是因为后面i的变化被影响后&#xff0c;重新赋值 14 第一种编译结果&#xff…

Html+Css网页开发之动态登录页面(默认Chrome)

>>效果展示图<< 一、需求分析与设计要求 实现了一个动态背景图案的效果&#xff0c;包括一个白色的容器&#xff0c;内部有一个标题、一个输入框、一个按钮和一些文本。 背景是一个渐变色的线性渐变&#xff0c;而在容器的周围&#xff0c;有一些随机的方形和圆形图…

【CN】Argo 持续集成和交付(一)

1.简介 Argo 英 [ˈɑ:ɡəu] 美 [ˈɑrˌɡo] Kubernetes 原生工具&#xff0c;用于运行工作流程、管理集群以及正确执行 GitOps。 Argo 于 2020 年 3 月 26 日被 CNCF 接受为孵化成熟度级别&#xff0c;然后于 2022 年 12 月 6 日转移到毕业成熟度级别。 argoproj.github.i…

【数学建模】权重生成与评价模型(下)

文章目录 权重生成与评价模型&#xff08;下&#xff09;5. 模糊综合评价法5.1 模糊综合分析法的原理5.2 模糊综合分析法的案例 6. 秩和比分析法6.1 秩和比分析法原理6.2 秩和比分析法案例6.3 RSR的分布及其计算确定RSR的分布计算回归方程示例代码实现代码解释 6.4 秩和比分析法…

Godot入门 02玩家1.0版

添加Node2D节点&#xff0c;重命名Game 创建玩家场景&#xff0c;添加CharacterBody2D节点 添加AnimatedSprite2D节点 从精灵表中添加帧 选择文件 设置成8*8 图片边缘模糊改为清晰 设置加载后自动播放&#xff0c;动画循环 。动画速度10FPS&#xff0c;修改动画名称idle。 拖动…

【数据结构初阶】单链表经典算法题十二道——得道飞升(上篇)

目录 1、移除元素 2、反转链表 3、链表的中间节点 4、合并两个有序链表 Relaxing Time&#xff01;&#xff01;&#xff01; ———————————————— 天气之子幻 ———————————————— 1、移除元素 思路&#xff1a; 创建一个新链表&#xff0…

Open3D 获取点云中指定高度区域的所有点

目录 一、概述 1.1实现步骤 1.2应用 二、代码实现 1.1关键函数 1.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、…

CentOS 7.x 的 YUM 仓库问题

背景 CentOS Linux 7 的生命周期&#xff08;EOL&#xff09;已经于 2024 年 6 月 30 日终止这意味着 CentOS 7.x 的官方镜像站点将不再提供服务&#xff0c;导致在使用 yum 安装或更新程序时可能会遇到 错误。本文将介绍如何解决这一问题&#xff0c;使得你可以继续在 CentOS…

【vim】ubuntu20-server 安装配置 vim 最新最详细

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【vim】ubuntu20-server 安装配置 vim 最新最详细 开发环境一、vim github二、安装必…

Elasticsearch 使用误区之三——分片设置不合理

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;它通过将数据分散到多个节点的分片中来进行分布式处理。 本文将探讨分片大小和策略的概念&#xff0c;以优化 Elasticsearch 的性能并防止过度分片或分片过大等问题。 先看个分片设置不合理的真实企业案例&#xff1a; 10…