diff --git a/assets/typescript/list/index.ts b/assets/typescript/list/index.ts
index 3f37eed38..4c63a80a9 100644
--- a/assets/typescript/list/index.ts
+++ b/assets/typescript/list/index.ts
@@ -13,12 +13,15 @@ import ko from 'apexcharts/dist/locales/ko.json';
import nl from 'apexcharts/dist/locales/nl.json';
import pl from 'apexcharts/dist/locales/pl.json';
import sq from 'apexcharts/dist/locales/sq.json';
+import uk from 'apexcharts/dist/locales/ua.json';
import zh_CN from 'apexcharts/dist/locales/zh-cn.json';
import zh_TW from 'apexcharts/dist/locales/zh-tw.json';
import 'leaflet/dist/leaflet.css';
-const locales = [de, en, es, fr, hu, it, ja, ko, nl, pl, sq, zh_CN, zh_TW];
+uk.name = 'uk'; // Overwrite "ua" by "uk"
+
+const locales = [de, en, es, fr, hu, it, ja, ko, nl, pl, sq, uk, zh_CN, zh_TW];
const mapElement = document.getElementById('map-region');
if (mapElement !== null) {
diff --git a/config/services.yaml b/config/services.yaml
index 59d5be288..ce8be0d95 100644
--- a/config/services.yaml
+++ b/config/services.yaml
@@ -7,7 +7,7 @@ parameters:
osmcha.api.url: 'https://osmcha.org/api/v1/'
osmcha.api.key: '%env(OSMCHA_API_KEY)%'
osm.api.url: 'https://api.openstreetmap.org/api/0.6/'
- app.locales: ['en','fr','it','nl','bg','es_ES','ja','pl','de','sq','zh_TW','zh_CN','hu','ko']
+ app.locales: ['en','fr','it','nl','bg','es_ES','ja','pl','de','sq','zh_TW','zh_CN','hu','ko','uk']
app.userAgent: 'OpenStreetMap Welcome Tool'
app.title: 'OpenStreetMap Welcome Tool'
diff --git a/translations/messages.uk.xlf b/translations/messages.uk.xlf
new file mode 100644
index 000000000..4f9fdfe88
--- /dev/null
+++ b/translations/messages.uk.xlf
@@ -0,0 +1,492 @@
+
+
+
+
+
+
+
+ Албанія
+
+
+
+ Австрія
+
+
+
+ Бангладеш
+
+
+
+ Бельгія
+
+
+
+ Болівія
+
+
+
+ Болгарія
+
+
+
+ Британська Колумбія
+
+
+
+ Онтаріо
+
+
+
+ Каталонські землі
+
+
+
+ Чилі
+
+
+
+ Китай
+
+
+
+ Пекін
+
+
+
+ Хунань
+
+
+
+ Колумбія
+
+
+
+ Богота
+
+
+
+ Верхня долина Рейну
+
+
+
+ Демократична Республіка Конго
+
+
+
+ Франція
+
+
+
+ Німеччина
+
+
+
+ Берлін
+
+
+
+ Берлін-Нойкельн
+
+
+
+ Бремен
+
+
+
+ Гана
+
+
+
+ Гонконг
+
+
+
+ Угорщина
+
+
+
+ Індонезія
+
+
+
+ Ірландія
+
+
+
+ Італія
+
+
+
+ Японія
+
+
+
+ Косово
+
+
+
+ Лівія
+
+
+
+ Ліберія
+
+
+
+ Люксембург
+
+
+
+ Макао
+
+
+
+ Ніґер
+
+
+
+ Нігерія
+
+
+
+ Північна Корея
+
+
+
+ Пакистан
+
+
+
+ Панама
+
+
+
+ Філіппіни
+
+
+
+ Польща
+
+
+
+ Румунія
+
+
+
+ Шотландія
+
+
+
+ Південна Корея
+
+
+
+ Іспанія
+
+
+
+ Тайвань
+
+
+
+ Танзанія
+
+
+
+ Тоґо
+
+
+
+ Туреччина
+
+
+
+ Уганда
+
+
+
+ Україна
+
+
+
+ Каліфорнія
+
+
+
+ Канзас
+
+
+
+ Співдружність Массачусетсу
+
+
+
+ Мічиган
+
+
+
+ Нью-Йорк
+
+
+
+ Орегон
+
+
+
+ Юта
+
+
+
+ Вермонт
+
+
+
+ Штат Вашингтон
+
+
+
+ Запит на перевірку
+
+
+
+ Неприпустима модифікація теґу
+
+
+
+ Нотаток немає.
+
+
+
+ Підтримується markdown.
+
+
+
+ Перегляд
+
+
+
+ Відкрийте інші інструменти
+
+
+
+ Шкідливий
+
+
+
+ Перевірено
+
+
+
+ Хронологія
+
+
+
+ Обліковий запис створено
+
+
+
+ Мапер з {date}
+
+
+
+ Обліковий запис
+
+
+
+ Створення привітального повідомлення
+
+
+
+ Шаблони
+
+
+
+ Копіювати текст до буфера обміну
+
+
+
+ Завантажити повідомлення до osm.org
+
+
+
+ Набори змін
+
+
+
+ Історія
+
+
+
+ Головна
+
+
+
+ Перелік
+
+
+
+ Мапер
+
+
+
+ Мапер
+
+
+
+ Перший набір змін
+
+
+
+ Редактор
+
+
+
+ Локаль
+
+
+
+ Переглянути профіль
+
+
+
+ Мапери
+
+
+
+ Перелік маперів, які вперше внесли зміни тут
+
+
+
+ Попередній місяць
+
+
+
+ Наступний місяць
+
+
+
+ Нотатка
+
+
+
+ Додати
+
+
+
+ Додати нотатку
+
+
+
+ Привітав {userlink}
+
+
+
+ {mapper} отримав привітання
+
+
+
+ {mapper} відповів(ла)
+
+
+
+ Набір змін
+
+
+
+ Ще не привітали
+
+
+
+ Відповідь ще не отримана
+
+
+
+ {userlink} відповів(ла)
+
+
+
+ Увійти в OSM
+
+
+
+ Відкрити меню користувача
+
+
+
+ Вітання надіслане
+
+
+
+ Останнє оновлення
+
+
+
+ Вийти
+
+
+
+ Нотатки
+
+
+
+ Це інструмент OpenStreetMap Welcome.
+Він допоможе вам знайти нових маперів у вашому регіоні та привітати їх.
+
+
+
+ Якщо ви хочете додати свій регіон або мову до Welcome Tool, перегляньте {contributing_link_start}наш посібник{link_end}.
+
+
+
+ Розроблено {osmbe_link_start}OpenStreetMap Бельгія{link_end} та підтримується {lccwg_link_start}Робочою групою Місцевих осередків та спільнот{link_end}.
+
+
+
+ Попередній мапер
+
+
+
+ Наступний мапер
+
+
+
+ Африка
+
+
+
+ Азія
+
+
+
+ Австралія
+
+
+
+ Європа
+
+
+
+ Північна Америка
+
+
+
+ Південна Америка
+
+
+
+ {count} нових маперів ({percent} %) яких вже привітали
+
+
+
+ Мапера помічено у {count} регіоні(ах)
+
+
+
+ Завантажити RSS-стрічку OSMCha
+
+
+
+
diff --git a/translations/security.uk.xlf b/translations/security.uk.xlf
new file mode 100644
index 000000000..a4bc793bb
--- /dev/null
+++ b/translations/security.uk.xlf
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+ Помилка автентифікації.
+
+
+
+ Автентифікаційні дані не знайдено.
+
+
+
+ Запит на автентифікацію не може бути опрацьовано у зв’язку з проблемою в системі.
+
+
+
+ Невірні автентифікаційні дані.
+
+
+
+ Хтось інший вже використав цей сookie.
+
+
+
+ Відсутні права на запит цього ресурсу.
+
+
+
+ Невірний токен CSRF.
+
+
+
+ Не знайдено провайдера автентифікації, що підтримує токен автентифікаціії.
+
+
+
+ Сесія недоступна, її час вийшов, або cookies вимкнено.
+
+
+
+ Токен не знайдено.
+
+
+
+ Ім’я користувача не знайдено.
+
+
+
+ Термін дії облікового запису вичерпано.
+
+
+
+ Термін дії автентифікаційних даних вичерпано.
+
+
+
+
+ Обліковий запис заблоковано.
+
+
+
+ Забагато невдалих спроб входу. Будь ласка, спробуйте пізніше.
+
+
+
+ Посилання для входу недійсне, або термін його дії закінчився.
+
+
+
+ Забагато невдалих спроб входу. Будь ласка, спробуйте знову через %minutes% хвилину.
+
+
+
+ Забагато невдалих спроб входу. Будь ласка, спробуйте знову через %minutes% хв.
+
+
+
+
diff --git a/translations/time+intl-icu.uk.xlf b/translations/time+intl-icu.uk.xlf
new file mode 100644
index 000000000..8c9d3637c
--- /dev/null
+++ b/translations/time+intl-icu.uk.xlf
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+ Зараз
+
+
+
+
diff --git a/translations/validators.uk.xlf b/translations/validators.uk.xlf
new file mode 100644
index 000000000..83ead011a
--- /dev/null
+++ b/translations/validators.uk.xlf
@@ -0,0 +1,542 @@
+
+
+
+
+
+
+
+ Значення повинно бути Ні.
+
+
+
+ Значення повинно бути Так.
+
+
+
+ Тип значення повинен бути {{ type }}.
+
+
+
+ Значення повинно бути пустим.
+
+
+
+ Обране вами значення недопустиме.
+
+
+
+ Ви повинні обрати хоча б {{ limit }} варіант.|Ви повинні обрати хоча б {{ limit }} варіанти.|Ви повинні обрати хоча б {{ limit }} варіантів.
+
+
+
+ Ви повинні обрати не більше ніж {{ limit }} варіантів.
+
+
+
+ Одне або кілька заданих значень є недопустимі.
+
+
+
+ Це поле не очікується.
+
+
+
+ Це поле не вистачає.
+
+
+
+ Дане значення не є вірною датою.
+
+
+
+ Дане значення дати та часу недопустиме.
+
+
+
+ Значення адреси электронної пошти недопустиме.
+
+
+
+ Файл не знайдено.
+
+
+
+ Файл не читається.
+
+
+
+ Файл занадто великий ({{ size }} {{ suffix }}). Дозволений максимальний розмір {{ limit }} {{ suffix }}.
+
+
+
+ MIME-тип файлу недопустимий ({{ type }}). Допустимі MIME-типи файлів {{ types }}.
+
+
+
+ Значення повинно бути {{ limit }} або менше.
+
+
+
+ Значення занадто довге. Повинно бути рівне {{ limit }} символу або менше.|Значення занадто довге. Повинно бути рівне {{ limit }} символам або менше.|Значення занадто довге. Повинно бути рівне {{ limit }} символам або менше.
+
+
+
+ Значення повинно бути {{ limit }} або більше.
+
+
+
+ Значення занадто коротке. Повинно бути рівне {{ limit }} символу або більше.|Значення занадто коротке. Повинно бути рівне {{ limit }} символам або більше.|Значення занадто коротке. Повинно бути рівне {{ limit }} символам або більше.
+
+
+
+ Значення не повинно бути пустим.
+
+
+
+ Значення не повинно бути null.
+
+
+
+ Значення повинно бути null.
+
+
+
+ Значення недопустиме.
+
+
+
+ Значення часу недопустиме.
+
+
+
+ Значення URL недопустиме.
+
+
+
+ Обидва занчення повинні бути одинаковими.
+
+
+
+ Файл занадто великий. Максимальний допустимий розмір {{ limit }} {{ suffix }}.
+
+
+
+ Файл занадто великий.
+
+
+
+ Файл не можливо завантажити.
+
+
+
+ Значення має бути допустимим числом.
+
+
+
+ Цей файл не є допустимим форматом зображення.
+
+
+
+ Це некоректна IP адреса.
+
+
+
+ Це некоректна мова.
+
+
+
+ Це некоректна локалізація.
+
+
+
+ Це некоректна країна.
+
+
+
+ Це значення вже використовується.
+
+
+
+ Не вдалося визначити розмір зображення.
+
+
+
+ Ширина зображення занадто велика ({{ width }}px). Максимально допустима ширина {{ max_width }}px.
+
+
+
+ Ширина зображення занадто мала ({{ width }}px). Мінімально допустима ширина {{ min_width }}px.
+
+
+
+ Висота зображення занадто велика ({{ height }}px). Максимально допустима висота {{ max_height }}px.
+
+
+
+ Висота зображення занадто мала ({{ height }}px). Мінімально допустима висота {{ min_height }}px.
+
+
+
+ Значення має бути поточним паролем користувача.
+
+
+
+ Значення повиино бути рівним {{ limit }} символу.|Значення повиино бути рівним {{ limit }} символам.|Значення повиино бути рівним {{ limit }} символам.
+
+
+
+ Файл був завантажений лише частково.
+
+
+
+ Файл не був завантажений.
+
+
+
+ Не налаштована тимчасова директорія в php.ini.
+
+
+
+ Неможливо записати тимчасовий файл на диск.
+
+
+
+ Розширення PHP викликало помилку при завантаженні.
+
+
+
+ Ця колекція повинна містити {{ limit }} елемент чи більше.|Ця колекція повинна містити {{ limit }} елемента чи більше.|Ця колекція повинна містити {{ limit }} елементів чи більше.
+
+
+
+ Ця колекція повинна містити {{ limit }} елемент чи менше.|Ця колекція повинна містити {{ limit }} елемента чи менше.|Ця колекція повинна містити {{ limit }} елементов чи менше.
+
+
+
+ Ця колекція повинна містити рівно {{ limit }} елемент.|Ця колекція повинна містити рівно {{ limit }} елемента.|Ця колекція повинна містити рівно {{ limit }} елементів.
+
+
+
+ Невірний номер карти.
+
+
+
+ Непідтримуваний тип карти або невірний номер карти.
+
+
+
+ Це не дійсний міжнародний номер банківського рахунку (IBAN).
+
+
+
+ Значення не у форматі ISBN-10.
+
+
+
+ Значення не у форматі ISBN-13.
+
+
+
+ Значення не відповідає форматам ISBN-10 та ISBN-13.
+
+
+
+ Значення має невірний формат ISSN.
+
+
+
+ Значення має невірний формат валюти.
+
+
+
+ Значення повинно дорівнювати {{ compared_value }}.
+
+
+
+ Значення має бути більше ніж {{ compared_value }}.
+
+
+
+ Значення має бути більше або дорівнювати {{ compared_value }}.
+
+
+
+ Значення має бути ідентичним {{ compared_value_type }} {{ compared_value }}.
+
+
+
+ Значення повинно бути менше ніж {{ compared_value }}.
+
+
+
+ Значення повинно бути менше або дорівнювати {{ compared_value }}.
+
+
+
+ Значення не повинно дорівнювати {{ compared_value }}.
+
+
+
+ Значення не повинно бути ідентичним {{ compared_value_type }} {{ compared_value }}.
+
+
+
+ Співвідношення сторін зображення занадто велике ({{ ratio }}). Максимальне співвідношення сторін {{ max_ratio }}.
+
+
+
+ Співвідношення сторін зображення занадто мало ({{ ratio }}). Мінімальне співвідношення сторін {{ min_ratio }}.
+
+
+
+ Зображення квадратне ({{ width }}x{{ height }}px). Квадратні зображення не дозволені.
+
+
+
+ Зображення альбомної орієнтації ({{ width }}x{{ height }}px). Зображення альбомної орієнтації не дозволені.
+
+
+
+ Зображення в портретній орієнтації ({{ width }}x{{ height }}px). Зображення в портретної орієнтації не дозволені.
+
+
+
+ Порожні файли не дозволені.
+
+
+
+ Ім'я хоста не знайдено.
+
+
+
+ Значення не збігається з очікуваним {{ charset }} кодуванням.
+
+
+
+ Це не дійсний банківський код (BIC).
+
+
+
+ Помилка
+
+
+
+ Це не валідне значення UUID.
+
+
+
+ Це значення повинне бути кратним {{ compared_value }}.
+
+
+
+ Банківський код (BIC) не пов’язаний із міжнародним номером банківського рахунку (IBAN) {{ iban }}.
+
+
+
+ Значення має бути корректним JSON.
+
+
+
+ Ця колекція повинна мати тільки унікальни значення.
+
+
+
+ Значення має бути позитивним.
+
+
+
+ Значення має бути позитивним або дорівнювати нулю.
+
+
+
+ Значення має бути негативним.
+
+
+
+ Значення має бути негативним або дорівнювати нулю.
+
+
+
+ Значення не є дійсним часовим поясом.
+
+
+
+ Цей пароль був скомпрометований в результаті витоку даних та не повинен використовуватися. Будь ласка, використовуйте інший пароль.
+
+
+
+ Значення має бути між {{ min }} та {{ max }}.
+
+
+
+ Значення не є дійсним іменем хоста.
+
+
+
+ Кількість елементів у цій колекції повинна бути кратною {{ compared_value }}.
+
+
+
+ Значення повинно задовольняти хоча б одному з наступних обмежень:
+
+
+
+ Кожен елемент цієї колекції повинен задовольняти власному набору обмежень.
+
+
+
+ Це значення не є дійсним міжнародним ідентифікаційним номером цінних паперів (ISIN).
+
+
+
+ Це значення має бути дійсним виразом.
+
+
+
+ Це значення не є дійсним CSS кольором.
+
+
+
+ Це значення не є дійсною CIDR нотаціею.
+
+
+
+ Значення в мережевій масці має бути між {{ min }} та {{ max }}.
+
+
+
+ Ця форма не повинна містити додаткових полів.
+
+
+
+ Завантажений файл занадто великий. Будь ласка, спробуйте завантажити файл меншого розміру.
+
+
+
+ CSRF значення недопустиме. Будь ласка, спробуйте відправити форму знову.
+
+
+
+ Це значення не є допустимим кольором HTML5.
+
+
+
+ Будь ласка, введіть дійсну дату народження.
+
+
+
+ Обраний варіант недійсний.
+
+
+
+ Колекція недійсна.
+
+
+
+ Будь ласка, оберіть дійсний колір.
+
+
+
+ Будь ласка, оберіть дійсну країну.
+
+
+
+ Будь ласка, оберіть дійсну валюту.
+
+
+
+ Будь ласка, оберіть дійсний інтервал дати.
+
+
+
+ Будь ласка, введіть дійсну дату та час.
+
+
+
+ Будь ласка, введіть дійсну дату.
+
+
+
+ Будь ласка, оберіть дійсний файл.
+
+
+
+ Приховане поле недійсне.
+
+
+
+ Будь ласка, введіть ціле число.
+
+
+
+ Будь ласка, оберіть дійсну мову.
+
+
+
+ Будь ласка, оберіть дійсну локаль.
+
+
+
+ Будь ласка, введіть дійсну суму грошей.
+
+
+
+ Будь ласка, введіть число.
+
+
+
+ Пароль недійсний.
+
+
+
+ Будь ласка, введіть процентне значення.
+
+
+
+ Значення не збігаються.
+
+
+
+ Будь ласка, введіть дійсний час.
+
+
+
+ Будь ласка, оберіть дійсний часовий пояс.
+
+
+
+ Будь ласка, введіть дійсну URL-адресу.
+
+
+
+ Будь ласка, введіть дійсний пошуковий термін.
+
+
+
+ Будь ласка, введіть дійсний номер телефону.
+
+
+
+ Прапорець має недійсне значення.
+
+
+
+ Будь ласка, введіть дійсну адресу електронної пошти.
+
+
+
+ Будь ласка, оберіть дійсний варіант.
+
+
+
+ Будь ласка, оберіть дійсний діапазон.
+
+
+
+ Будь ласка, введіть дійсний тиждень.
+
+
+
+