• springboot + freemarker 实现国际化


    前言  

    写过一篇springboot+freemarker国际化过程中的细节问题,但没有写过具体的国际化实现过程。正好有人在问,我就把我实现的过程贴出来,即使自己知识的一个备份,如果对别人有点用,那是再好不过了。

    1.springboot项目创建

    springboot步入2.0后,已经逐步成为了java web快速开发的首选框架,项目的创建过程也是非常简单,教程非常多,我就不赘述了。下图时我创建的一个demo项目。

    pom文件:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     4     <modelVersion>4.0.0</modelVersion>
     5     <groupId>com.zhangs</groupId>
     6     <artifactId>i18n-demo</artifactId>
     7     <version>0.0.1-SNAPSHOT</version>
     8     <packaging>jar</packaging>
     9 
    10     <name>i18n-demo</name>
    11     <description>Demo project for Spring Boot</description>
    12 
    13     <parent>
    14         <groupId>org.springframework.boot</groupId>
    15         <artifactId>spring-boot-starter-parent</artifactId>
    16         <version>2.0.6.RELEASE</version>
    17         <relativePath/> <!-- lookup parent from repository -->
    18     </parent>
    19 
    20     <properties>
    21         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    22         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    23         <java.version>1.8</java.version>
    24     </properties>
    25 
    26     <dependencies>
    27         <dependency>
    28             <groupId>org.springframework.boot</groupId>
    29             <artifactId>spring-boot-starter-freemarker</artifactId>
    30         </dependency>
    31         <dependency>
    32             <groupId>org.springframework.boot</groupId>
    33             <artifactId>spring-boot-starter-web</artifactId>
    34         </dependency>
    35 
    36         <dependency>
    37             <groupId>org.springframework.boot</groupId>
    38             <artifactId>spring-boot-starter-test</artifactId>
    39             <scope>test</scope>
    40         </dependency>
    41     </dependencies>
    42 
    43     <build>
    44         <plugins>
    45             <plugin>
    46                 <groupId>org.springframework.boot</groupId>
    47                 <artifactId>spring-boot-maven-plugin</artifactId>
    48             </plugin>
    49         </plugins>
    50     </build>
    51 </project>
    View Code

    2. 各种配置

    2.1 首先是application.properties的配置

      spring.messages.basename  指定了国际化文件的路径+文件前缀(不同语言,后缀是不一样的),如果不指定,默认是classpath下的messages_*.properties

    2.2 增加一个全局配置类MainConfig,继承WebMvcConfigurationSupport

    addInterceptors方法中增加了一个国际化拦截器,会拦截前端_lang参数,因为localeResolver方法中实例化了CookieLocaleResolver对象,所以_lang参数会存在cookie中,所有的页面都可以从cookie中取到_lang参数。
    你也可以使用SessionLocaleResolver将参数存到session。
     1 @Configuration
     2 @ComponentScan
     3 @EnableAutoConfiguration
     4 public class MainConfig extends WebMvcConfigurationSupport {
     5     @Bean
     6     public LocaleResolver localeResolver() {
     7         CookieLocaleResolver slr = new CookieLocaleResolver();
     8         // 默认语言
     9         slr.setDefaultLocale(Locale.US);
    10         return slr;
    11     }
    12 
    13     @Bean
    14     public LocaleChangeInterceptor localeChangeInterceptor() {
    15         LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
    16         // 参数名
    17         lci.setParamName("_lang");
    18         return lci;
    19     }
    20 
    21     @Override
    22     public void addInterceptors(InterceptorRegistry registry) {
    23         registry.addInterceptor(localeChangeInterceptor());
    24     }
    25 
    26     @Override
    27     public void addResourceHandlers(ResourceHandlerRegistry registry) {
    28         registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    29     }
    30 }

    3. 创建国际化资源文件

    资源文件/i18n/message_*.properties。*号的实际值(zh_CN,en_US等)就是上一步中_lang参数的值,决定了使用哪个资源文件

    英文资源message_en_US.properties

    中文资源message_zh_CN.properties

    4. 测试ftl页面index.ftl

    index.ftl

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <#import "spring.ftl" as spring>
     5     <#assign arg = ["AAA","张三"]>
     6     <title><@spring.messageArgs "title" ,arg /></title>
     7     <meta charset="UTF-8">
     8 </head>
     9 <body>
    10 <br/>
    11 <a class="changeLang" href="javascript:void(0);">english</a><br/>
    12 <a class="changeLang" href="javascript:void(0);">中文</a><br/>
    13 <@spring.message code="user.loginname"/><br/>
    14 </body>
    15 <script src="${request.contextPath}/static/jquery.js"></script>
    16 <script>
    17     $(".changeLang").on("click", function () {
    18         switch ($(this).text()) {
    19             case "中文": {
    20                 window.location.href = "index?_lang=zh_CN";
    21                 break;
    22             }
    23             case "english": {
    24                 window.location.href = "index?_lang=en_US";
    25                 break;
    26             }
    27         }
    28     })
    29 </script>
    30 </html>
    View Code

    5. 测试结果

    ps:因为"AAA,张三"这几个字符是在ftl中写死了,所以不会变

    英文:

    中文:

    项目地址: https://github.com/czs208112/i18n-demo

  • 相关阅读:
    《代码大全2》阅读笔记02
    《代码大全2》阅读笔记01
    第二阶段冲刺第六天
    学习进度5
    构建之法阅读笔记03
    地铁进度记录
    学习进度4
    个人数组
    学习进度3
    构建之法阅读笔记02
  • 原文地址:https://www.cnblogs.com/tibit/p/9869389.html
Copyright © 2020-2023  润新知