是否可以更新本地化的Storyboard中的字符串?

235
我使用了一个 base.lproj storyboard 和 3 个字符串文件来本地化我的应用程序的一部分。这是一个月前的事情,之后我向应用程序添加了新的视图控制器,但是该控制器的按钮和标签没有出现在字符串文件中。
是否可能更新这三个 storyboard 相关的字符串文件,或者我必须使用 NSLocalizableString 和 Localizable.strings 在编程中添加新的字符串翻译呢?

https://developer.apple.com/internationalization/ - NSDeveloper
15个回答

272
有两种选择:

选项1

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

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

选项2

使用ibtool提取故事板中的字符串。

  1. 打开终端应用程序

  2. 找到您的Base.lproj目录

  3. 使用此行来提取字符串:

    ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings

  4. 在ibtool将字符串提取到file_name.strings之后,您可以将其复制并粘贴到原始.strings文件中

有关更多信息,请访问:https://conyac.cc/business/columns/localization_guide_ios


16
选项1可行,但需要将“Localizable…”更改为“interface…”,然后再改回来! - João Nunes
3
对我来说,选项1在使用XCode 6.0.1时无法奏效。当尝试将我的.strings文件转换为.interfacebuilder文件时,XCode会询问是否应该进行转换。虽然系统会创建这些文件,但是字符串文件仍然存在,并且包含旧值。 - Bouncing Bit
55
对于我来说,选项1用英文替换了所有已经翻译的字符串。我不得不再次添加翻译。 - Mihail Velikov
5
在Xcode 7中,选项1似乎非常不稳定。有时它能工作,有时它不能。有时它会随机替换我已翻译的某些字符串为英文版本。 - Adam Johns
2
你需要使用一个选项重新翻译整个文件! - Nike Kov
显示剩余11条评论

88

看看 ReMafoX,它是一款完美解决问题的Mac应用程序。它可以被轻松安装和集成到您的项目中,观看这个视频以获取详细步骤。

或者,如果你喜欢一个没有图形用户界面的开源CLI工具,也可以使用BartyCrouch


通过Homebrew安装BartyCrouch:

brew install bartycrouch

或者,通过Mint安装:

mint install Flinesoft/BartyCrouch

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

$ bartycrouch update

这将恰好做到你想要的。


为了随时间的推移保持故事板/XIB字符串文件更新,我强烈建议添加一个构建脚本(如何添加构建脚本的说明在这里):

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

除了增量更新您的故事板/XIB字符串文件之外,这还将确保使用NSLocalizedString在代码中新增键时,您的Localizable.strings文件得到更新,并显示重复键或空值的警告。

请务必在GitHub上查看BartyCrouch这篇详细文章获取更多信息。


1
哇!这个工具真是太棒了。需要更多的赞! - ph1lb4
1
可爱的工具 - 不再手动复制/粘贴新标签文本到*.strings文件中(...以前可能会忘记任何新标签的翻译)...非常感谢! - iKK
OBJC项目有类似的Pod吗? - rickrvo
2
这就是我们正在寻找的答案。这应该是被接受的答案。 - Juanjo
6
我不明白为什么自从6年前这个问题被提出以来,还需要这种临时性的解决方案才能让Xcode正常工作。苹果公司本应该着手解决这个问题。 - huggie

57

您可以在本地化文件中手动添加密钥。您可以通过在Storyboard编辑器上选择它来找到密钥对象。让我们看一下身份验证器中的Object-ID。它看起来像这样:"nwc-b2-19c"

在本地化更新或添加翻译。例如:

"nwc-b2-19c.title" = "Translated title";

10
我认为这是较少风险的方法。 - Nicolas Manzini
但是一些对象ID在.string文件中没有显示出来,因为它们没有连接。那么这种情况下我该怎么办? - Mihir Oza
有没有一种方式可以通过名称而不仅仅是自动生成的 ID 来选择它? - cocoseis
对于一个UILabel,它的: "YeB-ap-Wkw.text" = "我的标签文本"; - ioopl
对我来说,它不再起作用了,但是3年前它还能工作... - Ahmadreza

35

这个方法不适用于所有人,但在终端中不需要额外的工具,并且对于小的手动更改非常简单。(如果要自动化处理请勿考虑此方法。)

步骤0:设置Storyboard语言

  • 基础语言(包含英文文本)
  • 英文(本地化字符串文件不存在,因为基础文件是英文)
  • 其他语言(本地化字符串文件)

基础配置

此步骤只需执行一次。

现在,当我向Storyboard添加内容时,按照以下步骤操作:

步骤1:添加英文本地化字符串文件

添加英文

只需选择“English”即可。

这将创建一个完全新的英文本地化字符串文件,其中包含所有行。

步骤2:复制新的行到其他语言的文件中

并进行翻译。

步骤3:取消选择英文,删除相应的本地化字符串文件

该文件仅用于获取新的行。

这是一个简单且快速的过程,所有步骤都在Storyboard编辑器中完成。

编辑:

此方法非常适用于小型Storyboard。例如,我有一个基于选项卡的项目,每个选项卡都有一个Storyboard。

搜索“storyboard reference”以查找教程。

好的例子:Xcode中的Storyboard参考,在哪里使用?

因此,每个小型Storyboard只需要本地化几个字符串。


很好!你也想到怎么删除已删除的元素了吗? - Tobe
@Tobe 如果你按照我上面建议的方式拆分你的故事板,那么很容易发现不再使用的字符串。 - Gerd Castan

15

最终,我的解决方案是(简单但有效的)复制之前的翻译,并将它们粘贴到通过取消和选择本地化语言框创建的新文件中。

在某些情况下,这将非常有用,比如像我的情况一样,只需要更改一个或两个文本。


这会一直保留id之类的吗?我做了一个测试,似乎可以工作,但如果id改变了,那就可能是一场灾难。 - ullstrm
我想是的,我已经做了很多次而没有任何问题。 - jpl850
1
当您删除UI元素时,将分配ID。它们与本地化无关,因为它们是由故事板分配的。因此,ID不会受到影响。 - iBug
感谢 iBug 的解释 =) - jpl850

14

我认为最好的方法是使用内置的导出/导入本地化功能:

  1. 在项目导航器中选择您的项目文件夹
  2. 选择编辑器 > 导出本地化,
  3. 所有翻译保留在它们的位置上,XCode会自动添加遗漏的字符串。 此外,在导入之前,您还可以在XLIFF编辑器中编辑 .xliff 文件(例如,在线编辑器-http://xliff.brightec.co.uk),这样就不需要在XCode中进行编辑。
  4. 然后选择编辑器 > 导入本地化,并选择保存的 .xliff 文件。

附:如果您不想在 XLIFF 编辑器中进行编辑并跳过第3步,则 XCode 可能未保存新字符串。在这种情况下,打开 XLIFF 编辑器中的 .xliff 文件,重新保存但不做更改,然后导入新文件。


1
+1 与本地化一起工作的简单而正确的方法。此外,这也是首选方式 Apple - Jurasic
1
使用 Xcode 7.3.1,在一个已经本地化的示例项目中,我将一个标签从“a text”更改为“a basic text”,并添加了一个新标签。 我导出进行本地化,触摸了 .xliff 文件(没有更改),然后重新导入。在 Main.strings 文件中,更改的标签的注释行已更新为 /* Class = "UILabel"; text = "a basic text"; ObjectID = "HFW-aN-MTb"; */,但是新标签没有在 Main.strings 文件中创建。然后我编辑了 .xliff 文件以添加新标签的翻译。我再次导入它。现在,新标签被插入到 Main.strings 文件中。 - duthen
+1 但是我发现了一个错误。当添加新元素时,它们不会出现在导出的文件中(就像duthen所说的那样)。但是,当我立即进行导出(没有对故事板进行任何更改)时,所有添加的元素都会被意外地包括在内。因此,请导出两次。第二次将包括所有新元素。感谢苹果! - Viktor Kucera

7
当你点击你的故事板,例如Main.storyboard...在右侧你可以看到本地化菜单(见附图)。如果你取消勾选并再次勾选一个语言,文件将会重新生成。所以我通常会复制内容,重新生成文件,然后粘贴已经被翻译过的内容。
这是我更新字典的方式。
附图链接:enter image description here

使用 Xcode 10,如果您使用 git,则会突出显示差异! - Ricardo Ruiz Romero
是的,这是可能的...现在我的文件比这个日期更大了,我在生成它后将其与存储库版本合并。 - J. Fdez

6

我有一个包含许多字符串的大型故事板。其中两种语言基础为英语和阿拉伯语。任务是在故事板中添加一些字段和标签,并为它们添加本地化,而不需要任何脚本和NSLocalizableStrings。

以下是对我有帮助的步骤:

第一步:确保您使用git以防止意外更改。

  1. 在Xcode中进入目标屏幕,然后单击 Editor -> Export For Localization...。将ar.xliff文件保存在某个地方。
  2. 下载XLIFF编辑器
  3. 打开ar.xliff文件并进行更改。
  4. 将此文件导入Xcode。完成!您已更新故事板字符串文件。

要使此操作起作用,首先在Xcode项目编辑器中选择项目或目标。 - Chuck Boris

4

最简单且风险较小的方法是,只需从storyboard中复制Object ID,并将一个新的键添加到本地化文件中,例如下面的示例:

1: 从Storyboard中复制组件的object id,如下所示:

enter image description here

2: 在本地化文件中添加以下新键:

"DjF-dn-0ay.text" = "Borrar datos y restablecer";

注意: 如果你只想更新少量组件,则这是非常低风险的方法,否则你可以重新创建storyboard的本地化文件。


谢谢你的答复!!!!! 我有一个问题要问,在我的项目中,我没有为一些标签、按钮创建出口。如果我为这些按钮和标签使用 objectID,是否就足够了? - HariKarthick

4
这里有一个脚本,可以从storyboards和xibs中提取字符串,并将它们与现有的翻译合并。
要在构建项目时自动运行脚本,将脚本放入项目根目录中,并将以下行添加到目标构建阶段的Run Script中,在项目设置中。
./mergegenstrings.py PathToSourceDir

或者您可以在需要时手动在终端上运行脚本。

脚本会像Tha Leang回答的那样运行ibtool。它还会运行genstrings来提取和合并源代码中标记为NSLocalizedString的字符串。该脚本基于此帖子中的脚本,在运行genstrings后合并字符串。


你能提供更多关于如何使用这个的信息吗? - user023
1
我在Gist上添加了一条评论。希望能有所帮助。https://gist.github.com/yoichitgy/29bdd71c3556c2055cc0 - Yoichi Tagaya
谢谢,这对我来说完全有效。如果有人在权限方面遇到问题,这个链接可能会有帮助:https://dev59.com/92kw5IYBdhLWcg3wfKrZ - iCode
这个脚本适用于Storyboard Main.strings文件,但似乎正在覆盖我在Xcode 7中的Localizable.strings翻译。 - Adam Johns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接