package com.imyeyu.lang.mapper; import com.imyeyu.java.TimiJava; import com.imyeyu.java.bean.Language; import com.imyeyu.utils.Text; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; /** * @author 夜雨 * @version 2024-04-03 10:11 */ public class LanguageMap extends AbstractLanguageMapper { protected final Map map; /** * 默认构造 * * @param language 所属语言 */ public LanguageMap(Language language) { super(language); this.map = new HashMap<>(); } public void union(LanguageMap map) { this.map.putAll(map.map); } @Override public void add(String key, String value) { map.put(key, value); } @Override public boolean has(String key) { return map.containsKey(key); } /** * 获取文本,支持二次映射,没有找到映射时返回入参键 *
	 *     test.msg=Hello world
	 *     mapping=@test.msg
	 *     no_mapping=\@test.msg
	 *
	 *     Multilingual.text("mapping");    // Hello world
	 *     Multilingual.text("no_mapping"); // @test.msg
	 * 
* * @param key 键 * @return 文本值 */ @Override public String text(String key) { if (map.containsKey(key)) { String result = map.get(key); if (result.startsWith("@")) { // 递归映射 return text(result.substring(1)); } else { if (result.startsWith("\\@")) { return result.substring(1); } else { return result; } } } else { if (TimiJava.isNotEmpty(key)) { // 推测 String guessKey = key; LinkedHashMap keySRL = Text.similarityRatioList(map.keySet(), key); if (keySRL.keySet().iterator().hasNext()) { String k = keySRL.keySet().iterator().next(); Number ratio = keySRL.get(k); if (.7 < ratio.doubleValue()) { guessKey = k; } } System.err.printf("not found language mapping for key: [%s], it is [%s]?%n", key, guessKey); if (isDebugging) { throw new RuntimeException("not found language mapping key: " + key); } } } // 找不到映射,直接返回键 return key; } /** * 获取文本 * * @param key 键 * @param def 默认值(没有找到映射值时) * @return 获取结果 */ @Override public String text(String key, String def) { String result = text(key); return key.equals(result) ? def : result; } /** * 插入参数获取文本 * * @param key 键 * @param argsMap 参数 * @return 结果 */ @Override public String textArgs(String key, Map argsMap) { return INTERPOLATOR.inject(text(key), argsMap); } }