Ответ 1
Протестировано приложение на самом устройстве, и оно сработало
Я создал файл строк с именем "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", ноль), но в окне предупреждения отображается только ключ. Кто-нибудь знает, что случилось?
Протестировано приложение на самом устройстве, и оно сработало
В моем случае это было потому, что я ошибочно назвал файл "Localization.strings" и не заметил (его нужно назвать Localizable.strings). Как объяснялось ранее, симптом объясняется тем, что компилятор не может найти строку. В противном случае причиной может быть любое количество вещей, но обычно это недостающая полуколока или кавычка. Их трудно найти, когда вы делаете много локализаций сразу. Выученный урок заключается в том, чтобы начать создавать свой файл локализации на ранней стадии вашего процесса разработки и строить его по ходу, чтобы их было легче обнаружить.
Аналогичная проблема, решаемая с использованием имени файла: Localizable.strings
Измените имя файла .strings
на Localizable.strings
, это сработало для меня.
Я искал решение в течение 5 часов, я пробовал все, что мог, чтобы моя локализация приложений работала.
Проблема заключалась в том, что у одного из Pods моего проекта был файл Localizable.strings(на самом деле это был Parse pod, который не переименовал его). Поэтому мой файл Localizable.strings не был распознан моим приложением.
Я исправил проблему, изменив имя файла на "MyappnameLocalizable.strings" и используя NSLocalizedString следующим образом:
NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
Это происходит, когда среда выполнения не может найти указанный ключ по какой-либо причине. В вашем случае это скорее всего из-за опечатки: CONNECTIONERRORITLE
отсутствует T
для TITLE
. Также обратите внимание на любые предупреждения/ошибки при компиляции в отношении файла Localizable.strings
: если есть неуравновешенный "
или отсутствует ;
, файл не может быть скомпилирован/правильно прочитан.
У меня возникли проблемы с этим на симуляторе iOS. Я закончил удаление файла Localization.strings в каталоге симулятора
(/Пользователи/(me)/Library/Поддержка приложений /iPhone Имитатор/5.0/Применения/(и т.д.)/(проект)/(application.app)
cd и удалите все найденные там локализации .strings.
По какой-то причине обычный резиновый кукольный вуду, построенный чистым, вышел из iOS Simulator, вышел из XCode и т.д., не работал, но это произошло. По крайней мере, для меня сегодня.
Двойная проверка того, что файл Localizable.strings добавляется в
Цели → BuildPhases → Ресурсы копирования ресурсов
Он не был автоматически добавлен для меня.
Использование NSLocalizedString означает, что вам нужен EXACT-код и написание вашего ключа, чтобы получить от него контент. Вы заметите, что это говорит
NSLocalizedString(@"CONNECTIONERRORITLE",nil)
когда он должен быть
NSLocalizedString(@"CONNECTIONERRORTITLE",nil)
Если вы посмотрите на последнюю часть первого, в нем говорится "ITLE", а не "TITLE"
Переименуйте файл InfoPlist.strings в Localizable.strings(double clic), а затем вы получите правильную строку для этого ключа.
Измените имя файла на Localizable.strings, убедитесь, что цель в инспекторе файлов установлена. Чтобы избежать ошибок синтаксиса, щелкните правой кнопкой мыши файл Localizable.strings file- > open as- > ASCII. Кроме того, очистка проекта и строительства снова помогла мне в моем случае.
Чтобы узнать, найден ли файл Localizable.strings, проверьте содержимое своей сборки .app, и вы также можете сделать это в коде:
//en для английского языка, например, укажите свое здесь NSString * path = [[NSBundle mainBundle] pathForResource: @ "en" ofType: @ "lproj" ];
Если путь равен NULL, значит, файл не найден.
Если вы написали двойные точки с запятой в конце строки, NSLocalization не работает. Вы должны проверить файл Localizable.strings, если есть ';;'
Если у вас есть дополнительная точка с запятой в файле строк, она не локализуется.
Положите a; в конце строк в файлах Localizable.strings.
В моем случае я попробовал очистить проект и удалить производные данные, которые все еще не работают. Я удаляю несколько строк в файле строк, а затем Xcode снова находит строки.
Ни один из предлагаемых решений не работал у меня, но я решил проблему, удалив файл .app в Products
Я столкнулся с аналогичной проблемой, внезапно мои локализуемые строки не работали вообще. Затем я использовал сравнение файлов со старой копией .strings, и, наконец, я обнаружил, что случайно удалил в ней ключ.
Так что определенно, если формат неверен, Xcode не будет читать строки для вас.
Это формат, который он ожидает "Ключ" = "Значение";
Первая строка файла локализации должна содержать сопоставление, иначе SDK не будет читать файл.
Сброс настроек симулятора работал у меня.
iOS Simulator > Reset Содержимое и настройки...
Обязательно не помещайте '@' перед вашими key
или value
так:
@"key" = @"value";
Это должно быть просто:
"key" = "value";
При доступе к нему "перед" появляется только "@":
NSWebLocalizedString(@"key", @"label for coder");
У меня все работало, когда вдруг локализация просто прекратила переводить строки. Это означает, что файл как-то нечитабельен для Xcode.
Это случилось со мной, потому что в файле Localized.strings
был вставлен плохой символ. Когда я удалил несколько строк с оскорбительным символом (символ некодического символа? Неправильные знаки котировки? Не могу сказать) все вернулось к нормальному.
Чтобы найти оскорбительные строки, я сделал точку останова и вручную перевел строки в моем файле в отладчике, пока не ударил первый, который не будет переведен.
Для 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
Если у вас возникла проблема с модульными тестами, она будет работать в симуляторе;)
Свифт 4:
Если вы используете более одного пакета, например, используете его во внешней структуре:
var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
Когда вы разрабатываете 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: "")
}
}
Надеюсь, поможет.
Я решил это, используя этот подход.
Файл localize
был создан с именем main.Strings
. Затем я открываю файлы main.Strings
(для каждого добавленного языка) и переименовываю их вручную с именем localize.strings
и добавляю их один за другим в свой проект, также я удалил main.strings
.
Второе, что нужно оценить: проверить. в вашем файле все keys
должны заканчиваться ;
и убедитесь, что все quotes
правильно открыты и закрыты.
И вы можете использовать в Swift 4:
myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)
Поскольку я наткнулся на это, когда искал ответ на похожую проблему, я оставляю свое решение здесь:
Если ваш ключ содержит "\ u2028" вместо "\n", он всегда будет возвращать только ключ, а не значение. Кажется, это ошибка с локализацией.
У меня была проблема, когда один язык работал должным образом, а другой работал половину времени, а в другой раз я получал ключ вместо локализованной версии этого ключа.
Проблема в моем случае заключалась в том, что после ручного слияния конфликта контроля версий осталась лишняя строка '>>>>>', проект не жаловался (не так, как если бы вы пропустили точку с запятой, он жаловался) и собирался правильно, поэтому каждый ключ до этого ">>>>>" переводился, а каждый ключ после - нет.
Если более простые решения не помогли, вам, возможно, придется пройти каждую строку и искать дополнительные символы (не только '>>>>>', а также другие дополнительные символы), либо, если вы используете контроль версий, получите старую стабильную версию Файл Localizable.strings и вручную пройти через изменения и добавить последующие коммиты.
Вы пробовали очистить и перестроить проект?