Возможны ли параметры в strings.xml?

В моем приложении для Android я собираюсь реализовать мои строки с интернационализацией. У меня проблема с грамматикой и способом построения предложений на разных языках.

Например:

"5 минут назад" - английский

"vor 5 Minuten" - немецкий

Могу ли я сделать что-то вроде следующего в strings.xml?

<string name="timeFormat">{0} minutes ago</string>

А потом какая-то магия, как

getString(R.id.timeFormat, dynamicTimeValue)

Такое поведение решит и другую проблему с разными порядками слов.

5 ответов

Решение

Да, просто отформатируйте свои строки в стандарте String.format() путь.

Смотрите метод Context.getString(int, Object...) и Android или Java Formatter документация.

В вашем случае определение строки будет:

<string name="timeFormat">%1$d minutes ago</string>

Если вам нужны две переменные в XML, вы можете использовать:

%1$d text... %2$d или же %1$s text... %2$s для строковых переменных.

Пример:

strings.xml

<string name="notyet">Website %1$s isn\'t yet available, I\'m working on it, please wait %2$s more days</string>

activity.java

String site = "mywebsite";
String days = "11";

//Toast example
String notyet = getString(R.string.notyet, site, days);
Toast.makeText(getApplicationContext(), notyet, Toast.LENGTH_LONG).show();

PS: прочитайте комментарий Лекси ниже

Если вам нужно отформатировать строки с помощью String.format(String, Object...), то вы можете сделать это, поместив аргументы форматирования в строковый ресурс. Например, со следующим ресурсом:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

В этом примере строка формата имеет два аргумента: %1$s - это строка, а%2$d - это десятичное число. Вы можете отформатировать строку с аргументами из вашего приложения следующим образом:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

Если вы хотите больше, посмотрите на: http://developer.android.com/intl/pt-br/guide/topics/resources/string-resource.html

Есть много способов использовать его, и я рекомендую вам ознакомиться с этой документацией о формате строки.

http://developer.android.com/intl/pt-br/reference/java/util/Formatter.html

Но если вам нужна только одна переменная, вам нужно будет использовать%[type], где [type] может быть любым флагом (см. Типы флагов внутри сайта выше). (т. е. "Меня зовут % s" или для задания моего имени UPPERCASE, используйте это "Мое имя % S")

<string name="welcome_messages">Hello, %1$S! You have %2$d new message(s) and your quote is %3$.2f%%.</string>

Hello, ANDROID! You have 1 new message(s) and your quote is 80,50%.

Обратите внимание, что для этого конкретного приложения есть стандартная функция библиотеки, android.text.format.DateUtils.getRelativeTimeSpanString(),

Другие вопросы по тегам