实现效果
我们大部分都是把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**/@Overridepublic 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**/@Overridepublic void setLocale(HttpServletRequest request,HttpServletResponse response,Locale locale) {// 此方法不执行任何操作,忽略对语言设置的更改}/*** 创建LocaleResolver bean,用于处理语言设置。** @return {@link LocaleResolver }* @author liuyanqiang* @since 2023/06/15 09:44**/@Beanpublic 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国际化的翻译文件放在数据库另说,但是原理都是一样的