Не английский язык по умолчанию для приложения iOS? - PullRequest
37 голосов
/ 01 ноября 2010

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

Проблема в том, что на устройстве не установлен один из поддерживаемых нами языков, например на моем телефоне установлен английский.Мы хотим, чтобы в таких случаях телефон переключался на немецкий, но этого не происходит.То, что мы видим, это то, что телефон использует язык, который находится выше всего в списке языков в международном разделе Settings.app.Для моего телефона самый высокий не английский язык в списке - французский, поэтому, когда я запускаю приложение, оно локализуется для французского языка.Если я переключу свой телефон на немецкий, а затем вернусь к английскому (что меняет порядок в списке языков), приложение затем локализуется на немецкий.?Я использовал этот урок , чтобы настроить локали для проекта.Это включает в себя удаление «английского» языкового стандарта по умолчанию, который создается при первой локализации файла.В файле проекта я добавил:

developmentRegion = de;

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

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

Без успеха.

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

Ответы [ 4 ]

44 голосов
/ 04 ноября 2010

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

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

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


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

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

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

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

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

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


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

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

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

14 голосов
/ 09 ноября 2010

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

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

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

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

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

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

0 голосов
/ 19 апреля 2019

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

let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")
0 голосов
/ 07 октября 2014

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

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
int retVal = UIApplicationMain(argc, argv, nil, nil);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...