Spring MVC(三) 国际化

SpringMVC 国际化

随着全球化的加速发展,Web应用的多语言支持变得越来越重要。对于开发者来说,如何实现应用的国际化成为了一个不可忽视的问题。作为Java Web开发的重要框架,Spring MVC在处理国际化方面有着丰富的功能和灵活的解决方案。本文将探讨Spring MVC的国际化部分内容,并通过自己的在工作中的真实使用体验来帮助大家理解和应用这些功能。

1、添加相关依赖

如果是Maven项目中,可以在pom.xml文件中添加以下依赖:

xml 复制代码
<dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-webmvc</artifactId>  
    <version>5.3.10</version>  
</dependency>  
<dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-context-support</artifactId>  
    <version>5.3.10</version>  
</dependency>

2、配置MessageSourceBean

在Spring的配置文件applicationContext.xml中,可以通过以下两种方式进行注入并加载资源文件。

方式一:ReloadableResourceBundleMessageSource

xml 复制代码
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
	    <property name="basename" value="classpath:messages/messages"/> <!-- 消息资源文件的基本名称 -->  
	    <property name="defaultEncoding" value="UTF-8"/> <!-- 默认编码 -->  
</bean>

方式二:ResourceBundleMessageSource

xml 复制代码
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">  
	    <property name="basename" value="messages/messages"/> <!-- 消息资源文件的基本名称 -->  
	    <property name="defaultEncoding" value="UTF-8"/> <!-- 默认编码 -->  
</bean>

另外还可以通过代码的方式进行bean的引入

java 复制代码
@Bean  
public MessageSource messageSource() {  
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();  
    messageSource.setBasename("classpath:messages/messages"); // 消息资源文件的位置  
    messageSource.setDefaultEncoding("UTF-8"); // 设置默认编码  
    return messageSource;  
}

3、添加消息资源文件

src/main/resources的位置下创建消息资源文件夹messages,用于存储不同语言的消息。

例如,在messages文件夹下新建messages_en.properties的英文消息资源文件和messages_zh_CN.properties的中文消息资源文件。在文件中定义消息键和对应的值。 注意:存放位置可根据自己项目规范进行修改

英文 messages_en.properties

复制代码
001=hello word!

中文 messages_zh_CN.properties

复制代码
001=你好,世界!

默认 messages.properties

复制代码
001=你好,世界!

4、消息工具类(代码应用)

创建MessageUtil.java工具类

java 复制代码
package com.cloud.core.util;

import java.util.Locale;

import org.springframework.context.MessageSource;

import com.cloud.core.holder.ContextHolder;

public class MessageUtil {

	private static MessageSource messageSource;

	//ContextHolder为Spring容器上下文信息类,可通过继承ContextLoaderListener进行获取
	static {
		messageSource = (MessageSource) ContextHolder.getBean("messageSource");
	}
	/**
	 * @Comments :获取消息
	 * @param code 在*.properties文件中的消息键
	 * @param locale 本地化语言,也可根据需要进行扩展
	 * @return
	 * @Author :程序员云笔记
	 * @Date :2024年1月5日 上午11:00:29
	 */
	public static String getMessage(String code, Locale locale) {
		return messageSource.getMessage(code, null, locale);
	}
	/**
	 * @Comments :获取消息
	 * @param code 在*.properties文件中的消息键
	 * @param args 参数数组,其中的参数将被填充,用于替换消息中的{0}、{1},详见java.text.MessageFormat
	 * @param locale 本地化语言,也可根据需要进行扩展
	 * @return
	 * @Author :程序员云笔记
	 * @Date :2024年1月5日 上午11:01:30
	 */
	public static String getMessage(String code, Object[] args, Locale locale) {
		return messageSource.getMessage(code, args, locale);
	}
}

//以下是此工具类用到的部分代码
public class WebAppContextListener extends ContextLoaderListener {
	
	public void contextDestroyed(ServletContextEvent event) {

	}

	public void contextInitialized(ServletContextEvent event) {
		super.contextInitialized(event);
		WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
		ContextHolder.setContext(context);
	}
}

public class ContextHolder {
	private static ApplicationContext context;

	public static void setContext(ApplicationContext ctx) {
		if(context == null){
			context = ctx;
		}
	}
	
	public static Object getBean(String name) {
		return context.getBean(name);
	}
}

5、在代码中直接使用

java 复制代码
MessageUtil.getMessage("001",Locale.ENGLISH);
MessageUtil.getMessage("001",Locale.CHINA);
MessageUtil.getMessage("001",Locale.getDefault());

//输出以下消息
hello word!
你好,世界!
你好,世界!

以上就是本次项目国际化所有代码,有不足之处欢迎大家指导。

相关推荐
欧阳秦穆18 分钟前
apoc-5.24.0-extended.jar 和 apoc-4.4.0.36-all.jar 啥区别
java·jar
岁忧29 分钟前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
Java初学者小白33 分钟前
秋招Day14 - Redis - 应用
java·数据库·redis·缓存
代码老y39 分钟前
Spring Boot + 本地部署大模型实现:优化与性能提升
java·spring boot·后端
GodKeyNet43 分钟前
设计模式-桥接模式
java·设计模式·桥接模式
guojl2 小时前
Java多任务编排技术
java
丶意冷2 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
要开心吖ZSH2 小时前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程2 小时前
深入解析CompletableFuture源码实现
java·性能优化·源码
考虑考虑2 小时前
Springboot3.4.x中的@Bean使用
spring boot·后端·spring