"use strict"; // --------------------------------------------------------------------------- // Локализация интерфейса // --------------------------------------------------------------------------- // Язык выбирается человеком и хранится в localStorage; пока выбора не было, // панель ориентируется на язык браузера. Строки лежат плоским словарём: // ключ -> текст, подстановки записываются как {name}. const LANG_KEY = "pzm-lang"; const LANGS = ["ru", "en"]; const FALLBACK_LANG = "en"; function detectLang() { let saved = null; try { saved = localStorage.getItem(LANG_KEY); } catch (error) { // Приватный режим может запрещать хранилище — тогда просто определяем язык. } if (LANGS.includes(saved)) return saved; const preferred = navigator.languages && navigator.languages.length ? navigator.languages : [navigator.language || ""]; for (const tag of preferred) { const code = String(tag).toLowerCase().split("-")[0]; if (LANGS.includes(code)) return code; } return FALLBACK_LANG; } const LANG = detectLang(); // Сервер отдаёт свои сообщения об ошибках на языке панели, и узнаёт его из // куки: заголовок Accept-Language говорит о браузере, а не о выборе человека. document.cookie = `pzm_lang=${LANG}; path=/; max-age=31536000; samesite=lax`; document.documentElement.lang = LANG; function setLang(lang) { if (!LANGS.includes(lang) || lang === LANG) return; try { localStorage.setItem(LANG_KEY, lang); } catch (error) { // Без хранилища выбор не переживёт перезагрузку, но применится сейчас. } document.cookie = `pzm_lang=${lang}; path=/; max-age=31536000; samesite=lax`; // Перерисовать всё на месте было бы можно, но перезагрузка честнее: она // заново читает и подписи параметров, и данные с сервера. location.reload(); } // t возвращает строку по ключу. Неизвестный ключ — это ошибка перевода, а не // повод показать пустое место: отдаём сам ключ, его видно при проверке. function t(key, vars) { const table = STRINGS[LANG] || {}; let text = table[key]; if (text === undefined) text = (STRINGS[FALLBACK_LANG] || {})[key]; if (text === undefined) return key; if (!vars) return text; return text.replace(/\{(\w+)\}/g, (match, name) => (vars[name] === undefined ? match : String(vars[name]))); } // Разметка помечена атрибутами: data-i18n ставит текст, а варианты с суффиксом // — соответствующий атрибут. Так HTML остаётся читаемым и не обрастает кодом. function applyStaticTranslations(root = document) { root.querySelectorAll("[data-i18n]").forEach((el) => { el.textContent = t(el.dataset.i18n); }); root.querySelectorAll("[data-i18n-html]").forEach((el) => { el.innerHTML = t(el.dataset.i18nHtml); }); root.querySelectorAll("[data-i18n-placeholder]").forEach((el) => { el.placeholder = t(el.dataset.i18nPlaceholder); }); root.querySelectorAll("[data-i18n-title]").forEach((el) => { el.title = t(el.dataset.i18nTitle); }); } const STRINGS = { ru: { "lang.label": "Язык", "auth.subtitle": "Управление сервером Project Zomboid", "auth.subtitleSetup": "Создайте учётную запись администратора", "auth.token": "Код первичной настройки", "auth.tokenHint": "Код напечатан в журнале менеджера при запуске: journalctl -u pzmanager", "auth.login": "Логин", "auth.password": "Пароль", "auth.signIn": "Войти", "auth.createAdmin": "Создать администратора", "auth.expired": "Сессия истекла, войдите заново", "error.http": "Ошибка {status}", "error.offline": "Нет связи с менеджером", "btn.start": "Запустить", "btn.stop": "Остановить", "btn.restart": "Перезапустить", "btn.cancelRestart": "Отменить перезапуск", "btn.logout": "Выйти", "btn.cancel": "Отменить", "btn.save": "Сохранить", "btn.saveCount": "Сохранить ({count})", "btn.delete": "Удалить", "state.stopped": "Остановлен", "state.restarting": "Ждёт перезапуска", "state.starting": "Запускается", "state.running": "Работает", "state.stopping": "Останавливается", "state.restartIn": "Перезапуск через {sec} с", "tab.overview": "Обзор", "tab.console": "Консоль", "tab.config": "Конфиг сервера", "tab.sandbox": "Песочница", "tab.mods": "Моды", "tab.backups": "Бэкапы", "tab.profiles": "Профили", "tab.settings": "Настройки", "overview.stateCard": "Состояние", "overview.playersCard": "Игроки онлайн", "overview.processCard": "Процесс сервера", "overview.hostCard": "Хост", "overview.cpu": "CPU", "overview.memory": "Память", "overview.threads": "Потоки", "overview.ramFree": "ОЗУ свободно", "overview.load": "Load average", "overview.diskFree": "Диск свободно", "overview.uptime": "Работает: {value}", "overview.loading": "Загружается: {value}", "overview.starting": "Мир загружается — сервер ещё не принимает подключения", "overview.profile": "Профиль: {title}", "overview.lastExit": "Последнее завершение: {reason}", "overview.memoryOf": "{free} из {total}", "overview.loadCores": "{load} на {count} ядер", "install.card": "Серверные файлы", "install.installed": "Серверные файлы установлены.", "install.missing": "Серверные файлы не найдены — сервер ещё не установлен.", "install.install": "Установить сервер через SteamCMD", "install.update": "Обновить сервер через SteamCMD", "install.hintInstall": "Займёт несколько минут и около 3 ГБ на диске — прогресс виден во вкладке «Консоль».", "install.hintUpdate": "Сервер должен быть остановлен. Обновление занимает несколько минут — прогресс виден во вкладке «Консоль».", "install.confirmInstall": "Установить сервер через SteamCMD?", "install.confirmUpdate": "Обновить серверные файлы через SteamCMD?", "install.started": "Задача запущена — следите за вкладкой «Консоль»", "confirm.stop": "Остановить игровой сервер? Игроки будут отключены.", "confirm.restart": "Перезапустить сервер? Игроки будут отключены.", "task.done": "{name} — готово", "console.autoscroll": "Прокручивать за выводом", "console.filter": "Фильтр по строке…", "console.clear": "Очистить экран", "console.placeholder": "Команда сервера, например: players, save, quit", "console.placeholderOffline": "Сервер остановлен — консоль принимает команды только на работающем", "console.send": "Отправить", "console.help": "Полезные команды: players, save, servermsg \"текст\", kickuser \"ник\", banuser \"ник\", checkModsNeedUpdate.", "config.title": "Конфигурация сервера", "config.search": "Поиск параметра…", "config.saved": "Конфиг сохранён. Изменения применятся после перезапуска сервера.", "config.noChanges": "Нет изменений", "config.changedCount": "Изменено параметров: {count}", "config.noChangesTitle": "Изменений нет", "config.yes": "да", "config.no": "нет", "config.anticheatLabel": "Античит: проверка {number}", "config.anticheatHint": "Одна из встроенных проверок. Отключайте только при ложных срабатываниях.", "sandbox.title": "Настройки песочницы", "sandbox.saved": "Песочница сохранена. Часть параметров действует только на новый мир.", "group.other": "Прочее", "group.config.general": "Основное", "group.config.access": "Доступ и учётные записи", "group.config.network": "Сеть и порты", "group.config.pvp": "PVP и урон", "group.config.world": "Мир и правила", "group.config.backups": "Бэкапы самой игры", "group.config.mods": "Моды", "group.config.chat": "Чат и голос", "group.config.badwords": "Фильтр брани", "group.config.visibility": "Видимость игроков", "group.config.safehouse": "Убежища", "group.config.factions": "Фракции и войны", "group.config.radio": "Рации", "group.config.discord": "Discord", "group.config.anticheat": "Античит и журналы", "group.config.vehicles": "Транспорт", "group.sandbox.zombies": "Зомби", "group.sandbox.world": "Мир и время", "group.sandbox.weather": "Погода", "group.sandbox.loot": "Лут и предметы", "group.sandbox.character": "Персонаж и навыки", "group.sandbox.food": "Еда, вода и хозяйство", "group.sandbox.animals": "Животные", "group.sandbox.vehicles": "Транспорт", "group.sandbox.firearms": "Огнестрельное оружие", "group.sandbox.power": "Электричество и огонь", "group.sandbox.service": "Служебное", "group.sandbox.ZombieLore": "Зомби: повадки и характеристики", "group.sandbox.ZombieConfig": "Зомби: популяция и респавн", "group.sandbox.MultiplierConfig": "Множители опыта навыков", "group.sandbox.Map": "Карта", "group.sandbox.Basement": "Подвалы", "mods.title": "Моды", "mods.subtitle": "Галочка включает мод, перетаскивание задаёт порядок загрузки. Сервер сам скачивает моды из мастерской при запуске.", "mods.inputPlaceholder": "Ссылка на мод или коллекцию, либо просто ID", "mods.add": "Добавить мод", "mods.addCollection": "Добавить коллекцию", "mods.collectionHint": "Коллекция разворачивается в список входящих в неё модов. Сами файлы сервер скачивает сам при запуске — после этого моды можно включать галочками.", "mods.search": "Поиск по названию…", "mods.onlyEnabled": "Только включённые", "mods.mapsTitle": "Карты (Map)", "mods.mapsPlaceholder": "Например: Muldraugh, KY", "mods.mapsHint": "Каждая карта с новой строки. Первой должна идти карта мода, последней — базовая.", "mods.summary": "Модов: {total}, включено: {enabled}, пакетов мастерской: {workshop}", "mods.local": "локальный мод", "mods.notFound": "файлы не найдены — сервер скачает их при запуске", "mods.notDownloaded": "ещё не скачан — включить можно после запуска сервера", "mods.unnamed": "Мод {id}", "mods.unknownID": "Mod ID неизвестен", "mods.dragTitle": "Перетащите, чтобы изменить порядок", "mods.dragDisabled": "Порядок задаётся у включённых модов", "mods.toggleTitle": "Включить мод на сервере", "mods.up": "Выше", "mods.down": "Ниже", "mods.remove": "Убрать", "mods.empty": "Ничего не найдено", "mods.unsaved": "Есть несохранённые изменения", "mods.badInput": "Не похоже на ссылку или ID мода", "mods.duplicate": "Этот мод уже в списке", "mods.needCollection": "Вставьте ссылку на коллекцию или её ID", "mods.collectionAdded": "Из коллекции добавлено модов: {added} (всего в ней {total})", "mods.collectionKnown": "Все {total} модов коллекции уже были в списке", "mods.saved": "Список модов сохранён. Перезапустите сервер, чтобы он их подтянул.", "backups.title": "Резервные копии", "backups.note": "Бэкап снимается с активного профиля: его мир и конфиги.", "backups.notePlaceholder": "Пометка (необязательно)", "backups.create": "Создать бэкап", "backups.colArchive": "Архив", "backups.colProfile": "Профиль", "backups.colSize": "Размер", "backups.colCreated": "Создан", "backups.download": "Скачать", "backups.restore": "Восстановить", "backups.empty": "Пока ни одного архива", "backups.started": "Бэкап запущен — прогресс во вкладке «Консоль»", "backups.confirmRestore": "Восстановить мир из {name}? Текущий мир будет перезаписан.\nПеред восстановлением менеджер сам сделает страховочный бэкап.", "backups.restoreStarted": "Восстановление запущено", "backups.confirmDelete": "Удалить архив {name}? Это действие необратимо.", "backups.deleted": "Архив удалён", "profiles.title": "Профили серверов", "profiles.subtitle": "У каждого профиля свой мир, конфиг, песочница и набор модов. Одновременно работает один — переключать можно на остановленном сервере.", "profiles.picker": "Профиль", "profiles.pickerTitle": "Профиль сервера: свой мир, конфиг и моды", "profiles.pickerLocked": "Остановите сервер, чтобы переключить профиль", "profiles.active": "активный", "profiles.worldReady": "мир создан", "profiles.configured": "настроен, мир ещё не создан", "profiles.never": "ни разу не запускался", "profiles.name": "Название", "profiles.memoryMax": "Память JVM, максимум", "profiles.memoryMin": "Память JVM, начальная", "profiles.memoryMinPlaceholder": "не задана", "profiles.memoryMinHint": "Пусто — JVM берёт память по мере надобности. Если задать, она займёт этот объём сразу при старте и не сможет подняться, когда его нет.", "profiles.adminPassword": "Пароль админа игры", "profiles.adminPasswordSet": "пароль задан", "profiles.adminPasswordUnset": "не задан", "profiles.activate": "Сделать активным", "profiles.memoryExample": "Например 4g", "profiles.memoryHost": "На машине {total} ОЗУ, свободно {free}. Оставьте запас системе.", "profiles.switched": "Активный профиль переключён", "profiles.saved": "Профиль сохранён", "profiles.confirmDelete": "Убрать профиль {id} из панели?\n\nМир и конфиги останутся на диске — профиль можно вернуть, создав его с тем же идентификатором.", "profiles.deleted": "Профиль удалён", "profiles.created": "Профиль создан", "profiles.newTitle": "Новый профиль", "profiles.id": "Идентификатор", "profiles.idHint": "Латиница, цифры, дефис. Станет именем конфига и папки мира.", "profiles.nameHint": "Как профиль подписан в панели.", "profiles.namePlaceholder": "Сборка с модами", "profiles.memory": "Память JVM", "profiles.memoryHint": "Применяется при запуске этого профиля.", "profiles.copyFrom": "Скопировать настройки из", "profiles.copyHint": "Копирует .ini и настройки песочницы. Мир останется новым.", "profiles.copyNone": "не копировать", "profiles.create": "Создать профиль", "import.title": "Импорт пресета сборки", "import.fileHint": "ZIP-пакет сборки или пресет песочницы .cfg. Из архива панель возьмёт серверный .ini, настройки песочницы и точки появления, остальное пропустит.", "import.reading": "Читаю архив…", "import.set": "Набор из архива", "import.server": "Сервер: {name}", "import.mods": "Моды: {mods} · пакеты мастерской: {workshop}", "import.maps": "Карты: {maps}", "import.counts": "Настройки сервера: {settings} · песочница: {sandbox}", "import.spawnYes": "Точки появления: есть", "import.spawnNo": "Точки появления: нет", "import.noINI": "Конфига сервера в наборе нет — импортируются только настройки песочницы.", "import.target": "Куда импортировать", "import.targetNew": "В новый профиль", "import.targetExisting": "Поверх существующего профиля", "import.newID": "Идентификатор нового профиля", "import.profile": "Профиль", "import.overwriteHint": "Конфиги профиля будут заменены, прежние останутся рядом с расширением .bak. Мир не трогается.", "import.keep": "Оставить свои значения вместо тех, что в пресете:", "import.keepPorts": "Порты и RCON", "import.keepAccess": "Пароль сервера и объявляемый IP", "import.keepIdentity": "Имя и описание сервера", "import.apply": "Импортировать", "import.noFile": "Выберите ZIP-пакет сборки", "import.confirm": "Импортировать набор «{name}» в профиль {profile}?\n\nКонфиги профиля будут заменены, прежние останутся рядом с расширением .bak.", "import.done": "Пресет импортирован в профиль {profile}. Записано файлов: {files}.", "import.kept": "Свои значения взяты из профиля {profile}: {keys}", "import.sandboxPreset": "Пресет песочницы одиночной игры: {count} параметров", "import.sandboxPresetNote": "Значения перенесутся в песочницу профиля. Параметры модов, которых в ней ещё нет, пропускаются — такой пресет лучше импортировать после первого запуска с модами.", "import.applied": "Перенесено параметров: {applied}, пропущено: {skipped}", "mods.listTitle": "Импорт списка модов", "mods.listHint": "Строка из кнопки «Поделиться» в игре: «Название:ModA;ModB;…». Заменит список включённых модов — он сохранится по кнопке «Сохранить».", "mods.listPlaceholder": "Mymods:ModA;ModB;ModC", "mods.listApply": "Применить список", "mods.listEmpty": "В строке нет идентификаторов модов", "mods.listConfirm": "Заменить список включённых модов на {count} из вставленной строки?", "mods.listDone": "Список принят: модов {count}. Нажмите «Сохранить», чтобы записать его в конфиг.", "mods.listNoFiles": "Файлов не найдено у {count} модов. Чтобы сервер их скачал, добавьте коллекцию мастерской.", "settings.versionTitle": "Версия панели", "settings.title": "Настройки менеджера", "settings.save": "Сохранить настройки", "settings.saveCount": "Сохранить настройки ({count})", "settings.changedCount": "Изменено полей: {count}", "settings.saved": "Настройки сохранены", "settings.configPath": "Файл конфигурации: {path}", "settings.usersTitle": "Пользователи панели", "settings.listen": "Адрес веб-панели", "settings.listenHint": "Например 127.0.0.1:8080. Применится после перезапуска pzmanager", "settings.serverDir": "Директория сервера", "settings.serverDirHint": "Куда SteamCMD ставит файлы Project Zomboid", "settings.zomboidDir": "Директория данных (~/Zomboid)", "settings.zomboidDirHint": "Здесь лежат миры, конфиги и логи игры", "settings.steamcmdPath": "Путь к steamcmd.sh", "settings.steamcmdPathHint": "Пусто — найти в PATH или скачать автоматически", "settings.autostart": "Запускать сервер вместе с менеджером", "settings.autorestart": "Поднимать сервер после падения", "settings.stopTimeout": "Таймаут остановки, сек", "settings.stopTimeoutHint": "Сколько ждать после команды quit до SIGTERM", "settings.logBuffer": "Строк консоли в памяти", "settings.backupDir": "Директория бэкапов", "settings.backupSchedule": "Автобэкап, минут", "settings.backupScheduleHint": "0 — отключить автоматические бэкапы", "settings.backupKeep": "Хранить архивов", "settings.backupKeepHint": "0 — не удалять старые", "settings.backupStopServer": "Останавливать сервер на время бэкапа", "settings.backupStopServerHint": "Даёт согласованный снимок, но выкидывает игроков", "users.loginPlaceholder": "Логин", "users.passwordPlaceholder": "Пароль (минимум 8 символов)", "users.add": "Добавить пользователя", "users.changePassword": "Сменить пароль", "users.newPassword": "Новый пароль для {login} (минимум 8 символов):", "users.passwordChanged": "Пароль изменён", "users.confirmDelete": "Удалить пользователя {login}?", "users.deleted": "Пользователь удалён", "users.added": "Пользователь добавлен", "update.checking": "Проверяю обновления…", "update.check": "Проверить", "update.apply": "Обновить", "update.applyTo": "Обновить до {version}", "update.restart": "Перезапустить панель", "update.restartTitle": "Перезапустить службу панели", "update.restartUnavailable": "Недоступно: панель не может управлять своей службой", "update.failed": "Не удалось проверить обновления: {error}", "update.available": "Доступна версия {version}", "update.manual": "Обновить можно командой: {command}", "update.current": "Установлена последняя версия ({version})", "update.unknown": "Сведений о релизах нет", "update.whatsNew": "Что нового", "update.whatsNewCount": "Что нового (версий: {count})", "update.noNotes": "Описание не заполнено", "update.fullNotes": "Полное описание релизов", "update.hasNew": "Есть новая версия: {version}", "update.upToDate": "Обновлений нет", "update.confirm": "Обновить панель до {version}?\n\nИгровой сервер будет остановлен, панель перезапустится.", "update.started": "Обновление запущено", "update.follow": "Ход обновления: journalctl -u pzmanager-update -f", "update.confirmRestart": "Перезапустить панель?\n\nИгровой сервер будет остановлен.", "update.restarting": "Панель перезапускается", "update.waiting": "{message} — жду, пока панель поднимется", "update.waitingState": "{message}…", "update.timeout": "Панель не поднялась за пять минут — проверьте journalctl -u pzmanager", "unit.b": "Б", "unit.kb": "КБ", "unit.mb": "МБ", "unit.gb": "ГБ", "unit.tb": "ТБ", "unit.days": "{value} д", "unit.hours": "{value} ч", "unit.minutes": "{value} мин", "locale.tag": "ru-RU", }, en: { "lang.label": "Language", "auth.subtitle": "Project Zomboid server management", "auth.subtitleSetup": "Create an administrator account", "auth.token": "Setup code", "auth.tokenHint": "The code is printed to the manager log at startup: journalctl -u pzmanager", "auth.login": "Login", "auth.password": "Password", "auth.signIn": "Sign in", "auth.createAdmin": "Create administrator", "auth.expired": "Session expired, please sign in again", "error.http": "Error {status}", "error.offline": "No connection to the manager", "btn.start": "Start", "btn.stop": "Stop", "btn.restart": "Restart", "btn.cancelRestart": "Cancel restart", "btn.logout": "Sign out", "btn.cancel": "Cancel", "btn.save": "Save", "btn.saveCount": "Save ({count})", "btn.delete": "Delete", "state.stopped": "Stopped", "state.restarting": "Waiting to restart", "state.starting": "Starting", "state.running": "Running", "state.stopping": "Stopping", "state.restartIn": "Restarting in {sec} s", "tab.overview": "Overview", "tab.console": "Console", "tab.config": "Server config", "tab.sandbox": "Sandbox", "tab.mods": "Mods", "tab.backups": "Backups", "tab.profiles": "Profiles", "tab.settings": "Settings", "overview.stateCard": "State", "overview.playersCard": "Players online", "overview.processCard": "Server process", "overview.hostCard": "Host", "overview.cpu": "CPU", "overview.memory": "Memory", "overview.threads": "Threads", "overview.ramFree": "RAM free", "overview.load": "Load average", "overview.diskFree": "Disk free", "overview.uptime": "Uptime: {value}", "overview.loading": "Loading: {value}", "overview.starting": "The world is loading — the server does not accept connections yet", "overview.profile": "Profile: {title}", "overview.lastExit": "Last exit: {reason}", "overview.memoryOf": "{free} of {total}", "overview.loadCores": "{load} on {count} cores", "install.card": "Server files", "install.installed": "Server files are installed.", "install.missing": "Server files not found — the server is not installed yet.", "install.install": "Install server via SteamCMD", "install.update": "Update server via SteamCMD", "install.hintInstall": "Takes a few minutes and about 3 GB of disk space — watch the progress on the Console tab.", "install.hintUpdate": "The server must be stopped. The update takes a few minutes — watch the progress on the Console tab.", "install.confirmInstall": "Install the server via SteamCMD?", "install.confirmUpdate": "Update the server files via SteamCMD?", "install.started": "Task started — watch the Console tab", "confirm.stop": "Stop the game server? Players will be disconnected.", "confirm.restart": "Restart the server? Players will be disconnected.", "task.done": "{name} — done", "console.autoscroll": "Scroll with output", "console.filter": "Filter by text…", "console.clear": "Clear screen", "console.placeholder": "Server command, for example: players, save, quit", "console.placeholderOffline": "Server stopped — the console only accepts commands while it runs", "console.send": "Send", "console.help": "Handy commands: players, save, servermsg \"text\", kickuser \"name\", banuser \"name\", checkModsNeedUpdate.", "config.title": "Server configuration", "config.search": "Find a setting…", "config.saved": "Config saved. Changes apply after a server restart.", "config.noChanges": "Nothing changed", "config.changedCount": "Settings changed: {count}", "config.noChangesTitle": "No changes", "config.yes": "yes", "config.no": "no", "config.anticheatLabel": "Anti-cheat: check {number}", "config.anticheatHint": "One of the built-in checks. Disable it only if it fires on legitimate players.", "sandbox.title": "Sandbox settings", "sandbox.saved": "Sandbox saved. Some settings only affect a freshly created world.", "group.other": "Other", "group.config.general": "General", "group.config.access": "Access and accounts", "group.config.network": "Network and ports", "group.config.pvp": "PVP and damage", "group.config.world": "World and rules", "group.config.backups": "In-game backups", "group.config.mods": "Mods", "group.config.chat": "Chat and voice", "group.config.badwords": "Profanity filter", "group.config.visibility": "Player visibility", "group.config.safehouse": "Safehouses", "group.config.factions": "Factions and wars", "group.config.radio": "Radio", "group.config.discord": "Discord", "group.config.anticheat": "Anti-cheat and logs", "group.config.vehicles": "Vehicles", "group.sandbox.zombies": "Zombies", "group.sandbox.world": "World and time", "group.sandbox.weather": "Weather", "group.sandbox.loot": "Loot and items", "group.sandbox.character": "Character and skills", "group.sandbox.food": "Food, water and farming", "group.sandbox.animals": "Animals", "group.sandbox.vehicles": "Vehicles", "group.sandbox.firearms": "Firearms", "group.sandbox.power": "Power and fire", "group.sandbox.service": "Service", "group.sandbox.ZombieLore": "Zombies: behaviour and traits", "group.sandbox.ZombieConfig": "Zombies: population and respawn", "group.sandbox.MultiplierConfig": "Skill XP multipliers", "group.sandbox.Map": "Map", "group.sandbox.Basement": "Basements", "mods.title": "Mods", "mods.subtitle": "The checkbox enables a mod, dragging sets the load order. The server downloads mods from the Workshop on startup.", "mods.inputPlaceholder": "Link to a mod or collection, or just an ID", "mods.add": "Add mod", "mods.addCollection": "Add collection", "mods.collectionHint": "A collection expands into the list of mods it contains. The server downloads the files itself on startup — after that the mods can be enabled with checkboxes.", "mods.search": "Search by name…", "mods.onlyEnabled": "Enabled only", "mods.mapsTitle": "Maps (Map)", "mods.mapsPlaceholder": "For example: Muldraugh, KY", "mods.mapsHint": "One map per line. The mod map goes first, the base map last.", "mods.summary": "Mods: {total}, enabled: {enabled}, Workshop items: {workshop}", "mods.local": "local mod", "mods.notFound": "files not found — the server will download them on startup", "mods.notDownloaded": "not downloaded yet — can be enabled after a server start", "mods.unnamed": "Mod {id}", "mods.unknownID": "Mod ID unknown", "mods.dragTitle": "Drag to change the order", "mods.dragDisabled": "Order applies to enabled mods only", "mods.toggleTitle": "Enable the mod on the server", "mods.up": "Up", "mods.down": "Down", "mods.remove": "Remove", "mods.empty": "Nothing found", "mods.unsaved": "There are unsaved changes", "mods.badInput": "That does not look like a mod link or ID", "mods.duplicate": "This mod is already on the list", "mods.needCollection": "Paste a collection link or its ID", "mods.collectionAdded": "Mods added from the collection: {added} (of {total} in it)", "mods.collectionKnown": "All {total} mods of the collection were already on the list", "mods.saved": "Mod list saved. Restart the server so it picks them up.", "backups.title": "Backups", "backups.note": "The backup is taken from the active profile: its world and configs.", "backups.notePlaceholder": "Note (optional)", "backups.create": "Create backup", "backups.colArchive": "Archive", "backups.colProfile": "Profile", "backups.colSize": "Size", "backups.colCreated": "Created", "backups.download": "Download", "backups.restore": "Restore", "backups.empty": "No archives yet", "backups.started": "Backup started — progress on the Console tab", "backups.confirmRestore": "Restore the world from {name}? The current world will be overwritten.\nThe manager takes a safety backup first.", "backups.restoreStarted": "Restore started", "backups.confirmDelete": "Delete the archive {name}? This cannot be undone.", "backups.deleted": "Archive deleted", "profiles.title": "Server profiles", "profiles.subtitle": "Every profile has its own world, config, sandbox and mod set. Only one runs at a time — switch it while the server is stopped.", "profiles.picker": "Profile", "profiles.pickerTitle": "Server profile: its own world, config and mods", "profiles.pickerLocked": "Stop the server to switch the profile", "profiles.active": "active", "profiles.worldReady": "world created", "profiles.configured": "configured, world not created yet", "profiles.never": "never started", "profiles.name": "Name", "profiles.memoryMax": "JVM memory, maximum", "profiles.memoryMin": "JVM memory, initial", "profiles.memoryMinPlaceholder": "not set", "profiles.memoryMinHint": "Empty — the JVM takes memory as it needs it. If set, it grabs that much at startup and fails to start when the machine has less.", "profiles.adminPassword": "Game admin password", "profiles.adminPasswordSet": "password set", "profiles.adminPasswordUnset": "not set", "profiles.activate": "Make active", "profiles.memoryExample": "For example 4g", "profiles.memoryHost": "The machine has {total} of RAM, {free} free. Leave some for the system.", "profiles.switched": "Active profile switched", "profiles.saved": "Profile saved", "profiles.confirmDelete": "Remove the profile {id} from the panel?\n\nThe world and configs stay on disk — the profile can be brought back by creating it with the same identifier.", "profiles.deleted": "Profile deleted", "profiles.created": "Profile created", "profiles.newTitle": "New profile", "profiles.id": "Identifier", "profiles.idHint": "Latin letters, digits, hyphen. Becomes the config name and the world folder.", "profiles.nameHint": "How the profile is labelled in the panel.", "profiles.namePlaceholder": "Modded run", "profiles.memory": "JVM memory", "profiles.memoryHint": "Applied when this profile starts.", "profiles.copyFrom": "Copy settings from", "profiles.copyHint": "Copies the .ini and the sandbox settings. The world stays new.", "profiles.copyNone": "do not copy", "profiles.create": "Create profile", "import.title": "Import a collection preset", "import.fileHint": "A collection ZIP package or a .cfg sandbox preset. From the archive the panel takes the server .ini, the sandbox settings and the spawn regions, and skips the rest.", "import.reading": "Reading the archive…", "import.set": "Preset from the archive", "import.server": "Server: {name}", "import.mods": "Mods: {mods} · Workshop items: {workshop}", "import.maps": "Maps: {maps}", "import.counts": "Server settings: {settings} · sandbox: {sandbox}", "import.spawnYes": "Spawn regions: included", "import.spawnNo": "Spawn regions: none", "import.noINI": "The preset has no server config — only the sandbox settings will be imported.", "import.target": "Where to import", "import.targetNew": "Into a new profile", "import.targetExisting": "Over an existing profile", "import.newID": "Identifier of the new profile", "import.profile": "Profile", "import.overwriteHint": "The profile configs will be replaced, the previous ones stay next to them with a .bak extension. The world is left alone.", "import.keep": "Keep your own values instead of the ones from the preset:", "import.keepPorts": "Ports and RCON", "import.keepAccess": "Server password and announced IP", "import.keepIdentity": "Server name and description", "import.apply": "Import", "import.noFile": "Choose a collection ZIP package", "import.confirm": "Import the preset \"{name}\" into the profile {profile}?\n\nThe profile configs will be replaced, the previous ones stay next to them with a .bak extension.", "import.done": "Preset imported into the profile {profile}. Files written: {files}.", "import.kept": "Your own values were taken from the profile {profile}: {keys}", "import.sandboxPreset": "Single-player sandbox preset: {count} settings", "import.sandboxPresetNote": "The values are transferred into the profile's sandbox. Mod settings that are not there yet are skipped — such a preset is best imported after the first start with the mods.", "import.applied": "Settings transferred: {applied}, skipped: {skipped}", "mods.listTitle": "Import a mod list", "mods.listHint": "The line from the game's Share button: \"Name:ModA;ModB;…\". It replaces the list of enabled mods — press Save to write it into the config.", "mods.listPlaceholder": "Mymods:ModA;ModB;ModC", "mods.listApply": "Apply the list", "mods.listEmpty": "The line has no mod identifiers", "mods.listConfirm": "Replace the list of enabled mods with the {count} from the pasted line?", "mods.listDone": "List accepted: {count} mods. Press Save to write it into the config.", "mods.listNoFiles": "No files found for {count} mods. Add the Workshop collection so the server downloads them.", "settings.versionTitle": "Panel version", "settings.title": "Manager settings", "settings.save": "Save settings", "settings.saveCount": "Save settings ({count})", "settings.changedCount": "Fields changed: {count}", "settings.saved": "Settings saved", "settings.configPath": "Configuration file: {path}", "settings.usersTitle": "Panel users", "settings.listen": "Web panel address", "settings.listenHint": "For example 127.0.0.1:8080. Applies after a pzmanager restart", "settings.serverDir": "Server directory", "settings.serverDirHint": "Where SteamCMD installs the Project Zomboid files", "settings.zomboidDir": "Data directory (~/Zomboid)", "settings.zomboidDirHint": "Worlds, configs and game logs live here", "settings.steamcmdPath": "Path to steamcmd.sh", "settings.steamcmdPathHint": "Empty — look it up in PATH or download automatically", "settings.autostart": "Start the server together with the manager", "settings.autorestart": "Bring the server back up after a crash", "settings.stopTimeout": "Stop timeout, sec", "settings.stopTimeoutHint": "How long to wait after the quit command before SIGTERM", "settings.logBuffer": "Console lines kept in memory", "settings.backupDir": "Backup directory", "settings.backupSchedule": "Auto backup, minutes", "settings.backupScheduleHint": "0 — turn automatic backups off", "settings.backupKeep": "Archives to keep", "settings.backupKeepHint": "0 — never delete old ones", "settings.backupStopServer": "Stop the server while backing up", "settings.backupStopServerHint": "Gives a consistent snapshot, but kicks the players", "users.loginPlaceholder": "Login", "users.passwordPlaceholder": "Password (at least 8 characters)", "users.add": "Add user", "users.changePassword": "Change password", "users.newPassword": "New password for {login} (at least 8 characters):", "users.passwordChanged": "Password changed", "users.confirmDelete": "Delete the user {login}?", "users.deleted": "User deleted", "users.added": "User added", "update.checking": "Checking for updates…", "update.check": "Check", "update.apply": "Update", "update.applyTo": "Update to {version}", "update.restart": "Restart panel", "update.restartTitle": "Restart the panel service", "update.restartUnavailable": "Unavailable: the panel cannot manage its own service", "update.failed": "Could not check for updates: {error}", "update.available": "Version {version} is available", "update.manual": "Update with this command: {command}", "update.current": "The latest version is installed ({version})", "update.unknown": "No release information", "update.whatsNew": "What's new", "update.whatsNewCount": "What's new ({count} versions)", "update.noNotes": "No description", "update.fullNotes": "Full release notes", "update.hasNew": "A new version is available: {version}", "update.upToDate": "No updates", "update.confirm": "Update the panel to {version}?\n\nThe game server will be stopped and the panel will restart.", "update.started": "Update started", "update.follow": "Update progress: journalctl -u pzmanager-update -f", "update.confirmRestart": "Restart the panel?\n\nThe game server will be stopped.", "update.restarting": "The panel is restarting", "update.waiting": "{message} — waiting for the panel to come back", "update.waitingState": "{message}…", "update.timeout": "The panel did not come back within five minutes — check journalctl -u pzmanager", "unit.b": "B", "unit.kb": "KB", "unit.mb": "MB", "unit.gb": "GB", "unit.tb": "TB", "unit.days": "{value} d", "unit.hours": "{value} h", "unit.minutes": "{value} min", "locale.tag": "en-US", }, };