Как сделать приложение с действительно многоязычными строками? - PullRequest
6 голосов
/ 29 июня 2010

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

Ответы [ 4 ]

3 голосов
/ 29 июня 2010

Звучит так, как будто вы хотите 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();
    }
}

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

2 голосов
/ 01 июля 2010

Благодаря полученным ответам я пишу 2 решения на базе Android.Первый, который я использовал, имел множественное число.На первый взгляд, проверяя документы / примеры Plurals, вы можете подумать, что существует количество «немногих» (для 2-4 множественных чисел), проверка которых у sources работает только для локали '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 не сделает что-то лучше, это работает для меня.

1 голос
/ 29 июня 2010

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

0 голосов
/ 29 июня 2010

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

...