0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Сегодня для многих приложений важно, чтобы они поддерживали<strong>несколько локализаций</strong>. Это имеет значение, например, при продвижении приложения на рынке. В нашем материале мы расскажем, как выполнить английскую и русскую локализацию чисел, даты, текста, валюты и изображений в мобильном приложении на iOS. Для работы потребуется ПК с macOS и средой разработки Xcode версии 8 или выше.</p>
1
<p>Сегодня для многих приложений важно, чтобы они поддерживали<strong>несколько локализаций</strong>. Это имеет значение, например, при продвижении приложения на рынке. В нашем материале мы расскажем, как выполнить английскую и русскую локализацию чисел, даты, текста, валюты и изображений в мобильном приложении на iOS. Для работы потребуется ПК с macOS и средой разработки Xcode версии 8 или выше.</p>
2
<p><strong>Ожидаемый результат</strong>выглядит следующим образом:</p>
2
<p><strong>Ожидаемый результат</strong>выглядит следующим образом:</p>
3
<h2>1. Подготавливаем проект</h2>
3
<h2>1. Подготавливаем проект</h2>
4
<p>В первую очередь, создаём новый проект. Для этого нужно открыть Xcode и выбрать<strong>File → New → Project</strong>:</p>
4
<p>В первую очередь, создаём новый проект. Для этого нужно открыть Xcode и выбрать<strong>File → New → Project</strong>:</p>
5
<p>Появится окно, где выбираем "<strong>Single View Application</strong>" для iOS:</p>
5
<p>Появится окно, где выбираем "<strong>Single View Application</strong>" для iOS:</p>
6
<p>Подтвердив выбор кнопкой "Next", вводим название проекта (в нашем случае назовём его<strong>Locale</strong>). Далее: - выбираем команду разработчиков (можем и не выбирать, оставив поле пустым); - указываем компанию (в нашем примере - "GS Develop", но вы вправе выбрать что-нибудь другое); - создаём идентификатор мобильного приложения (идентификатор может быть любым, главное соблюдать формат, отображённый на скриншоте); - выбираем язык проекта (разумеется, Swift); - выбираем устройство (iPhone).</p>
6
<p>Подтвердив выбор кнопкой "Next", вводим название проекта (в нашем случае назовём его<strong>Locale</strong>). Далее: - выбираем команду разработчиков (можем и не выбирать, оставив поле пустым); - указываем компанию (в нашем примере - "GS Develop", но вы вправе выбрать что-нибудь другое); - создаём идентификатор мобильного приложения (идентификатор может быть любым, главное соблюдать формат, отображённый на скриншоте); - выбираем язык проекта (разумеется, Swift); - выбираем устройство (iPhone).</p>
7
<p>Осталось сохранить приложение на нашем компьютере в любом удобном месте.</p>
7
<p>Осталось сохранить приложение на нашем компьютере в любом удобном месте.</p>
8
<h2>2. Настраиваем Main.storyboard</h2>
8
<h2>2. Настраиваем Main.storyboard</h2>
9
<p>Теперь откроем файл<strong>Main.storyboard</strong>и сделаем копию в соответствии со скриншотом ниже:</p>
9
<p>Теперь откроем файл<strong>Main.storyboard</strong>и сделаем копию в соответствии со скриншотом ниже:</p>
10
<p>Важно учесть, что мы создаём приложение исключительно под<strong>iPhone</strong>, поэтому оптимизацию под разные экраны проводить не будем. Нам потребуется добавить девять элементов<strong>Label</strong>и один элемент<strong>ImageView</strong>. Если работали с Xcode, это не вызовет у вас затруднений. Что касается внешнего вида, то его можете настраивать на своё усмотрение.</p>
10
<p>Важно учесть, что мы создаём приложение исключительно под<strong>iPhone</strong>, поэтому оптимизацию под разные экраны проводить не будем. Нам потребуется добавить девять элементов<strong>Label</strong>и один элемент<strong>ImageView</strong>. Если работали с Xcode, это не вызовет у вас затруднений. Что касается внешнего вида, то его можете настраивать на своё усмотрение.</p>
11
<h2>3. Назначаем IBOutlets для UIControls</h2>
11
<h2>3. Назначаем IBOutlets для UIControls</h2>
12
<p>Чтобы назначить IBOutlets для UIControls открываем<strong>Assistant Editor</strong>и перетаскиваем поля "currency", "date", "text", "number" и "UIImageView" в файл ViewController.swift.</p>
12
<p>Чтобы назначить IBOutlets для UIControls открываем<strong>Assistant Editor</strong>и перетаскиваем поля "currency", "date", "text", "number" и "UIImageView" в файл ViewController.swift.</p>
13
<p>Получим следующий результат:</p>
13
<p>Получим следующий результат:</p>
14
<h2>4. Прописываем значения для текстовых полей</h2>
14
<h2>4. Прописываем значения для текстовых полей</h2>
15
<p>Итак, Assistant Editor уже можно закрыть, так как пора переходить к файлу<strong>ViewController.swift</strong>. Тут нужно создать функцию populateValues() и вызвать её в override func viewDidLoad():</p>
15
<p>Итак, Assistant Editor уже можно закрыть, так как пора переходить к файлу<strong>ViewController.swift</strong>. Тут нужно создать функцию populateValues() и вызвать её в override func viewDidLoad():</p>
16
func populateValues() { textLabel.text = "Good Morning" numberLabel.text = "9999999.999" currencyLabel.text = "50000" dateLabel.text = "30/05/2017" imageView.image = UIImage(named: "adele-hello") }<p>Теперь можно подобрать изображение из сети (у нас это картинка с текстом "Hello") и добавить изображение в Assets.xcassets. Следующий шаг - возврат к Main.storyboard и выбор данного изображения для ImageView. Таким образом, при запуске проекта мы получим следующее:</p>
16
func populateValues() { textLabel.text = "Good Morning" numberLabel.text = "9999999.999" currencyLabel.text = "50000" dateLabel.text = "30/05/2017" imageView.image = UIImage(named: "adele-hello") }<p>Теперь можно подобрать изображение из сети (у нас это картинка с текстом "Hello") и добавить изображение в Assets.xcassets. Следующий шаг - возврат к Main.storyboard и выбор данного изображения для ImageView. Таким образом, при запуске проекта мы получим следующее:</p>
17
<h2>5. Локализуем значения для валюты, даты и цифр</h2>
17
<h2>5. Локализуем значения для валюты, даты и цифр</h2>
18
<p>Чтобы локализовать значения, добавляем 3 переменных в функцию populateValues():</p>
18
<p>Чтобы локализовать значения, добавляем 3 переменных в функцию populateValues():</p>
19
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 }<p>Также нам потребуется переписать и саму функцию:</p>
19
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 }<p>Также нам потребуется переписать и саму функцию:</p>
20
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") }<p>После того, как мы внесём вышеописанные изменения, при запуске вашего мобильного приложения вы увидите локализованные поля:</p>
20
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") }<p>После того, как мы внесём вышеописанные изменения, при запуске вашего мобильного приложения вы увидите локализованные поля:</p>
21
<h2>6. Добавляем поддержку 2-го языка</h2>
21
<h2>6. Добавляем поддержку 2-го языка</h2>
22
<p>Добавляем русский язык в проект: переходим в Project target, выбираем<strong>Localization</strong>, а потом русский язык:</p>
22
<p>Добавляем русский язык в проект: переходим в Project target, выбираем<strong>Localization</strong>, а потом русский язык:</p>
23
<p>Кстати, в окне добавления файлов локализации есть возможность добавить поддержку нескольких языков для экрана запуска и главного экрана. Мы будем использовать лишь локализацию для главного экрана:</p>
23
<p>Кстати, в окне добавления файлов локализации есть возможность добавить поддержку нескольких языков для экрана запуска и главного экрана. Мы будем использовать лишь локализацию для главного экрана:</p>
24
<h2>7. Настраиваем локализацию на главном экране</h2>
24
<h2>7. Настраиваем локализацию на главном экране</h2>
25
<p>Теперь открываем новые элементы для Main.strings (Russian) и вводим русские названия для некоторых значений:</p>
25
<p>Теперь открываем новые элементы для Main.strings (Russian) и вводим русские названия для некоторых значений:</p>
26
/* 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" = "Валюта:";<p>Вуаля!</p>
26
/* 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" = "Валюта:";<p>Вуаля!</p>
27
<h2>8. Тестируем на симуляторе</h2>
27
<h2>8. Тестируем на симуляторе</h2>
28
<p>Для проверки работы локализаций устанавливаем русский язык в симуляторе. Потребуется перейти в Scheme Option, потом на вкладку Options, далее выбрать Application Language и установить русский язык:</p>
28
<p>Для проверки работы локализаций устанавливаем русский язык в симуляторе. Потребуется перейти в Scheme Option, потом на вкладку Options, далее выбрать Application Language и установить русский язык:</p>
29
<p>Если мы запустим мобильное приложение сейчас, то увидим лишь частично локализованное iOS-приложение:</p>
29
<p>Если мы запустим мобильное приложение сейчас, то увидим лишь частично локализованное iOS-приложение:</p>
30
<p>Как видим, осталось выполнить локализацию текста "Good Morning" и картинки.</p>
30
<p>Как видим, осталось выполнить локализацию текста "Good Morning" и картинки.</p>
31
<h2>9. Локализуем текст с помощью NSLocalizedString</h2>
31
<h2>9. Локализуем текст с помощью NSLocalizedString</h2>
32
<p>Чтобы получить вместо "Good Morning" "Доброе утро", добавляем в проект файл типа Strings и называем его Localizable.strings:</p>
32
<p>Чтобы получить вместо "Good Morning" "Доброе утро", добавляем в проект файл типа Strings и называем его Localizable.strings:</p>
33
<p>Далее открываем этот файл в File Inspector, переходим в пункт Localize и выбираем русский язык. Потом останется отметить галочками русский и английский языки:</p>
33
<p>Далее открываем этот файл в File Inspector, переходим в пункт Localize и выбираем русский язык. Потом останется отметить галочками русский и английский языки:</p>
34
<p>Итак, в результате появились файлы Localizable.strings (English)и Localizable.strings (Russian):</p>
34
<p>Итак, в результате появились файлы Localizable.strings (English)и Localizable.strings (Russian):</p>
35
<p>Теперь добавим в файл Localizable.Strings (English) следующую строку:</p>
35
<p>Теперь добавим в файл Localizable.Strings (English) следующую строку:</p>
36
GOOD_MORNING=“Good Morning”;<p>И ещё одну строку в файл Localizable.Strings (Russian):</p>
36
GOOD_MORNING=“Good Morning”;<p>И ещё одну строку в файл Localizable.Strings (Russian):</p>
37
GOOD_MORNING="Доброе Утро";<p>А теперь вернёмся к редактированию файла ViewController.swift и заменим строчку:</p>
37
GOOD_MORNING="Доброе Утро";<p>А теперь вернёмся к редактированию файла ViewController.swift и заменим строчку:</p>
38
textLabel.text = "Good Morning"<p>на строчку:</p>
38
textLabel.text = "Good Morning"<p>на строчку:</p>
39
textLabel.text = NSLocalizedString("GOOD_MORNING",comment:"Good Morning")<p>А вот как должен выглядеть готовый код:</p>
39
textLabel.text = NSLocalizedString("GOOD_MORNING",comment:"Good Morning")<p>А вот как должен выглядеть готовый код:</p>
40
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")<p>Теперь после запуска приложения мы увидим "Доброе Утро":</p>
40
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")<p>Теперь после запуска приложения мы увидим "Доброе Утро":</p>
41
<h2>10. Локализуем изображения</h2>
41
<h2>10. Локализуем изображения</h2>
42
<p>Для локализации картинки добавим в каталог Assets.xcassets изображение с русским текстом (вы можете взять любую другую картинку). После перейдём в Localizable.Strings и пропишем: 1) для Localizable.Strings (Russian):</p>
42
<p>Для локализации картинки добавим в каталог Assets.xcassets изображение с русским текстом (вы можете взять любую другую картинку). После перейдём в Localizable.Strings и пропишем: 1) для Localizable.Strings (Russian):</p>
43
<p>2) для Localizable.Strings (English):</p>
43
<p>2) для Localizable.Strings (English):</p>
44
<p>Теперь возвращаемся к редактированию файла ViewController.swift и меняем строчку с названием картинки:</p>
44
<p>Теперь возвращаемся к редактированию файла ViewController.swift и меняем строчку с названием картинки:</p>
45
imageView.image = UIImage(named: "adele-hello")<p>на строчку:</p>
45
imageView.image = UIImage(named: "adele-hello")<p>на строчку:</p>
46
imageView.image = UIImage(named: "\(NSLocalizedString("IMG",comment:"adele-hello"))")<p>Всё, после запуска мобильного приложения перед нами появится наша картинка с дружелюбным и приветливым котом:</p>
46
imageView.image = UIImage(named: "\(NSLocalizedString("IMG",comment:"adele-hello"))")<p>Всё, после запуска мобильного приложения перед нами появится наша картинка с дружелюбным и приветливым котом:</p>
47
<p>На этом будем заканчивать, исходные файлы проекта можно посмотреть по ссылке на<a>Github</a>.</p>
47
<p>На этом будем заканчивать, исходные файлы проекта можно посмотреть по ссылке на<a>Github</a>.</p>
48
<p><em>Статья написана специально для OTUS на основе следующих материалов: - "<a>Internationalization and localization of Apps in Xcode 6 and Swift</a>"; - "<a>Настройка локализаций в Xcode 8 и Swift 3</a>".</em></p>
48
<p><em>Статья написана специально для OTUS на основе следующих материалов: - "<a>Internationalization and localization of Apps in Xcode 6 and Swift</a>"; - "<a>Настройка локализаций в Xcode 8 и Swift 3</a>".</em></p>
49
49