thymeleaf spring5的国际化配置

本文介绍了如何在Spring MVC中配置Thymeleaf实现国际化。重点强调了目录结构,国际化语言文件的位置必须放在java项目的resource目录下,而非webapp。通过web.xml、kin-servlet.xml配置,并自定义MyLocaleResolver解析页面上的语言切换参数,以及展示了login.properties等国际化文件的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了很多博客说的都是springBoot与thymeleaf的国际化实现,springBoot已经完成了大部分的mvc web配置,而这里只需要用到Spring MVC+thymeleaf的模版框架,完成一个非前后端分离的后台管理

  1. 目录结构
    在这里插入图片描述
    后台模版的静态文件、国际化语言、WEB-INF放在webapp模块录下,HTML文件放在WEB-INF/templates。
    更正!!!国际化语言只能放在java项目的resource!!!!,懒得改图了,测试了一下放在webapp不能识别到配置内容
  2. 配置文件
    web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/appconfiguration.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>kin</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>kin</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

kin-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.kin.dao"/>
    <context:component-scan base-package="com.kin.domain"/>
    <context:component-scan base-package="com.kin.web"/>
    <context:component-scan base-package="com.kin.service"/>


    <mvc:annotation-driven />
    <mvc:default-servlet-handler/>
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/img/**" location="/img/"/>
    <mvc:resources mapping="/lib/**" location="/lib/"/>
<!--这里没有使用jsp文件,所以不需要配置-->
<!--
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/"/>
        <property name="order" value="2"/>
        <property name="suffix" value=".jsp"/>
    </bean>
-->
<!--    模版解析器-->
    <bean id="servletContextTemplateResolverId" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!--        指定文件夹-->
        <property name="prefix" value="/WEB-INF/templates/"/>
<!--        指定文件后缀-->
        <property name="suffix" value=".html"/>
<!--        指定模版样式-->
        <property name="templateMode" value="HTML5"/>
<!--        关闭缓存-->
        <property name="cacheable" value="false"/>
        <property name="characterEncoding" value="utf-8"/>

    </bean>
    <bean id="templateEngineId" class="org.thymeleaf.spring5.SpringTemplateEngine">
        <property name="templateResolver" ref="servletContextTemplateResolverId"/>
<!--国际化必须加上这个-->
        <property name="templateEngineMessageSource" ref="messageSourceId"/>

    </bean>

    <bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="templateEngine" ref="templateEngineId"/>
        <property name="characterEncoding" value="utf-8"/>
        <property name="viewNames" value="*.html"/>
        <property name="order" value="1"/>

    </bean>
<!--解析文本消息,实现国际化-->
    <bean id="messageSourceId" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
<!--                可以实现多个语言配置-->
                <value>/login</value>
            </list>
        </property>
    </bean>

<!--    注入自定义实现的LocalResolver-->
    <bean id="resolverId" class="com.kin.config.MyLocalResolver"/>


</beans>
  1. MyLocaleResolver.java
    这个文件是定义在页面上点击语言切换时,截取参数中的"l=cn_zh或l=en_us",从而生成新的locale
package com.kin.config;

import org.springframework.context.annotation.Bean;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

/**
 * @author pandas
 * @ClassName MyLocalResolver
 * @Description 实现LocaleResolver,达到拦截中英文的链接参数
 * @create 2019/10/14 11:50
 */
public class MyLocalResolver implements LocaleResolver {


    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String lang=httpServletRequest.getParameter("l");
        Locale locale=Locale.getDefault();
        if (!StringUtils.isEmpty(lang)){
            String[] split = lang.split("_");
            locale=new Locale(split[0],split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }
   
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocalResolver();
    }
}

  1. 国际化文件
    login.properties
login.forgot=Forgot password?
login.password=Password    
login.rememberme=Remember me
login.signin=Sign In
login.tip=Please sign in
login.username=Username

login_zh_cn.properties

login.forgot=忘记密码?
login.password=密码
login.rememberme=记住我
login.signin=登录
login.tip=请登录
login.username=用户名

login_cn_us.properties

login.forgot=Forgot password?
login.password=Password    
login.rememberme=Remember me
login.signin=Sign In
login.tip=Please sign in
login.username=Username

5.html文件

<form class="form-login" action="index.html">
        <h2 class="form-login-heading" th:text="#{login.tip}">sign in now</h2>
        <div class="login-wrap">
          <input type="text" th:name="userName" class="form-control" th:placeholder="#{login.username}" placeholder="User ID" autofocus>
          <br>
          <input type="password" th:name="password" class="form-control" th:placeholder="#{login.password}" placeholder="Password">

          <label class="checkbox">
            <input type="checkbox" value="remember-me"> [[#{login.rememberme}]]
            <span class="pull-right">
            <a data-toggle="modal" href="login.html#myModal" th:text="#{login.forgot}"> Forgot Password?</a>
            </span>
            </label>
          <button class="btn btn-theme btn-block" href="index.html" type="submit" th:text="#{login.signin}"><i class="fa fa-lock"></i> SIGN IN</button>
          <br>
          <div class="languge">
            <a class="" href="#" th:href="@{/index.html(l='zh_CN')}">chinese</a>
            <a class="" th:href="@{/index.html(l='en_us')}">English</a>
          </div>
          <hr>
            <p  class="login-p-error" th:type="text" th:text="#{msg}" ></p>
        </div>
        <!-- Modal -->
        <div aria-hidden="true" aria-labelledby="myModalLabel" role="dialog" tabindex="-1" id="myModal" class="modal fade">
          <div class="modal-dialog">
            <div class="modal-content">
              <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title">Forgot Password ?</h4>
              </div>
              <div class="modal-body">
                <p>Enter your e-mail address below to reset your password.</p>
                <input type="text" name="email" placeholder="Email" autocomplete="off" class="form-control placeholder-no-fix">
              </div>
              <div class="modal-footer">
                <button data-dismiss="modal" class="btn btn-default" type="button">Cancel</button>
                <button class="btn btn-theme" type="button">Submit</button>
              </div>
            </div>
          </div>
        </div>
        <!-- modal -->
      </form>

6.效果
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值