Русский и английский языки интерфейса
Язык выбирается в шапке панели, а до первого выбора берётся из настроек браузера. Переведены интерфейс, подписи и описания всех параметров конфигов, ошибки API и служебные сообщения менеджера в консоли. Подписи параметров вынесены из app.js в hints-<язык>.json: их больше четырёхсот на язык, и грузить чужой язык незачем. Сообщения менеджера переводятся на выходе из API по словарю, где ключом служит русская фраза из кода, — вывод самого игрового сервера через него проходит без изменений. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
package i18n
|
||||
|
||||
// Словарь сообщений менеджера. Ключ — русская фраза ровно в том виде, в каком
|
||||
// она собирается в коде; значение — английский перевод.
|
||||
//
|
||||
// В formats оба текста записаны как форматные строки: %s отмечает место, куда
|
||||
// при сборке сообщения подставилось значение. Порядок значений в переводе
|
||||
// должен совпадать с оригиналом.
|
||||
|
||||
var messages = map[string]string{
|
||||
// --- Вход и учётные записи ---
|
||||
"панель уже настроена": "the panel is already set up",
|
||||
"неверный код первичной настройки": "wrong setup code",
|
||||
"неверный логин или пароль": "wrong login or password",
|
||||
"требуется вход": "sign-in required",
|
||||
"логин не может быть пустым": "the login cannot be empty",
|
||||
"пароль короче 8 символов": "the password is shorter than 8 characters",
|
||||
"пароли не совпадают": "the passwords do not match",
|
||||
"пользователь не найден": "user not found",
|
||||
"пользователь уже существует": "the user already exists",
|
||||
"нельзя удалить учётную запись, под которой вы вошли": "you cannot delete the account you are signed in with",
|
||||
|
||||
// --- Сервер и задачи ---
|
||||
"сервер не запущен": "the server is not running",
|
||||
"сервер уже запущен": "the server is already running",
|
||||
"сначала остановите игровой сервер": "stop the game server first",
|
||||
"серверные файлы не найдены — сначала выполните установку": "server files not found — install the server first",
|
||||
"нет активной задачи": "no active task",
|
||||
"уже выполняется другая задача": "another task is already running",
|
||||
"пустая команда": "empty command",
|
||||
"потоковая отдача не поддерживается": "streaming is not supported",
|
||||
"штатное завершение": "clean shutdown",
|
||||
|
||||
// --- Профили ---
|
||||
"профиль не найден": "profile not found",
|
||||
"нельзя удалить активный профиль — сначала переключитесь на другой": "the active profile cannot be deleted — switch to another one first",
|
||||
"нельзя удалить единственный профиль": "the only profile cannot be deleted",
|
||||
"путь к конфигу неизвестен": "the config path is unknown",
|
||||
|
||||
// --- Бэкапы и обновление ---
|
||||
"архив не найден": "archive not found",
|
||||
"обновление из панели недоступно: нет pzmanager-admin или правила sudo": "updating from the panel is unavailable: pzmanager-admin or the sudo rule is missing",
|
||||
"длительность должна быть строкой вида 90s или числом секунд": "the duration must be a string like 90s or a number of seconds",
|
||||
|
||||
// --- Моды ---
|
||||
"слишком много идентификаторов за один запрос": "too many identifiers in one request",
|
||||
"не похоже на идентификатор или ссылку на коллекцию": "that does not look like a collection ID or link",
|
||||
|
||||
// --- Подсказки и пометки в ответах API ---
|
||||
"Файл создаётся при первом запуске сервера": "The file is created on the first server start",
|
||||
"Файл конфигурации появится после первого запуска сервера": "The configuration file appears after the first server start",
|
||||
"Адрес прослушивания применится после перезапуска pzmanager": "The listen address applies after a pzmanager restart",
|
||||
|
||||
// --- Имена задач ---
|
||||
"Установка/обновление сервера через SteamCMD": "Installing or updating the server via SteamCMD",
|
||||
"Обновление панели": "Panel update",
|
||||
"Перезапуск панели": "Panel restart",
|
||||
|
||||
// --- Сообщения в консоли панели ---
|
||||
"Настройки менеджера сохранены": "Manager settings saved",
|
||||
"Настройки песочницы сохранены. Часть параметров применяется только к новому миру.": "Sandbox settings saved. Some of them only affect a freshly created world.",
|
||||
"Список модов обновлён. Сервер докачает моды из мастерской при следующем запуске.": "Mod list updated. The server will download the missing mods on its next start.",
|
||||
"Профиль сохранён": "Profile saved",
|
||||
"Профиль сохранён. Память и аргументы запуска применятся после перезапуска сервера.": "Profile saved. Memory and launch arguments apply after a server restart.",
|
||||
"Останавливаю сервер перед бэкапом": "Stopping the server before the backup",
|
||||
"Делаю страховочный бэкап текущего мира": "Taking a safety backup of the current world",
|
||||
"Поднимаю сервер обратно": "Bringing the server back up",
|
||||
"Плановый бэкап пропущен: выполняется другая задача": "Scheduled backup skipped: another task is running",
|
||||
"Мир ещё не создан — архивирую только конфиги": "The world does not exist yet — archiving the configs only",
|
||||
"Останавливаю сервер командой quit...": "Stopping the server with the quit command...",
|
||||
"Сервер не ответил на quit — отправляю SIGTERM": "The server did not answer quit — sending SIGTERM",
|
||||
"Сервер завис — отправляю SIGKILL": "The server hung — sending SIGKILL",
|
||||
"Автоперезапуск отменён": "Automatic restart cancelled",
|
||||
"Посмотрите ошибку выше и запустите сервер вручную.": "Check the error above and start the server manually.",
|
||||
"Запускаю обновление — оно идёт отдельной службой и переживёт перезапуск панели": "Starting the update — it runs as a separate service and survives the panel restart",
|
||||
"Подробности: journalctl -u pzmanager-update -f": "Details: journalctl -u pzmanager-update -f",
|
||||
"Перезапускаю панель": "Restarting the panel",
|
||||
"обновлением": "the update",
|
||||
"перезапуском": "the restart",
|
||||
}
|
||||
|
||||
var formats = [][2]string{
|
||||
// --- Ошибки API ---
|
||||
{"запрос без заголовка %s", "request without the %s header"},
|
||||
{"некорректный JSON: %s", "malformed JSON: %s"},
|
||||
{"конфиг сервера недоступен: %s", "the server config is unavailable: %s"},
|
||||
{"настройки песочницы недоступны: %s", "the sandbox settings are unavailable: %s"},
|
||||
|
||||
// --- Профили ---
|
||||
{"профиль %s не найден", "profile %s not found"},
|
||||
{"профиль %s уже существует", "profile %s already exists"},
|
||||
{"профиль-источник %s не найден", "source profile %s not found"},
|
||||
{"идентификатор %s недопустим: разрешены латинские буквы, цифры, дефис и подчёркивание (до 32 символов)",
|
||||
"identifier %s is not allowed: use Latin letters, digits, hyphen and underscore (up to 32 characters)"},
|
||||
{"у профиля %s ещё нет файлов настроек — сначала запустите его хотя бы раз",
|
||||
"profile %s has no config files yet — start it at least once first"},
|
||||
{"скопировать настройки: %s", "copy the settings: %s"},
|
||||
|
||||
// --- Память JVM ---
|
||||
{"объём памяти должен выглядеть как 4g или 8192m, получено %s",
|
||||
"the memory size must look like 4g or 8192m, got %s"},
|
||||
{"не разобран объём памяти %s", "could not parse the memory size %s"},
|
||||
{"начальный размер памяти (%s) больше максимального (%s)",
|
||||
"the initial memory size (%s) is larger than the maximum (%s)"},
|
||||
{"начальный размер кучи (%s) больше максимального (%s)",
|
||||
"the initial heap size (%s) is larger than the maximum (%s)"},
|
||||
|
||||
// --- Бэкапы ---
|
||||
{"недопустимое имя архива: %s", "invalid archive name: %s"},
|
||||
{"небезопасный путь в архиве: %s", "unsafe path inside the archive: %s"},
|
||||
{"абсолютный путь в архиве: %s", "absolute path inside the archive: %s"},
|
||||
{"архив повреждён: %s", "the archive is damaged: %s"},
|
||||
{"страховочный бэкап не создан, восстановление отменено: %s",
|
||||
"the safety backup failed, the restore was cancelled: %s"},
|
||||
|
||||
// --- Steam и моды ---
|
||||
{"Steam недоступен: %s", "Steam is unavailable: %s"},
|
||||
{"Steam ответил %s", "Steam answered %s"},
|
||||
{"ответ Steam не разобран: %s", "the Steam answer could not be parsed: %s"},
|
||||
{"коллекция %s не найдена", "collection %s not found"},
|
||||
{"коллекция %s недоступна — проверьте ссылку и что она открыта всем",
|
||||
"collection %s is unavailable — check the link and that it is public"},
|
||||
{"в коллекции %s нет модов", "collection %s has no mods"},
|
||||
|
||||
// --- Конфиги ---
|
||||
{"параметр %s не найден в SandboxVars", "setting %s not found in SandboxVars"},
|
||||
{"недопустимое значение для %s", "invalid value for %s"},
|
||||
{"не удалось разобрать строку параметра %s", "could not parse the line of setting %s"},
|
||||
{"прочитать конфиг %s: %s", "read the config %s: %s"},
|
||||
{"создать конфиг %s: %s", "create the config %s: %s"},
|
||||
{"обновить конфиг %s: %s", "update the config %s: %s"},
|
||||
{"разобрать конфиг %s: %s", "parse the config %s: %s"},
|
||||
{"прочитать %s: %s", "read %s: %s"},
|
||||
{"записать %s: %s", "write %s: %s"},
|
||||
{"создать %s: %s", "create %s: %s"},
|
||||
{"разобрать %s: %s", "parse %s: %s"},
|
||||
{"запустить %s: %s", "start %s: %s"},
|
||||
{"запись в консоль: %s", "write to the console: %s"},
|
||||
{"не разобрана длительность %s: %s", "could not parse the duration %s: %s"},
|
||||
{"скачать SteamCMD: %s", "download SteamCMD: %s"},
|
||||
|
||||
// --- Имена задач ---
|
||||
{"Резервное копирование мира: %s", "World backup: %s"},
|
||||
{"Плановое резервное копирование: %s", "Scheduled world backup: %s"},
|
||||
{"Восстановление из архива %s", "Restore from the archive %s"},
|
||||
|
||||
// --- Сообщения в консоли панели ---
|
||||
{"Конфиг сервера сохранён (изменений: %s). Изменения вступят в силу после перезапуска.",
|
||||
"Server config saved (changes: %s). They take effect after a restart."},
|
||||
{"Создан профиль %s", "Profile %s created"},
|
||||
{"Настройки профиля %s скопированы в %s", "The settings of profile %s were copied to %s"},
|
||||
{"Активный профиль: %s", "Active profile: %s"},
|
||||
{"Профиль %s удалён из панели. Мир и конфиги остались на диске: %s",
|
||||
"Profile %s removed from the panel. Its world and configs stayed on disk: %s"},
|
||||
{"Запуск профиля %s: %s %s (pid %s)", "Starting profile %s: %s %s (pid %s)"},
|
||||
{"Запускаю: %s", "Running: %s"},
|
||||
{"Сервер остановлен: %s", "Server stopped: %s"},
|
||||
{"Автоперезапуск через %s (можно отменить кнопкой «Остановить»)",
|
||||
"Automatic restart in %s (the Stop button cancels it)"},
|
||||
{"Автоперезапуск не удался: %s", "Automatic restart failed: %s"},
|
||||
{"Сервер падает сразу после запуска %s раза подряд — автоперезапуск остановлен. ",
|
||||
"The server has crashed right after start %s times in a row — automatic restart is off. "},
|
||||
{"Не удалось выставить границы памяти JVM: %s", "Could not set the JVM memory limits: %s"},
|
||||
{"Не удалось выставить объём памяти JVM: %s", "Could not set the JVM memory size: %s"},
|
||||
{"Память JVM: от %s до %s", "JVM memory: from %s to %s"},
|
||||
{"Лимит памяти JVM выставлен: %s", "JVM memory limit set: %s"},
|
||||
{"Не удалось отправить quit: %s", "Could not send quit: %s"},
|
||||
{"SIGTERM не доставлен: %s", "SIGTERM was not delivered: %s"},
|
||||
{"Остановка не удалась: %s", "Stopping failed: %s"},
|
||||
{"Остановить сервер не удалось: %s", "The server could not be stopped: %s"},
|
||||
{"Перезапуск не удался: %s", "Restart failed: %s"},
|
||||
{"Не удалось запустить сервер: %s", "Could not start the server: %s"},
|
||||
{"Останавливаю игровой сервер перед %s", "Stopping the game server before %s"},
|
||||
{"Плановый бэкап не запущен: %s", "The scheduled backup did not start: %s"},
|
||||
|
||||
// --- Бэкапы: ход работы ---
|
||||
{"Создаю архив %s (профиль %s)", "Creating the archive %s (profile %s)"},
|
||||
{"Архив готов: %s (%s, файлов: %s)", "Archive ready: %s (%s, files: %s)"},
|
||||
{"Восстанавливаю %s в %s", "Restoring %s into %s"},
|
||||
{"Восстановлено файлов: %s", "Files restored: %s"},
|
||||
{"Удалён старый архив %s", "Old archive %s deleted"},
|
||||
{"Ротация не удалась: %s", "Rotation failed: %s"},
|
||||
{"Пропускаю %s: %s", "Skipping %s: %s"},
|
||||
{"Не прочитан %s: %s", "Not read %s: %s"},
|
||||
|
||||
// --- SteamCMD ---
|
||||
{"SteamCMD найден: %s", "SteamCMD found: %s"},
|
||||
{"SteamCMD не найден, скачиваю в %s", "SteamCMD not found, downloading into %s"},
|
||||
{"SteamCMD установлен: %s", "SteamCMD installed: %s"},
|
||||
}
|
||||
Reference in New Issue
Block a user