能否在 NSLocalizedString 中使用变量和/或参数?

61
我尝试将变量作为NSLocalizedString的输入参数,但是我只得到了输入参数本身。我做错了什么?是否可以使用变量字符串值作为NSLocalizedString的索引?
例如,我有一些字符串想要显示本地化版本。但是,我希望使用变量作为NSLocalizedString的参数,而不是常量字符串。同样,我想在NSLocalizedString的参数中包含格式化元素,这样我就可以检索具有相同格式化参数的本地化字符串版本。我能做到以下几点吗:
情况1:可变NSLocalizedString:
NSString *varStr = @"Index1";
NSString *string1 = NSLocalizedString(varStr,@"");

情况2:格式化的NSLocalizedString:

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

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

谢谢!

8个回答

127
如果您想返回“这是苹果/橙子/其他东西”的本地化版本,则需要使用以下代码:

如果您想返回“这是苹果/橙子/其他东西”的本地化版本,则需要使用以下代码:

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 %@";

是的,但变量可以包含任何东西,而不仅仅是“苹果”或“橙子”。因此我需要保持灵活性。 - futureelite7
1
让我附加我的答案以防万一。 - Wevah
非常感谢你,附上的答案正是我所寻找的。希望你能尽快获得一个“接受”复选框。 - RonLugge
您没有考虑到情况1:“在NSLocalizedString中使用变量和/或参数?”。您不能这样做,应该只使用const字符串,因为本地化字符串应该在运行时之前进行翻译,而字符串变量在运行时可以是任何值。 - Sanich

24

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

受到 Android 的启发,我将此函数添加到我的 header 前缀 文件中:

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

11

针对Swift:

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

6
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

这个扩展程序可以大大清理代码! - JoeGalind

4
事实证明,缺少目标条目是造成问题的原因。只需检查我的当前构建目标是否包含Localizable.string文件即可解决问题!

2
如果您在本地化字符串中有多个变量,可以使用以下解决方案:
在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);

49
这似乎很复杂。你可以使用带编号的占位符: "exampleKey" = "%1$@已经购买了%3$d个苹果和%2$d个橘子。" [NSString stringWithFormat:NSLocalizedString(@“exampleKey”,nil),@“Markus”,4,3] 这将输出:Markus已经购买了3个苹果和4个橘子。 - denbec
9
然后去向全球的翻译人员解释这些类型的加密字符串。 - zeiteisen
必须使用%1或%2。 - Ricardo

0

你的想法应该是可行的。但是,如果你得到了输入参数的返回值,那就意味着在你的Localizable.strings文件中没有找到该输入参数作为键。请检查该文件的语法和位置。


0
这对我有效:
NSMutableString *testMessage = [NSMutableString stringWithString:NSLocalizedString(@"Some localized text", @"")];
testMessage = [NSMutableString stringWithString:[testMessage stringByAppendingString:someStringVariable]];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接