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

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

 public static void main(String[] args) {
        HashMap<String, HashMap<String,String>> translation = new HashMap<>();
        HashMap<String, String> 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的代码块

/**
 * 封装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<String, HashMap<String,String>> translation = new HashMap<>();
        // 模拟中文模板
        HashMap<String, String> cnMap = new HashMap<>();
        cnMap.put("cer","通过学习课程《${course}》,获得了${score}积分");// 根据模板名称设置模板,模拟18n的语言文件夹配置
        // 模拟英文模板
        HashMap<String, String> 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<String, String> 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<String,String> parameterDictionary){
        if (parameterDictionary==null||parameterDictionary.size()==0)
            return builder;
        parameterDictionary.forEach((k,v)->{
            replace(builder, k, v);
        });
        return builder;
    }

简化以后的调用以及执行结果
在这里插入图片描述
在这里插入图片描述

翻译utils

从cookie获取语言
import Cookies from 'js-cookie'

const languageKey = 'admin-language'

export function getLanguage() {
  return Cookies.get(languageKey)
}

export function setLanguage(language) {
  return Cookies.set(languageKey, language)
}

字典
import { getLanguage } from '@/utils/language'

export const en = {
  'search': 'Search',
  'add': 'Add',
  'oderId': 'Oder Id',
  'userId': 'User Id',
  'goodsId': 'Goods Id',
  'goodsName': 'Goods Name',
  'goodsTypeId': 'Goods Type Id',
  'courseName': 'Course Name',
  'courseId': 'Course Id'
}
export const cn = {
  'search': '搜索',
  'add': '添加',
  'oderId': '订单Id',
  'userId': '用户Id',
  'goodsId': '商品Id',
  'goodsName': '商品名称',
  'goodsTypeId': '商品类型Id',
  'courseName': '课程名称',
  'courseId': '课程Id'
}

export function translation(key) {
  // 如果是英语就使用en字典,如果不是就使用中文字典
  let value = getLanguage() === 'en_US' ? en : cn[key]
  if (value === null || value === '' || value === undefined) {
    // 如果最终值超出预期就返回key
    value = key
  }
  // 返回冲字典中get到的value
  return value
}

使用部分

在使用的地方引入,翻译工具

import { translation } from '@/utils/translation'

定义一些变量,可以的话设置一些默认值
在这里插入图片描述
使用变量
在这里插入图片描述
最后在页面初始化生命周期中调用翻译方法,在方法中遍历butten数组,拿key去取value,需要注意的一点是,这里定义的变量map一定要和字典中对应

// 页面初始化时执行
 created() {
    this.getList()
    this.translationValue()
 } 

// 页面初始化翻译button列表的方法
 methods:{
    translationValue() {
      for (const buttonKey in this.button) {
        this.button[buttonKey] = translation(buttonKey)
      }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值