You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中NSLocalizedString使用字符串插值失效问题咨询

解决iOS本地化字符串动态插值失效的问题

嘿,这个问题我之前开发时也踩过坑!核心原因很简单:你第二个写法里,NSLocalizedString的key变成了动态生成的字符串——比如当friendsNumber是3时,key是"I have 3 friends.",但如果数值变成5,key就变成了"I have 5 friends.",而你的本地化文件里只会有固定的key条目,系统根本匹配不到对应的翻译内容,自然就失效了。

下面给你两种常用的解决思路:

方法一:基础占位符本地化

适合简单的动态值替换,步骤如下:

  1. 在本地化文件(如Localizable.strings)中定义带占位符的key:
    比如针对整数类型的朋友数量,用%ld作为占位符(字符串用%@,浮点数用%f,根据实际类型调整):
    // 英文Localizable.strings
    "I have %ld friends." = "I have %ld friends.";
    
    // 中文Localizable.strings
    "I have %ld friends." = "我有%ld个朋友。";
    
  2. 在代码中结合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的复数本地化规则:

  1. 创建Localizable.stringsdict文件并本地化:
    在Xcode中新建一个Property List文件,命名为Localizable.stringsdict,然后给它添加本地化支持(和Localizable.strings一样)。
  2. 配置复数规则:
    在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>
    
  3. 代码中调用:
    和基础方法一样,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:14:01