Spring Boot 如何处理国际化

2023-11-04

Spring Boot 国际化

在全球化的今天,很多应用程序需要支持多种语言和地区。为了满足不同用户的需求,应用程序需要提供多语言的支持。Spring Boot 提供了强大的国际化支持,使得开发人员能够轻松地为应用程序添加多语言支持。本文将介绍如何使用 Spring Boot 处理国际化,并提供示例代码来帮助读者更好地理解。

在这里插入图片描述

Spring Boot 国际化的基本原理

Spring Boot 国际化的基本原理是将应用程序中的文本信息抽取出来,存储在一个或多个属性文件中,然后根据用户的语言和地区选择相应的属性文件来显示文本信息。Spring Boot 默认使用 messages.propertiesmessages_xx.properties 文件作为属性文件,其中 xx 为语言和地区的代码。例如,messages_cn.properties 文件用于存储中文文本信息,messages_en_US.properties 文件用于存储美式英文文本信息。

在应用程序中,可以使用 MessageSource 接口来访问属性文件中的文本信息。Spring Boot 提供了多种方式来注入 MessageSource 接口,例如使用 @Autowired@Resource@Inject 注解。然后,可以使用 MessageSourcegetMessage() 方法来获取属性文件中的文本信息。例如,以下代码演示了如何使用 MessageSource 获取 messages.properties 文件中的文本信息:

@Autowired
private MessageSource messageSource;

public String getMessage() {
    return messageSource.getMessage("hello", null, Locale.getDefault());
}

在这个示例代码中,使用 @Autowired 注解将 MessageSource 接口自动注入到 messageSource 变量中。然后,使用 messageSource.getMessage() 方法获取 messages.properties 文件中名称为 hello 的文本信息,并返回该文本信息。

国际化属性文件的命名规则

Spring Boot 默认使用 messages.propertiesmessages_xx.properties 文件作为属性文件,其中 xx 为语言和地区的代码。当应用程序需要支持多种语言和地区时,可以为每种语言和地区创建一个属性文件,并使用正确的语言和地区代码命名文件。例如,以下是一些常用的语言和地区代码:

  • zh_CN:简体中文
  • zh_TW:繁体中文
  • en_US:美式英文
  • en_GB:英式英文
  • ja_JP:日文
  • ko_KR:韩文

如果应用程序需要支持以上所有语言和地区,可以为每种语言和地区创建一个属性文件,如下所示:

  • messages.properties:默认属性文件,用于存储英文文本信息。
  • messages_zh_CN.properties:用于存储简体中文文本信息。
  • messages_zh_TW.properties:用于存储繁体中文文本信息。
  • messages_en_US.properties:用于存储美式英文文本信息。
  • messages_en_GB.properties:用于存储英式英文文本信息。
  • messages_ja_JP.properties:用于存储日文文本信息。
  • messages_ko_KR.properties:用于存储韩文文本信息。

在以上属性文件中,可以使用相同的键名来存储不同语言和地区的文本信息。例如,在messages.properties 文件中,可以使用以下键值对存储 hello 的英文文本信息:

hello=Hello!

messages_zh_CN.properties 文件中,可以使用以下键值对存储 hello 的简体中文文本信息:

hello=你好!

messages_zh_TW.properties 文件中,可以使用以下键值对存储 hello 的繁体中文文本信息:

hello=妳好!

messages_en_US.properties 文件中,可以使用以下键值对存储 hello 的美式英文文本信息:

hello=Hi!

messages_en_GB.properties 文件中,可以使用以下键值对存储 hello 的英式英文文本信息:

hello=Hello!

messages_ja_JP.properties 文件中,可以使用以下键值对存储 hello 的日文文本信息:

hello=こんにちは!

messages_ko_KR.properties 文件中,可以使用以下键值对存储 hello 的韩文文本信息:

hello=안녕하세요!

当用户选择不同的语言和地区时,Spring Boot会根据用户的语言和地区代码自动选择相应的属性文件,并返回相应的文本信息。

在 Spring Boot 中配置国际化

配置 Spring Boot 的国际化非常简单。首先,在 application.propertiesapplication.yml 文件中配置默认语言和地区代码。例如,在 application.properties 中添加以下配置:

spring.messages.basename=messages
spring.messages.encoding=UTF-8
spring.messages.fallback-to-system-locale=false

或在 application.yml 中添加以下配置:

spring:
  messages:
    basename: messages
    encoding: UTF-8
    fallback-to-system-locale: false

在上面的配置中,spring.messages.basename 属性指定了属性文件的基本名称,即 messages。Spring Boot 将自动查找 messages.propertiesmessages_xx.properties 文件来获取文本信息。spring.messages.encoding 属性指定了属性文件的编码方式,默认为 UTF-8。spring.messages.fallback-to-system-locale 属性指定了当找不到当前语言和地区的属性文件时是否回退到系统语言和地区,默认为 false

然后,可以在属性文件中添加键值对来存储文本信息。例如,在messages.properties 文件中添加以下键值对:

hello=Hello!

messages_zh_CN.properties 文件中添加以下键值对:

hello=你好!

messages_zh_TW.properties 文件中添加以下键值对:

hello=妳好!

messages_en_US.properties 文件中添加以下键值对:

hello=Hi!

messages_en_GB.properties 文件中添加以下键值对:

hello=Hello!

messages_ja_JP.properties 文件中添加以下键值对:

hello=こんにちは!

messages_ko_KR.properties 文件中添加以下键值对:

hello=안녕하세요!

然后,在代码中使用 MessageSource 来获取属性文件中的文本信息。例如,在控制器中添加以下代码:

@Autowired
private MessageSource messageSource;

@GetMapping("/hello")
public String hello(HttpServletRequest request) {
    return messageSource.getMessage("hello", null, request.getLocale());
}

在上面的代码中,使用 @Autowired 注解将 MessageSource 接口自动注入到 messageSource 变量中。然后,在 hello() 方法中,使用 messageSource.getMessage() 方法获取 hello 键对应的文本信息。request.getLocale() 方法用于获取当前请求中的语言和地区代码,让 Spring Boot 自动选择相应的属性文件,并返回相应的文本信息。

在 Thymeleaf 模板中使用国际化

Thymeleaf 是一种流行的模板引擎,它与 Spring Boot 集成得非常好。Thymeleaf 提供了强大的国际化支持,使得开发人员能够轻松地在模板中使用多语言文本信息。在 Thymeleaf 模板中使用国际化需要以下步骤:

  1. 在模板中使用 th:text 属性来显示文本信息。
  2. 使用 #{...} 表达式来引用属性文件中的键。

例如,在以下 Thymeleaf 模板中,使用 th:text 属性来显示文本信息,并使用 #{...} 表达式来引用属性文件中的键:

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> 
    <title>Spring Boot Thymeleaf Internationalization Example</title> 
    </head> 
    <body> <h1 th:text="#{hello}">Hello!</h1> </body> 
</html> 

在上面的模板中,使用 th:text 属性来显示文本信息,并使用 #{hello} 表达式来引用 messages.properties 文件中的 hello 键。当用户选择不同的语言和地区时,Thymeleaf 会自动选择相应的属性文件,并返回相应的文本信息。

使用消息参数

在实际开发中,有时需要将动态参数插入到文本信息中。例如,需要显示欢迎消息,但需要将用户名动态插入到消息中。在这种情况下,可以在属性文件中使用占位符来表示动态参数,然后在代码中使用 MessageSourcegetMessage() 方法来将动态参数插入到文本信息中。

例如,在 messages.properties 文件中添加以下键值对:

welcome=Welcome, {0}!

在代码中使用 getMessage() 方法将动态参数插入到文本信息中:

@Autowired
private MessageSource messageSource;

@GetMapping("/welcome")
public String welcome(HttpServletRequest request, @RequestParam String name) {
    return messageSource.getMessage("welcome", new Object[]{name}, request.getLocale());
}

在上面的代码中,使用 getMessage() 方法将 welcome 键对应的文本信息获取出来,并将 name 参数动态插入到文本信息中。

在 Thymeleaf 模板中,可以使用 th:text 属性和 #{...} 表达式来显示包含动态参数的文本信息。例如,在以下 Thymeleaf 模板中,将 name 参数插入到 welcome 键对应的文本信息中:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>Spring Boot Thymeleaf Internationalization Example</title>
</head>
<body>
    <h1 th:text="#{welcome(${name})}">Welcome, <span th:text="${name}">User</span>!</h1>
</body>
</html>

在上面的模板中,使用 th:text 属性和 #{welcome(${name})} 表达式来获取包含动态参数的文本信息。th:text="${name}" 表达式用于显示 name 参数的值。

总结

Spring Boot 提供了强大的国际化支持,使得开发人员能够轻松地为应用程序添加多语言支持。在本文中,我们介绍了 Spring Boot 国际化的基本原理、国际化属性文件的命名规则以及如何在 Spring Boot 中配置国际化。我们还介绍了如何在 Thymeleaf 模板中使用国际化,并使用动态参数来插入动态内容。

通过使用 Spring Boot 的国际化支持,开发人员可以为不同语言和地区的用户提供更好的用户体验,从而吸引更多的用户。****

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 如何处理国际化 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分

随机推荐