Как установить язык, отличный от английского, как язык разработки и базовую локализацию?

Когда проект Xcode приложения iOS недавно создан, в настройке проекта (не целевой) мы видим, что по умолчанию он имеет Use Base internationalization, и есть 2 файла, локализованных для Development Language, который равен English по умолчанию (один для Main.storyboard и один для LaunchScreen.storyboard, оба из которых находятся в каталоге Base.lproj). Смотрите скриншот ниже:

Настройка локализации проекта по умолчанию Xcode

(Для простоты я остановлюсь только на Main.storyboard).

И в разделе локализации правой панели Main.storyboard мы видим, что локализация Base проверяется по умолчанию, а также есть локализация English, которая по умолчанию не отмечена. Смотрите скриншот ниже:

настройка локализации раскадровки по умолчанию

И в целевой Info.plist есть ключ с именем Localization native development region (т.е. CFBundleDevelopmentRegion), а его значение по умолчанию - en. Смотрите снимок экрана:

локальная область разработки локализации

Если я правильно понимаю, с этими настройками по умолчанию разработчик может просто написать английский в локализации Base Main.storyboard и оставить локализацию English как непроверенную. Если приложение необходимо адаптировать к некоторому другому языку, разработчик может добавить локализацию в настройке локализации проекта и выбрать Main.storyboard в появившемся диалоговом окне. Смотрите скриншот ниже:

добавить локализацию

Возьмите Chinese (Simplified) в качестве примера, это приведет к созданию вновь созданного каталога zh-Hans.lproj с файлом Main.strings внутри него. (Для простоты я буду ссылаться на него как Chinese вместо Chinese (Simplified).) Разработчику просто нужно перевести английские строки внутри этого файла на китайский (недавно созданный Main.strings в каталоге zh-Hans.lproj по умолчанию имеет все английские тексты дублируются из Main.storyboard в Base.lproj). С этими настройками поле Language в описании этого приложения в AppStore будет содержать список на английском языке (из локализации Base, потому что английский - это Development Language) и китайский (из локализации Chinese). В отношении конечного пользователя, если системный язык является английским/китайским (или английский/китайский является одним из предпочтительных языков), приложение будет использовать соответствующий языковой ресурс (для английского языка используйте локализацию Base, для китайского языка используйте Chinese). Для всех других языковых предпочтений английский будет действовать как запасной язык, потому что CFBundleDevelopmentRegion - en, поэтому Base используется локализация.

Итак, мой первый вопрос будет, правильно ли это понимание? Подводя итог, если Development Language является английским, нам не нужно включать локализацию English для файлов раскадровки. Просто используйте локализацию Base и напрямую напишите английский в файлах раскадровки. Нам нужно только добавить локализацию для других языков, кроме английского. (На самом деле это кажется проблематичным, если мы разрешаем локализацию English. Если локализация English включена, нам необходимо поддерживать оба текста в Base.lproj/Main.storyboard и en.lproj/Main.strings.)

Если вышеуказанное понимание верное, мой второй вопрос будет, как добиться интернационализации в обратном направлении? То есть, если я хотел бы использовать Chinese в качестве Development Language и написать китайский язык в локализации Base и добавить только локализацию для языков, отличных от Chinese, возможно ли это и как это сделать в Xcode? Я не могу найти способ изменить Development Language в настройке проекта, чтобы утверждать, что локализация Base в проекте Chinese, а не English.

Ответ 1

Ваше понимание в основном верное. Одно небольшое уточнение: если пользователь работает на каком-то третьем языке, например, на русском, не обязательно верно, что приложение будет работать на английском языке. Вместо этого приложение будет работать на первом языке, который он поддерживает, который пользователь предпочитает. Начиная с iOS 8 и более поздних версий, пользователи могут иметь список предпочтительных языков, таких как "русский, французский, китайский, английский". В случае этого гипотетического пользователя приложение действительно будет работать на китайском языке, поскольку оно ранее в списке, чем английский.

Чтобы ответить на вопрос об изменении языка разработки, это не просто сделать, но можно сделать. В частности:

  • Сначала укажите язык, на котором вы хотите быть основным языком. Снимите флажок всех файлов, которые Xcode предлагает для локализации для вас.
  • В Info.plist (как вы заметили) измените область разработки на язык, на котором вы хотите быть основным языком. Обратите внимание, что свойство немного неверно названо, потому что его значение должно быть языковым кодом (с необязательным кодом страны), а не кодом региона или страны.
  • Закройте проект в Xcode. В другом редакторе кода откройте projectname.xcodeproj/project.pbxproj и выполните поиск developmentRegion. Вы должны увидеть строку типа developmentRegion = English;. Измените это, чтобы ссылаться на тот же язык, который вы вложили в ваш файл Info.plist.
  • Повторно запустите проект в Xcode. Пройдите все локализуемые файлы и установите флажки рядом с английским, чтобы создать локализованные ресурсы. Обратите внимание, что для раскадровки и xibs Xcode может создавать раскадровку вместо файла строк. Если это произойдет, просто измените файл filetype на файл строк.

Вот пример результата для меня, использующего fr в качестве базового языка:

Информация о проекте

Информация о файле

Ответ 2

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

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