How to change locale to use Latin Serbian (instead

2019-05-04 22:12发布

问题:

The Serbian language has Latin and Cyrillic alphabets. In Android's Date and Time Picker widgets, the displayed alphabet for Serbian locales seems to be Cyrillic, as seen here.

I wanted to change the locale so that the android widgets are using the Latin Serbian alphabet.

The current language/country code (yielding Cyrillic) are sr and RS respectively. Therefore, my setLocale function is called as

setLocale("sr", "RS");

This is the part im not sure about - according to localeplanet.com, the local code for latin serbian is sr_Latn_RS. However, I tried both

setLocale("sr_Latn", "RS");
//and
setLocale("sr_Latn_RS", "RS");

neither of which work (no change occurs, default to english). According to the Android documentation, it looks like setLocale expects two letter codes.

The language codes are two-letter lowercase ISO language codes (such as "en") as defined by ISO 639-1. The country codes are two-letter uppercase ISO country codes (such as "US") as defined by ISO 3166-1. The variant codes are unspecified.

So how do I specify a Latin serbian locale code? Or does it not exist?

回答1:

The previous answer works well if you only support Lollipop or above. However, if you're coding in Serbian a lot of your user base probably won't have it. Here's a solution that works for old and new versions.

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;
}


回答2:

For getting latin locale I first used code below.

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

But this solution didn't work on my Android 5.1.1 device (it was still in cyrillic). So I removed setting of region like this:

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

And you have to put your string for serbian resources in b+sr+Latn folder.



回答3:

Please search for your query before posting a question. It may be answered in some other related form.

    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());

i found these two answers suitable to your query android custom date-picker SO and locale from english to french.

EDIT

    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;
        }
    }

I know there will be an efficient way to do it, however you may get the direction that you need to get the list of available locales and get the locale you desire. Hope it helps

EDIT-2 (Final)

you can construct the locale using:

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


回答4:

Can you please use below one ?

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());
        }
    }
}

Note: Replace your YourContryCode in conf.locale = new Locale("sr", "YourContryCode"); line.

Manifest.xml:

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

   ...

</application>

Hope this will help you.