Swift中NSLocalizedString使用字符串插值失效问题咨询
解决iOS本地化字符串动态插值失效的问题
嘿,这个问题我之前开发时也踩过坑!核心原因很简单:你第二个写法里,NSLocalizedString的key变成了动态生成的字符串——比如当friendsNumber是3时,key是"I have 3 friends.",但如果数值变成5,key就变成了"I have 5 friends.",而你的本地化文件里只会有固定的key条目,系统根本匹配不到对应的翻译内容,自然就失效了。
下面给你两种常用的解决思路:
方法一:基础占位符本地化
适合简单的动态值替换,步骤如下:
- 在本地化文件(如
Localizable.strings)中定义带占位符的key:
比如针对整数类型的朋友数量,用%ld作为占位符(字符串用%@,浮点数用%f,根据实际类型调整):// 英文Localizable.strings "I have %ld friends." = "I have %ld friends."; // 中文Localizable.strings "I have %ld friends." = "我有%ld个朋友。"; - 在代码中结合
String(format:)填充动态值:
先获取本地化的格式字符串,再用String(format:)把动态值替换进去:var friendsNumber = 3 // 先拿到带占位符的本地化字符串 let localizedFormat = NSLocalizedString("I have %ld friends.", comment: "展示用户拥有的朋友数量") // 填充动态数值 let secondString = String(format: localizedFormat, friendsNumber)
方法二:复数场景的本地化(进阶)
如果需要根据数量显示不同的翻译(比如1个朋友时说"I have one friend.",多个时说"I have X friends."),可以用iOS的复数本地化规则:
- 创建
Localizable.stringsdict文件并本地化:
在Xcode中新建一个Property List文件,命名为Localizable.stringsdict,然后给它添加本地化支持(和Localizable.strings一样)。 - 配置复数规则:
在stringsdict中写入如下结构(以英文和中文为例):<!-- 英文Localizable.stringsdict --> <dict> <key>I have %d friends.</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@friendsCount@</string> <key>friendsCount</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>zero</key> <string>I have no friends.</string> <key>one</key> <string>I have one friend.</string> <key>other</key> <string>I have %d friends.</string> </dict> </dict> </dict><!-- 中文Localizable.stringsdict --> <dict> <key>I have %d friends.</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@friendsCount@</string> <key>friendsCount</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>zero</key> <string>我没有朋友。</string> <key>one</key> <string>我有1个朋友。</string> <key>other</key> <string>我有%d个朋友。</string> </dict> </dict> </dict> - 代码中调用:
和基础方法一样,用String(format:)即可,系统会自动根据数值匹配对应的复数翻译:var friendsNumber = 1 let localizedFormat = NSLocalizedString("I have %d friends.", comment: "根据朋友数量展示不同文案") let secondString = String(format: localizedFormat, friendsNumber) // 此时secondString会是"I have one friend."(英文环境)或"我有1个朋友。"(中文环境)
提醒下,NSLocalizedString的comment参数一定要写清楚,方便本地化团队理解文案场景,也能在Xcode的本地化导出工具里生成清晰的注释~
内容的提问来源于stack exchange,提问作者Aurel Calin Muth
相关产品推荐
相关产品推荐

