2016-02-14 48 views
0

我正在从Swift上的iOS 9 AppCoda书籍(https://www.appcoda.com/swift/)中学习,并且特别在本地化部分遇到困难。所以作者已经完成了将代码中的一些面向用户的字符串从String改为NSLocalizedString。这是有道理的,我在那里做的改变会自动更新XLIFF文件。在关于本地化的部分中,作者提到您还可以使用Xcode的导出本地化功能翻译Storyboard面向用户的字符串。故事板中的本地化和面向用户的文本

因为这是一本你工作过的书,他提供了一个已翻译的XLIFF文件到中文和德文,其中包括源代码翻译文本和翻译的故事板元素。

当我将文件导入到Xcode中时,我看到了三个故事板(Base和中文/ German.strings等),但是当我运行该应用程序时,没有一个Storyboard元素实际被翻译,只有来自源码。

当我点击德语故事板时,我得到“没有本地化的字符串”。

enter image description here

在他的例子中的应用程序的工作原理,并在故事板的UI元素被翻译,但他们不是在我的情况。到目前为止,整个应用程序已经跟随练习,所以没有任何区别。或者即使有,相似性本身也应该被翻译,但在故事板元素中,它们不是。

有没有人有任何想法,为什么在我的情况下,Storyboard元素不会被更新的翻译文本?

任何想法将不胜感激。

回答

2

这是我的猜测...从Storyboard导出本地化字符串与从代码中导出这些字符串有点不同。

从代码串的本地化文件获取从NSLocalizedString宏观的实际文本,并创建一个映射,如:

"Original string" = "Translated string". 

所以,你只需要在你的代码中使用“原始字符串”,那么Xcode中知道它应该将其翻译为“翻译后的字符串”。

但是,故事板本地化文件使用UI对象句柄来设置本地化字符串。例如:

/* Class = "UILabel"; text = "Ops..."; ObjectID = "fe4-zT-gjU"; */ 
"fe4-zT-gjU.text" = "Wait for it..."; 

在这个例子中我的故事板有一个UILabel,与文本“行动......”,而标签上有对象ID等于“FE4-ZT-GJU”。

对象ID对于每个项目中的每个对象都是唯一的,所以很显然,来自应用程序结尾教程的对象ID对作者创建的项目来说是唯一的;除非您已经下载了作者的原始故事板,否则故事板将具有所有不同的对象ID,因此Xcode将不知道如何将正确的翻译与正确的对象相关联。

我不认为Xcode会导入它无法识别objectID的对象的本地化。

所以我认为你应该做的是执行“导出本地化”操作。这应该更新你的storyboard .strings文件。然后,使用xliff编辑器将每个翻译从教程文件复制到.strings文件中。无聊,我知道。欢迎来到应用开发世界。 :-)

+1

这是一个很棒的回复@Felipe。非常感谢。关于对象ID是正确的,当我联系App Coda作者时,他向我提供了项目文件和故事板,直到我们改变代码中的翻译(因此UI元素都在那里),并且只要我再次通过出口,然后这次工作。真正有趣的方法,这非常有帮助!再次感谢 - 我欣赏它! – amitsbajaj

+0

不客气!我很高兴你设法解决你的问题:-) –

0

当你添加你的本地化你选择故事板文件?

enter image description here

如果是这样,那么请检查您的方案设置为正确的语言。这可以在产品>方案来完成>修改方案

enter image description here

如果不这样做,那么请检查您的模拟器设置为你想要显示的语言。这可以在模拟器的设置中完成,与iPhone相同。

希望这会有所帮助。

+0

非常感谢@ d.greg的回复 - 我很感激。所以当我从Xcode导出本地化时,我选择了Project,然后选择了Project(FoodPin)而不是目标。我没有选择故事板..但同时,我没有看到你的第一个截图的任何地方。这是在进口?要导入,我选择编辑器>导入,然后选择.xliff文件。我知道的第二部分工作是因为我在代码中创建的NSLocalizedStrings被翻译;只是不是像UILabels等故事板元素。 – amitsbajaj