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

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

10
задан SooDesuNe 18 March 2010 в 03:52
поделиться

2 ответа

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

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

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

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

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

27
ответ дан 3 December 2019 в 16:09
поделиться

Применение NSLocalizedString () к строке формата @ "% @" любимая еда% @ -% @ " должно позволить заменить ее правильным порядком слов и притяжениями для местный язык.

-1
ответ дан 3 December 2019 в 16:09
поделиться