Да, вы можете сделать это. Это выглядит так (без компиляции; надеюсь, опечаток нет):
NSString *scoreFormat = NSLocalizedString(@"Score: %d", @"Score format");
NSString *scoreString = [NSString stringWithFormat:scoreFormat, bestScore];
Ваш файл строк для этого на английском языке будет:
/* Score format */
"Score: %d" = "Score: %d";
Нет никакой разницы между %d
и %i
. Они оба указаны в стандарте. Лично я предпочитаю выражать, что это «десятичное число» (вместо %x
шестнадцатеричное), а не «целое число» (против %f
число с плавающей запятой). Но это не имеет значения.
Вы должны включить весь оператор формата в файл строк. Вы локализуете весь оператор формата Score: %d
. Основанием для этого является разрешение языков, где порядок может отличаться. Например, если бы существовал язык с правильным переводом "%d score"
или язык, который имеет смысл, вы должны были бы сказать эквивалент Score: %d points
или Score: %d number
.
Если вам не нужна такая локализация, и вы всегда будете ставить двоеточие после метки и цифру после нее, независимо от языка, вы можете локализовать только метку, как в исходном коде, или вот так:
NSString *localizedLabel = NSLocalizedString(@"Score", @"Score");
NSString *scoreString = [NSString stringWithFormat:@"%@: %d", localizedLabel, bestScore];
Вы должны избегать вызова NSLocalizedString
с переменным параметром, как вы предлагаете. Это сбивает с толку и может помешать использовать genstrings
для создания вашего файла строк. Тем не менее, следующий код не является проблемой:
NSString * const kScoreLabelKey = @"Score";
NSString * const kPriceLabelKey = @"Price";
NSString *GetLocalizedStringForKeyValue(NSString *key, NSInteger value)
{
NSString *label = [[NSBundle mainBundle] localizedStringForKey:key value:nil table:@"Labels"];
NSString *valueLabel = [NSString stringWithFormat:@": %d", value];
return [label stringByAppendingString:valueLabel];
}
...
NSString *label = GetLocalizedStringForKeyValue(kScoreLabelKey, bestScore);
...
(In Labels.strings):
"Score" = "Score";
"Price" = "Price";
На что обратить внимание:
- Я создал отдельный файл строк для этого с именем
Labels.strings
. Это не повлияет на использование genstrings
и основного Localizeable.string.
- Я использовал строковые константы для ключей. Это помещает все строки, используемые в одном месте вверху файла, что упрощает проверку по
Labels.strings
.