1.pom文件引入springboot即可
2.application.yml
spring:
messages:
# 设置message文件基础前缀,即resources/i18n/messages_语言.properties
basename: i18n/messages
encoding: UTF-8
3.在resources下新建文件
messages_en_US.properties:
a018615b35588a01=hello world
e3b1e79e548cc398=hello world, {0}
messages_zh_CN.properties:
a018615b35588a01=你好,世界
e3b1e79e548cc398=你好,世界, {0}
4.自定义语言解析器
/**
* Locale解析器,默认解析器为AcceptHeaderLocaleResolver,拦截Accept-Language请求头
* 这自定义拦截Language请求头
*/
public class LanguageLocaleResolver extends AbstractLocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String language = request.getHeader("Language");
if(language != null){
return StringUtils.parseLocale(language);
}else{
return Locale.getDefault();
}
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
5.配置
@Configuration
public class MessageSourceConfig {
@Bean(name = "messageSource")
public ResourceBundleMessageSource getMessageSource() throws Exception {
ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
resourceBundleMessageSource.setDefaultEncoding("UTF-8");
resourceBundleMessageSource.setBasenames("i18n/messages");
return resourceBundleMessageSource;
}
@Bean("localeResolver")
public LocaleResolver localeResolver(){
return new LanguageLocaleResolver();
}
}
6.国际化工具类
@Slf4j
@Component
public class I18NUtils {
public static final List<String> LOCALES = List.of("zh_CN", "en_US");
private static MessageSource messageSource;
// 这里使用md5生成key,可自行使用其他hash算法生成唯一的key
private static final MD5 md5 = MD5.create();
public I18NUtils(MessageSource messageSource) {
I18NUtils.messageSource = messageSource;
}
public static String getByCh(String message) {
String key = md5.digestHex16(message);
String i18n = null;
try {
i18n = messageSource.getMessage(key, null, LocaleContextHolder.getLocale());
} catch (Exception ex) {
log.warn("[I18NUtils]WithoutArg:{}|{}", key, ex.getMessage());
}
return i18n;
}
public static String getCustomLocaleByCh(String message, Locale locale) {
String key = md5.digestHex16(message);
String i18n = null;
try {
i18n = messageSource.getMessage(key, null, locale);
} catch (Exception ex) {
log.error("[I18NUtils]WithoutArgWithLocale:{}", ex.getMessage());
}
return i18n;
}
public static String getByCh(String message, Object... arg) {
String key = md5.digestHex16(message);
String i18n = null;
try {
i18n = messageSource.getMessage(key, arg, LocaleContextHolder.getLocale());
} catch (Exception ex) {
log.error("[I18NUtils]WithoutArg:{}", ex.getMessage());
}
return i18n;
}
}
7.测试
@CrossOrigin("*")
@RestController
@RequestMapping("/locale")
public class LocaleController {
@GetMapping("/test")
public String test(){
Locale locale = LocaleContextHolder.getLocale();
System.out.println(locale.getLanguage());
return I18NUtils.getByCh("你好,世界");
}
@GetMapping("/test2")
public String test2(){
Locale locale = LocaleContextHolder.getLocale();
System.out.println(locale.getLanguage());
return I18NUtils.getByCh("你好,世界, {0}", "你大爷");
}
}