1.什么是国际化?
国际化(Internationalization),通常缩写为"i18n",是指在设计和开发软件应用时,考虑并允许其适应不同的语言、地区和文化的过程。这旨在使应用程序能够轻松地适应各种语言和地区的用户,以提供更好的用户体验。
实现国际化通常涉及以下方面:
-
文本外部化: 将应用中的文本、消息、标签等内容抽离到外部资源文件中,以便在运行时加载不同语言的资源。
-
格式化和本地化: 对日期、时间、货币等格式进行本地化处理,以符合用户所在地区的文化习惯。
-
字符编码和字体: 确保应用能够正确地处理不同字符编码,并选择适合不同语言的字体。
-
图形和图标: 保证图形和图标在不同语言环境下能够正确呈现,并避免依赖语言特定的图形。
本次以文本外部化为例。
2.默认的LocaleResolver
效果图
进入到页面后,不需要任何点击,默认根据浏览器的语言进行显示,哪个语言在上就显示哪种文本。
首选语言:中文简体
首选语言:英语美国
步骤一:创建文件
在resources目录下创建任意一个文件夹(这里创建的i18n),接下来创建XXX.properties,当创建到XXX_zh_CN.propertis时,会自动在i18n目录一下生成一个Resource Bundle 'XXX',最后再创建你需要的其他语言_国家的配置文件,进行编辑。
步骤二:写入内容
打开properties文件,使用Resource Bundle可以很方便的进行配置。
默认配置:语言/国家不在你配置的范围内显示的内容。
如果打开properties文件发现没有Resource Bundle选项,可能是缺少插件。安装对应插件即可。
步骤三:在yaml文件中配置
spring:
# 国际化
messages:
basename: i18n.index
目录.XXX
步骤四:html中应用thymeleaf语法让其生效
语法:#{}
和properties中对应即可,IDEA会有对应的提示。
到此即可实现如效果图所示的结果。
3.自定义LocaleResolver
如果有自己的需求,例如通过点击页面上的超链接(如图,中文,English)来完成文本的转换,就需要自定义LocaleResolver了。
效果图
前四步和上面一样。
步骤五:实现LocaleResolver接口
实现LocaleResolver接口,重写对应的两个方法,根据请求所带的参数来确定语言和国家,前端传来的格式是l=语言_国家,因此使用”_“进行分割。
当然也可以按照自己的传参方式来,只要保证new Locale(语言,地区)即可。
package org.pq.boot_thymeleaf.component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
// 自定义地址解析器
public class MyLocaleResolver implements LocaleResolver {
//根据传入的请求参数来确定地区
@Override
public Locale resolveLocale(HttpServletRequest request) {
//和html中的超链接请求所带的参数对应
String l = request.getParameter("l");
//默认地区
Locale locale = Locale.getDefault();
System.out.println(locale);
//如果传入了参数就覆盖
if (!StringUtils.isEmpty(l)){
String[] s = l.split("_");
locale = new Locale(s[0],s[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
步骤六:自动装配
在配置类中注入自己的LocaleResolver实现类,让其生效。
package org.pq.boot_thymeleaf.config;
import org.pq.boot_thymeleaf.component.MyLocaleResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
//导入自己的地区解析器
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
至此成功实现。
目录结构如图: