This commit is contained in:
Mikan
2026-06-20 19:13:05 +03:00
parent 32575e217e
commit 8514c63ec6
193 changed files with 22105 additions and 11660 deletions

265
frontend/src/i18n/en.json Normal file
View File

@@ -0,0 +1,265 @@
{
"common": {
"app_name": "AI-RPG",
"loading": "Loading…",
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"create": "Create",
"back": "Back",
"next": "Next",
"previous": "Previous",
"submit": "Submit",
"retry": "Retry",
"close": "Close",
"yes": "Yes",
"no": "No",
"search": "Search",
"no_data": "No data",
"actions": "Actions",
"status": "Status",
"name": "Name",
"description": "Description",
"language": "Language",
"type": "Type",
"preview": "Preview",
"details": "Details"
},
"nav": {
"worlds": "Worlds",
"create_world": "Create World",
"admin": "Admin",
"play": "Play",
"logout": "Logout",
"profile": "Profile"
},
"theme": {
"toggle": "Toggle theme",
"dark": "Dark",
"light": "Light"
},
"lang": {
"switch": "Switch language",
"en": "English",
"ru": "Русский"
},
"auth": {
"login_title": "Sign in",
"register_title": "Create account",
"admin_register_title": "Create admin account",
"email": "Email",
"username": "Username",
"password": "Password",
"password_confirm": "Confirm password",
"login_field": "Email or username",
"login_button": "Sign in",
"register_button": "Register",
"admin_token": "Admin invitation token",
"have_account": "Already have an account? Sign in",
"no_account": "No account? Register",
"logged_out": "You have been signed out.",
"login_success": "Signed in.",
"register_success": "Account created. You can sign in now.",
"admin_register_success": "Admin account created. You can sign in now.",
"login_failed": "Sign-in failed",
"register_failed": "Registration failed",
"session_expired": "Session expired, please sign in again."
},
"worlds": {
"title": "Your Worlds",
"create_new": "Create new world",
"empty": "No worlds yet. Create your first one!",
"last_played": "Last played",
"never_played": "Not played yet",
"current_time": "Current time",
"player": "Player",
"delete_confirm": "Delete this world? This cannot be undone.",
"deleted": "World deleted.",
"delete_failed": "Failed to delete world.",
"load_failed": "Failed to load worlds.",
"play": "Play",
"edit": "Edit",
"not_found": "World not found.",
"status_draft": "Draft",
"status_building": "Building",
"status_ready": "Ready",
"status_failed": "Failed",
"status_archived": "Archived"
},
"builder": {
"title": "World Builder",
"step_choose_mode": "Choose creation mode",
"step_preset": "Pick a preset",
"step_form": "Configure details",
"step_building": "Building world…",
"mode_preset": "From preset",
"mode_form": "Custom form",
"preset_help": "Start from a pre-configured world template.",
"form_help": "Configure the world yourself with custom rules.",
"world_name": "World name",
"player_name": "Player character name",
"notes": "Notes (optional)",
"notes_help": "Additional instructions for the Game Master.",
"language_en": "English",
"language_ru": "Russian",
"create_button": "Create world",
"creating": "Creating…",
"build_progress": "Build progress",
"phase": "Phase",
"step": "Step",
"of": "of",
"intro_scene": "Intro scene",
"build_complete": "World built successfully!",
"build_failed": "World build failed.",
"tool_call": "Tool call",
"llm_call": "LLM call",
"schema_generated": "World schema generated",
"environment_generated": "Environment generated",
"entities_generated": "Entities generated"
},
"editor": {
"title": "World Editor",
"instruction": "Instruction",
"instruction_placeholder": "Describe what to change about the world…",
"send": "Send",
"world_json": "World JSON",
"json_saved": "World JSON updated.",
"json_invalid": "Invalid JSON.",
"clarification": "Clarification needed",
"change_proposed": "Change proposed",
"comment": "Comment",
"apply_changes": "Apply changes",
"discard_changes": "Discard changes",
"changes_applied": "Changes applied.",
"changes_discarded": "Changes discarded.",
"edit_world": "Edit world",
"submit_instruction": "Submitting…",
"streaming": "Streaming…"
},
"play": {
"title": "Play",
"environment": "Environment",
"location": "Location",
"time_of_day": "Time of day",
"weather": "Weather",
"player": "Player",
"hp": "HP",
"level": "Level",
"inventory": "Inventory",
"conditions": "Conditions",
"npcs": "NPCs",
"items": "Items",
"plot_rails": "Plot rails",
"chat": "Chat",
"scene": "Scene",
"you": "You",
"game_master": "Game Master",
"action_placeholder": "What do you do?",
"send_action": "Send",
"sending": "Sending…",
"suggested_actions": "Suggested actions",
"no_suggestions": "No suggestions yet.",
"retry_last": "Retry last step",
"rollback": "Rollback one step",
"rollback_confirm": "Rollback the last step?",
"rolled_back": "Rolled back one step.",
"streaming": "AI is responding…",
"scene_chunk": "Scene",
"iteration_complete": "Step complete",
"trigger_fired": "Trigger fired",
"summary_generated": "Summary generated",
"load_failed": "Failed to load session.",
"no_actions_yet": "Take an action to begin."
},
"sse": {
"connecting": "Connecting…",
"connected": "Connected",
"disconnected": "Disconnected",
"error": "Connection error",
"reconnecting": "Reconnecting…"
},
"admin": {
"title": "Admin Dashboard",
"tab_settings": "Settings",
"tab_logs": "LLM Logs",
"tab_users": "Users",
"tab_stats": "Stats",
"tab_test": "Diagnostics",
"tab_icons": "Icons",
"not_admin": "You do not have admin access.",
"settings_saved": "Settings saved.",
"settings_save_failed": "Failed to save settings.",
"settings_load_failed": "Failed to load settings.",
"group_llm": "LLM",
"group_embeddings": "Embeddings",
"group_qdrant": "Qdrant",
"group_ui": "UI",
"group_game": "Game",
"logs_filter_world": "World ID",
"logs_filter_stage": "Stage",
"logs_filter_status": "Status",
"logs_filter_apply": "Apply filters",
"logs_stage": "Stage",
"logs_status": "Status",
"logs_latency": "Latency",
"logs_tokens": "Tokens",
"logs_created": "Created",
"logs_detail": "Log detail",
"logs_prompt": "Prompt",
"logs_response": "Response",
"logs_error": "Error",
"users_email": "Email",
"users_username": "Username",
"users_admin": "Admin",
"users_active": "Active",
"users_created": "Created",
"users_last_login": "Last login",
"users_make_admin": "Make admin",
"users_remove_admin": "Remove admin",
"users_activate": "Activate",
"users_deactivate": "Deactivate",
"stats_users": "Users",
"stats_worlds": "Worlds",
"stats_steps": "Steps",
"stats_avg_latency": "Avg LLM latency",
"test_llm": "Test LLM",
"test_llm_tools": "Test LLM tools",
"test_embeddings": "Test embeddings",
"probe_dimension": "Probe dimension",
"recreate_collections": "Recreate collections",
"api_url": "API URL",
"api_key": "API key",
"model": "Model",
"provider": "Provider",
"run_test": "Run test",
"running": "Running…",
"result": "Result",
"elapsed_ms": "Elapsed (ms)",
"dimension": "Dimension",
"ok": "OK",
"failed": "Failed",
"icons_favicon": "Favicon",
"icons_logo": "Logo",
"icons_og": "Open Graph image",
"icons_upload": "Upload",
"icons_uploaded": "Icon uploaded.",
"icons_upload_failed": "Failed to upload icon.",
"choose_file": "Choose file"
},
"errors": {
"generic": "Something went wrong.",
"network": "Network error. Check your connection.",
"unauthorized": "Unauthorized.",
"not_found": "Not found.",
"server_error": "Server error.",
"forbidden": "Forbidden.",
"validation": "Validation error."
},
"toast": {
"error_title": "Error",
"success_title": "Success",
"warning_title": "Warning",
"info_title": "Info"
}
}

View File

@@ -1,197 +0,0 @@
export const en = {
app: {
title: "AI RPG",
subtitle: "Flexible AI-powered role-playing game",
},
nav: {
home: "Home",
dashboard: "My worlds",
admin: "Admin",
logout: "Logout",
login: "Login",
register: "Register",
language: "Language",
},
auth: {
login_title: "Login",
register_title: "Register",
email: "Email",
username: "Username",
login_or_email: "Email or username",
password: "Password",
login_btn: "Login",
register_btn: "Register",
no_account: "No account? Register",
have_account: "Have an account? Login",
admin_setup_title: "Admin setup",
admin_setup_desc: "Enter the token printed to the backend console to create the first admin user.",
admin_setup_token: "Setup token",
setup_btn: "Create admin",
},
worlds: {
title: "Your worlds",
new: "Create new world",
empty: "You don't have any worlds yet.",
preset_choice: "Pick a preset or start from scratch",
use_preset: "From preset",
from_scratch: "From scratch",
name: "World name",
language: "World language",
create: "Create",
cancel: "Cancel",
start: "Start game",
continue: "Continue",
edit: "Edit",
delete: "Delete",
builder_title: "World builder",
builder_desc: "Describe your world — the AI will help you build it out.",
setting_brief: "Setting",
setting_brief_ph: "Dark fantasy in a late-medieval style...",
character_brief: "Character",
character_brief_ph: "Young adventurer seeking fame...",
rules_brief: "World rules",
rules_brief_ph: "Mana-based magic system, d20 turn-based combat...",
notes: "Additional notes",
notes_ph: "I want a complex faction reputation system...",
start_builder: "Start dialogue with AI",
builder_history: "Dialogue history",
builder_message_ph: "Your reply or edits...",
send: "Send",
accept: "Accept world and create",
accepting: "Creating world...",
editor_chat_title: "AI chat",
editor_chat_desc: "Describe changes — the AI will update the world definition.",
editor_chat_empty: "Nothing yet. Tell the AI what to change.",
editor_chat_ph: "e.g. add a vampire faction in the south...",
editor_you: "You",
editor_pending_defn: "AI proposed a new definition.",
editor_apply: "Apply",
editor_reset: "Reset chat",
status_draft: "Draft",
status_ready: "Ready",
status_active: "Active",
status_archived: "Archived",
},
session: {
title: "Session",
back: "Back to worlds",
glossary: "Glossary",
character: "Character",
edit_world: "Edit world",
history: "History",
action_placeholder: "What do you do?",
send: "Act",
sending: "Thinking...",
options: "Options",
custom_action: "Or your own action",
status_planning: "Planning...",
status_orchestrator_turn: "GM turn...",
status_writing_scene: "Writing scene...",
world_time: "World time",
triggers_panel: "Deferred events",
no_messages: "Start with your first action!",
new_session: "New session",
error_iter: "Iteration failed",
retry: "Retry",
},
admin: {
title: "Admin panel",
settings: "LLM settings",
base_url: "OpenAI-compatible endpoint",
api_key: "API key",
model: "Model",
temperature: "Temperature (orchestrator)",
step_temperature: "Temperature (step writer)",
summary_temperature: "Temperature (summarizer)",
max_tokens: "Max tokens",
request_timeout: "Timeout (sec)",
streaming: "Streaming",
context_settings: "Context manager",
recent_messages: "Guaranteed recent messages",
compress_threshold: "Compression threshold",
summary_messages: "Messages per summary",
max_tokens_total: "Context token budget",
trigger_settings: "Deferred triggers",
trigger_settings_desc: "Fire when in-world time advances (no polling)",
triggers_enabled: "Enabled",
triggers_enabled_desc: "Triggers fire automatically inside the orchestrator when world time advances past their scheduled fire_at.",
ui_settings: "UI customization",
ui_settings_desc: "Branding shown to all users (logo, favicon).",
ui_logo_url: "Logo URL",
ui_logo_url_hint:
"Path (e.g. /logo.png), full URL (https://.../logo.png), or data: URI. Default /logo.png is the bundled Mikan logo. Used in navbar, home page, and browser tab.",
ui_logo_preview: "Preview",
embedding_settings: "Embeddings (RAG)",
embedding_provider: "Provider",
embedding_provider_hash: "Hash (offline fallback, no semantics)",
embedding_provider_openai: "OpenAI-compatible /embeddings",
embedding_base_url: "Endpoint (empty = same as LLM)",
embedding_api_key: "API key (empty = same as LLM)",
embedding_model: "Embedding model",
embedding_dim: "Dimension (0 = auto-probe)",
embedding_timeout: "Timeout (sec)",
embedding_test: "Test embeddings",
embedding_testing: "Testing...",
embedding_test_ok: "OK: {{provider}} | dim={{dim}} | norm={{norm}}",
embedding_test_fail: "Error: {{error}}",
llm_test: "Test LLM",
llm_test_testing: "Testing...",
llm_test_tools: "Test LLM (with tools)",
llm_test_tools_testing: "Testing tool calls...",
llm_test_ok: "OK ({{latency}}ms): {{preview}}",
llm_test_fail: "Error: {{error}}",
llm_test_tools_ok: "Tool calls: {{ok}} | name={{name}} | args={{args}}",
llm_test_tools_ok_with_call: "OK — model called {{name}}({{args}}) in {{latency}}ms",
llm_test_tools_ok_no_call: "WARNING — model responded but did NOT call the tool. Text: {{text}}",
save: "Save",
saved: "Saved!",
llm_logs: "LLM logs",
users: "Users",
users_actions: "Actions",
users_ban: "Ban",
users_unban: "Unban",
back: "Back",
},
glossary: {
title: "World glossary",
npc: "NPCs",
location: "Locations",
item: "Items",
lore: "Lore",
event: "Events",
rule: "Rules",
empty: "Nothing yet. The AI will fill the glossary as you play.",
},
character: {
title: "Character sheet",
name: "Name",
race: "Race",
class: "Class",
level: "Level",
stats: "Stats",
inventory: "Inventory",
effects: "Effects",
gold: "Gold",
location: "Location",
empty: "No character data.",
},
common: {
save: "Save",
cancel: "Cancel",
delete: "Delete",
edit: "Edit",
confirm: "Confirm",
yes: "Yes",
no: "No",
loading: "Loading...",
error: "Error",
success: "Done",
not_found: "Not found",
forbidden: "Forbidden",
},
errors: {
network: "Network error. Check your connection.",
unauthorized: "Unauthorized.",
unknown: "Unknown error.",
},
};

View File

@@ -1,25 +1,26 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import { ru } from "./ru";
import { en } from "./en";
import en from "./en.json";
import ru from "./ru.json";
i18n
export const SUPPORTED_LANGUAGES = ["en", "ru"] as const;
export type AppLanguage = (typeof SUPPORTED_LANGUAGES)[number];
void i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources: {
ru: { translation: ru },
en: { translation: en },
ru: { translation: ru },
},
// English is the default. The user can switch via the language picker
// in the navbar; the choice is cached in localStorage and overrides
// browser settings on subsequent visits.
fallbackLng: "en",
supportedLngs: ["en", "ru"],
supportedLngs: [...SUPPORTED_LANGUAGES],
interpolation: { escapeValue: false },
detection: {
order: ["localStorage", "navigator"],
lookupLocalStorage: "airpg_lang",
caches: ["localStorage"],
},
});

265
frontend/src/i18n/ru.json Normal file
View File

@@ -0,0 +1,265 @@
{
"common": {
"app_name": "AI-RPG",
"loading": "Загрузка…",
"save": "Сохранить",
"cancel": "Отмена",
"delete": "Удалить",
"edit": "Изменить",
"create": "Создать",
"back": "Назад",
"next": "Далее",
"previous": "Назад",
"submit": "Отправить",
"retry": "Повторить",
"close": "Закрыть",
"yes": "Да",
"no": "Нет",
"search": "Поиск",
"no_data": "Нет данных",
"actions": "Действия",
"status": "Статус",
"name": "Название",
"description": "Описание",
"language": "Язык",
"type": "Тип",
"preview": "Просмотр",
"details": "Подробности"
},
"nav": {
"worlds": "Миры",
"create_world": "Создать мир",
"admin": "Админка",
"play": "Играть",
"logout": "Выйти",
"profile": "Профиль"
},
"theme": {
"toggle": "Переключить тему",
"dark": "Тёмная",
"light": "Светлая"
},
"lang": {
"switch": "Сменить язык",
"en": "English",
"ru": "Русский"
},
"auth": {
"login_title": "Вход",
"register_title": "Создать аккаунт",
"admin_register_title": "Создать аккаунт администратора",
"email": "Электронная почта",
"username": "Имя пользователя",
"password": "Пароль",
"password_confirm": "Подтвердите пароль",
"login_field": "Почта или имя пользователя",
"login_button": "Войти",
"register_button": "Зарегистрироваться",
"admin_token": "Токен приглашения администратора",
"have_account": "Уже есть аккаунт? Войдите",
"no_account": "Нет аккаунта? Зарегистрируйтесь",
"logged_out": "Вы вышли из аккаунта.",
"login_success": "Вход выполнен.",
"register_success": "Аккаунт создан. Теперь можно войти.",
"admin_register_success": "Аккаунт администратора создан. Теперь можно войти.",
"login_failed": "Не удалось войти",
"register_failed": "Не удалось зарегистрироваться",
"session_expired": "Сессия истекла, пожалуйста, войдите снова."
},
"worlds": {
"title": "Ваши миры",
"create_new": "Создать новый мир",
"empty": "Миров пока нет. Создайте первый!",
"last_played": "Последняя игра",
"never_played": "Ещё не играли",
"current_time": "Текущее время",
"player": "Игрок",
"delete_confirm": "Удалить этот мир? Действие необратимо.",
"deleted": "Мир удалён.",
"delete_failed": "Не удалось удалить мир.",
"load_failed": "Не удалось загрузить миры.",
"play": "Играть",
"edit": "Изменить",
"not_found": "Мир не найден.",
"status_draft": "Черновик",
"status_building": "Создаётся",
"status_ready": "Готов",
"status_failed": "Ошибка",
"status_archived": "В архиве"
},
"builder": {
"title": "Создание мира",
"step_choose_mode": "Выберите режим",
"step_preset": "Выберите пресет",
"step_form": "Настройте детали",
"step_building": "Создание мира…",
"mode_preset": "Из пресета",
"mode_form": "Своя форма",
"preset_help": "Начать с готового шаблона мира.",
"form_help": "Настроить мир самостоятельно с собственными правилами.",
"world_name": "Название мира",
"player_name": "Имя персонажа игрока",
"notes": "Заметки (необязательно)",
"notes_help": "Дополнительные инструкции для мастера игры.",
"language_en": "Английский",
"language_ru": "Русский",
"create_button": "Создать мир",
"creating": "Создание…",
"build_progress": "Прогресс создания",
"phase": "Фаза",
"step": "Шаг",
"of": "из",
"intro_scene": "Вступительная сцена",
"build_complete": "Мир успешно создан!",
"build_failed": "Не удалось создать мир.",
"tool_call": "Вызов инструмента",
"llm_call": "Вызов LLM",
"schema_generated": "Схема мира сгенерирована",
"environment_generated": "Окружение сгенерировано",
"entities_generated": "Сущности сгенерированы"
},
"editor": {
"title": "Редактор мира",
"instruction": "Инструкция",
"instruction_placeholder": "Опишите, что нужно изменить в мире…",
"send": "Отправить",
"world_json": "JSON мира",
"json_saved": "JSON мира обновлён.",
"json_invalid": "Некорректный JSON.",
"clarification": "Требуется уточнение",
"change_proposed": "Предложено изменение",
"comment": "Комментарий",
"apply_changes": "Применить изменения",
"discard_changes": "Отменить изменения",
"changes_applied": "Изменения применены.",
"changes_discarded": "Изменения отменены.",
"edit_world": "Редактировать мир",
"submit_instruction": "Отправка…",
"streaming": "Поток…"
},
"play": {
"title": "Игра",
"environment": "Окружение",
"location": "Локация",
"time_of_day": "Время суток",
"weather": "Погода",
"player": "Игрок",
"hp": "ОЗ",
"level": "Уровень",
"inventory": "Инвентарь",
"conditions": "Состояния",
"npcs": "NPC",
"items": "Предметы",
"plot_rails": "Сюжетные линии",
"chat": "Чат",
"scene": "Сцена",
"you": "Вы",
"game_master": "Мастер игры",
"action_placeholder": "Что вы делаете?",
"send_action": "Отправить",
"sending": "Отправка…",
"suggested_actions": "Предложенные действия",
"no_suggestions": "Предложений пока нет.",
"retry_last": "Повторить последний шаг",
"rollback": "Откатить один шаг",
"rollback_confirm": "Откатить последний шаг?",
"rolled_back": "Шаг откатан.",
"streaming": "AI отвечает…",
"scene_chunk": "Сцена",
"iteration_complete": "Шаг завершён",
"trigger_fired": "Сработал триггер",
"summary_generated": "Сгенерирована сводка",
"load_failed": "Не удалось загрузить сессию.",
"no_actions_yet": "Сделайте действие, чтобы начать."
},
"sse": {
"connecting": "Подключение…",
"connected": "Подключено",
"disconnected": "Отключено",
"error": "Ошибка подключения",
"reconnecting": "Переподключение…"
},
"admin": {
"title": "Админ-панель",
"tab_settings": "Настройки",
"tab_logs": "Логи LLM",
"tab_users": "Пользователи",
"tab_stats": "Статистика",
"tab_test": "Диагностика",
"tab_icons": "Иконки",
"not_admin": "У вас нет прав администратора.",
"settings_saved": "Настройки сохранены.",
"settings_save_failed": "Не удалось сохранить настройки.",
"settings_load_failed": "Не удалось загрузить настройки.",
"group_llm": "LLM",
"group_embeddings": "Эмбеддинги",
"group_qdrant": "Qdrant",
"group_ui": "Интерфейс",
"group_game": "Игра",
"logs_filter_world": "ID мира",
"logs_filter_stage": "Стадия",
"logs_filter_status": "Статус",
"logs_filter_apply": "Применить фильтры",
"logs_stage": "Стадия",
"logs_status": "Статус",
"logs_latency": "Задержка",
"logs_tokens": "Токены",
"logs_created": "Создано",
"logs_detail": "Детали лога",
"logs_prompt": "Запрос",
"logs_response": "Ответ",
"logs_error": "Ошибка",
"users_email": "Почта",
"users_username": "Имя пользователя",
"users_admin": "Админ",
"users_active": "Активен",
"users_created": "Создан",
"users_last_login": "Последний вход",
"users_make_admin": "Сделать админом",
"users_remove_admin": "Снять админа",
"users_activate": "Активировать",
"users_deactivate": "Деактивировать",
"stats_users": "Пользователи",
"stats_worlds": "Миры",
"stats_steps": "Шаги",
"stats_avg_latency": "Средняя задержка LLM",
"test_llm": "Тест LLM",
"test_llm_tools": "Тест инструментов LLM",
"test_embeddings": "Тест эмбеддингов",
"probe_dimension": "Определить размерность",
"recreate_collections": "Пересоздать коллекции",
"api_url": "URL API",
"api_key": "Ключ API",
"model": "Модель",
"provider": "Провайдер",
"run_test": "Запустить тест",
"running": "Выполнение…",
"result": "Результат",
"elapsed_ms": "Время (мс)",
"dimension": "Размерность",
"ok": "OK",
"failed": "Ошибка",
"icons_favicon": "Фавикон",
"icons_logo": "Логотип",
"icons_og": "Open Graph изображение",
"icons_upload": "Загрузить",
"icons_uploaded": "Иконка загружена.",
"icons_upload_failed": "Не удалось загрузить иконку.",
"choose_file": "Выбрать файл"
},
"errors": {
"generic": "Что-то пошло не так.",
"network": "Сетевая ошибка. Проверьте подключение.",
"unauthorized": "Не авторизован.",
"not_found": "Не найдено.",
"server_error": "Ошибка сервера.",
"forbidden": "Доступ запрещён.",
"validation": "Ошибка валидации."
},
"toast": {
"error_title": "Ошибка",
"success_title": "Успех",
"warning_title": "Предупреждение",
"info_title": "Информация"
}
}

View File

@@ -1,197 +0,0 @@
export const ru = {
app: {
title: "AI RPG",
subtitle: "Гибкая ролевая игра с ИИ",
},
nav: {
home: "Главная",
dashboard: "Мои миры",
admin: "Админка",
logout: "Выйти",
login: "Войти",
register: "Регистрация",
language: "Язык",
},
auth: {
login_title: "Вход",
register_title: "Регистрация",
email: "Email",
username: "Имя пользователя",
login_or_email: "Email или имя пользователя",
password: "Пароль",
login_btn: "Войти",
register_btn: "Зарегистрироваться",
no_account: "Нет аккаунта? Зарегистрируйтесь",
have_account: "Уже есть аккаунт? Войдите",
admin_setup_title: "Создание администратора",
admin_setup_desc: "Введите токен из консоли backend, чтобы создать первого администратора.",
admin_setup_token: "Токен инициализации",
setup_btn: "Создать администратора",
},
worlds: {
title: "Ваши миры",
new: "Создать новый мир",
empty: "У вас пока нет ни одного мира.",
preset_choice: "Выберите пресет или начните с нуля",
use_preset: "Из пресета",
from_scratch: "С нуля",
name: "Название мира",
language: "Язык мира",
create: "Создать",
cancel: "Отмена",
start: "Начать игру",
continue: "Продолжить",
edit: "Редактировать",
delete: "Удалить",
builder_title: "Конструктор мира",
builder_desc: "Опишите свой мир — ИИ поможет его достроить.",
setting_brief: "Сеттинг",
setting_brief_ph: "Тёмное фэнтези в духе позднего средневековья...",
character_brief: "Персонаж",
character_brief_ph: "Молодой авантюрист, ищущий славы...",
rules_brief: "Правила мира",
rules_brief_ph: "Система магии с маной, пошаговый бой d20...",
notes: "Дополнительные заметки",
notes_ph: "Хочу сложную систему репутации с фракциями...",
start_builder: "Начать диалог с ИИ",
builder_history: "История диалога",
builder_message_ph: "Ваш ответ или правки...",
send: "Отправить",
accept: "Принять мир и создать",
accepting: "Создаём мир...",
editor_chat_title: "Чат с ИИ",
editor_chat_desc: "Опишите изменения — ИИ обновит определение мира.",
editor_chat_empty: "Пока пусто. Напишите, что изменить в мире.",
editor_chat_ph: "Например: добавь фракцию вампиров на юге...",
editor_you: "Вы",
editor_pending_defn: "ИИ предложил новое определение.",
editor_apply: "Применить",
editor_reset: "Сбросить диалог",
status_draft: "Черновик",
status_ready: "Готов",
status_active: "Активен",
status_archived: "В архиве",
},
session: {
title: "Сессия",
back: "Назад к мирам",
glossary: "Глоссарий",
character: "Персонаж",
edit_world: "Редактировать мир",
history: "История",
action_placeholder: "Что вы делаете?",
send: "Действие",
sending: "Думаю...",
options: "Варианты",
custom_action: "Или своё действие",
status_planning: "Планирование...",
status_orchestrator_turn: "Ход GM...",
status_writing_scene: "Пишем сцену...",
world_time: "Время мира",
triggers_panel: "Отложенные события",
no_messages: "Начните с первого действия!",
new_session: "Новая сессия",
error_iter: "Ошибка при выполнении итерации",
retry: "Повторить",
},
admin: {
title: "Панель администратора",
settings: "Настройки LLM",
base_url: "OpenAI-совместимый endpoint",
api_key: "API ключ",
model: "Модель",
temperature: "Temperature (orchestrator)",
step_temperature: "Temperature (step writer)",
summary_temperature: "Temperature (summarizer)",
max_tokens: "Max tokens",
request_timeout: "Таймаут (сек)",
streaming: "Стриминг",
context_settings: "Контекстный менеджер",
recent_messages: "Гарантированных сообщений",
compress_threshold: "Порог сжатия",
summary_messages: "Сообщений на сводку",
max_tokens_total: "Бюджет токенов контекста",
trigger_settings: "Отложенные триггеры",
trigger_settings_desc: "Срабатывают при сдвиге внутриигрового времени (без поллинга)",
triggers_enabled: "Включены",
triggers_enabled_desc: "Триггеры срабатывают автоматически внутри оркестратора, когда время мира проходит запланированное fire_at.",
ui_settings: "Настройки интерфейса",
ui_settings_desc: "Брендинг, видимый всем пользователям (логотип, favicon).",
ui_logo_url: "URL логотипа",
ui_logo_url_hint:
"Путь (напр. /logo.png), полный URL (https://.../logo.png) или data: URI. По умолчанию /logo.png — встроенный логотип Mikan. Используется в навбаре, на главной и во вкладке браузера.",
ui_logo_preview: "Превью",
embedding_settings: "Эмбеддинги (RAG)",
embedding_provider: "Провайдер",
embedding_provider_hash: "Hash (офлайн-фолбэк, без семантики)",
embedding_provider_openai: "OpenAI-compatible /embeddings",
embedding_base_url: "Endpoint (пусто = как у LLM)",
embedding_api_key: "API ключ (пусто = как у LLM)",
embedding_model: "Модель эмбеддингов",
embedding_dim: "Размерность (0 = авто-проба)",
embedding_timeout: "Таймаут (сек)",
embedding_test: "Проверить эмбеддинги",
embedding_testing: "Проверяю...",
embedding_test_ok: "OK: {{provider}} | dim={{dim}} | norm={{norm}}",
embedding_test_fail: "Ошибка: {{error}}",
llm_test: "Проверить LLM",
llm_test_testing: "Проверяю...",
llm_test_tools: "Проверить LLM (с инструментами)",
llm_test_tools_testing: "Проверяю вызовы инструментов...",
llm_test_ok: "OK ({{latency}}мс): {{preview}}",
llm_test_fail: "Ошибка: {{error}}",
llm_test_tools_ok: "Вызовы инструментов: {{ok}} | имя={{name}} | аргументы={{args}}",
llm_test_tools_ok_with_call: "OK — модель вызвала {{name}}({{args}}) за {{latency}}мс",
llm_test_tools_ok_no_call: "ВНИМАНИЕ — модель ответила, но НЕ вызвала инструмент. Текст: {{text}}",
save: "Сохранить",
saved: "Сохранено!",
llm_logs: "Логи LLM",
users: "Пользователи",
users_actions: "Действия",
users_ban: "Забанить",
users_unban: "Разбанить",
back: "Назад",
},
glossary: {
title: "Глоссарий мира",
npc: "NPC",
location: "Локации",
item: "Предметы",
lore: "Лор",
event: "События",
rule: "Правила",
empty: "Пока пусто. ИИ заполнит глоссарий по ходу игры.",
},
character: {
title: "Лист персонажа",
name: "Имя",
race: "Раса",
class: "Класс",
level: "Уровень",
stats: "Характеристики",
inventory: "Инвентарь",
effects: "Эффекты",
gold: "Золото",
location: "Локация",
empty: "Нет данных о персонаже.",
},
common: {
save: "Сохранить",
cancel: "Отмена",
delete: "Удалить",
edit: "Редактировать",
confirm: "Подтвердить",
yes: "Да",
no: "Нет",
loading: "Загрузка...",
error: "Ошибка",
success: "Готово",
not_found: "Не найдено",
forbidden: "Доступ запрещён",
},
errors: {
network: "Сетевая ошибка. Проверьте подключение.",
unauthorized: "Не авторизован.",
unknown: "Неизвестная ошибка.",
},
};