Локализация конкатенированных или динамических строк
Я знаком с использованием NSLocalizedString() для локализации строк, но проблема, которую я имею сегодня, требует немного большей утонченности. Моя ситуация такова:
NSString *userName; //the users name, entered by the user. Does not need localized
NSString *favoriteFood; //the users favorite food, also entered by user, and not needing localized
NSString *summary = [NSString stringWithFormat:@"%@ favorite food is %@", userName, favoriteFood];
Это отлично подходит для английского языка, но не каждый язык использует то же самое слово, что и английский, например, по одному слову перевода с японского на английский будет читать:
Любимая пицца для пиццы UserName
Не говоря уже о том, что это не делает притяжательной на каждом языке.
Какие методы доступны для локализации такого конкатенированного предложения?
ОБНОВЛЕНИЕ ДЛЯ ПРЕИМУЩЕСТВА ДРУГИХ:
@Jon Reed прав, позиционные спецификаторы очень важны для локализации. В документе, который он связывает, содержится только ссылка на то, что они могут использоваться с NSString, NSLog, другими, ссылка на самом деле не говорит, КАК их использовать.
Я нашел эту ссылку, что объясняет это хорошо. Это также объясняет мой вопрос лучше, чем я. По ссылке:
Форматировать строки для printf и sprintf (см. Printf) представляет особую проблему для перевода. Рассмотрим следующее: 1
printf(_"String `%s' has %d characters\n",
string, length(string))) A possible German
перевод для этого может быть:
"%d Zeichen lang ist die Zeichenkette `%s'\n" The problem
должно быть очевидно: порядок спецификации формата различны от оригинала! Хотя gettext может вернуть переведенную строку в runtime, он не может изменить аргумент порядок в вызове printf.
Чтобы решить эту проблему, формат printf спецификаторы могут иметь дополнительный необязательный элемент, который мы называем позиционный спецификатор. Например:
"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the
позиционный спецификатор состоит из целочисленное число, которое указывает, аргумент для использования и $. Подсчеты одна на основе и строка формата сам не включен. Таким образом, в следующий пример: "строка - это первый аргумент и длина (строка) второй:
$ gawk 'BEGIN {
> string = "Dont Panic"
> printf _"%2$d characters live in \"%1$s\"\n",
> string, length(string)
> }'
-| 10 characters live in "Dont Panic"
Ответы
Ответ 1
Чтобы указать порядок подстановки, используйте %[email protected]
и %[email protected]
в качестве спецификаторов формата. Строка локализованного формата может использовать их в любом порядке. Например, скажем, ваш строковый ключ - "FavoriteFood". Вызов
NSString *summary =
[NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil),
userName, favoriteFood];
Локализация помещает спецификаторы формата везде, где это имеет смысл для своей локали. Пример:
"FavoriteFood" = "%[email protected] is the favorite food of %[email protected]";
См. Спецификаторы формата строки
Ответ 2
Применение NSLocalizedString()
к строке формата @"%@ favorite food is %@"
должно позволить ему быть заменено надлежащим порядком слов и собственниками для локального языка.