Я знаком с использованием 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"