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

Не-английский язык по умолчанию для приложения iOS?

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

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

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

developmentRegion = de;

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

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

Без успеха.

Любые идеи будут оценены!

4b9b3361

Ответ 1

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

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

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


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

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

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

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

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

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


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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")

Ответ 4

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

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
int retVal = UIApplicationMain(argc, argv, nil, nil);