专栏首页程序那些事Spring Boot国际化支持

Spring Boot国际化支持

Spring Boot国际化支持

国际化支持应该是所有的做国际化网站都需要考虑的一个问题,Spring Boot为国际化提供了强有力的支持,本文将会通过一个例子来讲解Spring Boot的国际化。

添加Maven支持

Spring Boot本身就支持国际化,我们这里添加一个模板支持来通过页面来展示,我们这里添加thymeleaf模板:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

LocaleResolver

我们需要为系统指定一个默认的LocaleResolver:

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver slr = new SessionLocaleResolver();
    slr.setDefaultLocale(Locale.US);
    return slr;
}

上面的例子中我们自定义了一个SessionLocaleResolver,并且指定了默认的Locale。

LocaleChangeInterceptor

接下来,我们定义一个LocaleChangeInterceptor来接收Locale的变动。这里我们通过lang参数来接收。

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

当然,我们需要将这个Interceptor注册到SpringMVC中:

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

定义Message Sources

默认情况下,Spring Boot会在src/main/resources查找message文件,默认的message文件是messages.properties,如果指定了某种语言,那么就是messages_XX.properties,其中XX是Local code。

messages.properties是key value的格式,如果在对应的local文件中没找到相应的key,则会在默认的messages.properties中查找。

我们默认定义英语的messages.properties如下:

greeting=Hello! Welcome to our website!
lang.change=Change the language
lang.eng=English
lang.fr=French

同时我们定义一个法语的message文件messages_fr.properties :

greeting=Bonjour! Bienvenue sur notre site!
lang.change=Changez la langue
lang.eng=Anglais
lang.fr=Francais

Controller文件

我们定义一个跳转的controller文件:

@Controller
public class PageController {

    @GetMapping("/international")
    public String getInternationalPage() {
        return "international";
    }
}

html文件

相应的html文件如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="ISO-8859-1" />
    <title>Home</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script>
        $(document).ready(function() {
            $("#locales").change(function () {
                var selectedOption = $('#locales').val();
                if (selectedOption != ''){
                    window.location.replace('international?lang=' + selectedOption);
                }
            });
        });
    </script>
</head>
<body>
<h1 th:text="#{greeting}"></h1>

<br /><br />
<span th:text="#{lang.change}"></span>:
<select id="locales">
    <option value=""></option>
    <option value="en" th:text="#{lang.eng}"></option>
    <option value="fr" th:text="#{lang.fr}"></option>
</select>
</body>
</html>

运行应用程序

好了,接下来我们可以运行了。

如果我们访问http://localhost:8080/international?lang=en , 则会读取默认的英语资源:

image

通过切换到法语环境:http://localhost:8080/international?lang=fr, 我们可以看到:

环境已经切换过来了。

本文的例子可以参考:https://github.com/ddean2009/learn-springboot2/tree/master/springboot-Internationalization

更多教程请参考 flydean的博客

本文分享自微信公众号 - 程序那些事(flydean-tech),作者:flydean

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分析OutOfMemoryError异常

    java.lang.OutOfMemoryError应该java应用程序中非常常见的一个的错误了。

    程序那些事
  • 响应式关系数据库处理R2DBC

    之前我们提到过,对于底层的数据源来说,MongoDB, Redis, 和 Cassandra 可以直接以reactive的方式支持Spring Data。而其他...

    程序那些事
  • 小师妹学JavaIO之:File copy和File filter

    一个linux命令的事情,小师妹非要让我教她怎么用java来实现,哎,摊上个这么杠精的小师妹,我也是深感无力,做一个师兄真的好难。

    程序那些事
  • js获取浏览器语言

    !function () { var lang = navigator.language||navigator.userLanguage;//常规浏览器语言和...

    用户5760343
  • so easy 前端实现多语言

    游魂
  • Alphabet首次公开云计算业务营收数据,2019财年收入达89.2亿美元

    皮查伊任Alphabet CEO后的首份财报出炉,和以往不同的是,此次财报还首次公布了YouTube和云计算业务的营收数据。

    镁客网
  • 《Kotlin 程序设计》第九章 Kotlin与Java混合调用

    虽然 Kotlin 的开发很方便,但当你与他人协作时,总会碰到 Java 与 Kotlin 代码共存的代码项目。本章就教你如何优雅的实现 Kotlin 与 Ja...

    一个会写诗的程序员
  • 独家 | 高季尧:定制化优化算法的应用与威力(附PPT)

    随着大数据与人工智能领域技术的发展和应用的普及,算法越发繁多复杂,需要处理的数据量也越发庞大,高性能计算能力就显得尤为重要。

    数据派THU
  • 实战开发细节:如何为单片机的按键加一个锁防止多次触发

    在这架钢琴上,我们可以看到遍布着很多按键,有琴键,也有功能选择的按键,面对如此多的按键,对于一个刚出来工作的小伙伴肯定压力比较大,琴键的特征和普通按键...

    morixinguan
  • 用Java实现JVM第三章《解析class文件》

    案例介绍 本案例主要介绍通过java代码从class文件中解析;class文件、常量池、属性表;

    小傅哥

扫码关注云+社区

领取腾讯云代金券