YzgLanguage.java 8.15 KB
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);
    }
}