前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于SpringBoot的国际化网站处理

基于SpringBoot的国际化网站处理

作者头像
石的三次方
发布2021-01-05 22:23:41
6200
发布2021-01-05 22:23:41
举报
文章被收录于专栏:石的三次方

为了在不同得语言环境下使用不同的语言提示,所以一般会在网站引入网站国际化处理。下面讲解一下springboot对这国际化的支持

1.springboot进行国际化处理的类

代码语言:javascript
复制
public class MessageSourceAutoConfiguration {
    @Bean
    public MessageSource messageSource(MessageSourceProperties properties) {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        if (StringUtils.hasText(properties.getBasename())) {
            messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
        }

        if (properties.getEncoding() != null) {
            messageSource.setDefaultEncoding(properties.getEncoding().name());
        }

上面的代码是springboot获取用户国际化配置的代码,springboot会读取默认配置文件,查看是否含有国际化路径配置,如果没有则使用默认的路径。默认路径为根路径下的message。

代码语言:javascript
复制
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
            String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");
            ConditionOutcome outcome = (ConditionOutcome)cache.get(basename);
            if (outcome == null) {
                outcome = this.getMatchOutcomeForBasename(context, basename);
                cache.put(basename, outcome);
            }

            return outcome;
        }

springboot对国际化的配置文件存在默认的读取路径,则说明我们可以直接在根路径下创建国际化配置,这样springboot也可以读取。但是一般情况下不会这样做,为了更好的语义化,我们会提供不同界面不同的国际化配置路径。

2.根据浏览器的头信息改变界面语言环境

i18n===>代表的是internationalization,首字母+单词个数+尾字母。一般会将所有的国际化文件放置来这个文件夹中。下面演示登陆界面的国际化处理

在springboot的主配置文件里,配置spring.messages.basename=i18n.login(il8n是文件夹名字,login是国际化配置的文件名的前缀,对应的中文为:login_zh_CN.properties,英文为:login_en_US.properties

此时便可以在界面中引用对应的国际化配置了,当浏览器的语言环境切换的时候,界面的语言也会随之改变

5.2.2 主动改变界面语言环境

在通常的网页中,会提供一个国际化的切换标签,用来切换语言。

我们为切换语言的按钮提供一个区域参数,来决定要使用什么语言(使用了thymeleaf模板引擎),访问当前界面即可,此登陆界面使用了视图渲染,访问index.html在没有登陆信息的情况下相当于访问登陆界面

代码语言:javascript
复制
<a class="btn btn-sm" th:href="@{/index.html(lang='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(lang='en_US')}">English</a>

接下来,我们需要提供一个自定义的区域信息解析器,并将这个组件添加到容器中,让springboot来加载

代码语言:javascript
复制
public class MyLocaleResover implements LocaleResolver {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String l = httpServletRequest.getParameter("lang");
        logger.info(l);
        //获取操作系统默认的区域信息
        Locale locale = Locale.getDefault();
        if(!StringUtils.isEmpty(l)){
            String[] s = l.split("_");
            locale = new Locale(s[0],s[1]);
        }
        return locale;
    }

具体的实现逻辑:获取传入的区域信息,判断是否为空,如果不为空,将 传入的区域信息封装为Locale对象进行返回,如果为空使用系统默认的区域信息或者获取浏览器默认的请求头。

代码语言:javascript
复制
httpServletRequest.getHeader("Accept-Language");获取浏览器默认请求头
zh-CN,zh;q=0.9,en;q=0.8  === 这是结果,需要进行切割,然后传入

最后将这个区域解析器添加到容器中

代码语言:javascript
复制
@Bean("localeResolver")
    public LocaleResolver getLocaleResolver(){
        return new MyLocaleResover();
    }

注:需要指定这个bean 的id为localResolver,不然springboot无法解析这个组件

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 石的三次方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.springboot进行国际化处理的类
    • 2.根据浏览器的头信息改变界面语言环境
      • 5.2.2 主动改变界面语言环境
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档