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{
//SpringUtils
MessageSource 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 or
line.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('"'):
pass
else:
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 = 0
for java_file in java_files:
# 去掉domian数据
if java_file.count("domain") > 0:
continue
with open(java_file, 'r', encoding='utf-8') as file:
content_lines = file.readlines()
flag = 0
flag2 = 0
for line in content_lines:
pattern = re.compile(r'[\u4e00-\u9fff]')
# 查找字符串中是否有中文字符
match = re.search(pattern, line)
if is_comment_line(line) and match:
flag2 = 1
if "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_text
str = 'MessageUtils.message("' + chinese_str + '"'
params = extract_outer_parentheses_parts(arrs[i])
if len(params) > 0:
for param in params:
str += ("," + param)
str += ")"
arrs[i] = str
flag2 = 1
print(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 arr
else:
return []
def convert_string(input_string):
arrs = input_string.split("+");
input_string = ""
index = 0
for arr in arrs:
print(arr)
if arr.strip().startswith('"') and arr.strip().endswith('"'):
input_string += arr.replace('"', '')
else:
input_string+='{'+(str(index))+"}"
index += 1
return input_string
def 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_text
str = 'MessageUtils.message("' + chinese_str + '"'
params = extract_outer_parentheses_parts(arrs[i])
if len(params) > 0:
for param in params:
str += ("," + param)
str += ")"
arrs[i] = str
flag2 = 1
print(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", "未获取到字段缓存数据");')
关注公众号:资小库,问题快速答疑解惑