实现效果
我们大部分都是把i18n的标识放在Headers上面;而把标识放在参数上的话比较少,放参数上的话一般是在使用a标签下载某些文件不好配置请求头的时候才使用上
配置在Headers上面:
配置在params上面:
配置代码:
/**
* i18n配置,用于处理语言本地化设置。
*
* @author liuyanqiang
* @version 1.0.0
* @since 2023/06/15 09:41
**/
@Configuration
public class I18nConfig implements LocaleResolver {
/**
* 根据请求中的Accept-Language头部解析出语言设置。
* 如果没有指定语言或语言设置不完整,则默认为中文设置。
*
* @param request HTTP请求对象
* @return {@link Locale } 解析后的语言设置Locale对象
* @author liuyanqiang
* @since 2023/06/15 09:42
**/
@Override
public Locale resolveLocale(HttpServletRequest request) {
// 默认语言设置为中文
Locale locale = Locale.CHINA;
// 从请求的头部获取Accept-Language标头,该标头指定了客户端期望的语言
String language = request.getHeader("Accept-Language");
String lang = request.getParameter("lang");
if (StringUtils.isNotBlank(lang)) {
language = lang;
}
// 检查请求的语言是否非空
if (StringUtils.isNotBlank(language)) {
// 将语言字符串拆分为语言和国家/地区代码
String[] splitLanguage = language.split("_");
// 检查是否有语言和国家/地区代码
if (splitLanguage.length > 1) {
// 根据语言和国家/地区代码创建新的Locale对象
locale = new Locale(splitLanguage[0], splitLanguage[1]);
}
}
// 返回解析得到的Locale对象作为解析后的语言设置
return locale;
}
/**
* 设置语言设置时的回调方法。
* 在此实现中,不执行任何操作,忽略对语言设置的更改。
* @param request HTTP请求对象
* @param response HTTP响应对象
* @param locale 语言设置的Locale对象
* @author liuyanqiang
* @since 2023/06/15 09:43
**/
@Override
public void setLocale(
HttpServletRequest request,
HttpServletResponse response,
Locale locale) {
// 此方法不执行任何操作,忽略对语言设置的更改
}
/**
* 创建LocaleResolver bean,用于处理语言设置。
*
* @return {@link LocaleResolver }
* @author liuyanqiang
* @since 2023/06/15 09:44
**/
@Bean
public LocaleResolver localeResolver() {
// 返回当前类作为LocaleResolver的实例
return new I18nConfig();
}
}
三套语言环境(分别为默认、老挝语、中文):
使用方式:
可能需要提前封装一个MessageUtils.message()方法
public class MessageUtils {
/**
* 根据消息键和参数 获取消息 委托给spring messageSource
*
* @param code 消息键
* @param args 参数
* @return 获取国际化翻译值
*/
public static String message(String code, Object... args) {
MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
}
/**
* 获取i18n状态
*
* @return {@link String }
* @author liuyanqiang
* @since 2023/06/28 11:53
**/
public static String i18nState() {
return LocaleContextHolder.getLocale().toString();
}
}
当然,要是把i18n国际化的翻译文件放在数据库另说,但是原理都是一样的