iOS локализация, ярлык с номером и словом вместе - PullRequest
2 голосов
/ 02 февраля 2012

Я хочу локализовать свою игру. некоторые из моих ярлыков похожи на [@ "Score:% i", оценка], и оценка может быть любым числом. так я могу все еще использовать локализацию файла строк? это то, что я делаю в настоящее время, но много работы

    CCLabelTTF* bestLabelWord = [Helper createLocalizedLabelWithStringUpperCase:@"BEST" color:ccBLACK];
    CCLabelTTF* bestLabelNumber = [Helper createUnlocalizedLabelWithString:[NSString stringWithFormat:@"%i", bestScore] color: ccBLACK];
    bestLabelWord.anchorPoint = ccp(0, 0.5f);
    bestLabelNumber.anchorPoint = ccp(0, 0.5f);
    bestLabelWord.position = ccp(menuPosX, menuPosY2);
    bestLabelNumber.position = ccp(menuPosX + bestLabelWord.contentSize.width + 5, menuPosY2);
    [self addChild:bestLabelWord z:kZLabel];
    [self addChild:bestLabelNumber z:kZLabel];

здесь я разделяю @ "Score" и @ "% i", делю 2 метки (слово и число) и размещаю их отдельно так как я могу поместить их в один ярлык? я могу поставить как "NSString stringWithFormat" в файле localization.strings?

1 Ответ

2 голосов
/ 02 февраля 2012

Да, вы можете сделать это. Это выглядит так (без компиляции; надеюсь, опечаток нет):

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...