NSLocalizedString извлекает только ключ, а не значение в Localizable.strings (IOS) - PullRequest
40 голосов
/ 12 февраля 2012

Я создал файл строк с именем «Localizable.strings» и добавил к нему два языка, например:

"CONNECTIONERROR" = "Check that you have a working internet connection.";
"CONNECTIONERRORTITLE" = "Network error";

Я также преобразовал файлы в Unicode UTF-8 Однако, когда я создаю UIAlertView, как это:

 UIAlertView *myAlert = [[UIAlertView alloc]
 initWithTitle:NSLocalizedString(@"CONNECTIONERRORITLE",nil)
 message:NSLocalizedString(@"CONNECTIONERROR",nil)                    
 delegate:self
 cancelButtonTitle:@"Ok"
 otherButtonTitles:nil];

в окне предупреждения отображается только текст ключа, а не значение. Это работает, если я, например, установил для текста UITextviews значение NSLocalizedString (@ "CONNECTIONERROR", nil), но в представлении предупреждений отображается только ключ. Кто-нибудь знает, что не так?

Ответы [ 29 ]

97 голосов
/ 01 июля 2012

В моем случае это было потому, что я по ошибке назвал файл «Localization.strings» и не заметил (он должен называться Localizable.strings). Как объяснено ранее, симптом заключается в том, что компилятор не может найти строку. В противном случае причиной может быть любое количество вещей, но обычно это пропущенная точка с запятой или кавычка. Их трудно найти, когда вы делаете много локализаций одновременно. Извлеченный урок состоит в том, чтобы начать сборку файла локализации на раннем этапе процесса разработки и создавать его по мере необходимости, чтобы его было легче обнаружить.

25 голосов
/ 20 марта 2014

Та же проблема, решаемая с помощью имени файла: Localizable.strings

13 голосов
/ 22 июня 2017

Измените ваше .strings имя файла на Localizable.strings, у меня это сработало.

11 голосов
/ 02 сентября 2014

Дважды проверьте, что файл Localizable.strings добавляется в

Targets -> BuildPhases -> Copy Bundle Resources

Он не был добавлен автоматически для меня.

11 голосов
/ 20 апреля 2012

Протестировал приложение на реальном устройстве, и оно заработало

9 голосов
/ 19 августа 2015

Я искал решение в течение 5 часов, я пытался сделать все возможное, чтобы локализация моего приложения работала.

Проблема заключалась в том, что один из модулей моего проекта имел файл Localizable.strings (на самом деле это был модуль Parse, который не переименовал его). Поэтому мой файл Localizable.strings не был распознан моим приложением.

Я исправил проблему, изменив имя файла на «MyappnameLocalizable.strings» и используя NSLocalizedString следующим образом:

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
8 голосов
/ 26 июля 2012

У меня были проблемы с этим на симуляторе iOS.В итоге я удалил файл Localization.strings в каталоге симулятора

(/ Users / (me) / Библиотека / Поддержка приложений / iPhone Simulator / 5.0 / Applications / (etc) / (project) /(application.app)

перейдите туда и удалите все найденные там копии Localization.strings.

По какой-то причине обычная резиновая курица вуду из build clean, выйдите из iOS Simulatorвыход из XCode и т. д. не работал, но это сработало. По крайней мере, для меня сегодня.

8 голосов
/ 12 февраля 2012

Это происходит, когда среда выполнения не может найти указанный ключ по какой-либо причине.В вашем случае это, скорее всего, из-за опечатки: CONNECTIONERRORITLE отсутствует T для TITLE.Также обратите внимание на любые предупреждения / ошибки при компиляции относительно файла Localizable.strings: если есть несбалансированный " или отсутствует ;, файл не может быть скомпилирован / прочитан правильно.

7 голосов
/ 02 июля 2015

Измените имя файла на Localizable.strings, убедитесь, что цель в файловом инспекторе установлена.Чтобы избежать синтаксических ошибок, щелкните правой кнопкой мыши файл Localizable.strings-> open as-> ASCII property list. В моем случае также помогла очистка проекта и сборка.

6 голосов
/ 12 февраля 2012

Использование NSLocalizedString означает, что для получения содержимого из него вам понадобится прецизионный регистр и написание вашего ключа.Вы заметите, что это говорит

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

, когда оно должно быть

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

Если вы посмотрите на последнюю часть первой, она говорит: «ITLE», а не «TITLE "

...