springboot+thymeleaf+i18n

本人小码农一名,这是第一次写博客,写的不好请大家见谅!

由于工作项目需要中英文切换,所以本人查看了大量其他博主写的关于spring国际化的文章,加上自己的理解与尝试,终于实现了中英文切换的功能。项目是用springboot+
mybatis+springmvc+maven+thymeleaf搭建的,具体实现代码如下:

1.创建不同语言的字典(个人理解)

首先要在/java/main/resources/目录下创建一个目录i18n,然后创建3个properties,具体命名如下:
目录文件结构如下
这里命名有要求,messages是前缀,是spring默认的前缀,如果要改成其他的需要指定。后面会讲到。先来说说这三个properties,messages.properties是默认语言,messages_en_US是英文,messages_zh_CN是中文,这三个properties里面主要是放需要中英文切换的内容。举个例子:

messages.properties:
index_info.addHospital = 添加医院
messages_en_US.properties:
index_info.addHospital = addHospital
messages_zn_CN.properties:
index_info.addHospital = 添加医院

三个properties中的key一般要一致,你可以在properties中加你需要翻译的内容。当然如果你需要更多的语言你可以创建更多的properties。

2.写配置文件

@Configuration
public class I18nConfig {

    private static Logger logger = LoggerFactory.getLogger(I18nConfig.class);

    @Bean(name="localeResolver")
    public LocaleResolver localeResolverBean() {
        logger.info("#####sessionLocaleResolver---create");
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        sessionLocaleResolver.setDefaultLocale(Locale.CHINA);
        logger.info("#####sessionLocaleResolver:"+sessionLocaleResolver);
        return sessionLocaleResolver;
    }

    @Bean(name="messageSource")
    public ResourceBundleMessageSource resourceBundleMessageSource(){
        ResourceBundleMessageSource source=new ResourceBundleMessageSource();
        source.setBasename("i18n/messages");
        source.setDefaultEncoding("UTF-8");
        source.setUseCodeAsDefaultMessage(true);
        return source;
    }

}

spring采用的默认区域解析器是AcceptHeaderLocaleResolver,根据request header中的accept-language值来解析locale,并且是不可变的。
LocaleResolver 是一个处理语言的接口,SessionLocaleResolver和CookieLocaleResolver继承了AcceptHeaderLocaleResolver抽象类并实现了LocaleResolver接口,这里我用的SessionLocaleResolver来处理解析locale。由命名可知SessionLocaleResolver是把locale放入session中。

这里的ResourceBundleMessageSource 就是设置语言字典的参数,其中的setBasename(”i18n/messages”),resolver就会从i18n这个目录下找messages前缀的properties去读取其中的内容。所以这个设置与上面properties的所在目录紧密相关。其它的参数大家可以百度。当然我们用的是springboot框架,springboot也提供了相应的参数配置spring.messages.basename=i18n/message。

3.配置拦截器

@Configuration
public class MyIntercepter extends WebMvcConfigurerAdapter {

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

这里配置了一个拦截器LocaleChangeInterceptor,拦截带有参数lang的url请求。
比如:http://localhost:8080/index?lang=en_US 它会拦截下来然后用resolver去解析。

4.前端页面显示

**index.html**
<ul class="notification-menu">
        <li>
            <a href="javascript:void(0)" class="btn btn-default    dropdown-toggle" data-toggle="dropdown" 
                onclick="swithChinese()">
                <i class="fa fa-exchange"></i>
                <span style="margin-left: 5px;" class="language-state">中文</span>
            </a>
        </li>
        <li>
            <a href="javascript:void(0)" class="btn btn-default dropdown-toggle" data-toggle="dropdown"
               onclick="swithEnglish()">
                <i class="fa fa-exchange"></i>
                <span style="margin-left: 5px;" class="language-state">英文</span>
            </a>
        </li>
    </ul>
    <div class="btn-group pull-right">
                            <button id="" class="btn btn-success"
                                onclick="addHospital()"><span th:text="#{index_info.addHospital}"></span>
                                <i class="fa fa-plus"></i>
                            </button>
                        </div>

**js代码**
<script type="text/javascript">
function swithChinese(){
    window.location.href = '?lang=zh_CN';
}
function swithEnglish() {
    window.location.href = '?lang=en_US';
}
</script>

**controller**
@GetMapping("/index")
public String index() {
    return "index";
}

前端用th:text=”#{index_info.addHospital}”就可以将properties中对应的内容显示出来啦。点击相应的按钮就会切换中英文了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值