Как изменить язык, чтобы использовать латинский сербский (вместо кириллического сербского)

В сербском языке есть латинский и кириллица. В виджетах Android «Выбор даты и времени» отображаемый алфавит для сербских локалей выглядит кириллицей, как показано здесь.

введите описание изображения здесь

Я хотел изменить локаль, чтобы виджеты Android использовали латинский сербский алфавит.

Текущий код языка / страны (т.е. кириллица) - sr и RS соответственно. Поэтому моя функция setLocale называется

setLocale("sr", "RS");

Это та часть, в которой я не уверен - согласно localeplanet.com, местный код латинского сербского языка - sr_Latn_RS. Однако я попробовал оба

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

ни что не работает (изменений не происходит, по умолчанию английский). Согласно документации Android, похоже, что setLocale ожидает двухбуквенных кодов.

Коды языков представляют собой двухбуквенные коды языков в нижнем регистре ISO (например, «en»), как определено в ISO 639-1. Коды стран представляют собой двухбуквенные коды стран ISO в верхнем регистре (например, «США»), как определено в ISO 3166-1. Коды вариантов не указаны.

Итак, как мне указать латинский сербский код локали? Или его нет?


person Eric S.    schedule 08.03.2016    source источник


Ответы (4)


Предыдущий ответ работает хорошо, если вы поддерживаете только Lollipop или выше. Однако, если вы пишете на сербском языке, у многих из вашей пользовательской базы этого, вероятно, не будет. Вот решение, которое работает для старых и новых версий.

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;
}
person CGuess    schedule 05.12.2017

Для получения латинского языкового стандарта я сначала использовал приведенный ниже код.

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.

person Gregor Ažbe    schedule 31.01.2019

Пожалуйста, выполните поиск по вашему запросу, прежде чем размещать вопрос. На него можно ответить в другой связанной форме.

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

я нашел эти два ответа, подходящие для вашего запроса пользовательского выбора даты для Android SO и языковой стандарт с английского на французский.

ИЗМЕНИТЬ

    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);
person Mohsin Khan    schedule 17.03.2016
comment
ха-ха, хорошо, название немного вводит в заблуждение, но я провожу исследование, чтобы помочь вам найти ответ - person Mohsin Khan; 19.03.2016
comment
готово, Эрик, вы можете использовать последнее редактирование. Извините за так много правок - person Mohsin Khan; 19.03.2016
comment
Последний кусок кода требуется API ›= 21, но он мне нужен для API 19 ... Есть ли обходной путь? - person clzola; 02.08.2017
comment
@cizola Я только что добавил решение. Возможно, вы захотите кэшировать его, если вы много используете локаль, но вы просто устанавливаете его один раз или что-то в этом роде, это не должно быть проблемой. - person CGuess; 06.12.2017

Не могли бы вы использовать один ниже?

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

Примечание. Замените YourContryCode в строке conf.locale = new Locale("sr", "YourContryCode");.

Manifest.xml:

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

   ...

</application>

Надеюсь, что это поможет вам.

person Hiren Patel    schedule 14.03.2016