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

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

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

Например, если существует копия файла 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.

  1. Откройте проект. В разделе Info в таблице Localizations перечислены возможные локализации приложения.
  2. Щелкните на кнопке Plus под таблицей Localizations. В раскрывающемся меню выберите пункт French.
  3. Откроется диалоговое окно, в котором перечисляются файлы, локализованные в текущий момент на английском языке (потому что они являются частью шаблона приложения). Нас интересует строка InfoPlist. strings, поэтому выберем ее, не выбирая никаких других файлов. Щелкните на кнопке Finish.

Теперь файл InfoPlist. strings локализован на английском и французском языках. Этот факт отображается двумя способами.

  • В навигаторе проекта листинг файла InfoPlist. strings сопровождается гибким треугольником. Щелкните на нем, чтобы выяснить, что наш проект теперь содержит две копии файла InfoPlist. strings — одну на английском языке, а вторую на французском (рис. 9.17). Следовательно, каждый из них теперь можно редактировать по-отдельности.
  • В папке проекта Empty Window теперь есть папки en. lproj и fr. lproj. Первая папка содержит копию файла InfoPlist. strings для англоязычных пользователей; вторая папка содержит копию файла InfoPlist. strings для франкоязычных пользователей. Более того, при сборке эта структура папок встраивается в приложение.

 Отображение локализации файлов с расширением .string в среде Xcode

Pиc. 9.17. Отображение локализации файлов с расширением .string в среде Xcode

 

Давайте отредактируем наши файлы InfoPlist. strings. Файл с расширением .strings — это просто коллекция пар ключ-значение в следующем формате:

/* Optional comments are С-style comments */

"key" = "value";

В случае файла InfoPlist. strings ключ — это просто имя ключа из файла Info.plist — реальное имя ключа, а не его название на английском языке. Например, англоязычный файл InfoPlist. strings должен выглядеть так:

 

"CFBundleDisplayName" = "Empty Window";

 

Франкоязычный файл InfoPlist. strings должен выглядеть так:

 

"CFBundleDisplayName" = "Fenetre Vide";

 

Попробуем проверить!

  1. Соберите и запустите приложение Empty Window в программе iPhone Simulator.
  2. Остановите выполнение проекта в среде Xcode. В симуляторе появится главное окно.
  3. Проверьте название своего приложения, выведенное в главном окне симулятора. Это Empty Window (возможно, в сокращенном виде).
  4. Запустите в симуляторе приложение Settings и измените язык на французский (Gene ral => International о Languages Francais). Теперь имя приложение отображается как 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. Давайте его локализуем.

  1. Откройте файл ViewController. xib и локализуйте его на английском языке, щелкнув на кнопке Localize в окне инспектора файлов. На экране откроется диалоговое окно, спрашивающее вас, хотите ли вы начинать создание файла . lproj для англоязычной версии. Мы хотим этого, поэтому щелкните на кнопке Localize.
  2. Откройте проект и установите флаг Use Base Internationalization под таблицей Localization.
  3. На экране откроется диалоговое окно, в котором перечислены nib-файлы, которые в данный момент локализованы только на английском языке. Сейчас этот список содержит только файл ViewController .xib, и он выбран. Хорошо! Щелкните на кнопке Finish.

 

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

В заключение следует вспомнить о строках, которые появляются в интерфейсе приложения, но являются значениями, сгенерированными в коде? В приложении Empty Window примером такой строки может служить сообщение, которое активизируется после щелчка на кнопке. Здесь применяется точно такой же подход — файл с расширением . strings, — но ваш код необходимо модифицировать явным образом. Это можно сделать по-разному, но проще всего использовать макрос NSLocalizedString (который вызывает метод localizedStringForKey: table: из экземпляра класса NSBundle). Итак, например, мы можем модифицировать метод buttonPressed:.

UIAlertView* av  [[UIAlertView alloc]

initWithTitle:NSLocalizedString(9"AlertGreeting", nil) message:NSLocalizedString(0"YouTappedMen, nil) delegate:nil

cancelButtonTitle:NSLocalizedString(8"Cool", nil) otherButtonTitles:nil];

Строка, представляющая собой первый аргумент метода NSLocalizedString, играет роль ключа в файлах с расширением .strings. (Второй аргумент, который в данном случае равен nil, в реальной жизни был бы сообщением механизму локализации, объясняющим, какая информация должна содержаться в этой строке.) Однако наш код теперь стал неработоспособным, потому что в проекте нет соответствующего файла с расширением . strings! По умолчанию в этом коде предполагается существование файла Localizable. strings. Такого файла нет. Это не ошибка, но ключи не имеют значений, и хотя сам ключ можно использовать при выводе сообщения, это не то, чего мы хотели. Необходимо создать недостающий файл с расширением .strings.

  1. Выберите команду File^New^File.
  2. Откроется диалоговое окно, предлагающее выбрать шаблон. Слева в разделе iOS выберите пункт Resource, справа — пиктограмму Strings File. Щелкните на кнопке Next.
  3. Назовите файл Localizable. strings. Выберите соответствующий пункт в разделе Group и убедитесь, что этот файл является частью целевого приложения Empty Window. Щелкните на кнопке Create.
  4. Теперь необходимо локализовать новый файл. Выберите файл Localizable. strings в навигаторе проекта. Щелкните на кнопке Localize под таблицей Localization в инспекторе файлов. На экране откроется диалоговое окно, предлагающее переместить существующий файл в англоязычную или базовую локализацию; в нашем проекте они совпадают.
  5. Перейдите в инспектор файлов и добавьте в нем желаемые локализации. Например, установите флаг French.

Кроме того, необходимо наполнить файлы Localizable. strings содержимым в соответствии с ключами локализованных строк, заданных в вашем коде. Это можно сделать вручную с помощью инструмента командной строки ibtool, генерирующего файл с расширением . strings из nib-файла, или инструмента genstrings для генерирования файла с расширением . strings из исходного файла. Например, на моем компьютере я набрал в окне Terminal команду

 

$ genstrings /Users/matt/Desktop/Empty\ Window/Empty\ Window/ViewController.m

В результате в текущем каталоге возник файл Localizable. strings, имеющий следующее содержание:

/* No comment provided by engineer. */

"AlertGreeting" - "AlertGreeting";

/* No comment provided by engineer. */

"Cool" - "Cool";

/* No comment provided by engineer. */

"YouTappedMe" - "YouTappedMe";

Скопируйте и вставьте это содержимое в англоязычную и франкоязычную версии файлов Localizable.strings в нашем проекте, пройдитесь по парам, изменяя значение в каждой паре в соответствии с указанной локализацией. Например, в англоязычном файле Localizable. strings должна быть пара ключ-значение:

 

"AlertGreeting" - "Howdy!"; а во франкоязычном файле Localizable. strings —

"AlertGreeting" - "Bonjour!";

 

И так далее.


 

 

 

Добавить комментарий