Java货币显示名称国际化

Java货币显示名称国际化,java,internationalization,currency,Java,Internationalization,Currency,尽管区域设置不是英语(即:未翻译),但某些显示名称还是以英语显示,这有什么原因吗 例如: 语言环境:“ru”未翻译 Locale locale = new Locale("ru"); Currency curr = Currency.getInstance("USD"); System.out.println(curr.getDisplayName(locale)); // US Dollar Locale locale = new Locale("es"); Currency curr =

尽管区域设置不是英语(即:未翻译),但某些显示名称还是以英语显示,这有什么原因吗

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

Locale locale = new Locale("ru");
Currency curr = Currency.getInstance("USD");
System.out.println(curr.getDisplayName(locale));
// US Dollar
Locale locale = new Locale("es");
Currency curr = Currency.getInstance("USD");
System.out.println(curr.getDisplayName(locale));
// dólar estadounidense
语言环境:“es”是翻译过来的

Locale locale = new Locale("ru");
Currency curr = Currency.getInstance("USD");
System.out.println(curr.getDisplayName(locale));
// US Dollar
Locale locale = new Locale("es");
Currency curr = Currency.getInstance("USD");
System.out.println(curr.getDisplayName(locale));
// dólar estadounidense
这是故意的吗? 还是Java还没有开始翻译它? 还是我做错了什么

我试图找到存储这些翻译的文件,但找不到。如果有人能给我指出那个资源,那会很有帮助的

谢谢。

Locale服务提供商 Java使用可扩展机制来提供数据(例如字符串、, 格式化程序等)进行本地化

类可以实现
LocaleServiceProvider
作为 本地敏感数据。
java.util
java.text
依靠这些提供程序在不同的
语言环境下正常工作
将对象的创建委托给他们

您可以在包中找到本地服务提供商的示例,它们通常用于以依赖于语言环境的方式显示文本或数字它包括
CurrencyNameProvider
,当调用
Currency\getDisplayName
时,CurrencyNameProvider由
货币使用

查找实现 想要使用特定
LocaleServiceProvider
(例如
CurrencyNamepVider
)的类使用
LocaleServiceProviderPool
查找支持特定区域设置的提供程序实例

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

这是在以下文件中所写的内容:

这些方法首先检查Java运行时环境是否支持请求的区域设置;如果是这样的话,他们会使用这种支持。否则,这些方法将调用相应接口的已安装提供程序的getAvailableLocales()方法,以查找支持所请求区域设置的提供程序

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

以下是OpenJDK:vs的文件

如果根本没有定义呢 区域设置按层次结构组织。例如,一个国家的特定地区可以有一个地区,该地区反映了与该国地区的一些地方差异。如果未找到区域设置的数据,
LocaleServiceProviderPool
将尝试使用该区域设置的父级

语言环境树的根基本上是一个“回退”虚拟语言环境,它为所有本地化数据提供默认值

当你问美元在俄语中的显示名称时,可能会发生这种情况

扩展性 任何程序都可以提供附加的语言环境信息。他们需要通过创建元数据文件来定义服务提供者,并实现
CurrencyNameProvider
。您可以在自己的jar中填写缺少的本地化数据

结论 还是Java还没有开始翻译它

差不多就是这样

还是我做错了什么

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


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