Локализованные строки Xcode 4… Ошибка проверки файла Copy .strings

#localization #xcode4

#локализация #xcode4

Вопрос:

Как мне определить локализованные строки в Xcode 4?

Я предположил, что могу просто добавить языки в InfoPlist.strings, используя свойство «Localization» (инспектор файлов, правая панель).

… и затем введите «ключ» = «значения» в каждой локализованной версии.

Но я не могу собрать проект. Я получаю эту ошибку:

Ошибка проверки ошибки файла Copy .strings: данные не удалось прочитать, поскольку они были повреждены.

Преобразование кодировки текста в UTF 16 не устраняет проблему. Также не выполняется выход из Xcode и его повторный запуск.

Q1: Как мне исправить эти ошибки сборки?

По какой-то случайности мне однажды удалось запустить тестовое приложение, добавив InfoPlist.strings (французский) и (английский) языки. Я не получил ошибку во французском файле strings, но я получил ее с английским. Поэтому я оставил английский в покое и просто ввел параметр во французский. Однако в симуляторе установлено значение French — параметр не был подобран. Он вернулся к значению по умолчанию, указанному в NSLocalizedString()

Q2: Как мне заставить его работать, даже если ошибки сборки исправлены?

Ответ №1:

Может быть так же просто, как пропущенная точка с запятой в конце строки.

Комментарии:

1. Спасибо. Это помогло. Однако, хотя он создается и запускается, он все равно не работает. NSLocalizedString (@»default»,@»приветствие») постоянно выдает значение по умолчанию.

2. У вас есть несколько файлов .strings? Если это так, NSLocalizedStringFromTable.

3. Теперь это работает. Не уверен, почему. Может быть, сохранение и загрузка снова?

4. ваша проблема заключалась в том, что NSLocalizedString(x, y) принимает нужный вам ключ в качестве первого аргумента (x) и комментарий в качестве второго (y), поэтому то, что вы написали в своем комментарии, должно было быть: NSLocalizedString(@"greeting", @"default")

5. При отсутствии точки с запятой Xcode каким-то образом не показывает это предупреждение, пока вы не закроете и не откроете его повторно. Проект выполняется без каких-либо ошибок или предупреждений. Вы просто получаете ключи в виде значений. Вы видите, в чем проблема, сразу после перезапуска Xcode.

Ответ №2:

У меня была такая же проблема с поиском ошибок в файле локализации…

Просто используйте инструмент plutil в терминале для преобразования файла, и вы получите правильное сообщение об ошибке с номером строки.

plutil -lint Localizable.strings

Ответ

plutil[74058:707] CFPropertyListCreateFromXMLData(): анализатор plist в старом стиле: отсутствует точка с запятой в словаре в строке 422. Синтаксический анализ будет прекращен. Прервите _CFPropertyListMissingSemicolon для отладки. Localizable.strings: неожиданный символ «в строке 1

Комментарии:

1. Полностью согласен с @Jason; это сразу выявило мою проблему (которую Xcode даже не нашел — он просто не показывал переводы в приложении). Хорошая находка, @TomTom !!

2. Возможно, лучший ответ в любом месте StackOverflow! спасибо (в моем случае проблема была вызвана несколькими умными кавычками)

3. Большое спасибо, не хватало ‘;’ но то же самое утомительно находить в большом файле,

Ответ №3:

да, только что просмотрел 500 переводов

обратите внимание, что ПОЦЕЛУЙ во второй строке заключен в двойные кавычки, которые находятся ВНУТРИ другой ОШИБКИ ДВОЙНЫХ КАВЫЧЕК

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

Все в порядке

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

как это (заменить одинарными кавычками ВНУТРИ 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.";
  

СОВЕТ
ИСПОЛЬЗУЙТЕ ДВОИЧНЫЙ ПОИСК, чтобы найти строку-нарушитель.

  1. верните локализованные файлы из translator.
  2. скопируйте все Loclaizable.strings в локализованные папки вашего проекта.
  3. Откройте XCODE
  4. Очистить все устройства iOS / все симуляторы
  5. Сборка
  6. Ошибка проверки ошибки файла Copy .strings: данные не удалось прочитать, поскольку они были повреждены.
  7. Откройте навигатор журналов
  8. Посмотрите, какой из переводов поврежден.
  9. Я открыл Localizable.strings в TextWrangler Внизу на панели инструментов Переводчик отправил обратно файл UTF-16 как

Кодировка с небольшим окончанием UTF-16 изменила его обратно просто на ‘UTF-16’ 10. Очищенная сборка / Build ТА ЖЕ ОШИБКА

Где-то в файле

Отсутствует точка с запятой?

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

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

«Лишние»двойные кавычки «внутри двойных кавычек»

НЕВЕРНО

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

ПРАВИЛЬНО

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

ТАКЖЕ ВЕРНО

 /* popup message */
"Save mix" = "Enregistrer le 'mix'age"
  
  • помните, что в файле может быть более одной ошибки
    Я нашел «KISS» в двойных кавычках в двух местах

Комментарии:

1. Спасибо .. у меня отсутствовали двойные кавычки!

Ответ №4:

Проверьте кодировку вашего файла. Это часто вызывается расширенными символами (например, символами с ударением) и кодировкой, отличной от UTF. В частности, в XCode 4 есть ошибка, из-за которой при копировании символов с ударением в файл strings из Safari он будет сохранен как Western Mac OS Roman.

Комментарии:

1. Да, моему файлу strings каким-то образом была перенастроена кодировка UTF8, установка ее в UTF16 позволила успешно выполнить сборку.

2. Несмотря на то, что у меня были только допустимые символы UTF-8, изменение моих файлов на UTF-16 исправило эту ошибку.

Ответ №5:

Жаль, что средство проверки синтаксиса XCode не может это выяснить.

Вы также можете скопировать текст в Text Wrangler (что я делаю после получения файла от переводчика), чтобы проверить правильность строк, заключенных в кавычки, или запустить регулярное выражение, проверяющее наличие точек с запятой. Синтаксическая раскраска в Text Wrangler отобразит строки, заключенные в неправильные кавычки (или неправильно экранированные), там, где в данный момент нет строк в редакторе XCode.

Комментарии:

1. TextMate делает то же самое.

2. TextWrangler (который теперь является BBEdit ) с его синтаксической раскраской — отличный способ проверить, нет ли проблем в файле. В моем случае были пробелы, которые не были обычными. View > Text Display > Show Invisibles покажет вам эти проблемные символы.

Ответ №6:

В моем случае plutil -lint Localizable.strings не помогло, потому что сообщение об ошибке, которое оно выдало, было « Unexpected character " at line 1 «, когда реальной ошибкой было вместо " a в строке 2340.

Ответ №7:

В моем случае это была проблема с копией знака «цитата», вставленного с веб-сайта, который не был принят.

Я должен был обнаружить, что подсветка синтаксиса не работает, но я только что прочитал источник «знак кавычки, ключ, знак кавычки, знак равенства, знак кавычки, значение, знак кавычки… да, хорошо».

Ответ №8:

Если вы используете двойные кавычки «» в своей локализации, не забудьте экранировать их с помощью обратной косой черты.

Ответ №9:

Следует проверить синтаксис следующим образом

 "Recharge_Data" = "Data";
  

1) «» должно быть там в надлежащем месте.

2) = должно быть проверено.

3); должно быть там в конце инструкции.

Ответ №10:

У меня была такая же проблема. У меня был файл локализации длиной около 60 страниц, и было только одно «слишком много — потребовалось некоторое время, чтобы определить это

Ответ №11:

У меня была такая же проблема с большим локализованным файлом в течение часа, и применение всех вышеуказанных шагов не решит мою проблему, наконец, что я закончил, так это разделить локализованный файл на некоторые диапазоны (части), скажем, часть-a, b, c … и вырежьте эти строки из файла и сохраните их в текстовом файле, создайте проект заново, до тех пор, пока я не дойду до точки, где осталась только часть k, я обнаружил, что по ошибке нажал f на своей клавиатуре ..fewwww! это решено. Я знаю, что это не решение, но может помочь кому-то вроде меня 🙂

Ответ №12:

Мой друг сделал для меня перевод в Windows. Я обнаружил, что изменение кодировки не помогает, поэтому вот что я сделал: я прокомментировал все строки, а затем раскомментировал несколько и нажал cmd-B, чтобы выяснить, в каких строках возникли проблемы. Затем я переписал проблемные строки вручную, и после этого все заработало.