2016-02-14 52 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