Java 本地化

2024年9月10日 | 阅读10分钟

国际化是指开发软件应用程序的过程,使其能够适应不同的语言和地区,而无需修改应用程序。开发区域性应用程序会增加应用程序的成本,还需要大量的维护。

本地化是指通过翻译文本和添加特定于区域设置的组件来为特定地区或国家调整国际化软件的过程。

因此,最好使用国际化概念来开发应用程序。它节省时间,降低开发成本,并需要较少的维护工作。

在理解本地化一词之前,了解一个经常与它一起阅读的概念很重要,那就是“国际化”。

国际化

国际化是指开发支持各种语言、数字格式、货币、日期、时间和其他格式的应用程序的过程。它是任何现代多语言系统的组成部分。由于“i”和“n”之间有 18 个字符,因此国际化生产有一个非常流行的缩写(可能比实际名称更流行)——“I18N”。

现代商业系统需要服务于来自世界不同地区/国家或许多文化区域的人们。不同的文化或语言区域不仅决定了语言的具体含义,还决定了货币类型、数字表示,甚至日期和时间的变体。

例如,看看不同国家的十进制和千位分隔符约定

  1. 504,200.12 (美国)
  2. 504 200,12 (波兰)
  3. 200,12 (德国)

同样,日期和时间格式也不同。例如

  1. 2022 年 3 月 3 日,星期四,下午 4:30:14 CET (美国)
  2. 2022 年 3 月 1 日,星期一 16 点 30 分 CET (法国)
  3. 2022年1月1日 星期一 下午16时30分14秒 CET (中国)

更重要的是,我们知道不同国家有独特的货币符号

  1. £5,4000.80 (英国)
  2. €400,80 (意大利)
  3. 7 400,80 € (法国)
  4. $7,400.80 (美国)

请注意,即使某些国家/地区拥有相同的货币和货币符号(如法国和意大利),其货币符号的位置也可能不同。

本地化

在 Java 中,我们有一个名为 Locale 类的绝佳功能。它允许我们快速区分文化区域并适当地格式化我们的内容。与 I18N 类似,本地化也有其缩写——“I10N”,因为“I”和“N”之间有 10 个字母。使用 Locale 的主要原因是所有必需的本地特定格式都可以访问,而无需重新编译。应用程序可以一次处理多个区域设置,因此支持新语言非常简单。

本地化也可以定义为使产品内容适应特定地点或语言的过程。翻译单词是此过程的一个广为人知的部分,但它不是唯一的部分。区域设置实践通常包括

  • 数字
  • 日期
  • 货币
  • 图像和声音
  • 布局

即使在语言相同的国家/地区,您也会发现差异,例如,美式英语与英式英语。

本地化的好处

  1. 通过添加本地化数据,同一个可执行文件可以在世界范围内运行。
  2. 文本元素,例如状态消息和 GUI 组件标签,在系统中没有固定代码。相反,它们被存储而没有源代码,并被动态检索。
  3. 支持新语言无需重新集成。
  4. 基于自定义的数据,例如日期和货币类型,将以符合最终用户区域和语言的格式显示。

让我们了解如何在编程中实现本地化。

Locale.Builder

另一种选择是 Locale.Builder。Locale.Builder 有五个 set 方法,我们可以使用它们来构建对象,同时验证这些值

上述 Locale 的字符串表示形式是 fr_CA_POSIX_#Latn。

值得注意的是,“variant”设置可能有点棘手,因为对不同的值没有法律限制,尽管 set 方法要求符合 BCP-47。否则,它将抛出 IllformedLocaleException。

在我们需要使用不超过保证的值的情况下,我们可以使用 Locale 构造函数,因为它们不验证值。

Locale 类的重要性

Locale 类的对象代表一个地理或文化区域。可以使用此对象来获取区域设置特定的信息,例如国家名称、语言、变体等。

Locale 类的字段

Java Locale 类有以下字段

  • public static final Locale ENGLISH
  • public static final Locale FRENCH
  • public static final Locale GERMAN
  • public static final Locale ITALIAN
  • public static final Locale JAPANESE
  • public static final Locale KOREAN
  • public static final Locale CHINESE
  • public static final Locale SIMPLIFIED_CHINESE
  • public static final Locale TRADITIONAL_CHINESE
  • public static final Locale FRANCE
  • public static final Locale GERMANY
  • public static final Locale ITALY
  • public static final Locale JAPAN
  • public static final Locale KOREA
  • public static final Locale CHINA
  • public static final Locale PRC
  • public static final Locale TAIWAN
  • public static final Locale UK
  • public static final Locale US
  • public static final Locale CANADA
  • public static final Locale CANADA_FRENCH
  • public static final Locale ROOT

Java Locale 类的构造函数

Locale 类有以下三个构造函数,如下所示

  1. Locale( String language )
  2. Locale( String language, String country )
  3. Locale( String language, String country, String variant )

Java Locale 类的方法

以下是用于本地化 Java 应用程序的方法。

A. getDefault()

检测此 Java 虚拟机事件的当前默认位置。

Java 虚拟机在实现期间根据主机位置设置默认位置。当没有显式位置时,它在区域中使用许多区域设置敏感方法。可以使用 setDefault() 方法更改它。

返回值

此 Java 虚拟机实例的默认区域设置。

B. setDefault()

为此 Java 虚拟机事件设置默认位置。这不会影响主机的位置。

如果存在安全管理器,则在更改默认位置之前,会调用其 checkPermission 方法 PropertyPermission (“ user.language ”, “ write ”)。

Java 虚拟机在实现期间根据主机位置设置默认位置。当没有显式位置时,它在区域中使用许多敏感方法。

由于更改位置可能会影响许多不同的操作系统环境,因此此方法仅应在调用者准备好重置同一 Java 虚拟机内运行的区域设置敏感代码时使用。

通过以这种方式设置默认位置,该阶段的所有默认区域也将设置为指定的位置。

参数

newLocale: 新的默认区域设置

抛出

SecurityException:如果存在安全管理器,并且其 checkPermission 方法不允许该操作。

NullPointerException:如果 newLocale 为 null

C. getISOCountries()

返回 ISO 3166 中定义的所有两位国家代码列表。可用于创建区域设置。

注意:Locale 类还支持其他国家/地区代码,例如 UN M.49 3 位城市代码。因此,此方法返回的列表不包含可用于创建区域设置的所有有效代码。

返回值

ISO 3166 两位国家代码数组。

D. getISOLanguages()

语法

它返回 ISO 639 中定义的所有两位语言代码列表。可用于创建区域设置。

注意:ISO 639 不是一个稳定的标准。一些语言代码已更改。此函数返回的列表包含已更改代码的语言的新旧代码。

Locale 类还支持最多 8 个字符的语言代码。因此,此方法返回的列表不包含可用于创建区域设置的所有有效代码。

返回值

ISO 639 两位语言代码数组。

E. getScript()

语法

它返回此区域设置的脚本,该脚本必须为空字符串或 4 位 ISO 15924 脚本代码。第一个字母大写,其余字母小写(例如“Latin”、“Kyrl”)。

返回值

脚本代码,或在未定义时为空字符串。

F. getCountry()

语法

返回此区域设置的国家/地区代码,该代码应为空字符串、大写的 ISO 3166 两位代码或 UN M.49 3 位代码。

返回值

国家/地区代码,或在未定义时为空字符串。

G. toString()

语法

它返回此区域设置对象的可视化字符串表示形式,包括语言、国家/地区、变体、脚本和扩展,如下所示。

覆盖

Object 类的 toString() 方法。

返回值

Locale 的可视化字符串表示形式,用于调试。

请注意,语言始终为小写,国家/地区始终为大写,脚本始终为标题大小写,扩展始终为小写。当区域设置没有脚本或扩展时,结果与 Java 6 及更早版本相同。

如果语言和国家/地区字段都缺失,则函数将返回空字符串,即使变体、脚本或扩展字段存在(您不能只有一个变体区域设置,变体必须伴随一个格式正确的语言或国家/地区代码)。如果存在脚本或扩展而缺少变体,则不会在“#”之前添加下划线。

此行为支持调试和与 toString 的旧用途的兼容性,其中只期望语言、国家/地区和变体字段。使用 toLanguageTag() 将 Locale 表示为用于交换目的的字符串。

示例

  • en
  • de_DE
  • _GB
  • en_US_WIN
  • de__POSIX
  • zh_CN_#Hans
  • zh_TW_#Hant-x-java
  • th_TH_TH_#u-nu-thai

H. getISO3Language()

它返回给定区域设置的三字母语言缩写。如果语言与两位 ISO 6391 代码匹配,则返回相应的三字母 ISO 6392/T 小写代码。可以在 Internet 上找到 ISO 6392 语言代码。如果区域设置指定了三字母语言,则按原样返回该语言。如果区域设置未指定语言,则返回空字符串。

返回值

此区域设置语言的三字母缩写。

抛出

MissingResourceException:如果此区域设置没有三字母语言缩写,则抛出 MissingResourceException。

I. getISO3Country()

返回此区域设置的国家/地区的三字母缩写。如果国家/地区与 ISO 31661 alpha2 代码匹配,则返回相应的大写 ISO 31661 alpha3 代码。如果区域设置未指定国家/地区,则为空字符串。ISO 3166-1 代码可在网上找到。

返回值

此区域设置国家/地区的三字母缩写。

J. getDisplayLanguage()

返回应显示给用户的本地语言名称。如果可能,恢复的名称将在默认 DISPLAY 位置本地化。例如,如果区域设置为 fr_FR 且默认 DISPLAY 位置设置为 en_US,则 getDisplayLanguage() 返回“French”。如果区域设置为 en_US 且默认 DISPLAY 位置设置为 fr_FR,则 getDisplayLanguage() 返回“inglais”。如果无法在默认 DISPLAY 位置本地化恢复的名称(假设没有克罗地亚语的日语名称),此函数将使用英语名称,并以 ISO 代码作为最后的手段。如果区域设置未指定语言,此函数将返回空字符单元。

返回值

显示语言的名称。

K. getDisplayScript()

返回适合向用户显示的区域设置脚本名称。如果可能,该名称将在默认 DISPLAY 区域设置中本地化。如果此区域设置未指定脚本代码,则返回空字符串。

返回值

当前默认 DISPLAY 区域设置的脚本代码的显示名称

L. getDisplayCountry()

返回适合向用户显示的区域的国家/地区名称。如果可能,返回的名称将在默认 DISPLAY 区域设置中本地化。例如,如果区域设置为 fr_FR 且默认 DISPLAY 区域设置为 en_US,则 getDisplayCountry() 返回“France”。如果区域设置为 en_US 且默认 DISPLAY 区域设置为 fr_FR,则 getDisplayCountry() 返回“EtatsUnis”。如果无法在默认 DISPLAY 区域设置中本地化返回的名称(假设没有克罗地亚语的日语名称),此函数将使用英语名称,并以 ISO 代码作为最后的手段。如果区域设置未指定国家/地区,此函数将返回空字符串。

返回值

适合区域设置的国家/地区名称。

M. getDisplayVariant()

返回适合向用户显示的区域设置变体代码的名称。如果可能,该名称将在默认 DISPLAY 区域设置中本地化。如果区域设置未指定变体代码,此函数将返回空字符串。

返回值

适合区域设置的显示变体代码的名称。

N. getDisplayName()

返回适合向用户显示的区域设置名称。这将是 getDisplayLanguage()、getDisplayScript()、getDisplayCountry() 和 getDisplayVariant() 返回的值组合成一个字符串。非空值按顺序使用,第二个及后续名称放在括号中。示例

  • 语言 (脚本, 国家/地区, 变体)
  • 语言 (国家/地区)
  • 语言 (变体)
  • 脚本 (国家/地区)

国家/地区取决于区域设置中指定的字段。如果语言、脚本、国家/地区和变体字段为空,此函数将返回空字符串。

返回值

适合显示的区域设置名称。

让我们在应用程序中实现本地化。

LocaleExample.java

输出

United States
English
English (United States)
USA
eng
en
US