Android 如何更改语言环境以使用拉丁语塞尔维亚语(而不是西里尔语塞尔维亚语)

Android 如何更改语言环境以使用拉丁语塞尔维亚语(而不是西里尔语塞尔维亚语),android,locale,country-codes,Android,Locale,Country Codes,塞尔维亚语有拉丁字母和西里尔字母。在Android的日期和时间选择器小部件中,显示的塞尔维亚地区的字母表似乎是西里尔语,如图所示 我想更改区域设置,以便android小部件使用拉丁塞尔维亚字母表 当前的语言/国家代码(产生西里尔语)分别为sr和RS。因此,我的setLocale函数被称为 setLocale("sr", "RS"); 这是我不确定的部分-根据,拉丁塞尔维亚语的当地代码是sr\u Latn\u RS。然而,我两个都试过了 setLocale("sr_Latn", "RS");

塞尔维亚语有拉丁字母和西里尔字母。在Android的日期和时间选择器小部件中,显示的塞尔维亚地区的字母表似乎是西里尔语,如图所示

我想更改区域设置,以便android小部件使用拉丁塞尔维亚字母表

当前的语言/国家代码(产生西里尔语)分别为
sr
RS
。因此,我的setLocale函数被称为

setLocale("sr", "RS");
这是我不确定的部分-根据,拉丁塞尔维亚语的当地代码是
sr\u Latn\u RS
。然而,我两个都试过了

setLocale("sr_Latn", "RS");
//and
setLocale("sr_Latn_RS", "RS");
这两项都不起作用(没有变化,默认为英语)。根据Android文档,setLocale似乎需要两个字母代码

语言代码是两个字母小写的ISO语言代码(例如 ISO 639-1中定义的“en”)。国家代码是两个字母 ISO 3166-1定义的大写ISO国家代码(如“US”)。 变量代码未指定


那么,如何指定拉丁塞尔维亚语言环境代码呢?或者它不存在吗?

您能使用下面的一个吗

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Resources res = this.getResources();
        Configuration conf = res.getConfiguration();
        boolean isLatinAlphabet = PreferenceManager.getDefaultSharedPreferences(this);

        if(conf.locale.getLanguage().equals("sr") && isLatinAlphabet) {
            conf.locale = new Locale("sr", "YourContryCode");
            res.updateConfiguration(conf, res.getDisplayMetrics());
        }
    }
}
注意:
conf.locale=new locale(“sr”,“YourContryCode”)中替换您的
YourContryCode

Manifest.xml

<application
        android:name=".MyApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/application_name"
        android:theme="@style/AppTheme">

   ...

</application>

...

希望这将对您有所帮助。

在发布问题之前,请搜索您的查询。可以用其他相关形式回答

    Locale newLocale = new Locale("sr","RS");
    Configuration config = new Configuration();
    config.setLocale(newLocale);
    // using this to reference my Activity
    this.getBaseContext().getResources().updateConfiguration(config, this.getBaseContext().getResources().getDisplayMetrics());
我发现这两个答案适合你的问题 和

编辑

    Locale[] locales = Locale.getAvailableLocales();
    for(Locale locale : locales){
        if(locale.getCountry().equalsIgnoreCase("RS")
                && locale.getScript().equalsIgnoreCase("Latn"))
        {
            Configuration config = new Configuration();
            config.setLocale(locale);
            // using this to reference my Activity
            this.getBaseContext().getResources().updateConfiguration(config, this.getBaseContext().getResources().getDisplayMetrics());
            break;
        }
    }
我知道会有一个有效的方法来做这件事,但是你可能会得到你需要的方向,以获得可用区域设置的列表和你想要的区域设置。希望能有帮助

编辑-2(最终版)

您可以使用以下方法构造区域设置:

Locale locale = new Locale.Builder().setLanguage("sr").setRegion("RS").setScript("Latn").build();
setLocale(locale);

如果您只支持棒棒糖或更高版本,则前面的答案效果良好。然而,如果你用塞尔维亚语编码,你的许多用户群可能不会有它。这里有一个适用于新旧版本的解决方案

private static Locale serbianLatinLocale(){

    Locale locale = null;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        for (Locale checkLocale : Locale.getAvailableLocales()) {
            if (checkLocale.getISO3Language().equals("srp") && checkLocale.getCountry().equals("LATN") && checkLocale.getVariant().equals("")) {
                locale = checkLocale;
            }
        }
    } else {
        locale = new Locale.Builder().setLanguage("sr").setRegion("RS").setScript("Latn").build();
    }

    return locale;
}
私有静态语言环境塞尔维亚拉丁语言环境(){
Locale=null;
if(Build.VERSION.SDK\u INT
为了获得拉丁语言环境,我首先使用了下面的代码

new Locale.Builder().setLanguage("sr").setRegion("RS").setScript("Latn").build();
但是这个解决方案在我的Android 5.1.1设备上不起作用(它仍然是西里尔文)。所以我删除了区域设置,如下所示:

new Locale.Builder().setLanguage("sr").setScript("Latn").build();

你必须将塞尔维亚资源的字符串放在b+sr+Latn文件夹中。

哈哈,好吧,标题有点误导,但我正在进行研究,以帮助你找到答案。Eric,你可以使用最后一次编辑。抱歉这么多的编辑谢谢你,我会试试这个。最后的代码和平需要API>=21,但我需要它的API 19。。。有什么解决办法吗?@cizola我刚刚添加了一个解决方案。如果你经常拉语言环境,你可能想缓存它,但是你只需要设置一次或者其他什么,这不应该是一个问题。