HTML Diff
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