是否可以更新本地化的情节提要的字符串?


226

我通过创建base.lproj故事板和3个字符串文件来本地化应用程序的一部分。大约一个月前,此后,我向应用程序添加了新的视图控制器,但是此控制器的按钮和标签未出现在字符串文件中

是否可以更新这3个故事板附带的字符串文件,或者我必须使用NSLocalizableString和Localizable.strings以编程方式添加新的字符串转换?


Answers:


264

有两种选择:

选项1

Xcode可以通过将文件转换为[Interface Builder Cocoa Touch故事板]文件类型或[可本地化的字符串]文件类型来“重新加载” 文件。

  1. 从项目浏览器中选择您的基本情节提要文件
  2. 在“文件”检查器中找到“ 本地化”部分
  3. 如果您的文件当前是[Localizable Strings],请将其更改为[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


1
我尝试了选项1,但是将文件类型从[可本地化的字符串]更改为[Interface Builder Cocoa Touch故事板]总是会导致Xcode 5.0.1崩溃。原因可能是-因为我不知道上面的可能性-我较早手工编辑了情节提要本地化文件。
莱因哈德·曼纳

16
选项1可以使用。但是您需要从“可本地化..”更改为“接口...”,然后再次返回!
若奥·努涅斯

3
使用XCode 6.0.1时,选项1对我不起作用。尝试将我的.strings文件转换为.interfacebuilder时,XCode询问是否应转换文件。这些文件是在文件系统上创建的,但是字符串文件仍然保留并包含旧值。
弹跳

53
对我来说,选项1用英语替换了所有已翻译的字符串。我不得不再次添加翻译。
Mihail Velikov

5
选项1在Xcode 7中似乎非常不稳定。有时它起作用,有时却不起作用。有时,它会再次用英语版本随机替换一些我已经翻译过的字符串。
亚当·约翰斯

76

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


通过Homebrew 安装 BartyCrouch :

brew install bartycrouch

或者,通过Mint安装它:

mint install Flinesoft/BartyCrouch

逐步更新您的情节提要/ XIB字符串文件:

$ bartycrouch update

这将完全满足您的需求。


为了使您的Storyboards / XIBs Strings文件不断更新,我强烈建议添加一个构建脚本(有关如何在此处添加构建脚本的说明):

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

除了逐步更新Storyboard / XIBs Strings文件之外,这还将确保您的Localizable.strings文件保持使用代码中新添加的键进行更新NSLocalizedString并使用重复键或空值显示警告。

确保在GitHub此详细文章上查看BartyCrouch以获取更多信息。


1
哇!这个工具简直太神奇了。这需要更多的投票!
ph1lb4

1
可爱的工具-不再需要手动复制/粘贴* .strings-files中的新标签文本(...并且像以前一样忘记任何新标签的翻译)...非常感谢!
iKK

OBJC项目有类似的吊舱吗?
rickrvo

2
这是我们正在寻找的答案。这应该是公认的答案。
Juanjo

3
我不明白为什么自问这个问题以来已经有6年了,而仍然需要此修补解决方案才能使其在Xcode中起作用。苹果本应该为此工作。
huggie

57

您可以在本地化文件中手动添加密钥。您可以通过在情节提要编辑器上选择关键对象来找到它。让我们来看看Object-ID在身份检查器中看。看起来像"nwc-b2-19c"

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

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

8
认为这是风险较小的方法
Nicolas Manzini

但是某些对象ID未显示在.string文件中。因为它们没有连接。那当时我该怎么办?
Mihir Oza

有没有办法通过名称而不是自动生成的ID来选择它?
cocoseis

对于UILabel,其为:“ YeB-ap-Wkw.text” =“我的标签文本”;
ioopl,2016年

30

这个程序并不适合所有人,但是它不需要终端中的任何其他工具,并且只需进行少量手动更改即可轻松实现。(当您想使过程自动化时,请不要考虑这一点。)

步骤0:情节提要语言设置

  • 基地(英文文本)
  • 英文(因为基本文件是英文,所以不存在可本地化的字符串文件)
  • 其他语言(可本地化的字符串文件)

基本配置

此步骤仅执行一次。

现在,当我向情节提要中添加某些内容时,请执行以下操作

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

添加英文

只需标记英文订单项即可。

这将创建一个包含所有行的全新的英语可本地化的字符串文件

步骤2:将新的订单项复制到其他语言文件中

并翻译它们

步骤3:取消标记英语,删除相应的可本地化的字符串文件

该文件仅用于获取新的订单项

这是一个简单而快速的过程,所有操作都在情节提要编辑器中完成

编辑:

此过程适用于小型情节提要。例如,我有一个基于选项卡的项目,并且每个选项卡都有一个情节提要。

搜索“ storyboard参考”以查找教程。

很好的例子:Xcode中的Storyboard参考,我们应该在哪里使用它?

因此,每个小情节提要只有几个字符串可以本地化。


大!您是否还找到了有关如何删除已删除元素的想法?

@Tobe如果按照我上面的建议拆分情节提要,很容易发现不再使用的字符串。
Gerd Castan

15

最后,我的解决方案是(基本但有效),将以前的翻译复制并粘贴到通过取消选中并选中“本地化语言”框而创建的新文件中。

这在某些情况下(例如我的情况)很有用,当您只需要更改一个或两个文本时。


这样会一直保存ID的信息吗?我做了一个测试,它似乎可以正常工作,但是如果更改了ID,可能会是一场灾难。
ullstrm '16

我想是的,我已经做了很多次了,没有任何问题。
jpl850 '16

1
删除UI元素时分配ID。它们由情节提要分配,因此与本地化无关。因此不会对ID产生影响。
iBug

感谢iBug的解释=)
jpl850 '16

14

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

  1. 在项目浏览器中,选择您的项目文件夹
  2. 选择“编辑器”>“导出以进行本地化”,
  3. 保留在其位置的所有翻译和XCode会自动添加错过的字符串。此外,导入之前,您可以在XLIFF编辑器中编辑.xliff(例如,在线- http://xliff.brightec.co.uk),然后你不需要做这个XCode中。
  4. 然后选择编辑器>导入本地化,然后选择保存的.xliff文件。

PS:如果您不想在XLIFF Editor中进行编辑,并且已跳过步骤3,则XCode不能保存新字符串。在这种情况下,请在XLIFF Editor中打开.xliff,重新保存而不更改并导入新文件。


1
+1使用本地化的简便方法。此外,首选方式是苹果
侏罗纪'16

1
使用Xcode 7.3.1,在已经本地化的示例项目中,我更改了标签(从“文本”更改为“基本文本”),并添加了新标签。我导出以进行本地化,触摸了.xliff文件(没有任何更改),然后再次将其导入。在Main.strings文件中,已更改标签的注释行已更新/* Class = "UILabel"; text = "a basic text"; ObjectID = "HFW-aN-MTb"; */,但是在Main.strings文件中未创建新标签。然后,我编辑了.xliff文件,为新标签添加了翻译。我再次导入了它。现在,新标签将插入Main.strings文件中。
2013年

+1,但是我发现了一个错误。添加新元素时,它们不在导出的文件中(如duthen所说)。但是,当我在之后(不对情节提要板进行任何更改)进行导出时,令人惊讶地包括了所有添加的元素。出口也要进行两次。第二个将包括所有新元素。谢谢苹果!
Viktor Kucera

6

当您在情节提要板中单击时,例如Main.storyboard ...在右侧,您可以看到本地化菜单(请参见atach图像)。如果取消选中并再次检查语言,将再次生成文件。因此,通常我会复制内容,再次生成文件,然后粘贴复制并已经翻译的内容。

这是我用来更新字典的方式。

在此处输入图片说明


在Xcode 10中,如果您使用git,则可以突出显示差异!
里卡多·鲁伊斯·罗梅罗

是的,可能...现在我的文件大于该日期,并且在再次生成文件后将其与存储库版本合并。
J. Fdez '18 -10-29

5

我有一个巨大的故事板,上面有很多琴弦。两种语言以英语为基础,另一种以阿拉伯语为基础。任务是在情节提要中添加一些字段和标签,并为其添加本地化,​​而无需任何脚本和NSLocalizableStrings。

对我来说,接下来的帮助:

首先:确保您具有git来防止意外的更改。

  1. 转到xcode的目标屏幕,然后按Editor-> Export For Localization...。将ar.xliff文件保存在某处。
  2. 下载XLIFF Edtior
  3. 打开ar.xliff文件并进行更改。
  4. 将此文件导入xcode。做完了!您已经更新了情节提要字符串文件。

为此,请首先在Xcode项目编辑器中选择项目或目标。
查克·鲍里斯

4

一个应用程序从苹果的命令行工具名为AppleGlot支持增量定位。我还没有尝试过,但是它看起来完全像您搜索的工具(前一段时间)。


appleglot工具正在与最终应用程序捆绑包一起使用。对于翻译应用程序,这是完全不同的方法。
Flovdis 2014年

1
“不同的方法”出了什么问题,还是什么原因导致了投票否决?
tilo 2014年

现在需要在该链接中搜索AppleGlot。
NSDeveloper

4

这是一个脚本,用于从情节提要和xib中提取字符串,并将其与现有翻译合并。

要在构建项目时自动运行脚本,请将脚本放入项目根目录,然后将带有以下行的“运行脚本”阶段添加到项目设置中的目标构建阶段。

./mergegenstrings.py PathToSourceDir

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

脚本ibtool按Tha Leang的回答运行。它还可以genstrings提取和合并NSLocalizedString源代码中标记为的字符串。该脚本基于本文中的脚本,该脚本在运行后合并字符串genstrings


您能否提供有关如何使用此功能的更多信息?
user023

1
我向要点添加了评论。希望能帮助到你。gist.github.com/yoichitgy/29bdd71c3556c2055cc0
洋一'15

谢谢,非常适合我。如果有人有权限问题,这可能会有所帮助:stackoverflow.com/questions/9850936/...
的iCode

该脚本适用于Storyboard Main.strings文件,但似乎覆盖了Xcode 7中的Localizable.strings翻译。–
Adam Johns

3

最简单且风险更低的方法是,只需从情节提要中复制对象ID,然后在本地化文件中为该键添加一个新键,如下例所示:

1:从情节提要中复制组件ID,如下所示:

在此处输入图片说明

2:在本地化文件中添加新密钥,如下所示:

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

注意:如果您只想更新很少的组件,则此方法风险较小,否则可以为情节提要重新创建本地化文件。


感谢您的回答!!!!!。我有一个问题要问,在我的项目中,我还没有为某些标签,按钮创建出口。
Harikarthick K

3

Xlifftool可作为Mac应用程序使用,并且运行良好。它显示了info.plist中所有可翻译的字符串和对象,可本地化的字符串以及情节提要。

在Mac上获取它:https : //itunes.apple.com/lv/app/xlifftool/id1074282695?mt=12

步骤1:在Xcode中,在项目导航器中选择项目文件夹。然后选择用于本地化的编辑器/导出...

您的可翻译字符串将以您在Xcode中选择的本地化语言包含在xliff文件中。

步骤2:使用xlifftool打开该文件,然后翻译或更新您以前翻译过的文件。

步骤3:然后使用“编辑器/导入本地化”上传回项目中...


macOS的另一种选择是Loca Studio。与Xlifftool相似,该应用程序可以打开Xcode操作编辑器->导出以本地化的结果。它具有一些更高级的过滤和搜索功能,以及自动质量检查功能。(完整披露:我是首席开发人员)。
guru_meditator

0

这是将情节提要或Xib中的新文本更新为本地化字符串的简便方法

1-使用此脚本http://tredje.se/dev/trouble/?x=entry:entry150917-204052

2- 选择要更新的本地化字符串,然后将语言字符串从“本地化字符串”切换到“界面构建器情节提要”

3-将其切换回:)

做完了

在此处输入图片说明


它确实将文件更改为Interface Builder故事板,但在一两秒钟后又将其还原为可本地化的字符串,并且对新视图文本没有添加可本地化的字符串
Mujahid Latif

@MujahidLatif我现在正在使用此Pod,它对我真的很有用,它可以更新情节提要
Fadi Abuzant

0

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

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

选项2
使用ibtool提取的字符串在你的故事板。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.