Как получать список языков, которые определены в App в Android?

Например приложение, что у нас она были ресурсы на различных языках

values/=> están en ingles (los defecto de la app)
values-es/ => están en español
values-it/ => están en italiano
etc...

Если у нас есть зона конфигурации, где пользователь, смог выбирать с spinner язык app

automático => seria el por defecto que está definido al dispositivo
español
italiano

Как было бы возможно создавать array (key, я оценил), чтобы заселять контент для селектора языка.

А именно, что разорил их автоматически исходя из ресурсов, которые мы считаем установленными в app.

оказанный пример

default = automático
en = inglés
es = español
it = italiano

Я смотрю на себя следующее get-the-applications-resources-languages

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    Resources r = getResources();
    Configuration c = r.getConfiguration();
    String[] loc = r.getAssets().getLocales();
    for (int i = 0; i < loc.length; i++) {
        //Log.d("LOCALE", i + ": " + loc[i]);

        c.locale = new Locale(loc[i]);
        Resources res = new Resources(getAssets(), metrics, c);
        String s1 = res.getString(R.string.title_itinerary);
        c.locale = new Locale("");
        Resources res2 = new Resources(getAssets(), metrics, c);
        String s2 = res2.getString(R.string.title_itinerary);

        if(!s1.equals(s2)){
            Log.d("DIFFERENT LOCALE", i + ": "+ s1+" "+s2 +" "+ loc[i]);
        }
    }

Возврати DIFFERENT LOCALE es, it но en он это не обнаруживает.

1
задан 23.05.2017, 15:39
1 ответ

Приспосабливая немного одного из ответов SO, я создал функцию getAppLanguages что возвращает список языков, которые определяются в App, но нужно определять первого всего, кого мы определяем по умолчанию в App.

public static Map<String, String> getAppLanguages(Context context, String appDefaultLang) {
    Map<String, String> listAppLocales = new LinkedHashMap<>();

    listAppLocales.put("default", "Auto");

    DisplayMetrics metrics = new DisplayMetrics();
    Resources res = context.getResources();
    Configuration conf = res.getConfiguration();
    String[] listLocates = res.getAssets().getLocales();

    for (String locate : listLocates) {
        Log.i("Member name: ",locate);
    }


    for (String locate : listLocates) {
        conf.locale = new Locale(locate);
        Resources res1 = new Resources(context.getAssets(), metrics, conf);
        String s1 = res1.getString(R.string.title_itinerary);
        String value = String.format(Locale.getDefault(),"%s (%s)",
                ucfirst(conf.locale.getDisplayName()),
                conf.locale.getLanguage()
        );

        conf.locale = new Locale("");
        Resources res2 = new Resources(context.getAssets(), metrics, conf);
        String s2 = res2.getString(R.string.title_itinerary);

        if (!s1.equals(s2)) {
            //Log.d("DIFFERENT LOCALE", i + ": "+ s1+" "+s2 +" "+ loc[i]);
            listAppLocales.put(locate, value);
        } else if (locate.equals(appDefaultLang)) {
            listAppLocales.put(locate, value);
        }
    }
    return listAppLocales;
}

public static String ucfirst(String subject) {
    if (!subject.isEmpty()) {
        return Character.toUpperCase(subject.charAt(0)) + subject.substring(1);
    } else {
        return null;
    }

Ваше использование

Если базовый язык приложения а именно назначенный по умолчанию английский, мы должны определять это так.

Map<String,String> listAppLanguages = getAppLanguages(this,"en);

Данные, которых он возвратит:

default:Auto
en:English
es:Spanish
it:Italian
1
ответ дан 24.11.2019, 14:21
  • 1
    должен будь быть getAppLanguages (this, " en"); =) – Jorgesys♦ 18.05.2016, 00:32
  • 2
    твой вопрос refer и # 237; чтобы в получать языки, определенные в folders например: оцени / values-es / values-it / с этим они получаются? – Jorgesys♦ 18.05.2016, 00:33
  • 3
    sip @Elenasys, получать список того, что определяется внутри, если тебе приходит в голову способ м и # 225; s простой, потому что этот м и # 233; совсем давайте говорить, что он не заканчивается у меня слежания. – Webserveis 18.05.2016, 00:35