【问题标题】:How to extend the list of available Java Locales如何扩展可用 Java 语言环境的列表
【发布时间】:2011-06-10 14:39:18
【问题描述】:

我正在寻找一种向 Java 1.6 中可用的语言环境添加更多语言环境的方法。但是我要创建的语言环境没有 ISO-3166 国家代码,也没有 ISO-639 语言代码。有什么办法可以做到这一点吗?我想添加的语言环境仅在语言名称上有所不同,但种族越小,他们对自己的身份就越挑剔;-)

所以我想扩展一个现有的语言环境,比如

UserDefinedLocale extends Locale { 
   UserDefinedLocale (Locale parentLocale) {...}
}

但是 java.util.Locale 是最终的,这使得破解某些东西特别困难......

那么,Java 语言环境列表是详尽无遗的吗?我是不是第一个错过更多语言环境的人?

【问题讨论】:

    标签: java locale


    【解决方案1】:

    this answer:

    ...您可以通过 SPI 插入对其他语言环境的支持(描述为 here)。例如,要为新的语言环境提供日期格式化程序,您可以通过实现DateFormatProvider 服务来实现。您可以通过装饰现有实现来做到这一点 - 我会查看 ICU4J 库,看看它是否提供了您想要的支持。

    【讨论】:

    • 谢谢。可悲的是,操纵每个用户 JRE 不是我的应用程序的选项:“由于区域设置敏感服务 SPI 基于标准 Java 扩展机制,因此您可以将它们打包为 JAR 文件(在其 MANIFEST 文件中有一些技巧,可以在这里找到)并将其放在扩展目录中。”
    【解决方案2】:

    阅读 java.util Locale 的 javadoc。

    它说: "使用此类中的构造函数创建一个 Locale 对象:"

    它还说: "因为 Locale 对象只是一个区域的标识符,所以在构造 Locale 时不会进行有效性检查"

    它还说: “语言环境是识别您想要获取的对象类型(NumberFormat)的机制。语言环境只是一种识别对象的机制,而不是对象本身的容器”

    最后,getAvailableLocales() 方法的 javadoc 说: "返回的数组表示 Java 运行时环境和已安装的 LocaleServiceProvider 实现支持的语言环境的联合"

    因此,您只需发明一种不在标准列表中的语言代码,并将其用作您所在地区的标识符。

    【讨论】:

    • “所以你只需要发明一个不在标准列表中的语言代码,并将其用作你所在地区的标识符。” - 你错过了吗?你引用了关于安装LocaleServiceProvider?
    • 我同意这是一条捷径。但是由于 OP 没有明确解释他所说的“扩展可用语言环境列表”的含义,我怀疑他想要的只是需要他实例化一个新语言环境。使用 ResourceBundle 除了新的语言环境之外不需要任何东西。数字和日期格式可以重用其他语言的规则。然后他只需要使用新的国家代码或变体代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多