项目都做完了,领导要求国际化????--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.rhkb.cn/news/385179.html

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

相关文章

freesql简单使用操作mysql数据库

参考&#xff1a;freesql中文官网指南 | FreeSql 官方文档 这两天准备做一个测试程序&#xff0c;往一个系统的数据表插入一批模拟设备数据&#xff0c;然后还要模拟设备终端发送数据包&#xff0c;看看系统的承压能力。 因为系统使用的第三方框架中用到了freesql&#xff0c…

QT自定义无边框窗口(可移动控制和窗口大小调整)

QT是一个功能强大的跨平台开发框架&#xff0c;它提供了丰富的界面设计工具和组件。在界面开发中&#xff0c;QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口&#xff0c;包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…

linux离线安装mysql8(单机版)

文章目录 一、检查服务器是否有残留mysql资源&#xff0c;有的话就全删除1.1、查询mysql已安装的相关依赖&#xff1a;1.2、查找含有MySQL的目录 二、安装2.1、上传mysql安装包到文件夹下并解压2.2、移动及重命名2.3、mysql用户2.4、配置mysql所需的my.cnf文件2.5、给my.cnf配置…

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起&#xff0c;我们不再单独介绍推荐算法的原理&#xff0c;而是开始进入一个新的模块-工程篇。 在工程实践的部分中&#xff0c;我首先介绍的内容是当今最热门的信息流架构。 信息…

脑网络布线成本优化——从Caja守恒原则到最小化成本的探索

脑网络布线成本优化——从Caja守恒原则到最小化成本的探索 Caja守恒原则的核心作用 Caja守恒原则&#xff0c;即大脑组织的布线成本最小化原则&#xff0c;是神经科学中的一个重要概念。它指出&#xff0c;大脑在组织结构上倾向于最小化连接神经元以构成环路或网络所涉及的布…

数据结构之探索“堆”的奥秘

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 堆的概念 堆的创建 时间复杂度分析&#xff1a; 堆的插入与删除 优先级队列 PriorityQ…

Docker安装kkFileView实现在线文件预览

kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 官方文档地址:https://kkview.cn/zh-cn/docs/production.html 一、拉取镜像 do…

go-kratos 学习笔记(6) 数据库gorm使用

数据库是项目的核心&#xff0c;数据库的链接数据是data层的操作&#xff0c;选择了比较简单好用的gorm作为数据库的工具&#xff1b;之前是PHP开发&#xff0c;各种框架都是orm的操作&#xff1b;gorm还是很相似的&#xff0c;使用起来比较顺手 go-kratos官网的实例是ent&…

轻松搭建 VirtualBox + Vagrant + Linux 虚拟机

一、准备工作 首先&#xff0c;我们来了解一下搭建 VirtualBox Vagrant Linux 虚拟机所需的软件准备工作。 VirtualBox 的下载地址&#xff1a;您可以通过访问https://www.virtualbox.org/wiki/Downloads获取适用于您系统的版本。 Vagrant 的下载地址&#xff1a;前往http…

斯坦福UE4 C++课学习补充 14:UMG-优化血量条

文章目录 一、优化执行效率二、简单脉冲动画 一、优化执行效率 绑定事件需要每一帧检查绑定对象是否有变化&#xff0c;势必造成CPU资源的浪费&#xff0c;因此优化执行效率的思路是&#xff1a;UI组件不再自行每帧查询血量&#xff0c;而是让血量自己在发生变化的同时通知UI进…

Linux环境下(DeepinV20+)安装并配置jdk和maven

一、jdk下载 Oracle的JDK开始收费了&#xff0c;如非必要&#xff0c;请勿使用&#xff01;&#xff01;&#xff01; jdk下载地址1&#xff08;推荐&#xff09;https://github.com/graalvm/graalvm-ce-builds/releases jdk下载地址2&#xff08;可选&#xff09;&#xff1a;…

LLM 大语言模型显存消耗估计与计算

LLM 大语言模型显存消耗估计与计算 1. LLM 大语言模型开发流程 在大模型&#xff08;如 LLaMA-7B、GPT-3 等&#xff09;的开发、训练、微调、推理和部署过程中&#xff0c;各个阶段的流程都涉及多个复杂的步骤。以下是详细的流程描述&#xff0c;涵盖训练和微调的区别&#…

SpringCloud+Vue3多对多,多表联查

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

学习日记:数据类型2

目录 1.转义字符 2.隐式类型转换 2.1 强制类型转换 2.2 不同类型间赋值 3.运算符 表达式 3.1 算术运算符 3.2 算术运算优先级 3.3 赋值运算 3.3.1 不同类型间混合赋值 3.4 逗号运算 4.生成随机数 5. 每日一练 1.转义字符 \n 表示换行 \t …

前端渲染模式

渲染的概念 在Web开发中&#xff0c;渲染&#xff08;Rendering&#xff09;是一个核心概念&#xff0c;指的是将应用程序的数据&#xff08;data&#xff09;与模板&#xff08;template&#xff09;结合&#xff0c;生成最终的HTML页面&#xff0c;这个页面随后会被浏览器解析…

RedHat9 | Ansible 角色

环境版本说明 RedHat9 [Red Hat Enterprise Linux release 9.0]Ansible [core 2.13.3]Python [3.9.10]jinja [3.1.2] 描述角色结构 Playbook可能比较冗长且负载&#xff0c;也可能存在大量的重复代码。而角色&#xff08;roles&#xff09;可以用于层次性结构化的组织playbo…

55. 跳跃游戏【 力扣(LeetCode) 】

一、题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二、测试用…

在vue中优雅地异步引入(懒加载)腾讯地图API

背景 接到一个需求需要在网站首页显示使用腾讯地图展示公司所在地。一开始我直接全局引入了腾讯地图js&#xff0c;结果发现在用户打开登陆页面的时候首页比较缓慢&#xff0c;为了提高用户登陆的加载效率&#xff0c;需要优化为异步引入。 思路 根据官网的示例&#xff0c;…

SQL 注入漏洞详解 - Union 注入

1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,…

【前端 02】新浪新闻项目-初步使用CSS来排版

在今天的博文中&#xff0c;我们将围绕“新浪新闻”项目&#xff0c;深入探讨HTML和CSS在网页制作中的基础应用。通过具体实例&#xff0c;我们将学习如何设置图片、标题、超链接以及文本排版&#xff0c;同时了解CSS的引入方式和选择器优先级&#xff0c;以及视频和音频标签的…