在 Xcode 5 中修改故事板后如何同步本地化故事板的字符串

Posted

技术标签:

【中文标题】在 Xcode 5 中修改故事板后如何同步本地化故事板的字符串【英文标题】:How to sync localized storyboards' strings after modifying storyboard in Xcode 5 【发布时间】:2014-01-20 12:59:48 【问题描述】:

我刚刚开始在 XCode 5 中查看 ios 应用程序的本地化,并尝试添加 Italian Localization

Xcode 5 自动生成带有单个条目的 Main.strings 文件,这是我在 Main.storyboard 文件中放置的唯一标签:

/* Class = "IBUILabel"; text = "Label"; ObjectID = "PeT-4z-NSf"; */
"PeT-4z-NSf.text" = "Etichetta";

如果我稍后修改 Main.storyboard 文件,在视图中添加一个新按钮,那么我应该如何告诉 Xcode 5,如果可能的话,添加缺少的本地化字符串Main.strings 文件?我是否应该通过查看 Interface Builder 中的 Object ID 字段手动添加一个新条目(它有效,但我不知道这是否意味着更新故事板的本地化)?我可以在 Main.storyboard 文件上运行类似 genstrings 的东西来提取所有标签的文本并将新的文本添加到本地化的 Main.strings 文件?

【问题讨论】:

您好 Gianni,您是否从其他来源找到任何解决方案。我也需要这个,如果你知道请在这里更新解决方案。它可以帮助我和那些遇到这篇文章的人。 查看这个 SO 问题的答案:***.com/questions/15094259/… 我在这里发布了一个干净的解决方案:***.com/a/35398661/3451975 【参考方案1】:

结帐BartyCrouch,完美解决您的问题。此外,它是开源积极维护并且可以轻松安装和集成到您的项目中。


安装 BartyCrouch 通过Homebrew:

brew install bartycrouch

或者,通过Mint安装它:

mint install Flinesoft/BartyCrouch

增量更新您的 Storyboards/XIBs 字符串文件:

$ bartycrouch update

这将完全符合您的要求。


为了保持您的 Storyboards/XIBs 字符串文件随着时间的推移更新我强烈建议添加构建脚本(关于如何添加构建脚本的说明here) :

if which bartycrouch > /dev/null; then
    bartycrouch update -x
    bartycrouch lint -x
else
    echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi

除了增量更新您的 Storyboards/XIBs 字符串文件之外,这还将确保您的 Localizable.strings 文件保持更新使用 NSLocalizedString 在代码中新添加的键,并显示重复键的警告或空值。

请务必在GitHub 上查看 BartyCrouch,了解更多信息。

【讨论】:

干得好 Dschee,您的 BartyCrouch 解决方案似乎效果很好! 我已经尝试过这个解决方案,但我在 bartycouch 上不断收到Error! No input files found.。我试过输入工作区目录、项目目录和项目文件本身。它们的结果都是一样的。 @CanPoyrazoğlu 感谢您报告此事。你能确定你没有遇到this issue吗?当前名称中包含空格的项目存在问题。如果这不能解决您的问题,请在 GitHub 上打开一个包含更多信息的问题(最好是一个示例项目)。 @Dschee 我的项目路径没有任何空格(在任何父目录或本身中都没有)。有时间我会深入研究一下。 请注意,周围有this issue。也许你也有类似的情况?基本上,如果您为项目指定了多种语言,但某些本地化文件并未在所有语言中本地化,则可能会出现问题。我计划在某个时候让 BartyCrouch 更有弹性地应对这种情况。如果这种情况适用,请暂时使用问题中描述的解决方法。【参考方案2】:

Xcode 不会自动更新的文件(至少 5.x 版本没有)是应用程序的Localizable Strings。您可以从Main.storyboard 构建一个新文件,如下所示:

在项目导航器(最左侧的窗格)中单击Main.storyboard 文件。在实用程序窗格(最右边的窗格)中,单击显示文件检查器图标。就是下图中最左边的蓝色图标:

.

在将出现的右侧窗格中,其中一个部分将是本地化

取消选中English (Localizable Strings) 行并在弹出的窗口中选中从磁盘中删除本地化资源文件并单击删除按钮(您没有检查删除,在这种情况下,Xcode 会在你下次构建它时请求覆盖它的权限)。

然后再次检查English (Localizable Strings) 以从头开始构建它。

【讨论】:

这意味着如果您将其他语言本地化而不是英语,所有内容都将被删除,并且一旦您“重新添加”所有翻译将被故事板中的翻译覆盖 除非使用 Apple 假设的非常具体的工作流程(正如这里的一个 cmets 所提到的,对于小型项目来说,这绝对是矫枉过正)在 Xcode 中维护翻译是非常痛苦的。您的答案描述了迄今为止手动完成的最佳方法,但它也不完美。重新创建字符串文件后,字符串的顺序偶尔会发生变化。如果您随后使用差异工具使其他语言保持同步,则必须重新排列一些行。无论如何,鉴于没有更好的方法,这就是方法。 @user023 你有什么发现吗?【参考方案3】:

使用 Xcode 6,以下对我有用:

我将一种语言的本地化从“可本地化的字符串”更改为“接口生成器...”,就像 the SO question posted by h.orim 中所建议的那样。但是设置没有改变,它仍然设置为“可本地化的字符串”。现在下一步是再次执行此操作,因此 Xcode 将找到它刚刚创建的 Storyboard 并显示一个提示,询问是否应该使用或替换它。现在点击“使用文件”而不是“替换”,否则同样会再次发生。

现在您应该拥有所需语言的本地化 Storyboard。现在切换回“可本地化字符串”后,您将拥有一个文件,其中包含情节提要中使用的所有当前字符串,并且您之前的翻译仍然存在。

【讨论】:

谢谢,节省了大量时间,现在为什么苹果不简单地为此做一个“更新”,做同样的事情,但显然只需单击一下。但它实际上错过了一个工具提示?奇怪的。也许它错过了所有工具提示。实际上它确实也错过了一个常见的标题。所以要小心。 好的,例如,当您添加一个可访问性标签时,您之前没有,但之前有一个工具提示标签,这似乎会发生。天哪,苹果。 感谢@hokkuk 的提示!【参考方案4】:

另一种方法是通过在情节提要上选择要翻译的字段来手动完成。转到“身份检查器”并复制对象 ID(类似于 HP8-op-SmX)。

之后,打开情节提要语言文件(Main.strings,大多数情况下)并输入对象 ID。根据您的需要,您只需添加 .text 或 .placeholder。

   "HP8-op-SmX.placeholder" = "My translated placeholder text";
   "HP9-op-VvD.text" = "My translated text";

保存、清理和构建。这有点痛苦,但如果你只需要翻译一些东西,可以节省很多时间。

【讨论】:

【参考方案5】:

您可以为此使用名为 UpdatStoryboardStrings 的脚本!在此处获取:https://github.com/AppliedIS/iOSL10n 使用说明:http://blog.appliedis.com/2013/05/22/localization-of-an-xcode-ios-app-part-2/

【讨论】:

必须使用外部工具来完成本应是微不足道的事情,这绝对是荒谬的 危险的脚本,搞砸了我的项目【参考方案6】:

使用 Xcode 6+,理想情况下,开发人员不必手动管理字符串文件。使用 XLIFF 导出自动收集开发语言字符串以发送给翻译人员,然后使用 XLIFF 导入来使用翻译更新字符串文件。

https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LocalizingYourApp/LocalizingYourApp.html#//apple_ref/doc/uid/10000171i-CH5-SW9

另一种选择是直接使用ibtool --export-strings-file

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ibtool.1.html

【讨论】:

我刚刚从我的故事板中删除了标签并导出了本地化,删除的标签仍然存在于 .XLIFF 文件中:( 是的,但是这个解决方案完全是矫枉过正,对于简单的 1-dev 应用程序来说是一个很大的麻烦。本地化文件确实应该自动更新(它们仍然不在 Xcode 8 中)。【参考方案7】:

有两种选择:

选项 1

Xcode 可以通过将文件转换为 [Interface Builder Cocoa Touch Storyboard] 文件类型或 [Localizable Strings] 文件类型来“重新加载”文件。

从项目导航器中选择您的基本故事板文件 在文件检查器中找到本地化部分 如果您的文件当前是 [Localizable Strings],请将其更改为 [Interface Builder Cocoa Touch Storyboard],反之亦然。 Xcode 应该已将您的故事板转换为当前版本,同时保留您旧的本地化工作。如果您愿意,您可以在此处将文件更改回原始文件类型。

选项 2

使用 ibtool 提取情节提要中的字符串。

打开终端应用程序 找到您的 Base.lproj 目录 使用这一行来提取字符串:

ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings ibtool 将字符串提取到 file_name.strings 后,您可以将其复制并粘贴到您的原始 .strings 文件中

【讨论】:

【参考方案8】:

使用 Xcode 11 测试,您可以简单地取消选择语言。

不要删除磁盘上的文件。

然后选择使用现有文件。

将保留旧的翻译并添加新的键。

【讨论】:

如何弹出第二个? 要获得第二个弹出窗口,只需在取消选择后再次选择文件。 它不会添加新的键。

以上是关于在 Xcode 5 中修改故事板后如何同步本地化故事板的字符串的主要内容,如果未能解决你的问题,请参考以下文章

构建故事板后调整 UIButton

Xcode 5 中的本地化

如何在 Xcode 5 中显示故事板视图/编辑的网格?

如何修改故事板创建的视图控制器?

iOS 5 XCODE 4.3.2 故事板。如何在现有表视图之前插入新视图?

如何创建一个向后兼容iOS 5.0的新Xcode 5项目? - 错过故事板错误