Подтвердить что ты не робот

Получить строку из локали по умолчанию, используя строку в определенном языке

Хорошо, я знаю, что звук названия сумасшедший:)

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

Например, у меня есть массив:

  • Яблоки
  • Апельсины
  • Персики

У меня есть локализованный массив:

  • Яблоки
  • Апельсины
  • Персики

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

Думаю, мой ответ сводится к тому, как сделать getString() и пройти локаль? Или как мне получить массив в определенной локали?

4b9b3361

Ответ 1

Вы должны идентифицировать элемент чем-то другим, например идентификатором или даже английским именем.

Невозможно получить исходную строку для данной локализованной строки. Одна из причин заключается в том, что локализация строк не является транзитивной функцией, но есть много других причин, почему это не хорошее направление.

Ответ 2

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

Configuration conf = getResources().getConfiguration();
conf.locale = new Locale("pl");
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources resources = new Resources(getAssets(), metrics, conf);
/* get localized string */
String str = resources.getString(R.string.hello);

Я надеюсь, что это также относится к другим типам ресурсов, таким как массив, поэтому достаточно заменить "pl" на "en"...

Ответ 3

Если вы используете JB 2.2.x или выше (в основном API >= 17), вы можете использовать createConfigurationContext do:

public String translate(Locale locale, int resId) {  
    Configuration config = new Configuration(context.getResources().getConfiguration()); 
    config.setLocale(locale);   
    return context.createConfigurationContext(config).getText(resId);
}

Ответ 4

Эта "силовая" локализация не будет работать, если ваши устройства не имеют локали, которые вы вынуждаете.

Невозможно доказать это "просто так", но сейчас я боюсь такой проблемы, когда я заставляю ресурс быть в локали/языке, ведьма не установлена ​​на устройстве (на Android 2.3.3), и все еще получая строки из ресурсов value-en (english).

На других устройствах, где вы устанавливаете локаль (но не обязательно устанавливаете в качестве текущей локали), вы получите правильные ресурсы.

Ответ 5

У этого нет побочных эффектов: API17 и выше

Configuration config = new Configuration(context.getResources().getConfiguration()); 
config.setLocale(locale);   
return context.createConfigurationContext(config).getResources();

Ответ 6

Я считаю, что это безопасный способ (не касаясь текущей конфигурации):

Configuration conf = new Configuration();
conf.setToDefaults();   // That will set conf.locale to null (current locale)
// We don't want current locale, so modify it
conf.locale = new Locale("");   // Or conf.locale = Locale.ROOT for API 9+
                                // or conf.setLocale(Locale.ROOT) for API 14+
// Since we need only strings, we can safely set metrics to null
Resources rsrcDflt = new Resources(getAssets(), null, conf);
String apples = srcDflt.getString(R.string.apples); // Got it at last!

Ответ 7

У меня была такая же проблема с ListPreference, которая сохраняла настройки "state name" и "body figure". ListPreference получает свои значения и записи из массива, сохраненного в локализованных папках "значения". Значения в списке были одинаковыми (английский), но записи были локализованы (английский и иврит).

Наконец, я использовал следующий код:

public void OnSharedPreferenceChanged (SharedPreferences sharedPreferences, String key)
{
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Preference pref = settings.findPreference(key);
    pref.setSummary(sharedPreferences.getString(key, ""));

    if (key.equalsIgnoreCase(PREF_STATE) 
        || key.equalsIgnoreCase(PREF_BODY_FIGURE))
    {
        editor.putString(key, ((ListPreference) pref).getValue());
        editor.commit();
    }
}

Таким образом, предпочтение всегда отображало локализованную строку пользователю (как сводку), но сохраняло английскую строку в памяти предпочтений, которая была в конечном итоге отправлена ​​на сервер.

Ответ 8

Я объединил два подхода, необходимых для работы на всех версиях Android. См. мой ответ здесь.

Ответ 9

Не было бы проще с одной строкой кода?

String.format(Locale("en"), getString(R.string.your_string))

И у вас есть доступ к строкам из ваших переводов без каких-либо изменений в конфигурации и других волшебных вещей.