package com.yanzuoguang.util.helper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 设置提示语言 * * @author 颜佐光 */ public class YzgLanguage { /** * 默认实例 */ private static final YzgLanguage INSTANCE = new YzgLanguage(); /** * 默认实例 * * @return 语言对象 */ public static YzgLanguage get() { return INSTANCE; } /** * 私有构造函数 */ private YzgLanguage() { } /** * 默认场景 */ public static final String SCENE_GLOBAL = "GLOBAL"; /** * 英语 */ public static final String LANGUAGE_EN = "en"; /** * 中文 */ public static final String LANGUAGE_CH = "ch"; /** * 整个系统默认语言 */ private String defaultLanguage = LANGUAGE_EN; /** * 当前线程默认语言 */ private final ThreadLocal<String> threadLanguage = new ThreadLocal<>(); /** * 当前线程默认场景 */ private final ThreadLocal<String> threadScene = new ThreadLocal<>(); /** * 场景语言 */ private final Map<String, Map<String, Map<String, String>>> mapScene = new HashMap<>(); /** * 设置默认语言,默认为英语(en) * * @param defaultLanguage */ public YzgLanguage setDefaultLanguage(String defaultLanguage) { this.defaultLanguage = defaultLanguage; return this; } /** * 获取默认语言 * * @return */ public String getDefaultLanguage() { return defaultLanguage; } /** * 设置当前线程语言 * * @param language * @return */ public YzgLanguage setThreadLanguage(String language) { this.threadLanguage.set(language); return this; } /** * 移除当前线程语言 * * @return */ public YzgLanguage removeThreadLanguage() { this.threadLanguage.remove(); return this; } /** * 获取默认语言 * * @return */ public String getLanguage() { return StringHelper.getFirst(this.threadLanguage.get(), defaultLanguage); } /** * 设置当前线程语言 * * @param scene * @return */ public YzgLanguage setThreadScene(String scene) { this.threadScene.set(scene); return this; } /** * 移除当前线程语言 * * @return */ public YzgLanguage removeThreadScene() { this.threadScene.remove(); return this; } /** * 获取默认场景 * * @return */ public String getScene() { return StringHelper.getFirst(this.threadScene.get(), SCENE_GLOBAL); } /** * 县城安全获取子map * * @param mapFrom * @param key * @param <T> * @return */ private <T extends Object> Map<String, T> getSafeValue(Map<String, Map<String, T>> mapFrom, String key) { Map<String, T> ret = mapFrom.get(key); if (ret == null) { synchronized (mapFrom) { ret = mapFrom.get(key); if (ret == null) { ret = new HashMap<>(); mapFrom.put(key, ret); } } } return ret; } /** * 获取默认语言对象 * * @param sceneName 场景 * @param defaultLanguageValue 语言 */ private Map<String, String> getDefaultFrom(String sceneName, String defaultLanguageValue) { // 获取场景 Map<String, Map<String, String>> scene = getSafeValue(mapScene, sceneName); // 默认语言key String defaultKey = StringHelper.md5(defaultLanguageValue); // 获取语言对应关系 Map<String, String> defaultFrom = getSafeValue(scene, defaultKey); return defaultFrom; } /** * 设置场景语言 * * @param sceneName 场景名称 * @param defaultLanguageValue 默认语言值 * @param language 语言 * @param languageValue 语言值 */ public YzgLanguage set(String sceneName, String defaultLanguageValue, String language, String languageValue) { // 获取语言对应关系 Map<String, String> defaultFrom = getDefaultFrom(sceneName, defaultLanguageValue); // 设置默认语言 defaultFrom.put(defaultLanguage, defaultLanguageValue); // 设置语言 defaultFrom.put(language, languageValue); return this; } /** * 设置场景语言 * * @param defaultLanguageValue 默认语言值 * @param language 语言 * @param languageValue 语言值 */ public YzgLanguage set(String defaultLanguageValue, String language, String languageValue) { return this.set(getScene(), defaultLanguageValue, language, languageValue); } /** * 获取语言关系 * * @param sceneName 场景名称 * @param defaultLanguageValue 默认语言值 * @param language 语言 * @return */ public String get(String sceneName, String defaultLanguageValue, String language) { // 获取语言对应关系 Map<String, String> defaultFrom = getDefaultFrom(sceneName, defaultLanguageValue); // 获取对应语言 String ret = defaultFrom.get(language); if (!StringHelper.isEmpty(ret)) { return ret; } // 获取语言对应关系 Map<String, String> globalFrom = getDefaultFrom(SCENE_GLOBAL, defaultLanguageValue); // 获取对应语言 ret = globalFrom.get(language); if (!StringHelper.isEmpty(ret)) { return ret; } // 返回默认值 return defaultLanguageValue; } /** * 获取语言关系 * * @param defaultLanguageValue 默认语言值 * @param language 语言 * @return */ public String get(String defaultLanguageValue, String language) { return this.get(getScene(), defaultLanguageValue, language); } /** * 设置英文_中文对应 * * @param enValue * @param chValue */ public YzgLanguage setEnglishChinese(String enValue, String chValue) { return this.set(enValue, LANGUAGE_CH, chValue); } /** * 设置英文_中文对应 * * @param scene 场景 * @param enValue * @param chValue */ public YzgLanguage setEnglishChinese(String scene, String enValue, String chValue) { return this.set(scene, enValue, LANGUAGE_CH, chValue); } /** * 获取英文_中文对应 * * @param enValue */ public String getEnglishChinese(String enValue) { return this.get(enValue, LANGUAGE_CH); } /** * 获取英文_中文对应 * * @param scene 场景 * @param enValue */ public String getEnglishChinese(String scene, String enValue) { return this.get(scene, enValue, LANGUAGE_CH); } /** * 获取语言对应提示 * * @param sceneName 场景 * @param format 格式化 * @param paras 参数 * @return */ public String formatScene(String sceneName, String format, Object... paras) { String lan = getLanguage(); format = get(sceneName, format, lan); List<Object> list = new ArrayList<>(); if (paras != null) { for (int i = 0; i < paras.length; i++) { Object fromValue = paras[i]; if (fromValue instanceof String && fromValue != null) { String from = get(sceneName, String.valueOf(fromValue), lan); list.add(from); } else { list.add(fromValue); } } } return String.format(format, list.toArray()); } /** * 获取语言对应提示 * * @param format 格式化 * @param paras 参数 * @return 格式化字符串 */ public String format(String format, Object... paras) { return this.formatScene(getScene(), format, paras); } }