Почему 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 шт):

Автор решения: Yura Ivanov

Если вы создаете 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 решит.

→ Ссылка