Reputation: 1233
How do I define localised strings in Xcode 4?
I assumed I could just add languages to InfoPlist.strings using the "Localization" property (File inspector, right panel).
...and then type in the "key" = "value"s in each localised version.
But I can't build the project. I get this error:
Copy .strings file Error Validation failed: The data couldn't be read because it has been corrupted.
Converting the text encoding to UTF 16 doesn't fix the problem. Neither does quitting Xcode and starting it again.
Q1: How do I remedy these build errors?
By some fluke, I did once manage to get a test app to run adding a InfoPlist.strings (French) and (English). I didn't get the error on the French strings file, but I did with the English. So I left the English one alone, and just put a parameter in the French one. However, in the simulator, set to French - the parameter wasn't picked up. It reverted to the default specified in NSLocalizedString()
Q2: How do I get it working even if the build errors are remedied?
Upvotes: 68
Views: 35774
Reputation: 745
In Xcode 14, there is a convenient solution for this issue.
Follow these steps to resolve it:
Localizable.strings
file.Open As
and then choose ASCII Property List
from the submenu.By following these steps, you can easily identify the problematic line and address the error in your Localizable.strings
file.
Upvotes: 1
Reputation: 1838
One should Check syntax like this
"Recharge_Data" = "Data";
1) "" should be there on proper place.
2) = should be checked.
3) ; should be there at end of statement.
Upvotes: 2
Reputation: 4748
If you use double quotation "" in your localisation, don't forget to escape them using a back slash.
Upvotes: 2
Reputation: 443
In my case, plutil -lint Localizable.strings
didn't help because the error message it produced was "Unexpected character " at line 1
" when the real error was a ”
instead of a "
on line 2340.
Upvotes: 6
Reputation: 16674
My friend did translation for me in Windows. I found, that changing encoding doesn't help, so what I did: I commented all of the strings, and then I uncommented a few and pressed cmd-B, to find out which strings had problems. Then I rewrote problem strings manually and after that it worked.
Upvotes: 0
Reputation: 2014
I had same the issue finding the errors within the localization file...
Just use the tool plutil in the terminal to convert the file and you will get a proper error message with the line number.
plutil -lint Localizable.strings
Response
plutil[74058:707] CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon in dictionary on line 422. Parsing will be abandoned. Break on _CFPropertyListMissingSemicolon to debug. Localizable.strings: Unexpected character " at line 1
Upvotes: 101
Reputation: 27052
I'd the same issue for a big localized file from an hour and apply all above steps won't solve my problem, finally what I am done with is, devide localize file into some ranges (parts), say part-a, b, c ... and cut those strings from file, and keep those in a text file, build the project again, unless and until I reached to the point, where only part-k was left, I found that by mistakenly I pressed f on my keyboard..fewww! it solved. I know this is not a solution but may be help to someone like me:)
Upvotes: 0
Reputation: 79
I have had the same problem. I had a about 60 pages long localization file, and had just one " too many - took a while to spot that
Upvotes: 0
Reputation: 5327
yes just trawled through 500 translations
note the KISS in the second string is in Double quotes which are INSIDE another DOUBLE QUOTES ERROR
"Before using KISS Remixer, you must agree to the terms and conditions of use." = "Vor der Nutzung des Remixers "KISS" müssen Sie die Allgemeinen Geschäftsbedingungen akzeptieren.";
This is OK
"Before using KISS Remixer, you must agree to the terms and conditions of use." = "Vor der Nutzung des Remixers KISS müssen Sie die Allgemeinen Geschäftsbedingungen akzeptieren.";
as is this (replace with single quotes INSIDE THE DOUBLE)
"Before using KISS Remixer, you must agree to the terms and conditions of use." = "Vor der Nutzung des Remixers 'KISS' müssen Sie die Allgemeinen Geschäftsbedingungen akzeptieren.";
TIP USE a BINARY SEARCH to find the offending line.
UTF-16 Little Endian Changed it back to just 'UTF-16' 10. Cleaned build/Build SAME ERROR
Somewhere in the file is
/* popup message */
"Save mix" = "Enregistrer le mixage";
/* popup message */
"Save mix" = "Enregistrer le mixage"
WRONG
/* popup message */
"Save mix" = "Enregistrer le "mix" age"
RIGHT
/* popup message */
"Save mix" = "Enregistrer le mixage"
ALSO RIGHT
/* popup message */
"Save mix" = "Enregistrer le 'mix'age"
Upvotes: 14
Reputation: 5389
In my case, it was a problem of "quote" sign copy-pasted from a website, that was not accepted.
I should have detected that from syntax-highlighting not working, but I just read the source "quote sign, key, quote sign, equality sign, quote sign, value, quote sign... yup okay".
Upvotes: 2
Reputation: 375
It's a shame that XCode's syntax checker can't figure this out.
You can also copy the text into Text Wrangler (something I do after receiving a file from a translator) to check for properly quoted strings or run a regex checking for semicolons. The syntax coloring in Text Wrangler will show mis-quoted (or mis-escaped) strings where XCode's strings editor currently does not.
Upvotes: 7
Reputation: 1450
Check your file encoding. This is often caused by extended characters (like accented characters) and a non UTF encoding. In particular there is a bug in XCode 4 that if you copy accented characters into a strings file from Safari it will then save as Western Mac OS Roman.
Upvotes: 8
Reputation: 3068
Could be as simple as a missing semi-colon at the end of the line.
Upvotes: 239