在resources文件下新建i18n文件夹, 创建文件
messages_zh_CN.properties
messages_en_US.properties
校验相关的配置
ValidationMessages_zh_CN.properties
ValidationMessages_en_US.properties
hello=你好
hello=hi
import.file.not_null=Import file cannot be empty
import.file.not_null=导入文件不能为空
spring:
messages:
basename: i18n/messages
encoding: UTF-8 # 编码格式
校验相关国际化
@Configuration
public class ValidatorConfig {
@Bean
@Primary // 关键:标记为首选 Bean
@ConditionalOnMissingBean(LocalValidatorFactoryBean.class) // 关键:如果已经有就不创建
public LocalValidatorFactoryBean getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
// 同时加载你的通用消息 + 校验专用消息(支持你所有 key)
messageSource.setBasenames(
"classpath:i18n/messages",
"classpath:i18n/ValidationMessages"
);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(3600);
messageSource.setUseCodeAsDefaultMessage(true); // 找不到 key 时不抛异常
bean.setValidationMessageSource(messageSource);
return bean;
}
}
从请求的header中获取语言的类型
@Configuration
public class DefaultLocaleResolver implements LocaleResolver {
@Autowired
private HttpServletRequest request;
public Locale getLocal() {
return resolveLocale(request);
}
/**
* 从HttpServletRequest中获取Locale
*
* @param httpServletRequest httpServletRequest
* @return 语言Local
*/
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
//获取请求中的语言参数
String language = httpServletRequest.getParameter("lang");
//如果没有就使用默认的(根据主机的语言环境生成一个 Locale
Locale locale = Locale.getDefault();
//如果请求的链接中携带了 国际化的参数
if (!StringUtils.isEmpty(language)){
//zh_CN
String[] s = language.split("-");
//国家,地区
locale = new Locale(s[0], s[1]);
}
return locale;
}
/**
* 用于实现Locale的切换。
*
* @param request HttpServletRequest
* @param httpServletResponse HttpServletResponse
* @param locale locale
*/
@Override
public void setLocale(@NonNull HttpServletRequest request, @Nullable HttpServletResponse httpServletResponse, @Nullable Locale locale) {
}
}
@Slf4j
@Component
public class I18nUtil {
@Value("${spring.messages.basename}")
private String basename;
private final DefaultLocaleResolver resolver;
private static DefaultLocaleResolver customLocaleResolver;
private static String path;
public I18nUtil(DefaultLocaleResolver resolver) {
this.resolver = resolver;
}
@PostConstruct
public void init() {
setBasename(basename);
setCustomLocaleResolver(resolver);
}
/**
* 获取 国际化后内容信息
*
* @param code 国际化key
* @return 国际化后内容信息
*/
public static String getMessage(String code) {
Locale locale = customLocaleResolver.getLocal();
return getMessage(code, null, code, locale);
}
/**
* 获取指定语言中的国际化信息,如果没有则走英文
*
* @param code 国际化 key
* @param lang 语言参数
* @return 国际化后内容信息
*/
public static String getMessage(String code, String lang) {
Locale locale;
if (StringUtils.isEmpty(lang)) {
locale = Locale.US;
} else {
try {
String[] split = lang.split("-");
locale = new Locale(split[0], split[1]);
} catch (Exception e) {
locale = Locale.US;
}
}
return getMessage(code, null, code, locale);
}
/**
* 获取站内信指定语言 目前只支持 中文与英文两类 默认英文
*
* @param code 国际化 key
* @param lang 语言参数
* @return 国际化后内容信息
*/
public static String getStationLetterMessage(String code, String lang) {
Locale locale = Objects.equals(lang, "zh-CN") ? Locale.SIMPLIFIED_CHINESE : Locale.US;
return getMessage(code, null, code, locale);
}
public static String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.toString());
messageSource.setBasename(path);
String content;
try {
content = messageSource.getMessage(code, args, locale);
} catch (Exception e) {
log.error("国际化参数获取失败===>{},{}", e.getMessage(), e);
content = defaultMessage;
}
return content;
}
public static void setBasename(String basename) {
I18nUtil.path = basename;
}
public static void setCustomLocaleResolver(DefaultLocaleResolver resolver) {
I18nUtil.customLocaleResolver = resolver;
}
}
将需要国际化的文字放到properties文件中,使用工具类调用.
I18nUtil.getMessage("operation.invitation")
校验先关的国际化