Локализация каскадных или динамических строк - PullRequest
10 голосов
/ 17 марта 2010

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

Ответы [ 2 ]

27 голосов
/ 17 марта 2010

Чтобы указать порядок замещения, используйте %1$@ и %2$@ в качестве спецификаторов формата. Локализованная строка формата может использовать их в любом порядке. Например, скажите, что ваш строковый ключ - «FavoriteFood». Позвоните

NSString *summary =
            [NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil), 
                                       userName, favoriteFood];

Локализация размещает спецификаторы формата везде, где это имеет смысл для его локали. Пример:

"FavoriteFood" = "%2$@ is the favorite food of %1$@";

См. Спецификаторы формата строки

0 голосов
/ 17 марта 2010

Применение NSLocalizedString() к строке формата @"%@'s favorite food is %@" должно позволить заменить его соответствующим порядком слов и использовать для местного языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...