希伯来语的区域代码 / 其他区域代码的参考?

21

在Android资源中(如字符串(values-XX)),希伯来语的区域代码是什么?以及在哪里可以找到其他代码?

提前感谢。

3个回答

22

该语言由两个字母的ISO 639-1语言代码定义, 可选择跟随两个字母的ISO 3166-1-alpha-2区域代码 (前缀为小写字母"r")。

来自提供资源

根据链接表,he是希伯来语的限定词。

注意:一些设备使用iw代替,正如错误545在评论中指出的那样,因此最好检查两种情况。有关更多信息,请参见这个问题


7

实践证明,情况并非如此。 从本地化指南可以看到: “请注意,Java使用了多个已弃用的两位字母代码。希伯来语(“he”)语言代码被重写为“iw”...”


1
从哪个安卓版本开始使用"iw"?我们同时使用了"iw"和"he",因为一些设备使用"he"而其他一些使用"iw",但我认为现在每个人都使用"iw"。甚至IDE也开始提示删除"he"... - android developer
希伯来语的实际语言代码是“he”。旧的代码是“iw”。https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes - nenito

3
Java一直存在处理希伯来语环境的问题。虽然ISO_639-1语言代码标准将“he”定义为希伯来语,但Java的java.util.Locale类包含了“he”和“iw”代码,并且java.util.ResourceBundle类将“he”和“iw”都视为“iw”,并加载“iw_”资源而不是“he_”资源。如果您请求“he”或“iw”任何一个区域设置,最终加载的资源将是“iw_”资源,而不是“he_”资源。
从Java 17开始,这种行为似乎已经改变,更倾向于使用正确的语言代码“he”。如果同时存在“he_”和“iw_”资源,则无论您请求哪种语言环境,始终加载的是“he_”资源。只有当“he_”资源不存在且存在“iw_”资源时,才会加载“iw_”资源。因此,Java 17似乎“希望”我们恢复到正确的ISO语言代码。
编辑:可以通过将java.locale.useOldISOCodes系统属性设置为true来将此新行为还原为Java 17之前的默认值。
以下是一个小的Java程序,演示该行为及其相应的资源包应放置在com.acme.locale包中的主要程序:
com.acme.locale.Locales主类:
public class Locales {

public static void main(String[] args) {
    System.out.printf("Java version: %s%n", Runtime.version().feature());
    String language = "iw";
    Locale locale = new Locale(language);
    ResourceBundle rb = ResourceBundle.getBundle("com.acme.locale.messages", locale);
    System.out.printf("%nLanguage Code: %s%n", language);
    System.out.printf("Resource Bundle Locale: %s_%s%n",rb.getLocale().getLanguage(),rb.getLocale().getCountry());
    System.out.printf("message: %s%n", rb.getString("message"));
    language = "he";
    locale = new Locale(language);
    rb = ResourceBundle.getBundle("com.acme.locale.messages", locale);
    System.out.printf("%nLanguage Code: %s%n", language);
    System.out.printf("Resource Bundle Locale: %s_%s%n",rb.getLocale().getLanguage(),rb.getLocale().getCountry());
    System.out.printf("message: %s%n", rb.getString("message"));        
}

}

messages.properties(默认资源)

message=This is a en_US locale message.

messages_iw.properties

message=\u05D4\u05D5\u05D3\u05E2\u05EA \u05D1\u05D3\u05D9\u05E7\u05D4 \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA locale iw_

messages_he.properties

message=\u05D4\u05D5\u05D3\u05E2\u05EA \u05D1\u05D3\u05D9\u05E7\u05D4 \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA locale he_

使用 Java 16 运行此代码将会产生以下输出结果:

Java version: 16

Language Code: iw
Resource Bundle Locale: iw_
message: הודעת בדיקה בעברית locale iw_

Language Code: he
Resource Bundle Locale: iw_
message: הודעת בדיקה בעברית locale iw_

如果您删除或重命名 'messages_iw.properties' 资源,您将加载默认的英语资源 'messages.properties'。

然而,在 Java 17 下运行此示例会产生以下输出:

Java version: 17

Language Code: iw
Resource Bundle Locale: he_
message: הודעת בדיקה בעברית locale he_

Language Code: he
Resource Bundle Locale: he_
message: הודעת בדיקה בעברית locale he_

因此,似乎它总是在尝试加载“messages_he.properties”资源。但是,如果您删除或重命名“messages_he.properties”资源,那么“messages_iw.properties”资源就会被加载。

从Java 17开始,似乎不再需要使用希伯来语资源包的命名策略进行欺骗和魔法。只需使用“he” ISO语言代码即可。这比永远不做要好,因为这一直是一个痛点,并引起了很多问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接