如何使用格式化占位符本地化字符串?
Posted
技术标签:
【中文标题】如何使用格式化占位符本地化字符串?【英文标题】:How do I localize a string with formatting placeholders? 【发布时间】:2011-02-03 00:45:10 【问题描述】:如何使用 NSLocalizedString 本地化包含占位符的字符串?
例如:
[NSString stringWithFormat:@"You can afford %i at %@%li.",[kCash integerValue]/self.price, kYen, self.price]
如何本地化?我是否将字符串分解为多个本地化字符串?那么我该如何处理不同的句子结构和语法呢?
【问题讨论】:
【参考方案1】:NSLocalizedString 不会改变你的占位符,所以 stringWithFormat 可以正常使用它们。在您的示例中,使用编号占位符可能是一个好主意 -
[NSString stringWithFormat:@"You can afford %1$i at %2$@%3$li.",
[kCash integerValue]/self.price, kYen, self.price]
更多信息在这里: Is there a way to specify argument position/index in NSString stringWithFormat?
【讨论】:
【参考方案2】:让本地化字符串包含占位符。这几乎是唯一正确的方法,否则,正如您所提到的,您无法考虑不同的词序。
类似的东西:
[NSString stringWithFormat:NSLocalizedString(@"Foo %i", @"Foo %i"), 123]
【讨论】:
这行得通吗? NSLocalizedString 会知道占位符而不认为它们是任意文本吗? 这适用于一个参数,但如果您有两个参数,那么在许多语言中,您还需要更改占位符出现的顺序。 -1 此代码不适用于顺序敏感的文本。它应该使用位置参数(例如 %1$@)。此外,NSLocalizedString 的第二个参数旨在作为对翻译者的注释,以更好地理解被翻译文本的上下文。重复初始文本是没有意义的,尤其是格式化字符串。 好,好,投反对票。如果它不是公认的答案,我会删除它!你不能自己删除这些。 对于更复杂的格式,例如日期格式,请参见:'NSString stringWithFormat(NSLocalizedString(@"%1$02dh %2$02dm %3$02ds","") 1,2, 3);'例如会给你“01h 02m 03s”。【参考方案3】:另一种方法是在您的本地化文件中,您可以:
key = "String with %@ placeholder";
在你的实现中:
[NSString stringWithFormat: NSLocalizedString(@"key", ""), @"string replacing placeholder"];
您可以使用任意数量的参数来执行此操作,它们只需要在您的本地化文件中保持一致即可。
【讨论】:
【参考方案4】:这种方式似乎更有效率:
[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"Key", @"Comment for localised string"), value];
【讨论】:
不,您不能依赖翻译订购。您必须本地化格式字符串。以上是关于如何使用格式化占位符本地化字符串?的主要内容,如果未能解决你的问题,请参考以下文章