I18n.java 1.76 KB
package com.bsth.util;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Locale;

/**
 * @Author hill
 */
@Component
public class I18n implements InitializingBean {

    private ThreadLocal<Locale> locales = new ThreadLocal<>();

    @Autowired
    private MessageSource messageSource;

    private static I18n i18n;

    public static I18n getInstance() {
        if (i18n == null) {
            throw new RuntimeException("I18n not initialized");
        }

        return i18n;
    }

    public void setLocale(Locale locale) {
        locales.set(locale);
    }

    public String getMessage(String expression, String ... args) {
        String message = messageSource.getMessage(expression, null, locales.get() == null ? Locale.SIMPLIFIED_CHINESE : locales.get());

        return StringUtils.isEmpty(message) ? "" : format(message, args);
    }

    private String format(String format, String args[]) {
        String result = format;
        int start = format.indexOf("######{"), end = -1;
        String idx = "";
        while (start > -1) {
            end = result.indexOf("}", start);
            if (end == -1) {
                throw new RuntimeException(String.format("[%s] 格式异常", format));
            }
            idx = result.substring(start + 7, end);
            result = result.replace(result.substring(start, end + 1), args[Integer.parseInt(idx)]);
            start = result.indexOf("######{");
        }

        return result;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        i18n = this;
    }
}