如何在Android API中获取IETF BCP47语言代码<21

有没有一个聪明的方法获取 Android中的BCP47语言代码,小于21的API?在API级别21中,Locale.toLanguageTag正是我需要的.你如何在较低的API级别中得到这个结果?

解决方法

Apache Cordova的好人为此开发了一个解决方案,如 here所示.

我将代码修改为以下解决方案:

/**
 * Modified from:
 * https://github.com/apache/cordova-plugin-globalization/blob/master/src/android/Globalization.java
 * 
 * Returns a well-formed ITEF BCP 47 language tag representing this locale string
 * identifier for the client's current locale
 *
 * @return String: The BCP 47 language tag for the current locale
 */
public static String toBcp47Language(Locale loc) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        return loc.toLanguageTag();
    }

    // we will use a dash as per BCP 47
    final char SEP = '-';
    String language = loc.getLanguage();
    String region = loc.getCountry();
    String variant = loc.getvariant();

    // special case for norwegian Nynorsk since "NY" cannot be a variant as per BCP 47
    // this goes before the string matching since "NY" wont pass the variant checks
    if (language.equals("no") && region.equals("NO") && variant.equals("NY")) {
        language = "nn";
        region = "NO";
        variant = "";
    }

    if (language.isEmpty() || !language.matches("\\p{Alpha}{2,8}")) {
        language = "und";       // Follow the Locale#toLanguageTag() implementation
        // which says to return "und" for Undetermined
    } else if (language.equals("iw")) {
        language = "he";        // correct deprecated "Hebrew"
    } else if (language.equals("in")) {
        language = "id";        // correct deprecated "Indonesian"
    } else if (language.equals("ji")) {
        language = "yi";        // correct deprecated "Yiddish"
    }

    // ensure valid country code,if not well formed,it's omitted
    if (!region.matches("\\p{Alpha}{2}|\\p{Digit}{3}")) {
        region = "";
    }

    // variant subtags that begin with a letter must be at least 5 characters long
    if (!variant.matches("\\p{Alnum}{5,8}|\\p{Digit}\\p{Alnum}{3}")) {
        variant = "";
    }

    StringBuilder bcp47Tag = new StringBuilder(language);
    if (!region.isEmpty()) {
        bcp47Tag.append(SEP).append(region);
    }
    if (!variant.isEmpty()) {
        bcp47Tag.append(SEP).append(variant);
    }

    return bcp47Tag.toString();
}

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...