如何使用格式化占位符本地化字符串?

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];

【讨论】:

不,您不能依赖翻译订购。您必须本地化格式字符串。

以上是关于如何使用格式化占位符本地化字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中使用占位符进行字符串格式化(如在 Python 中)?

如何在格式字符串中设置占位符的颜色

Java 占位符使用 和 修饰符

java中占位符

如何在 intl.formatMessage 中使用占位符

java占位符应用