79-java-springboot(5)-国际化
程序员文章站
2022-05-17 09:03:04
...
三.国际化
1、编写国际化配置文件,抽取页面需要显示的国际化消息
说明:
1.新建一个文件xxx.properties
2.新建一个文件xxx_en_US.properties
上面两步完成之后,springboot会扫描出我们是要做国际化,会自动生成国际化视图.
3.添加其他语言的properties文件
4.分别给所有的文件,对应的属性设值.
2、SpringBoot自动配置好了管理国际化资源文件的组件;
MessageSourceAutoConfiguration #springboot默认注入的组件
@Configuration
@ConditionalOnMissingBean(value = MessageSource.class, search = SearchStrategy.CURRENT)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Conditional(ResourceBundleCondition.class)
@EnableConfigurationProperties
public class MessageSourceAutoConfiguration {
private static final Resource[] NO_RESOURCES = {};
@Bean
@ConfigurationProperties(prefix = "spring.messages")
public MessageSourceProperties messageSourceProperties() {
return new MessageSourceProperties();
}
//读取配置文件的基本路劲
private Resource[] getResources(ClassLoader classLoader, String name) {
String target = name.replace('.', '/');
try {
return new PathMatchingResourcePatternResolver(classLoader)
.getResources("classpath*:" + target + ".properties");
}
catch (Exception ex) {
return NO_RESOURCES;
}
}
//默认读取的配置文件
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");
ConditionOutcome outcome = cache.get(basename);
if (outcome == null) {
outcome = getMatchOutcomeForBasename(context, basename);
cache.put(basename, outcome);
}
return outcome;
}
说明:
- 默认读取的配置文件是跟路劲下的 messages.properties
- 如果要指定读取自定义的配置文件
# 国际化配置文件(包名.基础名)
spring.messages.basename=i18n.login
3、去页面获取国际化的值;
th:text="# {login.btn}"
<button class="btn btn‐lg btn‐primary btn‐block" type="submit" th:text="# {login.btn}">Sign in</button>
效果:根据浏览器语言设置的信息切换了国际化;
原理: 国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象);
如果要实现点击按钮实现国际化语言切换,则需要自定义LocaleResolver.
/**
* 可以在连接上携带区域信息
*/
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String l = request.getParameter("l");
Locale locale = Locale.getDefault();
if(!StringUtils.isEmpty(l)){
String[] split = l.split("_");
locale = new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}