后端实现国际化

505 阅读1分钟

Springboot支持后端实现国际化

1.修改yml配置文件

#数据源配置
spring:
  messages:
    basename: i18n/messages #配置国际化资源文件路径

2.创建国际化资源文件

image.png

messages.properties不带后缀为默认语言资源

1000=token已过期,请重新登录
2000=登录失败,{0}
1001=请求参数异常 {0}

messages_en_US.properties英文版本

1000= The token has expired. Please log in again
2000= Login failure, {0}
1001= Request Parameter exception {0}

messages_en_US.properties中文版本

1000=token已过期,请重新登录
2000=登录失败,{0}
1001=请求参数异常 {0}

3.实现MessageUtils.java工具类

import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Component;

import java.util.Locale;

/**
 * 获取i18n资源文件
 */

@Component
public class MessageUtils {
    private static MyLocaleResolver myLocaleResolver;

    public MessageUtils(MyLocaleResolver resolver) {
        MessageUtils.myLocaleResolver = resolver;
    }

    /**
     * 根据消息键和参数 获取消息 委托给spring messageSource
     *
     * @param code 消息键
     * @param args 参数
     * @return 获取国际化翻译值
     */
    public static String message(String code, Object... args) throws NoSuchMessageException {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setBasenames("/i18n/messages");
        Locale locale = MessageUtils.myLocaleResolver.getLocale();
        return messageSource.getMessage(code, args, locale);
    }
}

4.新建MyLocaleResolver类用来重写默认国际化设置

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

@Configuration
public class MyLocaleResolver implements LocaleResolver {
    @Autowired
    private HttpServletRequest request;

    public Locale getLocale() {
        return resolveLocale(request);
    }

    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
       //通过请求头来切换中英文
        String language = httpServletRequest.getHeader("lang");
        Locale locale = Locale.getDefault();
        if (!StringUtils.isEmpty(language) && language.split('_').length == 2) {
            String[] s = language.split('_');
            locale = new Locale(s[0], s[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }
}

5. java代码中使用MessageUtils实现国际化操作

Response是自己封装的类

@GetMapping(value = "/test")
public Response test() {
    String s = "123";
    return Response.success(messageUtils.message("1000") +'\n'+ messageUtils.message("2000",s));
}

中文测试 image.png

英文 image.png