From 99801d88c3f8deee36d1190073a8535e1ce50c4d Mon Sep 17 00:00:00 2001 From: sadtweenk Date: Fri, 13 Mar 2026 10:26:13 +0300 Subject: [PATCH] Update README.md to include Russian text sources and placeholder information --- README.md | 11 ++ aegis/errors.json | 52 ++++++ aegis/system.json | 38 ++++ aegis/validation.json | 11 ++ common/dates.json | 10 + common/general.json | 30 +++ common/messages.json | 23 +++ common/ui.json | 35 ++++ common/validation.json | 20 ++ lotus/alerts.json | 20 ++ lotus/content.json | 405 +++++++++++++++++++++++++++++++++++++++++ lotus/errors.json | 37 ++++ runtime/alerts.json | 20 ++ runtime/content.json | 143 +++++++++++++++ runtime/errors.json | 15 ++ 15 files changed, 870 insertions(+) create mode 100644 aegis/errors.json create mode 100644 aegis/system.json create mode 100644 aegis/validation.json create mode 100644 common/dates.json create mode 100644 common/general.json create mode 100644 common/messages.json create mode 100644 common/ui.json create mode 100644 common/validation.json create mode 100644 lotus/alerts.json create mode 100644 lotus/content.json create mode 100644 lotus/errors.json create mode 100644 runtime/alerts.json create mode 100644 runtime/content.json create mode 100644 runtime/errors.json diff --git a/README.md b/README.md index 6ed5421..a330e49 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ # Fanslayer +Набор вынесенных `ru`-текстов из соседних проектов: + +- `aegis/`: backend-сообщения, ошибки, системные сообщения и валидация из `../Aegis` +- `lotus/`: контент, UI-тексты, ошибки и alert-ы из `../Lotus` +- `runtime/`: тексты экранов, статусы, ошибки и уведомления из `../Launcher-Runtime` +- `common/`: повторяющиеся кнопки, сущности, общие сообщения и базовая валидация + +Плейсхолдеры в строках: + +- `{name}`, `{count}`, `{error}`, `{version}`, `{stage}` и подобные значения подставляются на стороне потребителя + diff --git a/aegis/errors.json b/aegis/errors.json new file mode 100644 index 0000000..1b8403c --- /dev/null +++ b/aegis/errors.json @@ -0,0 +1,52 @@ +{ + "auth": { + "unauthorized": "Требуется авторизация", + "accessDenied": "Доступ запрещен", + "userNotFound": "Пользователь не найден", + "profileNotFound": "Профиль не найден", + "profileDoesNotBelongToUser": "Профиль не принадлежит пользователю", + "noTokenProvided": "Токен доступа не передан", + "recoverySessionNotFound": "Сессия восстановления не найдена", + "passwordResetChallengeExpired": "Сессия сброса пароля недействительна или истекла" + }, + "profiles": { + "texturesNotFound": "Текстуры не найдены", + "skinNotFound": "Скин не найден", + "cloakNotFound": "Плащ не найден", + "maxProfilesAllowed": "Можно создать не более {max} профилей", + "profileNameAlreadyExists": "Профиль с таким именем уже существует", + "cannotDeleteGeneralProfile": "Нельзя удалить основной профиль" + }, + "assets": { + "profileAndFileRequired": "Необходимо передать profile_id и файл", + "profileNotFoundOrAccessDenied": "Профиль не найден или доступ запрещен", + "failedToUploadSkin": "Не удалось загрузить скин", + "failedToUploadCloak": "Не удалось загрузить плащ" + }, + "discord": { + "botAuthNotConfigured": "Аутентификация бота не настроена", + "invalidBotToken": "Недействительный токен бота", + "failedToGenerateUniqueCode": "Не удалось сгенерировать уникальный код подключения", + "invalidConnectionCode": "Недействительный код подключения", + "discordAccountAlreadyConnected": "Этот Discord-аккаунт уже привязан к другому пользователю" + }, + "messenger": { + "missingConversationIdOrToken": "Не переданы conversationId или token", + "directConversationMustHaveOneParticipant": "В личной беседе должен быть ровно один собеседник", + "groupConversationMustHaveName": "У групповой беседы должно быть название", + "cannotCreateConversationWithYourself": "Нельзя создать беседу с самим собой", + "directConversationAlreadyExists": "Личная беседа уже существует", + "replyMessageNotFound": "Сообщение для ответа не найдено", + "cannotAddParticipantsToDirectConversation": "В личную беседу нельзя добавлять участников", + "allUsersAlreadyParticipants": "Все пользователи уже состоят в беседе", + "conversationNotFound": "Беседа не найдена", + "onlyOwnerCanDeleteGroupConversation": "Только владелец может удалить групповую беседу", + "ownerCannotLeaveGroup": "Владелец не может покинуть группу. Сначала удалите беседу или передайте права.", + "onlyOwnerCanRemoveParticipants": "Только владелец может исключать участников", + "canOnlyRemoveParticipantsFromGroup": "Исключать участников можно только из групповых бесед", + "cannotRemoveOwnerFromConversation": "Нельзя удалить владельца из беседы", + "onlyOwnerCanUpdateConversationName": "Только владелец может менять название беседы", + "canOnlyUpdateGroupConversationName": "Менять название можно только у групповых бесед", + "unknownError": "Неизвестная ошибка" + } +} diff --git a/aegis/system.json b/aegis/system.json new file mode 100644 index 0000000..948da27 --- /dev/null +++ b/aegis/system.json @@ -0,0 +1,38 @@ +{ + "auth": { + "confirmEmailToCompleteRegistration": "Пожалуйста, подтвердите ваш email для завершения регистрации" + }, + "userLogs": { + "userSignIn": { + "title": "Вход в аккаунт", + "description": "Пользователь успешно вошел в аккаунт" + }, + "profileCreated": { + "title": "Создание профиля", + "description": "Вы создали профиль {name}" + }, + "profileDeleted": { + "title": "Удаление профиля", + "description": "Вы удалили профиль {name}" + }, + "profileSkinUploaded": { + "title": "Загрузка скина", + "description": "Вы загрузили скин для профиля {displayName}" + }, + "profileCloakUploaded": { + "title": "Загрузка плаща", + "description": "Вы загрузили плащ для профиля {displayName}" + } + }, + "messenger": { + "fallbackUser": "Пользователь {shortId}", + "groupCreated": "{actorName} создал(а) группу \"{groupName}\"", + "participantsInvitedOne": "{actorName} пригласил(а) {userName}", + "participantsInvitedMany": "{actorName} пригласил(а): {userNames}", + "participantLeft": "{userName} покинул(а) группу", + "participantsRemovedOne": "{actorName} исключил(а) {userName}", + "participantsRemovedMany": "{actorName} исключил(а): {userNames}", + "groupNameChanged": "{actorName} изменил(а) название группы с \"{oldName}\" на \"{newName}\"", + "groupNameSet": "{actorName} установил(а) название группы: \"{newName}\"" + } +} diff --git a/aegis/validation.json b/aegis/validation.json new file mode 100644 index 0000000..64c51ca --- /dev/null +++ b/aegis/validation.json @@ -0,0 +1,11 @@ +{ + "assets": { + "profileIdAndFileAreRequired": "Необходимо передать profile_id и файл" + }, + "messenger": { + "subscribePayload": "Для подписки нужны conversationId и token" + }, + "passwordReset": { + "challengeWindow": "ChallengeId выдается на 10 минут после успешной проверки кода восстановления" + } +} diff --git a/common/dates.json b/common/dates.json new file mode 100644 index 0000000..407de0d --- /dev/null +++ b/common/dates.json @@ -0,0 +1,10 @@ +{ + "formats": { + "ruLocale": "ru-RU" + }, + "labels": { + "expiresAt": "Заканчивается", + "updatedAt": "Обновлено", + "createdAt": "Создано" + } +} diff --git a/common/general.json b/common/general.json new file mode 100644 index 0000000..2a6d676 --- /dev/null +++ b/common/general.json @@ -0,0 +1,30 @@ +{ + "brand": { + "project": "Петрозаводск", + "runtime": "Launcher Runtime", + "minecraftState": "Суверенное государство-корпорация Minecraft" + }, + "entities": { + "account": "Аккаунт", + "profile": "Профиль", + "server": "Сервер", + "launcher": "Лаунчер", + "discord": "Discord", + "email": "Электронная почта", + "password": "Пароль", + "playerName": "Имя игрока", + "playerNameOrEmail": "Имя игрока или почта", + "activityFeed": "Лента активности", + "settings": "Настройки", + "security": "Безопасность" + }, + "states": { + "online": "Онлайн", + "offline": "Офлайн", + "loading": "Загрузка...", + "waiting": "Ожидание", + "done": "Готово", + "unknown": "Неизвестно", + "unlimited": "Не ограничено" + } +} diff --git a/common/messages.json b/common/messages.json new file mode 100644 index 0000000..c5ff65f --- /dev/null +++ b/common/messages.json @@ -0,0 +1,23 @@ +{ + "progress": { + "initialization": "Инициализация...", + "checkingStatus": "Проверка статуса...", + "checkingCode": "Проверка...", + "creating": "Создание...", + "deleting": "Удаление...", + "generatingCode": "Генерация кода...", + "loadingSettings": "Загрузка настроек...", + "loadingProfiles": "Загрузка профилей...", + "waitingForData": "Ожидание данных...", + "logsUnavailable": "Логи пока отсутствуют" + }, + "success": { + "emailConfirmed": "Почта подтверждена. Теперь войдите в аккаунт.", + "passwordUpdated": "Пароль обновлен. Теперь можно войти." + }, + "info": { + "serverNotSelected": "Сервер не выбран", + "profileNotSelected": "Выберите профиль, чтобы продолжить", + "noOptionals": "Нет доступных опциональных модов" + } +} diff --git a/common/ui.json b/common/ui.json new file mode 100644 index 0000000..7039cc0 --- /dev/null +++ b/common/ui.json @@ -0,0 +1,35 @@ +{ + "actions": { + "continue": "Продолжить", + "back": "Назад", + "close": "Закрыть", + "cancel": "Отмена", + "create": "Создать", + "delete": "Удалить", + "save": "Сохранить", + "copy": "Копировать", + "copied": "Скопировано!", + "refresh": "Обновить", + "download": "Скачать", + "login": "Войти", + "logout": "Выйти", + "register": "Регистрация", + "generateCode": "Сгенерировать код", + "confirmCode": "Подтвердить код", + "loadMore": "Загрузить больше", + "activate": "Активировать" + }, + "navigation": { + "home": "Главная", + "howToStart": "Как начать", + "servers": "Сервера", + "profile": "Профиль", + "messages": "Сообщения" + }, + "controls": { + "toggleTheme": "Переключить тему", + "minimizeWindow": "Свернуть окно", + "closeWindow": "Закрыть окно", + "changeProfile": "Сменить профиль" + } +} diff --git a/common/validation.json b/common/validation.json new file mode 100644 index 0000000..d85794e --- /dev/null +++ b/common/validation.json @@ -0,0 +1,20 @@ +{ + "required": { + "fillAllFields": "Пожалуйста, заполните все поля", + "email": "Введите email", + "selectImage": "Пожалуйста, выберите изображение", + "profileIdAndFile": "Необходимо передать profile_id и файл" + }, + "password": { + "minimumLength": "Пароль должен быть не менее 8 символов", + "mismatch": "Пароли не совпадают" + }, + "code": { + "enterSixDigits": "Введите 6 цифр кода", + "invalid": "Код недействителен" + }, + "session": { + "expired": "Сессия истекла", + "requestAgain": "{message}. Запросите код заново." + } +} diff --git a/lotus/alerts.json b/lotus/alerts.json new file mode 100644 index 0000000..e960165 --- /dev/null +++ b/lotus/alerts.json @@ -0,0 +1,20 @@ +{ + "profile": { + "me": { + "selectImage": "Пожалуйста, выберите изображение", + "skinUploadFailed": "Ошибка при загрузке скина", + "skinUploadFailedWithReason": "Ошибка загрузки скина: {error}", + "cloakUploadFailed": "Ошибка при загрузке плаща", + "cloakUploadFailedWithReason": "Ошибка загрузки плаща: {error}", + "createProfileFailed": "Ошибка при создании профиля", + "deleteGeneralProfileForbidden": "Нельзя удалить основной профиль", + "deleteProfileFailed": "Ошибка при удалении профиля", + "genericError": "Ошибка: {error}" + } + }, + "auth": { + "forgotPassword": { + "requestCodeAgain": "{message}. Запросите код заново." + } + } +} diff --git a/lotus/content.json b/lotus/content.json new file mode 100644 index 0000000..0c70a50 --- /dev/null +++ b/lotus/content.json @@ -0,0 +1,405 @@ +{ + "layout": { + "header": { + "navItems": [ + { "label": "Главная", "href": "/#hero" }, + { "label": "Как начать", "href": "/#onboarding" }, + { "label": "Сервера", "href": "/#servers" } + ], + "accountFallback": "Аккаунт", + "profile": "Профиль", + "messages": "Сообщения", + "logout": "Выйти", + "register": "Регистрация", + "login": "Авторизация", + "themeToggleAria": "Переключить тему" + }, + "messengerMobileHeader": { + "accountFallback": "Аккаунт", + "profile": "Профиль", + "messages": "Сообщения", + "logout": "Выйти", + "register": "Регистрация", + "login": "Вход", + "themeToggleAria": "Переключить тему" + }, + "footer": { + "brand": "Петрозаводск", + "creator": "Нефильтрованные Приложения", + "navLinks": [ + { "label": "Лаунчер", "href": "/download" }, + { "label": "Публичная оферта", "href": "/offer" }, + { "label": "Правила", "href": "/rules" }, + { "label": "Конфиденциальность", "href": "/rules" }, + { "label": "Условия использования", "href": "/offer" } + ], + "legalLinks": [ + { "label": "Публичная оферта", "href": "/offer" }, + { "label": "Правила", "href": "/rules" } + ] + } + }, + "sections": { + "hero": { + "statusChecking": "Проверка статуса...", + "statusOffline": "Государство офлайн", + "statusOnline": "Государство онлайн", + "badge": "kpp совет discord", + "title": "Петрозаводск", + "subtitleAccent": "Суверенное", + "subtitleTail": "государство-корпорация Minecraft", + "description": "На руинах старого мира КПП держит Кодекс и инфраструктуру, а частные сектора двигают экономику, политику и социальную жизнь через Совет Корпораций.", + "primaryCta": "Подать заявку гражданина", + "secondaryCta": "Скачать лаунчер" + }, + "news": { + "eyebrow": "Информационный бюллетень", + "title": "Лента новостей Петрозаводска", + "description": "Официальные обновления КПП, решения Совета Корпораций и ключевые изменения экономической системы государства.", + "archive": "Онлайн-архив процедур", + "feedTitle": "Оперативная лента", + "entriesLabel": "{count} записей", + "tags": [ + "Протокол Совета", + "Архив Discord" + ], + "items": [ + { + "id": 1, + "title": "Открыт реестр частных секторов", + "content": "КПП запустила официальный реестр корпораций. Теперь заявки на регистрацию, вид деятельности и закрепление территорий проходят через единый Discord-канал с прозрачным протоколом.", + "category": "Государство", + "date": "11.02.2026", + "accent": "Регистрация бизнеса", + "note": "Оформление секторов и прав на территорию переведено в единый регламент." + }, + { + "id": 2, + "title": "Совет Корпораций утвердил первый налоговый цикл", + "content": "Еженедельный взнос теперь зависит от размера территории и активности сектора. Средства казны направят на дороги, порталы и публичные логистические узлы.", + "category": "Экономика", + "date": "10.02.2026", + "accent": "Казна и инфраструктура", + "note": "Налоговая модель привязана к масштабу сектора и его фактической активности." + }, + { + "id": 3, + "title": "Запущен канал инициатив граждан", + "content": "Игроки могут выдвигать предложения по законам и регламентам. Идеи с поддержкой переходят в повестку Совета и выносятся на голосование.", + "category": "Политика", + "date": "09.02.2026", + "accent": "Демократия снизу", + "note": "Поддержанные инициативы автоматически попадают в повестку Совета." + }, + { + "id": 4, + "title": "Арбитраж КПП переведен в тикетный формат", + "content": "Разбирательства между секторами и гражданами фиксируются в тикетах: стороны, доказательства и итоговое решение теперь доступны в архиве процедур.", + "category": "Право", + "date": "08.02.2026", + "accent": "Прозрачный арбитраж", + "note": "Каждый спор теперь сохраняется в архиве процедур с единым шаблоном решения." + } + ] + }, + "howToRegistration": { + "eyebrow": "Быстрый старт", + "title": "Как начать играть?", + "description": "Три простых шага, чтобы стать частью виртуального государства Петрозаводск", + "steps": [ + { + "title": "Зарегистрироваться", + "description": "Создай аккаунт за минуту, чтобы синхронизировать прогресс и видеть статус вайпов.", + "action": "Перейти к регистрации", + "href": "/auth/register" + }, + { + "title": "Скачать лаунчер", + "description": "Готовые пресеты модов, автообновления и системные пресеты под слабые ПК.", + "action": "Скачать", + "href": "/download" + }, + { + "title": "Залететь на сервер", + "description": "Выбери любой сервак из лаунчера и появись в стартовом хабе. Дальше - дело твоей фантазии.", + "action": "Смотреть сервера", + "href": "#servers" + } + ] + }, + "ourServers": { + "desktopTitle": "Главный сервер Петрозаводска", + "desktopSubtitle": "Один центр силы.", + "mobileTitle": "Главный сервер", + "cards": [ + { + "title": "Петрозаводск: Государственный контур", + "description": "Единый главный сервер Fabric 1.21.8, где КПП регулирует Кодекс и инфраструктуру, а частные сектора развивают экономику и политику.", + "online": "112/300 граждан", + "tags": [ + "kpp", + "corporations", + "discord-governance" + ], + "content": "Здесь строится государство-корпорация: регистрируйте сектор, получайте территорию, участвуйте в Совете Корпораций, платите налоги в казну и влияйте на развитие дорог, порталов и ивентов через официальные Discord-процедуры." + } + ] + }, + "aboutServers": { + "eyebrow": "Лор сервера", + "title": "Петрозаводск - суверенное государство-корпорация на руинах старого мира", + "description": "Его держит Коммунистическая Пивная Партия: не диктат, а менеджмент-бюро, которое ведет Кодекс, выделяет землю и следит, чтобы прогресс не убил дух товарищества. Малый онлайн управляется через частные сектора и Совет Корпораций, а экономика живет на налогах, общей казне и честной торговле.", + "timelineTitle": "Хроника государства", + "timelineStepsLabel": "4 этапа", + "timeline": [ + { + "title": "После катастрофы", + "text": "На руинах старого мира появляется автономный город-государство." + }, + { + "title": "Рождение КПП", + "text": "Партия берет на себя регуляцию, кодекс и инфраструктуру." + }, + { + "title": "Власть корпораций", + "text": "Частные сектора становятся опорой экономики и социальных связей." + }, + { + "title": "Цифровая столица", + "text": "Discord превращается в портал законов, торговли и политики." + } + ], + "pillars": [ + { + "title": "КПП и порядок", + "text": "Партия фиксирует базовые правила, защищает от гриферства и выступает арбитром между корпорациями." + }, + { + "title": "Частные сектора", + "text": "Гильдии получают землю, строят бизнес, ведут свою экономику и влияют на решения государства." + }, + { + "title": "Совет корпораций", + "text": "Главы секторов собираются для законов, налогов и споров при партийном надзоре." + } + ], + "discordJoinTitle": "Стань частью виртуального государства Петрозаводск", + "discordJoinButton": "Присоединиться к Discord серверу", + "discordLinkNoteTitle": "Для доступа ко всем функциям свяжи игровой аккаунт с Discord ботом", + "discordLinkNoteText": "После присоединения используй команду /connect в канале с ботом для синхронизации аккаунтов.", + "discordLinkButton": "Связать аккаунт", + "discordBlockEyebrow": "Центральная нервная система", + "discordBlockTitle": "Роль и функции Discord в проекте \"Петрозаводск\"", + "discordBlockDescription": "Discord здесь - это центральная нервная система и правительственный портал всего государства, где осуществляется 90% управленческой, экономической и социальной активности. Это не просто чат, а инструмент для легитимного управления малым, но сложно организованным сообществом.", + "discordFeatures": [ + { + "title": "Единый источник правды", + "text": "Все официальные правила, протоколы заседаний и объявления публикуются в специальных каналах." + }, + { + "title": "Связь с государством", + "text": "Через систему тикетов решаются все вопросы: регистрация бизнеса, согласование построек, жалобы." + }, + { + "title": "Политическая система", + "text": "Проведение выборов, голосований и законодательных инициатив через ботов и опросы." + }, + { + "title": "Экономическая инфраструктура", + "text": "Регистрация корпораций, торговая площадка, учет налогов и госзаказов." + }, + { + "title": "Социальная организация", + "text": "Система ролей, частные пространства для корпораций, общественные каналы для общения." + }, + { + "title": "Масштабируемость", + "text": "Легко добавляются новые боты для голосований, экономического учета и управления ролями." + } + ] + } + }, + "auth": { + "login": { + "eyebrow": "Вернуться в игру", + "title": "Авторизуйтесь, чтобы продолжить строительство в Петрозаводске", + "description": "Логин и пароль - все, что нужно для входа. Быстро и без лишнего.", + "separator": "или", + "createAccount": "Создать новый аккаунт", + "formTitle": "Вход", + "usernameLabel": "Имя игрока или почта", + "passwordLabel": "Пароль", + "rememberMe": "Запомнить меня", + "forgotPassword": "Забыли пароль?", + "submit": "Войти", + "submitLoading": "Вход...", + "footnote": "Авторизуясь, вы подтверждаете согласие с правилами проекта, которые валяются где-то в закромах головы руководства проекта и не только." + }, + "register": { + "eyebrow": "Новый аккаунт", + "title": "Регистрация с подтверждением по коду из email", + "description": "Сначала создайте аккаунт, затем подтвердите почту одноразовым кодом.", + "existingAccount": "уже есть аккаунт?", + "loginLink": "Войти", + "formTitle": "Регистрация", + "usernameLabel": "Имя игрока", + "emailLabel": "Электронная почта", + "passwordLabel": "Пароль", + "repeatPasswordLabel": "Повтор пароля", + "submit": "Создать аккаунт", + "submitLoading": "Создание...", + "enterCodeFromEmail": "Ввести код из письма" + }, + "forgotPassword": { + "title": "Восстановление пароля", + "emailLabel": "Электронная почта", + "emailPlaceholder": "player@mail.com", + "requestCodeButton": "Получить код восстановления", + "requestCodeButtonLoading": "Отправка...", + "otpTitle": "Подтверждение кода", + "otpDescription": "Введите одноразовый код из письма, чтобы перейти к смене пароля.", + "newPasswordTitle": "Новый пароль", + "newPasswordLabel": "Новый пароль", + "repeatPasswordLabel": "Повторите пароль", + "passwordPlaceholder": "********", + "savePasswordButton": "Сохранить новый пароль", + "savePasswordButtonLoading": "Сохранение..." + }, + "otpModal": { + "submit": "Подтвердить код", + "submitLoading": "Проверка...", + "helper": "Введите {length}-значный код одним блоком или по символам." + } + }, + "profile": { + "discord": { + "loading": "Загрузка...", + "eyebrow": "discord integration", + "title": "Подключение Discord", + "description": "Свяжите свой аккаунт с Discord для получения уведомлений и доступа к дополнительным функциям.", + "connectedTitle": "Discord подключен", + "connectedDescription": "Ваш аккаунт успешно связан с Discord", + "connectedIdLabel": "ID: {discordId}", + "benefitsTitle": "Преимущества подключенного Discord аккаунта:", + "benefits": [ + "Уведомления о важных событиях", + "Доступ к специальным каналам", + "Синхронизация статуса и ролей" + ], + "howToTitle": "Как подключить Discord", + "steps": [ + "Нажмите кнопку \"Сгенерировать код\" ниже", + "Скопируйте полученный код подключения", + "Откройте Discord и отправьте команду /подключить [код] боту П.И.О.Н.Е.Р", + "Подождите несколько секунд - подключение произойдет автоматически" + ], + "connectionCodeLabel": "Ваш код подключения:", + "copyButton": "Копировать", + "copiedButton": "Скопировано!", + "codeHint": "Код действителен до успешного подключения. После подключения код будет автоматически удален.", + "generateButton": "Сгенерировать код подключения", + "generateButtonLoading": "Генерация кода..." + }, + "me": { + "quickStats": [ + { "label": "Игровое время", "value": "6ч 12м", "hint": "за последнюю неделю" }, + { "label": "Активные сервера", "value": "3", "hint": "кол-во серверов, на которые вы заходили" }, + { "label": "Уровень доступа", "value": "Explorer", "hint": "расширяется подпиской" } + ], + "settingsBlueprint": [ + { + "key": "notifications", + "title": "Системные уведомления", + "description": "Присылать события аккаунта и новости." + }, + { + "key": "loginAlerts", + "title": "Уведомления о входе", + "description": "Сигнализировать при подозрительных попытках." + }, + { + "key": "devPreviews", + "title": "Dev-превью", + "description": "Получать ранний доступ к экспериментам." + } + ], + "roadmap": [ + { + "label": "Supabase профили", + "detail": "Синк никнейма, ролей и статусов в реальном времени." + }, + { + "label": "Подписки", + "detail": "Встроенная покупка и управление тарифами." + }, + { + "label": "Аналитика сервера", + "detail": "Метрики времени онлайн, активность друзей." + } + ], + "eyebrow": "inside profile", + "title": "Личный кабинет", + "description": "Пространство для управления аккаунтом.", + "personalization": "Персонализация", + "discordConnection": "Подключение Discord", + "viewerLoading": "Загрузка...", + "disableAnimation": "Выключить анимацию", + "enableAnimation": "Включить анимацию", + "disableAutoRotate": "Выключить автовращение", + "enableAutoRotate": "Включить автовращение", + "profilesRemaining": "Осталось {count} из 5", + "generalProfile": "Основной профиль", + "profile": "Профиль", + "deleteProfile": "Удалить профиль", + "newProfile": "Новый профиль", + "newShort": "Новый", + "profileShort": "Профиль", + "accountTitle": "Ваш аккаунт", + "accountLoading": "Загрузка...", + "profileInfo": "Информация о профиле", + "defaultRole": "Гражданин", + "defaultCorporate": "Петрозаводск", + "balance": "Баланс", + "balanceValue": "1000 пт.", + "expiresAt": "Заканчивается", + "unlimited": "Не ограничено", + "editProfile": "Редактировать профиль", + "uploadLoading": "Загрузка...", + "updateSkin": "Обновить скин", + "updateCloak": "Обновить плащ", + "statsTitle": "Ваши показатели", + "activityTitle": "Лента активности", + "activityDescription": "Последние события аккаунта", + "loadMore": "Загрузить больше", + "subscriptionEyebrow": "подписка", + "subscriptionTitle": "Premium", + "subscriptionDescription": "Платная подписка, чтобы быть крутым", + "subscriptionFeatures": [ + "+ Не придумал", + "+ Особые теги в профиле", + "+ Приоритет на серверах" + ], + "subscriptionActivate": "Активировать", + "settingsTitle": "Настройки и безопасность", + "settingsDescription": "Тумблеры пока локальные, дальше уйдут в Supabase.", + "deleteModal": { + "title": "Подтверждение удаления", + "description": "Вы уверены, что хотите удалить профиль \"{name}\"? Это действие нельзя отменить.", + "submit": "Удалить", + "submitLoading": "Удаление...", + "cancel": "Отмена" + }, + "createModal": { + "title": "Создать новый профиль", + "nameLabel": "Имя профиля", + "namePlaceholder": "Введите имя профиля", + "submit": "Создать", + "submitLoading": "Создание...", + "cancel": "Отмена" + }, + "logsModal": { + "title": "Лента активности" + } + } + } +} diff --git a/lotus/errors.json b/lotus/errors.json new file mode 100644 index 0000000..8f6977b --- /dev/null +++ b/lotus/errors.json @@ -0,0 +1,37 @@ +{ + "auth": { + "login": { + "fillAllFields": "Пожалуйста, заполните все поля", + "loginFailed": "Не удалось выполнить вход", + "serverDidNotReturnAccessToken": "Сервер не вернул токен доступа" + }, + "register": { + "requiredFields": "Имя игрока, почта и пароль обязательны", + "passwordMismatch": "Пароли не совпадают", + "passwordTooShort": "Пароль должен быть не менее 8 символов", + "createAccountFailed": "Не удалось создать аккаунт", + "completeRegistrationFirst": "Сначала завершите регистрацию", + "verifyCodeFailed": "Не удалось подтвердить код" + }, + "forgotPassword": { + "emailNotFound": "Email не найден", + "emailRequired": "Введите email", + "sendMailFailed": "Не удалось отправить письмо", + "enterSixDigits": "Введите 6 цифр кода", + "invalidCode": "Код недействителен", + "verifyCodeFailed": "Ошибка проверки кода", + "recoverySessionExpired": "Сессия восстановления истекла", + "fillAllFields": "Заполните все поля", + "passwordTooShort": "Пароль должен быть не менее 8 символов", + "passwordMismatch": "Пароли не совпадают", + "updatePasswordFailed": "Не удалось обновить пароль", + "passwordUpdateError": "Ошибка обновления пароля" + } + }, + "profile": { + "discord": { + "loadingConnectionFailed": "Ошибка при загрузке информации о подключении", + "generateCodeFailed": "Ошибка при генерации кода подключения" + } + } +} diff --git a/runtime/alerts.json b/runtime/alerts.json new file mode 100644 index 0000000..ea2a279 --- /dev/null +++ b/runtime/alerts.json @@ -0,0 +1,20 @@ +{ + "login": { + "errorToast": "Ошибка авторизации, проверьте правильность введенных данных" + }, + "download": { + "logsUnavailable": "Логи запуска пока отсутствуют" + }, + "debug": { + "waitingForData": "Ожидание данных...", + "logsUnavailable": "Логи пока отсутствуют" + }, + "status": { + "initialization": "Инициализация...", + "loadingRuntimeData": "Загрузка данных runtime...", + "loadingProfiles": "Загрузка профилей...", + "connectingToRuntimeApi": "Подключение к runtime API...", + "loadingAuthMethods": "Загрузка способов авторизации...", + "checkingSavedSession": "Проверка сохраненной сессии..." + } +} diff --git a/runtime/content.json b/runtime/content.json new file mode 100644 index 0000000..737b0d2 --- /dev/null +++ b/runtime/content.json @@ -0,0 +1,143 @@ +{ + "app": { + "bootMessages": { + "loadingRuntimeData": "Загрузка данных runtime...", + "loadingProfiles": "Загрузка профилей...", + "connectingToRuntimeApi": "Подключение к runtime API...", + "loadingAuthMethods": "Загрузка способов авторизации...", + "checkingSavedSession": "Проверка сохраненной сессии..." + }, + "sceneTitles": { + "login": "Авторизация", + "profiles": "Выбор профиля", + "serverSelect": "Выбор сервера", + "serverDetails": "Сервер", + "serverSettings": "Настройки", + "serverOptionals": "Опциональные", + "download": "Загрузка", + "debug": "Отладка" + } + }, + "windowFrame": { + "defaultTitle": "Не установлено", + "runtimeLabel": "Launcher Runtime", + "back": "Назад", + "profile": "Профиль", + "changeProfile": "Сменить профиль", + "logout": "Выйти", + "toggleTheme": "Переключить тему", + "minimizeWindow": "Свернуть окно", + "closeWindow": "Закрыть окно" + }, + "login": { + "errorToast": "Ошибка авторизации, проверьте правильность введенных данных", + "title": "Петрозаводск", + "subtitleAccent": "Суверенное", + "subtitleTail": "государство-корпорация Minecraft", + "description": "На руинах старого мира КПП держит Кодекс и инфраструктуру, а частные сектора двигают экономику, политику и социальную жизнь через Совет Корпораций.", + "register": "Регистрация", + "discord": "Discord", + "backToSite": "Вернуться на сайт", + "usernameLabel": "Имя игрока или почта", + "passwordLabel": "Пароль", + "rememberMe": "Запомнить меня", + "forgotPassword": "Забыли пароль?", + "submit": "Войти", + "submitLoading": "Вход...", + "footnote": "Авторизуясь, вы подтверждаете согласие с правилами проекта, которые валяются где-то в закромах головы руководства проекта и не только." + }, + "profiles": { + "eyebrow": "Actor profile", + "title": "Выберите профиль игрока", + "selected": "Выбран профиль: {title}", + "selectToContinue": "Выберите профиль, чтобы продолжить", + "empty": "Профили не получены от backend API.", + "userLabel": "Пользователь: {username}" + }, + "serverSelect": { + "eyebrow": "Server lineup", + "title": "Выберите сервер для запуска", + "versionLabel": "Версия: {version}", + "unknownVersion": "unknown", + "preparingCards": "Подготовка карточек серверов...", + "serverNotSelected": "Сервер не выбран", + "selectAndContinue": "Выберите сервер и нажмите продолжить." + }, + "serverPage": { + "serverNotSelected": "Сервер не выбран", + "eyebrow": "Лор сервера", + "title": "Петрозаводск - суверенное государство-корпорация на руинах старого мира", + "description": "Его держит Коммунистическая Пивная Партия: не диктат, а менеджмент-бюро, которое ведет Кодекс, выделяет землю и следит, чтобы прогресс не убил дух товарищества. Малый онлайн управляется через частные сектора и Совет Корпораций, а экономика живет на налогах, общей казне и честной торговле.", + "stats": { + "type": "Тип сервера", + "worldSize": "Размер мира", + "netherSize": "Размер ада", + "endSize": "Размер энда" + }, + "timelineTitle": "Хроника государства", + "timeline": [ + { + "title": "После катастрофы", + "text": "На руинах старого мира появляется автономный город-государство." + }, + { + "title": "Рождение КПП", + "text": "Партия берет на себя регуляцию, кодекс и инфраструктуру." + }, + { + "title": "Власть корпораций", + "text": "Частные сектора становятся опорой экономики и социальных связей." + }, + { + "title": "Цифровая столица", + "text": "Discord превращается в портал законов, торговли и политики." + } + ] + }, + "serverSettings": { + "title": "Настройки сервера", + "loading": "Загрузка настроек...", + "memory": "Оперативная память", + "auto": "Авто", + "gb": "ГБ", + "java": "Java", + "recommended": "[RECOMMENDED]", + "flags": "Флаги" + }, + "serverOptionals": { + "empty": "Нет доступных опциональных модов" + }, + "download": { + "fallbackBootMessage": "Инициализация...", + "speedLabel": "Скорость: {value} Mbit/s", + "logsUnavailable": "Логи запуска пока отсутствуют" + }, + "debug": { + "title": "Debug Output", + "waitingForData": "Ожидание данных...", + "copy": "Копировать", + "kill": "Kill", + "logsUnavailable": "Логи пока отсутствуют" + }, + "launchConsole": { + "stages": { + "assetVerify": "Проверка ассетов", + "hashing": "Хеширование", + "diff": "Сравнение файлов", + "download": "Скачивание", + "deleteExtra": "Удаление лишних файлов", + "done.part": "Подготовка", + "done": "Готово" + }, + "stagePrefix": "[INFO] Этап: {stage}", + "totalDownloadFallback": "[INFO] Получен общий размер загрузки", + "totalDownload": "[INFO] Общий размер: {size}", + "launchRequested": "[INFO] Launch requested", + "downloadComplete": "[INFO] Download complete", + "minecraftStarted": "[INFO] Minecraft process started", + "minecraftFinished": "[INFO] Minecraft process finished", + "terminateRequested": "[WARN] Terminate requested", + "launchFailed": "[ERROR] {reason}", + "waiting": "Ожидание" + } +} diff --git a/runtime/errors.json b/runtime/errors.json new file mode 100644 index 0000000..8b506c9 --- /dev/null +++ b/runtime/errors.json @@ -0,0 +1,15 @@ +{ + "general": { + "generic": "Ошибка", + "initializationFailed": "Ошибка инициализации: {error}" + }, + "auth": { + "authorizationToast": "Ошибка авторизации, проверьте правильность введенных данных" + }, + "profiles": { + "empty": "Профили не получены от backend API." + }, + "servers": { + "serverNotSelected": "Сервер не выбран" + } +}