e.stopPropagation()}
- className="flex flex-col w-[640px] max-h-[85vh] overflow-hidden font-['Mojangles'] mc-options-bg"
+ className="flex flex-col w-[640px] max-h-[85vh] overflow-hidden font-[var(--font-base)] mc-options-bg"
>
{isPluginTab ? (
@@ -1926,7 +1926,7 @@ function PackageModal({
exit={{ y: 20, opacity: 0 }}
transition={{ duration: 0.15 }}
onClick={(e) => e.stopPropagation()}
- className="flex flex-col w-[520px] font-['Mojangles'] text-white border-2 border-[#555] rounded-sm overflow-hidden"
+ className="flex flex-col w-[520px] font-[var(--font-base)] text-white border-2 border-[#555] rounded-sm overflow-hidden"
style={{
backgroundImage: "url('/images/frame_background.png')",
backgroundSize: "100% 100%",
@@ -2265,7 +2265,7 @@ function InstallModal({
exit={{ y: 20, opacity: 0 }}
transition={{ duration: 0.15 }}
onClick={(e) => e.stopPropagation()}
- className="flex flex-col w-[520px] font-['Mojangles'] text-white border-2 border-[#555] rounded-sm overflow-hidden"
+ className="flex flex-col w-[520px] font-[var(--font-base)] text-white border-2 border-[#555] rounded-sm overflow-hidden"
style={{
backgroundImage: "url('/images/frame_background.png')",
backgroundSize: "100% 100%",
@@ -2543,7 +2543,7 @@ function UninstallModal({
exit={{ y: 20, opacity: 0 }}
transition={{ duration: 0.15 }}
onClick={(e) => e.stopPropagation()}
- className="flex flex-col w-[520px] font-['Mojangles'] text-white border-2 border-[#555] rounded-sm overflow-hidden"
+ className="flex flex-col w-[520px] font-[var(--font-base)] text-white border-2 border-[#555] rounded-sm overflow-hidden"
style={{
backgroundImage: "url('/images/frame_background.png')",
backgroundSize: "100% 100%",
diff --git a/src/css/index.css b/src/css/index.css
index bb82e3d..107002f 100644
--- a/src/css/index.css
+++ b/src/css/index.css
@@ -1,6 +1,9 @@
@import "tailwindcss";
@layer base {
+ :root {
+ --font-base: "Mojangles", monospace;
+ }
*,
::before,
::after {
@@ -153,7 +156,7 @@
body {
margin: 0;
background-color: #000;
- font-family: "Mojangles", monospace;
+ font-family: var(--font-base, "Mojangles", monospace);
}
.mc-button {
diff --git a/src/i18n/config.ts b/src/i18n/config.ts
index a160580..638946a 100644
--- a/src/i18n/config.ts
+++ b/src/i18n/config.ts
@@ -3,6 +3,8 @@ import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import en from "./locales/en.json";
import fr from "./locales/fr.json";
+import ru from "./locales/ru.json";
+import { applyLangFont } from "./langFonts";
i18n
.use(LanguageDetector)
.use(initReactI18next)
@@ -10,6 +12,7 @@ i18n
resources: {
en: { translation: en },
fr: { translation: fr },
+ ru: { translation: ru },
},
fallbackLng: "en",
interpolation: {
@@ -21,4 +24,6 @@ i18n
},
});
+applyLangFont(i18n.resolvedLanguage ?? i18n.language);
+
export default i18n;
diff --git a/src/i18n/langFonts.ts b/src/i18n/langFonts.ts
new file mode 100644
index 0000000..69d42b7
--- /dev/null
+++ b/src/i18n/langFonts.ts
@@ -0,0 +1,35 @@
+import i18n from "i18next";
+const LANG_FONTS: Record
= {
+ ru: "/fonts/rus/minecraft.ttf",
+};
+
+const BASE_FONT = '"Mojangles", monospace';
+let loadedLangKey: string | null = null;
+function applyLangFont(lang: string) {
+ const root = document.documentElement;
+ const key = lang.split("-")[0];
+ if (loadedLangKey) {
+ const old = document.querySelector(
+ `style[data-lang-font="${loadedLangKey}"]`,
+ );
+ if (old) old.remove();
+ loadedLangKey = null;
+ }
+
+ const fontPath = LANG_FONTS[key];
+ if (!fontPath) {
+ root.style.setProperty("--font-base", BASE_FONT);
+ return;
+ }
+
+ const family = `"${key}-lang"`;
+ loadedLangKey = key;
+ const style = document.createElement("style");
+ style.dataset.langFont = key;
+ style.textContent = `@font-face { font-family: ${family}; src: url("${fontPath}") format("truetype"); font-weight: normal; font-style: normal; }`;
+ document.head.appendChild(style);
+ root.style.setProperty("--font-base", `${family}, ${BASE_FONT}`);
+}
+
+i18n.on("languageChanged", applyLangFont);
+export { LANG_FONTS, applyLangFont };
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
new file mode 100644
index 0000000..e3b0495
--- /dev/null
+++ b/src/i18n/locales/ru.json
@@ -0,0 +1,773 @@
+{
+ "common": {
+ "back": "Назад",
+ "done": "Готово",
+ "cancel": "Отменить",
+ "save": "Сохранить",
+ "delete": "Удалить",
+ "ok": "ОК",
+ "next": "След.",
+ "finish": "Конец",
+ "error": "Ошибка!",
+ "on": "ON",
+ "off": "OFF",
+ "enabled": "Включено",
+ "disabled": "Выключено",
+ "none": "Нет",
+ "unknown": "Неизвестно",
+ "all": "Все",
+ "noResults": "Без результатов",
+ "set": "Поставить"
+ },
+ "header": {
+ "title": "Emerald Legacy Launcher"
+ },
+ "download": {
+ "title": "Загрузки",
+ "gameFiles": "Файлы игры",
+ "updateAvailable": "Доступно обновление!",
+ "gameUpdateAvailable": "Доступно обновление игры!",
+ "steamIntegration": "Интеграция Steam",
+ "friendRequest": "Заявки в друзья",
+ "gameInvite": "Приглашение в игру"
+ },
+ "app": {
+ "day": "День",
+ "night": "Ночь",
+ "toggleTime": "Установить время",
+ "swfEditor": "SWF Редактор",
+ "controllerConnected": "ГЕЙМПАД ПОДКЛЮЧЕН",
+ "welcome": "Добро пожаловать {{name}}!",
+ "version": "Версия: {{version}}"
+ },
+ "home": {
+ "installVersion": "Установить версию",
+ "stopGame": "Закрыть игру",
+ "installing": "В процессе установки...",
+ "playGame": "Запустить игру",
+ "downloadVersion": "Скачать {{name}}",
+ "helpAndOptions": "Помощь & Настройки",
+ "versions": "Версии",
+ "workshop": "Мастерская",
+ "developerTools": "Инструменты разработчика"
+ },
+ "settings": {
+ "audio": "Аудио",
+ "video": "Видео",
+ "launcher": "Лаунчер",
+ "game": "Игра",
+ "credits": "Титры",
+ "controls": "Управление",
+ "plugins": "Плагины",
+ "android": "Андроид",
+ "music": "Музыка: {{value}}%",
+ "sound": "Звук: {{value}}%",
+ "clickEffects": "Эффекты от нажатия",
+ "animations": "Анимации",
+ "appleSiliconPerfBoost": "Улучшение производительности на Apple Silicon",
+ "extraLaunchArgs": "Дополнительные арг. запуска",
+ "extraLaunchArgsDesc": "Арг. разделённые пробелом вписанные в зап. файл",
+ "launchPrefix": "Префикс запуска",
+ "launchPrefixDesc": "Команда для обёртки запуска (нап. gamemoderun)",
+ "launchEnvVars": "Переменные окружения",
+ "launchEnvVarsDesc": "По одной паре КЛЮЧ=ЗНАЧЕНИЕ на строку",
+ "startInFullscreen": "Запустить на полный экран",
+ "discordRpc": "Интеграция Discord",
+ "skipIntro": "Пропустить заставку",
+ "legacyMode": "Легаси-режим",
+ "runner": "Среда запуска",
+ "mangohud": "MangoHud",
+ "downloadRunner": "Скачать GE-Proton (Рекомендуется)",
+ "downloadingRunner": "Загрузка среды запуска... {{progress}}%",
+ "exportSettings": "Экспорт настроек",
+ "importSettings": "Импорт настроек",
+ "resetSetup": "Сбросить настройки",
+ "languages": "Языки",
+ "stopGameButton": "ЗАКРЫТЬ ИГРУ",
+ "noPluginsInstalled": "Плагины не установлены",
+ "byAuthor": "от {{author}}",
+ "containerSettings": "Настройки контейнера",
+ "openContainer": "Открыть контейнер",
+ "androidAudio": "Аудио: {{backend}}"
+ },
+ "reset": {
+ "title": "Сбросить настройку",
+ "confirm": "Вы уверены, что хотите сбросить настройки лаунчера?",
+ "confirmTitle": "ПОДТВЕРДИТЕ СБРОС",
+ "warning": "⚠️ Это действие:",
+ "clearAllSettings": "Очистит все настройки лаунчера",
+ "resetUsername": "Сбросит ваше имя пользователя",
+ "showSetupAgain": "Снова отобразит экран первичной настройки",
+ "requireReconfiguration": "Потребует повторной конфигурации",
+ "cannotBeUndone": "Это действие нельзя будет отменить!"
+ },
+ "setup": {
+ "letsConfigure": "Давайте настроим ваш лаунчер",
+ "compatibilityRuntime": "Среда совместимости",
+ "choosePreferredOptions": "Выберите предпочитаемые параметры и поведение",
+ "username": "Имя пользователя",
+ "enterUsername": "Введите имя пользователя",
+ "usernameRequired": "Для продолжения необходимо ввести имя пользователя",
+ "runtimeDetected": "Среда совместимости обнаружена",
+ "runtimeNotDetected": "Среда совместимости не обнаружена",
+ "gptInstalled": "Установлены Game Porting Toolkit 3 и Wine",
+ "mustInstallRuntime": "Вы должны установить среду совместимости перед продолжением.",
+ "installRuntime": "Установить среду совместимости",
+ "reinstallRuntime": "Переустановить среду совместимости",
+ "noCompatibleRunners": "Совместимые среды запуска не найдены. Пожалуйста, установите Wine или Proton.",
+ "changeLaterInSettings": "Вы сможете изменить это позже в настройках",
+ "windowsNativeSupport": "Нативная поддержка Windows",
+ "windowsNativeDesc": "Emerald Legacy работает на Windows нативно и не требует дополнительных компонентов.",
+ "diamondRuntimeSupport": "Поддержка DiamondRuntime",
+ "diamondRuntimeDesc": "Emerald Launcher работает на Android нативно и не требует дополнительных компонентов. Работает на базе нашего собственного DiamondRuntime.",
+ "setupComplete": "Emerald Launcher успешно настроен и готов к работе!",
+ "discordRpc": "Discord RPC",
+ "animations": "Анимации",
+ "changeTheseLater": "Вы сможете изменить это позже в настройках",
+ "ready": "Готово",
+ "installing": "Установка...",
+ "runtime": "Среда совместимости",
+ "runner": "Среда запуска",
+ "macosPreparing": "Подготовка к настройке среды совместимости macOS...",
+ "macosCompleted": "Настройка успешно завершена!",
+ "macosFailed": "Ошибка настройки: {{error}}"
+ },
+ "versions": {
+ "title": "Версии",
+ "custom": "Кастомные",
+ "updateAvailable": "Доступно обновление!",
+ "downloadToCustomPath": "Скачать в указанную папку",
+ "downloadDlc": "Скачать DLC",
+ "options": "Параметры",
+ "channel": "Канал",
+ "latest": "Последняя",
+ "openFolder": "Открыть папку",
+ "addToSteam": "Добавить в Steam",
+ "importWorld": "Импортировать мир",
+ "backup": "Резервная копия",
+ "restore": "Восстановить",
+ "customize": "Настроить",
+ "setUid": "Установить UID",
+ "editCustom": "Изменить кастомную",
+ "removeCustom": "Удалить кастомную",
+ "uninstall": "Удалить",
+ "viewPlaytime": "Время в игре",
+ "invalidDirectory": "Неверная папка",
+ "selectEmptyDirectory": "Пожалуйста, выберите пустую папку для установки.",
+ "deleteTitle": "Удалить {{name}}?",
+ "deleteWarning": "Внимание: все ваши сохранения и миры для этой версии будут удалены навсегда!"
+ },
+ "lceOnline": {
+ "hostGame": "Создать игру",
+ "stopHosting": "Закрыть игру",
+ "addFriend": "Добавить друга",
+ "signOut": "Выйти",
+ "awaitingAuthentication": "Ожидание авторизации...",
+ "friends": "Друзья",
+ "invites": "Приглашения",
+ "requests": "Запросы",
+ "pendingRequests": "Исходящие запросы",
+ "noneAvailable": "Нет доступных",
+ "invite": "Пригласить",
+ "remove": "Удалить",
+ "cancel": "Отмена",
+ "accept": "Принять",
+ "decline": "Отклонить",
+ "username": "Имя пользователя",
+ "send": "Отправить",
+ "error": "Ошибка",
+ "ok": "OK",
+ "failedToStartHosting": "Не удалось создать игру",
+ "anErrorOccurred": "Произошла ошибка"
+ },
+ "devtools": {
+ "comingSoon": "Скоро",
+ "tools": {
+ "guides": "Руководства",
+ "pck": "Редактор PCK",
+ "arc": "Редактор ARC",
+ "loc": "Редактор LOC",
+ "grf": "Редактор GRF",
+ "col": "Редактор COL",
+ "options": "Редактор параметров",
+ "model": "Редактор моделей"
+ }
+ },
+ "guides": {
+ "communityGuides": "Руководства сообщества",
+ "loadingGuide": "Загрузка руководства...",
+ "backToGuides": "← Назад к руководствам",
+ "loadingGuides": "Загрузка руководств...",
+ "failedToLoadGuides": "Не удалось загрузить руководства",
+ "noGuidesFound": "Руководства не найдены"
+ },
+ "skins": {
+ "skinLibrary": "Библиотека скинов",
+ "capeLibrary": "Библиотека плащей",
+ "importSkin": "Импортировать скин",
+ "importCape": "Импортировать плащ",
+ "deleteSkin": "Удалить скин",
+ "deleteCape": "Удалить плащ",
+ "editSkin": "Изменить скин",
+ "switchToCape": "Переключить на плащ",
+ "switchToSkin": "Переключить на скин",
+ "failedToFetch": "Не удалось загрузить данные",
+ "active": "Активен",
+ "slim": "Тонкий",
+ "noCape": "Без плаща",
+ "fromFile": "Из файла",
+ "fromUsername": "По имени пользователя",
+ "minecraftUsername": "Имя пользователя Minecraft",
+ "fetching": "Загрузка...",
+ "fetch": "Загрузить {{type}}",
+ "chooseModelType": "Выберите тип модели игрока для этого скина",
+ "normalWideArms": "Обычная (широкие руки)",
+ "slimThinArms": "Тонкая (узкие руки)"
+ },
+ "skinEditor": {
+ "title": "Редактор скинов",
+ "pencil": "Карандаш",
+ "eraser": "Ластик",
+ "pick": "Пипетка",
+ "fill": "Заливка",
+ "color": "Цвет",
+ "alpha": "Прозрачность",
+ "alex": "Алекс",
+ "steve": "Стив",
+ "grid": "Сетка",
+ "undo": "Отменить",
+ "save": "Сохранить",
+ "export": "Экспорт",
+ "back": "Назад",
+ "customSkin": "Пользовательский скин",
+ "exportSkin": "Экспортировать скин"
+ },
+ "goldMapper": {
+ "controller": "Геймпад",
+ "mouse": "Мышь",
+ "keyboard": "Клавиатура",
+ "leftClick": "Левый клик",
+ "middleClick": "Средний клик",
+ "rightClick": "Правый клик",
+ "resetToDefaults": "Сбросить по умолчанию",
+ "enableGoldMapper": "Включить GoldMapper",
+ "back": "Назад",
+ "assign": "Назначить {{name}}",
+ "typeKeyName": "Введите название клавиши и нажмите Enter",
+ "unknownKeyName": "Неизвестное название клавиши",
+ "cancel": "Отмена"
+ },
+ "locEditor": {
+ "title": "Редактор LOC",
+ "editingLoadedLoc": "редактирование загруженного файла loc",
+ "openLoc": "Открыть LOC",
+ "saveLoc": "Сохранить LOC",
+ "openToBegin": "Открыть файл LOC, чтобы начать редактирование",
+ "loaded": "Загружен {{name}}",
+ "failedToParse": "Не удалось прочитать LOC",
+ "savedSuccessfully": "Файл LOC успешно сохранён",
+ "stringAdded": "Строка добавлена",
+ "stringUpdated": "Строка обновлена",
+ "stringDeleted": "Строка удалена",
+ "static": "Статическая",
+ "keyed": "Именованная (Keyed)",
+ "searchStrings": "Поиск строк...",
+ "addString": "Добавить строку",
+ "keyOrIndex": "Ключ / Индекс",
+ "value": "Значение",
+ "actions": "Действия",
+ "edit": "Изменить",
+ "back": "Назад",
+ "stringTitle": "Строка",
+ "add": "Добавить",
+ "stringKey": "Ключ строки",
+ "staticEntry": "Статическая запись — Индекс: {{index}}",
+ "stringValue": "Значение строки",
+ "cancel": "Отмена",
+ "save": "Сохранить"
+ },
+ "grfEditor": {
+ "title": "Редактор GRF",
+ "editing": "редактирование:",
+ "newGrf": "Новый GRF",
+ "openGrf": "Открыть GRF",
+ "saveGrf": "Сохранить GRF",
+ "openToBegin": "Открыть файл GRF, чтобы начать редактирование",
+ "gameRules": "Игровые правила",
+ "files": "Файлы ({{count}})",
+ "noRulesFound": "Правила не найдены",
+ "addFile": "Добавить файл",
+ "filename": "Имя файла",
+ "size": "Размер",
+ "actions": "Действия",
+ "noFilesInGrf": "В файле GRF нет файлов",
+ "delete": "Удалить",
+ "back": "Назад",
+ "loaded": "Загружен {{name}}",
+ "failedToParse": "Не удалось прочитать GRF",
+ "newGrfCreated": "Новый GRF создан",
+ "added": "Добавлен {{name}}",
+ "removed": "Удален {{name}}",
+ "savedSuccessfully": "Файл GRF успешно сохранён",
+ "failedToSave": "Не удалось сохранить GRF",
+ "props": "[Свойств: {{count}}]"
+ },
+ "optionsEditor": {
+ "title": "Редактор параметров",
+ "openSettings": "Открыть settings.dat",
+ "saveSettings": "Сохранить settings.dat",
+ "openToBegin": "Открыть settings.dat, чтобы начать",
+ "tabSettings": "Настройки",
+ "tabSkins": "Скины",
+ "tabActions": "Действия",
+ "chosenSkinId": "ID выбранного скина",
+ "playerCapeId": "ID плаща игрока",
+ "favoriteSkins": "Избранные скины",
+ "back": "Назад",
+ "loaded": "Загружен options.dat",
+ "failedToParse": "Не удалось прочитать параметры",
+ "saved": "Параметры сохранены",
+ "failedToSave": "Не удалось сохранить"
+ },
+ "swfEditor": {
+ "title": "Редактор SWF",
+ "openSwf": "Открыть SWF",
+ "saveSwf": "Сохранить SWF",
+ "openToBegin": "Открыть файл SWF, чтобы начать редактирование",
+ "searchAssets": "Поиск ресурсов...",
+ "selectImageViewDetails": "Выберите изображение для просмотра сведений",
+ "characterId": "ID персонажа:",
+ "type": "Тип:",
+ "size": "Размер:",
+ "loadingPreview": "Загрузка предпросмотра...",
+ "exportBitmap": "Экспортировать растр (Bitmap)",
+ "replaceBitmap": "Заменить растр (Bitmap)",
+ "back": "Назад",
+ "loaded": "Загружен {{name}}",
+ "failedToProcess": "Не удалось обработать SWF",
+ "exported": "Экспортировано: {{name}}",
+ "imageReplaced": "Изображение заменено",
+ "savedSuccessfully": "Файл SWF успешно сохранён"
+ },
+ "colEditor": {
+ "title": "Редактор COL",
+ "version": "Версия:",
+ "openCol": "Открыть COL",
+ "saveCol": "Сохранить COL",
+ "openToBegin": "Открыть файл COL, чтобы начать редактирование",
+ "colors": "Цвета ({{count}})",
+ "worldColors": "Цвета мира ({{count}})",
+ "searchColors": "Поиск цветов...",
+ "addColor": "Добавить цвет",
+ "addWorldColor": "Добавить цвет мира",
+ "name": "Имя",
+ "color": "Цвет (ARGB)",
+ "water": "Вода (ARGB)",
+ "underwater": "Под водой (ARGB)",
+ "fog": "Туман (ARGB)",
+ "remove": "Удалить",
+ "back": "Назад",
+ "loaded": "Загружен {{name}}",
+ "failedToParse": "Не удалось прочитать COL",
+ "savedSuccessfully": "Файл COL успешно сохранён",
+ "failedToSave": "Не удалось сохранить COL",
+ "colorAdded": "Цвет добавлен",
+ "worldColorAdded": "Цвет мира добавлен"
+ },
+ "workshop": {
+ "tabs": {
+ "skin": "Скины",
+ "texture": "Текстуры",
+ "world": "Миры",
+ "mod": "Моды",
+ "dlc": "DLC",
+ "plugins": "Плагины",
+ "versions": "Версии",
+ "installed": "Установленные",
+ "search": "Поиск",
+ "server": "Серверы",
+ "serverPlugins": "Плагины сервера"
+ },
+ "filterInstalled": "ФИЛЬТР УСТАНОВЛЕННЫХ...",
+ "filterVersions": "ФИЛЬТР ВЕРСИЙ...",
+ "filterPlugins": "ФИЛЬТР ПЛАГИНОВ...",
+ "filterServers": "ФИЛЬТР СЕРВЕРОВ...",
+ "enterKeywords": "ВВЕДИТЕ КЛЮЧЕВЫЕ СЛОВА...",
+ "startTypingToSearch": "Начните вводить для поиска...",
+ "searchingArchives": "Поиск в архивах...",
+ "nothingInstalled": "Ничего не установлено",
+ "noPluginsAvailable": "Нет доступных плагинов",
+ "noServersAvailable": "Нет доступных серверов",
+ "emptyCategory": "Категория пуста",
+ "noImage": "Нет изображения",
+ "updateAll": "Обновить все ({{count}})",
+ "reinstallAll": "Переустановить все ({{count}})",
+ "update": "Обновить",
+ "installed": "Установлено",
+ "added": "Добавлено",
+ "install": "УСТАНОВИТЬ",
+ "reinstall": "ПЕРЕУСТАНОВИТЬ",
+ "add": "ДОБАВИТЬ",
+ "download": "СКАЧАТЬ",
+ "remove": "УДАЛИТЬ",
+ "byAuthor": "От {{author}}",
+ "updateAvailable": "Доступно обновление",
+ "saved": "Сохранено",
+ "back": "Назад",
+ "failedToLoadRegistry": "Не удалось загрузить реестр",
+ "saveServerPlugin": "Сохранить плагин сервера",
+ "details": "Подробнее",
+ "metadata": "Метаданные",
+ "address": "Адрес:",
+ "type": "Тип:",
+ "version": "Версия:",
+ "owner": "Владелец:",
+ "discordServer": "Сервер Discord:",
+ "downloads": "Скачивания:",
+ "likes": "Лайки:",
+ "serverType": "Тип сервера:",
+ "file": "Файл:",
+ "fileSize": "Размер файла:",
+ "github": "GitHub:",
+ "packageId": "ID пакета:",
+ "outdated": " (устарело)",
+ "categories": "Категории",
+ "requiredDependencies": "Необходимые зависимости",
+ "installedSuffix": " (установлено)",
+ "requiredEditions": "Необходимые издания",
+ "files": "Файлы",
+ "splitArchive": "Разделённый архив · {{count}} ч.",
+ "dependenciesRequired": "Требуются зависимости",
+ "dependenciesRequiredDesc": "Этот пакет требует предварительной установки следующих компонентов",
+ "dependenciesAutoInstall": "Они будут установлены автоматически перед основным пакетом.",
+ "installPluginTitle": "УСТАНОВКА ПЛАГИНА",
+ "installContentTitle": "УСТАНОВКА КОНТЕНТА",
+ "installingPackage": "Установка «{{name}}»",
+ "targetEdition": "Целевое издание для «{{name}}»",
+ "installingDependencies": "Установка зависимостей...",
+ "installing": "Установка...",
+ "downloadingPluginFiles": "Скачивание файлов плагина...",
+ "downloadingDependencies": "Скачивание и извлечение необходимых зависимостей...",
+ "downloadingAssets": "Скачивание и извлечение ресурсов...",
+ "requestedPermissions": "Запрошенные разрешения",
+ "installedSuccessfully": "Успешно установлено!",
+ "pressAnyKeyToContinue": "Нажмите любую клавишу или кликните для продолжения",
+ "installationFailed": "Ошибка установки",
+ "retry": "Повторить",
+ "noInstalledEditions": "Установленные издания не найдены",
+ "removePluginTitle": "УДАЛЕНИЕ ПЛАГИНА",
+ "removeContentTitle": "УДАЛЕНИЕ КОНТЕНТА",
+ "removePackage": "Удалить «{{name}}»",
+ "selectEditionToRemove": "Выберите издание, чтобы удалить «{{name}}»",
+ "removing": "Удаление...",
+ "deletingFiles": "Удаление установленных файлов...",
+ "removedSuccessfully": "Успешно удалено!",
+ "removalFailed": "Ошибка удаления"
+ },
+ "screenshots": {
+ "title": "Скриншоты",
+ "noScreenshots": "Скриншоты не найдены",
+ "takeInGameWithF2": "Сделайте парочку в игре с помощью F2",
+ "openFolder": "ОТКРЫТЬ ПАПКУ",
+ "delete": "УДАЛИТЬ",
+ "close": "ЗАКРЫТЬ",
+ "scanning": "Сканирование архивов...",
+ "capturedOn": "Снято: {{date}}",
+ "deleteConfirm": "Вы уверены, что хотите удалить этот скриншот?"
+ },
+ "pckEditor": {
+ "openPck": "Открыть PCK",
+ "newPck": "Новый PCK",
+ "exportAll": "Экспортировать всё",
+ "savePck": "Сохранить PCK",
+ "searchAssets": "Поиск ресурсов...",
+ "addAsset": "Добавить ресурс",
+ "selectAsset": "Выберите ресурс для просмотра сведений",
+ "metadataProperties": "Свойства метаданных",
+ "addProperty": "+ Добавить свойство",
+ "remove": "Удалить",
+ "export": "Экспорт",
+ "replace": "Заменить",
+ "renameAsset": "Переименовать ресурс (Путь)",
+ "deleteAsset": "Удалить этот ресурс",
+ "selectAssetType": "Выберите тип ресурса",
+ "rename": "Переименовать",
+ "assetRenamed": "Ресурс переименован",
+ "exportingAllAssets": "Экспорт всех ресурсов...",
+ "allAssetsExported": "Все ресурсы экспортированы",
+ "exportFailed": "Ошибка экспорта",
+ "pckSaved": "Файл PCK успешно сохранён",
+ "newPckCreated": "Новый PCK создан",
+ "title": "Редактор PCK",
+ "openToBegin": "Открыть файл PCK, чтобы начать редактирование",
+ "endianness": "Порядок байтов (Endianness):",
+ "xmlSupport": "Поддержка XML:",
+ "enabled": "Включено",
+ "disabled": "Выключено",
+ "version": "Версия:",
+ "exportAssetDialog": "Экспортировать ресурс",
+ "savePckDialog": "Сохранить PCK",
+ "failedToParse": "Не удалось прочитать PCK",
+ "exported": "Экспортировано: {{name}}",
+ "deleted": "Удалено: {{name}}",
+ "assetReplaced": "Ресурс заменён",
+ "assetAdded": "Ресурс добавлен",
+ "noMetadataProperties": "Нет свойств метаданных",
+ "view3dSkin": "3D-просмотр скина",
+ "view3dCape": "3D-просмотр плаща",
+ "texturePreview": "Предпросмотр текстуры",
+ "back": "Назад",
+ "renameTitle": "Переименовать ресурс",
+ "newAssetPath": "Новый путь к ресурсу",
+ "cancel": "Отмена"
+ },
+ "modelEditor": {
+ "title": "Редактор моделей",
+ "import": "Импорт",
+ "export": "Экспорт",
+ "save": "Сохранить",
+ "bounds": "Границы (Bounds)",
+ "importToBegin": "Импортируйте файл .bbmodel или .json, чтобы начать",
+ "startDefaultModel": "Начать с модели по умолчанию",
+ "models": "Модели ({{count}})",
+ "add": "+ Добавить",
+ "remove": "Удалить",
+ "edit": "Изменить",
+ "parts": "Части ({{count}})",
+ "boxes": "Кубы/Хитбоксы ({{count}})",
+ "box": "Куб {{index}}",
+ "textures": "Текстуры ({{count}})",
+ "noTextures": "Нет текстур",
+ "selectModel": "Выберите модель для предпросмотра",
+ "back": "Назад",
+ "editPart": "Изменить часть",
+ "name": "Имя",
+ "translation": "Смещение (Translation)",
+ "editBox": "Изменить куб",
+ "position": "Позиция",
+ "size": "Размер",
+ "uvOffset": "UV-смещение",
+ "inflate": "Растяжение (Inflate)",
+ "mirrorUv": "Отразить UV",
+ "cancel": "Отмена",
+ "save": "Сохранить",
+ "imported": "Импортировано: {{name}}",
+ "loadedModels": "Загружено моделей: {{count}}",
+ "failedToParse": "Не удалось прочитать",
+ "addedTexture": "Добавлена текстура: {{name}}",
+ "created": "Создано: {{name}}",
+ "exported": "Экспортировано: {{name}}",
+ "exportFailed": "Ошибка экспорта",
+ "modelDeleted": "Модель удалена"
+ },
+ "arcEditor": {
+ "openArc": "Открыть ARC",
+ "exportAll": "Экспортировать всё",
+ "saveArc": "Сохранить ARC",
+ "openArcFile": "Открыть файл ARC, чтобы начать редактирование",
+ "archive": "Архив",
+ "languagesLoc": "Языки (LOC)",
+ "searchEntries": "Поиск записей...",
+ "addEntry": "Добавить запись",
+ "entryDetails": "Сведения о записи",
+ "exportFile": "Экспортировать файл",
+ "replaceData": "Заменить данные",
+ "renamePath": "Переименовать / Путь",
+ "deleteEntry": "Удалить запись",
+ "zlibCompressed": "Сжато ZLIB",
+ "uncompressed": "Без сжатия",
+ "noLocFound": "Файл languages.loc не найден в архиве",
+ "createLoc": "Создать languages.loc",
+ "writeToArc": "Записать в ARC",
+ "addString": "Добавить строку",
+ "title": "Редактор ARC",
+ "size": "Размер",
+ "format": "Формат",
+ "compressed": "Сжато",
+ "raw": "Сырые данные (Raw)",
+ "selectEntry": "Выберите запись для просмотра сведений",
+ "zlib": "ZLIB",
+ "searchStrings": "Поиск строк...",
+ "keyOrIndex": "Ключ / Индекс",
+ "value": "Значение",
+ "actions": "Действия",
+ "edit": "Изменить",
+ "static": "Статическая",
+ "keyed": "Именованная (Keyed)",
+ "back": "Назад",
+ "saveArcDialog": "Сохранить ARC",
+ "exportAssetDialog": "Экспортировать ресурс",
+ "loaded": "Загружен {{name}}",
+ "failedToParse": "Не удалось прочитать ARC",
+ "arcSaved": "Файл ARC успешно сохранён",
+ "saveFailed": "Ошибка сохранения",
+ "extracted": "Извлечено: {{name}}",
+ "extractionFailed": "Ошибка извлечения",
+ "deleted": "Удалено: {{name}}",
+ "locUpdatedInArchive": "Файл languages.loc обновлён в архиве",
+ "locAddedToArchive": "Файл languages.loc добавлен в архив",
+ "entryAdded": "Запись добавлена",
+ "entryReplaced": "Запись заменена",
+ "entryRenamed": "Запись переименована",
+ "stringAdded": "Строка добавлена",
+ "stringUpdated": "Строка обновлена",
+ "stringDeleted": "Строка удалена",
+ "exportingAll": "Экспорт всех записей архива...",
+ "allEntriesExported": "Все записи экспортированы",
+ "exportFailed": "Ошибка экспорта",
+ "compressionEnabled": "Сжатие включено",
+ "compressionDisabled": "Сжатие выключено",
+ "createdNewLocaleStructure": "Создана новая структура локализации",
+ "addFileToArchive": "Добавить файл в архив",
+ "selectSourceFile": "Выберите исходный файл",
+ "cancel": "Отмена",
+ "replaceFileData": "Заменить данные файла",
+ "selectNewFile": "Выберите новый файл",
+ "renameEntry": "Переименовать запись",
+ "newArchivePath": "Новый путь в архиве",
+ "markAsCompressed": "Пометить как сжатый (zlib)",
+ "rename": "Переименовать",
+ "stringTitle": "Строка",
+ "add": "Добавить",
+ "stringKey": "Ключ строки",
+ "staticEntry": "Статическая запись — Индекс: {{index}}",
+ "stringValue": "Значение строки",
+ "save": "Сохранить"
+ },
+ "credits": {
+ "backToMenu": "Назад в меню"
+ },
+ "modals": {
+ "downloadDlc": {
+ "title": "Скачать DLC",
+ "loading": "Загрузка доступных DLC...",
+ "noneFound": "Папки DLC не найдены в репозитории.",
+ "available": "Доступно: {{count}}",
+ "all": "Все",
+ "none": "Ни одного",
+ "download": "Скачать ({{count}})",
+ "done": "Готово",
+ "close": "Закрыть",
+ "downloaded": "Скачано {{downloaded}}/{{selected}}",
+ "failedToDownload": "Не удалось скачать {{name}}: {{reason}}"
+ },
+ "gameLog": {
+ "title": "Лог вылета игры",
+ "saveDialog": "Сохранить лог игры",
+ "saveAsFile": "Сохранить как файл",
+ "copy": "Копировать",
+ "close": "Закрыть",
+ "saved": "Сохранено!",
+ "failedToSave": "Не удалось сохранить.",
+ "copied": "Скопировано в буфер обмена!",
+ "failedToCopy": "Не удалось скопировать.",
+ "showingLast": "Отображаются последние {{shown}} строк из {{total}}."
+ },
+ "setUid": {
+ "title": "Установить UID",
+ "manual": "Вручную",
+ "copy": "Копировать",
+ "enterUid": "Введите UID",
+ "selectInstance": "Выберите установленную копию",
+ "selectPlaceholder": "-- Выберите копию игры --",
+ "noInstances": "Других установленных копий игры не найдено.",
+ "selectToCopy": "Выберите копию, из которой нужно скопировать данные.",
+ "sourceNoUid": "В исходной копии отсутствует uid.dat или его не удалось прочитать.",
+ "uidEmpty": "UID не может быть пустым.",
+ "cancel": "Отмена",
+ "save": "Сохранить"
+ },
+ "playtime": {
+ "title": "Время в игре",
+ "loading": "Загрузка...",
+ "total": "Всего",
+ "thisWeek": "На этой неделе",
+ "today": "Сегодня",
+ "dailyBreakdown": "Статистика по дням",
+ "failedToLoad": "Не удалось загрузить данные о времени в игре.",
+ "close": "Закрыть"
+ },
+ "customize": {
+ "title": "Кастомизация",
+ "titleImage": "Логотип игры (Title Image)",
+ "panoramaBackground": "Панорамный фон",
+ "changeImage": "Изменить изображение",
+ "pickImage": "Выбрать изображение",
+ "reset": "Сбросить",
+ "preview": "Предпросмотр",
+ "selectTitleImage": "Выберите логотип игры",
+ "selectPanorama": "Выберите панорамный фон",
+ "cancel": "Отмена",
+ "save": "Сохранить"
+ },
+ "chooseInstance": {
+ "title": "Присоединиться к игре",
+ "joiningTitle": "Подключение к игре",
+ "joinPrompt": "Подключение к игре пользователя {{name}}. Выберите копию игры:",
+ "join": "Войти",
+ "cancel": "Отмена",
+ "noInstances": "Нет установленных копий. Сначала установите версию игры.",
+ "launching": "Запуск игры...",
+ "connectingRelay": "Подключение через ретранслятор (Relay)..."
+ },
+ "importWorld": {
+ "title": "Импортировать мир",
+ "importingTitle": "Импорт мира",
+ "importInto": "Импортировать в:",
+ "importMsPrompt": "Импортировать существующий файл сохранения .ms:",
+ "selectMsFile": "Выбрать файл .ms",
+ "convertConsolePrompt": "Конвертировать сохранение с Xbox 360 или PS3:",
+ "xbox360": "Xbox 360 (.bin)",
+ "ps3Folder": "PS3 (Папка с сохранением)",
+ "javaConversionPrompt": "Конвертация мира Java Edition:",
+ "javaToLce": "Java → LCE",
+ "lceToJava": "LCE → Java",
+ "cancel": "Cancel",
+ "selectingSource": "Выбор источника...",
+ "selectingMsFile": "Выбор файла saveData.ms...",
+ "copyingLceSave": "Копирование сохранения LCE...",
+ "worldImported": "Мир успешно импортирован в «{{name}}»!",
+ "selectingXboxSave": "Выбор сохранения Xbox 360 (.bin)...",
+ "convertingXbox": "Конвертация сохранения Xbox 360...",
+ "xboxConverted": "Сохранение Xbox 360 сконвертировано в «{{name}}»!",
+ "selectingPs3Folder": "Выбор папки с сохранением PS3...",
+ "convertingPs3": "Конвертация сохранения PS3...",
+ "ps3Converted": "Сохранение PS3 сконвертировано в «{{name}}»!",
+ "selectingJavaFolder": "Выбор папки мира Java...",
+ "convertingJava": "Конвертация мира Java в формат LCE...",
+ "javaConverted": "Мир Java сконвертирован в «{{name}}»!",
+ "selectingOutputFolder": "Выбор папки для экспорта мира Java...",
+ "convertingLceToJava": "Конвертация сохранения LCE в мир Java...",
+ "javaExported": "Мир Java успешно экспортирован в «{{path}}»!"
+ },
+ "customTu": {
+ "importTitle": "Импортировать кастомное TU",
+ "editTitle": "Изменить кастомное TU",
+ "tuName": "Название TU",
+ "description": "Описание (Необязательно)",
+ "downloadUrl": "Ссылка на скачивание (.zip)",
+ "localPath": "Локальный путь",
+ "namePlaceholder": "например, Мой крутой мод",
+ "descPlaceholder": "Краткое описание...",
+ "urlPlaceholder": "необязательно, если указан локальный путь",
+ "nameRequired": "Необходимо указать название",
+ "urlOrPathRequired": "Необходимо указать ссылку или локальный путь",
+ "invalidUrl": "Неверная ссылка",
+ "defaultDesc": "Пользовательское импортированное TU",
+ "cancel": "Отмена",
+ "save": "Сохранить",
+ "import": "Импортировать"
+ },
+ "options": {
+ "title": "Параметры",
+ "general": "Общие",
+ "loading": "Загрузка параметров...",
+ "reset": "Сбросить",
+ "cancel": "Отмена",
+ "save": "Сохранить",
+ "ok": "OK",
+ "noSchema": "Эта копия игры не предоставляет схему параметров запуска.",
+ "invalidSchema": "Схема параметров запуска неверна или не поддерживается."
+ }
+ }
+}
diff --git a/src/pages/App.tsx b/src/pages/App.tsx
index 22ae772..61d82c0 100644
--- a/src/pages/App.tsx
+++ b/src/pages/App.tsx
@@ -344,7 +344,7 @@ export default function App() {
if (showSetup) {
return (
{showHeader && (
@@ -376,7 +376,7 @@ export default function App() {
if (showIntro && !config.skipIntro) {
return (
{
@@ -391,7 +391,7 @@ export default function App() {
return (
@@ -638,7 +638,7 @@ export default function App() {
titleImage === "/images/MenuTitle.png" && (
{selectedVersionName}
@@ -747,7 +747,7 @@ export default function App() {