Я знаком с использованием 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:@"%@'s favorite food is %@", userName, favoriteFood];
Это прекрасно работает для английского языка, но не все языки используют тот же порядок слов, что и английский, например, пословный перевод той же буквы с японского на английский будет выглядеть так:
Пицца любимой еды UserName -
Не говоря уже о том, что это не делает притяжательным в каждом языке.
Какие методы доступны для локализации этого типа составного предложения?
ОБНОВЛЕНИЕ ДЛЯ ВЫГОДЫ ДРУГИХ:
@Джон Рид прав, позиционные спецификаторы очень важны для локализации. Документ, на который он ссылается, содержит только ссылку на то, что они могут использоваться с 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
может вернуть переведенную строку в
во время выполнения не может изменить аргумент
заказ в звонке на принтф.
Чтобы решить эту проблему, формат 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"