Release Build v2.2.0 (#236)

* fix: resolve cross-platform EPERM permissions errors

modManager.js:
- Switch from hardcoded 'junction' to dynamic symlink type based on OS (fixing Linux EPERM).
- Add retry logic for directory removal to handle file locking race conditions.
- Improve broken symlink detection during profile sync.

gameManager.js:
- Implement retry loop (3 attempts) for game directory removal in updateGameFiles to prevent EBUSY/EPERM errors on Windows.

paths.js:
- Prevent fs.mkdirSync failure in getModsPath by pre-checking for broken symbolic links.

* fix: missing pacman builds

* prepare release for 2.1.1

minor fix for EPERM error permission

* prepare release 2.1.1

minor fix EPERM permission error

* prepare release 2.1.1

* Update README.md Windows Prequisites for ARM64 builds

* fix: remove broken symlink after detected

* fix: add pathexists for paths.js to check symlink

* fix: isbrokenlink should be true to remove the symlink

* add arch package .pkg.tar.zst for release

* fix: release workflow for build-arch and build-linux

* build-arch job now only build arch .pkg.tar.zst package instead of the whole generic linux.
* build-linux job now exclude .pacman package since its deprecated and should not be used.

* fix: removes pacman build as it replaced by tar.zst and adds build:arch shortcut for pkgbuild

* aur: add proper VCS (-git) PKGBUILD

created clean VCS-based PKGBUILD following arch packaging conventions.

this explicitly marked as a rolling (-git) build and derives its version dynamically from git tags and commit history via pkgver(). previous hybrid approach has been changed.

key changes:
- use -git suffix to clearly indicate rolling source builds
- set pkgver=0 and compute the actual version via pkgver()
- build only a directory layout using electron-builder (--dir)
- avoid generating AppImage, deb, rpm, or pacman installers
- align build and package steps with Arch packaging guidelines

note: this PKGBUILD is intended for development and AUR use only and is not suitable for binary redistribution or release artifacts.

* ci: add fixed-version PKGBUILD for Arch Linux releases

this PKGBUILD intended for CI and GitHub release artifacts. targets tagged releases only and uses a fixed pkgver that matches the corresponding git tag. all of the VCS logic has been removed to PKGBUILD-git to ensure reproducible builds and stable versioning suitable for binary distribution.

the build process relies on electron-builder directory output (--dir) and packages only the unpacked application into a standard Arch Linux package (.pkg.tar.zst). other distro format are excluded from this path and handled separately.

this change establishes a clear separation between:
- rolling AUR development builds (-git)
- CI-generated, versioned Arch Linux release packages

the result is predictable artifact naming, correct version alignment, and Arch-compliant packaging for downstream users.

* Update README.md

adds information for Arch build

* Update README.md

BUILD.md location was changed and now this link is poiting to nothing

* Update PKGBUILD

* Update PKGBUILD-git

* chore: fix ubuntu/debian part in README.md

* Polish language support (#195)

* Update support_request.yml

Added hardware specification

* Update bug_report.yml

Add logs textfield to bug report

* chore: add changelog in README.md

* fix screenshot input in feature_request.yml

* add hardware spec input in bug_report.yml

* fix: PKGBUILD pkgname variable fix

* userdata migration [need review from other OS]

* french translate

* Add German and Swedish translations

Added de.json and sv.json locale files for German and Swedish language support. Updated i18n.js to register 'de' and 'sv' as available languages in the launcher.

* Update README.md

* chore: add offline-mode warning to the README.md

* chore: add downloads counter in README.md

* fix: Steam Deck/Ubuntu crash - use system libzstd.so

The bundled libzstd.so is incompatible with glibc 2.41's stricter heap
validation, causing "free(): invalid pointer" crashes.

Solution: Automatically replace bundled libzstd.so with system version
on Linux. The launcher detects and symlinks to /usr/lib/libzstd.so.1.

- Auto-detect system libzstd at common paths (Arch, Debian, Fedora)
- Backup bundled version as libzstd.so.bundled
- Create symlink to system version
- Add HYTALE_NO_LIBZSTD_FIX=1 to disable if needed

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: remove Windows and Linux ARM64 information on the README.md

* Update support_request.yml

* fix: improve update system UX and macOS compatibility

Update System Improvements:
- Fix duplicate update popups by disabling legacy updater.js
- Add skip button to update popup (shows after 30s, on error, or after download)
- Add macOS-specific handling with manual download as primary option
- Add missing open-download-page IPC handler
- Add missing unblockInterface() method to properly clean up after popup close
- Add quitAndInstallUpdate alias in preload for compatibility
- Remove pulse animation when download completes
- Fix manual download button to show correct status and close popup
- Sync player name to settings input after first install

Client Patcher Cleanup:
- Remove server patching code (server uses pre-patched JAR from CDN)
- Simplify to client-only patching
- Remove unused imports (crypto, AdmZip, execSync, spawn, javaManager)
- Remove unused methods (stringToUtf8, findAndReplaceDomainUtf8)
- Move localhost dev code to backup file for reference

Code Quality Fixes:
- Fix duplicate DOMContentLoaded handlers in install.js
- Fix duplicate checkForUpdates definition in preload.js
- Fix redundant if/else in onProgressUpdate callback
- Fix typo "Harwadre" -> "Hardware" in preload.js

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add Russian language support

Added Russian (ru) to the list of available languages.

* chore: drafting documentation on SERVER.md

* Some updates in Russian language localization file

* fix

* Update ru.json

* Fixed Java runtime name and fixed typo

* fixed untranslated place

* Update ru.json

* Update ru.json

* Update ru.json

* Update ru.json

* Update ru.json

* fix: timeout getLatestClient 

fixes #138

* fix: change default version to 7.pwr in main.js

* fix: change default release version to 7.pwr

* fix: change version release to 7.pwr

* docs: Add comprehensive troubleshooting guide (#209)

Add TROUBLESHOOTING.md with solutions for common issues including:

- Windows: Firewall configuration, duplicate mods, SmartScreen
- Linux: GPU detection (NVIDIA/AMD), SDL3_image/libpng dependencies,
  Wayland/X11 issues, Steam Deck support
- macOS: Rosetta 2 for Apple Silicon, code signing, quarantine
- Connection: Server boot failures, regional restrictions
- Authentication: Token errors, config reset procedures
- Avatar/Cosmetics: F2P limitations documentation
- Backup locations for all platforms
- Log locations for bug reports

Solutions compiled from closed GitHub issues (#205, #155, #90, #60,
#144, #192) and community feedback.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* Standardize language codes, improve formatting, and update all locale files. (#224)

* Update German (Germany) localization

* Update Español (España) localization

* Update French (France) localization

* Update Polish (Poland) localization

* Update Portuguese (Brazil) localization

* Update Russian (Russia) localization

* Update Swedish (Sweden) localization

* Update Turkish (Turkey) localization

* Update language codes, names and alphabetical in i18n system

* Changed Spanish language name to the Formal name "Spanish (Spain)"

* Fix PKGBUILD-git

* Fix PKGBUILD

* delete cache after installation

* Enforce 16-char player name limit and update mod sync

Added a maxlength attribute to the player name input and enforced a 16-character limit in both install and settings scripts, providing user feedback if exceeded. Refactored modManager.js to replace symlink-based mod management with a copy-based system, copying enabled mods to HytaleSaves\Mods and removing legacy symlink logic to improve compatibility and avoid permission issues.

* Update installation subtitle

* chore: update quickstart link in README.md

* chore: delete warning of Ubuntu-Debian at Linux Prequisites section

* added featured server list from api

* Add Featured Servers page to GUI

* Update Discord invite URL in client patcher

* Add differential update system

* Remove launcher chat and add Discord popup

* fix: removed 'check disk space' alert on permission file error

* fix: upgrade tar to ^7.5.6 version

* fix: re-add universal arch for mac

* fix: upgrade electron/rebuild to 4.0.3

* fix: removed override tar version

* fix: pkgbuild version to 2.1.2

* fix: src.tar.zst and srcinfo missing files

* feat: add Indonesian language translation

* fix: GPU preference hint to Laptop-only

* feat: create two columns for settings page

* Add Discord invite link to rpc

* docs: add recordings form, fix OS list

* Release v2.2.0

* Release v2.2.0

* Release v2.2.0

* chore: delete icon.ico, moved to build folder

* chore: delete icon.png, moved to build folder

* fix: build and release for tag push-only in release.yml

* fix: gamescope steam deck issue fixes #186 hopefully

* Support branch selection for server patching

* chose: add auto-patch system for pre-release JAR

---------

Co-authored-by: TalesAmaral <57869141+TalesAmaral@users.noreply.github.com>
Co-authored-by: walti0 <95646872+walti0@users.noreply.github.com>
Co-authored-by: AMIAY <letudiantenrap.collab@gmail.com>
Co-authored-by: sanasol <mail@sanasol.ws>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Terromur <79866197+Terromur@users.noreply.github.com>
Co-authored-by: Zakhar Smokotov <zaharb840@gmail.com>
Co-authored-by: xSamiVS <samtaiebc@gmail.com>
This commit is contained in:
Fazri Gading
2026-01-31 06:19:46 +08:00
committed by GitHub
parent da186333cb
commit d5cc0868e9
50 changed files with 5934 additions and 3631 deletions

250
GUI/locales/ru-RU.json Normal file
View File

@@ -0,0 +1,250 @@
{
"nav": {
"play": "Играть",
"mods": "Моды",
"news": "Новости",
"chat": "Чат игроков",
"settings": "Настройки"
},
"header": {
"playersLabel": "Игроки:",
"manageProfiles": "Управлять профилями:",
"defaultProfile": "По умолчанию"
},
"install": {
"title": "FREE TO PLAY LAUNCHER",
"playerName": "Ник игрока",
"playerNamePlaceholder": "Введите ваш ник",
"gameBranch": "Версия игры",
"releaseVersion": "Релиз (Стабильная)",
"preReleaseVersion": "Пре-Релиз (Экспериментально)",
"customInstallation": "Модифицированная установка",
"installationFolder": "Папка установки",
"pathPlaceholder": "Путь по умолчанию",
"browse": "Обзор",
"installButton": "УСТАНОВИТЬ HYTALE",
"installing": "УСТАНОВКА..."
},
"play": {
"ready": "ГОТОВ К ИГРЕ",
"subtitle": "Запусти Hytale и приготовься к приключению!",
"playButton": "ЗАПУСТИТЬ HYTALE",
"latestNews": "ПОСЛЕДНИЕ НОВОСТИ",
"viewAll": "ПОСМОТРЕТЬ ВСЁ",
"checking": "ПРОВЕРКА...",
"play": "ЗАПУСТИТЬ"
},
"mods": {
"searchPlaceholder": "Искать моды...",
"myMods": "Мои моды",
"previous": "Предыдущая",
"next": "Вперёд",
"page": "Страница",
"of": "",
"modalTitle": "МОИ МОДЫ",
"noModsFound": "Моды не найдены",
"noModsFoundDesc": "Попробуйте изменить свой запрос",
"noModsInstalled": "Нет установленных модов",
"noModsInstalledDesc": "Добавьте моды с CurseForge или импортируйте свои!",
"view": "Посмотреть",
"install": "Установить",
"installed": "УСТАНОВЛЕННЫЕ",
"enable": "ВКЛЮЧИТЬ",
"disable": "ВЫКЛЮЧИТЬ",
"active": "ВКЛЮЧЁН",
"disabled": "ВЫКЛЮЧЕН",
"delete": "Удалить мод",
"noDescription": "Нет доступного описания",
"confirmDelete": "Вы точно уверены, что хотите удалить \"{name}\"?",
"confirmDeleteDesc": "Это действие не отменить.",
"confirmDeletion": "Подтвердите удаление",
"apiKeyRequired": "Требуется ключ API",
"apiKeyRequiredDesc": "Ключ CurseForge API требуется для просмотра модов"
},
"news": {
"title": "ВСЕ НОВОСТИ",
"readMore": "Читать дальше"
},
"chat": {
"title": "ЧАТ ИГРОКОВ",
"pickColor": "Цвет",
"inputPlaceholder": "Введите своё сообщение...",
"send": "Отправить",
"online": "онлайн",
"charCounter": "{current}/{max}",
"secureChat": "Безопасный чат - все ссылки зацензурены",
"joinChat": "Присоединиться к чату",
"chooseUsername": "Выберите имя пользователя для входа в чат игроков",
"username": "Ник",
"usernamePlaceholder": "Введите ваш ник...",
"usernameHint": "3-20 символов, букв, цифр, только - и _",
"joinButton": "Присоединиться к чату",
"colorModal": {
"title": "Выберите цвет ника",
"chooseSolid": "Выберите цвет:",
"customColor": "Модифицированный цвет:",
"preview": "Предварительный просмотр:",
"previewUsername": "Ник",
"apply": "Применить цвет"
}
},
"settings": {
"title": "НАСТРОЙКИ",
"java": "Java Runtime",
"useCustomJava": "Укажите свой путь Java",
"javaDescription": "Переопределить встроенный Java Runtime с вашей установкой",
"javaPath": "Путь исполняемого файла Java",
"javaPathPlaceholder": "Выберите путь Java...",
"javaBrowse": "Обзор",
"javaHint": "Выберите папку установки Java (поддерживается Windows, Mac, Linux)",
"discord": "Интеграция Discord",
"enableRPC": "Включить Discord Rich Presence",
"discordDescription": "Показывать вашу активность лаунчера в Discord",
"game": "Настройки игры",
"playerName": "Ник игрока",
"playerNamePlaceholder": "Введите ваш ник",
"playerNameHint": "Этот ник будет использован в игре (1-16 символов)",
"openGameLocation": "Открыть местоположение игры",
"openGameLocationDesc": "Открыть папку установки игры",
"account": "Управление UUID игрока",
"currentUUID": "Текущий UUID",
"uuidPlaceholder": "Загрузка UUID...",
"copyUUID": "Копировать UUID",
"regenerateUUID": "Перегенерировать UUID",
"uuidHint": "Уникальный идентификатор игрока для этого ника",
"manageUUIDs": "Управление всеми UUID",
"manageUUIDsDesc": "Смотреть и управлять всеми UUID игрока",
"language": "Язык",
"selectLanguage": "Выберите язык",
"repairGame": "Починить игру",
"reinstallGame": "Переустановить файлы игры (сохраняет данные)",
"gpuPreference": "Предпочтение GPU",
"gpuHint": "Функция доступна только на ноутбуках; при использовании на ПК выберите встроенную видеокарту.",
"gpuAuto": "Автоматический выбор",
"gpuIntegrated": "Интегрированная видеокарта",
"gpuDedicated": "Дискретная видеокарта",
"logs": "ЛОГИ",
"logsCopy": "Копировать",
"logsRefresh": "Обновить",
"logsFolder": "Открыть папку",
"logsLoading": "Загрузка логов...",
"closeLauncher": "Поведение лаунчера",
"closeOnStart": "Закрыть лаунчер при старте игры",
"closeOnStartDescription": "Автоматически закрыть лаунчер после запуска Hytale",
"hwAccel": "Аппаратное ускорение",
"hwAccelDescription": "Включить аппаратное ускорение для лаунчера",
"gameBranch": "Ветка игры",
"branchRelease": "Релиз",
"branchPreRelease": "Пре-Релиз",
"branchHint": "Переключает между релизом и пре-релизом игры",
"branchWarning": "Изменение ветки скачает и установит другую версию игры",
"branchSwitching": "Переключение на {branch}...",
"branchSwitched": "Переключение на {branch} выполнено успешно!",
"installRequired": "Необходима установка",
"branchInstallConfirm": "Игра будет установлена для ветки {branch}. Продолжить?"
},
"uuid": {
"modalTitle": "Управление UUID",
"currentUserUUID": "UUID текущего пользователя",
"allPlayerUUIDs": "UUID всех игроков",
"generateNew": "Сгенерировать новый UUID",
"loadingUUIDs": "Загрузка UUID...",
"setCustomUUID": "Установить кастомный UUID",
"customPlaceholder": "Ввести кастомный UUID (форматы: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)",
"setUUID": "Установить UUID",
"warning": "Внимание! Установка кастомного UUID изменит вашу текущую личность игрока!",
"copyTooltip": "Скопировать UUID",
"regenerateTooltip": "Сгенерировать новый UUID"
},
"profiles": {
"modalTitle": "Управление профилями",
"newProfilePlaceholder": "Новое имя профиля",
"createProfile": "Создать профиль"
},
"discord": {
"notificationText": "Присоединитесь к нашему сообществу в Discord!",
"joinButton": "Присоединиться к Discord"
},
"common": {
"confirm": "Подтвердить",
"cancel": "Отменить",
"save": "Сохранить",
"close": "Закрыть",
"delete": "Удалить",
"edit": "Редактировать",
"loading": "Загружается...",
"apply": "Применить",
"install": "Установить"
},
"notifications": {
"gameDataNotFound": "Ошибка: данные игры не найдены",
"gameUpdatedSuccess": "Игра успешно обновлена! Ура! 🎉",
"updateFailed": "Обновление прервалось с ошибкой: {error}",
"updateError": "Ошибка обновления: {error}",
"discordEnabled": "Discord Rich Presence включен",
"discordDisabled": "Discord Rich Presence выключен",
"discordSaveFailed": "Не удалось сохранить настройку Discord",
"playerNameRequired": "Пожалуйста, введите действительное имя игрока",
"playerNameSaved": "Имя игрока успешно сохранено!",
"playerNameSaveFailed": "Не удалось сохранить имя игрока",
"uuidCopied": "UUID скопирован в буфер обмена!",
"uuidCopyFailed": "Не удалось скопировать UUID",
"uuidRegenNotAvailable": "UUID перегенерация к сожалению не доступна",
"uuidRegenFailed": "Не удалось перегенерировать UUID",
"uuidGenerated": "Новый UUID сгенерирован успешно!",
"uuidGeneratedShort": "Новый UUID сгенерирован!",
"uuidGenerateFailed": "Не получилось сгенерировать новый UUID",
"uuidRequired": "Пожалуйста введите UUID",
"uuidInvalidFormat": "Неправильный формат UUID",
"uuidSetFailed": "Не удалось поставить кастомный UUID",
"uuidSetSuccess": "Кастомный UUID успешно установлен!",
"uuidDeleteFailed": "Не удалось удалить UUID",
"uuidDeleteSuccess": "Удаление UUID успешно завершено!",
"modsDownloading": "Скачивание {name}...",
"modsTogglingMod": "Включение мода...",
"modsDeletingMod": "Удаление мода...",
"modsLoadingMods": "Загрузка модов с CurseForge...",
"modsInstalledSuccess": "{name} успешно установлен! 🎉",
"modsDeletedSuccess": "{name} удалён успешно!",
"modsDownloadFailed": "Не получилось скачать мод: {error}",
"modsToggleFailed": "Не получилось включить мод: {error}",
"modsDeleteFailed": "Не получилось удалить мод: {error}",
"modsModNotFound": "Информация по моду не найдена",
"hwAccelSaved": "Настройка аппаратного ускорения сохранена!",
"hwAccelSaveFailed": "Не удалось сохранить настройку аппаратного ускорения"
},
"confirm": {
"defaultTitle": "Подтвердить действие",
"regenerateUuidTitle": "Сгенерировать новый UUID",
"regenerateUuidMessage": "Вы уверены, что хотите сгенерировать новый UUID? Генерация нового UUID изменит вашу текущую личность игрока!",
"regenerateUuidButton": "Сгенерировать",
"setCustomUuidTitle": "Установить кастомный UUID",
"setCustomUuidMessage": "Вы уверены, что хотите установить кастомный UUID? Установка кастомного UUID изменит вашу текущую личность игрока!",
"setCustomUuidButton": "Установить UUID",
"deleteUuidTitle": "Удалить UUID",
"deleteUuidMessage": "Вы уверены, что хотите удалить UUID для \"{username}\"? Это действие необратимо!",
"deleteUuidButton": "Удалить",
"uninstallGameTitle": "Удалить игру",
"uninstallGameMessage": "Вы уверены, что хотите удалить Hytale? Все данные игры будут безвозвратно удалены!",
"uninstallGameButton": "Удалить"
},
"progress": {
"initializing": "Инициализация...",
"downloading": "Скачивание...",
"installing": "Установка...",
"extracting": "Извлечение...",
"verifying": "Проверка...",
"switchingProfile": "Смена профиля...",
"profileSwitched": "Профиль сменён!",
"startingGame": "Запуск игры...",
"launching": "ЗАПУСК...",
"uninstallingGame": "Удаление игры...",
"gameUninstalled": "Игра успешно удалена!",
"uninstallFailed": "Удаление игры прервано с ошибкой: {error}",
"startingUpdate": "Начало обязательного обновления игры...",
"installationComplete": "Установка успешно завершена!",
"installationFailed": "Установка прервана с ошибкой: {error}",
"installingGameFiles": "Установка файлов игры...",
"installComplete": "Установка завершена!"
}
}