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()