rebase
This commit is contained in:
265
frontend/src/i18n/en.json
Normal file
265
frontend/src/i18n/en.json
Normal 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"
|
||||
}
|
||||
}
|
||||
@@ -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.",
|
||||
},
|
||||
};
|
||||
@@ -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
265
frontend/src/i18n/ru.json
Normal 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": "Информация"
|
||||
}
|
||||
}
|
||||
@@ -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: "Неизвестная ошибка.",
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user