mirror of
https://git.sanhost.net/sanasol/hytale-f2p
synced 2026-02-26 16:21:49 -03:00
* - Implemented i18n. - Updated UI elements to use localized strings for various messages and confirmations. - Added language selection functionality in settings with appropriate event handling. - Created English localization file with translations for all new strings. - Updated backend to save and load user-selected language preferences. * Add Spanish localization for the GUI * Add Portuguese (Brazil) localization for the GUI * update main branch to release/v2.0.2b (#86) * add more linux pkgs, create auto-release and pre-release feature for Github Actions * removed package-lock from gitignore * update .gitignore for local build * add package-lock.json to maintain stability development * update version to 2.0.2b also add deps for rpm and arch * update 2.0.2b: add arm64 support, product and executable name, maintainers; remove snap; * update 2.0.2b: add latest.yml for win & linux, arm64 support; remove snap * fix release build naming * Prepare release v2.0.2b * Update localization for game repair and GPU settings Added new localization entries for game repair and GPU preferences. * Update spanish localization for game repair and GPU settings * Update portuguese (brazil) for game repair and GPU settings * Update localization for system logs in English, Spanish, and Portuguese --------- Co-authored-by: Fazri Gading <fazrigading@gmail.com>
746 lines
43 KiB
HTML
746 lines
43 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Hytale F2P Launcher</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
|
<link
|
|
href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap"
|
|
rel="stylesheet">
|
|
<link rel="stylesheet" href="style.css">
|
|
</head>
|
|
|
|
<body class="bg-black text-white overflow-hidden font-sans select-none" tabindex="-1">
|
|
<div class="absolute inset-0 z-0">
|
|
<img src="https://i.imgur.com/Visrk66.png" alt="Background" class="w-full h-full object-cover" />
|
|
<div class="absolute inset-0 bg-black/60"></div>
|
|
<div class="absolute inset-0 bg-[url('data:image/svg+xml,%3Csvg viewBox=" 0 0 256 256"
|
|
xmlns="http://www.w3.org/2000/svg" %3E%3Cfilter id="noiseFilter" %3E%3CfeTurbulence type="fractalNoise"
|
|
baseFrequency="0.65" numOctaves="3" stitchTiles="stitch" /%3E%3C/filter%3E%3Crect width="100%25"
|
|
height="100%25" filter="url(%23noiseFilter)" opacity="0.1" /%3E%3C/svg%3E')] opacity-20"></div>
|
|
</div>
|
|
|
|
<div class="flex w-full h-screen relative z-10">
|
|
<nav class="sidebar">
|
|
<div class="sidebar-logo">
|
|
<img src="./icon.png" alt="Hytale Logo" />
|
|
|
|
</div>
|
|
|
|
<div class="sidebar-nav">
|
|
<div class="nav-item active" data-page="play">
|
|
<i class="fas fa-play"></i>
|
|
<span class="nav-tooltip" data-i18n="nav.play">Play</span>
|
|
</div>
|
|
<div class="nav-item" data-page="mods">
|
|
<i class="fas fa-box"></i>
|
|
<span class="nav-tooltip" data-i18n="nav.mods">Mods</span>
|
|
</div>
|
|
<div class="nav-item" data-page="news">
|
|
<i class="fas fa-newspaper"></i>
|
|
<span class="nav-tooltip" data-i18n="nav.news">News</span>
|
|
</div>
|
|
<div class="nav-item" data-page="chat">
|
|
<i class="fas fa-comments"></i>
|
|
<span class="nav-tooltip" data-i18n="nav.chat">Players Chat</span>
|
|
</div>
|
|
<div class="nav-item" data-page="settings">
|
|
<i class="fas fa-cog"></i>
|
|
<span class="nav-tooltip" data-i18n="nav.settings">Settings</span>
|
|
</div>
|
|
<div class="nav-item" data-page="skins">
|
|
<i class="fas fa-user"></i>
|
|
<span class="nav-tooltip" data-i18n="nav.skins">Skins</span>
|
|
</div>
|
|
<div class="nav-item" data-page="logs" id="openLogsBtn" onclick="openLogs()">
|
|
<i class="fas fa-terminal"></i>
|
|
<span class="nav-tooltip">Logs</span>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
</nav>
|
|
|
|
<main class="main-content">
|
|
<header class="header">
|
|
<div id="playersOnlineCounter" class="players-counter">
|
|
<i class="fas fa-users"></i>
|
|
<span class="counter-label" data-i18n="header.playersLabel">Players:</span>
|
|
<span id="onlineCount" class="counter-value">0</span>
|
|
</div>
|
|
|
|
<div class="profile-selector" id="profileSelector">
|
|
<button class="profile-btn" onclick="toggleProfileDropdown()">
|
|
<i class="fas fa-user-circle"></i>
|
|
<span id="currentProfileName">Default</span>
|
|
<i class="fas fa-chevron-down"></i>
|
|
</button>
|
|
<div class="profile-dropdown" id="profileDropdown">
|
|
<div class="profile-list" id="profileList">
|
|
<!-- Profiles populated by JS -->
|
|
</div>
|
|
<div class="profile-divider"></div>
|
|
<div class="profile-action" onclick="openProfileManager()">
|
|
<i class="fas fa-cog"></i>
|
|
<span data-i18n="header.manageProfiles">Manage Profiles</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="window-controls">
|
|
<button class="control-btn minimize" onclick="window.electronAPI?.minimizeWindow()">
|
|
<i class="fas fa-minus"></i>
|
|
</button>
|
|
<button class="control-btn close" onclick="window.electronAPI?.closeWindow()">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
</header>
|
|
|
|
<div class="game-title-section">
|
|
<h1 class="game-title">
|
|
HY<span class="title-accent">TALE</span>
|
|
</h1>
|
|
<div class="game-tags">
|
|
<span class="tag" data-i18n="header.f2p">FREE TO PLAY</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="content-pages">
|
|
<div id="install-page" class="page install-page">
|
|
<div class="install-content">
|
|
<div class="install-header">
|
|
<h1 class="install-title">
|
|
HYTA<span class="title-accent">LE</span>
|
|
</h1>
|
|
<p class="install-subtitle" data-i18n="install.title">FREE TO PLAY LAUNCHER</p>
|
|
</div>
|
|
|
|
<div class="install-form">
|
|
<div class="form-group">
|
|
<label class="form-label" data-i18n="install.playerName">Player Name</label>
|
|
<input type="text" id="installPlayerName" data-i18n-placeholder="install.playerNamePlaceholder"
|
|
class="form-input" value="Player" />
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label class="checkbox-group">
|
|
<input type="checkbox" id="installCustomCheck" class="custom-checkbox">
|
|
<span class="checkbox-label" data-i18n="install.customInstallation">Custom Installation</span>
|
|
</label>
|
|
|
|
<div id="installCustomOptions" class="custom-options">
|
|
<div class="form-subgroup">
|
|
<label class="form-label" data-i18n="install.installationFolder">Installation Folder</label>
|
|
<div class="input-with-button">
|
|
<input type="text" id="installPath" data-i18n-placeholder="install.pathPlaceholder"
|
|
class="form-input" readonly />
|
|
<button onclick="browseInstallPath()" class="browse-btn">
|
|
<i class="fas fa-folder-open"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<button id="installBtn" class="install-button" onclick="installGame()">
|
|
<i class="fas fa-download mr-2"></i>
|
|
<span id="installText" data-i18n="install.installButton">INSTALL HYTALE</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="launcher-container" class="launcher-container" style="display: none;">
|
|
<div id="play-page" class="page active">
|
|
<div class="play-section">
|
|
<div class="play-content">
|
|
<div class="play-header">
|
|
<h2 class="play-title">
|
|
<i class="fas fa-play-circle mr-2"></i>
|
|
<span data-i18n="play.ready">READY TO PLAY</span>
|
|
</h2>
|
|
<p class="play-subtitle" data-i18n="play.subtitle">Launch Hytale and enter the adventure</p>
|
|
</div>
|
|
|
|
<button id="homePlayBtn" class="home-play-button" onclick="launch()">
|
|
<i class="fas fa-play"></i>
|
|
<span data-i18n="play.playButton">PLAY HYTALE</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="news-section">
|
|
<div class="news-header">
|
|
<h2 class="news-title">
|
|
<i class="fas fa-star mr-2"></i>
|
|
<span data-i18n="play.latestNews">LATEST NEWS</span>
|
|
</h2>
|
|
<button class="view-all-btn" onclick="navigateToPage('news')">
|
|
<span data-i18n="play.viewAll">VIEW ALL</span> <i class="fas fa-arrow-right ml-1"></i>
|
|
</button>
|
|
</div>
|
|
<div id="newsGrid" class="news-grid-horizontal"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="mods-page" class="page">
|
|
<div class="mods-header">
|
|
<div class="mods-search-container">
|
|
<i class="fas fa-search"></i>
|
|
<input type="text" id="modsSearch" data-i18n-placeholder="mods.searchPlaceholder" class="mods-search" />
|
|
</div>
|
|
<div class="mods-actions">
|
|
<button id="myModsBtn" class="mods-btn-primary">
|
|
<i class="fas fa-box"></i>
|
|
<span data-i18n="mods.myMods">MY MODS</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="browseModsList" class="mods-browse-container">
|
|
</div>
|
|
|
|
<div class="mods-pagination">
|
|
<button id="prevPage" class="pagination-btn">
|
|
<i class="fas fa-chevron-left"></i>
|
|
<span data-i18n="mods.previous">PREVIOUS</span>
|
|
</button>
|
|
<span class="pagination-info">
|
|
<span data-i18n="mods.page">Page</span> <span id="currentPage">1</span> <span data-i18n="mods.of">of</span> <span id="totalPages">1</span>
|
|
</span>
|
|
<button id="nextPage" class="pagination-btn">
|
|
<span data-i18n="mods.next">NEXT</span>
|
|
<i class="fas fa-chevron-right"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="news-page" class="page">
|
|
<div class="news-header">
|
|
<h2 class="news-title">
|
|
<i class="fas fa-newspaper mr-2"></i>
|
|
<span data-i18n="news.title">ALL NEWS</span>
|
|
</h2>
|
|
</div>
|
|
<div id="allNewsGrid" class="news-grid-full"></div>
|
|
</div>
|
|
|
|
<div id="chat-page" class="page">
|
|
<div class="chat-container">
|
|
<div class="chat-header">
|
|
<h2 class="chat-title">
|
|
<i class="fas fa-comments mr-2"></i>
|
|
<span data-i18n="chat.title">PLAYERS CHAT</span>
|
|
</h2>
|
|
<div class="chat-header-actions">
|
|
<button id="chatColorBtn" class="chat-color-btn">
|
|
<i class="fas fa-palette"></i>
|
|
<span data-i18n="chat.pickColor">Color</span>
|
|
</button>
|
|
<div class="chat-online-badge">
|
|
<i class="fas fa-circle"></i>
|
|
<span id="chatOnlineCount">0</span> <span data-i18n="chat.online">online</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="chat-body">
|
|
<div id="chatMessages" class="chat-messages">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="chat-footer">
|
|
<div class="chat-input-container">
|
|
<textarea id="chatInput" class="chat-input"
|
|
data-i18n-placeholder="chat.inputPlaceholder" rows="1"
|
|
maxlength="500"></textarea>
|
|
<button id="chatSendBtn" class="chat-send-btn">
|
|
<i class="fas fa-paper-plane"></i>
|
|
</button>
|
|
</div>
|
|
<div class="chat-footer-info">
|
|
<span class="chat-char-counter" id="chatCharCounter">0/500</span>
|
|
<span class="chat-warning-text">
|
|
<i class="fas fa-shield-alt"></i>
|
|
<span data-i18n="chat.secureChat">Secure chat - Links are censored</span>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="settings-page" class="page">
|
|
<div class="settings-container">
|
|
<div class="settings-header">
|
|
<h2 class="settings-title">
|
|
<i class="fas fa-cog mr-2"></i>
|
|
<span data-i18n="settings.title">SETTINGS</span>
|
|
</h2>
|
|
</div>
|
|
|
|
<div class="settings-content">
|
|
<div class="settings-section">
|
|
<h3 class="settings-section-title">
|
|
<i class="fas fa-gamepad"></i>
|
|
<span data-i18n="settings.game">Game Options</span>
|
|
</h3>
|
|
|
|
<div class="settings-option">
|
|
<div class="settings-input-group">
|
|
<label class="settings-input-label" data-i18n="settings.playerName">Player Name</label>
|
|
<input type="text" id="settingsPlayerName" class="settings-input"
|
|
data-i18n-placeholder="settings.playerNamePlaceholder" maxlength="16" />
|
|
<p class="settings-hint">
|
|
<i class="fas fa-user"></i>
|
|
<span data-i18n="settings.playerNameHint">This name will be used in-game (1-16 characters)</span>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings-option">
|
|
<div class="settings-button-group">
|
|
<button id="openGameLocationBtn" class="settings-action-btn"
|
|
onclick="openGameLocation()">
|
|
<i class="fas fa-folder-open"></i>
|
|
<div class="btn-content">
|
|
<div class="btn-title" data-i18n="settings.openGameLocation">Open Game Location</div>
|
|
<div class="btn-description" data-i18n="settings.openGameLocationDesc">Open the game installation folder</div>
|
|
</div>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings-option">
|
|
<div class="settings-button-group">
|
|
<button id="repairGameBtn" class="settings-action-btn"
|
|
onclick="repairGame()">
|
|
<i class="fas fa-tools"></i>
|
|
<div class="btn-content">
|
|
<div class="btn-title" data-i18n="settings.repairGame">Repair Game</div>
|
|
<div class="btn-description" data-i18n="settings.reinstallGame">Reinstall game files (preserves data)
|
|
</div>
|
|
</div>
|
|
</button>
|
|
</div>
|
|
|
|
|
|
<div class="settings-input-group">
|
|
<label class="settings-input-label" data-i18n="settings.gpuPreference">GPU Preference</label>
|
|
<div class="segmented-control">
|
|
<input type="radio" id="gpu-auto" name="gpuPreference" value="auto" checked>
|
|
<label for="gpu-auto" data-i18n="settings.gpuAuto">Auto</label>
|
|
<input type="radio" id="gpu-integrated" name="gpuPreference" value="integrated">
|
|
<label for="gpu-integrated" data-i18n="settings.gpuIntegrated">Integrated</label>
|
|
<input type="radio" id="gpu-dedicated" name="gpuPreference" value="dedicated">
|
|
<label for="gpu-dedicated" data-i18n="settings.gpuDedicated">Dedicated</label>
|
|
</div>
|
|
<p class="settings-hint">
|
|
<i class="fas fa-info-circle"></i>
|
|
<span data-i18n="settings.gpuHint">Select your preferred GPU (Linux: affects DRI_PRIME)</span>
|
|
</p>
|
|
<div id="gpu-detection-info" class="gpu-detection-info"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings-section">
|
|
<h3 class="settings-section-title">
|
|
<i class="fas fa-fingerprint"></i>
|
|
<span data-i18n="settings.account">Player UUID Management</span>
|
|
</h3>
|
|
|
|
<div class="settings-option">
|
|
<div class="settings-input-group">
|
|
<label class="settings-input-label" data-i18n="settings.currentUUID">Current UUID</label>
|
|
<div class="uuid-display-container">
|
|
<input type="text" id="currentUuid" class="settings-input uuid-input"
|
|
readonly data-i18n-placeholder="settings.uuidPlaceholder" />
|
|
<button id="copyUuidBtn" class="uuid-btn copy-btn" title="Copy UUID">
|
|
<i class="fas fa-copy"></i>
|
|
</button>
|
|
<button id="regenerateUuidBtn" class="uuid-btn regenerate-btn"
|
|
title="Generate New UUID">
|
|
<i class="fas fa-sync-alt"></i>
|
|
</button>
|
|
</div>
|
|
<p class="settings-hint">
|
|
<i class="fas fa-info-circle"></i>
|
|
<span data-i18n="settings.uuidHint">Your unique player identifier for this username</span>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings-option">
|
|
<div class="settings-button-group">
|
|
<button id="manageUuidsBtn" class="settings-action-btn">
|
|
<i class="fas fa-list"></i>
|
|
<div class="btn-content">
|
|
<div class="btn-title" data-i18n="settings.manageUUIDs">Manage All UUIDs</div>
|
|
<div class="btn-description" data-i18n="settings.manageUUIDsDesc">View and manage all player UUIDs</div>
|
|
</div>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings-section">
|
|
<h3 class="settings-section-title">
|
|
<i class="fab fa-discord"></i>
|
|
<span data-i18n="settings.discord">Discord Integration</span>
|
|
</h3>
|
|
|
|
<div class="settings-option">
|
|
<label class="settings-checkbox">
|
|
<input type="checkbox" id="discordRPCCheck" checked />
|
|
<span class="checkmark"></span>
|
|
<div class="checkbox-content">
|
|
<div class="checkbox-title" data-i18n="settings.enableRPC">Enable Discord Rich Presence</div>
|
|
<div class="checkbox-description" data-i18n="settings.discordDescription">Show your launcher activity on Discord
|
|
</div>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings-section">
|
|
<h3 class="settings-section-title">
|
|
<i class="fas fa-coffee"></i>
|
|
<span data-i18n="settings.java">Java Runtime</span>
|
|
</h3>
|
|
|
|
<div class="settings-option">
|
|
<label class="settings-checkbox">
|
|
<input type="checkbox" id="customJavaCheck" />
|
|
<span class="checkmark"></span>
|
|
<div class="checkbox-content">
|
|
<div class="checkbox-title" data-i18n="settings.useCustomJava">Use Custom Java Path</div>
|
|
<div class="checkbox-description" data-i18n="settings.javaDescription">Override the bundled Java runtime with
|
|
your own installation</div>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
|
|
<div id="customJavaOptions" class="custom-java-options" style="display: none;">
|
|
<div class="settings-input-group">
|
|
<label class="settings-input-label" data-i18n="settings.javaPath">Java Executable Path</label>
|
|
<div class="settings-input-with-button">
|
|
<input type="text" id="customJavaPath" class="settings-input"
|
|
data-i18n-placeholder="settings.javaPathPlaceholder" readonly />
|
|
<button id="browseJavaBtn" class="settings-browse-btn">
|
|
<i class="fas fa-folder-open"></i>
|
|
<span data-i18n="settings.javaBrowse">Browse</span>
|
|
</button>
|
|
</div>
|
|
<p class="settings-hint">
|
|
<i class="fas fa-info-circle"></i>
|
|
<span data-i18n="settings.javaHint">Select the Java installation folder (supports Windows, Mac, Linux)</span>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings-section">
|
|
<h3 class="settings-section-title">
|
|
<i class="fas fa-language"></i>
|
|
<span data-i18n="settings.language">Language</span>
|
|
</h3>
|
|
|
|
<div class="settings-option">
|
|
<div class="settings-input-group">
|
|
<label class="settings-input-label" data-i18n="settings.selectLanguage">Select Language</label>
|
|
<select id="languageSelect" class="settings-input">
|
|
<!-- Options populated by i18n.js -->
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="skins-page" class="page">
|
|
<div class="placeholder-content">
|
|
<i class="fas fa-user text-6xl mb-4 text-purple-500"></i>
|
|
<h2 data-i18n="skins.title">Skins</h2>
|
|
<p data-i18n="skins.comingSoon">Skin customization coming soon...</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="logs-page" class="page">
|
|
<div class="logs-container">
|
|
<div class="logs-header">
|
|
<h2 class="logs-title">
|
|
<i class="fas fa-terminal"></i>
|
|
<span data-i18n="settings.logs">SYSTEM LOGS</span>
|
|
</h2>
|
|
<div class="logs-actions">
|
|
<button class="logs-action-btn" onclick="copyLogs()">
|
|
<i class="fas fa-copy"></i> <span data-i18n="settings.logsCopy">Copy</span>
|
|
</button>
|
|
<button class="logs-action-btn" onclick="refreshLogs()">
|
|
<i class="fas fa-sync-alt"></i> <span data-i18n="settings.logsRefresh">Refresh</span>
|
|
</button>
|
|
<button class="logs-action-btn" onclick="openLogsFolder()">
|
|
<i class="fas fa-folder-open"></i> <span data-i18n="settings.logsFolder">Open Folder</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div id="logsTerminal" class="logs-terminal">
|
|
<div class="text-gray-500 text-center mt-10" data-i18n="settings.logsLoading">Loading logs...</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</div>
|
|
|
|
<div id="myModsModal" class="mods-modal">
|
|
<div class="mods-modal-content">
|
|
<div class="mods-modal-header">
|
|
<h2 class="mods-modal-title">
|
|
<i class="fas fa-box mr-2"></i>
|
|
<span data-i18n="mods.modalTitle">MY MODS</span>
|
|
</h2>
|
|
<button id="closeMyModsModal" class="mods-modal-close">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
<div class="mods-modal-body">
|
|
<div id="installedModsList" class="installed-mods-list">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="progressOverlay" class="progress-overlay" style="display: none;">
|
|
<div class="progress-content">
|
|
<div class="progress-info">
|
|
<span id="progressText" data-i18n="progress.initializing">Initializing...</span>
|
|
<span id="progressPercent">0%</span>
|
|
</div>
|
|
<div class="progress-bar-container">
|
|
<div id="progressBarFill" class="progress-bar-fill"></div>
|
|
</div>
|
|
<div class="progress-details">
|
|
<span id="progressSpeed"></span>
|
|
<span id="progressSize"></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="chatUsernameModal" class="chat-username-modal" style="display: none;">
|
|
<div class="chat-username-modal-content">
|
|
<div class="chat-username-modal-header">
|
|
<h2 class="chat-username-modal-title">
|
|
<i class="fas fa-comments mr-2"></i>
|
|
<span data-i18n="chat.joinChat">Join Chat</span>
|
|
</h2>
|
|
</div>
|
|
<div class="chat-username-modal-body">
|
|
<p class="chat-username-modal-description" data-i18n="chat.chooseUsername">
|
|
Choose a username to join the Players Chat
|
|
</p>
|
|
<div class="chat-username-input-group">
|
|
<label for="chatUsernameInput" class="chat-username-label" data-i18n="chat.username">Username</label>
|
|
<input type="text" id="chatUsernameInput" class="chat-username-input"
|
|
data-i18n-placeholder="chat.usernamePlaceholder" maxlength="20" autocomplete="off" />
|
|
<span class="chat-username-hint" data-i18n="chat.usernameHint">3-20 characters, letters, numbers, - and _ only</span>
|
|
<span id="chatUsernameError" class="chat-username-error"></span>
|
|
</div>
|
|
</div>
|
|
<div class="chat-username-modal-footer">
|
|
<button id="chatUsernameCancel" class="chat-username-btn-cancel">
|
|
<i class="fas fa-times"></i>
|
|
<span data-i18n="common.cancel">Cancel</span>
|
|
</button>
|
|
<button id="chatUsernameSubmit" class="chat-username-btn-submit">
|
|
<i class="fas fa-check"></i>
|
|
<span data-i18n="chat.joinButton">Join Chat</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- UUID Management Modal -->
|
|
<div id="uuidModal" class="uuid-modal" style="display: none;">
|
|
<div class="uuid-modal-content">
|
|
<div class="uuid-modal-header">
|
|
<h2 class="uuid-modal-title">
|
|
<i class="fas fa-fingerprint mr-2"></i>
|
|
<span data-i18n="uuid.modalTitle">UUID Management</span>
|
|
</h2>
|
|
<button id="uuidModalClose" class="modal-close-btn">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<div class="uuid-modal-body">
|
|
<div class="uuid-current-section">
|
|
<h3 class="uuid-section-title" data-i18n="uuid.currentUserUUID">Current User UUID</h3>
|
|
<div class="uuid-current-display">
|
|
<input type="text" id="modalCurrentUuid" class="uuid-display-input" readonly />
|
|
<button id="modalCopyUuidBtn" class="uuid-action-btn copy-btn" title="Copy UUID">
|
|
<i class="fas fa-copy"></i>
|
|
</button>
|
|
<button id="modalRegenerateUuidBtn" class="uuid-action-btn regenerate-btn"
|
|
title="Generate New UUID">
|
|
<i class="fas fa-sync-alt"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="uuid-list-section">
|
|
<div class="uuid-list-header">
|
|
<h3 class="uuid-section-title" data-i18n="uuid.allPlayerUUIDs">All Player UUIDs</h3>
|
|
<button id="generateNewUuidBtn" class="uuid-generate-btn">
|
|
<i class="fas fa-plus"></i>
|
|
<span data-i18n="uuid.generateNew">Generate New UUID</span>
|
|
</button>
|
|
</div>
|
|
<div id="uuidList" class="uuid-list">
|
|
<div class="uuid-loading">
|
|
<i class="fas fa-spinner fa-spin"></i>
|
|
<span data-i18n="uuid.loadingUUIDs">Loading UUIDs...</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="uuid-custom-section">
|
|
<h3 class="uuid-section-title" data-i18n="uuid.setCustomUUID">Set Custom UUID</h3>
|
|
<div class="uuid-custom-form">
|
|
<input type="text" id="customUuidInput" class="uuid-input"
|
|
data-i18n-placeholder="uuid.customPlaceholder"
|
|
maxlength="36" />
|
|
<button id="setCustomUuidBtn" class="uuid-set-btn">
|
|
<i class="fas fa-check"></i>
|
|
<span data-i18n="uuid.setUUID">Set UUID</span>
|
|
</button>
|
|
</div>
|
|
<p class="uuid-custom-hint">
|
|
<i class="fas fa-exclamation-triangle"></i>
|
|
<span data-i18n="uuid.warning">Warning: Setting a custom UUID will change your current player identity</span>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Profile Manager Modal -->
|
|
<div id="profileManagerModal" class="profile-modal" style="display: none;">
|
|
<div class="profile-modal-content">
|
|
<div class="profile-modal-header">
|
|
<h2 class="profile-modal-title">
|
|
<i class="fas fa-users-cog mr-2"></i>
|
|
<span data-i18n="profiles.modalTitle">Manage Profiles</span>
|
|
</h2>
|
|
<button class="modal-close-btn" onclick="closeProfileManager()">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
<div class="profile-modal-body">
|
|
<div class="profile-manager-list" id="managerProfileList">
|
|
<!-- Populated by JS -->
|
|
</div>
|
|
<div class="profile-create-section">
|
|
<input type="text" id="newProfileName" data-i18n-placeholder="profiles.newProfilePlaceholder" class="profile-input"
|
|
maxlength="20">
|
|
<button class="profile-create-btn" onclick="createNewProfile()">
|
|
<i class="fas fa-plus"></i> <span data-i18n="profiles.createProfile">Create Profile</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<footer class="fixed bottom-0 left-0 right-0 z-50 bg-black/80 backdrop-blur-sm px-4 py-2">
|
|
<div class="flex items-center justify-center text-xs text-gray-400">
|
|
<span>Made by <a href="https://github.com/amiayweb" target="_blank"
|
|
class="text-blue-400 hover:text-blue-300 transition-colors">@amiayweb</a> & <a
|
|
href="https://github.com/Relyz1993" target="_blank"
|
|
class="text-blue-400 hover:text-blue-300 transition-colors">@Relyz</a></span>
|
|
<span class="mx-2">|</span>
|
|
<span>Contributors:
|
|
<a href="https://github.com/chasem-dev" target="_blank"
|
|
class="text-blue-400 hover:text-blue-300 transition-colors">@chasem-dev</a>,
|
|
<a href="https://github.com/crimera" target="_blank"
|
|
class="text-blue-400 hover:text-blue-300 transition-colors">@crimera</a>,
|
|
<a href="https://github.com/sanasol" target="_blank"
|
|
class="text-blue-400 hover:text-blue-300 transition-colors">@sanasol</a>,
|
|
<a href="https://github.com/Terromur" target="_blank"
|
|
class="text-blue-400 hover:text-blue-300 transition-colors">@terromur</a>,
|
|
<a href="https://github.com/ericiskoolbeans" target="_blank"
|
|
class="text-blue-400 hover:text-blue-300 transition-colors">@ericiskoolbeans</a>,
|
|
<a href="https://github.com/fazrigading" target="_blank"
|
|
class="text-blue-400 hover:text-blue-300 transition-colors">@fazrigading</a>
|
|
</span>
|
|
</div>
|
|
</footer>
|
|
|
|
<script type="module" src="js/script.js"></script> <!-- Discord Notification -->
|
|
<div id="discordNotification" class="discord-notification">
|
|
<div class="notification-content">
|
|
<i class="fab fa-discord"></i>
|
|
<span class="notification-text" data-i18n="discord.notificationText">Join our Discord community!</span>
|
|
<button class="notification-action"
|
|
onclick="window.electronAPI?.openExternal('https://discord.gg/n6HZ7NwSQd')">
|
|
<span data-i18n="discord.joinButton">Join Discord</span>
|
|
</button>
|
|
</div>
|
|
<button class="notification-close" onclick="closeDiscordNotification()">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Modal pour sélectionner la couleur du chat -->
|
|
<div id="chatColorModal" class="chat-color-modal" style="display: none;">
|
|
<div class="chat-color-modal-content">
|
|
<div class="chat-color-modal-header">
|
|
<h3 class="chat-color-modal-title">
|
|
<i class="fas fa-palette"></i>
|
|
<span data-i18n="chat.colorModal.title">Customize Username Color</span>
|
|
</h3>
|
|
<button class="modal-close-btn" onclick="closeChatColorModal()">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
<div class="chat-color-modal-body">
|
|
<div id="solidColorSection" class="color-section">
|
|
<h4 data-i18n="chat.colorModal.chooseSolid">Choose a solid color:</h4>
|
|
<div class="predefined-colors">
|
|
<div class="color-option" data-color="#3498db" style="background: #3498db;"></div>
|
|
<div class="color-option" data-color="#e74c3c" style="background: #e74c3c;"></div>
|
|
<div class="color-option" data-color="#2ecc71" style="background: #2ecc71;"></div>
|
|
<div class="color-option" data-color="#f39c12" style="background: #f39c12;"></div>
|
|
<div class="color-option" data-color="#9b59b6" style="background: #9b59b6;"></div>
|
|
<div class="color-option" data-color="#1abc9c" style="background: #1abc9c;"></div>
|
|
<div class="color-option" data-color="#e91e63" style="background: #e91e63;"></div>
|
|
<div class="color-option" data-color="#ff5722" style="background: #ff5722;"></div>
|
|
</div>
|
|
<div class="custom-color-input">
|
|
<label for="customColor" data-i18n="chat.colorModal.customColor">Custom color:</label>
|
|
<input type="color" id="customColor" value="#3498db">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="color-preview">
|
|
<h4 data-i18n="chat.colorModal.preview">Preview:</h4>
|
|
<div id="colorPreview" class="preview-username" data-i18n="chat.colorModal.previewUsername">YourUsername</div>
|
|
</div>
|
|
</div>
|
|
<div class="chat-color-modal-footer">
|
|
<button class="btn-secondary" onclick="closeChatColorModal()"><span data-i18n="common.cancel">Cancel</span></button>
|
|
<button class="btn-primary" onclick="applyChatColor()"><span data-i18n="chat.colorModal.apply">Apply Color</span></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="js/i18n.js"></script>
|
|
<script type="module" src="js/update.js"></script>
|
|
</body>
|
|
|
|
|
|
</html> |