Статьи

iOS лаконично — локализация

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

К счастью, iOS позволяет удивительно легко локализовать ресурсы с помощью пакетов. Класс NSBundle автоматически выбирает соответствующий актив с учетом предпочтительного языка пользователя. Например, если вы предоставили разные версии одного и того же изображения для носителей английского и испанского языков, метод pathForResource: ofType:, описанный в предыдущей главе, возвращает разные пути к файлам в зависимости от настроек пользователя. Это одна из основных причин, по которой вам не следует напрямую обращаться к ресурсам пакета, используя жестко закодированные пути.

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


Примером этой главы является простое приложение, которое отображает различные изображения или строки в зависимости от предпочтительного языка пользователя. Создайте новое приложение Single View и назовите его «Интернационализация». Как всегда, следует выбрать « Использовать раскадровки» и « Использовать автоматический подсчет ссылок» .


Первым шагом к созданию многоязычного приложения является добавление поддерживаемых языков в проект. В навигаторе проекта выберите значок проекта.

tutorial_image
Рисунок 96: Выбор проекта в Навигаторе проекта

Затем выберите проект Интернационализация в левой колонке (не путать с целью Интернационализации). Убедитесь, что выбрана вкладка «Информация»; Вы должны увидеть следующее окно:

tutorial_image
Рисунок 97: Окно Информация о проекте

Чтобы добавить поддержку другого языка, выберите знак «плюс» в разделе « Локализации ». Вы можете выбрать любой язык, который вам нравится, но в этой книге будет использоваться испанский. Выбор языка откроет диалоговое окно с вопросом, какие файлы должны быть локализованы. Очистите выбор MainStoryboard.storyboard , но оставьте выбранными InfoPlist.strings .

tutorial_image
Рисунок 98: Добавление испанской локализации

Теперь можно добавить испанскую версию каждого ресурса в комплект приложений.


Далее мы рассмотрим локализацию медиаресурсов. В пакете ресурсов для этой книги вы найдете файл с именем syncfusion-icon-en.png . Добавьте этот файл в комплект приложения, перетащив его в Навигатор проектов и переименовав его в syncfusion-icon.png . Затем отобразите его в представлении, изменив метод viewDidLoad в ViewController.m на следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
— (void)viewDidLoad {
    [super viewDidLoad];
     
    // Find the image.
    NSString *imagePath = [[NSBundle mainBundle]
                           pathForResource:@»syncfusion-icon»
                           ofType:@»png»];
    NSLog(@»%@», imagePath);
 
    // Load the image.
    UIImage *imageData = [[UIImage alloc]
                          initWithContentsOfFile:imagePath];
    if (imageData != nil) {
        // Display the image.
        UIImageView *imageView = [[UIImageView alloc]
                                  initWithImage:imageData];
        CGRect screenBounds = [[UIScreen mainScreen] bounds];
        imageView.contentMode = UIViewContentModeCenter;
        CGRect frame = imageView.frame;
        frame.size.width = screenBounds.size.width;
        frame.size.height = screenBounds.size.height;
        imageView.frame = frame;
        [[self view] addSubview:imageView];
    } else {
        NSLog(@»Could not load the file»);
    }
}

Когда вы компилируете проект, вы должны увидеть маленький значок, отображаемый в середине экрана:

tutorial_image
Рисунок 99: Программное добавление изображения в представление

Вы также должны увидеть путь Internationalization.app/syncfusion-icon.png на панели вывода. Здесь нет ничего нового, только изображение на верхнем уровне пакета приложения, но это изменится, как только мы локализуем файл изображения.

Для этого выберите изображение в Project Navigator, откройте панель «Утилиты» и нажмите « Сделать локализованным» в разделе « Локализация ».

tutorial_image
Рисунок 100: Создание локализованного файла

Следующий диалог предложит вам выбрать язык. Выберите английский и нажмите Localize .

tutorial_image
Рисунок 101: Настройка локализации

Это говорит iOS, что эта версия syncfusion-icon.png предназначена для носителей английского языка. Мы добавим испанскую версию через минуту, но сначала давайте посмотрим, что происходит за кулисами. Чтобы увидеть ваши локализации в действии, вам придется перезагрузить iOS Simulator и выполнить чистую сборку. Чтобы сбросить симулятор, перейдите к iOS Simulator> Сбросить содержимое и настройки в строке меню и выберите «Сбросить» в появившемся диалоговом окне.

tutorial_image
Рисунок 102: Сброс симулятора iOS

Выйдите из симулятора и вернитесь к проекту интернационализации в Xcode. Чтобы сделать чистую сборку, перейдите к Product> Clean в строке меню и скомпилируйте проект снова, как обычно. Вы должны увидеть другой путь к файлу на панели вывода:

1
Internationalization.app/en.lproj/syncfusion-icon.png.

Новый подкаталог en.lproj / является внутренним способом организации языковых файлов в iOS. Все ресурсы, локализованные на английском языке, появятся в этом подкаталоге, а все версии на испанском языке появятся в подкаталоге es.lproj / . Но опять же, нам на самом деле не нужно знать, где находится файл; PathForResource : ofType: метод NSBundle вычисляет это автоматически.

Итак, наша английская версия изображения настроена. Далее нам нужно настроить испанскую версию. Выберите английскую версию файла в Project Navigator и установите флажок рядом с испанским в разделе «Локализация» на панели «Утилиты».

tutorial_image
Рисунок 103: Добавление испанской версии файла

Это копирует существующую англоязычную версию syncfusion- icon.png в подкаталог es.lproj / . Вернувшись в Навигатор проектов, вы сможете увидеть это, развернув файл syncfusion-icon.png .

tutorial_image
Рисунок 104: Обе версии файла изображения в Project Navigator

Конечно, нам нужно заменить испанскую версию совершенно другим файлом. Самый простой способ сделать это — выбрать файл syncfusion-icon.png (испанский) и щелкнуть значок стрелки рядом со строкой полного пути на панели « Утилиты» .


Рисунок 105: Панель утилит для испанского файла изображения

Это отображает содержимое папки es.lproj / в Finder, что дает нам возможность заменить файл вручную. Удалите существующий файл syncfusion-icon.png и скопируйте файл syncfusion-icon-es.png из пакета ресурсов в es.lproj /. Обязательно переименуйте его в syncfusion-icon.png . Для локализованных версий одного и того же файла важно иметь одинаковые имена файлов, чтобы NSBundle мог их найти. После замены файла вы должны увидеть разные изображения при выборе двух локализаций в XCode.

Это должно быть для локализации нашего файла изображения. Чтобы проверить это, вы можете изменить язык устройства так же, как вы изменили бы его на реальном устройстве — через приложение «Настройки». Нажмите кнопку «Домой» устройства в симуляторе, щелкните и перетащите экран вправо и запустите приложение «Настройки». В разделе General> International> Language вы можете выбрать язык устройства.

tutorial_image
Рисунок 106: Изменение языка устройства в iOS Simulator

Выберите Español и снова откройте свое приложение. Вы должны увидеть испанскую версию syncfusion-icon.png . Возможно, вам придется закрыть симулятор и снова скомпилировать программу. Обратите внимание, что путь к файлу, выводимый NSLog (), теперь выглядит так:

1
Internationalization.app/es.lproj/syncfusion-icon.png.
tutorial_image
Рисунок 107: Отображение локализованной версии файла изображения

Как видите, локализовать файлы невероятно легко, используя встроенную функциональность NSBundle. Идея состоит в том, чтобы использовать NSBundle в качестве абстракции между кодом приложения и ресурсами, на которые они полагаются. Это изолирует процесс локализации от процесса разработки, что позволяет очень легко переводить на аутсорсинг.

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


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

Давайте изменим наш метод viewDidLoad для отображения кнопки и вывода сообщения, когда пользователь нажимает на нее.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
— (void)viewDidLoad {
    [super viewDidLoad];
     
    UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [aButton setTitle:@»Say Hello» forState:UIControlStateNormal];
    aButton.frame = CGRectMake(100.0, 200.0, 120.0, 40.0);
    [[self view] addSubview:aButton];
     
    [aButton addTarget:self
                action:@selector(sayHello:)
      forControlEvents:UIControlEventTouchUpInside];
}
 
— (void)sayHello:(id)sender {
    NSLog(@»Hello, World!»);
}

У этих методов есть два строковых литерала, которые мы должны будем переместить в файл строк. Они @ «Скажи привет» и @ «Привет, мир!» ,

Чтобы создать файл строк, создайте новый файл и выберите « Ресурс»> «Файл строк» . Используйте Localizable.strings для имени файла, который является строковым файлом по умолчанию, который ищет iOS.

tutorial_image
Рисунок 108: Создание файла строк

Содержимое файла строк представляет собой простой список пар ключей или значений, отформатированный следующим образом.

1
2
«Button Title» = «Say Hello»;
«Greeting» = «Hello, World!»;

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

Как и в случае медиаресурсов, вы можете получить доступ к содержимому Localizable.strings через NSBundle. Метод localizedStringForKey: value: table: возвращает значение ключа из определенного строкового файла. Аргумент value позволяет указать возвращаемое значение по умолчанию, если ключ не найден, а аргумент table определяет, какой файл строк использовать. Когда вы указываете nil для таблицы, используется файл Localizable.strings по умолчанию.

Поскольку доступ к переведенным строкам является такой распространенной задачей, Foundation Framework также предоставляет удобный макрос NSLocalizedString () , который можно использовать в качестве простого ярлыка для localizedStringForKey: value: table:. Он передает пустую строку для аргумента значения и nil для аргумента таблицы. Для большинства приложений NSLocalizedString () — это все, что вам действительно нужно для доступа к локализованному тексту.

Итак, давайте изменим конфигурацию заголовка нашей кнопки, чтобы использовать NSLocalizedString ():

1
2
3
4
5
6
[aButton setTitle:NSLocalizedString(@»Button Title», nil)
         forState:UIControlStateNormal];
If you compile the project, the button should still read, “Say Hello”—but now it’s loaded from Localizable.strings.
— (void)sayHello:(id)sender {
    NSLog(@»%@», NSLocalizedString(@»Greeting», nil));
}

Теперь, когда наши строки загружаются динамически, а не жестко, их легко локализовать. Мы будем использовать тот же процесс, что и с изображениями. В Навигаторе проектов выберите файл Localizable.strings, затем нажмите «Сделать локализованным» на панели «Утилиты». Выберите английский в появившемся диалоговом окне, чтобы использовать эту версию файла для англоязычных пользователей.

Чтобы добавить испанскую версию, снова выберите Localizable.strings и установите флажок рядом с испанским в разделе «Локализации».

tutorial_image
Рисунок 109: Добавление испанской версии Localizable.strings

Как и syncfusion-icon.png , вы сможете развернуть файл Localizable.strings в Навигаторе проектов.

tutorial_image
Рисунок 110: Расширение файла строк для просмотра его локализаций

Наконец, добавьте несколько переводов в испанскую версию файла.

1
2
«Button Title» = «Dice Hola»;
«Greeting» = «Hola, Mundo!»;

Вы можете проверить это так же, как мы тестировали изображения. Перейдите, чтобы Сбросить Содержимое и Настройки в симуляторе, закройте симулятор и выполните чистую сборку из XCode. После изменения языка на Español, ваша кнопка должна показывать «Dice Hola» вместо «Say Hello», и при нажатии на нее должно появиться «Hola, Mundo!»

tutorial_image
Рисунок 111: Изменение языка устройства на испанский

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


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

Отображаемое имя приложения определяется в Info.plist под ключом CFBundleDisplayName. Вместо того, чтобы заставлять вас переводить значения в основном файле Internationalization-Info.plist , iOS предоставляет вам специальный строковый файл для перезаписи определенных параметров конфигурации локализованными значениями. В группе « Вспомогательные файлы » в Навигаторе проектов откройте файл InfoPlist.strings . Это так же, как файл Localizable.strings, который мы создали в предыдущем разделе, за исключением того, что он должен предоставлять только значения для ключей Info.plist . Добавьте следующее в ваш файл InfoPlist.strings .

1
«CFBundleDisplayName» = «Hola, Mundo!»;

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

tutorial_image
Рисунок 112: Локализация отображаемого имени приложения

В этой главе мы узнали, как локализовать медиаресурсы, текст и метаданные с помощью NSBundle. Абстрагируя ресурсы, которые необходимо локализовать в изолированные файлы, и косвенно ссылаясь на них с помощью таких методов, как pathForResource: ofType:, можно перевести ваше приложение на другой язык, не затрагивая ни одной строки кода приложения. Это очень мощная функция iOS, особенно учитывая международную распространенность устройств iPhone и iPad.

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

Этот урок представляет собой главу из iOS, сжатой , бесплатной электронной книги от команды Syncfusion .