Пользователь может выбрать для устройства основной язык. Возможно, вы предпочтете, чтобы ваш интерфейс на устройстве пользователя тоже отображался с использованием этого языка.
Для этого необходимо выполнить локализацию приложения для этого языка. Обычно локализацию выполняют на последних стадиях разработки приложений, после того как приложение примет окончательный вид и будет готово к распространению.
Локализация выполняется с помощью папок локализации в папке проекта и в комплекте собранного приложения. Если указать. что ресурс в одной из этих папок локализации соответствует ресурсу в другой папке локализации, то когда ваше приложение будет загружено на устройство, оно автоматически загрузит ресурс. соответствующий языку, выбранному пользователем.
Например, если существует копия файла InfoPlist. strings в папке локализации на английском языке и копия файла InfoPlist. strings в папке локализации на французском языке, то второй вариант будет использован, когда приложение затребует копию файла InfoPlist. strings на устройстве, на котором основным языком является французский. Я недаром использовал в качестве примера файл InfoPlist. strings. Это файл, содержащий настройки, принятые в проекте по умолчанию, — например, он появляется в нашем проекте Empty Window, — но его предназначение в главе 6 не обсуждалось, поэтому, скорее всего, вы остались в недоумении. Для того чтобы снять вопросы, отвечу, что это файл с расширением . strings и любой файл с расширением . strings, предназначенный для локализации.
Предназначением данного файла InfoPlist.strings является хранение локализованных версий значений ключей из файла Info.plist. Например, значение ключа CFBundleDisplayName, как указано в файле Info.plist вашего проекта, выводится как имя под пиктограммой приложения на устройстве пользователя. Вы можете изменять это имя в зависимости от выбора основного языка. Например, на франкоязычном устройстве приложение Empty Window можно назвать Fenetre Vide.
Рассмотрим процедуру локализации нашего приложения. Сначала мы должны выбрать французский язык в качестве основного языка нашего устройства, затем необходимо локализовать файл InfoPlist.strings.
Теперь файл InfoPlist. strings локализован на английском и французском языках. Этот факт отображается двумя способами.
Pиc. 9.17. Отображение локализации файлов с расширением .string в среде Xcode
Давайте отредактируем наши файлы InfoPlist. strings. Файл с расширением .strings — это просто коллекция пар ключ-значение в следующем формате:
В случае файла InfoPlist. strings ключ — это просто имя ключа из файла Info.plist — реальное имя ключа, а не его название на английском языке. Например, англоязычный файл InfoPlist. strings должен выглядеть так:
"CFBundleDisplayName" = "Empty Window";
Франкоязычный файл InfoPlist. strings должен выглядеть так:
"CFBundleDisplayName" = "Fenetre Vide";
Попробуем проверить!
Это приятно или нет? Когда вы закончите восхищаться своим космополитизмом, измените язык симулятора обратно на английский. ,
Поговорим теперь о nib-файлах. До появления среды Xcode 4.5 и операционной системы iOS 6 необходимо было локализовать копию всего nib-файла. Например, если вы хотели иметь франкоязычную версию nib-файла, вам приходилось поддерживать два разных nib-файла. Если вы создали кнопку в одном nib-файле, то должны были создать такую же кнопку в другом — за исключением того, что в одном nib-файле она имела англоязычное название, а в другом — франкоязычное. И так для каждого объекта интерфейса и каждого языка локализации. Это уже не так приятно, правда?
К счастью, существует более удобный способ — базовая интернационализация (base internationalization). Если проект использует базовую интернационализацию, то можно установить соответствие между nib-файлом в папке Base. lproj и файлом . strings в папке локализации. Таким образом, разработчик должен поддерживать только один экземпляр nib-файла. Если приложение выполняется на устройстве, локализованном для языка, которому соответствует файл с расширением . strings, то строки в этом файле будут заменены строками из nib-файла.
По умолчанию наш проект Empty Window использует базовую интернационализацию, и его файл Main. storyboard хранится в папке Base. lproj. Это позволяет нам локализовать файл раскадровки на французском языке.
1. Откройте файл Main. storyboard и посмотрите на инспектор файлов. В разделе Localization должен быть установлен флаг Base. Кроме того, установите флаг French.
2. Обратите внимание на листинг файла Main. storyboard в навигаторе проекта. Теперь возле него нарисован гибкий треугольник. Щелчок на этом треугольнике открывает файл. Теперь у нас есть файл Main. storyboard для базовой локализации и файл Main.strings для франкоязычной локализации.
3. Откройте файл Main.strings для франкоязычной локализации. Он был создан автоматически с ключами, соответствующими каждому элементу интерфейса, имеющему название в файле Main. storyboard. По комментариям и именам ключей можно догадаться, как работает этот механизм. В нашем случае существует один элемент интерфейса в файле Main. storyboard, и легко догадаться, какому элементу соответствует ключ в файле. Он выглядит примерно так:
/* Class = "IBUIButton"; normalTitle = "Howdy!"; ObjectID = "Df5-YJ-JME"; */ "Df5-YJ-JME.normalTitle" = "Howdy!";
4. Во второй строке, содержащей пару ключ-значение, измените значение на "Bon j our! ”. Ключ не изменяйте! Он был сгенерирован автоматически и правильно, чтобы обеспечивать соответствие между значением и названием кнопки.
Теперь запустим проект в симуляторе и протестируем его англоязычную и франкоязычную версии. Перед этим закомментируйте строку self .button в файле ViewController.ru! Эта строка изменяет название кнопки на ее название из nib-файла, но именно заголовок в nib-файле мы и собираемся локализовать.
Запустите проект. Вы должны увидеть, что на англоязычном устройстве заголовок кнопки имеет вид “Howdy! ”, а на франкоязычном — “Bon j our ! ”
Если теперь модифицировать nib-файл, например добавить еще одну кнопку на представлении в файл Main. storyboard, то автоматического изменения соответствующих файлов с расширением . strings не произойдет, потому что их нужно редактировать вручную. Следовательно, в реальной жизни не следует начинать локализацию nib-файлов, пока не будет закончена разработка интерфейса. Итак, вот что следует сделать.
1. Выберите файл Main. storyboard и команду File^Show в окне Finder.
2. Запустите приложение Terminal. Наберите в командной строке команду ibtool —export-strings-f ile output. strings, после которой должен стоять пробел, и перетащите, файл Main. storyboard из окна Finder в окно Terminal. Нажмите клавишу <Return>.
В результате на основе файла Main. storyboard в текущем каталоге будет сгенерирован новый файл output. strings. Объединение этой информации с существующими файлами . strings на основе раскадровки Main. storyboard программист должен сделать самостоятельно.
Для полноты картины покажем, как заставить проект использовать базовую интернационализацию, если он этого еще не сделал. В качестве примера будем использовать проект Truly Empty, созданный на основе шаблона Empty Application и не имеющий nib-файла. У нас есть файл ViewController. xib. Давайте его локализуем.
После этого проект готов к новой локализации, которую можно провести так, как было показано в предыдущих примерах.
В заключение следует вспомнить о строках, которые появляются в интерфейсе приложения, но являются значениями, сгенерированными в коде? В приложении Empty Window примером такой строки может служить сообщение, которое активизируется после щелчка на кнопке. Здесь применяется точно такой же подход — файл с расширением . strings, — но ваш код необходимо модифицировать явным образом. Это можно сделать по-разному, но проще всего использовать макрос NSLocalizedString (который вызывает метод localizedStringForKey: table: из экземпляра класса NSBundle). Итак, например, мы можем модифицировать метод buttonPressed:.
Строка, представляющая собой первый аргумент метода NSLocalizedString, играет роль ключа в файлах с расширением .strings. (Второй аргумент, который в данном случае равен nil, в реальной жизни был бы сообщением механизму локализации, объясняющим, какая информация должна содержаться в этой строке.) Однако наш код теперь стал неработоспособным, потому что в проекте нет соответствующего файла с расширением . strings! По умолчанию в этом коде предполагается существование файла Localizable. strings. Такого файла нет. Это не ошибка, но ключи не имеют значений, и хотя сам ключ можно использовать при выводе сообщения, это не то, чего мы хотели. Необходимо создать недостающий файл с расширением .strings.
Кроме того, необходимо наполнить файлы Localizable. strings содержимым в соответствии с ключами локализованных строк, заданных в вашем коде. Это можно сделать вручную с помощью инструмента командной строки ibtool, генерирующего файл с расширением . strings из nib-файла, или инструмента genstrings для генерирования файла с расширением . strings из исходного файла. Например, на моем компьютере я набрал в окне Terminal команду
$ genstrings /Users/matt/Desktop/Empty\ Window/Empty\ Window/ViewController.m
В результате в текущем каталоге возник файл Localizable. strings, имеющий следующее содержание:
Скопируйте и вставьте это содержимое в англоязычную и франкоязычную версии файлов Localizable.strings в нашем проекте, пройдитесь по парам, изменяя значение в каждой паре в соответствии с указанной локализацией. Например, в англоязычном файле Localizable. strings должна быть пара ключ-значение:
"AlertGreeting" - "Howdy!"; а во франкоязычном файле Localizable. strings —
"AlertGreeting" - "Bonjour!";
И так далее.