Статьи

Локализация приложения для iOS

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

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

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

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

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

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

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

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

интернационализация

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

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

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

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

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

Чтобы интернационализировать ваше приложение, вы должны использовать следующие классы и функции при выводе дат, чисел, строк и текста.

NSDateFormatter

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

Ниже приведен фрагмент кода, показывающий, как можно использовать NSDateFormatter . Здесь мы устанавливаем локаль, но для вашего приложения в этом нет необходимости, поскольку она будет использовать настройку локали устройства.

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateStyle = NSDateFormatterMediumStyle; dateFormatter.timeStyle = NSDateFormatterNoStyle; NSDate *date = [NSDate date]; [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; NSLog(@"Date for locale %@: %@", [[dateFormatter locale] localeIdentifier], [dateFormatter stringFromDate:date]); [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]]; NSLog(@"Date for locale %@: %@", [[dateFormatter locale] localeIdentifier], [dateFormatter stringFromDate:date]); [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"]]; NSLog(@"Date for locale %@: %@", [[dateFormatter locale] localeIdentifier], [dateFormatter stringFromDate:date]); [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]]; NSLog(@"Date for locale %@: %@", [[dateFormatter locale] localeIdentifier], [dateFormatter stringFromDate:date]); 

Ниже приведен вывод вышеприведенного кода.

 Date for locale en_US: May 15, 2014 Date for locale fr_FR: 15 mai 2014 Date for locale en_GB: 15 May 2014 Date for locale de_DE: 15.05.2014 

В приведенном выше примере мы вручную устанавливаем локаль, NSDateFormatter использует NSDateFormatter . В реальном приложении вы позволяете настройке устройства определять это. В таких случаях вы можете проверить вывод, изменив формат региона в настройках вашего телефона. Зайдите в Settings -> General -> International -> Region Format -> [Select Region]

NSNumberFormatter

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

В приведенном ниже примере используется NSNumberFormatter для вывода значения в соответствии с различными локалями.

 NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; [numberFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; NSLog(@"Number format for locale %@: %@", [[numberFormatter locale] localeIdentifier], [numberFormatter stringFromNumber:@123456.789]); [numberFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]]; NSLog(@"Number format for locale %@: %@", [[numberFormatter locale] localeIdentifier], [numberFormatter stringFromNumber:@123456.789]); [numberFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"]]; NSLog(@"Number format for locale %@: %@", [[numberFormatter locale] localeIdentifier], [numberFormatter stringFromNumber:@123456.789]); [numberFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]]; NSLog(@"Number format for locale %@: %@", [[numberFormatter locale] localeIdentifier], [numberFormatter stringFromNumber:@123456.789]); 

Ниже приведен вывод из приведенного выше кода.

 Number format for locale en_US: 123,456.789 Number format for locale fr_FR: 123 456,789 Number format for locale en_GB: 123,456.789 Number format for locale de_DE: 123.456,789 

Помимо форматирования чисел NSNumberFormatter также форматирует значения валют. Если его свойство numberStyle установлено в NSNumberFormatterCurrencyStyle оно будет выводить валюты с соответствующим десятичным разделителем (точка или запятая), разделителем тысяч (запятая или точка) и символами валюты, которые будут правильно размещены (в некоторых странах символ ставится перед значение в то время как в других это идет после).

Следующий фрагмент кода использует NSNumberFormatter для вывода значений валют для разных локалей.

 NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init]; currencyFormatter.numberStyle = NSNumberFormatterCurrencyStyle; [currencyFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; NSLog(@"Currency format for locale %@: %@", [[currencyFormatter locale] localeIdentifier], [currencyFormatter stringFromNumber:@100000]); [currencyFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]]; NSLog(@"Currency format for locale %@: %@", [[currencyFormatter locale] localeIdentifier], [currencyFormatter stringFromNumber:@100000]); [currencyFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"]]; NSLog(@"Currency format for locale %@: %@", [[currencyFormatter locale] localeIdentifier], [currencyFormatter stringFromNumber:@100000]); [currencyFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"]]; NSLog(@"Currency format for locale %@: %@", [[currencyFormatter locale] localeIdentifier], [currencyFormatter stringFromNumber:@100000]); 

Выше будет иметь следующий вывод.

 Currency format for locale en_US: $100,000.00 Currency format for locale fr_FR: 100 000,00 € Currency format for locale en_GB: £100,000.00 Currency format for locale de_DE: 100.000,00 € 

NSLocalizedString

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

Для загрузки текста из файла строк мы используем NSLocalizedString .

NSLocalizedString — это макрос Foundation, который используется для получения локализованной версии строки. Требуется два аргумента — ключ и комментарий. Ключ однозначно идентифицирует строку, которая должна быть локализована, а комментарий указывает контекст, в котором используется строка. Комментарий может быть установлен на nil но вы можете включить описательный комментарий для вашей собственной справки и для помощи переводчику.

Чтобы интернационализировать строки в вашем коде, замените литеральные строки функцией NSLocalizedString . Например, вместо следующего

 NSString *string = @"Hello World"; 

вы бы вместо этого использовали

 NSString *string = NSLocalizedString(@"HELLO", nil); 

Где у вас будет файл строк со следующим

 "HELLO" = "Hello World"; 

локализация

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

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

Загруженная папка проекта содержит основной проект с именем Hello World и изображение с именем image.jpg, которое мы будем использовать позже. Приложение имеет один вид, как показано ниже, с изображением, меткой и кнопкой.

Финальный предварительный просмотр приложения

Любой ресурс в проекте может быть локализован, будь то изображение, аудиофайл, файл XIB или раскадровка. Когда ресурс локализован, локализованная копия добавляется в комплект приложения. Ресурсы размещаются в специфичных для языка каталогах, известных как каталоги lproj. Каталогам присваивается имя локализации с суффиксом lproj. Например, en.lproj для английского и es.lproj для испанского.

Коды локализации представляют собой комбинацию кода языка и необязательного кода региона. Для языковых кодов вы можете использовать условные обозначения ISO 639-1 или ISO 639-2. ISO 639-1 является предпочтительным способом идентификации языков. Однако, если код ISO 639-1 недоступен для конкретного языка, вместо него могут использоваться трехбуквенные коды, определенные в спецификации ISO 639-2.

Для региональных кодов вы можете использовать соглашения ISO 3166-1. Эта спецификация использует двухбуквенный заглавный код для идентификации конкретной страны. Это необязательно. Проверьте здесь полный список кодов языков.

Мы собираемся сначала локализовать наш интерфейс, файл Main.storyboard. Xcode имеет функцию, называемую «Базовая интернационализация», которая упрощает процесс локализации файлов XIB и раскадровки. Вместо создания раскадровки или файлов XIB для каждого языка, который вы хотите поддерживать, Xcode создает каталог Base.lproj который содержит основную раскадровку или файлы XIB.

Благодаря этому локализация может быть осуществлена ​​путем создания файлов Localizable.strings. Для языков, чьи представления не могут быть изменены путем локализации только строк, вы можете создать полные файлы XIB или раскадровки.

Чтобы начать, нажмите на папку проекта Hello World на левой панели, выберите проект Hello World на следующей панели и нажмите на вкладку Info. Обратите внимание, что Base international был включен по умолчанию.

Включить базовую интернационализацию

В разделе «Локализации» нажмите «+» и выберите «Испанский». Нажмите кнопку Готово в появившемся окне с выбором, показанным ниже.

Диалог выбора файлов

В навигаторе проекта вы заметите, что Main.storyboard и InfoPlist.strings теперь могут быть расширены. Разверните файл раскадровки, и вы найдете базовый раскадровку и файл строк для испанского языка.

Main.strings (Spanish) содержит список строк в парах ключ / значение. Xcode генерирует эти строки из текстовых элементов интерфейса. Ключи относятся к идентификаторам объектов элементов пользовательского интерфейса, а значения — это строки, которые должны быть переведены.

Наш Main.strings (Spanish) содержит следующее:

 /* Class = "IBUILabel"; text = "Hello"; ObjectID = "Fg0-t0-XFF"; */ "Fg0-t0-XFF.text" = "Hello"; /* Class = "IBUIButton"; normalTitle = "Say Hello"; ObjectID = "pr4-OE-zWY"; */ "pr4-OE-zWY.normalTitle" = "Say Hello"; 

Отредактируйте файл как показано ниже

 /* Class = "IBUILabel"; text = "Hello"; ObjectID = "Fg0-t0-XFF"; */ "Fg0-t0-XFF.text" = "Hola"; /* Class = "IBUIButton"; normalTitle = "Say Hello"; ObjectID = "pr4-OE-zWY"; */ "pr4-OE-zWY.normalTitle" = "Saludar"; 

Это для локализации текста нашего представления. Чтобы локализовать изображение, выберите файл изображения в навигаторе проекта. Supporting Files -> Images -> image.jpg . В инспекторе файлов справа нажмите кнопку «Локализовать».

Локализовать файл

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

Локализовать файл

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

Чтобы изменить это, в Finder найдите файл изображения с именем image.jpg, который был в стартовом проекте, который вы скачали для этого урока. Скопируйте его в каталог Hello World/es.lproj вашего проекта, заменив изображение, которое там находится.

Обратите внимание, что ваши ресурсы для разных каталогов lproj должны иметь то же имя, что и их аналоги.

Запустите приложение и при изменении языка вашего устройства на Español вы увидите переведенный язык представлений и изображение изменилось. Путь для изменения настроек языка: General -> International -> Language -> Espanol .

Разные версии приложения

Чтобы увидеть изменения, вам может понадобиться сбросить симулятор и выполнить чистую сборку. Для сброса симулятора перейдите к iOS Simulator -> Reset Content and Settings в строке меню. Чтобы сделать чистую сборку, перейдите к Product -> Clean в строке меню Xcode.

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

Перейдите в File -> New -> File . Выберите Strings File в подразделе Resource.

Добавление файла строк

Нажмите Next , назовите файл Localizable.strings и сохраните его.

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

Локализация этого файла будет похожа на то, как мы локализовали файл изображения. Выберите Localizable.strings в навигаторе проекта и в Инспекторе файлов нажмите кнопку «Локализовать».

Выберите английский язык в появившемся диалоговом окне.

Если файл строк по-прежнему выбран, установите флажок «Испанский» в разделе «Локализация» инспектора файлов.

Теперь у вас должно быть две версии файла Localizable.strings .

Локализованные строки

Поместите следующее в файл английских строк.

 "TITLE" = "Greeting"; "GREETING" = "Hello"; "OK" = "Ok"; 

И в файле испанских строк, поместите в следующем.

 "TITLE" = "Saludo"; "GREETING" = "Hola"; "OK" = "Bueno"; 

Мы хотим, чтобы вышеуказанное сообщение появлялось при нажатии кнопки «Скажи привет». Создайте действие с именем sayHello для кнопки. (Я предполагаю, что читатель знает, как это сделать. Если нет, посмотрите это руководство ). Отредактируйте файл JKEViewController.m как показано ниже.

 - (IBAction)sayHello:(UIButton *)sender { [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"TITLE", nil) message:NSLocalizedString(@"GREETING", nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", nil) otherButtonTitles:nil] show]; } 

Запустите приложение и протестируйте его. Вы должны увидеть результаты, похожие на изображение ниже. (Если вы не видите ожидаемых изменений при запуске проекта, перезагрузите симулятор и выполните чистую сборку, как описано ранее).

Окончательные заявки

Чтобы локализовать имя приложения, добавьте следующую строку в InfoPlist.string (Spanish) :

 "CFBundleDisplayName" = "Hola Mundo"; 

Авто Макет

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

С помощью Auto Layout вы устанавливаете ограничения на представления пользовательского интерфейса, которые описывают отношения, которые они имеют друг с другом. Во время выполнения система Auto Layout определяет, как планировать каждое представление, используя установленные ограничения. Это создает гибкие макеты, которые адаптируются к разным размерам экрана (например, 3,5 ′ или 4,0 ′ iPhone), ориентациям и размеру текста (который теперь можно изменять из-за динамического типа).

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

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

Вывод

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