Как загружаются XIB для локализованных приложений?

Я обнаружил, что через пару дней успешного запуска и отладки локализованных приложений на Симуляторе он (или процесс развертывания XCode) перешел в состояние где, если симулятор был настроен на один из поддерживаемых мной локальных языков, он вылетел бы при запуске со следующим стеком:

3   CoreFoundation                      0x01780e6a +[NSException raise:format:] + 58
4   UIKit                               0x008050fa -[UINib instantiateWithOwner:options:] + 2024
5   UIKit                               0x00806ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
6   UIKit                               0x0060c17a -[UIApplication _loadMainNibFile] + 172
7   UIKit                               0x0060ccf4 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 
8   UIKit                               0x00617617 -[UIApplication handleEvent:withNewEvent:] + 1533
9   UIKit                               0x0060fabf -[UIApplication sendEvent:] + 71
10  UIKit                               0x00614f2e _UIApplicationHandleEvent + 7576
11  GraphicsServices                    0x01e13992 PurpleEventCallback + 1550

Сбой происходит, потому что UIApplication не может загрузить файл MainWindow.nib:

Завершение работы приложения из-за непойманного исключение 'NSInternalInconsistencyException', причина: 'Не удалось загрузить NIB в связку: 'NSBundle /.app> (загружено) 'с именем' MainWindow ''

Когда вы локализуете приложение, у вас есть несколько вариантов. Вы можете сделать одно (или оба) из следующего:

  • Локализовать каждый загружаемый файл Xib в зависимости от языка устройства. Таким образом, ваш локализованный пользовательский интерфейс полностью настраивается из Interface Builder.
  • Вы можете настроить файл Localizable.strings для каждой языковой цели и получить доступ к содержащимся в нем строкам из кода.

Я выбрал более позднее, потому что хотел, чтобы все мои локализованные строки были в одном месте (чтобы их можно было перевести все сразу). Это означает, что в моем проекте нет файлов xib в каталогах для конкретных языков (fr.lproj, zh-Hant.lproj и т. Д.). Вместо этого у меня есть en.lproj, заполненный всеми моими файлами xib (файлы пера после их создания) и каталогами для конкретных языков, содержащими соответствующие переведенные файлы Localizable.strings.

Как я уже упоминал, пару дней он работал нормально. Сегодня (и я не уверен, в какой именно момент) приложение на симуляторе начало вылетать при запуске. Установка приложения на устройство работала нормально, и запуск приложения на имитаторе в режиме английского языка работал нормально.

После долгих размышлений я понял, что симулятор вылетает из-за того, что искал свои файлы пера на языке конкретный каталог (fr.lpro, sz-Hant.lproj, ja.lproj в зависимости от языковых настроек).

Таким образом, похоже, что Симулятор находится в состоянии, когда он не ищет языковой каталог по умолчанию (en.lproj ) после того, как ему не удалось найти перо в каталоге для конкретного языка.

Я решил проблему, перейдя в каталог приложения для симулятора (на основе сообщения об исключении выше):

/ Users / ... Поддержка / iPhone Simulator / 4.3 / Applications //. App

Затем перейдите в подкаталог для конкретного языка и скопируйте все файлы пера из en.lproj в этот каталог.

Скопировав файлы вручную, симулятор загружает файлы пера для конкретного языка (которые на самом деле являются просто копиями файлов в каталоге en.lproj), и все работает нормально.

Итак, мои вопросы:

  • Is это просто глюк в Симуляторе? Так что НЕТ этому
  • У кого-нибудь еще была эта проблема? Ага
  • Это результат какой-то неясной настройки XCode, которую я случайно переключил? Нет, не похоже.

Обновление

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

Я попробовал исправить предложенное МакКигнусом (удалить все локализации для моих xib-файлов, что перемещает их обратно в корневой каталог), и это отсортировало его для меня. Итак, я предполагаю, что система локализации проверяет текущий языковой каталог, а затем корень, он не вернется к вашему языку по умолчанию.

6
задан RedBlueThing 16 May 2011 в 06:14
поделиться