本地化 Xcode 10
Localization in Xcode 10
我有一个应用程序,其中所有面向用户的字符串都使用 NSLocalizableString()。我从来没有本地化过应用程序,所以我看了 WWDC 2018 视频 New Localization Workflows in Xcode 10。从那里我创建了一个新项目,一个单一视图应用程序。默认情况下,基本本地化处于启用状态。在故事板上,我添加了一个 UILabel 并将其限制在视图的中心。我在视图控制器中添加了一个插座:
@IBOutlet weak var label: UILabel!
然后我在 viewDidLoad 中设置了它的文本:
label.text = NSLocalizedString("Hello World", comment: "")
Build 和 运行 并且工作正常。
现在我添加一个本地化。我 select 项目并添加西班牙语。
然后我在编辑器菜单上导出本地化...。我通过这个路径打开文件:
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"。它是大写的,因为这是本地化调试,表明没有翻译。
我错过了什么?
我们这里有一些问题。首先,当您执行 NSLocalizedString("Hello World", comment: "")
时,实际发生的是您尝试使用键 Hello World
获取本地化字符串,并且由于 Xcode 找不到该键,它 returns密钥本身,您为标签设置的。因此,为了获得最佳实践,请考虑使用不包含白色 space 的密钥。可能类似于 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>
现在您必须添加 <target>
标签来指定实际翻译。因此:
<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
文件。单击它并查看 Localization
部分下 Xcode 右侧的 File Inspector
。您会发现该文件仅针对 Spanish
进行了本地化。所以继续 select English
复选框。然后,您的 Localizable.strings
将可以针对英语和西班牙语进行编辑,如下图所示:
现在您编辑该文件的英文版本,以便在您的应用程序中同时使用这两种语言。
我有一个应用程序,其中所有面向用户的字符串都使用 NSLocalizableString()。我从来没有本地化过应用程序,所以我看了 WWDC 2018 视频 New Localization Workflows in Xcode 10。从那里我创建了一个新项目,一个单一视图应用程序。默认情况下,基本本地化处于启用状态。在故事板上,我添加了一个 UILabel 并将其限制在视图的中心。我在视图控制器中添加了一个插座:
@IBOutlet weak var label: UILabel!
然后我在 viewDidLoad 中设置了它的文本:
label.text = NSLocalizedString("Hello World", comment: "")
Build 和 运行 并且工作正常。
现在我添加一个本地化。我 select 项目并添加西班牙语。
然后我在编辑器菜单上导出本地化...。我通过这个路径打开文件:
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"。它是大写的,因为这是本地化调试,表明没有翻译。
我错过了什么?
我们这里有一些问题。首先,当您执行 NSLocalizedString("Hello World", comment: "")
时,实际发生的是您尝试使用键 Hello World
获取本地化字符串,并且由于 Xcode 找不到该键,它 returns密钥本身,您为标签设置的。因此,为了获得最佳实践,请考虑使用不包含白色 space 的密钥。可能类似于 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>
现在您必须添加 <target>
标签来指定实际翻译。因此:
<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
文件。单击它并查看 Localization
部分下 Xcode 右侧的 File Inspector
。您会发现该文件仅针对 Spanish
进行了本地化。所以继续 select English
复选框。然后,您的 Localizable.strings
将可以针对英语和西班牙语进行编辑,如下图所示:
现在您编辑该文件的英文版本,以便在您的应用程序中同时使用这两种语言。