【问题标题】:Convert from 'fr_FR' type language codes to ISO 639-2 language codes从“fr_FR”类型语言代码转换为 ISO 639-2 语言代码
【发布时间】:2011-07-06 13:45:47
【问题描述】:

我需要在 Java 中将 fr_FRen_GBja_JP(表示法语、英语和日语)等字符串转换为它们的 ISO 639-2 表示形式:fre/fraengjpn

您知道符号样式fr_FR 是否符合某个标准?在这方面我没有发现任何东西。

您知道如何将这种表示法转换为 ISO 639-2(3 个字母)语言代码吗?

非常感谢!

更新:我知道 getISO3Language() 方法。而且我也知道我可以通过迭代可用的语言环境来构造像fr_FR 这样的字符串,然后使用 ISO 639-2 3 字母代码进行映射 - 因此,每当我搜索 3 字母代码时,我都能找到在我构建的地图中。问题是我会更适合我的直接解决方案。抱歉,我没有从一开始就解释这一点。

【问题讨论】:

    标签: java localization locale iso


    【解决方案1】:

    你可以在java.util.ResourceBundle.getBundle(String, Locale, ClassLoader)的javadoc中看到{language}_{country}的注解样式,所以使用注解样式也不会那么糟糕。另一方面,还应注意语言标签 具有{language}-{country} 样式(不是下划线'_',而是连字符'-')。详细说明可以参考java.util.Locale的javadoc。

    {language}_{country} 转换为ISO 639-2(3 个字母)代码的简单方法是new Locale(str.substring(0,2)).getISO3Language(),但您似乎正在寻找另一种方法,如下所示:

    String locale = "fr_FR";
    
    try
    {
        // LanguageAlpha3Code is a Java enum that represents ISO 639-2 codes.
        LanguageAlpha3Code alpha3;
    
        // LocaleCode.getByCode(String) [static method] accepts a string
        // whose format is {language}, {language}_{country}, or
        // {language}-{country} where {language} is IS0 639-1 (2-letter)
        // and {country} is ISO 3166-1 alpha2 code (2-letter) and returns
        // a LocaleCode enum. LocaleCode.getLanguage() [instance method]
        // returns a LanguageCode enum. Finally, LanguageCode.getAlpha3()
        // returns a LanguageAlpha3Code enum.
        alpha3 = LocaleCode.getByCode(locale).getLanguage().getAlpha3();
    
        // French has two ISO 639-2 codes. One is "terminology" code
        // (ISO 639-2/T) and the other is "bibliographic" code
        // (ISO 639-2/B). 2 lines below prints "fra" for ISO 639-2/T
        // and "fre" for ISO 639-2/B.
        System.out.println("ISO 639-2/T: " + alpha3.getAlpha3T());
        System.out.println("ISO 639-2/B: " + alpha3.getAlpha3B());
    }
    catch (NullPointerException e)
    {
        System.out.println("Unknown locale: " + locale);
    }
    

    上面的示例可以使用 nv-i18n 国际化包运行。如果您使用的是 Maven,请尝试将以下依赖项添加到您的 pom.xml,

    <dependency>
        <groupId>com.neovisionaries</groupId>
        <artifactId>nv-i18n</artifactId>
        <version>1.1</version>
    </dependency>
    

    或者直接从Maven Central Repository下载nv-i18n的jar。

    nv-i18n 源代码和 javadoc 托管在 GitHub 上。

    来源:https://github.com/TakahikoKawasaki/nv-i18n
    Javadoc:http://takahikokawasaki.github.com/nv-i18n/

    【讨论】:

      【解决方案2】:

      评论太长了,所以...

      你知道符号样式 fr_FR 是否符合某个标准? 我没有在这找到任何东西 尊重。

      前两个字母是语言代码:

      语言参数是有效的 ISO 语言代码。这些代码是 小写,两个字母的代码为 由 ISO-639 定义。

      最后两个字母是国家代码:

      国家参数是有效的 ISO 国家代码。这些代码是 大写,两个字母的代码为 由 ISO-3166 定义。

      所以现在您已经在这方面找到了一些东西,它解释了这个符号对应的标准。

      【讨论】:

      • 为了美化这一点,en_GB 表示在英国说的英语,fr_FR 表示在法国说的法语。 en_US 或 en_EN(我不记得是哪个,甚至可能因供应商而异)表示在美国使用的英语,fr_CA 表示在加拿大使用的法语。
      • @Rich:如果你有 2K+ 的代表,你可以通过编辑来美化我的答案 :)
      • 谢谢大家!实际上,该符号是通过连接符合 2 个标准的 2 个字符串组成的。这种串联肯定不是一个标准。
      • ) 我不喜欢编辑其他人的答案,除非他们有问题(答案,而不是回答者),因为它可以隐藏原始回答者的答案。至少这样你的答案都是你自己的工作!
      • “国家代码”也可以是“地区代号”,如拉丁美洲的“419”,也可以是汉字的“汉斯”等文字代号,但以简体字书写。有关解释,请参见例如developer.apple.com/library/content/documentation/MacOSX/…
      【解决方案3】:

      这在 java.util.Locale 的文档中都有讨论。两个字母的代码也来自 ISO 标准,并且 Locale 有一个方法 getISO3Language() 可以满足您的要求。

      【讨论】:

      • 谢谢!我知道方法。我更新了我的问题,以更清楚地反映我想要什么。
      【解决方案4】:

      创建一个 Locale 对象,然后使用getISO3Language()http://download.oracle.com/javase/1.5.0/docs/api/java/util/Locale.html#getISO3Language()

      String lang="fr", country="FR", convertedLang;
      Locale l = new Locale(lang, country);
      convertedLang= l.getISO3Language(); // should be what you're after
      

      【讨论】:

      • 谢谢!我知道方法。我更新了我的问题,以更清楚地反映我想要什么。
      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2012-06-15
      • 2015-05-30
      • 2011-09-20
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多