From 9d048b67f996c9729722112b3f93e9bec4e1d44b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 12 Mar 2026 16:09:23 +0100 Subject: [PATCH] feat(webapp): ukrainian language translation (#9371) --- scripts/translations/normalize.sh | 2 +- webapp/locales/index.js | 10 +- webapp/locales/uk.json | 1281 +++++++++++++++++++++++++++++ webapp/plugins/i18n.js | 7 +- 4 files changed, 1296 insertions(+), 4 deletions(-) create mode 100644 webapp/locales/uk.json diff --git a/scripts/translations/normalize.sh b/scripts/translations/normalize.sh index b98642d21..d51bbaf4e 100755 --- a/scripts/translations/normalize.sh +++ b/scripts/translations/normalize.sh @@ -3,7 +3,7 @@ ROOT_DIR=$(dirname "$0")/../.. tmp=$(mktemp) -locale_list=("es.json" "fr.json" "it.json" "nl.json" "pl.json" "pt.json" "ru.json") +locale_list=("es.json" "fr.json" "it.json" "nl.json" "pl.json" "pt.json" "ru.json" "uk.json") for locale_file in "${locale_list[@]}" do diff --git a/webapp/locales/index.js b/webapp/locales/index.js index 21f5c2625..55de93f4a 100644 --- a/webapp/locales/index.js +++ b/webapp/locales/index.js @@ -1,4 +1,4 @@ -import { enUS, de, nl, fr, es, it, pt, pl, ru, sq } from 'date-fns/locale' +import { enUS, de, nl, fr, es, it, pt, pl, ru, sq, uk } from 'date-fns/locale' import find from 'lodash/find' const locales = [ @@ -82,6 +82,14 @@ const locales = [ enabled: true, dateFnsLocale: sq, }, + { + name: 'Українська', + code: 'uk', + iso: 'uk-UA', + flag: '🇺🇦', + enabled: true, + dateFnsLocale: uk, + }, ] export default locales diff --git a/webapp/locales/uk.json b/webapp/locales/uk.json new file mode 100644 index 000000000..70e39cdac --- /dev/null +++ b/webapp/locales/uk.json @@ -0,0 +1,1281 @@ +{ + "actions": { + "cancel": "Скасувати", + "clear": "Очистити", + "close": "Закрити", + "create": "Створити", + "delete": "Видалити", + "edit": "Редагувати", + "loading": "завантаження", + "loadMore": "завантажити ще", + "menu": "Відкрити меню", + "save": "Зберегти", + "saveCategories": "Зберегти теми", + "search": "Пошук" + }, + "admin": { + "badges": { + "description": "Налаштувати доступні значки для цього користувача", + "noBadges": "Немає доступних значків", + "revokeTrophy": { + "error": "Не вдалося відкликати трофей!", + "success": "Трофей успішно відкликано!" + }, + "revokeVerification": { + "error": "Не вдалося відкликати верифікацію!", + "success": "Верифікацію успішно відкликано" + }, + "rewardTrophy": { + "error": "Не вдалося нагородити трофеєм!", + "success": "Трофей успішно нагороджено!" + }, + "setVerification": { + "error": "Не вдалося встановити верифікацію!", + "success": "Верифікацію успішно встановлено!" + }, + "title": "Значки", + "trophyBadges": "Трофеї", + "verificationBadges": "Верифікації" + }, + "categories": { + "categoryName": "Назва", + "empty": "Теми не знайдено.", + "name": "Теми", + "postCount": "Дописи" + }, + "dashboard": { + "badgesDisplayed": "Відображені значки", + "badgesRewarded": "Нагороджені значки", + "chatMessages": "Повідомлення чату", + "chatRooms": "Чат-кімнати", + "comments": "Коментарі", + "emails": "Електронні листи", + "follows": "Підписки", + "groups": "Групи", + "inviteCodes": "Коди запрошення", + "inviteCodesExpired": "Прострочені коди запрошення", + "inviteCodesRedeemed": "Використані коди запрошення", + "invites": "Запрошення", + "locations": "Місцезнаходження", + "name": "Панель керування", + "notifications": "Сповіщення", + "posts": "Дописи", + "reports": "Скарги", + "shouts": "Рекомендації", + "tags": "Теги", + "users": "Користувачі", + "usersDeleted": "Видалені користувачі", + "usersVerified": "Верифіковані користувачі" + }, + "donations": { + "goal": "Необхідні щомісячні пожертви", + "name": "Інформація про пожертви", + "progress": "Зібрані пожертви на даний момент", + "showDonationsCheckboxLabel": "Показати панель прогресу пожертв", + "successfulUpdate": "Інформацію про пожертви успішно оновлено!" + }, + "hashtags": { + "name": "Хештеги", + "nameOfHashtag": "Назва", + "number": "№", + "tagCount": "Дописи", + "tagCountUnique": "Користувачі" + }, + "invites": { + "description": "Запрошення — чудовий спосіб мати своїх друзів у вашій мережі …", + "name": "Запросити користувачів", + "title": "Запросити людей" + }, + "name": "Адміністрування", + "notifications": { + "name": "Сповіщення" + }, + "organizations": { + "name": "Організації" + }, + "pages": { + "name": "Сторінки" + }, + "settings": { + "name": "Налаштування" + }, + "users": { + "empty": "Користувачів не знайдено", + "form": { + "placeholder": "електронна пошта, ім'я або опис" + }, + "name": "Користувачі", + "roleChanged": "Роль успішно змінено!", + "table": { + "columns": { + "badges": "Значки", + "comments": "Коментарі", + "contributions": "Внески", + "createdAt": "Створено", + "email": "Електронна пошта", + "name": "Ім'я", + "number": "№", + "role": "Роль", + "shouted": "Рекомендовано", + "slug": "Ідентифікатор" + } + } + } + }, + "chat": { + "addRoomHeadline": "Пошук користувача для нового чату", + "cancelSelectMessage": "Скасувати", + "closeChat": "Закрити чат", + "conversationStarted": "Розмову розпочато:", + "expandChat": "Розгорнути чат", + "isOnline": "в мережі", + "isTyping": "пише...", + "lastSeen": "останній раз ", + "messageDeleted": "Це повідомлення було видалено", + "messagesEmpty": "Немає повідомлень", + "newMessages": "Нові повідомлення", + "page": { + "headline": "Чат" + }, + "roomEmpty": "Кімнату не вибрано", + "roomsEmpty": "Немає кімнат", + "search": "Фільтрувати чат-кімнати", + "transmitting": "Надсилання повідомлення ...", + "typeMessage": "Написати повідомлення", + "userProfileButton": { + "label": "Чат", + "tooltip": "Чат з «{name}»" + } + }, + "client-only": { + "loading": "Завантаження …" + }, + "code-of-conduct": { + "subheader": "для соціальної мережі {ORGANIZATION_NAME}" + }, + "comment": { + "content": { + "unavailable-placeholder": "… цей коментар більше недоступний" + }, + "edited": "відредаговано", + "menu": { + "delete": "Видалити коментар", + "edit": "Редагувати коментар" + }, + "show": { + "less": "показати менше", + "more": "показати більше" + } + }, + "common": { + "category": "Тема ::: Теми", + "comment": "Коментар ::: Коментарі", + "filter": "Фільтр …", + "letsTalk": "Поговорімо", + "loading": "завантаження", + "loadMore": "завантажити ще", + "name": "Назва", + "organization": "Організація ::: Організації", + "post": "Допис ::: Дописи", + "project": "Проєкт ::: Проєкти", + "reportContent": "Поскаржитися", + "shout": "Рекомендація ::: Рекомендації", + "tag": "Тег ::: Теги", + "takeAction": "Діяти", + "user": "Користувач ::: Користувачі", + "validations": { + "categories": "потрібно вибрати щонайменше одну та щонайбільше три теми", + "email": "має бути дійсною електронною адресою", + "eventLocationNameLength": "мінімум {min} або максимум {max} символів", + "eventLocationNameNotEmpty": "лише порожні символи не дозволені", + "eventVenueLength": "мінімум {min} або максимум {max} символів", + "eventVenueNotEmpty": "лише порожні символи не дозволені", + "url": "має бути дійсною URL-адресою" + }, + "versus": "Проти" + }, + "component-slider": { + "step": "Крок {current} з {total}" + }, + "components": { + "dateTimeRange": { + "hourMinute": "HH:mm", + "monthDay": "dd.MM.", + "yearMonthDay": "dd.MM.yyyy" + }, + "password-reset": { + "change-password": { + "error": "Зміна пароля не вдалася. Можливо, код безпеки був неправильним?", + "help": "У разі проблем, зверніться за допомогою, надіславши нам лист на:", + "success": "Пароль успішно змінено!" + }, + "request": { + "form": { + "description": "На вказану електронну адресу буде надіслано лист для скидання пароля.", + "submit": "Надіслати лист", + "submitted": "Лист з подальшими інструкціями надіслано на {email}" + }, + "title": "Скинути пароль" + } + }, + "registration": { + "create-user-account": { + "buttonTitle": "Створити", + "error": "Не вдалося створити обліковий запис!", + "help": " Можливо, підтвердження було недійсним? У разі проблем, зверніться за допомогою, надіславши нам лист на:", + "receiveCommunicationAsEmailsEtcConfirmed": "Я також погоджуюся отримувати електронні листи та інші форми комунікації (наприклад, push-сповіщення).", + "success": "Ваш обліковий запис створено!", + "termsAndCondsEtcConfirmed": "Я прочитав(-ла), зрозумів(-ла) та погоджуюся з наступним:", + "title": "Створити обліковий запис" + }, + "email": { + "buttonTitle": { + "resend": "Надіслати лист повторно", + "send": "Надіслати лист", + "skipResend": "Пропустити повторне надсилання" + }, + "form": { + "sendEmailAgain": "Надіслати лист знову", + "success": "Лист для верифікації надіслано на {email}!" + }, + "title": "Електронна пошта" + }, + "email-display": { + "warningFormat": "⚠️ Електронна адреса має неправильний формат!", + "warningUndef": "⚠️ Електронну адресу не вказано!" + }, + "email-nonce": { + "buttonTitle": "Продовжити", + "form": { + "click-next": "Натисніть «Продовжити».", + "description": "Відкрийте свою електронну скриньку та введіть код, який ми вам надіслали.", + "next": "Продовжити", + "nonce": "Код підтвердження: 32143", + "validations": { + "error": "Недійсний код верифікації {nonce} для електронної адреси {email}!", + "length": "має бути довжиною {nonceLength} символів", + "success": "Дійсний код верифікації {nonce} для електронної адреси {email}!" + } + }, + "title": "Підтвердження електронної пошти" + }, + "invite-code": { + "buttonTitle": "Далі", + "form": { + "description": "Введіть отриманий код запрошення.", + "invite-code": "Код запрошення: ACJERB", + "next": "Продовжити", + "validations": { + "error": "Недійсний код запрошення {inviteCode}!", + "length": "має бути довжиною {inviteCodeLength} символів", + "success": "Дійсний код запрошення {inviteCode}!" + } + }, + "invited-by": "Запрошено користувачем {invitedBy}.", + "invited-by-and-to": "Запрошено користувачем {invitedBy} до групи {invitedTo}.", + "invited-to-hidden-group": "Запрошено користувачем {invitedBy} до прихованої групи." + }, + "no-public-registrstion": { + "title": "Публічна реєстрація недоступна" + }, + "signup": { + "form": { + "data-privacy": "Я прочитав(-ла) та зрозумів(-ла) заяву про конфіденційність.", + "description": "Для початку ви можете зареєструватися тут безкоштовно:", + "errors": { + "email-exists": "Обліковий запис з цією електронною адресою вже існує!" + }, + "submit": "Створити обліковий запис", + "success": "На адресу {email} надіслано лист із посиланням для завершення реєстрації", + "terms-and-condition": "Я підтверджую Умови використання." + }, + "title": "Приєднуйтесь до {APPLICATION_NAME}!", + "unavailable": "На жаль, публічна реєстрація облікових записів на цьому сервері наразі недоступна." + } + } + }, + "contribution": { + "amount-clicks": "{amount} переглядів", + "amount-comments": "{amount} коментарів", + "amount-shouts": "{amount} рекомендацій", + "amount-views": "{amount} переглядів", + "categories": { + "infoSelectedNoOfMaxCategories": "Вибрано {chosen} з {max} тем" + }, + "category": { + "description": { + "body-and-excercise": "Спорт, йога, масаж, релаксація", + "children": "Сім'я, виховання, школа, формування особистості", + "culture": "Мистецтво, театр, музика, фотографія, кіно", + "economy": "Торгівля, споживання, маркетинг, ланцюги постачання", + "energy": "Нафта, газ, вугілля, вітер, гідроенергія, біогаз, атомна енергія", + "finance": "Гроші, фінансова система, альтернативні валюти", + "health": "Медицина, харчування, ВООЗ, вакцинація, шкідливі речовини", + "home": "Будівництво, спільноти, малі будинки, город", + "it-and-media": "Новини, маніпуляції, приватність, контроль, збір даних, ШІ, програмне забезпечення, додатки", + "law": "Права людини, закони, укази", + "miscellaneous": "Різне", + "mobility": "Подорожі, транспорт, електромобільність", + "nature": "Тварини, рослини, сільське господарство, екологія, біорізноманіття", + "networking": "Співпраця, альянси дій, солідарність, допомога", + "peace": "Війна, військо, соціальний захист, зброя, кібератаки", + "politics": "Демократія, участь, вибори, корупція, партії", + "psyche": "Душа, почуття, щастя", + "science": "Освіта, університет, публікації", + "spirituality": "Релігія, цінності, етика" + }, + "name": { + "body-and-excercise": "Тіло і спорт", + "children": "Діти", + "culture": "Культура", + "economy": "Економіка", + "energy": "Енергія", + "finance": "Фінанси", + "health": "Здоров'я", + "home": "Дім", + "it-and-media": "ІТ та медіа", + "law": "Право", + "miscellaneous": "Різне", + "mobility": "Мобільність", + "nature": "Природа", + "networking": "Нетворкінг", + "peace": "Мир", + "politics": "Політика", + "psyche": "Психіка", + "science": "Наука", + "spirituality": "Духовність" + } + }, + "comment": { + "commenting-disabled": { + "blocked-author": { + "button-label": "Перейти до «{name}»", + "call-to-action": "Якщо ви хочете залишити коментар, розблокуйте їх у їхньому профілі.", + "reason": "Ви блокуєте автора цього допису." + }, + "no-group-member": { + "call-to-action": "Якщо ви хочете коментувати, приєднайтеся до групи.", + "reason": "Ви не є учасником групи:" + } + } + }, + "emotions-label": { + "angry": "Злість", + "cry": "Сум", + "funny": "Смішно", + "happy": "Радість", + "surprised": "Здивування" + }, + "filterFollow": "Користувачі, на яких я підписаний(-а)", + "filterMasonryGrid": { + "myFriends": "Користувачі, на яких я підписаний(-а)", + "myGroups": "Від моїх груп", + "myTopics": "Мої теми", + "noFilter": "Фільтрувати контент", + "onlyArticles": "Статті", + "onlyEvents": "Події" + }, + "filterMyGroups": "Мої групи", + "inappropriatePicture": "Це зображення може бути неприйнятним для деяких людей.", + "languageSelectLabel": "Мова вашого допису", + "languageSelectText": "Вибрати мову", + "newEvent": "Створити нову подію", + "newPost": "Створити новий допис", + "success": "Збережено!", + "teaserImage": { + "cropImage": "Обрізати зображення", + "cropperConfirm": "Підтвердити", + "errors": { + "aspect-ratio-too-small": "Це зображення занадто високе.", + "unSupported-file-format": "Будь ласка, завантажте зображення у форматі: JPG, JPEG, PNG або GIF!" + }, + "supportedFormats": "Вставте зображення у форматі JPG, PNG або GIF" + }, + "title": "Заголовок", + "visibleOnlyForMembersOfGroup": "Цей допис буде видно лише учасникам групи «{name}»." + }, + "delete": { + "cancel": "Скасувати", + "comment": { + "message": "Ви дійсно хочете видалити коментар «{name}»?", + "success": "Коментар успішно видалено!", + "title": "Видалити коментар", + "type": "Коментар" + }, + "contribution": { + "message": "Ви дійсно хочете видалити допис «{name}»?", + "success": "Допис успішно видалено!", + "title": "Видалити допис", + "type": "Допис" + }, + "submit": "Видалити" + }, + "disable": { + "cancel": "Скасувати", + "comment": { + "message": "Ви дійсно хочете деактивувати коментар від «{name}»?", + "title": "Деактивувати коментар", + "type": "Коментар" + }, + "contribution": { + "message": "Ви дійсно хочете деактивувати допис «{name}»?", + "title": "Деактивувати допис", + "type": "Допис" + }, + "submit": "Деактивувати", + "success": "Успішно деактивовано!", + "user": { + "message": "Ви дійсно хочете деактивувати користувача «{name}»?", + "title": "Деактивувати користувача", + "type": "Користувач" + } + }, + "donations": { + "amount-of-total": "{amount} з {total} € зібрано", + "donate-now": "Пожертвувати зараз" + }, + "editor": { + "embed": { + "always_allow": "Завжди дозволяти вбудований контент від сторонніх провайдерів (це налаштування можна змінити будь-коли)", + "data_privacy_info": "Ваші дані ще не були передані стороннім провайдерам. Якщо ви продовжите відтворення цього контенту, наступний провайдер, ймовірно, збиратиме дані користувачів:", + "data_privacy_warning": "Попередження про конфіденційність даних!", + "play_now": "Продовжити" + }, + "hashtag": { + "addHashtag": "Новий хештег", + "addLetter": "Введіть літеру", + "noHashtagsFound": "Хештеги не знайдено" + }, + "legend": { + "bold": "Жирний", + "heading3": "Заголовок 3", + "heading4": "Заголовок 4", + "italic": "Курсив", + "legendTitle": "Гарячі клавіші та коди розмітки", + "link": "Посилання", + "orderedList": "Нумерований список", + "paragraph": "Абзац", + "quote": "Цитата", + "ruler": "Лінійка", + "underline": "Підкреслений", + "unorderedList": "Маркований список" + }, + "mention": { + "noUsersFound": "Користувачів не знайдено" + }, + "placeholder": "Залиште свої натхненні думки …" + }, + "error-pages": { + "403-default": "Немає доступу до цієї сторінки!", + "404-default": "Цю сторінку не знайдено!", + "500-default": "Внутрішня помилка сервера!", + "503-default": "Сервіс недоступний!", + "back-to-index": "Повернутися на головну!", + "cannot-edit-post": "Цей допис не можна редагувати!", + "default": "Сталася помилка!", + "group-not-found": "Цю групу не знайдено!", + "post-not-found": "Цей допис не знайдено!", + "profile-not-found": "Цей профіль не знайдено!" + }, + "filter-menu": { + "all": "Все", + "article": "Стаття", + "categories": "Теми", + "creationDate": "Дата створення", + "deleteFilter": "Видалити фільтр", + "emotions": "Емоції", + "ended": { + "all": { + "hint": "Показати все, включаючи завершені", + "label": "Все" + }, + "onlyEnded": { + "hint": "Показати лише незавершені", + "label": "Незавершені" + } + }, + "event": "Подія", + "eventsBy": "Події — показати ...", + "eventsEnded": "Завершені", + "filter-by": "Фільтрувати за ...", + "following": "Користувачі, на яких я підписаний(-а)", + "following-title": "Джерела", + "languages": "Мови", + "my-groups": "Мої групи", + "order": { + "last": { + "hint": "Сортувати дописи за останніми", + "label": "Останні" + }, + "newest": { + "hint": "Сортувати дописи за найновішими", + "label": "Найновіші" + }, + "next": { + "hint": "Сортувати дописи за наступними", + "label": "Наступні" + }, + "oldest": { + "hint": "Сортувати дописи за найстарішими", + "label": "Найстаріші" + } + }, + "order-by": "Сортувати за ...", + "post-type": "Тип контенту", + "save": { + "error": "Не вдалося зберегти налаштування тем!", + "success": "Теми збережено!" + }, + "startDate": "Дата початку" + }, + "followButton": { + "follow": "Підписатися", + "following": "Підписано" + }, + "group": { + "actionRadii": { + "continental": "Континентальний", + "global": "Глобальний або лише віртуальний", + "interplanetary": "Міжпланетний", + "national": "Національний", + "regional": "Регіональний" + }, + "actionRadius": "Радіус дії групи", + "addMemberToGroup": "Додати до групи", + "addMemberToGroupSuccess": "«{name}» додано до групи з роллю «{role}»!", + "addUser": "Додати користувача", + "addUserNoOptions": "Користувачів не знайдено!", + "addUserPlaceholder": "Ім'я користувача", + "allGroups": "Усі групи", + "categories": "Тема ::: Теми", + "categoriesTitle": "Теми групи", + "changeMemberRole": "Роль змінено на «{role}»!", + "contentMenu": { + "inviteLinks": "Посилання для запрошення", + "menuButton": "Меню групи", + "muteGroup": "Вимкнути сповіщення групи", + "unmuteGroup": "Увімкнути сповіщення групи", + "visitGroupPage": "Показати групу" + }, + "createNewGroup": { + "title": "Створити нову групу", + "tooltip": "Створити нову групу" + }, + "description": "Опис", + "editGroupSettings": { + "groupTitle": "Налаштування ", + "title": "Редагувати мою групу" + }, + "errors": { + "userAlreadyMember": "Користувач «{name}» вже є учасником!" + }, + "follow": "Підписатися", + "foundation": "Заснування", + "general": "Загальне", + "goal": "Мета групи", + "groupCreated": "Групу створено!", + "in": "в", + "invite-links": "Посилання для запрошення", + "joinLeaveButton": { + "iAmMember": "Я учасник", + "join": "Приєднатися", + "leave": "Вийти", + "pendingMember": "Очікування підтвердження", + "tooltip": "Власник групи ще не підтвердив вашу участь." + }, + "labelSlug": "Унікальна назва групи", + "leaveModal": { + "confirmButton": "Вийти", + "message": "Вихід з групи може бути незворотним!
Вийти з групи «{name}»!", + "title": "Ви дійсно хочете вийти з групи?" + }, + "memberRemoved": "Користувача «{name}» видалено з групи!", + "members": "Учасники", + "membersAdministrationList": { + "avatar": "Аватар", + "name": "Ім'я", + "roleInGroup": "Роль", + "slug": "Унікальне ім'я" + }, + "membersCount": "Учасник ::: Учасники", + "membersListTitle": "Учасники групи", + "membersListTitleNotAllowedSeeingGroupMembers": "Учасники групи приховані", + "modal": { + "cancel": "Скасувати", + "confirm": "Підтвердити", + "confirmAddGroupMemberText": "Додати користувача «{name}» до групи?", + "confirmAddGroupMemberTitle": "Підтвердити" + }, + "muted": "Сповіщення групи вимкнено", + "myGroups": "Мої групи", + "name": "Назва групи", + "radius": "Радіус", + "removeMember": "Видалити учасника", + "removeMemberButton": "Видалити", + "role": "Ваша роль у групі", + "roles": { + "admin": "Адміністратор", + "owner": "Власник", + "pending": "Очікуючий учасник", + "usual": "Учасник" + }, + "save": "Створити нову групу", + "type": "Видимість групи", + "types": { + "closed": "Закрита", + "hidden": "Таємна", + "public": "Публічна" + }, + "typesOptions": { + "closed": "Закрита — Усі дописи видно лише учасникам групи", + "hidden": "Таємна — Група (включаючи назву) повністю невидима", + "public": "Публічна — Група та всі дописи видно всім зареєстрованим користувачам" + }, + "unmute": "Увімкнути сповіщення групи", + "unmuted": "Сповіщення групи увімкнено", + "update": "Зберегти зміни", + "updatedGroup": "Дані групи змінено." + }, + "hashtags-filter": { + "clearSearch": "Очистити пошук", + "hashtag-search": "Пошук за #{hashtag}", + "title": "Ваш фільтр" + }, + "header": { + "avatarMenu": { + "button": { + "tooltip": "Мій профіль" + }, + "chats": "Чати", + "groups": "Групи", + "map": "Карта", + "myProfile": "Мій профіль", + "notifications": "Сповіщення" + }, + "chats": { + "tooltip": "Чати" + }, + "groups": { + "tooltip": "Групи" + }, + "map": { + "tooltip": "Карта" + }, + "more": "Більше", + "notifications": { + "tooltip": "Сповіщення" + } + }, + "index": { + "change-filter-settings": "Змініть налаштування фільтрів, щоб отримати більше результатів.", + "no-results": "Дописів не знайдено." + }, + "invite-codes": { + "button": { + "tooltip": "Запросити друзів" + }, + "comment-placeholder": "Коментар (необов'язково)", + "copy-code": "Скопіювати посилання для запрошення", + "copy-success": "Код запрошення скопійовано до буферу обміну", + "create-error": "Не вдалося створити нове посилання для запрошення! Помилка: {error}", + "create-success": "Посилання для запрошення успішно створено!", + "delete-modal": { + "message": "Ви дійсно хочете анулювати це посилання для запрошення?", + "title": "Анулювати посилання?" + }, + "generate-code": "Створити нове посилання", + "generate-code-explanation": "Створіть нове посилання. За бажанням додайте коментар (видно лише вам).", + "group-invite-links": "Посилання для запрошення в групу", + "invalidate": "Анулювати посилання", + "invalidate-error": "Не вдалося анулювати посилання для запрошення! Помилка: {error}", + "invalidate-success": "Посилання для запрошення успішно анульовано!", + "invite-link-message-group": "Вас запрошено приєднатися до групи «{groupName}» у мережі {network}.", + "invite-link-message-hidden-group": "Вас запрошено приєднатися до прихованої групи у мережі {network}.", + "invite-link-message-personal": "Вас запрошено приєднатися до {network}.", + "limit-reached": "Ви досягли максимальної кількості посилань для запрошення.", + "my-invite-links": "Мої посилання для запрошення", + "no-links": "Посилання для запрошення ще не створено.", + "redeemed-count": "Цей код було використано {count} разів.", + "redeemed-count-0": "Ніхто ще не використав цей код." + }, + "layout": { + "toggle": { + "label": "Макет", + "multiColumn": "Кілька колонок", + "singleColumn": "Одна колонка" + } + }, + "localeSwitch": { + "tooltip": "Вибрати мову" + }, + "location": { + "distance": "{distance} км від мене" + }, + "login": { + "email": "Ваша електронна пошта", + "failure": "Невірна електронна адреса або пароль.", + "forgotPassword": "Забули пароль?", + "hello": "Привіт", + "loggingOut": "Вихід із системи…", + "login": "Увійти", + "logout": "Вийти", + "moreInfo": "Що таке {APPLICATION_NAME}?", + "moreInfoHint": "до сторінки презентації", + "no-account": "Немає облікового запису?", + "no-cookie": "Неможливо встановити cookie. Ви повинні прийняти файли cookie.", + "password": "Ваш пароль", + "register": "Зареєструватися", + "success": "Ви увійшли в систему!" + }, + "maintenance": { + "explanation": "Наразі ми проводимо планове технічне обслуговування, спробуйте пізніше.", + "questions": "Якщо у вас є питання або зауваження, надішліть електронний лист на", + "title": "{APPLICATION_NAME} на технічному обслуговуванні" + }, + "map": { + "alertMessage": "Карта недоступна: токен Mapbox не налаштовано на сервері!", + "legend": { + "event": "Подія", + "group": "Група", + "theUser": "Моя позиція", + "user": "Користувач" + }, + "markerTypes": { + "event": "подія", + "group": "група", + "theUser": "моя позиція", + "user": "користувач" + }, + "pageTitle": "Карта", + "styles": { + "dark": "Темна", + "outdoors": "На відкритому повітрі", + "satellite": "Супутник", + "streets": "Вулиці" + } + }, + "modals": { + "deleteUser": { + "created": "Створено" + } + }, + "moderation": { + "name": "Модерація", + "reports": { + "author": "Автор", + "content": "Контент", + "decideButton": "Підтвердити", + "decided": "Вирішено", + "decideModal": { + "cancel": "Скасувати", + "Comment": { + "disable": { + "message": "Ви дійсно хочете залишити коментар «{name}» деактивованим?", + "title": "Остаточно деактивувати коментар" + }, + "enable": { + "message": "Ви дійсно хочете залишити коментар «{name}» активним?", + "title": "Остаточно активувати коментар" + } + }, + "Post": { + "disable": { + "message": "Ви дійсно хочете залишити допис «{name}» деактивованим?", + "title": "Остаточно деактивувати допис" + }, + "enable": { + "message": "Ви дійсно хочете залишити допис «{name}» активним?", + "title": "Остаточно активувати допис" + } + }, + "submit": "Підтвердити рішення", + "User": { + "disable": { + "message": "Ви дійсно хочете залишити користувача «{name}» деактивованим?", + "title": "Остаточно деактивувати користувача" + }, + "enable": { + "message": "Ви дійсно хочете залишити користувача «{name}» активним?", + "title": "Остаточно активувати користувача" + } + } + }, + "decision": "Рішення", + "DecisionSuccess": "Рішення успішно прийнято!", + "disabled": "Деактивовано", + "disabledAt": "Деактивовано", + "disabledBy": "Деактивовано", + "empty": "Вітаємо, нічого не потребує модерації.", + "enabled": "Активовано", + "enabledAt": "Активовано", + "enabledBy": "Активовано", + "filterLabel": { + "all": "Всі", + "closed": "Закриті", + "reviewed": "Переглянуті", + "unreviewed": "Непереглянуті" + }, + "moreDetails": "Детальніше", + "name": "Скарги", + "noDecision": "Рішення немає!", + "numberOfUsers": "{count} користувачів", + "previousDecision": "Попереднє рішення:", + "reasonCategory": "Тема", + "reasonDescription": "Опис", + "reportedOn": "Дата", + "status": "Поточний статус", + "submitter": "Повідомив(-ла)" + } + }, + "notifications": { + "comment": "Коментар", + "content": "Контент або опис", + "empty": "На жаль, наразі у вас немає сповіщень.", + "filterLabel": { + "all": "Всі", + "read": "Прочитані", + "unread": "Непрочитані" + }, + "group": "Опис", + "markAllAsRead": "Позначити все як прочитане", + "pageLink": "Усі сповіщення", + "post": "Допис або група", + "reason": { + "changed_group_member_role": "Змінено вашу роль у групі", + "commented_on_post": "Прокоментував(-ла) допис, за яким ви спостерігаєте", + "followed_user_posted": "Написав(-ла) новий допис", + "mentioned_in_comment": "Згадав(-ла) вас у коментарі", + "mentioned_in_post": "Згадав(-ла) вас у дописі", + "on_date": "", + "post_in_group": "Написав(-ла) допис у групі", + "removed_user_from_group": "Видалив(-ла) вас з групи", + "user_joined_group": "Приєднався(-лася) до вашої групи", + "user_left_group": "Покинув(-ла) вашу групу" + }, + "title": "Сповіщення", + "user": "Користувач" + }, + "observeButton": { + "observed": "спостерігається" + }, + "pagination": { + "next": "Далі", + "previous": "Назад" + }, + "post": { + "comment": { + "joinGroup": "Приєднався(-лася) до групи «{name}»", + "reply": "Відповісти", + "submit": "Коментувати", + "submitted": "Коментар надіслано!", + "updated": "Зміни збережено!" + }, + "createNewArticle": { + "title": "Створити статтю" + }, + "createNewEvent": { + "title": "Створити подію" + }, + "edited": "відредаговано", + "editPost": { + "event": "Редагувати подію", + "forGroup": { + "title": "Для групи " + }, + "title": "Редагувати допис" + }, + "event": "Подія", + "menu": { + "delete": "Видалити допис", + "edit": "Редагувати допис", + "groupPin": "Закріпити допис (Група)", + "groupPinnedSuccessfully": "Допис успішно закріплено!", + "groupUnpin": "Відкріпити допис (Група)", + "groupUnpinnedSuccessfully": "Допис успішно відкріплено!", + "observe": "Спостерігати за дописом", + "observedSuccessfully": "Ви тепер спостерігаєте за цим дописом!", + "pin": "Закріпити допис", + "pinnedSuccessfully": "Допис успішно закріплено!", + "push": "Підняти вгору", + "pushed": "Піднято вгору", + "pushedSuccessfully": "Допис успішно піднято вгору!", + "unobserve": "Припинити спостереження", + "unobservedSuccessfully": "Ви більше не спостерігаєте за цим дописом!", + "unpin": "Відкріпити допис", + "unpinnedSuccessfully": "Допис успішно відкріплено!", + "unpush": "Скасувати підняття", + "unpushedSuccessfully": "Підняття допису скасовано!" + }, + "name": "Стаття", + "pinned": "Оголошення", + "sensitiveContent": { + "hide": "Приховати чутливий вміст", + "show": "Показати чутливий вміст" + }, + "takeAction": { + "name": "Діяти" + }, + "viewEvent": { + "eventEnd": "Кінець", + "eventIsOnline": "Онлайн", + "eventLocationName": "Адреса для навігації — напр. Вулиця Прикладна 1, 01001 Київ", + "eventStart": "Початок", + "eventVenue": "Опис місця — напр. подвір'я, 1-й поверх, …", + "title": "Подія" + }, + "viewPost": { + "forGroup": { + "title": "У групі " + }, + "title": "Допис" + } + }, + "profile": { + "avatar": { + "submitted": "Завантаження успішне!" + }, + "commented": "Прокоментовано", + "follow": "Підписатися", + "followers": "Підписники", + "following": "Підписки", + "invites": { + "description": "Введіть їхню електронну адресу для запрошення.", + "emailPlaceholder": "Електронна пошта для запрошення", + "title": "Запросити когось до {APPLICATION_NAME}!" + }, + "memberSince": "Учасник з", + "network": { + "andMore": "та ще {number} …", + "followedBy": "підписані:", + "followedByNobody": "ніхто не підписаний.", + "following": "підписаний(-а) на:", + "followingNobody": "ні на кого не підписаний(-а).", + "title": "Мережа" + }, + "shouted": "Рекомендовано", + "socialMedia": "Де ще можна знайти", + "userAnonym": "Анонімний" + }, + "quotes": { + "african": { + "author": "Африканське прислів'я", + "quote": "Багато маленьких людей у багатьох маленьких місцях роблять багато маленьких справ, які можуть змінити обличчя світу." + } + }, + "release": { + "cancel": "Скасувати", + "comment": { + "error": "Ви вже повідомляли про цей коментар!", + "message": "Ви дійсно хочете відновити коментар від «{name}»?", + "title": "Відновити коментар", + "type": "Коментар" + }, + "contribution": { + "error": "Ви вже повідомляли про цей допис!", + "message": "Ви дійсно хочете відновити допис «{name}»?", + "title": "Відновити допис", + "type": "Допис" + }, + "submit": "Відновити", + "success": "Успішно відновлено!", + "user": { + "error": "Ви вже повідомляли про цього користувача!", + "message": "Ви дійсно хочете відновити користувача «{name}»?", + "title": "Відновити користувача", + "type": "Користувач" + } + }, + "report": { + "cancel": "Скасувати", + "comment": { + "error": "Ви вже скаржилися на цей коментар!", + "message": "Ви дійсно хочете поскаржитися на коментар від «{name}»?", + "title": "Поскаржитися на коментар", + "type": "Коментар" + }, + "contribution": { + "error": "Ви вже скаржилися на цей допис!", + "message": "Ви дійсно хочете поскаржитися на допис «{name}»?", + "title": "Поскаржитися на допис", + "type": "Допис" + }, + "reason": { + "category": { + "invalid": "Будь ласка, виберіть дійсну тему", + "label": "Виберіть тему:", + "options": { + "advert_products_services_commercial": "Реклама товарів та послуг з комерційним наміром.", + "criminal_behavior_violation_german_law": "Злочинна поведінка або порушення закону.", + "discrimination_etc": "Дискримінаційні дописи, коментарі, висловлювання або образи.", + "doxing": "Розкриття особистої інформації інших людей без їхньої згоди або погроза цим («доксінг»).", + "glorific_trivia_of_cruel_inhuman_acts": "Прославлення або тривіалізація жорстоких чи нелюдських актів насильства.", + "intentional_intimidation_stalking_persecution": "Навмисне залякування, переслідування або цькування.", + "other": "Інше …", + "pornographic_content_links": "Публікація або посилання на явно порнографічний матеріал." + }, + "placeholder": "Тема …" + }, + "description": { + "label": "Будь ласка, поясніть: чому ви хочете поскаржитися?", + "placeholder": "Додаткова інформація …" + } + }, + "submit": "Поскаржитися", + "success": "Дякуємо за скаргу!", + "user": { + "error": "Ви вже скаржилися на цього користувача!", + "message": "Ви дійсно хочете поскаржитися на користувача «{name}»?", + "title": "Поскаржитися на користувача", + "type": "Користувач" + } + }, + "search": { + "failed": "Нічого не знайдено", + "for": "Пошук за ", + "heading": { + "Group": "Група ::: Групи", + "Post": "Допис ::: Дописи", + "Tag": "Хештег ::: Хештеги", + "User": "Користувач ::: Користувачі" + }, + "hint": "!... шукає дописи, @... шукає користувачів, &... шукає групи, #… шукає хештеги", + "no-results": "Результатів для «{search}» не знайдено. Спробуйте інший пошуковий запит!", + "page": "Сторінка", + "placeholder": "Пошук", + "results": "результат знайдено ::: результатів знайдено", + "title": "Результати пошуку" + }, + "settings": { + "badges": { + "click-to-select": "Натисніть на порожнє місце, щоб додати значок.", + "click-to-use": "Натисніть на значок, щоб використати його у вибраному місці.", + "description": "Тут ви можете вибрати, як відображати ваші зароблені значки у профілі.", + "drag-instruction": "Перетягніть значки для зміни порядку.", + "drop-to-remove": "Перетягніть сюди, щоб видалити значок.", + "error-update": "Сталася помилка при оновленні ваших значків.", + "name": "Значки", + "no-badges-available": "Наразі у вас немає доступних значків для додавання.", + "remove": "Видалити значок", + "reserve-title": "Доступні значки", + "success-update": "Ваші значки успішно оновлено.", + "swap-partial-error": "Заміну значка не вдалося завершити. Спробуйте ще раз.", + "verification": "Це ваш значок верифікації, його не можна змінити." + }, + "blocked-users": { + "block": "Заблокувати користувача", + "columns": { + "name": "Ім'я", + "slug": "Ідентифікатор", + "unblock": "Розблокувати" + }, + "empty": "Наразі ви нікого не заблокували.", + "explanation": { + "closing": "Цього має бути достатньо, щоб заблоковані користувачі більше не могли вам заважати.", + "commenting-disabled": "Ви не можете залишити коментар до цього допису наразі.", + "intro": "Якщо ви заблокували іншого користувача, станеться наступне:", + "notifications": "Заблоковані користувачі більше не отримуватимуть сповіщення при згадуванні один одного.", + "their-perspective": "Навпаки: заблокована особа також більше не зможе взаємодіяти з вашими внесками.", + "your-perspective": "Ви більше не зможете взаємодіяти з їхніми внесками." + }, + "how-to": "Ви можете заблокувати інших користувачів на їхній сторінці профілю через контекстне меню.", + "name": "Заблоковані користувачі", + "unblock": "Розблокувати користувача", + "unblocked": "{name} знову розблоковано" + }, + "data": { + "givenName": "Ваше ім'я", + "givenNamePlaceholder": "Іван", + "labelBio": "Про вас", + "labelCity": "Ваше місто або регіон", + "labelCityHint": "(показує приблизну позицію на карті)", + "labelName": "Ваше ім'я", + "labelSlug": "Ваш унікальний нік", + "name": "Ваші дані", + "namePlaceholder": "Іван Іваненко", + "realNamePlease": "Будь ласка, введіть ваше справжнє ім'я", + "success": "Ваші дані успішно оновлено!", + "surName": "Ваше прізвище", + "surNamePlaceholder": "Іваненко" + }, + "deleteUserAccount": { + "accountDescription": "Зверніть увагу, що ваші дописи та коментарі важливі для нашої спільноти. Якщо ви все ж вирішите їх видалити, позначте їх нижче.", + "accountWarning": "Ви НЕ ЗМОЖЕТЕ КЕРУВАТИ та НЕ ЗМОЖЕТЕ ВІДНОВИТИ ваш обліковий запис, дописи чи коментарі після видалення!", + "accountWarningAdmin": "Обліковий запис, дописи чи коментарі НЕ МОЖУТЬ БУТИ АДМІНІСТРОВАНІ АБО ВІДНОВЛЕНІ після видалення!", + "accountWarningIsAdmin": "Увага! Ви збираєтеся видалити обліковий запис користувача!", + "commentedCount": "Видалити мій {count} коментар ::: Видалити мої {count} коментарі", + "confirmDeleting": "Видалити обліковий запис зараз", + "contributionsCount": "Видалити мій {count} допис ::: Видалити мої {count} дописи", + "infoAdmin": "Усі дописи та коментарі користувача також будуть видалені!", + "name": "Видалити обліковий запис", + "pleaseConfirm": "Незворотна дія! Введіть «{confirm}» для підтвердження.", + "success": "Обліковий запис успішно видалено!" + }, + "download": { + "description": "Натисніть кнопку вище, щоб завантажити вміст ваших дописів та коментарів. Для завантаження зображень ваших дописів натисніть відповідне посилання нижче.", + "json": "як JSON", + "name": "Завантажити дані" + }, + "email": { + "change-successful": "Вашу електронну адресу успішно змінено.", + "labelEmail": "Змінити електронну адресу", + "labelNewEmail": "Нова електронна адреса", + "labelNonce": "Введіть ваш код", + "name": "Ваша електронна пошта", + "submitted": "На адресу {email} надіслано лист для верифікації.", + "success": "Нову електронну адресу зареєстровано.", + "validation": { + "same-email": "Це ваша поточна електронна адреса" + }, + "verification-error": { + "explanation": "Це може мати різні причини:", + "message": "Не вдалося змінити електронну адресу.", + "reason": { + "invalid-nonce": "Код підтвердження недійсний?", + "no-email-request": "Ви впевнені, що надсилали запит на зміну електронної адреси?" + }, + "support": "Якщо проблема не зникає, зверніться до нас на електронну адресу" + } + }, + "embeds": { + "info-description": "Ось список сторонніх провайдерів, чий вміст може відображатися як сторонній код, наприклад, у вигляді вбудованих відео.", + "name": "Сторонні провайдери", + "status": { + "change": { + "allow": "Так, звичайно", + "deny": "Ні, дякую", + "question": "Чи повинен вбудований код від сторонніх провайдерів завжди відображатися для вас?" + }, + "description": "За замовчуванням для вас вбудований код від сторонніх провайдерів", + "disabled": { + "off": "спочатку не відображається", + "on": "відображається одразу" + } + } + }, + "invites": { + "name": "Запрошення" + }, + "languages": { + "name": "Мови" + }, + "muted-users": { + "columns": { + "name": "Ім'я", + "slug": "Ідентифікатор", + "unmute": "Увімкнути" + }, + "empty": "Наразі ви нікого не вимкнули.", + "explanation": { + "intro": "Якщо ви вимкнули іншого користувача, станеться наступне:", + "search": "Дописи вимкнених людей зникнуть з ваших результатів пошуку.", + "your-perspective": "Дописи вимкненої особи більше не з'являтимуться у вашій стрічці новин." + }, + "how-to": "Ви можете вимкнути інших користувачів на їхній сторінці профілю через контекстне меню.", + "mute": "Вимкнути користувача", + "name": "Вимкнені користувачі", + "unmute": "Увімкнути користувача", + "unmuted": "{name} знову увімкнено" + }, + "name": "Налаштування", + "notifications": { + "chat": "Чат", + "chatMessage": "Отримано повідомлення під час відсутності.", + "checkAll": "Вибрати все", + "commentOnObservedPost": "Коментарі до спостережуваних дописів.", + "followingUsers": "Користувач, на якого я підписаний(-а), опублікував новий допис.", + "group": "Групи", + "groupMemberJoined": "Учасник приєднався до групи, якою я керую.", + "groupMemberLeft": "Учасник покинув групу, якою я керую.", + "groupMemberRemoved": "Мене видалили з групи.", + "groupMemberRoleChanged": "Вашу роль у групі змінено або вас запрошено.", + "mention": "Мене згадали.", + "name": "Сповіщення електронною поштою", + "post": "Дописи та коментарі", + "postByFollowedUser": "Дописи від користувачів, на яких я підписаний(-а).", + "postInGroup": "Допис у групі, учасником якої я є.", + "send-email-notifications": "Надсилати сповіщення електронною поштою", + "success-update": "Налаштування сповіщень збережено!", + "uncheckAll": "Зняти все" + }, + "organizations": { + "name": "Мої організації" + }, + "privacy": { + "make-shouts-public": "Показувати статті, які я рекомендував(-ла), у моєму публічному профілі", + "name": "Конфіденційність", + "success-update": "Налаштування конфіденційності збережено!" + }, + "security": { + "change-password": { + "button": "Змінити пароль", + "label-new-password": "Ваш новий пароль", + "label-new-password-confirm": "Підтвердити новий пароль", + "label-old-password": "Ваш старий пароль", + "message-new-password-confirm-required": "Підтвердіть ваш новий пароль", + "message-new-password-missmatch": "Введіть той самий пароль ще раз", + "message-new-password-required": "Введіть новий пароль", + "message-old-password-required": "Введіть ваш старий пароль", + "passwordSecurity": "Безпека пароля", + "passwordStrength0": "Дуже ненадійний пароль", + "passwordStrength1": "Ненадійний пароль", + "passwordStrength2": "Посередній пароль", + "passwordStrength3": "Надійний пароль", + "passwordStrength4": "Дуже надійний пароль", + "success": "Пароль успішно змінено!" + }, + "name": "Безпека" + }, + "social-media": { + "add-new-link": "Додати нове посилання", + "delete-modal": { + "confirm-button": "Видалити", + "message": "Видалити «{name}».", + "title": "Ви дійсно хочете видалити ваше посилання?" + }, + "edit-link": "Редагувати посилання", + "name": "Соціальні мережі", + "placeholder": "Ваша URL-адреса соціальної мережі", + "requireUnique": "Ви вже додали цю URL-адресу", + "submit": "Додати посилання", + "successAdd": "Соціальну мережу додано. Профіль оновлено!", + "successDelete": "Соціальну мережу видалено. Профіль оновлено!" + }, + "validation": { + "slug": { + "alreadyTaken": "Це ім'я користувача вже зайнято.", + "regex": "Дозволені лише малі літери, цифри, підкреслення та дефіси." + } + } + }, + "shoutButton": { + "shouted": "рекомендовано" + }, + "site": { + "back-to-login": "Повернутися на сторінку входу", + "bank": "банківський рахунок", + "code-of-conduct": "Кодекс поведінки", + "contact": "Контакти", + "data-privacy": "Конфіденційність даних", + "donate": "Пожертвувати", + "error-occurred": "Сталася помилка.", + "faq": "Часті питання", + "germany": "Німеччина", + "imprint": "Імпресум", + "made": "Зроблено з ❤️", + "navigation": "Навігація", + "register": "Реєстраційний номер", + "support": "Підтримка", + "termsAndConditions": "Умови використання", + "thanks": "Дякуємо!" + }, + "termsAndConditions": { + "newTermsAndConditions": "Нові умови використання", + "termsAndConditionsNewConfirm": "Я прочитав(-ла) та погоджуюся з новими умовами використання.", + "termsAndConditionsNewConfirmText": "Будь ласка, ознайомтеся з новими умовами використання зараз!" + }, + "user-teaser": { + "popover": { + "open-profile": "Відкрити профіль" + } + } +} diff --git a/webapp/plugins/i18n.js b/webapp/plugins/i18n.js index 63e051b8e..49d5f9c54 100644 --- a/webapp/plugins/i18n.js +++ b/webapp/plugins/i18n.js @@ -4,9 +4,11 @@ import { isEmpty, find } from 'lodash' import locales from '~/locales' import htmlTranslations from '~/locales/html/' +let fallbackLocale + const registerTranslation = ({ Vue, locale }) => { const translation = require(`~/locales/${locale}.json`) - translation.html = htmlTranslations[locale] + translation.html = htmlTranslations[locale] || htmlTranslations[fallbackLocale] Vue.i18n.add(locale, translation) } @@ -15,6 +17,7 @@ const registerTranslation = ({ Vue, locale }) => { * and implement the user preference logic */ export default ({ app, req, cookie, store }) => { + fallbackLocale = app.$env.LANGUAGE_FALLBACK const debug = app.$env && app.$env.NODE_ENV !== 'production' const key = 'locale' @@ -45,7 +48,7 @@ export default ({ app, req, cookie, store }) => { if (!app.$i18n.localeExists(localeInStore)) { import(`~/locales/${localeInStore}.json`).then((res) => { const translation = res.default - translation.html = htmlTranslations[localeInStore] + translation.html = htmlTranslations[localeInStore] || htmlTranslations[fallbackLocale] app.$i18n.add(localeInStore, translation) }) }