【问题标题】:Localization in Xcode 10Xcode 10 中的本地化
【发布时间】:2019-02-06 20:31:51
【问题描述】:

我有一个应用程序,其中所有面向用户的字符串都使用 NSLocalizableString()。我从未本地化过应用程序,所以我观看了 WWDC 2018 视频New Localization Workflows in Xcode 10。从那里我创建了一个新项目,一个单一视图应用程序。基础本地化默认开启。在情节提要上,我添加了一个 UILabel 并将其限制在视图的中心。我在视图控制器中添加了一个插座:

@IBOutlet weak var label: UILabel!

我在 viewDidLoad 中设置了它的文本:

label.text = NSLocalizedString("Hello World", comment: "")

构建并运行,它工作正常。

现在我添加一个本地化。我选择项目并添加西班牙语。

然后我在编辑器菜单上导出本地化...。我通过这个路径打开文件:

es.xcloc -> LocalizedContents -> es.xliff

在那里我找到“Hello World”键,并将值更改为“Hola Mundo”并保存文件。

...
<file original="MyProject/en.lproj/Localizable.strings" datatype="plaintext" source-language="en" target-language="es">
    <header>
      <tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="10.1" build-num="10B61"/>
    </header>
    <body>
      <trans-unit id="Hello World">
        <source>Hola Mundo</source>
        <note>No comment provided by engineer.</note>
      </trans-unit>
    </body>
  </file>
...

然后回到 Xcode 并导入本地化。这是第一个问题:

为什么这是一个不匹配的翻译?

我继续导入。我将方案编辑如下:

当我跑步时,我得到“HELLO WORLD”。它是大写的,因为这是本地化调试,表明没有翻译。

我错过了什么?

【问题讨论】:

    标签: ios xcode localization nslocalizedstring


    【解决方案1】:

    这里有一些问题。首先,当您执行NSLocalizedString("Hello World", comment: "") 时,实际发生的是您尝试使用键Hello World 获取本地化字符串,并且由于Xcode 找不到该键,它会返回您为标签设置的键本身。因此,为了获得最佳实践,请考虑使用不包含空格的密钥。也许像hello-world-label 这样的东西。那么,就是:

    NSLocalizedString("hello-world-label", comment: "")
    

    这将在您导出本地化后生成以下内容:

    <trans-unit id="hello-world-label">
        <source>hello-world-label</source>
        <note>No comment provided by engineer.</note>
    </trans-unit>
    

    现在你必须添加&lt;target&gt; 标签来指定实际的翻译。因此:

    <trans-unit id="hello-world-label">
        <source>hello-world-label</source>
        <target>Hola Mundo</target>
        <note>No comment provided by engineer.</note>
    </trans-unit>
    

    然后只需将本地化导入回来就可以了。

    编辑

    完成之后,应该已经生成了一个Localizable.strings 文件。单击它并查看 Xcode 右侧 Localization 部分下的 File Inspector。您会发现该文件仅针对Spanish 进行了本地化。所以继续并选择English复选框。然后,您的Localizable.strings 将可编辑为英语和西班牙语,如下图所示:

    现在您编辑该文件的英文版本,以便在您的应用中同时使用两种语言。

    【讨论】:

    • 它适用于西班牙语。导入没有错误,出现翻译。但是,现在没有英文了。
    • 我选择了采用默认值的 NSLocalizedString 版本:label.text = NSLocalizedString("hello-world-label", tableName: nil, bundle: Bundle.main, value: "hello world", comment: ""),而现在我不需要使用 Localizable.Strings (English)
    • Apple 怎么可能没有意识到target 标签是必需的?
    • 我的大量字符串是 Swift 多行文字。当我将上面的示例更改为多行文字时,它不会出现在导出的 xliff 文件中。
    • 如果您切换到唯一键,如此答案中所建议的那样,您肯定必须唯一的英语默认值。 NSLocalizedString("hello-world-label", value: "Hello world", comment: "").还要确保您已打开基本本地化。您的密钥将在 Base 中,并且您将有一个单独的 en.xliff(和 en.lproj 文件夹)用于英语。查看本教程:ibabbleon.com/iphone_app_localization.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多