59

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

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

案例 1:变量 NSLocalizedstring:

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

案例 2:格式化的 NSLocalizedString:

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

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

谢谢!

4

8 回答 8

125

如果您想要返回“This is an Apple/Orange/whatever”的本地化版本,您会想要:

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 %@";
于 2010-08-10T04:17:30.180 回答
22

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

受 androids 可能性的启发,我将此功能添加到我的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);
于 2014-06-02T06:57:34.050 回答
10

对于迅速:

let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)
于 2017-04-13T14:56:16.540 回答
5
extension String {
    public var localizedString: String {
        return NSLocalizedString(self, comment: "")
    }

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

可本地化的字符串:

"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
于 2018-11-13T12:02:43.770 回答
4

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

于 2010-11-14T09:18:47.343 回答
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);
于 2012-04-13T10:02:09.067 回答
0

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

于 2010-08-10T04:58:35.167 回答
0

这对我有用:

NSMutableString *testMessage = [NSMutableString stringWithString:NSLocalizedString(@"Some localized text", @"")];
testMessage = [NSMutableString stringWithString:[testMessage stringByAppendingString:someStringVariable]];
于 2020-11-18T15:09:18.607 回答