Почему plurals для слова автомобиль отрабатывают некорректно?
Есть вот такие plurals, который лежит в файле строк:
<plurals name="cars">
<item quantity="zero">%d автомобилей</item>
<item quantity="one">%d автомобиль</item>
<item quantity="two">%d автомобиля</item>
<item quantity="few">%d автомобиля</item>
<item quantity="many">%d автомобилей</item>
<item quantity="other">%d автомобилей</item>
</plurals>
Получаю строку вот так:
resources.getQuantityString(R.plurals.cars, 2, 2)
Приходит - 2 автомобилей (other).
Если не прописать other приложение падает:
android.content.res.Resources$NotFoundException: Plural resource ID #0x7f110001 quantity=2 item=other
Ответы (1 шт):
Если вы создаете plurals в values/strings.xml, то будут применяться правила склонения для языка, который установлен в системе. Например, если у вас в телефоне (или эмуляторе) установлен русский язык, то будут работать правила:
- one(1,21,31..),
- few(2-4,22-24,...),
- many (0,5-20,25-30,...)
Если английский, то:
- one (1)
- other (0, >1)
Для французского:
- one (0,1)
- other (>1)
Таким образом в values/strings.xml plurals будут зависеть от языка системы и абсолютно красиво не будет, пока вы не сделаете локализацию для всех языков.
Самый простой вариант - это явно переключать локаль на русский язык внутри приложения:
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(updateLocale(base));
applyOverrideConfiguration(base.getResources().getConfiguration()); // тут может бросить IllegalStateException, на всякий отловить
}
private static Context updateLocale(Context context){
Locale ruLocale = new Locale("ru");
Locale.setDefault(ruLocale);
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(ruLocale);
configuration.setLayoutDirection(ruLocale);
return context.createConfigurationContext(configuration);
}
}
При данном подходе отдельные ресурсы для других языков не нужны, в т.ч. для русского. Достаточно values/strings.xml.
Ну и дальше развить данную мысль, когда и если все-таки появится частичная локализация, то явно перекидывать локаль с неизвестной, например в en или в ru. Тогда все ресурсы, в частности plurals будут работать так, как вы ожидаете, а не так как android решит.