在当今全球化的环境下,为了更好地满足用户的多语言需求,越来越多的应用程序需要支持国际化多语言配置。Spring Boot作为一种快速开发框架,提供了方便的国际化支持,使得应用程序可以轻松地适应不同的语言环境。通过集成Spring Boot的国际化多语言配置,应用程序可以根据用户的语言环境自动选择相应的语言资源,从而实现更好的用户体验。这种配置方式不仅可以适应不同语言环境,还可以为应用程序提供更好的扩展性和可维护性,是现代应用程序开发的必备技能之一。
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class LocaleMessageUtil {
@Resource
private MessageSource messageSource;
public LocaleMessageUtil() {
}
public String getMessage(String code) {
return this.getConnectorMessage(code, null, null);
}
public String getMessage(String code, String param) {
return this.getConnectorMessage(code, param, null);
}
public String getMessage(String[] codes) {
return this.getConnectorMessage(null, null, codes);
}
private String getConnectorMessage(String code, String param, String[] codes) {
StringBuilder stringBuilder = new StringBuilder();
if (StringUtils.isNotEmpty(param)) {
stringBuilder.append(param).append(":");
} else if (StringUtils.isNotEmpty(code)) {
stringBuilder.append(this.messageSource.getMessage(code, null, LocaleContextHolder.getLocale()));
}
if (null != codes) {
for (String arr : codes) {
stringBuilder.append(this.messageSource.getMessage(arr, null, LocaleContextHolder.getLocale())).append(";");
}
}
return stringBuilder.toString();
}
}
根据请求头中携带的请求语言内容,生成会话,解析内容。
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Locale;
/**
* 国际化解析
*/
public class MessageLocaleResolver implements LocaleResolver {
private static final String LANG = "lang";
private static final String LANG_SESSION = "lang_session";
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale locale;
String language = request.getHeader(LANG);
//中文language=zh_CN
if (StringUtils.isNotEmpty(language)) {
locale = new Locale(language.toLowerCase());
} else {
locale = new Locale("zh_cn");
}
HttpSession session = request.getSession();
session.setAttribute(LANG_SESSION, locale);
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
import com.zfsw.mall.common.utils.lang.MessageLocaleResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
return new MessageLocaleResolver();
}
}
spring:
messages:
basename: i18n.messages
encoding: utf-8
使用idea右键在i18n目录下,新建四个配置文件,分别为
如图:
当然了,如果以后需要其他语言,也可以继续添加,比如韩语、日语、法语等。
配置文件的内容可以理解为一个key-value数据类型,key是自己系统内定语言编码,在解析器工具类中使用,value是翻译后的内容。如果想翻译几个就在几个配置文件里加。例如:
weather.is.nice=今天天气不错
weather.is.nice=The weather is nice today
weather.is.nice=今天天气不错
weather.is.nice=今天天氣不錯
写一个控制器,验证一下
import com.zfsw.mall.common.utils.lang.LocaleMessageUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/api/user")
@ApiOperation(value = "多语言测试")
public class TestLangController {
@Resource
private LocaleMessageUtil messageUtil;
@GetMapping("/lang/test")
@ApiOperation(value = "多语言测试")
public ResponseEntity<String> langTest() {
//语言编码
String langCode = "weather.is.nice";
//翻译内容
String message = messageUtil.getMessage(langCode);
return ResponseEntity.ok().body(message);
}
}
启动项目,试一下
前端增加切换语言按钮,中英文切换后,请求头发生变动即可!
config.headers["lang"] = store.getters.local || "zh-hant";