Написать пост

Настройка локализаций в Xcode 8 и Swift 3

Аватар Ярослав Сарницкий

Обложка поста Настройка локализаций в Xcode 8 и Swift 3

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

В итоге мы должны получить такой результат:

Для работы нам понадобится компьютер с macOS и средой разработки Xcode версии 8 и выше.

Подготовка проекта

Создадим новый проект. Для этого открываем Xcode и выбираем в меню File → New → Project:

В появившемся окне нужно выбрать «Single View Application» для iOS:

После нажатия на кнопку Next нужно ввести название проекта (Locale), выбрать команду разработчиков (поле можно оставить пустым), указать организацию (в примере используется «GS Develop», но можно выбрать любое другое название), создать идентификатор приложения (любой, но необходимо соблюдать формат, указанный на скриншоте), язык проекта (Swift) и устройство (iPhone).

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

Настройка Main.storyboard

Откроем файл Main.storyboard и создадим копию того, что изображено на скриншоте ниже:

Стоит отметить, что мы будем создавать приложение только для iPhone. Никакой оптимизации под разные экраны мы проводить не будем. Нам нужно добавить 9 элементов Label и 1 элемент ImageView. Это не вызовет у вас трудностей, если вы уже работали с Xcode. Настраивайте внешний вид по своему усмотрению.

Назначаем IBOutlets для UIControls

Для этого откроем Assistant Editor и перетащим поля «text», «number», «currency», «date» и «UIImageView» в файл ViewController.swift. В результате мы получим следующее:

Прописываем значения для текстовых полей

Теперь мы можем закрывать Assistant Editor и переходить непосредственно к файлу ViewController.swift. Здесь мы создаем функцию populateValues() и вызываем ее в override func viewDidLoad():

			func populateValues() {
        textLabel.text = "Good Morning"
        numberLabel.text = "9999999.999"
        currencyLabel.text = "50000"
        dateLabel.text = "30/05/2017"
        imageView.image = UIImage(named: "adele-hello")
    }
		

Далее нужно найти в интернете картинку (в нашем примере это картинка с надписью «Hello») и добавить ее в Assets.xcassets. Следующим шагом следует вернуться к Main.storyboard и выбрать это изображение для ImageView. При запуске проекта мы должны получить результат, представленный на скриншоте ниже:

Локализируем значения для даты, валюты и цифр

Для локализации значений нам нужно добавить три переменных в функцию populateValues().

			var numberFormatter: NumberFormatter {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            return formatter
        }
        
        var currencyFormatter: NumberFormatter {
            let formatter = NumberFormatter()
            formatter.numberStyle = .currency
            return formatter
        }
        
        var dateFormatter: DateFormatter {
            let formatter = DateFormatter()
            formatter.dateStyle = .medium
            formatter.timeStyle = .medium
            return formatter
        }
		

Необходимо переписать и саму функцию. Теперь она будет выглядеть так:

			func populateValues() {
        var numberFormatter: NumberFormatter {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            return formatter
        }
        
        var currencyFormatter: NumberFormatter {
            let formatter = NumberFormatter()
            formatter.numberStyle = .currency
            return formatter
        }
        
        var dateFormatter: DateFormatter {
            let formatter = DateFormatter()
            formatter.dateStyle = .medium
            formatter.timeStyle = .medium
            return formatter
        }
        
        textLabel.text = "Good Morning"
        numberLabel.text = numberFormatter.string(from: 9999999.999)
        currencyLabel.text = currencyFormatter.string(from: 5000)
        dateLabel.text = dateFormatter.string(from: NSDate() as Date)
        imageView.image = UIImage(named: "adele-hello")
    }
		

После внесения этих изменений при запуске приложения можно будет увидеть локализованные поля:

Добавляем поддержку второго языка

Чтобы добавить поддержку русского языка, нужно добавить его в наш проект. Для этого переходим в Project target и во вкладке Localization выбираем русский язык:

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

Настройка локализаций на главном экране приложения

Откроем новые элементы для Main.strings (Russian) и введем русские названия для некоторых значений:

			/* Class = "UILabel"; text = "Image:"; ObjectID = "O8K-TD-2G8"; */
"O8K-TD-2G8.text" = "Изображение:";

/* Class = "UILabel"; text = "Date:"; ObjectID = "fL7-x8-mUA"; */
"fL7-x8-mUA.text" = "Дата:";

/* Class = "UILabel"; text = "Number:"; ObjectID = "hw4-lj-ril"; */
"hw4-lj-ril.text" = "Число:";

/* Class = "UILabel"; text = "Text:"; ObjectID = "iKI-eF-xxs"; */
"iKI-eF-xxs.text" = "Текст:";

/* Class = "UILabel"; text = "Currency:"; ObjectID = "pLd-MI-tDr"; */
"pLd-MI-tDr.text" = "Валюта:";
		

Готово!

Тестируем на симуляторе

Чтобы проверить работу локализаций, нам нужно установить русский язык в симуляторе. Для этого переходим в Scheme Option. В появившемся окне переходим во вкладку Options, выбираем Application Language и устанавливаем русский язык:

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

Осталось локализировать изображение и текст «Good Morning».

Локализация текста с использованием NSLocalizedString

Чтобы заменить текст «Good Morning» на «Доброе утро», нужно добавить в проект файл типа Strings и назвать его Localizable.strings:

Теперь откроем этот файл в File Inspector, перейдем в пункт Localize и выберем русский язык. Затем отметим галочками английский и русский языки:

Теперь у нас появились файлы Localizable.strings (Russian) и Localizable.strings (English):

Добавим следующие строки в файл Localizable.Strings (English):

			GOOD_MORNING=“Good Morning”;
		

Добавим также строки в файл Localizable.Strings (Russian):

			GOOD_MORNING="Доброе Утро";
		

После этого вернемся к файлу ViewController.swift и заменим строку:

			textLabel.text = "Good Morning»
		

на строку:

			textLabel.text = NSLocalizedString("GOOD_MORNING",comment:"Good Morning»)
		

В итоге наш код должен выглядеть так:

			textLabel.text = NSLocalizedString("GOOD_MORNING",comment:"Good Morning")
        numberLabel.text = numberFormatter.string(from: 9999999.999)
        currencyLabel.text = currencyFormatter.string(from: 5000)
        dateLabel.text = dateFormatter.string(from: NSDate() as Date)
        imageView.image = UIImage(named:"adele-hello")
		

При запуске приложения мы должны увидеть новую надпись:

Локализация изображений

Чтобы локализировать изображение, добавляем в каталог Assets.xcassets картинку с русским текстом (можно взять любую подходящую). После этого переходим в Localizable.Strings и прописываем такие строки:

Для Localizable.Strings (English):

			IMG="adele-hello";
		

Для Localizable.Strings (Russian):

			IMG="hello";
		

Затем вернемся к файлу ViewController.swift и заменим строку с названием изображения:

			imageView.image = UIImage(named: "adele-hello")
		

на строку:

			imageView.image = UIImage(named: "\(NSLocalizedString("IMG",comment:"adele-hello"))")
		

Теперь при запуске приложения мы сможем увидеть локализованное изображение:

На этом все. Исходные файлы проекта можно скачать на Github.

Следите за новыми постами
Следите за новыми постами по любимым темам
10К открытий10К показов