Как сделать приложение с действительно многоязычными строками?

каков должен быть лучший подход для создания строк для различных языков? У меня есть эта проблема, я пытаюсь отобразить строки, такие как 'месяц', 'месяцы', 'год', 'годы'. В настоящее время я работаю над 3 языками, которые я знаю: испанский, английский и полировка. Для английского и испанского языка это является прямым. Но например, в полировке 'годы' может стать 'lata' (после номеров 2 - 4) или 'lat' (после чисел от 5). Я думал при добавлении дополнительной строки для этого и создания его пустой на других языках. Однако это заставило меня думать о других языках, которые я не знаю, который мог бы иметь еще больше различий. Который должен быть лучшим подходом в этом случае, если я рассматриваю добавление большего количества языков в будущем?

6
задан Jan S. 28 June 2010 в 21:29
поделиться

4 ответа

Похоже, вам нужен ChoiceFormat , или хотя бы один через MessageFormat :

public static void main(String... args) {
    String[] formats = { 
        // NOTE - In a real app, you'd fetch the format strings from a language,
        // file, not hard-code them in your program. Obviously.
        "{0,number} {0,choice,0#years|1#year|1<years}", // english
        "{0,number} {0,choice,0#años|1#año|1<años}", // spanish
        "{0,number} {0,choice,1#[fewer than 2]|2#lata|4<lat}", // polish
        "{0,number} år", // swedish - singular and plural forms look the same!
    };
    int[] years = {0, 1, 2, 3, 4, 5, 6};
    for (int year : years) {
        for (String format : formats) {
            System.out.println(MessageFormat.format(format, year));
        }
        System.out.println();
    }
}

В вашей программе вы, конечно, получите строка формата из вашего строкового файла.

3
ответ дан 17 December 2019 в 02:21
поделиться

Существует встроенная поддержка "множественного числа", которая не очень хорошо документирована.
Упоминается здесь, и вы можете увидеть это в источниках браузера.

1
ответ дан 17 December 2019 в 02:21
поделиться

Благодаря полученным ответам я пишу 2 решения на базе Android. Первое, что я использовал, было во множественном числе. На первый взгляд, проверяя документы / примеры множественного числа, вы могли подумать, что существует количество = "несколько" (для 2-4 множественного числа), которое проверка в источниках работает только для локали 'cs'. Для остальных локалей работают только «один» и «другой». Итак, в ваших файлах strings.xml:

<plurals name ="years">
    <item quantity="one">1 year</item>
    <item quantity="other"><xliff:g id="number">%d</xliff:g> years</item>
</plurals>

Итак, для полировки у меня было бы:

<plurals name ="years">
    <item quantity="one">1 rok</item>
    <item quantity="other"><xliff:g id="number">%d</xliff:g> lat</item>
</plurals>

Затем я бы добавил в свой код:

int n = getYears(...);
if (Locale.getDefault().getLanguage().equalsIgnoreCase("pl") && n >= 2 && n <= 4) {
   return getString(R.string.years_pl, n);
} else {
   return getResources().getQuantityString(R.plurals.years, n, n);
}

И в моем файле strings.xml для польского языкового стандарта я бы добавил недостающую строку:

<string name="years_pl"><xliff:g id="number">%d</xliff:g> lata</string>

Мое второе решение содержит элемент множественного числа для английского, испанского и других языков, в которых не так много изменений во множественном числе. Затем для остальных языков, в которых есть такие изменения, я бы использовал ChoiceFormat. Итак, в моем коде:

...
private static final int LANG_PL = 0;
// add more languages here if needed
...
String formats[] = {
"{0,number} {0,choice,1#" + getString(R.string.year_1) + "|2#" + getString(R.string.years_2_4) +  "|4<" + getString(R.string.years_lots) +"}", // polish
// more to come
};
...
// Here I would add more for certain languages
    if (Locale.getDefault().getLanguage().equalsIgnoreCase("pl")) {
       return MessageFormat.format(formats[LANG_PL], n);
    } else {
       return getResources().getQuantityString(R.plurals.years, n, n);
    }

Я не знаю, являются ли эти способы наилучшими, но на данный момент или до тех пор, пока Google не сделает что-нибудь лучше, это работает для меня.

2
ответ дан 17 December 2019 в 02:21
поделиться

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

0
ответ дан 17 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: