项目都做完了,领导要求国际化????--JAVA后端篇

news2024/11/15 15:37:44

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", "未获取到字段缓存数据");')

    关注公众号:资小库,问题快速答疑解惑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950679.html

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

相关文章

Java Collections类

Collections是一个与有关集合的工具类&#xff0c;提供了很多对集合进行操作的方法。 常见方法 addAll&#xff1a;往集合中添加多个元素。 public static <T> boolean addAll(Collection<? super T> c, T... elements) {boolean result false;for (T element…

MongoDB教程(二十):MongoDB正则表达式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、正则表…

Python3网络爬虫开发实战(3)网页数据的解析提取

文章目录 一、XPath1. 选取节点2. 查找某个特定的节点或者包含某个指定的值的节点3. XPath 运算符4. 节点轴5. 利用 lxml 使用 XPath 二、CSS三、Beautiful Soup1. 信息提取2. 嵌套选择3. 关联选择4. 方法选择器5. css 选择器 四、PyQuery1. 初始化2. css 选择器3. 信息提取4. …

程序的机器级表示(一)汇编,汇编格式和数据传输指令

系列文章 : 深入理解计算机系统笔记 文章目录 系列文章3 程序的机器级表示3.1 历史观点3.2 程序编码3.2.1 机器级代码3.2.2 代码示例3.2.3 关于格式的注解 3.3 数据格式3.4 访问信息3.4.1 操作数指示符3.4.2 数据传送指令3.4.3 数据传送示例3.4.4 压入和弹出栈数据 3 程序的机…

如何做校园圈子小程序,需要哪些功能?可打包APP小程序H5,源码交付,支持二开!

独立学校首页 支持每个学校独立首页!每个学校都可以拥有专属首页&#xff0c;打造不同风格的学校首页展示效果 多业务覆盖 可实现校园内外卖、跑腿、超市、药店水果、快餐店等业务全覆盖!所有配送业务平台都可开展 多站点运营 支持多学校多站点运营&#xff0c;各分站管理员可独…

【日记】办个护照不至于有这种刑事罪犯一样的待遇吧……(737 字)

正文 暴晒&#xff0c;中午出去骑共享单车&#xff0c;座垫都不敢坐。 至于为什么&#xff0c;中午觉都不睡跑出去&#xff0c;是因为今天他们办承兑汇票的业务&#xff0c;搞了一天&#xff0c;中午不休息&#xff0c;说可能还会用到我的指纹&#xff0c;让我 on call。我心想…

基础IO(文件系统)

一、块组的宏观理解 1、分区和分组 首先一台电脑就一个磁盘&#xff0c;一般800GB到1TB&#xff0c;为了管理这么大的内存数据&#xff0c;我们就对磁盘进行分区&#xff0c;分区之后才是我们看到的C盘&#xff0c;D盘等。 但是其实分区之后空间还是太大不好管理&#xff0c;…

习题2.23

不解释了&#xff0c;这么简单的题目。 (defn for-each[f item](if (not (empty? item));(println (f (first item)))(f (first item)))(if (not (empty? item))(for-each f (rest item)));(f (first item)))执行结果如下

FastGPT、Dify、Coze产品功能对比分析

在当前的人工智能领域&#xff0c;模型接入、应用发布、应用构建、知识库和工作流编排等功能是衡量一个AI平台综合能力的重要指标。本文将对FastGPT、Dify和Coze这三款产品的功能进行详细对比分析&#xff0c;以帮助用户更好地了解它。 订阅模式及市场概况 在订阅模式及市场概…

CSS常见属性详解——内边距与外边距

内边距与外边距 内边距 外边距 应用场景 在网页排版布局时&#xff0c;我们经常会希望元素与元素之间有一定的间距&#xff0c;此时我们可能会用到CSS的外边距或内边距属性&#xff0c;这两个属性都能让元素之间产生距离&#xff0c;那么他们之间有什么不同呢&#xff1f; …

【SpringBoot】1 Gitee

本项目 Gitee 地址&#xff1a;https://gitee.com/Lin_DH/system idea中可能装个gitee的插件&#xff0c;这样操作起来比较方便。 1&#xff09;登录 Gitee 官网&#xff08;https://gitee.com/&#xff09;&#xff0c;新建仓库。 2&#xff09;复制新建的 Gitee 仓库地址&am…

大麦抢票-狠货

大部分购买方式已迁移至手机端&#xff0c;专注研究移动端 小白操作–仅供学习 注意在帐号按权重的第三方账号设置解绑淘宝&#xff0c;否则有可能在抢票时候出现滑块&#xff0c;影响抢票,抢票优先选择大麦 ⚠️核心内容参考&#xff1a; 据悉&#xff0c;在购票环节&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的朋友排队(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

深入分析 Android ContentProvider (五)

文章目录 深入分析 Android ContentProvider (五)ContentProvider 的性能优化和实践案例1. 性能优化技巧1.1. 数据库索引优化示例&#xff1a;添加索引 1.2. 批量操作与事务管理示例&#xff1a;批量插入操作 1.3. 使用异步操作示例&#xff1a;使用 AsyncTask 进行异步查询 1.…

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复&#xff0c;查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

如何为 DigitalOcean 上的托管数据库收集可观测指标

DigitalOcean 在 2024 年 5 月开始支持在托管数据库&#xff08;PostgreSQL、MySQL、Redis和Kafka&#xff09;中收集可观测指标。我们将在本偏内容中&#xff0c;告诉大家如何使用部署在 DigitalOcean App Platform 上的网络应用程序&#xff0c;为 DigitalOcean 上的 Postgre…

C语言 | Leetcode C语言题解之第283题移动零

题目&#xff1a; 题解&#xff1a; void swap(int *a, int *b) {int t *a;*a *b, *b t; }void moveZeroes(int *nums, int numsSize) {int left 0, right 0;while (right < numsSize) {if (nums[right]) {swap(nums left, nums right);left;}right;} }

新手必备:iPhone新机官网验机流程详解

目录 一、准备工作 二、外包装检查 三、序列号查询 四、开箱验机 五、开机验机 六、功能检测 七、售后服务验证 八、总结 一、准备工作 检查包裹&#xff1a;确保快递包裹完好无损。准备录像设备&#xff1a;使用另一台设备录制整个验机过程&#xff0c;以防日后发生纠…

C# 贪吃蛇游戏

贪吃蛇游戏可分为手动玩法和自动玩法 冯腾飞/贪吃蛇

海山数据库(He3DB)性能优化方案解析

前端优化是一个永恒的话题&#xff0c;每个前端开发者都希望自己的页面能够快速加载&#xff0c;给用户良好的体验。但往往事与愿违。因此&#xff0c;本文从编码优化、构建优化、部署优化三方面入手进行web页面性能优化。 1. 编码优化 1.1. Css优化 1.1.1. 合理使用css选择…