1、原理【一下来源网络,目的帮助理解】
应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。
一句话:“所谓国际化其实就是字符串的查找和替换过程”。查找就是根据code去资源文件中获取value,替换就是把value中可能包含的占位符替换成实际值,所以国际化的关键在于资源文件的加载和消息的渲染。
参考【 https://blog.csdn.net/roberts939299/article/details/69666291 】----感谢老师!!!
代码结构
3.1、首先配置后台中,i18n基本获取的底层数据结构,分别如下:
/***
* i18n配置文件
* @author wangning
*
*/
@Configuration
@ComponentScan
public class I18nConfig extends AbstractLocaleContextResolver{
public static final String LOCALE_SESSION_ATTRIBUTE_NAME = SessionLocaleResolver.class.getName() + ".LOCALE";
public static final String TIME_ZONE_SESSION_ATTRIBUTE_NAME = SessionLocaleResolver.class.getName() + ".TIME_ZONE";
/** 国际化文件路径 */
@Value("${spring.messages.basename}")
public String[] basefilenames;
@Bean(name="localeResolver")
public LocaleResolver localeResolverBean() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.ENGLISH);
return sessionLocaleResolver;
}
/**
* 用于解析消息的策略接口,支持这些消息的参数化和国际化。
*/
@Bean(name="messageSource")
public ResourceBundleMessageSource resourceBundleMessageSource(){
ResourceBundleMessageSource source=new ResourceBundleMessageSource();
if (basefilenames != null) {
for (int i = 0; i < basefilenames.length; i++) {
String basename = basefilenames[i];
Assert.hasText(basename, "Basename must not be empty");
this.basefilenames[i] = basename.trim();
}
source.setBasenames(basefilenames);
} else {
this.basefilenames = new String[0];
source.setBasename(basefilenames[0]);
}
source.setDefaultEncoding("UTF-8");
source.setUseCodeAsDefaultMessage(true);
return source;
}
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
this.setLocaleContext(request, response, locale != null?new SimpleLocaleContext(locale):null);
}
@Override
public LocaleContext resolveLocaleContext(HttpServletRequest request) {
return null;
}
@Override
public void setLocaleContext(HttpServletRequest request,HttpServletResponse response, LocaleContext localeContext) {
Locale locale = null;
TimeZone timeZone = null;
if(localeContext != null) {
locale = localeContext.getLocale();
if(localeContext instanceof TimeZoneAwareLocaleContext) {
timeZone = ((TimeZoneAwareLocaleContext)localeContext).getTimeZone();
}
}
WebUtils.setSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME, locale);
WebUtils.setSessionAttribute(request, TIME_ZONE_SESSION_ATTRIBUTE_NAME, timeZone);
}
}
@Configuration
public class MyIntercepter extends WebMvcConfigurerAdapter {
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("language");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
3.2、其次,设置springboot中的properties的配置文件,如下:
spring.messages.basename=i18n/award/messages,i18n/system/messages
3.3、在项目的rescources中国,创建i18n的文件夹,用来放置项目中,业务中出现的多个i18n国际化文件(便于维护),如下:
【图片经过部分隐藏,望理解!!!】
3.4、以上创建好后,在应使用i18n的页面中,进行如下配置:
以上完成后,重启项目,便可访问;
【注意----自己遇见的坑,不知道其他人是否也有】:
项目中,更新i18n的properties文件时,都要重启一次项目,否则页面不加载i18n的value值。
--------------------------------------------------------------------------------------------------------------
以上是自己整理的,并测试过,可以直接用
----------------------------------------------------------------------------------------------------------------
文章中,有问题,可以在评论区评论,一起探讨编程中奥秘!
----------------------------------------------------------------------------------------------------------------
来都来了,代码看都看了,那就留个言呗,可以互动下!
----------------------------------------------------------------------------------------------------------------
转载声明:本文为博主原创文章,未经博主允许不得转载。