2010-11-01 4 views
34

Я разрабатываю приложение для клиента в Европе. Я - англоговорящий в США. Наше приложение будет поддерживать несколько языков, но не английский. У меня есть все строки в нашем приложении в переведенных файлах Localized.strings, правильно настроены для разных языков, и все они отлично работают, когда устройство настроено на правильный язык (язык устройства - немецкий = приложение правильно локализовано для немецкого) ,Не-английский язык по умолчанию для приложения iOS?

Существует проблема, когда устройство не настроено на один из поддерживаемых нами языков, например, на моем телефоне, который установлен на английский. Мы хотим, чтобы телефон вернулся на немецкий язык в таких случаях, но этого не происходит. Мы видим, что телефон использует язык, который отображается в списке языков в разделе «Международный» в разделе «Настройки». Для моего телефона самый высокий неанглийский язык в списке - французский, поэтому, когда я запускаю приложение, он локализован для французского языка. Если я поменю свой телефон на немецкий, а затем вернусь на английский (который изменяет порядок в списке «Языки»), приложение затем локализуется на нем.

Как я могу гарантировать, что приложение по умолчанию использует немецкий язык для не поддерживаемых языков? Я использовал this tutorial для настройки локалей для проекта. Это включает удаление стандартного «английского» языка, созданного при первой локализации файла. В файле проекта, я добавил:

developmentRegion = de; 

Кроме того, в Info.plist, у меня есть

<key>CFBundleDevelopmentRegion</key> 
<string>de</string> 

без успеха.

Любые идеи были бы оценены!

ответ

42

Отказ от конкретного языка - не то, к чему вы должны стремиться. Предположим, что японский пользователь, живущий во Франции и свободно говорящий по-французски, имеет свой телефон на японском языке. Ваше приложение будет по умолчанию для немецкого, несмотря на то, что оно имеет французский перевод; Я думаю, это не то, что вы хотите, и это, конечно, не то, чего хочет пользователь.

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

Поскольку вы не хотите поддерживать английский язык, но разработали приложение на английском языке, самое легкое, что вы можете сделать, это просто избавиться от en.lproj сразу после компиляции. Это оставит приложение только с теми языками, которые вы планируете поддерживать, и iPhone выберет язык, наиболее подходящий для пользователя, как установлено в настройках iPhone по умолчанию.


Существует довольно простое решение для удаления конкретной локализации:

Пусть Xcode построить приложение со всеми присутствующими локализациями и перед подписыванием коды кайфа в удалить папку en.lproj и все локализованное файлы для этого языка исчезли. Вы можете легко сделать это, добавив Run Script построить фазы к цели, содержащий одну строку кода (это Bash Script):

rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj" 

Code Signing всегда стартует в конце концов построить фазы завершения, так просто поместите эту фазу сборки в конце ваших текущих фаз.

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

Я надеюсь, что это жизнеспособное решение для вас.


Относительно «приложение должно падать обратно на немецкий язык в том случае, если соответствующая локализация не существует»:

Вопрос что является подходящей локализацией? Если третий выбор пользователя - французский (после 2 неподдерживаемых языков), это решение заставит приложение вернуться на французский язык, который соответствует соответствующей локализации. Более уместно, чем установить пятый выбор пользователя, немецкий, вручную.

Что происходит, когда приложение запускается просто: ОС спускает список языков пользователей, как указано в настройках, до тех пор, пока не найдет подходящую локализацию и не использует этот язык. Причина, по которой многие приложения по умолчанию относятся к английскому, а не к немецкому, просто потому, что английский язык отображается в большинстве списков пользовательских языков выше немецкого. В системе нет неотъемлемого языкового предпочтения. Если вы удалите перевод на английском языке, там будут поддерживаться только языки, которые вы хотите поддерживать, и из этих языков выбирается один выше в списке пользователей.

+0

Pascal имеет правильный ответ: Приложение будет падать обратно к следующему наиболее разумной локализации; это по дизайну и способ работы всех приложений на iOS и Mac OS X. Ваше приложение не является особенным. –

+2

Я все еще обдумываю этот ответ. Хотя это, очевидно, хорошо продуманный ответ, в конце концов, бизнес-требование по-прежнему заключается в том, что приложение должно вернуться на немецкий язык в случае, если соответствующая локализация не существует; это не подлежит обсуждению с клиентом. Что интересно, и о чем я упоминаю в названии моего вопроса, заключается в том, что если папка English.lproj хранится в проекте, она используется как спад, когда нет другой доступной локализации.Если я не смогу понять что-то еще, я просто оставлю эту папку и скопирую там активы «de». –

+2

Нет, английский также не является системным значением по умолчанию. Это просто, ОС имеет список локализаций, как указано в настройках. При запуске приложения он ищет соответствующие папки * .lproj и использует первый, который соответствует языку из списка. Вот почему он использует английский, когда вокруг ничего нет. ;) Но я знаю еще один трюк, сформулирую новый ответ ... – Pascal

13

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

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

В пользовательских настройках по умолчанию используется ключ AppleLanguages, который диктует порядок использования языков, обычно устанавливаемый в порядке, который пользователь устанавливает в настройках iOS. Если вы измените этот порядок, приложение сначала попытается найти локализацию в этом порядке. Что вы можете сделать, это прочитать текущие языковые настройки и решили по умолчанию немецкий следующим образом:

NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil]; 
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"]; 

Обратите внимание, что вам нужно сделать это в main.m до UIApplicationMain, в противном случае вам нужно перезапустить приложение для изменения вступили в эффект.

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

+3

У нас есть пример реального мира, который не сломает HIG или что-то еще. Более того, я благодарю Паскаля за ответ (хотя и после exsuse). Я ненавижу, когда люди отвечают с предложением/советом/руководством, которое не имеет отношения к техническому вопросу: либо вы отвечаете, либо нет. В любом случае, случай: мы разрабатываем приложение для международного рынка (таким образом, оно находится в английский), но мы должны предоставить индивидуальную версию для итальянского клиента. Кодовая база такая же, и мы хотим ** force ** (по запросу клиента) настроить версию на итальянском языке. Независимо от пользовательских настроек (то есть на моем iPad) – zontar

+1

Это полезно, но если у меня есть заставка с заливным экраном с интернационализацией, это не относится к правильному изображению, даже если я помещаю код на main.m, вы знаете, как я может это исправить? Спасибо – JERC

+0

HIG - это набор рекомендаций (а не правил) по какой-либо причине. В моем случае приложение представляет собой приложение «Point-of-Sale Enterprise» и должно вести бизнес в валюте магазина. Цены, полученные из базы данных сервера, - это евро, доллары США, йена или что-то еще. Если пользователь устанавливает локаль в нечто другое, происходят плохие вещи. К сожалению, мое приложение не может получить локальную сеть магазина (сервер a.k.a.), пока мы не пройдем мимо main.m. Есть ли у меня какой-либо вариант, кроме сравнения локали устройства с тем, что требуется магазину, и отображением предупреждения? –

-1

Попробуйте это в ваших didFinishLaunchingWithOptions() функция

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
int retVal = UIApplicationMain(argc, argv, nil, nil); 
Смежные вопросы