Я знаком с использованием 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
Не говоря уже о том, что, не делает притяжательное на каждом языке.
Какие методы доступны для локализации этого типа связанного предложения?
ОБНОВЛЕНИЕ В ПОЛЬЗУ ДРУГИХ: @Jon Reed прав, позиционные спецификаторы, очень важны для локализации. Документ, который он связал только, содержит ссылку на то, что они могут использоваться с NSString, NSLog, другие, ссылка действительно не говорит, КАК использовать их.
Я нашел эту ссылку, которая объясняет это хорошо. Это также объясняет мой вопрос лучше, чем я. Из ссылки:
Строки формата для printf и sprintf (см. Printf) представляют специальную проблему для перевода. Рассмотрите following: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.
Решить эту проблему, 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 $ @
и % 2 $ @
в качестве спецификаторов формата. Строка локализованного формата может использовать их в любом порядке. Например, скажем, ваш строковый ключ - «FavoriteFood». Вызов
NSString *summary =
[NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil),
userName, favoriteFood];
Локализация размещает спецификаторы формата везде, где это имеет смысл для его локали. Пример:
"FavoriteFood" = "%2$@ is the favorite food of %1$@";
Применение NSLocalizedString ()
к строке формата @ "% @" любимая еда% @ -% @ "
должно позволить заменить ее правильным порядком слов и притяжениями для местный язык.