Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")

Ответ 6

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

Ответ 7

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

(/Пользователи/(me)/Library/Поддержка приложений /iPhone Имитатор/5.0/Применения/(и т.д.)/(проект)/(application.app)

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

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

Ответ 8

Двойная проверка того, что файл Localizable.strings добавляется в

Цели → BuildPhases → Ресурсы копирования ресурсов

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

Ответ 9

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

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

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

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Если путь равен NULL, значит, файл не найден.

Ответ 13

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

Ответ 14

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

Так что определенно, если формат неверен, Xcode не будет читать строки для вас.

Это формат, который он ожидает "Ключ" = "Значение";

Ответ 19

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

Ответ 20

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

iOS Simulator > Reset Содержимое и настройки...

Ответ 21

Обязательно не помещайте '@' перед вашими key или value так:

@"key" = @"value";

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

"key" = "value";

При доступе к нему "перед" появляется только "@":

NSWebLocalizedString(@"key", @"label for coder");

Ответ 22

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

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

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

Ответ 23

Для 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

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

Ответ 24

Свифт 4:

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

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")

Ответ 25

Когда вы разрабатываете 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, упомянутое доктором OX. Вам нужно сделать еще немного. Исходное расширение выглядит следующим образом.

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

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

Ответ 26

Я решил это, используя этот подход.

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

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

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

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)

Ответ 27

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

Если ваш ключ содержит "\ u2028" вместо "\n", он всегда будет возвращать только ключ, а не значение. Кажется, это ошибка с локализацией.

Ответ 28

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

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

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

Ответ 29

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