Ответ 1
Оказывается, что недостающая целевая запись виновата. Просто проверяя, что моя текущая цель сборки включает файл Localizable.string, решила проблему!
Я попытался использовать переменную в качестве входного параметра для NSLocalizedString, но все, что я возвращаю, - это входной параметр. Что я делаю не так? Можно ли использовать переменное строковое значение в качестве индекса для строки NSLocalized?
Например, у меня есть несколько строк, в которых я хочу, чтобы отображались локализованные версии. Однако я хотел бы использовать переменную как параметр для NSLocalizedString, а не константную строку. Аналогично, я хотел бы включить элементы форматирования в параметр для NSLocalizedString, поэтому я смог бы получить локализованную версию строки с теми же параметрами форматирования. Могу ли я сделать следующее:
Случай 1: переменная NSLocalizedstring:
NSString *varStr = @"Index1";
NSString *string1 = NSLocalizedString(varStr,@"");
Случай 2: форматированный NSLocalizedString:
NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"];
(Обратите внимание, что переменная может содержать что угодно, а не только фиксированный набор строк.)
Спасибо!
Оказывается, что недостающая целевая запись виновата. Просто проверяя, что моя текущая цель сборки включает файл Localizable.string, решила проблему!
Если вы хотите вернуть локализованную версию "Это Apple/Orange/whatever", вам нужно:
NSString *localizedVersion = NSLocalizedString(([NSString stringWithFormat:@"This is an %@", @"Apple"]), nil);
(I.e., вложение NSLocalizedString()
и [NSString stringWithFormat:]
отменено.)
Если вы хотите, чтобы формат был локализованным, но не замещаемым значением, сделайте следующее:
NSString *finalString = [NSString stringWithFormat:NSLocalizedString(@"SomeFormat", nil), @"Apple"];
И в вашем Localizable.strings
:
SomeFormat = "This is an %@";
Я просто хочу добавить одно очень полезное определение, которое я использую во многих своих проектах.
Вдохновленный возможностью андроидов, я добавил эту функцию в мой файл header prefix
:
#define NSLocalizedFormatString(fmt, ...) [NSString stringWithFormat:NSLocalizedString(fmt, nil), __VA_ARGS__]
Это позволяет определить локализованную строку следующим образом:
"ExampleScreenAuthorizationDescriptionLbl"= "I authorize the payment of %@ to %@.";
и его можно использовать с помощью:
self.labelAuthorizationText.text = NSLocalizedFormatString(@"ExampleScreenAuthorizationDescriptionLbl", self.formattedAmount, self.companyQualifier);
Если в вашей локализованной строке имеется более одной переменной, вы можете использовать это решение:
В Localizable.strings
"winpopup" = "#name# wins a #type# and get #points# points(s)";
И используйте stringByReplacingOccurrencesOfString для вставки значений
NSString *string = NSLocalizedString(@"winpopup", nil); //"#name# wins a #type# and get #points# points(s)"
NSString *foo = [string stringByReplacingOccurrencesOfString:@"#name#" withString:gameLayer.turn];
NSString *fooo = [foo stringByReplacingOccurrencesOfString:@"#type#" withString:winMode];
NSString *msg = [fooo stringByReplacingOccurrencesOfString:@"#points#" withString:[NSString stringWithFormat:@"%i", pkt]];
NSLog(@"%@", msg);
Для быстрого:
let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)
Ваши идеи должны работать. Но если вы возвращаете входной параметр, это означает, что входной параметр не был найден как ключ в вашем файле Localizable.strings. Проверьте синтаксис и расположение этого файла.