【问题标题】:Converting language names to ISO 639 language codes将语言名称转换为 ISO 639 语言代码
【发布时间】:2015-06-20 08:35:52
【问题描述】:

我需要将“匈牙利语”、“英语”等语言名称转换为 ISO 639 代码。 ISO 639-6 是最好的,但 ISO 639-2 已经足够好了。实现这一目标的最佳方法是什么?

我应该将英语转换为语言环境并使用 getLanguage() 获取语言?如果这是唯一的方法,我如何将像“English”这样的字符串转换为 Java 语言环境?

我的目标是使用 ISO 639 代码存储图书语言信息。

【问题讨论】:

  • 到目前为止你尝试过什么?我知道 java.util.Locale 对此有一些基本的支持
  • 我创建了一个增强的 ISO 639 枚举(以及其他 ISO 枚举)。代码可在此处获得:github.com/scout-2766/Iso4J/blob/master/README.md(免费)

标签: java locale iso iso-639-2


【解决方案1】:
    for (Locale locale : Locale.getAvailableLocales()) {
        System.out.println("" + locale
                + "; display: " + locale.getDisplayLanguage()
                + "; name: " + locale.getDisplayName()
                + "; lang: " + locale.getLanguage()
                + "; iso3: " + locale.getISO3Language());
    }

这将找到大约 150 个语言环境,其中 ISO3 是三个字母的变体,而不是旧的两个字母的 getLanguage。

显示语言是纯语言名称,而显示名称则带有国家“德语(奥地利)”。

所以

public String toISO3(String name) {
    for (Locale locale : Locale.getAvailableLocales()) {
        if (name.equals(locale.getDisplayLanguage()) {
            return locale.getISO3Language();
        }
    }
    throw new IllegalArgumentException("No language found: " + name);
}

对于显示方法,有一个可选的 Locale 参数,可以显式设置为 Locale.ENGLISH。

【讨论】:

  • 请注意,这种方法为每对语言环境匹配一个语言名称,并且不捕获诸如“अंग्रेजी”和“अँग्रेज़ी”等变体(两者都是印地语中说英语的方式)。
【解决方案2】:

您可以通过将语言名称的正则表达式传递给LanguageAlpha3Code.findByName(String)(在nv-i18n 库中)来获取ISO 639-2 代码列表。

以下示例代码是将给定语言名称转换为相应 ISO 639-2 代码的命令行工具。

import java.util.List;
import com.neovisionaries.i18n.LanguageAlpha3Code;

public class To639_2
{
    public static void main(String[] args)
    {
        // For each language name given on the command line.
        for (String languageName : args)
        {
            // Get a list of ISO 639-2 codes (alpha-3 codes)
            // whose language name matches the given pattern.
            List<LanguageAlpha3Code> list
                = LanguageAlpha3Code.findByName(languageName);

            // Print the language and the ISO 639-2 code.
            System.out.format("%s => %s\n", languageName,
                (list.size() != 0) ? list.get(0) : "");
        }
    }
}

执行示例:

$ java -cp nv-i18n-1.14.jar:. To639_2 匈牙利语英语 匈牙利语 => hun 英语 => 英语

【讨论】:

  • 我相信要获得 ISO 639-2,您必须将 list.get(0) 替换为 list.get(0)..getAlpha3B(),否则您将获得 ISO3,就像在 Locale 中的 getISO3Language() 中一样。
【解决方案3】:
/**
 * This method is to get the language code from given language name
 * as locale can't be instantiate from a language name.
 *
 * You can specify which language you are at : Locale loc=new Locale("en") use whatever your language is
 * 
 * @param lng -> given language name eg.: English
 * @return -> will return "eng"
 *
 * Wilson M Penha Jr.
 */
private String getLanguageCode(String lng){
    Locale loc = new Locale("en");
    String[] name = loc.getISOLanguages(); // list of language codes

    for (int i = 0; i < name.length; i++) {
        Locale locale = new Locale(name[i],"US");
        // get the language name in english for comparison
        String langLocal = locale.getDisplayLanguage(loc).toLowerCase();
        if (lng.equals(langLocal)){
            return locale.getISO3Language();
        }
    }
    return "unknown";
}

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 2015-05-30
    • 2012-06-15
    • 1970-01-01
    • 2013-02-22
    • 2015-09-20
    • 2020-07-14
    • 2012-10-06
    相关资源
    最近更新 更多