SpringBoot 訊息國際化配置
阿新 • • 發佈:2020-07-27
一、目的
針對不同地區,設定不同的語言資訊。
SpringBoot國際化配置檔案預設放在classpath:message.properties,如果自定義訊息配置檔案,需要application.properties或application.yml中設定spring.messages.basename的值。
二、步驟
在src/main/resources 下建i18n資料夾
在i18n資料夾中建立messages.properties 找不到語言配置時,使用此檔案
hello=你好_預設
在i18n資料夾中建立messages_en_US.properties 英文語言配置
hello=hello_English
在i18n資料夾中建立messages_zh_CN.properties 中文語言配置
hello=你好_中文
MessageConfig.java
對訊息的配置
package com.spring.security.config.spring; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.util.Assert; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.i18n.AbstractLocaleContextResolver; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; @Configuration public class MessageConfig extends AbstractLocaleContextResolver{ @Value("${spring.messages.basename}") public String[] basenames; @Bean(name = "messageSource") public ResourceBundleMessageSource resourceBundleMessageSource() { ResourceBundleMessageSource source = new ResourceBundleMessageSource(); if (basenames != null) { for (int i = 0; i < basenames.length; i++) { String basename = basenames[i]; Assert.hasText(basename, "Basename must not be empty"); this.basenames[i] = basename.trim(); } source.setBasenames(basenames); } else { this.basenames = new String[0]; source.setBasename(basenames[0]); } source.setDefaultEncoding("UTF-8"); source.setUseCodeAsDefaultMessage(true); return source; } @Bean public LocaleResolver localeResolver() { SessionLocaleResolver slr = new SessionLocaleResolver(); slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE); return slr; } /** * 國際化,設定url識別引數 * * @return */ @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); lci.setParamName("lang"); return lci; } @Override public LocaleContext resolveLocaleContext(HttpServletRequest request) { return null; } @Override public void setLocaleContext(HttpServletRequest request, HttpServletResponse response, LocaleContext localeContext) { } }
SpringUtils.java
Spring工具類,用於獲取ApplicationContext
package com.spring.security.common.utils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; /** * Spring容器 */ @Service public class SpringUtils implements ApplicationContextAware { private static ApplicationContext context = null; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (context == null) { context = applicationContext; } } /** * 獲取容器 * * @return 容器 */ public static ApplicationContext getContext() { return context; } }
MessageUtils.java
封裝獲取message的工具類
package com.spring.security.common.utils;
import java.util.Locale;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
public class MessageUtils {
public static String getMessage(String code) {
Locale locale = LocaleContextHolder.getLocale();
ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
String message = reloadableResourceBundleMessageSource.getMessage(code, null, locale);
return message;
}
}
** WebMvcConfig.java**
mvc配置,解決跨域,介面中文亂碼,新增語言攔截器
package com.spring.security.config.spring;
import java.nio.charset.Charset;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Autowired
private LocaleChangeInterceptor localeChangeInterceptor;
/**
* 解決跨域
*/
@Override
protected void addCorsMappings(CorsRegistry registry) {
registry
.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*")
.allowCredentials(true);
}
/**
* 配置訊息轉換器
* 解決返回String亂碼
*/
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(responseBodyConverter());
}
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(localeChangeInterceptor);
}
}
三、測試
測試介面:
package com.spring.security.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.spring.security.common.utils.I18nUtils;
@RestController
public class TestController {
@GetMapping("/test")
public String doTest() {
return I18nUtils.getMessage("hello");
}
}