Java货币显示名称国际化

标签 java internationalization currency

尽管区域设置不是英文(即:未翻译),但某些显示名称仍以英文显示是否有任何原因?

例如: 语言环境:“ru”未翻译

Locale locale = new Locale("ru");
Currency curr = Currency.getInstance("USD");
System.out.println(curr.getDisplayName(locale));
// US Dollar

语言环境:“es”被翻译

Locale locale = new Locale("es");
Currency curr = Currency.getInstance("USD");
System.out.println(curr.getDisplayName(locale));
// dólar estadounidense

这是故意的吗? 还是 Java 没有开始翻译它? 还是我做错了什么?

我试图找到存储这些翻译的文件,但找不到。如果有人也可以向我指出该资源,那将会很有帮助。

谢谢。

最佳答案

本地服务提供商

Java uses an extensible mechanism to provide data (such as strings, formatters, etc) that is localized.

Classes can implement LocaleServiceProvider to be a factory of local-sensitive data. A lot of classes in java.util and java.text rely on these providers to work properly with different Locale by delegating the creating of objects to them.

您可以在 java.util.spi 中找到本地服务提供商的示例包,通常用于以依赖于 Locale 的方式显示文本或数字。 它包括 CurrencyNameProvider,它在调用 Currency#getDisplayName 时由 Currency 使用>.

寻找实现

想要使用特定 LocaleServiceProvider 的类(例如 CurrencyNamePovider)使用 LocaleServiceProviderPool 来查找支持特定 Locale 的提供程序的实例.

LocaleServiceProviderPool 尝试首先使用 JRE 中包含的默认实现。如果未找到,它依赖于 Java 中的简单服务提供者接口(interface) (SPI) 机制并使用 ServiceLoader 1 尝试找到第三方库提供的实现

这是写在 tutorial about Locale 中的内容:

These methods first check whether the Java runtime environment supports the requested locale; if so, they use that support. Otherwise, the methods call the getAvailableLocales() methods of installed providers for the appropriate interface to find a provider that supports the requested locale.

JRE 附带的提供程序的默认实现可以在包 sun.util.locale.provider 中找到。它很复杂,但它本质上是从 jar localedata.jar 中获取数据。在 Oracle JDK 中,它位于 java_home/jre/lib/ext/localedata.jar。如果列出此 jar 中的文件,并检查 sun.util.resources.essun.util.resources.ru 中的文件,您将看到为西类牙语定义的货币名称比为俄语定义的货币名称多得多。

以下是 OpenJDK 的文件:Russian对比Spanish .

如果根本没有定义怎么办

语言环境是按层次组织的。例如,一个国家的特定区域可以有一个 Locale,它反射(reflect)了与国家 Locale 的一些地方差异。如果找不到区域设置的数据,LocaleServiceProviderPool 将尝试使用该区域设置的父项。

Locales 树的根基本上是一个“后备”虚构 Locale,它为所有本地化数据提供默认值。

这就是当您要求以俄语显示 USD 的显示名称时可能发生的情况。

可扩展性

任何程序都可以提供额外的 Locale 信息。他们需要定义一个服务提供者 1 通过创建元数据文件并实现 CurrencyNameProvider。您可以在自己的jar中填充缺少的本地化数据。

结论

Or has Java not gotten around to translating it?

差不多就是这样。

Or am I doing something incorrectly?

不,您可以依赖默认值或自己提供本地化数据。


1 ServiceLoader将通过要求类加载器加载资源 META-INF/services/java.text.spi.DateFormatProvider 来找到它们。如果找到这样的文件,它应该包含实现的特定类名。然后它会尝试通过类加载器创建它的一个实例。

关于Java货币显示名称国际化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47033132/

相关文章:

java - 下载 blob pdf 文件后没有数据

javascript - 具有简单插值的django javascript翻译

python - 在 Python 中将答案四舍五入到小数点后两位

俄罗斯卢布的 PayPal 交易

c - Linux 中的每线程语言环境

php - 在表单中预先格式化的数字/货币显示和存储不正确的值

java - 无法在 Windows 10 的 docker 上拉取 selenium/hub 镜像

java - 如何在没有包的情况下引用 Java 文件?

java - startactivity() 关闭应用程序

android - android webview 中的 Dipaly 波斯语文本(适用于不支持波斯语的手机)