現(xiàn)在都是前后端分離開發(fā)营勤,那么我們?nèi)绾翁幚斫涌诘膰H化呢?直接入主題
- 在resources目錄下建一個(gè)i18n目錄
- 在這個(gè)目錄里創(chuàng)建一個(gè)Resource Bundle, BaseName叫messages, 選擇需要國際化的語言锋华,我選擇了zh_CN, en_US
- 在對應(yīng)的messages_zh_CN.properties中翻譯好內(nèi)容(key value的形式)
- 在application.yml中配置一下,Spring Boot會根據(jù)該配置來生成ReloadableResourceBundleMessageSource的對象messageSource
spring:
basename: i18n/messages
encoding: UTF-8
配置就差不多了箭窜,這兒我說一下國際化處理的原理毯焕,就是接口中通知服務(wù)器客戶端需要什么語言的內(nèi)容,服務(wù)器就根據(jù)客戶端的需求來讀取對應(yīng)的properties中的內(nèi)容磺樱。 通知服務(wù)器有兩種方式纳猫,第一種就是參數(shù)的方式通知,第二中就是http header中的參數(shù)來通知坊罢。 Spring Boot為我們提供了這兩種的處理方式续担。
我們先說第一種,通過參數(shù)的方式,比如http://xxxx/api/login?lang=zh_CN
配置一下MVC
@Configuration
public class WebMVCConfiguration implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver acceptHeaderLocaleResolver = new SessionLocaleResolver();
acceptHeaderLocaleResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return acceptHeaderLocaleResolver;
}
private LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
給每一個(gè)請求加一個(gè)中間件活孩,用來檢查lang參數(shù)物遇,并更具該參數(shù)的值來設(shè)置Locale
第二種就是根據(jù)Http Header中的accept-language來設(shè)置Locale
就是配置一個(gè)locale解析器
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver acceptHeaderLocaleResolver = new AcceptHeaderLocaleResolver();
acceptHeaderLocaleResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return acceptHeaderLocaleResolver;
}
這種方式有一個(gè)問題,Accept-Language的值一定要加用zh-CN或en-US憾儒,否則設(shè)置會失敗的哦询兴。我開始傳的就是zh_CN與en_US, 結(jié)果死活不行起趾, 后來跟蹤代碼慢慢發(fā)現(xiàn)這個(gè)問題的解決方法诗舰。
接下來我看如何獲取properties中的值,定義一個(gè)I18nService的類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
import java.util.Locale;
@Service
public class I18nService {
@Autowired
private MessageSource messageSource;
public I18nService(MessageSource messageSource) {
this.messageSource = messageSource;
}
public String getMessage(String msgKey, Object[] args) {
return messageSource.getMessage(msgKey, args, LocaleContextHolder.getLocale());
}
public String getMessage(String msgKey) {
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(msgKey, null, locale);
}
}
在Controller或Service使用這個(gè)類
@Autowired
private I18nService i18nService;
String str = i18nService.getMessage("message.key.test");
好了训裆,國際化就完成了眶根,不懂的留言套路哦。