【问题标题】:Using plural strings without number使用不带数字的复数字符串
【发布时间】:2014-02-14 19:27:19
【问题描述】:

我对@9​​87654322@ documentation 有点困惑(滚动到“本地化属性列表文件”)。

给定一些文件,我想显示 Save File 或相应地保存 Save Files。我认为以下方法会起作用,但没有。

在代码中:

NSString *string = [NSString localizedStringWithFormat:NSLocalizedString(@"%Save Files", @""), (long)files.count];

在Localizable.stringsdict:

<key>Save Files</key>
<dict>
    <key>NSStringLocalizedFormatKey</key>
    <string>Save %#@files@</string>
    <key>files</key>
    <dict>
        <key>NSStringFormatSpecTypeKey</key>
        <string>NSStringPluralRuleType</string>
        <key>NSStringFormatValueTypeKey</key>
        <string>ld</string>
        <key>one</key>
        <string>File</string>
        <key>other</key>
        <string>Files</string>
    </dict>
</dict>

始终显示保存文件,无论计数多少。

我做错了什么?

【问题讨论】:

    标签: ios macos ios7 localizable.strings plural


    【解决方案1】:

    问题是您的代码缺少保存的文件数。为了使用 stringsdict 文件本地化复数行,该行必须有一个数字变量。因此,在上面写着@“%Save Files”的地方,应该写着@“Save %ld File(s)”。 %ld 是 Xcode 需要的数字,以了解在运行时使用哪个复数规则。

    然后,在您的 Localizable.stringsdict 文件中,您的 plist 必须如下所示:

    <key>Save %ld File(s)</key>
    <dict>
      <key>NSStringLocalizedFormatKey</key>
      <string>%#@files@</string>
      <key>files</key>
      <dict>
        <key>NSStringFormatSpecTypeKey</key>
        <string>NSStringPluralRuleType</string>
        <key>NSStringFormatValueTypeKey</key>
        <string>ld</string>
        <key>one</key>
        <string>Save %ld File</string>
        <key>other</key>
        <string>Save %ld Files</string>
      </dict>
    </dict>
    

    使用类似这样的 Localizable.stringsdict 生成器/教程可以真正帮助解决此类问题:

    iOS Stringsdict Plurals Generator

    同样重要的是,您要留下完整的行,让翻译人员重新修改短语。而不是“保存 %#@files@”,而是给他们整行来使用“%#@files”。为什么?因为某些语言中的“保存”一词可能需要根据文件的数量进行共轭,或者可能需要出现在数字的另一侧(即要保存的 3 个文件)。永远不要假设英语语法会起作用,让翻译人员翻译完整的行。

    【讨论】:

    • 您提到的一些事情不一定正确。第一:您的密钥中不必有“%ld”,我经常使用“TASK_EDIT_BUTTON”之类的密钥,它工作正常。第二:你对语法的看法。你说得对,如果译者把整行都写成复数形式,他的工作可能会更轻松。但是您不需要以这种方式拥有所有语言的正确语法。您可以将 LocalizedFormatKey 从一种语言更改为另一种语言。
    【解决方案2】:

    如果您从 NSLocalizedString(@"%Save Files", @"") 中删除 "%" 则有效

    【讨论】:

      【解决方案3】:

      您在NSLocalizesString 中错过了%ld:

      NSString *string = [NSString localizedStringWithFormat:NSLocalizedString(@"%ld Save Files", nil), (long)files.count];
      

      plist dict 应该是:

      <key>%ld Save Files</key>
      <dict>
          <key>NSStringLocalizedFormatKey</key>
          <string>%ld Save %#@files@</string>
          <key>files</key>
          <dict>
              <key>NSStringFormatSpecTypeKey</key>
              <string>NSStringPluralRuleType</string>
              <key>NSStringFormatValueTypeKey</key>
              <string>ld</string>
              <key>one</key>
              <string>File</string>
              <key>other</key>
              <string>Files</string>
          </dict>
      </dict>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 2018-10-15
        • 2012-03-19
        相关资源
        最近更新 更多