栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

一个关于多语言,动态配置通知消息的测试代码,StringBuilder替换指定字符串

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一个关于多语言,动态配置通知消息的测试代码,StringBuilder替换指定字符串

App要求:
获取的通知消息存在数据库中,
不同语言的用户获取到的是对应语言的通知消息,和前端沟通无果;
希望前端能保留各种通知类型对应语言,我传递通知code值,前端根据code加载不同的消息内容,并拼接参数;
前端表示:搭嘎,口头瓦鲁!!
不愧是懒得计算样式和背景颜色让我在后端增加字体样式,图标样式名称,背景样式名称,字体颜色名称,这些字段在json里的前端;
只能自己来了;
由于只是demo这里就用map替代i18n的配置文件了,原理是一样的;

 public static void main(String[] args) {
        HashMap> translation = new HashMap<>();
        HashMap strMap = new HashMap<>();
        strMap.put("cer","通过学习课程$$,获得了$$积分"); // 根据模板名称设置模板,模拟18n的语言文件夹配置
        translation.put("zh_CN",strMap); // 根据语言设置模板对,模拟18n的语种配置

        String notification = "cer"; // 通知代号
        String[] params = {"《屎山代码集锦》","3600"}; // 通知需要填入的参数数组

        String msg = translation.get("zh_CN").get(notification); // 匹配语言获得语言的消息map,再根据消息code获取对应的模板
        StringBuilder builder = StringBuilderUtils.replace(new StringBuilder(msg), "$$", params);
        System.out.println(builder);
    }

一个StringBuilder的代码块

public class StringBuilderUtils {
    // 替换指定字符串
    public static StringBuilder replace(StringBuilder builder, String target, String str) {
        // 目标不能为""否则会替换第一个字符
        if ((target == null || target.length() == 0) || str == null)
            return builder;
        int first = builder.indexOf(target);
        if (first < 0)
            return builder;
        builder.replace(first, first + target.length(), str);
        return builder;
    }
    // 遍历数组从左到右逐个替换
    public static StringBuilder replace(StringBuilder builder, String target, String... str) {
        if (str==null||str.length==0)
            return builder;
        for (String s : str) {
            replace(builder,target,s);
        }
        return builder;
    }
}

============================

后续发现一个问题,不同语言的语序是不一样的,所以每个模板的参数位置不是确定的,用数组做参数不合适;
于时使用Map保存参数,key做占位符;value为需要填入的值;如果连value都要翻译,那再加一个配置Map吧;

public static void main(String[] args) {
        // 语言字典,,语言:消息字典
        HashMap> translation = new HashMap<>();
        // 模拟中文模板
        HashMap cnMap = new HashMap<>();
        cnMap.put("cer","通过学习课程《${course}》,获得了${score}积分");// 根据模板名称设置模板,模拟18n的语言文件夹配置
        // 模拟英文模板
        HashMap enMap = new HashMap<>();
        enMap.put("cer","Gained ${score} points by studying the course ”${course}“ ");
        // 设置模板进对应的语言
        translation.put("zh_CN",cnMap); // 设置为中文模板,模拟18n的语种配置
        translation.put("en_US",enMap); // 设置为英语模板,模拟18n的语种配置

        String notification = "cer"; // 通知代号
        // 通知需要填入的参数Map集合
        HashMap paramMap = new HashMap<>();
        paramMap.put("${course}","屎山代码集锦");
        paramMap.put("${score}","100");

        String msg = translation.get("zh_CN").get(notification); // 匹配语言获得语言的消息map,再根据消息code获取对应的模板
        StringBuilder stringBuilder = new StringBuilder(msg);
        paramMap.forEach((k,v)->{
            StringBuilderUtils.replace(stringBuilder, k, v);
        });
        System.out.println(stringBuilder.toString());
    }

新增StringBuilder工具

   // 遍历Map集合使用k作为占位符,替换为value
    public static StringBuilder replaceMap(StringBuilder builder, Map parameterDictionary){
        if (parameterDictionary==null||parameterDictionary.size()==0)
            return builder;
        parameterDictionary.forEach((k,v)->{
            replace(builder, k, v);
        });
        return builder;
    }

简化以后的调用以及执行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/884821.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号