65
votes

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?

12

12 Answers

237
votes

Could be as simple as a missing semi-colon at the end of the line.

100
votes

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

14
votes

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.

  1. get localized files back from translator.
  2. copy all Loclaizable.strings into your project localized folders.
  3. Open XCODE
  4. Clean all - in iOS Device/all Simulators
  5. Build
  6. Copy .strings file Error Validation failed: The data couldn't be read because it has been corrupted.
  7. Open the log navigator
  8. See which of the translations is corrupt.
  9. I opened the Localizable.strings in TextWrangler At bottom in tool bar Translator had sent back UTF-16 file as

UTF-16 Little Endian Changed it back to just 'UTF-16' 10. Cleaned build/Build SAME ERROR

Somewhere in the file is

Missing semicolon?

/* popup message */
"Save mix" = "Enregistrer le mixage";

/* popup message */
"Save mix" = "Enregistrer le mixage"

"Extra "double quotes" inside double quotes"

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"
  • remember there may be more than one error in a file I found "KISS" in double-double quotes in two places
8
votes

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.

7
votes

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.

5
votes

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.

2
votes

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".

2
votes

If you use double quotation "" in your localisation, don't forget to escape them using a back slash.

1
votes

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.

0
votes

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

0
votes

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:)

0
votes

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.