NSLocalizedString извлекает только ключ, а не значение в Localizable.strings (IOS)

Я создал строковый файл с именем "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), но в представлении предупреждений отображается только ключ. Кто-нибудь знает, что случилось?


person Smiden    schedule 12.02.2012    source источник
comment
NSLocalizedString() возвращает ключ, если не удается найти пару ключ / значение.   -  person Costique    schedule 12.02.2012
comment
Извините, я не копировал / вставлял код, поэтому это был тип-о. Однако код в моем приложении правильный.   -  person Smiden    schedule 12.02.2012
comment
Нашел проблему. У меня это не работает в симуляторе iPhone, поэтому я протестировал его на реальном устройстве, и он сработал.   -  person Smiden    schedule 12.02.2012
comment
Ознакомьтесь с Как ответить [1], это может помочь. [1]: stackoverflow.com/a/8972349   -  person    schedule 04.01.2013
comment
Не бойтесь использовать в ключе символы подчеркивания или пробелы.   -  person clocksmith    schedule 05.09.2014
comment
Я тоже столкнулся с этой проблемой. проверил все файлы в Project Navigator. Файл Localizable.strings добавляется дважды. поэтому я удалил один файл и локализовал этот файл для Base (английский), а другой - для испанского.   -  person Coder_A_D    schedule 18.03.2015
comment
Я все еще не могу заставить его работать. UIAlertView * alert = [[UIAlertView alloc] initWithTitle: NSLocalizedString (@WARNING, nil) message: NSLocalizedString (@LOGIN_NRIC_REQUIRED, nil) delegate: self cancelButtonTitle: @OK otherButtonTitles: nil]; не работает получил LOGIN_NRIC_REQUIRED. Любая идея?   -  person TPG    schedule 07.08.2015


Ответы (30)


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

person Jim Rota    schedule 01.07.2012
comment
Спасибо, этот комментарий мне очень помог! - person Tom; 08.03.2013
comment
Лол, это помогло. Спасибо - person Nico S.; 27.05.2016
comment
обратите внимание, что имя файла чувствительно к регистру. Поэтому вам нужно использовать .strings вместо .Strings - person He Yifei 何一非; 27.06.2016
comment
Спасибо, это спасло мне день - person Alex; 11.04.2017
comment
Имя файла должно быть Localizable.string, с верхним L, без s ... Соглашение о конфигурации ... I ненавижу эту парадигму. - person Martin; 13.04.2017
comment
Спасибо. спаси мою жизнь - person KingWu; 05.05.2017
comment
Localizable.strings и в моем случае. Два часа потратил на то, чтобы найти причину проблемы. - person Nermin Sehic; 16.08.2017
comment
У меня сработали смена имени, очистка и удаление приложения. - person Sharad Chauhan; 28.05.2018
comment
Большое спасибо, сэкономили много времени, чтобы разобраться в проблеме. - person Sagar Daundkar; 12.12.2019

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

person Pelanes    schedule 20.03.2014

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

person alicanozkara    schedule 22.06.2017

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

Цели - ›BuildPhases -› Копировать ресурсы пакета

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

Изменить 2021 год: с XCode 12 необходимо добавить Localizable.strings в

Цели - ›Этапы сборки -› Ресурсы компиляции

person virsunen    schedule 02.09.2014
comment
Ты спаситель. Это было проблемой в моем случае. - person Nova; 18.06.2015
comment
У меня это сработало после удаления его из Copy Bundle Resources и добавления его обратно. - person Daniel; 11.11.2020
comment
Здорово! Очень полезно! Я обновил ответ, так как меню немного изменились по сравнению с исходным ответом, и я думаю, что это все еще может помочь многим людям. - person Christophe; 13.05.2021

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

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

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

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
person aiwis31    schedule 19.08.2015

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

person Smiden    schedule 20.04.2012
comment
Другая проблема заключается в том, что файл Localizable.strings не очищается и не инициализируется должным образом; если вы раньше тестировали устройство, а затем создали или значительно изменили файлы Localizable.strings, изменения не всегда замечаются, поэтому вам необходимо ОЧИСТИТЬ свою сборку И удалить копию с устройства, прежде чем изменения распространятся должным образом. - person mark; 05.06.2012
comment
У меня сработало удаление приложения из симулятора. - person cprcrack; 18.01.2015
comment
Я считаю, что удаления приложения из папки Build Products на Mac достаточно, чтобы Xcode использовал все последние файлы. - person Walt Sellers; 18.07.2018

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

(/ Пользователи / (я) / Библиотека / Поддержка приложений / iPhone Simulator / 5.0 / Приложения / (и т. Д.) / (Проект) / (application.app)

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

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

person Andrew Lewis    schedule 25.07.2012

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

person DarkDust    schedule 12.02.2012

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

person Nick Greg    schedule 02.07.2015
comment
Это также отличный способ найти ошибки в файле Localizable.strings. - person ViruMax; 23.02.2017

Использование NSLocalizedString означает, что вам нужен ТОЧНЫЙ регистр и написание вашего ключа, чтобы получить из него содержимое. Вы заметите, что это говорит

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

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

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

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

person CodaFi    schedule 12.02.2012
comment
Недавно мы изменили имена перечислений, чтобы они начинались с нижнего регистра во время перехода на новый Swift. Но мы забыли, что извлекаем некоторые длинные строковые ключи из имен перечислений. Имена больше не совпадают. Один другой персонаж находился в середине, поэтому его было трудно заметить. Я проверял совпадение строк с помощью функции поиска Xcode. Поскольку регистр не учитывался, он нашел ключи, и я предположил, что они совпадают. Ваш ответ заставил меня перепроверить и найти ошибку. Спасибо. (Теперь наше значение по умолчанию изменится, поэтому мы сразу заметим это в отладочных сборках.) - person Walt Sellers; 18.07.2018

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

person Pelanes    schedule 07.07.2014

Если вы написали двойную точку с запятой в конце строки, NSLocalization не работает. Вы должны проверить файл Localizable.strings, если там есть ';;'

person BurtK    schedule 29.11.2013
comment
да, это случилось со мной, я проверяю и решаю это ... спасибо за помощь. - person Devil; 06.07.2019

Чтобы узнать, обнаружен ли файл Localizable.strings, проверьте содержимое вашей сборки .app, и вы также можете сделать это в коде:

// например, en для английского языка, поэтому укажите здесь свой NSString * path = [[NSBundle mainBundle] pathForResource: @ "en" ofType: @ "lproj"];

Если путь - ПУСТО (NULL), это означает, что файл не найден.

person Komposr    schedule 24.07.2013

Когда вы разрабатываете SDK. Вам нужна дополнительная операция.

1) Создайте Localizable.strings как обычно в YourLocalizeDemoSDK.

2) создайте такие же Localizable.strings в YourLocalizeDemo.

3) Найдите свой путь к пакету YourLocalizeDemoSDK.

Swift4:

// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")

Bundle(for: type(of: self)) поможет вам найти пакет в YourLocalizeDemoSDK. Если вы вместо этого используете Bundle.main, вы получите неправильное значение (фактически это будет та же строка, что и ключ).

Но если вы хотите использовать расширение String, упомянутое dr OX. Вам нужно сделать еще кое-что. Расширение origin выглядит так.

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

Как мы знаем, мы разрабатываем SDK, Bundle.main получит пакет пакета YourLocalizeDemo. Это не то, что мы хотим. Нам нужен комплект в YourLocalizeDemoSDK. Это уловка, позволяющая быстро его найти.

Запустите приведенный ниже код в экземпляре NSObject в YourLocalizeDemoSDK. И вы получите URL-адрес YourLocalizeDemoSDK.

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL

Распечатайте оба из двух URL-адресов, и вы обнаружите, что мы можем построить базу bundleURLofSDK на mainBundleURL. В этом случае это будут:

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main

И расширение String будет:

extension String {
    var localized: String {
        let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
        return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
    }
}

Надеюсь, поможет.

person Liam    schedule 05.07.2018

Если у вас есть лишняя точка с запятой в вашем строковом файле, он не локализуется.

person Teja Nandamuri    schedule 07.10.2015

Я столкнулся с аналогичной проблемой, внезапно мои локализуемые строки вообще не работали. Затем я использовал file-compare со старой копией .strings и, наконец, обнаружил, что случайно удалил в ней ключ.

Итак, определенно, если формат неправильный, Xcode не будет читать строки за вас.

Это ожидаемый формат "Key" = "Value";

person sandyios    schedule 18.01.2016

Поскольку я наткнулся на это, когда искал ответ на аналогичную проблему, я оставляю свое решение здесь:

Если в вашем ключе есть «\ u2028» вместо «\ n», он всегда будет возвращать только ключ, а не значение. Вроде баг с локализацией.

person Luke    schedule 24.10.2018
comment
Мне кажется, что ни \ u2028, ни \ n не работают с локализацией. В любом случае я поставил вам +1 за признание дефектов локализации, которая на самом деле не была стабильной с xCode 9.2. - person Larry Ricker; 17.08.2019

Положить ; в конце строк в файлах Localizable.strings.

person Vincent    schedule 04.02.2014

Сброс настроек симулятора у меня сработал.

Симулятор iOS> Сбросить содержимое и настройки ...

person clocksmith    schedule 04.09.2014

В моем случае я попытался очистить проект, и удалить производные данные все еще не удалось. Я удаляю несколько разрывов строк в файле строк, а затем Xcode снова находит строки.

person BillChan    schedule 08.12.2014

Ни одно из предложенных решений не помогло мне, но я решил проблему, удалив файл .app в продуктах.

person Matthew    schedule 19.08.2015

У меня была проблема, когда один язык работал правильно, а другой работал половину времени, а в другой раз я получал ключ вместо локализованной версии этого ключа.

Проблема в моем случае заключалась в том, что после ручного слияния конфликта управления версиями осталась лишняя строка '>>>>>', проект не жаловался (не например, когда вы пропускаете точку с запятой, он жалуется) и строился правильно, поэтому каждый ключ до этого '>>>>>' переводился, а каждый последующий - нет.

Если более простые решения не помогут, вам, возможно, придется просмотреть каждую строку и искать дополнительные символы (не только '>>>>>', другие дополнительные символы тоже), или, если вы используете контроль версий, получите более старую, стабильную версию Localizable.strings и вручную внесите изменения и добавьте более поздние коммиты.

person sabius    schedule 13.12.2018
comment
Спасибо. В моем случае это был один символ Plus char + перед одним из ключей в файле Localizable.string, который был добавлен мной во время процесса слияния случайно. - person dzensik; 24.06.2020

Мы столкнулись с проблемой, из-за которой некоторые ключи не получали своих значений, несмотря на то, что все они существовали в Localizable.strings.

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

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

Таким образом, наличие двух точек с запятой в одной строке привело к компиляции файла, несмотря на отсутствие точек с запятой в других строках.

Похоже, что парсер Apple для .strings файла очень примитивен.

К сожалению, в нашем случае линтер plist оказался бесполезным. Чтобы найти и исправить проблему, я скопировал и вставил все содержимое нашего файла Localizable.strings (длина которого превышает 2000 строк) и начал копировать его обратно кусками по 20 строк и каждый раз компилировать. Это был единственный способ найти проблему, которую линтер не мог уловить.

person Andy Ibanez    schedule 30.09.2020

Первая строка файла локализации должна содержать сопоставление, иначе SDK не прочитает файл.

person Clint Johnson    schedule 22.12.2013

Не ставьте "@" перед вашим key или value так:

@"key" = @"value";

Это должно быть просто:

"key" = "value";

'@' Ставится перед ключом только при доступе к нему:

NSWebLocalizedString(@"key", @"label for coder");
person craned    schedule 02.10.2014

У меня все заработало, как вдруг локализация просто перестала переводить строки. Это означает, что файл почему-то не читается Xcode.

Это случилось со мной, потому что я вставил неправильный символ в файл Localized.strings. Когда я удалил несколько строк с оскорбительным символом (символ не в Юникоде? Плохие знаки кавычки? Не могу сказать), все вернулось в норму.

Чтобы найти ошибочные строки, я установил точку останова и вручную перевел строки в моем файле в отладчике, пока не нажал на первую, которая не переводилась.

person Eran Goldin    schedule 10.07.2015

Вы пробовали очистить и перестроить проект?

person ChrisVollo    schedule 30.04.2015

Для xcode 9.2 удаление файлов "Localizable.strings" из симуляторов проекта с помощью консоли решило эту проблему для меня. Вот команды для таких ленивых, как я;)

Не забудьте заменить YOUR_APP_NAME_HERE названием своего проекта.

Сценарий оболочки:

cd
cd Library/Developer/CoreSimulator/Devices/
find . -name "Localizable.strings" | grep "YOUR_APP_NAME_HERE.app" | xargs rm

Если у вас возникла проблема с модульными тестами, она будет работать в симуляторе;)

person ergunkocak    schedule 14.03.2018

Swift 4:

Если вы используете более одного пакета, например, во внешней структуре:

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
person Ahmed Lotfy    schedule 22.05.2018

Я решил это с помощью этого подхода.

Файл localize был создан с именем main.Strings. Затем я открываю файлы main.Strings (для каждого добавленного языка), переименовываю их вручную с именем localize.strings и добавляю их один за другим в свой проект, также я удалил main.strings.

Второе, что нужно оценить, - это проверить. ваш файл, все keys должны заканчиваться на ;, и убедитесь, что все quotes правильно открыты и закрыты.

И вы можете использовать в swift 4:

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)
person MrMins    schedule 14.09.2018