可以在NSLocalizedString中使用变量和/或参数吗?

时间:2010-08-10 04:00:50

标签: objective-c localization nslocalizedstring

我已经尝试将变量用作NSLocalizedString的输入参数,但我要回来的只是输入参数。我究竟做错了什么?是否可以使用变量字符串值作为NSLocalized string的索引?

例如,我有一些字符串,我希望显示本地化版本。但是,我想使用变量作为NSLocalizedString的参数,而不是常量字符串。同样,我想在NSLocalizedString的参数中包含格式化元素,因此我将能够使用相同的格式参数检索字符串的本地化版本。我可以执行以下操作:

案例1:变量NSLocalizedstring:

NSString *varStr = @"Index1";
NSString *string1 = NSLocalizedString(varStr,@"");

案例2:格式化的NSLocalizedString:

NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"];

(请注意,变量可以包含任何内容,而不仅仅是一组固定的字符串。)

谢谢!

8 个答案:

答案 0 :(得分:119)

如果您想要的是返回本地版本的“这是Apple / Orange / what”,您需要:

NSString *localizedVersion = NSLocalizedString(([NSString stringWithFormat:@"This is an %@", @"Apple"]), nil);

(即,NSLocalizedString()[NSString stringWithFormat:]的嵌套相反。)

如果您想要的是格式要本地化,而不是替换值,请执行以下操作:

NSString *finalString = [NSString stringWithFormat:NSLocalizedString(@"SomeFormat", nil), @"Apple"];

在您的Localizable.strings

SomeFormat = "This is an %@";

答案 1 :(得分:21)

我只想添加一个非常有用的定义,我在很多项目中使用它。

受到机器人可能性的启发,我已将此功能添加到我的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);

答案 2 :(得分:7)

For swift :

let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)

答案 3 :(得分:4)

事实证明,缺少目标条目是罪魁祸首。只检查我当前的构建目标是否包含Localizable.string文件解决了问题!

答案 4 :(得分:4)

如果您的本地化字符串中有多个变量,则可以使用此解决方案:

在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);

答案 5 :(得分:1)

extension String {
    public var localizedString: String {
        return NSLocalizedString(self, comment: "")
    }

    public func localizedString(with arguments: [CVarArg]) -> String {
        return String(format: localizedString, arguments: arguments)
    }
}

Localizable.string:

"Alarm:Popup:DismissOperation:DeviceMessage" = "\"%@\" will send position updates on a regular basis again.";
"Global:Text:Ok" = "OK";

用法:

let message = "Alarm:Popup:DismissOperation:DeviceMessage".localizedString(with: [name])

let title = "Global:Text:Ok".localizedString

答案 6 :(得分:0)

你的想法应该有效。但是,如果要返回输入参数,则意味着未在Localizable.strings文件中找到输入参数作为键。检查该文件的语法和位置。

答案 7 :(得分:0)

这对我有用:

NSMutableString *testMessage = [NSMutableString stringWithString:NSLocalizedString(@"Some localized text", @"")];
testMessage = [NSMutableString stringWithString:[testMessage stringByAppendingString:someStringVariable]];