Локализация конкатенированных или динамических строк

Я знаком с использованием 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 %@" должно позволить ему быть заменено надлежащим порядком слов и собственниками для локального языка.