RESTful 服务的国际化

2025 年 1 月 17 日 | 阅读 5 分钟

在本节中,我们将讨论 RESTful Web 服务的国际化。

国际化

国际化是指设计 Web 应用程序或服务,使其能够自动支持不同的国家和语言,而无需更改应用程序。它也称为 I18N,因为 internationalization 这个词共有 18 个字符,从 I 开始到 N 结束。

本地化是通过添加特定区域设置的组件(如翻译文本、描述特定区域设置行为的数据等)来执行的。它支持与提供语言或文化相关功能的类和包的完全集成。

Java 为桌面和服务器应用程序的国际化提供了基础。以下是重要的国际化功能领域。

  • 文本表示:Java 基于 Unicode 字符集,并且有多个库实现了 Unicode 标准。
  • 区域设置标识和本地化:Java 中的区域设置是标识符,可用于在不同功能领域请求特定区域设置的行为。ResourceBundle 类支持本地化。该类提供对特定于区域设置的对象(包括字符串)的访问。
  • 日期和时间处理:Java 提供了各种日历。它支持与日历无关的 Date 对象之间的转换。Java 支持世界上所有时区。
  • 文本处理:它包括字符分析、大小写映射、字符串比较、将文本分解成单词、将数字、日期和时间值格式化为字符串,或将它们从字符串解析回来。这些功能大多数都与区域设置相关。
  • 字符编码:在从流读取传入文本或向流写入传出文本时,它支持 Unicode 与其他字符编码之间的文本转换。

我们需要配置两件事来使服务国际化。

  • LocaleResolver
  • ResourceBundleMessageSource

默认区域设置为 Locale.US。如果有人未指定区域设置,则返回默认区域设置。我们还需要自定义 ResourceBundle。它有一个要国际化的属性列表。我们将把属性存储在 ResourceBundle 中。ResourceBundleMessageSource 是 Spring MVC 中用于处理属性的概念。之后,我们将使用 MessageSource 和一个名为 Accept-Language 的请求头。

让我们配置国际化。

步骤 1:打开 RestfulWebServicesApplication.java 文件。

步骤 2:默认 区域设置配置一个 Bean。

注意:导入 import org.springframework.web.servlet.LocaleResolver 包,同时导入 LocaleResolver。

步骤 3:现在,我们将把属性存储在一个名为 messages.properties 的特定文件中。

右键单击 src/main/resources 文件夹 -> 新建 -> 文件 -> 提供文件名:messages.properties。它包含默认区域设置的消息。

messages.properties

步骤 4:创建一个名为 messages_fr.properties 的另一个属性文件,用于法语区域设置。它包含一条法语区域设置的消息。

messages_fr.properties

步骤 5:读取属性并根据输入的 Accept-Language 请求头进行自定义。打开 RestfulWebServicesApplication.java 并为 ResourceBundle 配置另一个 Bean。

RestfulWebServicesApplication.java

步骤 6:更新服务以使用这些源。打开 HelloWorldController.java 并自动装配 MessageSource。

HelloWorldController.java

步骤 7:打开 REST 客户端 Postman 并执行以下更改

  • 选择 GET 请求。
  • 输入 URI https://:8080/hello-world-internationalized
  • 点击 Headers 选项卡并输入
Internationalization of RESTful Services
  • 点击 Send 按钮。
Internationalization of RESTful Services

它返回美国区域设置的消息 Good Morning

现在我们更改 RequestHeader us 为 fr 并再次发送 GET 请求。

Internationalization of RESTful Services
Internationalization of RESTful Services

它返回法语区域设置的消息 Bonjour

再次,将 RequestHeader fr 更改为其他 RequestHeader,例如 nl。它返回默认区域设置(美国)的消息 Good Morning

Internationalization of RESTful Services

让我们为 RequestHeader nl 创建一个属性文件 message_nl.properties。它包含 荷兰语 的消息 Goede Morgen。

messages_nl.properties

再次发送 GET 请求,它返回消息 Goede Morgen

Internationalization of RESTful Services

简化国际化

现在我们将简化上面完成的国际化实现。在之前的实现中,我们已将区域设置(RequestHeader)作为参数传递给 REST 控制器方法。如果我们将此添加到每个需要国际化的方法中,成本会增加。Spring 提供了一种从 LocaleContextHolder 获取它的替代方法。

让我们实现 LocaleContextHolder 而不是 RequestHeader。

步骤 1:打开 HelloWorldController.java 并更改 helloWorldInternationalized() 方法的返回类型。

HelloWorldController.java

步骤 2:打开 RestfulWebServicesApplication.java 并将 SessionLocaleResolver 更改为 AcceptHeaderLocaleResolver。LocaleResolver 实现使用 HTTP 请求的“accept-language”头中指定的主要区域设置(客户端浏览器发送的区域设置)。

RestfulWebServicesApplication.java

AcceptHeaderLocaleResolver 的优点是,我们无需将请求头配置为每个控制器方法中的参数。

步骤 3:打开 REST 客户端 Postman 并通过设置键为 Accept-Language,值为 fr 来发送 GET 请求。它返回消息 Bonjour。

现在取消选中 RequestHeader,将值 fr 更改为 en。它返回默认区域设置(美国)的消息 Good Morning。

步骤 4:转到 RestfulWebServicesApplication.java。删除 ResourceBundleMessageSource() 方法,并将其配置在 application.properties 文件中。

步骤 5:打开 application.properties 文件,配置消息基础名称,而不是在 RestfulWebServicesApplication.java 中创建单独的 Bean。

application.properties

步骤 6:重复步骤 3。