只要客户里面有老外,那都会涉及到多语言国际化的问题。我们看看在 Java Spring Boot 项目中如何设置多语言。
yaml配置
通过查看 org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
,我们可以知道需要配置如下属性:spring.messages.basename
。
1 2 3
| spring: messages: basename: i18n/message
|
需要在src\main\resources\i18n
目录下添加如下文件:
默认配置文件:message.properties
英文:message_en_US.properties
中文:message_zh_CN.properties
内容都是 key=value
的格式,一行一条。
语言处理类
通过此设置,当请求头里面的Accept-Lanuage
没有值时,以中文显示,否则按设置的值来处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package cn.com.wind.Wind.RTC.WebService.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import javax.servlet.http.HttpServletRequest; import java.util.Locale;
@Configuration public class CustomLocaleResolver extends AcceptHeaderLocaleResolver implements WebMvcConfigurer {
@Override public Locale resolveLocale(HttpServletRequest request) {
if (!StringUtils.hasText(request.getHeader("Accept-Language"))) { return Locale.SIMPLIFIED_CHINESE; }
return super.resolveLocale(request);
}
@Bean public LocaleResolver localeResolver() { return this; } }
|
语言工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package cn.com.wind.convertserver.utils;
import org.springframework.context.MessageSource; import org.springframework.context.NoSuchMessageException; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component;
import java.util.Locale;
@Component public class I18nMessageUtils {
private static MessageSource messageSource;
public MessageUtils(MessageSource messageSource) { MessageUtils.messageSource = messageSource; }
public static String getMessage(String messageKey, Locale locale) throws NoSuchMessageException { if (locale == null) { locale = LocaleContextHolder.getLocale(); } return messageSource.getMessage(messageKey, null, locale); } }
|
这样就可以通过这个工具类,做国际化的语言转换了。
我们还发现一个问题,通过tomcat容器去运行的应用程序,在request请求里面未能获取到Locale的信息,但把tomcat改为jetty后,是可以成功获取到的。
pom.xml设置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
|