2011-04-16 44 views
38

在xcode4中(我已經使用v4.0.1直到現在,並且昨天下載了v4.0.2)。 我製作了Localizable.string文件並編譯了我的項目。 (如您所知,我的源代碼 使用了NSLocalizedString宏函數。)Localization.strings文件..在xcode4

但是我的項目不能用Localizable.string文件編譯。如果我將此文件中的所有代碼 更改爲註釋(如此 - > //),我的項目將完全編譯。

因此,問題是Localizable.string文件。我在Google上搜索了它, 我發現UTF-8文件(Localizable.string)更改爲UTF-16。儘管我嘗試了這種方式,但這種方式也行不通。

在這一刻,很多人都在嘗試使用Localizable.string文件。但他們可能會解決這個我不能做的問題。因爲沒有關於這個問題的問題 這麼多。

============================================== =================

在Localizable.string文件,

"LOCAL_APP_GRADE" = "Basic"

"LOCAL_APP_LAST_UPDATED_DATE" = "2011/04/20"

"LOCAL_MAIN_MENU_TITLE" = "Main Menu"

在我的源代碼,

NSLocalizedString(@"LOCAL_MAIN_MENU_TITLE", @""); 

錯誤消息,

Copy .strings file Error Validation failed: The data couldn't be read because it has been corrupted.

+0

您能否發佈編譯錯誤和t如果文件不是很大,他會將文件串起來?我的猜測是你在字符串文件中有一個格式錯誤,但很難在沒有更多信息的情況下給出修復。 – McCygnus 2011-04-16 02:10:52

+0

@McCygnus我附加了我的代碼。謝謝您的意見。 – MonsterK 2011-04-16 02:40:58

+4

您的字符串文件在每行的末尾需要分號。 – jowie 2015-04-14 16:09:12

回答

92

我假設Xcode 4在這裏。仔細檢查文件檢查器中每個Localization.string文件的編碼顯示內容。當我遇到該錯誤時,這是​​由於其中一個文件被讀取爲Mac Roman而不是UTF-16。一旦我改變了編碼,警告就消失了。剛開始讓我瘋狂的是,這個警告只發生在Xcode 4上。Xcode 3沒有給出它。

您的.string文件的格式也存在問題。所有行應以分號結尾。

"LOCAL_APP_GRADE" = "Basic"; 
"LOCAL_APP_LAST_UPDATED_DATE" = "2011/04/20"; 
"LOCAL_MAIN_MENU_TITLE" = "Main Menu"; 

我不認爲這是警告的原因。至少我從來沒有看到它的警告。它通常只在LOCAL_MAIN_MENU_TITLE顯示在應用程序而不是主菜單時在運行時顯現。如果構建過程確實檢查了分號,那將會很好。編輯文件時錯過添加一個很容易。

+12

哦!天哪!!非常非常非常感謝你。我很傻。你讓我醒了。我已經更改爲UTF-16,但我錯過了';'。這使得錯誤發生。 (複製.string文件錯誤驗證失敗)。這讓我感到困惑。我從來沒有想過這會讓問題發生。 – MonsterK 2011-04-16 07:51:55

+0

你讓我在這個板子上附上我的代碼,它讓我知道問題是什麼。自從我開始使用xcode4以來,我無法使用NSLocalizedString函數。但我現在可以做到這一點。謝謝! – MonsterK 2011-04-16 07:52:16

+1

我很欣賞你的答案和你的嘗試。我很高興。 – MonsterK 2011-04-16 10:13:04

3

我一直在努力解決這個相同的錯誤,最終導致了一些類似的問題,但是具有不同的細節。首先,儘管看起來Xcode的內部「builtin-copyStrings」工具應該能夠處理小端或大端UTF-16文件,但它確實只能處理大端。我的理論是它正在運行一些額外的驗證步驟(可能使用plutil命令行實用程序),這些步驟在Xcode 3中不會發生,並且該工具欄除了大寫字母UTF-16之外的其他任何內容。不完全確定。

第二個訣竅是您需要確保您的字符串文件與 BOM(字節順序標記)一起保存。我在BBEdit中編輯了一些.strings文件,最終將BOM保存到文件中,這似乎也使Xcode 4具有了一個合適的配置。 Xcode本身似乎沒有任何方法從文件中刪除BOM,因此必須在文本編輯器(如BBEdit或TextWrangler)中完成,這可以爲您完成。

0

也許你有類似的東西: 「Bla」=「bla」;;

注意重複;符號。如果你有,它會正確編譯,但會在運行時失敗。

+0

此外,你可能有':'而不是';' – 2017-06-17 14:49:20

0

與此相關的 - 照顧手動合併成字符串時Localizable.strings - 我設法複製/從NSLocalizedString()宏粘貼兩個字符串,使Localizable.strings項是這種形式:

"KEY" = "STRING", @"COMMENT STRING COPIED ACROSS ALSO, IN ERROR"; 

打造的位,@"xxx"使我得到的錯誤:

Read failed: The data couldn't be read because it isn't in the correct format.

在這種情況下,做一個快速的搜索上@"幫助確定我做這個的地方。

0

我有這個問題。我的修復?在文件頂部添加一個換行符。奇怪,但它爲我工作。

所以不是我的文件的頂部

有這樣的:

/* comment */ 
"LOCAL_APP_GRADE" = "Basic" 

我不得不這樣做:

[newline] 
/* comment */ 
"LOCAL_APP_GRADE" = "Basic" 

(無法獲得正確的格式 - 不鍵入「新行',只是打回來!)

7

我從蘋果筆記導入本地化後,今天有同樣的問題,原因是非常微妙的。標準的雙引號已經與雙斜引號交換。

斜雙引號:」

標準雙引號:「

+0

謝謝你是我的唯一!我很欣賞 – 2015-02-16 10:55:08

64

每蘋果:

If you run into problems during testing and find that the functions and macros for retrieving strings are always returning the same key (as opposed to the translated value), run the /usr/bin/plutil tool on your strings file. A strings file is essentially a property-list file formatted in a special way. Running plutil with the -lint option can uncover hidden characters or other errors that are preventing strings from being retrieved correctly.

啓動一個控制檯窗口,進入你的項目文件夾,然後執行:

/usr/bin/plutil -lint ja.lproj/Localizable.strings 

(顯然替換正確的語言文件夾名稱)。這會告訴你究竟在哪裏問題是!

+0

它告訴我我的意見是無效的,但他們不是。 – jimpic 2014-07-07 12:50:35

+0

@jimpic - 到目前爲止,當我使用它時,大約有95%的工作時間,但有時候我注意到了,就像你在文件中有雜散文本一樣,那就會搞砸了,它不會給出一個有效的迴應(對我來說,它一直說當文件中的第一個字符不是無效時)。下次再試一次,它可以幫助你。 – 2014-07-21 10:54:00

+1

此工具適用於我。我遇到了神祕的「Copy .strings file Error」,plutil在一個非常大的Localizable.strings文件中用多餘的和未轉義的引號標識了幾個地方。它一次發現一個錯誤的引用,因此您必須反覆運行它。謝謝! – Phil 2014-08-14 18:05:02

17

.strings文件中的所有行應以分號結尾。它爲我工作。

+3

在我的腦子停止思考分號之後,我在Swift編程時感到困惑,這也是我的問題 – 2015-04-08 15:00:56

+0

在ObjC – 2016-06-06 23:27:20

+0

還是個問題在我的例子中,翻譯器刪除了幾個s emicolons -_- – Babac 2016-08-29 09:45:19

0

看起來像這是讀取字符串文件時出錯的標準消息。

對我來說,這是冒號,而不是等號一個(習慣JSON力):

"key1" = "String1"; 
"key2" : "String2"; 
"key3" = "String3"; 

改成了=,一切工作正常。

0

我的問題是,我已經在線路之一遺忘;

0

確保您在下面的格式聲明的字符串:

"YOUR_STRING_LABEL" = "Your message"; 

注:不要忘記引號(「),等號(=)分號(;)末尾