|
|
@@ -0,0 +1,202 @@
|
|
|
+import json
|
|
|
+import os
|
|
|
+
|
|
|
+def fill_gaps():
|
|
|
+ path = os.path.join("src", "locales", "translations.json")
|
|
|
+ with open(path, "r", encoding="utf-8") as f:
|
|
|
+ data = json.load(f)
|
|
|
+
|
|
|
+ def set_translations(key_path, ru, ua):
|
|
|
+ parts = key_path.split('.')
|
|
|
+ curr = data
|
|
|
+ for p in parts[:-1]:
|
|
|
+ curr = curr.get(p, {})
|
|
|
+ if parts[-1] in curr:
|
|
|
+ curr[parts[-1]]["ru"] = ru
|
|
|
+ curr[parts[-1]]["ua"] = ua
|
|
|
+
|
|
|
+ # Admin Actions
|
|
|
+ set_translations("admin.actions.cancel", "Отмена", "Скасувати")
|
|
|
+ set_translations("admin.actions.create", "Создать", "Створити")
|
|
|
+ set_translations("admin.actions.delete", "Удалить", "Видалити")
|
|
|
+ set_translations("admin.actions.deleteFile", "Удалить файл", "Видалити файл")
|
|
|
+ set_translations("admin.actions.edit", "Редактировать", "Редагувати")
|
|
|
+ set_translations("admin.actions.printInvoice", "Печать счета", "Друк рахунку")
|
|
|
+ set_translations("admin.actions.save", "Сохранить", "Зберегти")
|
|
|
+ set_translations("admin.actions.savePrice", "Сохранить цену", "Зберегти ціну")
|
|
|
+ set_translations("admin.actions.sending", "Отправка...", "Надсилання...")
|
|
|
+ set_translations("admin.actions.toggleAdminRole", "Переключить роль админа", "Перемкнути роль адміна")
|
|
|
+ set_translations("admin.actions.viewOriginal", "Оригинал", "Оригінал")
|
|
|
+ set_translations("admin.addNew", "Добавить", "Додати")
|
|
|
+ set_translations("admin.allStatuses", "Все статусы", "Усі статуси")
|
|
|
+ set_translations("admin.dashboard", "Дэшборд", "Дешборд")
|
|
|
+
|
|
|
+ # Admin Fields
|
|
|
+ set_translations("admin.fields.active", "Активен", "Активний")
|
|
|
+ set_translations("admin.fields.category", "Категория", "Категорія")
|
|
|
+ set_translations("admin.fields.colors", "Цвета", "Кольори")
|
|
|
+ set_translations("admin.fields.content", "Контент", "Контент")
|
|
|
+ set_translations("admin.fields.customColorInfo", "Введите HEX или название", "Введіть HEX або назву")
|
|
|
+ set_translations("admin.fields.defaultColor", "Цвет по умолчанию", "Колір за замовчуванням")
|
|
|
+ set_translations("admin.fields.description", "Описание", "Опис")
|
|
|
+ set_translations("admin.fields.email", "Email", "Email")
|
|
|
+ set_translations("admin.fields.estimated", "Оценка", "Оцінка")
|
|
|
+ set_translations("admin.fields.excerpt", "Краткое описание", "Короткий опис")
|
|
|
+ set_translations("admin.fields.externalLink", "Внешняя ссылка", "Зовнішнє посилання")
|
|
|
+ set_translations("admin.fields.finalPrice", "Финальная цена", "Фінальна ціна")
|
|
|
+ set_translations("admin.fields.firstName", "Имя", "Ім'я")
|
|
|
+ set_translations("admin.fields.imageUrl", "URL изображения", "URL зображення")
|
|
|
+ set_translations("admin.fields.lastName", "Фамилия", "Прізвище")
|
|
|
+ set_translations("admin.fields.name", "Название", "Назва")
|
|
|
+ set_translations("admin.fields.noPhotos", "Нет фото", "Немає фото")
|
|
|
+ set_translations("admin.fields.noPortfolio", "Портфолио пусто", "Портфоліо порожнє")
|
|
|
+ set_translations("admin.fields.noUsers", "Пользователи не найдены", "Користувачів не знайдено")
|
|
|
+ set_translations("admin.fields.notifyUser", "Уведомить клиента", "Повідомити клієнта")
|
|
|
+ set_translations("admin.fields.originalSnapshot", "Снимок заказа", "Знімок замовлення")
|
|
|
+ set_translations("admin.fields.password", "Пароль", "Пароль")
|
|
|
+ set_translations("admin.fields.phone", "Телефон", "Телефон")
|
|
|
+ set_translations("admin.fields.photoReport", "Фотоотчет", "Фотозвіт")
|
|
|
+ set_translations("admin.fields.portfolioAllowed", "Разрешить в портфолио", "Дозволити в портфоліо")
|
|
|
+ set_translations("admin.fields.price", "Цена", "Ціна")
|
|
|
+ set_translations("admin.fields.pricePerCm3", "Цена за см³", "Ціна за см³")
|
|
|
+ set_translations("admin.fields.projectNotes", "Заметки к проекту", "Нотатки до проєкту")
|
|
|
+ set_translations("admin.fields.publishImmediately", "Опубликовать сразу", "Опублікувати відразу")
|
|
|
+ set_translations("admin.fields.quantity", "Количество", "Кількість")
|
|
|
+ set_translations("admin.fields.selectColorStrict", "Строгий выбор цвета", "Суворий вибір кольору")
|
|
|
+ set_translations("admin.fields.selectMaterialStrict", "Строгий выбор материала", "Суворий вибір матеріалу")
|
|
|
+ set_translations("admin.fields.shippingAddress", "Адрес доставки", "Адреса доставки")
|
|
|
+ set_translations("admin.fields.slug", "Slug (URL)", "Slug (URL)")
|
|
|
+ set_translations("admin.fields.snapshotInfo", "Состояние заказа на момент создания", "Стан замовлення на момент створення")
|
|
|
+ set_translations("admin.fields.sourceFiles", "Исходные файлы", "Вихідні файли")
|
|
|
+ set_translations("admin.fields.strictSelectionInfo", "Клиент может выбирать только из списка", "Клієнт може вибирати тільки зі списку")
|
|
|
+ set_translations("admin.fields.techType", "Тип технологии", "Тип технології")
|
|
|
+ set_translations("admin.fields.title", "Заголовок", "Заголовок")
|
|
|
+
|
|
|
+ # Labels
|
|
|
+ set_translations("admin.labels.actions", "Действия", "Дії")
|
|
|
+ set_translations("admin.labels.chat", "Чат", "Чат")
|
|
|
+ set_translations("admin.labels.contact", "Контакт", "Контакт")
|
|
|
+ set_translations("admin.labels.registered", "Зарегистрирован", "Зареєстрований")
|
|
|
+ set_translations("admin.labels.role", "Роль", "Роль")
|
|
|
+ set_translations("admin.labels.user", "Пользователь", "Користувач")
|
|
|
+ set_translations("admin.managementCenter", "Центр управления", "Центр управління")
|
|
|
+
|
|
|
+ # Modals
|
|
|
+ set_translations("admin.modals.createMaterial", "Добавить материал", "Додати матеріал")
|
|
|
+ set_translations("admin.modals.createPost", "Новая запись", "Новий запис")
|
|
|
+ set_translations("admin.modals.createService", "Новая услуга", "Нова послуга")
|
|
|
+ set_translations("admin.modals.createUser", "Новый пользователь", "Новий користувач")
|
|
|
+ set_translations("admin.modals.editMaterial", "Редактировать материал", "Редагувати матеріал")
|
|
|
+ set_translations("admin.modals.editPost", "Редактировать запись", "Редагувати запис")
|
|
|
+ set_translations("admin.modals.editService", "Редактировать услугу", "Редагувати послугу")
|
|
|
+ set_translations("admin.modals.editUser", "Редактировать пользователя", "Редагувати користувача")
|
|
|
+ set_translations("admin.searchPlaceholder", "Поиск...", "Пошук...")
|
|
|
+ set_translations("admin.searchUsersPlaceholder", "Поиск пользователей...", "Пошук користувачів...")
|
|
|
+
|
|
|
+ # Toasts
|
|
|
+ set_translations("admin.toasts.chatDisabled", "Чат отключен", "Чат вимкнено")
|
|
|
+ set_translations("admin.toasts.chatEnabled", "Чат включен", "Чат увімкнено")
|
|
|
+ set_translations("admin.toasts.fileAttached", "Файл прикреплен", "Файл прикріплено")
|
|
|
+ set_translations("admin.toasts.fileDeleted", "Файл удален", "Файл видалено")
|
|
|
+ set_translations("admin.toasts.genericError", "Произошла ошибка", "Сталася помилка")
|
|
|
+ set_translations("admin.toasts.loadError", "Ошибка загрузки", "Помилка завантаження")
|
|
|
+ set_translations("admin.toasts.materialDeleted", "Материал удален", "Матеріал видалено")
|
|
|
+ set_translations("admin.toasts.materialSaved", "Материал сохранен", "Матеріал збережено")
|
|
|
+ set_translations("admin.toasts.noConsent", "Нет согласия", "Немає згоди")
|
|
|
+ set_translations("admin.toasts.paramsUpdated", "Параметры обновлены", "Параметри оновлено")
|
|
|
+ set_translations("admin.toasts.photoAdded", "Фото добавлено", "Фото додано")
|
|
|
+ set_translations("admin.toasts.postDeleted", "Запись удалена", "Запис видалено")
|
|
|
+ set_translations("admin.toasts.postSaved", "Запись сохранена", "Запис збережено")
|
|
|
+ set_translations("admin.toasts.priceUpdated", "Цена обновлена", "Ціна оновлена")
|
|
|
+ set_translations("admin.toasts.roleUpdated", "Роль обновлена", "Роль оновлена")
|
|
|
+ set_translations("admin.toasts.serviceDeleted", "Услуга удалена", "Послуга видалена")
|
|
|
+ set_translations("admin.toasts.serviceSaved", "Услуга сохранена", "Послугу збережено")
|
|
|
+ set_translations("admin.toasts.statusUpdated", "Статус обновлен", "Статус оновлено")
|
|
|
+ set_translations("admin.toasts.userCreated", "Пользователь создан", "Користувач створений")
|
|
|
+ set_translations("admin.toasts.userSaved", "Пользователь сохранен", "Користувача збережено")
|
|
|
+ set_translations("admin.total", "Всего", "Всього")
|
|
|
+
|
|
|
+ # Auth
|
|
|
+ set_translations("auth.fields.newPassword", "Новый пароль", "Новий пароль")
|
|
|
+ set_translations("auth.studio", "Студия 3D Печати", "Студія 3D Друку")
|
|
|
+ set_translations("auth.toasts.accountCreated", "Аккаунт создан! Теперь можно войти.", "Акаунт створено! Тепер можна увійти.")
|
|
|
+ set_translations("auth.toasts.passwordChanged", "Пароль успешно изменен!", "Пароль успішно змінено!")
|
|
|
+ set_translations("auth.toasts.passwordsNoMatch", "Пароли не совпадают", "Паролі не збігаються")
|
|
|
+ set_translations("auth.toasts.resetLinkSent", "Ссылка на сброс пароля отправлена на почту.", "Посилання на скидання пароля надіслано на пошту.")
|
|
|
+ set_translations("auth.toasts.socialSoon", "Вход через {provider} скоро появится!", "Вхід через {provider} скоро з'явиться!")
|
|
|
+ set_translations("auth.toasts.welcomeBack", "С возвращением!", "З поверненням!")
|
|
|
+
|
|
|
+ # Blog & Errors
|
|
|
+ set_translations("blog.exploreOther", "Посмотреть другие", "Переглянути інші")
|
|
|
+ set_translations("blog.loading", "Загрузка записей...", "Завантаження записів...")
|
|
|
+ set_translations("blog.loadingSingle", "Загрузка записи...", "Завантаження запису...")
|
|
|
+ set_translations("blog.notFound", "Запись не найдена", "Запис не знайдено")
|
|
|
+ set_translations("errors.404.button", "Вернуться на главную", "Повернутися на головну")
|
|
|
+ set_translations("errors.404.subtitle", "Страница не найдена", "Сторінка не знайдена")
|
|
|
+ set_translations("errors.404.title", "Ошибка 404", "Помилка 404")
|
|
|
+
|
|
|
+ # Footer & Nav
|
|
|
+ set_translations("footer.location", "Херцег-Нови, Черногория", "Херцег-Нові, Чорногорія")
|
|
|
+ set_translations("nav.admin", "Админ", "Адмін")
|
|
|
+ set_translations("nav.adminPanel", "Панель управления", "Панель управління")
|
|
|
+ set_translations("nav.loggedOut", "Вы успешно вышли", "Ви успішно вийшли")
|
|
|
+ set_translations("nav.nuances", "Нюансы", "Нюанси")
|
|
|
+ set_translations("nav.unreadMessages", "Непрочитанные сообщения", "Непрочитані повідомлення")
|
|
|
+ set_translations("nav.unreadTooltip", "У вас есть непрочитанные сообщения", "У вас є непрочитані повідомлення")
|
|
|
+
|
|
|
+ # Orders
|
|
|
+ set_translations("orders.labels.estimate", "Расчет", "Розрахунок")
|
|
|
+ set_translations("orders.labels.materialColor", "Материал и цвет", "Матеріал та колір")
|
|
|
+ set_translations("orders.labels.myNotes", "Мои заметки", "Мої замітки")
|
|
|
+ set_translations("orders.labels.progressReport", "Отчет о выполнении", "Звіт про виконання")
|
|
|
+ set_translations("orders.labels.projectFiles", "Файлы проекта", "Файли проєкту")
|
|
|
+ set_translations("orders.labels.quantity", "Кол-во", "К-сть")
|
|
|
+ set_translations("orders.labels.status", "Статус", "Статус")
|
|
|
+
|
|
|
+ # Portfolio & Privacy
|
|
|
+ set_translations("portfolio.emptyDesc", "Здесь скоро появятся наши новые работы.", "Тут скоро з'являться наші нові роботи.")
|
|
|
+ set_translations("portfolio.emptyTitle", "Портфолио пусто", "Портфоліо порожнє")
|
|
|
+ set_translations("portfolio.loading", "Загрузка портфолио...", "Завантаження портфоліо...")
|
|
|
+ set_translations("privacy.contactDesc", "Если у вас есть вопросы, наша команда всегда готова помочь.", "Якщо у вас є питання, наша команда завжди готова допомогти.")
|
|
|
+ set_translations("privacy.contactTitle", "Нужна помощь?", "Потрібна допомога?")
|
|
|
+ set_translations("privacy.responseNotice", "Мы отвечаем на все запросы в течение 48 часов.", "Ми відповідаємо на всі запити протягом 48 годин.")
|
|
|
+
|
|
|
+ # Upload
|
|
|
+ set_translations("upload.error", "Ошибка загрузки", "Помилка завантаження")
|
|
|
+ set_translations("upload.estimatedTotal", "Приблизительный итог", "Орієнтовний підсумок")
|
|
|
+ set_translations("upload.priceDisclaimer", "Финальная цена может измениться после проверки", "Фінальна ціна може змінитися після перевірки")
|
|
|
+ set_translations("upload.selectColor", "Выберите цвет", "Виберіть колір")
|
|
|
+
|
|
|
+ # Footer missing ones
|
|
|
+ def set_simple(path, lang, val):
|
|
|
+ parts = path.split('.')
|
|
|
+ curr = data
|
|
|
+ for p in parts[:-1]: curr = curr.get(p, {})
|
|
|
+ if parts[-1] in curr:
|
|
|
+ if isinstance(curr[parts[-1]], dict):
|
|
|
+ curr[parts[-1]][lang] = val
|
|
|
+ else:
|
|
|
+ pass
|
|
|
+
|
|
|
+ set_simple("footer.contactDesc", "me", "Ako imate bilo kakvih pitanja, slobodno nas kontaktirajte.")
|
|
|
+ set_simple("footer.contactDesc", "ru", "Если у вас есть вопросы, свяжитесь с нами.")
|
|
|
+ set_simple("footer.contactDesc", "ua", "Якщо у вас є питання, зв'яжіться з нами.")
|
|
|
+ set_simple("footer.contactTitle", "me", "Kontakt")
|
|
|
+ set_simple("footer.contactTitle", "ru", "Контакты")
|
|
|
+ set_simple("footer.contactTitle", "ua", "Контакти")
|
|
|
+ set_simple("footer.intro", "me", "Bavimo se digitalnom zanatom kroz 3D štampu u Crnoj Gori.")
|
|
|
+ set_simple("footer.intro", "ru", "Мы занимаемся цифровым ремеслом через 3D-печать в Черногории.")
|
|
|
+ set_simple("footer.intro", "ua", "Ми займаємося цифровим ремеслом через 3D-друк у Чорногорії.")
|
|
|
+
|
|
|
+ # Fix Portfolio missing EN/ME
|
|
|
+ set_simple("portfolio.empty", "en", "Portfolio is currently empty.")
|
|
|
+ set_simple("portfolio.empty", "me", "Portfolio je trenutno prazan.")
|
|
|
+
|
|
|
+ # Fix Upload Quantity missing EN
|
|
|
+ set_simple("upload.quantity", "en", "Quantity")
|
|
|
+
|
|
|
+ with open(path, "w", encoding="utf-8") as f:
|
|
|
+ json.dump(data, f, ensure_ascii=False, indent=2)
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ fill_gaps()
|