mirror of
https://git.sanhost.net/sanasol/hytale-f2p.git
synced 2026-02-26 06:41:47 -03:00
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:
1710
GUI/index.html
1710
GUI/index.html
File diff suppressed because it is too large
Load Diff
500
GUI/js/chat.js
500
GUI/js/chat.js
@@ -1,500 +0,0 @@
|
||||
|
||||
let socket = null;
|
||||
let isAuthenticated = false;
|
||||
let messageQueue = [];
|
||||
let chatUsername = '';
|
||||
let userColor = '#3498db';
|
||||
let userBadge = null;
|
||||
const SOCKET_URL = 'https://chat.hytalef2p.com';
|
||||
const MAX_MESSAGE_LENGTH = 500;
|
||||
|
||||
async function getOrCreatePlayerId() {
|
||||
return `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
||||
}
|
||||
|
||||
export async function initChat() {
|
||||
if (window.electronAPI?.loadChatUsername) {
|
||||
chatUsername = await window.electronAPI.loadChatUsername();
|
||||
}
|
||||
|
||||
if (window.electronAPI?.loadChatColor) {
|
||||
const savedColor = await window.electronAPI.loadChatColor();
|
||||
if (savedColor) {
|
||||
userColor = savedColor;
|
||||
}
|
||||
}
|
||||
|
||||
if (!chatUsername || chatUsername.trim() === '') {
|
||||
showUsernameModal();
|
||||
return;
|
||||
}
|
||||
|
||||
setupChatUI();
|
||||
setupColorSelector();
|
||||
await connectToChat();
|
||||
}
|
||||
|
||||
function showUsernameModal() {
|
||||
const modal = document.getElementById('chatUsernameModal');
|
||||
if (modal) {
|
||||
modal.style.display = 'flex';
|
||||
|
||||
const input = document.getElementById('chatUsernameInput');
|
||||
if (input) {
|
||||
setTimeout(() => input.focus(), 100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function hideUsernameModal() {
|
||||
const modal = document.getElementById('chatUsernameModal');
|
||||
if (modal) {
|
||||
modal.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
async function submitChatUsername() {
|
||||
const input = document.getElementById('chatUsernameInput');
|
||||
const errorMsg = document.getElementById('chatUsernameError');
|
||||
|
||||
if (!input) return;
|
||||
|
||||
const username = input.value.trim();
|
||||
|
||||
if (username.length === 0) {
|
||||
if (errorMsg) errorMsg.textContent = 'Username cannot be empty';
|
||||
return;
|
||||
}
|
||||
|
||||
if (username.length < 3) {
|
||||
if (errorMsg) errorMsg.textContent = 'Username must be at least 3 characters';
|
||||
return;
|
||||
}
|
||||
|
||||
if (username.length > 20) {
|
||||
if (errorMsg) errorMsg.textContent = 'Username must be 20 characters or less';
|
||||
return;
|
||||
}
|
||||
|
||||
if (!/^[a-zA-Z0-9_-]+$/.test(username)) {
|
||||
if (errorMsg) errorMsg.textContent = 'Username can only contain letters, numbers, - and _';
|
||||
return;
|
||||
}
|
||||
|
||||
chatUsername = username;
|
||||
if (window.electronAPI?.saveChatUsername) {
|
||||
await window.electronAPI.saveChatUsername(username);
|
||||
}
|
||||
|
||||
hideUsernameModal();
|
||||
|
||||
setupChatUI();
|
||||
await connectToChat();
|
||||
}
|
||||
|
||||
function setupChatUI() {
|
||||
const sendBtn = document.getElementById('chatSendBtn');
|
||||
const chatInput = document.getElementById('chatInput');
|
||||
const chatMessages = document.getElementById('chatMessages');
|
||||
|
||||
if (!sendBtn || !chatInput || !chatMessages) {
|
||||
console.warn('Chat UI elements not found');
|
||||
return;
|
||||
}
|
||||
|
||||
sendBtn.addEventListener('click', () => {
|
||||
sendMessage();
|
||||
});
|
||||
|
||||
chatInput.addEventListener('keypress', (e) => {
|
||||
if (e.key === 'Enter' && !e.shiftKey) {
|
||||
e.preventDefault();
|
||||
sendMessage();
|
||||
}
|
||||
});
|
||||
|
||||
chatInput.addEventListener('input', () => {
|
||||
if (chatInput.value.length > MAX_MESSAGE_LENGTH) {
|
||||
chatInput.value = chatInput.value.substring(0, MAX_MESSAGE_LENGTH);
|
||||
}
|
||||
updateCharCounter();
|
||||
});
|
||||
|
||||
updateCharCounter();
|
||||
}
|
||||
|
||||
async function connectToChat() {
|
||||
try {
|
||||
if (!window.io) {
|
||||
await loadSocketIO();
|
||||
}
|
||||
|
||||
const userId = await window.electronAPI?.getUserId();
|
||||
|
||||
if (!userId) {
|
||||
console.error('User ID not available');
|
||||
addSystemMessage('Error: Could not connect to chat');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!chatUsername || chatUsername.trim() === '') {
|
||||
console.error('Chat username not set');
|
||||
addSystemMessage('Error: Username not set');
|
||||
return;
|
||||
}
|
||||
|
||||
socket = io(SOCKET_URL, {
|
||||
transports: ['websocket', 'polling'],
|
||||
reconnection: true,
|
||||
reconnectionAttempts: 5,
|
||||
reconnectionDelay: 1000
|
||||
});
|
||||
|
||||
socket.on('connect', async () => {
|
||||
console.log('Connected to chat server');
|
||||
|
||||
const uuid = await window.electronAPI?.getCurrentUuid();
|
||||
|
||||
socket.emit('authenticate', {
|
||||
username: chatUsername,
|
||||
userId,
|
||||
uuid: uuid,
|
||||
userColor: userColor
|
||||
});
|
||||
});
|
||||
|
||||
socket.on('authenticated', (data) => {
|
||||
isAuthenticated = true;
|
||||
userBadge = data.badge;
|
||||
addSystemMessage(`Connected as ${data.username}`);
|
||||
|
||||
while (messageQueue.length > 0) {
|
||||
const msg = messageQueue.shift();
|
||||
socket.emit('send_message', { message: msg });
|
||||
}
|
||||
});
|
||||
|
||||
socket.on('message', (data) => {
|
||||
if (data.type === 'system') {
|
||||
addSystemMessage(data.message);
|
||||
} else if (data.type === 'user') {
|
||||
addUserMessage(data.username, data.message, data.timestamp, data.userColor, data.badge);
|
||||
}
|
||||
});
|
||||
|
||||
socket.on('users_update', (data) => {
|
||||
updateOnlineCount(data.count);
|
||||
});
|
||||
|
||||
socket.on('error', (data) => {
|
||||
addSystemMessage(`Error: ${data.message}`, 'error');
|
||||
});
|
||||
|
||||
socket.on('clear_chat', (data) => {
|
||||
clearAllMessages();
|
||||
addSystemMessage(data.message || 'Chat cleared by server', 'warning');
|
||||
});
|
||||
|
||||
socket.on('disconnect', () => {
|
||||
isAuthenticated = false;
|
||||
console.log('Disconnected from chat server');
|
||||
addSystemMessage('Disconnected from chat', 'error');
|
||||
});
|
||||
|
||||
socket.on('connect_error', (error) => {
|
||||
console.error('Connection error:', error);
|
||||
addSystemMessage('Connection error. Retrying...', 'error');
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error connecting to chat:', error);
|
||||
addSystemMessage('Failed to connect to chat server', 'error');
|
||||
}
|
||||
}
|
||||
|
||||
function loadSocketIO() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const script = document.createElement('script');
|
||||
script.src = 'https://cdn.socket.io/4.6.1/socket.io.min.js';
|
||||
script.onload = resolve;
|
||||
script.onerror = reject;
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
}
|
||||
|
||||
function sendMessage() {
|
||||
const chatInput = document.getElementById('chatInput');
|
||||
const message = chatInput.value.trim();
|
||||
|
||||
if (!message || message.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (message.length > MAX_MESSAGE_LENGTH) {
|
||||
addSystemMessage(`Message too long (max ${MAX_MESSAGE_LENGTH} characters)`, 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!socket || !isAuthenticated) {
|
||||
messageQueue.push(message);
|
||||
addSystemMessage('Connecting... Your message will be sent soon.', 'warning');
|
||||
chatInput.value = '';
|
||||
updateCharCounter();
|
||||
return;
|
||||
}
|
||||
|
||||
socket.emit('send_message', { message });
|
||||
|
||||
chatInput.value = '';
|
||||
updateCharCounter();
|
||||
}
|
||||
|
||||
function addUserMessage(username, message, timestamp, userColor = '#3498db', badge = null) {
|
||||
const chatMessages = document.getElementById('chatMessages');
|
||||
if (!chatMessages) return;
|
||||
|
||||
const messageDiv = document.createElement('div');
|
||||
messageDiv.className = 'chat-message user-message';
|
||||
|
||||
const time = new Date(timestamp).toLocaleTimeString('en-US', {
|
||||
hour: '2-digit',
|
||||
minute: '2-digit'
|
||||
});
|
||||
|
||||
let badgeHTML = '';
|
||||
if (badge) {
|
||||
let badgeStyle = '';
|
||||
if (badge.style === 'rainbow') {
|
||||
badgeStyle = `background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #ffeaa7, #fab1a0, #fd79a8); background-size: 400% 400%; animation: rainbow 3s ease infinite; -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; font-weight: bold; display: inline;`;
|
||||
} else if (badge.style === 'gradient') {
|
||||
if (badge.badge === 'CONTRIBUTOR') {
|
||||
badgeStyle = `background: linear-gradient(45deg, #22c55e, #16a34a); background-size: 200% 200%; animation: contributorGlow 2s ease infinite; -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; font-weight: bold; display: inline;`;
|
||||
} else {
|
||||
badgeStyle = `color: ${badge.color}; font-weight: bold; display: inline;`;
|
||||
}
|
||||
}
|
||||
|
||||
badgeHTML = `<span class="user-badge" style="${badgeStyle}">[${badge.badge}]</span> `;
|
||||
}
|
||||
|
||||
messageDiv.innerHTML = `
|
||||
<div class="message-header">
|
||||
<span class="message-user-info">${badgeHTML}<span class="message-username" style="font-weight: bold;" data-username-color="${userColor}">${escapeHtml(username)}</span></span>
|
||||
<span class="message-time">${time}</span>
|
||||
</div>
|
||||
<div class="message-content">${message}</div>
|
||||
`;
|
||||
|
||||
const usernameElement = messageDiv.querySelector('.message-username');
|
||||
if (usernameElement) {
|
||||
applyUserColorStyle(usernameElement, userColor);
|
||||
}
|
||||
|
||||
chatMessages.appendChild(messageDiv);
|
||||
scrollToBottom();
|
||||
}
|
||||
|
||||
function addSystemMessage(message, type = 'info') {
|
||||
const chatMessages = document.getElementById('chatMessages');
|
||||
if (!chatMessages) return;
|
||||
|
||||
const messageDiv = document.createElement('div');
|
||||
messageDiv.className = `chat-message system-message system-${type}`;
|
||||
messageDiv.innerHTML = `
|
||||
<div class="message-content">
|
||||
<i class="fas fa-info-circle"></i> ${escapeHtml(message)}
|
||||
</div>
|
||||
`;
|
||||
|
||||
chatMessages.appendChild(messageDiv);
|
||||
scrollToBottom();
|
||||
}
|
||||
|
||||
function updateOnlineCount(count) {
|
||||
const onlineCountElement = document.getElementById('chatOnlineCount');
|
||||
if (onlineCountElement) {
|
||||
onlineCountElement.textContent = count;
|
||||
}
|
||||
}
|
||||
|
||||
function updateCharCounter() {
|
||||
const chatInput = document.getElementById('chatInput');
|
||||
const charCounter = document.getElementById('chatCharCounter');
|
||||
|
||||
if (chatInput && charCounter) {
|
||||
const length = chatInput.value.length;
|
||||
charCounter.textContent = `${length}/${MAX_MESSAGE_LENGTH}`;
|
||||
|
||||
if (length > MAX_MESSAGE_LENGTH * 0.9) {
|
||||
charCounter.classList.add('warning');
|
||||
} else {
|
||||
charCounter.classList.remove('warning');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function scrollToBottom() {
|
||||
const chatMessages = document.getElementById('chatMessages');
|
||||
if (chatMessages) {
|
||||
chatMessages.scrollTop = chatMessages.scrollHeight;
|
||||
}
|
||||
}
|
||||
|
||||
function clearAllMessages() {
|
||||
const chatMessages = document.getElementById('chatMessages');
|
||||
if (chatMessages) {
|
||||
chatMessages.innerHTML = '';
|
||||
console.log('Chat cleared');
|
||||
}
|
||||
}
|
||||
|
||||
function escapeHtml(text) {
|
||||
const div = document.createElement('div');
|
||||
div.textContent = text;
|
||||
return div.innerHTML;
|
||||
}
|
||||
|
||||
window.addEventListener('beforeunload', () => {
|
||||
if (socket && socket.connected) {
|
||||
socket.disconnect();
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const usernameSubmitBtn = document.getElementById('chatUsernameSubmit');
|
||||
const usernameCancelBtn = document.getElementById('chatUsernameCancel');
|
||||
const usernameInput = document.getElementById('chatUsernameInput');
|
||||
|
||||
if (usernameSubmitBtn) {
|
||||
usernameSubmitBtn.addEventListener('click', submitChatUsername);
|
||||
}
|
||||
|
||||
if (usernameCancelBtn) {
|
||||
usernameCancelBtn.addEventListener('click', () => {
|
||||
hideUsernameModal();
|
||||
const playNavItem = document.querySelector('[data-page="play"]');
|
||||
if (playNavItem) playNavItem.click();
|
||||
});
|
||||
}
|
||||
|
||||
if (usernameInput) {
|
||||
usernameInput.addEventListener('keypress', (e) => {
|
||||
if (e.key === 'Enter') {
|
||||
e.preventDefault();
|
||||
submitChatUsername();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const chatNavItem = document.querySelector('[data-page="chat"]');
|
||||
if (chatNavItem) {
|
||||
chatNavItem.addEventListener('click', () => {
|
||||
if (!socket) {
|
||||
initChat();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function setupColorSelector() {
|
||||
const colorBtn = document.getElementById('chatColorBtn');
|
||||
if (colorBtn) {
|
||||
colorBtn.addEventListener('click', showChatColorModal);
|
||||
}
|
||||
|
||||
const colorOptions = document.querySelectorAll('.color-option');
|
||||
colorOptions.forEach(option => {
|
||||
option.addEventListener('click', () => {
|
||||
document.querySelectorAll('.color-option').forEach(o => o.classList.remove('selected'));
|
||||
option.classList.add('selected');
|
||||
updateColorPreview();
|
||||
});
|
||||
});
|
||||
|
||||
const customColor = document.getElementById('customColor');
|
||||
if (customColor) {
|
||||
customColor.addEventListener('input', () => {
|
||||
document.querySelectorAll('.color-option').forEach(o => o.classList.remove('selected'));
|
||||
updateColorPreview();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function showChatColorModal() {
|
||||
const modal = document.getElementById('chatColorModal');
|
||||
if (modal) {
|
||||
modal.style.display = 'flex';
|
||||
updateColorPreview();
|
||||
}
|
||||
}
|
||||
|
||||
window.closeChatColorModal = function() {
|
||||
const modal = document.getElementById('chatColorModal');
|
||||
if (modal) {
|
||||
modal.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function updateColorPreview() {
|
||||
const preview = document.getElementById('colorPreview');
|
||||
if (!preview) return;
|
||||
|
||||
const selectedOption = document.querySelector('.color-option.selected');
|
||||
let color = '#3498db';
|
||||
|
||||
if (selectedOption) {
|
||||
color = selectedOption.dataset.color;
|
||||
} else {
|
||||
const customColor = document.getElementById('customColor');
|
||||
if (customColor) color = customColor.value;
|
||||
}
|
||||
|
||||
preview.style.color = color;
|
||||
preview.style.background = 'transparent';
|
||||
preview.style.webkitBackgroundClip = 'initial';
|
||||
preview.style.webkitTextFillColor = 'initial';
|
||||
}
|
||||
|
||||
window.applyChatColor = async function() {
|
||||
let newColor;
|
||||
|
||||
const selectedOption = document.querySelector('.color-option.selected');
|
||||
if (selectedOption) {
|
||||
newColor = selectedOption.dataset.color;
|
||||
} else {
|
||||
const customColor = document.getElementById('customColor');
|
||||
newColor = customColor ? customColor.value : '#3498db';
|
||||
}
|
||||
|
||||
userColor = newColor;
|
||||
|
||||
if (window.electronAPI?.saveChatColor) {
|
||||
await window.electronAPI.saveChatColor(newColor);
|
||||
}
|
||||
|
||||
if (socket && isAuthenticated) {
|
||||
const uuid = await window.electronAPI?.getCurrentUuid();
|
||||
socket.emit('authenticate', {
|
||||
username: chatUsername,
|
||||
userId: await getOrCreatePlayerId(),
|
||||
uuid: uuid,
|
||||
userColor: userColor
|
||||
});
|
||||
|
||||
addSystemMessage('Username color updated successfully', 'success');
|
||||
}
|
||||
|
||||
closeChatColorModal();
|
||||
}
|
||||
|
||||
function applyUserColorStyle(element, color) {
|
||||
element.style.color = color;
|
||||
element.style.background = 'transparent';
|
||||
element.style.webkitBackgroundClip = 'initial';
|
||||
element.style.webkitTextFillColor = 'initial';
|
||||
}
|
||||
|
||||
window.ChatAPI = {
|
||||
send: sendMessage,
|
||||
disconnect: () => socket?.disconnect()
|
||||
};
|
||||
176
GUI/js/featured.js
Normal file
176
GUI/js/featured.js
Normal file
@@ -0,0 +1,176 @@
|
||||
// Featured Servers Management
|
||||
const FEATURED_SERVERS_API = 'https://assets.authbp.xyz/featured.json';
|
||||
|
||||
/**
|
||||
* Safely escape HTML while preserving UTF-8 characters
|
||||
*/
|
||||
function escapeHtml(text) {
|
||||
const div = document.createElement('div');
|
||||
div.textContent = text;
|
||||
return div.innerHTML;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load and display featured servers
|
||||
*/
|
||||
async function loadFeaturedServers() {
|
||||
const featuredContainer = document.getElementById('featuredServersList');
|
||||
const myServersContainer = document.getElementById('myServersList');
|
||||
|
||||
try {
|
||||
console.log('[FeaturedServers] Fetching from', FEATURED_SERVERS_API);
|
||||
|
||||
// Fetch featured servers from API (no cache)
|
||||
const response = await fetch(FEATURED_SERVERS_API, {
|
||||
cache: 'no-store',
|
||||
headers: {
|
||||
'Cache-Control': 'no-cache',
|
||||
'Pragma': 'no-cache',
|
||||
'Accept-Charset': 'utf-8'
|
||||
}
|
||||
});
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
const text = await response.text();
|
||||
const data = JSON.parse(text);
|
||||
const featuredServers = data.featuredServers || [];
|
||||
|
||||
console.log('[FeaturedServers] Loaded', featuredServers.length, 'featured servers');
|
||||
|
||||
// Render featured servers
|
||||
if (featuredServers.length === 0) {
|
||||
featuredContainer.innerHTML = `
|
||||
<div class="loading-spinner">
|
||||
<i class="fas fa-info-circle fa-2x"></i>
|
||||
<p>No featured servers</p>
|
||||
</div>
|
||||
`;
|
||||
} else {
|
||||
const featuredHTML = featuredServers.map((server, index) => {
|
||||
console.log(`[FeaturedServers] Building featured card ${index + 1}:`, server.Name);
|
||||
|
||||
const escapedName = escapeHtml(server.Name || 'Unknown Server');
|
||||
const escapedAddress = escapeHtml(server.Address || '');
|
||||
const bannerUrl = server.img_Banner || 'https://via.placeholder.com/400x240/1e293b/ffffff?text=Server+Banner';
|
||||
|
||||
return `
|
||||
<div class="featured-server-card">
|
||||
<img
|
||||
src="${bannerUrl}"
|
||||
alt="${escapedName}"
|
||||
class="featured-server-banner"
|
||||
onerror="this.src='https://via.placeholder.com/400x240/1e293b/ffffff?text=Server'"
|
||||
/>
|
||||
<div class="featured-server-content">
|
||||
<h3 class="featured-server-name">${escapedName}</h3>
|
||||
<div class="featured-server-address">
|
||||
<span class="server-address-text">${escapedAddress}</span>
|
||||
<button class="copy-address-btn" onclick="copyServerAddress('${escapedAddress}', this)">
|
||||
<i class="fas fa-copy"></i>
|
||||
<span>Copy</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
featuredContainer.innerHTML = featuredHTML;
|
||||
}
|
||||
|
||||
// Show "Coming Soon" for my servers
|
||||
myServersContainer.innerHTML = `
|
||||
<div style="display: flex; align-items: center; justify-content: center; height: 100%; color: #94a3b8; font-size: 1.2rem;">
|
||||
<p>Coming Soon</p>
|
||||
</div>
|
||||
`;
|
||||
|
||||
} catch (error) {
|
||||
console.error('[FeaturedServers] Error loading servers:', error);
|
||||
featuredContainer.innerHTML = `
|
||||
<div class="loading-spinner">
|
||||
<i class="fas fa-exclamation-triangle fa-2x" style="color: #ef4444;"></i>
|
||||
<p>Failed to load servers</p>
|
||||
<p style="font-size: 0.9rem; color: #64748b;">${error.message}</p>
|
||||
</div>
|
||||
`;
|
||||
myServersContainer.innerHTML = `
|
||||
<div style="display: flex; align-items: center; justify-content: center; height: 100%; color: #94a3b8; font-size: 1.2rem;">
|
||||
<p>Coming Soon</p>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy server address to clipboard
|
||||
*/
|
||||
async function copyServerAddress(address, button) {
|
||||
try {
|
||||
await navigator.clipboard.writeText(address);
|
||||
|
||||
// Visual feedback
|
||||
const originalHTML = button.innerHTML;
|
||||
button.classList.add('copied');
|
||||
button.innerHTML = '<i class="fas fa-check"></i><span>Copied!</span>';
|
||||
|
||||
setTimeout(() => {
|
||||
button.classList.remove('copied');
|
||||
button.innerHTML = originalHTML;
|
||||
}, 2000);
|
||||
|
||||
console.log('[FeaturedServers] Copied address:', address);
|
||||
} catch (error) {
|
||||
console.error('[FeaturedServers] Failed to copy address:', error);
|
||||
|
||||
// Fallback for older browsers
|
||||
const textArea = document.createElement('textarea');
|
||||
textArea.value = address;
|
||||
textArea.style.position = 'fixed';
|
||||
textArea.style.left = '-999999px';
|
||||
document.body.appendChild(textArea);
|
||||
textArea.select();
|
||||
|
||||
try {
|
||||
document.execCommand('copy');
|
||||
const originalHTML = button.innerHTML;
|
||||
button.classList.add('copied');
|
||||
button.innerHTML = '<i class="fas fa-check"></i><span>Copied!</span>';
|
||||
|
||||
setTimeout(() => {
|
||||
button.classList.remove('copied');
|
||||
button.innerHTML = originalHTML;
|
||||
}, 2000);
|
||||
} catch (err) {
|
||||
console.error('[FeaturedServers] Fallback copy also failed:', err);
|
||||
}
|
||||
|
||||
document.body.removeChild(textArea);
|
||||
}
|
||||
}
|
||||
|
||||
// Load featured servers when the featured page becomes visible
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const observer = new MutationObserver((mutations) => {
|
||||
mutations.forEach((mutation) => {
|
||||
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
|
||||
const featuredPage = document.getElementById('featured-page');
|
||||
if (featuredPage && featuredPage.classList.contains('active')) {
|
||||
loadFeaturedServers();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const featuredPage = document.getElementById('featured-page');
|
||||
if (featuredPage) {
|
||||
observer.observe(featuredPage, { attributes: true });
|
||||
|
||||
// Load immediately if already visible
|
||||
if (featuredPage.classList.contains('active')) {
|
||||
loadFeaturedServers();
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -4,10 +4,15 @@ const i18n = (() => {
|
||||
let translations = {};
|
||||
const availableLanguages = [
|
||||
{ code: 'en', name: 'English' },
|
||||
{ code: 'es-ES', name: 'Español (España)' },
|
||||
{ code: 'de-DE', name: 'German (Germany)' },
|
||||
{ code: 'es-ES', name: 'Spanish (Spain)' },
|
||||
{ code: 'fr-FR', name: 'French (France)' },
|
||||
{ code: 'pl-PL', name: 'Polish (Poland)' },
|
||||
{ code: 'pt-BR', name: 'Portuguese (Brazil)' },
|
||||
{ code: 'ru-RU', name: 'Russian (Russia)' },
|
||||
{ code: 'sv-SE', name: 'Swedish (Sweden)' },
|
||||
{ code: 'tr-TR', name: 'Turkish (Turkey)' },
|
||||
{ code: 'pl-PL', name: 'Polish (Poland)' }
|
||||
{ code: 'id-ID', name: 'Indonesian (Indonesia)' }
|
||||
];
|
||||
|
||||
// Load single language file
|
||||
|
||||
@@ -45,9 +45,17 @@ export function setupInstallation() {
|
||||
export async function installGame() {
|
||||
if (isDownloading || (installBtn && installBtn.disabled)) return;
|
||||
|
||||
const playerName = (installPlayerName ? installPlayerName.value.trim() : '') || 'Player';
|
||||
let playerName = (installPlayerName ? installPlayerName.value.trim() : '') || 'Player';
|
||||
const installPath = installPathInput ? installPathInput.value.trim() : '';
|
||||
|
||||
// Limit player name to 16 characters
|
||||
if (playerName.length > 16) {
|
||||
playerName = playerName.substring(0, 16);
|
||||
if (installPlayerName) {
|
||||
installPlayerName.value = playerName;
|
||||
}
|
||||
}
|
||||
|
||||
const selectedBranchRadio = document.querySelector('input[name="installBranch"]:checked');
|
||||
const selectedBranch = selectedBranchRadio ? selectedBranchRadio.value : 'release';
|
||||
|
||||
@@ -72,8 +80,11 @@ export async function installGame() {
|
||||
setTimeout(() => {
|
||||
window.LauncherUI.hideProgress();
|
||||
window.LauncherUI.showLauncherOrInstall(true);
|
||||
// Sync player name to both launcher and settings inputs
|
||||
const playerNameInput = document.getElementById('playerName');
|
||||
if (playerNameInput) playerNameInput.value = playerName;
|
||||
const settingsPlayerName = document.getElementById('settingsPlayerName');
|
||||
if (settingsPlayerName) settingsPlayerName.value = playerName;
|
||||
resetInstallButton();
|
||||
}, 2000);
|
||||
}
|
||||
@@ -125,8 +136,11 @@ function simulateInstallation(playerName) {
|
||||
setTimeout(() => {
|
||||
window.LauncherUI.hideProgress();
|
||||
window.LauncherUI.showLauncherOrInstall(true);
|
||||
// Sync player name to both launcher and settings inputs
|
||||
const playerNameInput = document.getElementById('playerName');
|
||||
if (playerNameInput) playerNameInput.value = playerName;
|
||||
const settingsPlayerName = document.getElementById('settingsPlayerName');
|
||||
if (settingsPlayerName) settingsPlayerName.value = playerName;
|
||||
resetInstallButton();
|
||||
}, 2000);
|
||||
}
|
||||
@@ -188,7 +202,16 @@ export async function browseInstallPath() {
|
||||
async function savePlayerName() {
|
||||
try {
|
||||
if (window.electronAPI && window.electronAPI.saveSettings) {
|
||||
const playerName = (installPlayerName ? installPlayerName.value.trim() : '') || 'Player';
|
||||
let playerName = (installPlayerName ? installPlayerName.value.trim() : '') || 'Player';
|
||||
|
||||
// Limit player name to 16 characters
|
||||
if (playerName.length > 16) {
|
||||
playerName = playerName.substring(0, 16);
|
||||
if (installPlayerName) {
|
||||
installPlayerName.value = playerName;
|
||||
}
|
||||
}
|
||||
|
||||
await window.electronAPI.saveSettings({ playerName });
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -246,9 +269,3 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||
setupInstallation();
|
||||
await checkGameStatusAndShowInterface();
|
||||
});
|
||||
window.browseInstallPath = browseInstallPath;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
setupInstallation();
|
||||
await checkGameStatusAndShowInterface();
|
||||
});
|
||||
|
||||
@@ -4,23 +4,66 @@ import './launcher.js';
|
||||
import './news.js';
|
||||
import './mods.js';
|
||||
import './players.js';
|
||||
import './chat.js';
|
||||
import './settings.js';
|
||||
import './logs.js';
|
||||
|
||||
// Initialize i18n immediately (before DOMContentLoaded)
|
||||
let i18nInitialized = false;
|
||||
(async () => {
|
||||
const savedLang = await window.electronAPI?.loadLanguage();
|
||||
await i18n.init(savedLang);
|
||||
i18nInitialized = true;
|
||||
|
||||
// Update language selector if DOM is already loaded
|
||||
if (document.readyState === 'complete' || document.readyState === 'interactive') {
|
||||
updateLanguageSelector();
|
||||
}
|
||||
})();
|
||||
|
||||
async function checkDiscordPopup() {
|
||||
try {
|
||||
const config = await window.electronAPI?.loadConfig();
|
||||
if (!config || config.discordPopup === undefined || config.discordPopup === false) {
|
||||
const modal = document.getElementById('discordPopupModal');
|
||||
if (modal) {
|
||||
const buttons = modal.querySelectorAll('.discord-popup-btn');
|
||||
buttons.forEach(btn => btn.disabled = true);
|
||||
|
||||
setTimeout(() => {
|
||||
modal.style.display = 'flex';
|
||||
modal.classList.add('active');
|
||||
|
||||
setTimeout(() => {
|
||||
buttons.forEach(btn => btn.disabled = false);
|
||||
}, 2000);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to check Discord popup:', error);
|
||||
}
|
||||
}
|
||||
|
||||
window.closeDiscordPopup = function() {
|
||||
const modal = document.getElementById('discordPopupModal');
|
||||
if (modal) {
|
||||
modal.classList.remove('active');
|
||||
setTimeout(() => {
|
||||
modal.style.display = 'none';
|
||||
}, 300);
|
||||
}
|
||||
};
|
||||
|
||||
window.joinDiscord = async function() {
|
||||
await window.electronAPI?.openExternal('https://discord.gg/hf2pdc');
|
||||
|
||||
try {
|
||||
await window.electronAPI?.saveConfig({ discordPopup: true });
|
||||
} catch (error) {
|
||||
console.error('Failed to save Discord popup state:', error);
|
||||
}
|
||||
|
||||
closeDiscordPopup();
|
||||
};
|
||||
|
||||
function updateLanguageSelector() {
|
||||
const langSelect = document.getElementById('languageSelect');
|
||||
if (langSelect) {
|
||||
@@ -51,32 +94,9 @@ function updateLanguageSelector() {
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
// Populate language selector (wait for i18n if needed)
|
||||
if (i18nInitialized) {
|
||||
updateLanguageSelector();
|
||||
}
|
||||
|
||||
// Discord notification
|
||||
const notification = document.getElementById('discordNotification');
|
||||
if (notification) {
|
||||
const dismissed = localStorage.getItem('discordNotificationDismissed');
|
||||
if (!dismissed) {
|
||||
setTimeout(() => {
|
||||
notification.style.display = 'flex';
|
||||
}, 3000);
|
||||
} else {
|
||||
notification.style.display = 'none';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
window.closeDiscordNotification = function() {
|
||||
const notification = document.getElementById('discordNotification');
|
||||
if (notification) {
|
||||
notification.classList.add('hidden');
|
||||
setTimeout(() => {
|
||||
notification.style.display = 'none';
|
||||
}, 300);
|
||||
}
|
||||
localStorage.setItem('discordNotificationDismissed', 'true');
|
||||
};
|
||||
checkDiscordPopup();
|
||||
});
|
||||
@@ -439,6 +439,13 @@ async function savePlayerName() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (playerName.length > 16) {
|
||||
const msg = window.i18n ? window.i18n.t('notifications.playerNameTooLong') : 'Player name must be 16 characters or less';
|
||||
showNotification(msg, 'error');
|
||||
settingsPlayerName.value = playerName.substring(0, 16);
|
||||
return;
|
||||
}
|
||||
|
||||
await window.electronAPI.saveUsername(playerName);
|
||||
const successMsg = window.i18n ? window.i18n.t('notifications.playerNameSaved') : 'Player name saved successfully';
|
||||
showNotification(successMsg, 'success');
|
||||
|
||||
17
GUI/js/ui.js
17
GUI/js/ui.js
@@ -63,8 +63,10 @@ function handleNavigation() {
|
||||
navItems.forEach(item => {
|
||||
item.addEventListener('click', () => {
|
||||
const page = item.getAttribute('data-page');
|
||||
showPage(`${page}-page`);
|
||||
setActiveNav(page);
|
||||
if (page) {
|
||||
showPage(`${page}-page`);
|
||||
setActiveNav(page);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -843,7 +845,7 @@ function getErrorMessage(technicalMessage, errorType) {
|
||||
case 'stall':
|
||||
return 'Download stalled due to slow connection. Please retry.';
|
||||
case 'file':
|
||||
return 'Unable to save file. Check disk space and permissions. Please retry.';
|
||||
return 'Unable to save file. Check permissions. Please retry.';
|
||||
case 'permission':
|
||||
return 'Permission denied. Check if launcher has write access. Please retry.';
|
||||
case 'server':
|
||||
@@ -972,7 +974,7 @@ function setupRetryButton() {
|
||||
if (!currentDownloadState.retryData || currentDownloadState.errorType === 'jre') {
|
||||
currentDownloadState.retryData = {
|
||||
branch: 'release',
|
||||
fileName: '4.pwr'
|
||||
fileName: '7.pwr'
|
||||
};
|
||||
console.log('[UI] Created default PWR retry data:', currentDownloadState.retryData);
|
||||
}
|
||||
@@ -1040,7 +1042,7 @@ function setupRetryButton() {
|
||||
} else {
|
||||
currentDownloadState.retryData = {
|
||||
branch: 'release',
|
||||
fileName: '4.pwr'
|
||||
fileName: '7.pwr'
|
||||
};
|
||||
}
|
||||
console.log('[UI] Created default retry data:', currentDownloadState.retryData);
|
||||
@@ -1100,7 +1102,10 @@ function getRetryContextMessage() {
|
||||
}
|
||||
}
|
||||
|
||||
// Make toggleMaximize globally available
|
||||
window.openDiscordExternal = function() {
|
||||
window.electronAPI?.openExternal('https://discord.gg/hf2pdc');
|
||||
};
|
||||
|
||||
window.toggleMaximize = toggleMaximize;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', setupUI);
|
||||
|
||||
216
GUI/js/update.js
216
GUI/js/update.js
@@ -6,12 +6,12 @@ class ClientUpdateManager {
|
||||
}
|
||||
|
||||
init() {
|
||||
window.electronAPI.onUpdatePopup((updateInfo) => {
|
||||
this.showUpdatePopup(updateInfo);
|
||||
});
|
||||
console.log('🔧 ClientUpdateManager initializing...');
|
||||
|
||||
// Listen for electron-updater events
|
||||
// Listen for electron-updater events from main.js
|
||||
// This is the primary update trigger - main.js checks for updates on startup
|
||||
window.electronAPI.onUpdateAvailable((updateInfo) => {
|
||||
console.log('📥 update-available event received:', updateInfo);
|
||||
this.showUpdatePopup(updateInfo);
|
||||
});
|
||||
|
||||
@@ -20,18 +20,30 @@ class ClientUpdateManager {
|
||||
});
|
||||
|
||||
window.electronAPI.onUpdateDownloaded((updateInfo) => {
|
||||
console.log('📦 update-downloaded event received:', updateInfo);
|
||||
this.showUpdateDownloaded(updateInfo);
|
||||
});
|
||||
|
||||
window.electronAPI.onUpdateError((errorInfo) => {
|
||||
console.log('❌ update-error event received:', errorInfo);
|
||||
this.handleUpdateError(errorInfo);
|
||||
});
|
||||
|
||||
this.checkForUpdatesOnDemand();
|
||||
console.log('✅ ClientUpdateManager initialized');
|
||||
|
||||
// Note: Don't call checkForUpdatesOnDemand() here - main.js already checks
|
||||
// for updates after 3 seconds and sends 'update-available' event.
|
||||
// Calling it here would cause duplicate popups.
|
||||
}
|
||||
|
||||
showUpdatePopup(updateInfo) {
|
||||
if (this.updatePopupVisible) return;
|
||||
console.log('🔔 showUpdatePopup called, updatePopupVisible:', this.updatePopupVisible);
|
||||
|
||||
// Check if popup already exists in DOM (extra safety)
|
||||
if (this.updatePopupVisible || document.getElementById('update-popup-overlay')) {
|
||||
console.log('⚠️ Update popup already visible, skipping');
|
||||
return;
|
||||
}
|
||||
|
||||
this.updatePopupVisible = true;
|
||||
|
||||
@@ -92,7 +104,10 @@ class ClientUpdateManager {
|
||||
</div>
|
||||
|
||||
<div class="update-popup-footer">
|
||||
This popup cannot be closed until you update the launcher
|
||||
<span id="update-footer-text">Downloading update...</span>
|
||||
<button id="update-skip-btn" class="update-skip-btn" style="display: none; margin-top: 0.5rem; background: transparent; border: 1px solid rgba(255,255,255,0.2); color: #9ca3af; padding: 0.5rem 1rem; border-radius: 0.25rem; cursor: pointer; font-size: 0.75rem;">
|
||||
Skip for now (not recommended)
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -113,16 +128,43 @@ class ClientUpdateManager {
|
||||
installBtn.addEventListener('click', async (e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
|
||||
installBtn.disabled = true;
|
||||
installBtn.innerHTML = '<i class="fas fa-spinner fa-spin" style="margin-right: 0.5rem;"></i>Installing...';
|
||||
|
||||
|
||||
try {
|
||||
await window.electronAPI.quitAndInstallUpdate();
|
||||
|
||||
// If we're still here after 5 seconds, the install probably failed
|
||||
setTimeout(() => {
|
||||
console.log('⚠️ Install may have failed - showing skip option');
|
||||
installBtn.disabled = false;
|
||||
installBtn.innerHTML = '<i class="fas fa-check" style="margin-right: 0.5rem;"></i>Try Again';
|
||||
|
||||
// Show skip button
|
||||
const skipBtn = document.getElementById('update-skip-btn');
|
||||
const footerText = document.getElementById('update-footer-text');
|
||||
if (skipBtn) {
|
||||
skipBtn.style.display = 'inline-block';
|
||||
if (footerText) {
|
||||
footerText.textContent = 'Install not working? Skip for now:';
|
||||
}
|
||||
}
|
||||
}, 5000);
|
||||
} catch (error) {
|
||||
console.error('❌ Error installing update:', error);
|
||||
installBtn.disabled = false;
|
||||
installBtn.innerHTML = '<i class="fas fa-check" style="margin-right: 0.5rem;"></i>Install & Restart';
|
||||
|
||||
// Show skip button on error
|
||||
const skipBtn = document.getElementById('update-skip-btn');
|
||||
const footerText = document.getElementById('update-footer-text');
|
||||
if (skipBtn) {
|
||||
skipBtn.style.display = 'inline-block';
|
||||
if (footerText) {
|
||||
footerText.textContent = 'Install failed. Skip for now:';
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -138,10 +180,15 @@ class ClientUpdateManager {
|
||||
|
||||
try {
|
||||
await window.electronAPI.openDownloadPage();
|
||||
console.log('✅ Download page opened, launcher will close...');
|
||||
|
||||
downloadBtn.innerHTML = '<i class="fas fa-check" style="margin-right: 0.5rem;"></i>Launcher closing...';
|
||||
|
||||
console.log('✅ Download page opened');
|
||||
|
||||
downloadBtn.innerHTML = '<i class="fas fa-check" style="margin-right: 0.5rem;"></i>Opened in browser';
|
||||
|
||||
// Close the popup after opening download page
|
||||
setTimeout(() => {
|
||||
this.closeUpdatePopup();
|
||||
}, 1500);
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Error opening download page:', error);
|
||||
downloadBtn.disabled = false;
|
||||
@@ -161,9 +208,39 @@ class ClientUpdateManager {
|
||||
});
|
||||
}
|
||||
|
||||
// Show skip button after 30 seconds as fallback (in case update is stuck)
|
||||
setTimeout(() => {
|
||||
const skipBtn = document.getElementById('update-skip-btn');
|
||||
const footerText = document.getElementById('update-footer-text');
|
||||
if (skipBtn) {
|
||||
skipBtn.style.display = 'inline-block';
|
||||
if (footerText) {
|
||||
footerText.textContent = 'Update taking too long?';
|
||||
}
|
||||
}
|
||||
}, 30000);
|
||||
|
||||
const skipBtn = document.getElementById('update-skip-btn');
|
||||
if (skipBtn) {
|
||||
skipBtn.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
this.closeUpdatePopup();
|
||||
});
|
||||
}
|
||||
|
||||
console.log('🔔 Update popup displayed with new style');
|
||||
}
|
||||
|
||||
closeUpdatePopup() {
|
||||
const overlay = document.getElementById('update-popup-overlay');
|
||||
if (overlay) {
|
||||
overlay.remove();
|
||||
}
|
||||
this.updatePopupVisible = false;
|
||||
this.unblockInterface();
|
||||
}
|
||||
|
||||
updateDownloadProgress(progress) {
|
||||
const progressBar = document.getElementById('update-progress-bar');
|
||||
const progressPercent = document.getElementById('update-progress-percent');
|
||||
@@ -197,35 +274,96 @@ class ClientUpdateManager {
|
||||
const statusText = document.getElementById('update-status-text');
|
||||
const progressContainer = document.getElementById('update-progress-container');
|
||||
const buttonsContainer = document.getElementById('update-buttons-container');
|
||||
const installBtn = document.getElementById('update-install-btn');
|
||||
const downloadBtn = document.getElementById('update-download-btn');
|
||||
const skipBtn = document.getElementById('update-skip-btn');
|
||||
const footerText = document.getElementById('update-footer-text');
|
||||
const popupContainer = document.querySelector('.update-popup-container');
|
||||
|
||||
if (statusText) {
|
||||
statusText.textContent = 'Update downloaded! Ready to install.';
|
||||
// Remove breathing/pulse animation when download is complete
|
||||
if (popupContainer) {
|
||||
popupContainer.classList.remove('update-popup-pulse');
|
||||
}
|
||||
|
||||
if (progressContainer) {
|
||||
progressContainer.style.display = 'none';
|
||||
}
|
||||
|
||||
// Use platform info from main process if available, fallback to browser detection
|
||||
const autoInstallSupported = updateInfo.autoInstallSupported !== undefined
|
||||
? updateInfo.autoInstallSupported
|
||||
: navigator.platform.toUpperCase().indexOf('MAC') < 0;
|
||||
|
||||
if (!autoInstallSupported) {
|
||||
// macOS: Show manual download as primary since auto-update doesn't work
|
||||
if (statusText) {
|
||||
statusText.textContent = 'Update downloaded but auto-install may not work on macOS.';
|
||||
}
|
||||
|
||||
if (installBtn) {
|
||||
// Still show install button but as secondary option
|
||||
installBtn.classList.add('update-download-btn-secondary');
|
||||
installBtn.innerHTML = '<i class="fas fa-check" style="margin-right: 0.5rem;"></i>Try Install & Restart';
|
||||
}
|
||||
|
||||
if (downloadBtn) {
|
||||
// Make manual download primary
|
||||
downloadBtn.classList.remove('update-download-btn-secondary');
|
||||
downloadBtn.innerHTML = '<i class="fas fa-external-link-alt" style="margin-right: 0.5rem;"></i>Download Manually (Recommended)';
|
||||
}
|
||||
|
||||
if (footerText) {
|
||||
footerText.textContent = 'Auto-install often fails on macOS:';
|
||||
}
|
||||
} else {
|
||||
// Windows/Linux: Auto-install should work
|
||||
if (statusText) {
|
||||
statusText.textContent = 'Update downloaded! Ready to install.';
|
||||
}
|
||||
|
||||
if (footerText) {
|
||||
footerText.textContent = 'Click to install the update:';
|
||||
}
|
||||
}
|
||||
|
||||
if (buttonsContainer) {
|
||||
buttonsContainer.style.display = 'block';
|
||||
}
|
||||
|
||||
console.log('✅ Update downloaded, ready to install');
|
||||
// Always show skip button in downloaded state
|
||||
if (skipBtn) {
|
||||
skipBtn.style.display = 'inline-block';
|
||||
console.log('✅ Skip button made visible');
|
||||
} else {
|
||||
console.error('❌ Skip button not found in DOM!');
|
||||
}
|
||||
|
||||
console.log('✅ Update downloaded, ready to install. autoInstallSupported:', autoInstallSupported);
|
||||
}
|
||||
|
||||
handleUpdateError(errorInfo) {
|
||||
console.error('Update error:', errorInfo);
|
||||
|
||||
|
||||
// Show skip button immediately on any error
|
||||
const skipBtn = document.getElementById('update-skip-btn');
|
||||
const footerText = document.getElementById('update-footer-text');
|
||||
if (skipBtn) {
|
||||
skipBtn.style.display = 'inline-block';
|
||||
if (footerText) {
|
||||
footerText.textContent = 'Update failed. You can skip for now.';
|
||||
}
|
||||
}
|
||||
|
||||
// If manual download is required, update the UI (this will handle status text)
|
||||
if (errorInfo.requiresManualDownload) {
|
||||
this.showManualDownloadRequired(errorInfo);
|
||||
return; // Don't do anything else, showManualDownloadRequired handles everything
|
||||
}
|
||||
|
||||
|
||||
// For non-critical errors, just show error message without changing status
|
||||
const errorMessage = document.getElementById('update-error-message');
|
||||
const errorText = document.getElementById('update-error-text');
|
||||
|
||||
|
||||
if (errorMessage && errorText) {
|
||||
let message = errorInfo.message || 'An error occurred during the update process.';
|
||||
if (errorInfo.isMacSigningError) {
|
||||
@@ -289,6 +427,16 @@ class ClientUpdateManager {
|
||||
buttonsContainer.style.display = 'block';
|
||||
}
|
||||
|
||||
// Show skip button for manual download errors
|
||||
const skipBtn = document.getElementById('update-skip-btn');
|
||||
const footerText = document.getElementById('update-footer-text');
|
||||
if (skipBtn) {
|
||||
skipBtn.style.display = 'inline-block';
|
||||
if (footerText) {
|
||||
footerText.textContent = 'Or continue without updating:';
|
||||
}
|
||||
}
|
||||
|
||||
console.log('⚠️ Manual download required due to update error');
|
||||
}
|
||||
|
||||
@@ -300,13 +448,35 @@ class ClientUpdateManager {
|
||||
|
||||
document.body.classList.add('no-select');
|
||||
|
||||
document.addEventListener('keydown', this.blockKeyEvents.bind(this), true);
|
||||
|
||||
document.addEventListener('contextmenu', this.blockContextMenu.bind(this), true);
|
||||
|
||||
// Store bound functions so we can remove them later
|
||||
this._boundBlockKeyEvents = this.blockKeyEvents.bind(this);
|
||||
this._boundBlockContextMenu = this.blockContextMenu.bind(this);
|
||||
|
||||
document.addEventListener('keydown', this._boundBlockKeyEvents, true);
|
||||
document.addEventListener('contextmenu', this._boundBlockContextMenu, true);
|
||||
|
||||
console.log('🚫 Interface blocked for update');
|
||||
}
|
||||
|
||||
unblockInterface() {
|
||||
const mainContent = document.querySelector('.flex.w-full.h-screen');
|
||||
if (mainContent) {
|
||||
mainContent.classList.remove('interface-blocked');
|
||||
}
|
||||
|
||||
document.body.classList.remove('no-select');
|
||||
|
||||
// Remove event listeners
|
||||
if (this._boundBlockKeyEvents) {
|
||||
document.removeEventListener('keydown', this._boundBlockKeyEvents, true);
|
||||
}
|
||||
if (this._boundBlockContextMenu) {
|
||||
document.removeEventListener('contextmenu', this._boundBlockContextMenu, true);
|
||||
}
|
||||
|
||||
console.log('✅ Interface unblocked');
|
||||
}
|
||||
|
||||
blockKeyEvents(event) {
|
||||
if (event.target.closest('#update-popup-overlay')) {
|
||||
if ((event.key === 'Enter' || event.key === ' ') &&
|
||||
|
||||
250
GUI/locales/de-DE.json
Normal file
250
GUI/locales/de-DE.json
Normal file
@@ -0,0 +1,250 @@
|
||||
{
|
||||
"nav": {
|
||||
"play": "Spielen",
|
||||
"mods": "Mods",
|
||||
"news": "Neuigkeiten",
|
||||
"chat": "Spieler-Chat",
|
||||
"settings": "Einstellungen"
|
||||
},
|
||||
"header": {
|
||||
"playersLabel": "Spieler:",
|
||||
"manageProfiles": "Profile verwalten",
|
||||
"defaultProfile": "Standard"
|
||||
},
|
||||
"install": {
|
||||
"title": "KOSTENLOSER LAUNCHER",
|
||||
"playerName": "Spielername",
|
||||
"playerNamePlaceholder": "Namen eingeben",
|
||||
"gameBranch": "Spielversion",
|
||||
"releaseVersion": "Release (Stabil)",
|
||||
"preReleaseVersion": "Pre-Release (Experimentell)",
|
||||
"customInstallation": "Benutzerdefinierte Installation",
|
||||
"installationFolder": "Installationsordner",
|
||||
"pathPlaceholder": "Standardspeicherort",
|
||||
"browse": "Durchsuchen",
|
||||
"installButton": "HYTALE INSTALLIEREN",
|
||||
"installing": "INSTALLIERE..."
|
||||
},
|
||||
"play": {
|
||||
"ready": "BEREIT ZUM SPIELEN",
|
||||
"subtitle": "Starte Hytale und beginne das Abenteuer",
|
||||
"playButton": "HYTALE SPIELEN",
|
||||
"latestNews": "NEUESTE NACHRICHTEN",
|
||||
"viewAll": "ALLE ANZEIGEN",
|
||||
"checking": "ÜBERPRÜFE...",
|
||||
"play": "SPIELEN"
|
||||
},
|
||||
"mods": {
|
||||
"searchPlaceholder": "Mods suchen...",
|
||||
"myMods": "MEINE MODS",
|
||||
"previous": "ZURÜCK",
|
||||
"next": "WEITER",
|
||||
"page": "Seite",
|
||||
"of": "von",
|
||||
"modalTitle": "MEINE MODS",
|
||||
"noModsFound": "Keine Mods gefunden",
|
||||
"noModsFoundDesc": "Versuche deine Suche anzupassen",
|
||||
"noModsInstalled": "Keine Mods installiert",
|
||||
"noModsInstalledDesc": "Füge Mods von CurseForge hinzu oder importiere lokale Dateien",
|
||||
"view": "ANZEIGEN",
|
||||
"install": "INSTALLIEREN",
|
||||
"installed": "INSTALLIERT",
|
||||
"enable": "AKTIVIEREN",
|
||||
"disable": "DEAKTIVIEREN",
|
||||
"active": "AKTIV",
|
||||
"disabled": "DEAKTIVIERT",
|
||||
"delete": "Mod löschen",
|
||||
"noDescription": "Keine Beschreibung verfügbar",
|
||||
"confirmDelete": "Möchtest du \"{name}\" wirklich löschen?",
|
||||
"confirmDeleteDesc": "Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"confirmDeletion": "Löschung bestätigen",
|
||||
"apiKeyRequired": "API-Schlüssel erforderlich",
|
||||
"apiKeyRequiredDesc": "CurseForge API-Schlüssel wird benötigt, um Mods zu durchsuchen"
|
||||
},
|
||||
"news": {
|
||||
"title": "ALLE NACHRICHTEN",
|
||||
"readMore": "Mehr lesen"
|
||||
},
|
||||
"chat": {
|
||||
"title": "SPIELER-CHAT",
|
||||
"pickColor": "Farbe",
|
||||
"inputPlaceholder": "Nachricht eingeben...",
|
||||
"send": "Senden",
|
||||
"online": "online",
|
||||
"charCounter": "{current}/{max}",
|
||||
"secureChat": "Sicherer Chat - Links werden zensiert",
|
||||
"joinChat": "Chat beitreten",
|
||||
"chooseUsername": "Wähle einen Benutzernamen, um dem Spieler-Chat beizutreten",
|
||||
"username": "Benutzername",
|
||||
"usernamePlaceholder": "Benutzernamen eingeben...",
|
||||
"usernameHint": "3-20 Zeichen, nur Buchstaben, Zahlen, - und _",
|
||||
"joinButton": "Chat beitreten",
|
||||
"colorModal": {
|
||||
"title": "Benutzernamenfarbe anpassen",
|
||||
"chooseSolid": "Wähle eine einfarbige Farbe:",
|
||||
"customColor": "Benutzerdefinierte Farbe:",
|
||||
"preview": "Vorschau:",
|
||||
"previewUsername": "Benutzername",
|
||||
"apply": "Farbe anwenden"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "EINSTELLUNGEN",
|
||||
"java": "Java Runtime",
|
||||
"useCustomJava": "Benutzerdefinierten Java-Pfad verwenden",
|
||||
"javaDescription": "Ersetze die mitgelieferte Java-Installation durch deine eigene",
|
||||
"javaPath": "Java-Ausführungsdatei-Pfad",
|
||||
"javaPathPlaceholder": "Java-Pfad auswählen...",
|
||||
"javaBrowse": "Durchsuchen",
|
||||
"javaHint": "Wähle den Java-Installationsordner (unterstützt Windows, Mac, Linux)",
|
||||
"discord": "Discord-Integration",
|
||||
"enableRPC": "Discord Rich Presence aktivieren",
|
||||
"discordDescription": "Zeige deine Launcher-Aktivität auf Discord",
|
||||
"game": "Spieloptionen",
|
||||
"playerName": "Spielername",
|
||||
"playerNamePlaceholder": "Spielernamen eingeben",
|
||||
"playerNameHint": "Dieser Name wird im Spiel verwendet (1-16 Zeichen)",
|
||||
"openGameLocation": "Spielordner öffnen",
|
||||
"openGameLocationDesc": "Öffne den Spielinstallationsordner",
|
||||
"account": "Spieler-UUID-Verwaltung",
|
||||
"currentUUID": "Aktuelle UUID",
|
||||
"uuidPlaceholder": "UUID wird geladen...",
|
||||
"copyUUID": "UUID kopieren",
|
||||
"regenerateUUID": "UUID neu generieren",
|
||||
"uuidHint": "Deine eindeutige Spielerkennung für diesen Benutzernamen",
|
||||
"manageUUIDs": "Alle UUIDs verwalten",
|
||||
"manageUUIDsDesc": "Alle Spieler-UUIDs anzeigen und verwalten",
|
||||
"language": "Sprache",
|
||||
"selectLanguage": "Sprache auswählen",
|
||||
"repairGame": "Spiel reparieren",
|
||||
"reinstallGame": "Spieldateien neu installieren (behält Daten)",
|
||||
"gpuPreference": "GPU-Präferenz",
|
||||
"gpuHint": "Funktion nur für Laptops; auf „Integriert“ stellen, wenn auf einem PC.",
|
||||
"gpuAuto": "Auto",
|
||||
"gpuIntegrated": "Integriert",
|
||||
"gpuDedicated": "Dediziert",
|
||||
"logs": "SYSTEMPROTOKOLLE",
|
||||
"logsCopy": "Kopieren",
|
||||
"logsRefresh": "Aktualisieren",
|
||||
"logsFolder": "Ordner öffnen",
|
||||
"logsLoading": "Protokolle werden geladen...",
|
||||
"closeLauncher": "Launcher-Verhalten",
|
||||
"closeOnStart": "Launcher beim Spielstart schließen",
|
||||
"closeOnStartDescription": "Schließe den Launcher automatisch, nachdem Hytale gestartet wurde",
|
||||
"hwAccel": "Hardware-Beschleunigung",
|
||||
"hwAccelDescription": "Hardware-Beschleunigung für den Launcher aktivieren",
|
||||
"gameBranch": "Spiel-Branch",
|
||||
"branchRelease": "Release",
|
||||
"branchPreRelease": "Pre-Release",
|
||||
"branchHint": "Wechsel zwischen stabiler Release- und experimenteller Pre-Release-Version",
|
||||
"branchWarning": "Das Ändern des Branches lädt eine andere Spielversion herunter und installiert sie",
|
||||
"branchSwitching": "Wechsle zu {branch}...",
|
||||
"branchSwitched": "Erfolgreich zu {branch} gewechselt!",
|
||||
"installRequired": "Installation erforderlich",
|
||||
"branchInstallConfirm": "Das Spiel wird für den {branch}-Branch installiert. Fortfahren?"
|
||||
},
|
||||
"uuid": {
|
||||
"modalTitle": "UUID-Verwaltung",
|
||||
"currentUserUUID": "Aktuelle Benutzer-UUID",
|
||||
"allPlayerUUIDs": "Alle Spieler-UUIDs",
|
||||
"generateNew": "Neue UUID generieren",
|
||||
"loadingUUIDs": "UUIDs werden geladen...",
|
||||
"setCustomUUID": "Benutzerdefinierte UUID festlegen",
|
||||
"customPlaceholder": "Benutzerdefinierte UUID eingeben (Format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)",
|
||||
"setUUID": "UUID festlegen",
|
||||
"warning": "Warnung: Das Festlegen einer benutzerdefinierten UUID ändert deine aktuelle Spieleridentität",
|
||||
"copyTooltip": "UUID kopieren",
|
||||
"regenerateTooltip": "Neue UUID generieren"
|
||||
},
|
||||
"profiles": {
|
||||
"modalTitle": "Profile verwalten",
|
||||
"newProfilePlaceholder": "Neuer Profilname",
|
||||
"createProfile": "Profil erstellen"
|
||||
},
|
||||
"discord": {
|
||||
"notificationText": "Tritt unserer Discord-Community bei!",
|
||||
"joinButton": "Discord beitreten"
|
||||
},
|
||||
"common": {
|
||||
"confirm": "Bestätigen",
|
||||
"cancel": "Abbrechen",
|
||||
"save": "Speichern",
|
||||
"close": "Schließen",
|
||||
"delete": "Löschen",
|
||||
"edit": "Bearbeiten",
|
||||
"loading": "Lädt...",
|
||||
"apply": "Anwenden",
|
||||
"install": "Installieren"
|
||||
},
|
||||
"notifications": {
|
||||
"gameDataNotFound": "Fehler: Spieldaten nicht gefunden",
|
||||
"gameUpdatedSuccess": "Spiel erfolgreich aktualisiert! 🎉",
|
||||
"updateFailed": "Update fehlgeschlagen: {error}",
|
||||
"updateError": "Update-Fehler: {error}",
|
||||
"discordEnabled": "Discord Rich Presence aktiviert",
|
||||
"discordDisabled": "Discord Rich Presence deaktiviert",
|
||||
"discordSaveFailed": "Discord-Einstellung konnte nicht gespeichert werden",
|
||||
"playerNameRequired": "Bitte gib einen gültigen Spielernamen ein",
|
||||
"playerNameSaved": "Spielername erfolgreich gespeichert",
|
||||
"playerNameSaveFailed": "Spielername konnte nicht gespeichert werden",
|
||||
"uuidCopied": "UUID in die Zwischenablage kopiert!",
|
||||
"uuidCopyFailed": "UUID konnte nicht kopiert werden",
|
||||
"uuidRegenNotAvailable": "UUID-Neugenerierung nicht verfügbar",
|
||||
"uuidRegenFailed": "UUID konnte nicht neu generiert werden",
|
||||
"uuidGenerated": "Neue UUID erfolgreich generiert!",
|
||||
"uuidGeneratedShort": "Neue UUID generiert!",
|
||||
"uuidGenerateFailed": "Neue UUID konnte nicht generiert werden",
|
||||
"uuidRequired": "Bitte gib eine UUID ein",
|
||||
"uuidInvalidFormat": "Ungültiges UUID-Format",
|
||||
"uuidSetFailed": "Benutzerdefinierte UUID konnte nicht festgelegt werden",
|
||||
"uuidSetSuccess": "Benutzerdefinierte UUID erfolgreich festgelegt!",
|
||||
"uuidDeleteFailed": "UUID konnte nicht gelöscht werden",
|
||||
"uuidDeleteSuccess": "UUID erfolgreich gelöscht!",
|
||||
"modsDownloading": "{name} wird heruntergeladen...",
|
||||
"modsTogglingMod": "Mod wird umgeschaltet...",
|
||||
"modsDeletingMod": "Mod wird gelöscht...",
|
||||
"modsLoadingMods": "Mods von CurseForge werden geladen...",
|
||||
"modsInstalledSuccess": "{name} erfolgreich installiert! 🎉",
|
||||
"modsDeletedSuccess": "{name} erfolgreich gelöscht",
|
||||
"modsDownloadFailed": "Mod konnte nicht heruntergeladen werden: {error}",
|
||||
"modsToggleFailed": "Mod konnte nicht umgeschaltet werden: {error}",
|
||||
"modsDeleteFailed": "Mod konnte nicht gelöscht werden: {error}",
|
||||
"modsModNotFound": "Mod-Informationen nicht gefunden",
|
||||
"hwAccelSaved": "Hardware-Beschleunigungseinstellung gespeichert",
|
||||
"hwAccelSaveFailed": "Hardware-Beschleunigungseinstellung konnte nicht gespeichert werden"
|
||||
},
|
||||
"confirm": {
|
||||
"defaultTitle": "Aktion bestätigen",
|
||||
"regenerateUuidTitle": "Neue UUID generieren",
|
||||
"regenerateUuidMessage": "Möchtest du wirklich eine neue UUID generieren? Dies ändert deine Spieleridentität.",
|
||||
"regenerateUuidButton": "Generieren",
|
||||
"setCustomUuidTitle": "Benutzerdefinierte UUID festlegen",
|
||||
"setCustomUuidMessage": "Möchtest du wirklich diese benutzerdefinierte UUID festlegen? Dies ändert deine Spieleridentität.",
|
||||
"setCustomUuidButton": "UUID festlegen",
|
||||
"deleteUuidTitle": "UUID löschen",
|
||||
"deleteUuidMessage": "Möchtest du wirklich die UUID für \"{username}\" löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"deleteUuidButton": "Löschen",
|
||||
"uninstallGameTitle": "Spiel deinstallieren",
|
||||
"uninstallGameMessage": "Möchtest du Hytale wirklich deinstallieren? Alle Spieldateien werden gelöscht.",
|
||||
"uninstallGameButton": "Deinstallieren"
|
||||
},
|
||||
"progress": {
|
||||
"initializing": "Initialisiere...",
|
||||
"downloading": "Lädt herunter...",
|
||||
"installing": "Installiere...",
|
||||
"extracting": "Entpacke...",
|
||||
"verifying": "Überprüfe...",
|
||||
"switchingProfile": "Profil wird gewechselt...",
|
||||
"profileSwitched": "Profil gewechselt!",
|
||||
"startingGame": "Spiel wird gestartet...",
|
||||
"launching": "STARTET...",
|
||||
"uninstallingGame": "Spiel wird deinstalliert...",
|
||||
"gameUninstalled": "Spiel erfolgreich deinstalliert!",
|
||||
"uninstallFailed": "Deinstallation fehlgeschlagen: {error}",
|
||||
"startingUpdate": "Obligatorisches Spiel-Update wird gestartet...",
|
||||
"installationComplete": "Installation erfolgreich abgeschlossen!",
|
||||
"installationFailed": "Installation fehlgeschlagen: {error}",
|
||||
"installingGameFiles": "Spieldateien werden installiert...",
|
||||
"installComplete": "Installation abgeschlossen!"
|
||||
}
|
||||
}
|
||||
@@ -119,7 +119,7 @@
|
||||
"repairGame": "Repair Game",
|
||||
"reinstallGame": "Reinstall game files (preserves data)",
|
||||
"gpuPreference": "GPU Preference",
|
||||
"gpuHint": "Select your preferred GPU (Linux: affects DRI_PRIME)",
|
||||
"gpuHint": "Laptop-only feature; set to Integrated if on PC",
|
||||
"gpuAuto": "Auto",
|
||||
"gpuIntegrated": "Integrated",
|
||||
"gpuDedicated": "Dedicated",
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
"repairGame": "Reparar juego",
|
||||
"reinstallGame": "Reinstalar archivos del juego (conserva los datos)",
|
||||
"gpuPreference": "Preferencia de GPU",
|
||||
"gpuHint": "Selecciona tu GPU preferida (Linux: afecta DRI_PRIME)",
|
||||
"gpuHint": "Función exclusiva para computadora portátil; configúrela como Integrada si está en una PC",
|
||||
"gpuAuto": "Automático",
|
||||
"gpuIntegrated": "Integrada",
|
||||
"gpuDedicated": "Dedicada",
|
||||
@@ -131,6 +131,8 @@
|
||||
"closeLauncher": "Comportamiento del Launcher",
|
||||
"closeOnStart": "Cerrar Launcher al iniciar el juego",
|
||||
"closeOnStartDescription": "Cierra automáticamente el launcher después de que Hytale se haya iniciado",
|
||||
"hwAccel": "Aceleración por Hardware",
|
||||
"hwAccelDescription": "Habilitar aceleración por hardware para el launcher",
|
||||
"gameBranch": "Rama del Juego",
|
||||
"branchRelease": "Lanzamiento",
|
||||
"branchPreRelease": "Pre-Lanzamiento",
|
||||
@@ -207,7 +209,9 @@
|
||||
"modsDownloadFailed": "Error al descargar mod: {error}",
|
||||
"modsToggleFailed": "Error al alternar mod: {error}",
|
||||
"modsDeleteFailed": "Error al eliminar mod: {error}",
|
||||
"modsModNotFound": "Información del mod no encontrada"
|
||||
"modsModNotFound": "Información del mod no encontrada",
|
||||
"hwAccelSaved": "Configuración de aceleración por hardware guardada",
|
||||
"hwAccelSaveFailed": "Error al guardar la configuración de aceleración por hardware"
|
||||
},
|
||||
"confirm": {
|
||||
"defaultTitle": "Confirmar acción",
|
||||
@@ -243,4 +247,4 @@
|
||||
"installingGameFiles": "Instalando archivos del juego...",
|
||||
"installComplete": "¡Instalación completa!"
|
||||
}
|
||||
}
|
||||
}
|
||||
250
GUI/locales/fr-FR.json
Normal file
250
GUI/locales/fr-FR.json
Normal file
@@ -0,0 +1,250 @@
|
||||
{
|
||||
"nav": {
|
||||
"play": "Jouer",
|
||||
"mods": "Mods",
|
||||
"news": "Actualités",
|
||||
"chat": "Chat Joueurs",
|
||||
"settings": "Paramètres"
|
||||
},
|
||||
"header": {
|
||||
"playersLabel": "Joueurs:",
|
||||
"manageProfiles": "Gérer les Profils",
|
||||
"defaultProfile": "Par défaut"
|
||||
},
|
||||
"install": {
|
||||
"title": "LAUNCHER GRATUIT",
|
||||
"playerName": "Nom du Joueur",
|
||||
"playerNamePlaceholder": "Entrez votre nom",
|
||||
"gameBranch": "Version du Jeu",
|
||||
"releaseVersion": "Release (Stable)",
|
||||
"preReleaseVersion": "Pré-Release (Expérimental)",
|
||||
"customInstallation": "Installation Personnalisée",
|
||||
"installationFolder": "Dossier d'Installation",
|
||||
"pathPlaceholder": "Emplacement par défaut",
|
||||
"browse": "Parcourir",
|
||||
"installButton": "INSTALLER HYTALE",
|
||||
"installing": "INSTALLATION..."
|
||||
},
|
||||
"play": {
|
||||
"ready": "PRÊT À JOUER",
|
||||
"subtitle": "Lancez Hytale et entrez dans l'aventure",
|
||||
"playButton": "JOUER À HYTALE",
|
||||
"latestNews": "DERNIÈRES ACTUALITÉS",
|
||||
"viewAll": "VOIR TOUT",
|
||||
"checking": "VÉRIFICATION...",
|
||||
"play": "JOUER"
|
||||
},
|
||||
"mods": {
|
||||
"searchPlaceholder": "Rechercher des mods...",
|
||||
"myMods": "MES MODS",
|
||||
"previous": "PRÉCÉDENT",
|
||||
"next": "SUIVANT",
|
||||
"page": "Page",
|
||||
"of": "sur",
|
||||
"modalTitle": "MES MODS",
|
||||
"noModsFound": "Aucun Mod Trouvé",
|
||||
"noModsFoundDesc": "Essayez d'ajuster votre recherche",
|
||||
"noModsInstalled": "Aucun Mod Installé",
|
||||
"noModsInstalledDesc": "Ajoutez des mods depuis CurseForge ou importez des fichiers locaux",
|
||||
"view": "VOIR",
|
||||
"install": "INSTALLER",
|
||||
"installed": "INSTALLÉ",
|
||||
"enable": "ACTIVER",
|
||||
"disable": "DÉSACTIVER",
|
||||
"active": "ACTIF",
|
||||
"disabled": "DÉSACTIVÉ",
|
||||
"delete": "Supprimer le mod",
|
||||
"noDescription": "Aucune description disponible",
|
||||
"confirmDelete": "Êtes-vous sûr de vouloir supprimer \"{name}\" ?",
|
||||
"confirmDeleteDesc": "Cette action est irréversible.",
|
||||
"confirmDeletion": "Confirmer la Suppression",
|
||||
"apiKeyRequired": "Clé API Requise",
|
||||
"apiKeyRequiredDesc": "Une clé API CurseForge est nécessaire pour parcourir les mods"
|
||||
},
|
||||
"news": {
|
||||
"title": "TOUTES LES ACTUALITÉS",
|
||||
"readMore": "Lire Plus"
|
||||
},
|
||||
"chat": {
|
||||
"title": "CHAT JOUEURS",
|
||||
"pickColor": "Couleur",
|
||||
"inputPlaceholder": "Tapez votre message...",
|
||||
"send": "Envoyer",
|
||||
"online": "en ligne",
|
||||
"charCounter": "{current}/{max}",
|
||||
"secureChat": "Chat sécurisé - Les liens sont censurés",
|
||||
"joinChat": "Rejoindre le Chat",
|
||||
"chooseUsername": "Choisissez un nom d'utilisateur pour rejoindre le Chat Joueurs",
|
||||
"username": "Nom d'utilisateur",
|
||||
"usernamePlaceholder": "Entrez votre nom d'utilisateur...",
|
||||
"usernameHint": "3-20 caractères, lettres, chiffres, - et _ uniquement",
|
||||
"joinButton": "Rejoindre le Chat",
|
||||
"colorModal": {
|
||||
"title": "Personnaliser la Couleur du Nom",
|
||||
"chooseSolid": "Choisissez une couleur unie:",
|
||||
"customColor": "Couleur personnalisée:",
|
||||
"preview": "Aperçu:",
|
||||
"previewUsername": "Nom d'utilisateur",
|
||||
"apply": "Appliquer la Couleur"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "PARAMÈTRES",
|
||||
"java": "Java Runtime",
|
||||
"useCustomJava": "Utiliser un Chemin Java Personnalisé",
|
||||
"javaDescription": "Remplacer le Java intégré par votre propre installation",
|
||||
"javaPath": "Chemin de l'Exécutable Java",
|
||||
"javaPathPlaceholder": "Sélectionnez le chemin Java...",
|
||||
"javaBrowse": "Parcourir",
|
||||
"javaHint": "Sélectionnez le dossier d'installation de Java (compatible Windows, Mac, Linux)",
|
||||
"discord": "Intégration Discord",
|
||||
"enableRPC": "Activer Discord Rich Presence",
|
||||
"discordDescription": "Afficher votre activité du launcher sur Discord",
|
||||
"game": "Options de Jeu",
|
||||
"playerName": "Nom du Joueur",
|
||||
"playerNamePlaceholder": "Entrez le nom du joueur",
|
||||
"playerNameHint": "Ce nom sera utilisé en jeu (1-16 caractères)",
|
||||
"openGameLocation": "Ouvrir l'Emplacement du Jeu",
|
||||
"openGameLocationDesc": "Ouvrir le dossier d'installation du jeu",
|
||||
"account": "Gestion UUID Joueur",
|
||||
"currentUUID": "UUID Actuel",
|
||||
"uuidPlaceholder": "Chargement UUID...",
|
||||
"copyUUID": "Copier UUID",
|
||||
"regenerateUUID": "Régénérer UUID",
|
||||
"uuidHint": "Votre identifiant unique de joueur pour ce nom d'utilisateur",
|
||||
"manageUUIDs": "Gérer Tous les UUIDs",
|
||||
"manageUUIDsDesc": "Voir et gérer tous les UUIDs de joueurs",
|
||||
"language": "Langue",
|
||||
"selectLanguage": "Sélectionner la Langue",
|
||||
"repairGame": "Réparer le Jeu",
|
||||
"reinstallGame": "Réinstaller les fichiers du jeu (préserve les données)",
|
||||
"gpuPreference": "Préférence GPU",
|
||||
"gpuHint": "Fonctionnalité exclusive aux ordinateurs portables; à définir sur Intégré sur PC",
|
||||
"gpuAuto": "Auto",
|
||||
"gpuIntegrated": "Intégré",
|
||||
"gpuDedicated": "Dédié",
|
||||
"logs": "JOURNAUX SYSTÈME",
|
||||
"logsCopy": "Copier",
|
||||
"logsRefresh": "Actualiser",
|
||||
"logsFolder": "Ouvrir le Dossier",
|
||||
"logsLoading": "Chargement des journaux...",
|
||||
"closeLauncher": "Comportement du Launcher",
|
||||
"closeOnStart": "Fermer le Launcher au démarrage du jeu",
|
||||
"closeOnStartDescription": "Fermer automatiquement le launcher après le lancement d'Hytale",
|
||||
"hwAccel": "Accélération Matérielle",
|
||||
"hwAccelDescription": "Activer l'accélération matérielle pour le launcher",
|
||||
"gameBranch": "Branche du Jeu",
|
||||
"branchRelease": "Release",
|
||||
"branchPreRelease": "Pré-Release",
|
||||
"branchHint": "Basculer entre la version stable release et la pré-release expérimentale",
|
||||
"branchWarning": "Changer de branche téléchargera et installera une version différente du jeu",
|
||||
"branchSwitching": "Passage à {branch}...",
|
||||
"branchSwitched": "Passage à {branch} réussi!",
|
||||
"installRequired": "Installation Requise",
|
||||
"branchInstallConfirm": "Le jeu sera installé pour la branche {branch}. Continuer?"
|
||||
},
|
||||
"uuid": {
|
||||
"modalTitle": "Gestion UUID",
|
||||
"currentUserUUID": "UUID Utilisateur Actuel",
|
||||
"allPlayerUUIDs": "Tous les UUIDs Joueurs",
|
||||
"generateNew": "Générer Nouvel UUID",
|
||||
"loadingUUIDs": "Chargement des UUIDs...",
|
||||
"setCustomUUID": "Définir UUID Personnalisé",
|
||||
"customPlaceholder": "Entrez UUID personnalisé (format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)",
|
||||
"setUUID": "Définir UUID",
|
||||
"warning": "Attention: Définir un UUID personnalisé changera votre identité de joueur actuelle",
|
||||
"copyTooltip": "Copier UUID",
|
||||
"regenerateTooltip": "Générer Nouvel UUID"
|
||||
},
|
||||
"profiles": {
|
||||
"modalTitle": "Gérer les Profils",
|
||||
"newProfilePlaceholder": "Nom du Nouveau Profil",
|
||||
"createProfile": "Créer un Profil"
|
||||
},
|
||||
"discord": {
|
||||
"notificationText": "Rejoignez notre communauté Discord!",
|
||||
"joinButton": "Rejoindre Discord"
|
||||
},
|
||||
"common": {
|
||||
"confirm": "Confirmer",
|
||||
"cancel": "Annuler",
|
||||
"save": "Sauvegarder",
|
||||
"close": "Fermer",
|
||||
"delete": "Supprimer",
|
||||
"edit": "Modifier",
|
||||
"loading": "Chargement...",
|
||||
"apply": "Appliquer",
|
||||
"install": "Installer"
|
||||
},
|
||||
"notifications": {
|
||||
"gameDataNotFound": "Erreur: Données du jeu introuvables",
|
||||
"gameUpdatedSuccess": "Jeu mis à jour avec succès! 🎉",
|
||||
"updateFailed": "Mise à jour échouée: {error}",
|
||||
"updateError": "Erreur de mise à jour: {error}",
|
||||
"discordEnabled": "Discord Rich Presence activé",
|
||||
"discordDisabled": "Discord Rich Presence désactivé",
|
||||
"discordSaveFailed": "Échec de la sauvegarde des paramètres Discord",
|
||||
"playerNameRequired": "Veuillez entrer un nom de joueur valide",
|
||||
"playerNameSaved": "Nom du joueur sauvegardé avec succès",
|
||||
"playerNameSaveFailed": "Échec de la sauvegarde du nom du joueur",
|
||||
"uuidCopied": "UUID copié dans le presse-papiers!",
|
||||
"uuidCopyFailed": "Échec de la copie de l'UUID",
|
||||
"uuidRegenNotAvailable": "Régénération UUID non disponible",
|
||||
"uuidRegenFailed": "Échec de la régénération de l'UUID",
|
||||
"uuidGenerated": "Nouvel UUID généré avec succès!",
|
||||
"uuidGeneratedShort": "Nouvel UUID généré!",
|
||||
"uuidGenerateFailed": "Échec de la génération du nouvel UUID",
|
||||
"uuidRequired": "Veuillez entrer un UUID",
|
||||
"uuidInvalidFormat": "Format UUID invalide",
|
||||
"uuidSetFailed": "Échec de la définition de l'UUID personnalisé",
|
||||
"uuidSetSuccess": "UUID personnalisé défini avec succès!",
|
||||
"uuidDeleteFailed": "Échec de la suppression de l'UUID",
|
||||
"uuidDeleteSuccess": "UUID supprimé avec succès!",
|
||||
"modsDownloading": "Téléchargement de {name}...",
|
||||
"modsTogglingMod": "Basculement du mod...",
|
||||
"modsDeletingMod": "Suppression du mod...",
|
||||
"modsLoadingMods": "Chargement des mods depuis CurseForge...",
|
||||
"modsInstalledSuccess": "{name} installé avec succès! 🎉",
|
||||
"modsDeletedSuccess": "{name} supprimé avec succès",
|
||||
"modsDownloadFailed": "Échec du téléchargement du mod: {error}",
|
||||
"modsToggleFailed": "Échec du basculement du mod: {error}",
|
||||
"modsDeleteFailed": "Échec de la suppression du mod: {error}",
|
||||
"modsModNotFound": "Informations du mod introuvables",
|
||||
"hwAccelSaved": "Paramètre d'accélération matérielle sauvegardé",
|
||||
"hwAccelSaveFailed": "Échec de la sauvegarde du paramètre d'accélération matérielle"
|
||||
},
|
||||
"confirm": {
|
||||
"defaultTitle": "Confirmer l'action",
|
||||
"regenerateUuidTitle": "Générer un nouvel UUID",
|
||||
"regenerateUuidMessage": "Êtes-vous sûr de vouloir générer un nouvel UUID? Cela changera votre identité de joueur.",
|
||||
"regenerateUuidButton": "Générer",
|
||||
"setCustomUuidTitle": "Définir UUID personnalisé",
|
||||
"setCustomUuidMessage": "Êtes-vous sûr de vouloir définir cet UUID personnalisé? Cela changera votre identité de joueur.",
|
||||
"setCustomUuidButton": "Définir UUID",
|
||||
"deleteUuidTitle": "Supprimer UUID",
|
||||
"deleteUuidMessage": "Êtes-vous sûr de vouloir supprimer l'UUID de \"{username}\"? Cette action est irréversible.",
|
||||
"deleteUuidButton": "Supprimer",
|
||||
"uninstallGameTitle": "Désinstaller le jeu",
|
||||
"uninstallGameMessage": "Êtes-vous sûr de vouloir désinstaller Hytale? Tous les fichiers du jeu seront supprimés.",
|
||||
"uninstallGameButton": "Désinstaller"
|
||||
},
|
||||
"progress": {
|
||||
"initializing": "Initialisation...",
|
||||
"downloading": "Téléchargement...",
|
||||
"installing": "Installation...",
|
||||
"extracting": "Extraction...",
|
||||
"verifying": "Vérification...",
|
||||
"switchingProfile": "Changement de profil...",
|
||||
"profileSwitched": "Profil changé!",
|
||||
"startingGame": "Démarrage du jeu...",
|
||||
"launching": "LANCEMENT...",
|
||||
"uninstallingGame": "Désinstallation du jeu...",
|
||||
"gameUninstalled": "Jeu désinstallé avec succès!",
|
||||
"uninstallFailed": "Échec de la désinstallation: {error}",
|
||||
"startingUpdate": "Démarrage de la mise à jour obligatoire du jeu...",
|
||||
"installationComplete": "Installation terminée avec succès!",
|
||||
"installationFailed": "Échec de l'installation: {error}",
|
||||
"installingGameFiles": "Installation des fichiers du jeu...",
|
||||
"installComplete": "Installation terminée!"
|
||||
}
|
||||
}
|
||||
250
GUI/locales/id-ID.json
Normal file
250
GUI/locales/id-ID.json
Normal file
@@ -0,0 +1,250 @@
|
||||
{
|
||||
"nav": {
|
||||
"play": "Main",
|
||||
"mods": "Mod",
|
||||
"news": "Berita",
|
||||
"chat": "Obrolan Pemain",
|
||||
"settings": "Pengaturan"
|
||||
},
|
||||
"header": {
|
||||
"playersLabel": "Pemain:",
|
||||
"manageProfiles": "Kelola Profil",
|
||||
"defaultProfile": "Default"
|
||||
},
|
||||
"install": {
|
||||
"title": "LAUNCHER GRATIS UNTUK DIMAINKAN",
|
||||
"playerName": "Nama Pemain",
|
||||
"playerNamePlaceholder": "Masukkan namamu",
|
||||
"gameBranch": "Versi Game",
|
||||
"releaseVersion": "Rilis (Stabil)",
|
||||
"preReleaseVersion": "Pra-Rilis (Eksperimental)",
|
||||
"customInstallation": "Instalasi Kustom",
|
||||
"installationFolder": "Folder Instalasi",
|
||||
"pathPlaceholder": "Lokasi default",
|
||||
"browse": "Telusuri",
|
||||
"installButton": "INSTAL HYTALE",
|
||||
"installing": "MENGINSTAL..."
|
||||
},
|
||||
"play": {
|
||||
"ready": "SIAP BERMAIN",
|
||||
"subtitle": "Luncurkan Hytale dan mulai petualanganmu",
|
||||
"playButton": "MAIN HYTALE",
|
||||
"latestNews": "BERITA TERBARU",
|
||||
"viewAll": "LIHAT SEMUA",
|
||||
"checking": "MEMERIKSA...",
|
||||
"play": "MAIN"
|
||||
},
|
||||
"mods": {
|
||||
"searchPlaceholder": "Cari mod...",
|
||||
"myMods": "MOD SAYA",
|
||||
"previous": "SEBELUMNYA",
|
||||
"next": "BERIKUTNYA",
|
||||
"page": "Halaman",
|
||||
"of": "dari",
|
||||
"modalTitle": "MOD SAYA",
|
||||
"noModsFound": "Mod Tidak Ditemukan",
|
||||
"noModsFoundDesc": "Coba sesuaikan pencarianmu",
|
||||
"noModsInstalled": "Tidak ada Mod Terinstal",
|
||||
"noModsInstalledDesc": "Tambahkan mod dari CurseForge atau impor file lokal",
|
||||
"view": "LIHAT",
|
||||
"install": "INSTAL",
|
||||
"installed": "TERINSTAL",
|
||||
"enable": "AKTIFKAN",
|
||||
"disable": "NONAKTIFKAN",
|
||||
"active": "AKTIF",
|
||||
"disabled": "NONAKTIF",
|
||||
"delete": "Hapus mod",
|
||||
"noDescription": "Tidak ada deskripsi tersedia",
|
||||
"confirmDelete": "Apakah kamu yakin ingin menghapus \"{name}\"?",
|
||||
"confirmDeleteDesc": "Tindakan ini tidak dapat dibatalkan.",
|
||||
"confirmDeletion": "Konfirmasi Penghapusan",
|
||||
"apiKeyRequired": "Kunci API Diperlukan",
|
||||
"apiKeyRequiredDesc": "Kunci API CurseForge diperlukan untuk menelusuri mod"
|
||||
},
|
||||
"news": {
|
||||
"title": "SEMUA BERITA",
|
||||
"readMore": "Baca Selengkapnya"
|
||||
},
|
||||
"chat": {
|
||||
"title": "OBROLAN PEMAIN",
|
||||
"pickColor": "Warna",
|
||||
"inputPlaceholder": "Ketik pesanmu...",
|
||||
"send": "Kirim",
|
||||
"online": "aktif",
|
||||
"charCounter": "{current}/{max}",
|
||||
"secureChat": "Obrolan aman - Tautan disensor",
|
||||
"joinChat": "Gabung Obrolan",
|
||||
"chooseUsername": "Pilih nama pengguna untuk bergabung ke Obrolan Pemain",
|
||||
"username": "Nama Pengguna",
|
||||
"usernamePlaceholder": "Masukkan nama penggunamu...",
|
||||
"usernameHint": "3-20 karakter, huruf, angka, - dan _ saja",
|
||||
"joinButton": "Gabung Obrolan",
|
||||
"colorModal": {
|
||||
"title": "Kustomisasi Warna Nama Pengguna",
|
||||
"chooseSolid": "Pilih warna solid:",
|
||||
"customColor": "Warna kustom:",
|
||||
"preview": "Pratinjau:",
|
||||
"previewUsername": "Nama Pengguna",
|
||||
"apply": "Terapkan Warna"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "PENGATURAN",
|
||||
"java": "Runtime Java",
|
||||
"useCustomJava": "Gunakan lokasi Java Kustom",
|
||||
"javaDescription": "Ganti runtime Java bawaan dengan instalasi milikmu",
|
||||
"javaPath": "Lokasi Eksekutabel Java",
|
||||
"javaPathPlaceholder": "Pilih lokasi Java...",
|
||||
"javaBrowse": "Telusuri",
|
||||
"javaHint": "Pilih folder instalasi Java (mendukung Windows, Mac, Linux)",
|
||||
"discord": "Integrasi Discord",
|
||||
"enableRPC": "Aktifkan Discord Rich Presence",
|
||||
"discordDescription": "Tampilkan aktivitas launchermu di Discord",
|
||||
"game": "Opsi Game",
|
||||
"playerName": "Nama Pemain",
|
||||
"playerNamePlaceholder": "Masukkan nama pemainmu",
|
||||
"playerNameHint": "Nama ini akan digunakan di dalam game (1-16 karakter)",
|
||||
"openGameLocation": "Buka Lokasi Game",
|
||||
"openGameLocationDesc": "Buka folder instalasi game",
|
||||
"account": "Manajemen UUID Pemain",
|
||||
"currentUUID": "UUID Saat Ini",
|
||||
"uuidPlaceholder": "Memuat UUID...",
|
||||
"copyUUID": "Salin UUID",
|
||||
"regenerateUUID": "Regenerasi UUID",
|
||||
"uuidHint": "Pengidentifikasi pemain unikmu untuk nama pengguna ini",
|
||||
"manageUUIDs": "Kelola Semua UUID",
|
||||
"manageUUIDsDesc": "Lihat dan kelola semua UUID pemain",
|
||||
"language": "Bahasa",
|
||||
"selectLanguage": "Pilih Bahasa",
|
||||
"repairGame": "Perbaiki Game",
|
||||
"reinstallGame": "Instal ulang file game (tetap menyimpan data)",
|
||||
"gpuPreference": "Preferensi GPU",
|
||||
"gpuHint": "Fitur khusus laptop; setel ke Terintegrasi jika di PC",
|
||||
"gpuAuto": "Otomatis",
|
||||
"gpuIntegrated": "Terintegrasi",
|
||||
"gpuDedicated": "Terdedikasi",
|
||||
"logs": "LOG SISTEM",
|
||||
"logsCopy": "Salin",
|
||||
"logsRefresh": "Segarkan",
|
||||
"logsFolder": "Buka Folder",
|
||||
"logsLoading": "Memuat log...",
|
||||
"closeLauncher": "Perilaku Launcher",
|
||||
"closeOnStart": "Tutup launcher saat game dimulai",
|
||||
"closeOnStartDescription": "Tutup launcher secara otomatis setelah Hytale diluncurkan",
|
||||
"hwAccel": "Akselerasi Perangkat Keras",
|
||||
"hwAccelDescription": "Aktifkan akselerasi perangkat keras untuk launcher`",
|
||||
"gameBranch": "Cabang Game",
|
||||
"branchRelease": "Rilis",
|
||||
"branchPreRelease": "Pra-Rilis",
|
||||
"branchHint": "Beralih antara rilis stabil dan versi pra-rilis eksperimental",
|
||||
"branchWarning": "Mengubah cabang akan mengunduh dan menginstal versi game yang berbeda",
|
||||
"branchSwitching": "Beralih ke {branch}...",
|
||||
"branchSwitched": "Berhasil beralih ke {branch}!",
|
||||
"installRequired": "Instalasi Diperlukan",
|
||||
"branchInstallConfirm": "Game akan diinstal untuk cabang {branch}. Lanjutkan?"
|
||||
},
|
||||
"uuid": {
|
||||
"modalTitle": "Manajemen UUID",
|
||||
"currentUserUUID": "UUID Pengguna Saat Ini",
|
||||
"allPlayerUUIDs": "Semua UUID Pemain",
|
||||
"generateNew": "Hasilkan UUID Baru",
|
||||
"loadingUUIDs": "Memuat UUID...",
|
||||
"setCustomUUID": "Setel UUID Kustom",
|
||||
"customPlaceholder": "Masukkan UUID kustom (format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)",
|
||||
"setUUID": "Setel UUID",
|
||||
"warning": "Peringatan: Menyetel UUID secara kustom akan mengubah identitas pemainmu saat ini",
|
||||
"copyTooltip": "Salin UUID",
|
||||
"regenerateTooltip": "Hasilkan UUID Baru"
|
||||
},
|
||||
"profiles": {
|
||||
"modalTitle": "Kelola Profil",
|
||||
"newProfilePlaceholder": "Nama Profil Baru",
|
||||
"createProfile": "Buat Profil"
|
||||
},
|
||||
"discord": {
|
||||
"notificationText": "Gabung komunitas Discord kami!",
|
||||
"joinButton": "Gabung Discord"
|
||||
},
|
||||
"common": {
|
||||
"confirm": "Konfirmasi",
|
||||
"cancel": "Batal",
|
||||
"save": "Simpan",
|
||||
"close": "Tutup",
|
||||
"delete": "Hapus",
|
||||
"edit": "Edit",
|
||||
"loading": "Memuat...",
|
||||
"apply": "Terapkan",
|
||||
"install": "Instal"
|
||||
},
|
||||
"notifications": {
|
||||
"gameDataNotFound": "Kesalahan: Data game tidak ditemukan",
|
||||
"gameUpdatedSuccess": "Game berhasil diperbarui! 🎉",
|
||||
"updateFailed": "Pembaruan gagal: {error}",
|
||||
"updateError": "Kesalahan pembaruan: {error}",
|
||||
"discordEnabled": "Discord Rich Presence diaktifkan",
|
||||
"discordDisabled": "Discord Rich Presence dinonaktifkan",
|
||||
"discordSaveFailed": "Gagal menyimpan pengaturan Discord",
|
||||
"playerNameRequired": "Silakan masukkan nama pemain yang valid",
|
||||
"playerNameSaved": "Nama pemain berhasil disimpan",
|
||||
"playerNameSaveFailed": "Gagal menyimpan nama pemain",
|
||||
"uuidCopied": "UUID disalin ke papan klip!",
|
||||
"uuidCopyFailed": "Gagal menyalin UUID",
|
||||
"uuidRegenNotAvailable": "Regenerasi UUID tidak tersedia",
|
||||
"uuidRegenFailed": "Gagal meregenerasi UUID",
|
||||
"uuidGenerated": "UUID baru berhasil dihasilkan!",
|
||||
"uuidGeneratedShort": "UUID baru dihasilkan!",
|
||||
"uuidGenerateFailed": "Gagal menghasilkan UUID baru",
|
||||
"uuidRequired": "Silakan masukkan UUID",
|
||||
"uuidInvalidFormat": "Format UUID tidak valid",
|
||||
"uuidSetFailed": "Gagal menyetel UUID kustom",
|
||||
"uuidSetSuccess": "UUID kustom berhasil disetel!",
|
||||
"uuidDeleteFailed": "Gagal menghapus UUID",
|
||||
"uuidDeleteSuccess": "UUID berhasil dihapus!",
|
||||
"modsDownloading": "Mengunduh {name}...",
|
||||
"modsTogglingMod": "Beralih mod...",
|
||||
"modsDeletingMod": "Menghapus mod...",
|
||||
"modsLoadingMods": "Memuat mod dari CurseForge...",
|
||||
"modsInstalledSuccess": "{name} berhasil diinstal! 🎉",
|
||||
"modsDeletedSuccess": "{name} berhasil dihapus",
|
||||
"modsDownloadFailed": "Gagal mengunduh mod: {error}",
|
||||
"modsToggleFailed": "Gagal beralih mod: {error}",
|
||||
"modsDeleteFailed": "Gagal menghapus mod: {error}",
|
||||
"modsModNotFound": "Informasi mod tidak ditemukan",
|
||||
"hwAccelSaved": "Pengaturan akselerasi perangkat keras disimpan",
|
||||
"hwAccelSaveFailed": "Gagal menyimpan pengaturan akselerasi perangkat keras"
|
||||
},
|
||||
"confirm": {
|
||||
"defaultTitle": "Konfirmasi tindakan",
|
||||
"regenerateUuidTitle": "Hasilkan UUID baru",
|
||||
"regenerateUuidMessage": "Apakah kamu yakin ingin menghasilkan UUID baru? Ini akan mengubah identitas pemainmu.",
|
||||
"regenerateUuidButton": "Hasilkan",
|
||||
"setCustomUuidTitle": "Setel UUID kustom",
|
||||
"setCustomUuidMessage": "Apakah kamu yakin ingin menyetel UUID kustom ini? Ini akan mengubah identitas pemainmu.",
|
||||
"setCustomUuidButton": "Setel UUID",
|
||||
"deleteUuidTitle": "Hapus UUID",
|
||||
"deleteUuidMessage": "Apakah kamu yakin ingin menghapus UUID untuk \"{username}\"? Tindakan ini tidak dapat dibatalkan.",
|
||||
"deleteUuidButton": "Hapus",
|
||||
"uninstallGameTitle": "Hapus instalasi game",
|
||||
"uninstallGameMessage": "Apakah kamu yakin ingin menghapus instalasi Hytale? Semua file game akan dihapus.",
|
||||
"uninstallGameButton": "Hapus Instalasi"
|
||||
},
|
||||
"progress": {
|
||||
"initializing": "Menginisialisasi...",
|
||||
"downloading": "Mengunduh...",
|
||||
"installing": "Menginstal...",
|
||||
"extracting": "Mengekstrak...",
|
||||
"verifying": "Memverifikasi...",
|
||||
"switchingProfile": "Beralih profil...",
|
||||
"profileSwitched": "Profil dialihkan!",
|
||||
"startingGame": "Memulai game...",
|
||||
"launching": "MELUNCURKAN...",
|
||||
"uninstallingGame": "Menghapus instalasi game...",
|
||||
"gameUninstalled": "Instalasi game berhasil dihapus!",
|
||||
"uninstallFailed": "Penghapusan instalasi gagal: {error}",
|
||||
"startingUpdate": "Memulai pembaruan game wajib...",
|
||||
"installationComplete": "Instalasi berhasil diselesaikan!",
|
||||
"installationFailed": "Instalasi gagal: {error}",
|
||||
"installingGameFiles": "Menginstal file game...",
|
||||
"installComplete": "Instalasi selesai!"
|
||||
}
|
||||
}
|
||||
@@ -4,19 +4,20 @@
|
||||
"mods": "Mody",
|
||||
"news": "Wiadomości",
|
||||
"chat": "Chat z graczami",
|
||||
"settings": "Ustawienia",
|
||||
"skins": "Skiny"
|
||||
"settings": "Ustawienia"
|
||||
},
|
||||
"header": {
|
||||
"playersLabel": "Graczy:",
|
||||
"manageProfiles": "Zarządzaj Profilami",
|
||||
"defaultProfile": "Domyślny",
|
||||
"f2p": "FREE TO PLAY"
|
||||
"defaultProfile": "Domyślny"
|
||||
},
|
||||
"install": {
|
||||
"title": "FREE TO PLAY LAUNCHER",
|
||||
"title": "DARMOWY LAUNCHER",
|
||||
"playerName": "Nazwa Gracza",
|
||||
"playerNamePlaceholder": "Wprowadź Nazwę",
|
||||
"gameBranch": "Wersja Gry",
|
||||
"releaseVersion": "Wydanie (Stabilna)",
|
||||
"preReleaseVersion": "Przed-Wydaniem (Eksperymentalna)",
|
||||
"customInstallation": "Dostosuj Instalacje",
|
||||
"installationFolder": "Folder docelowy",
|
||||
"pathPlaceholder": "Domyślna lokalizacja",
|
||||
@@ -56,7 +57,9 @@
|
||||
"noDescription": "Brak opisu",
|
||||
"confirmDelete": "Czy na pewno chcesz usunąć \"{name}\"?",
|
||||
"confirmDeleteDesc": "Tej czynności nie można cofnąć.",
|
||||
"confirmDeletion": "Potwierdź"
|
||||
"confirmDeletion": "Potwierdź",
|
||||
"apiKeyRequired": "Wymagany Klucz API",
|
||||
"apiKeyRequiredDesc": "Klucz API CurseForge jest potrzebny do przeglądania modów"
|
||||
},
|
||||
"news": {
|
||||
"title": "WSZYSTKIE WIADOMOŚCI",
|
||||
@@ -116,15 +119,29 @@
|
||||
"repairGame": "Napraw Grę",
|
||||
"reinstallGame": "Zainstaluj ponownie pliki gry (zachowuje dane)",
|
||||
"gpuPreference": "Preferencje GPU",
|
||||
"gpuHint": "Wybierz preferowany procesor graficzny (Linux: wpływa na DRI_PRIME)",
|
||||
"gpuHint": "Funkcja dostępna tylko na laptopie; ustaw na Zintegrowaną, jeśli na komputerze PC",
|
||||
"gpuAuto": "Auto",
|
||||
"gpuIntegrated": "Zintegrowana",
|
||||
"gpuDedicated": "Dedykowana",
|
||||
"logs": "SYSTEM LOGS",
|
||||
"logs": "DZIENNIKI SYSTEMOWE",
|
||||
"logsCopy": "Kopiuj",
|
||||
"logsRefresh": "Odśwież",
|
||||
"logsFolder": "Otwórz Folder",
|
||||
"logsLoading": "Ładowanie logów..."
|
||||
"logsLoading": "Ładowanie logów...",
|
||||
"closeLauncher": "Zachowanie Launchera",
|
||||
"closeOnStart": "Zamknij Launcher przy starcie gry",
|
||||
"closeOnStartDescription": "Automatycznie zamknij launcher po uruchomieniu Hytale",
|
||||
"hwAccel": "Przyspieszenie Sprzętowe",
|
||||
"hwAccelDescription": "Włącz przyspieszenie sprzętowe dla launchera",
|
||||
"gameBranch": "Gałąź Gry",
|
||||
"branchRelease": "Wydanie",
|
||||
"branchPreRelease": "Przed-Wydaniem",
|
||||
"branchHint": "Przełączaj między stabilnym wydaniem a eksperymentalną wersją przed-wydaniem",
|
||||
"branchWarning": "Zmiana gałęzi spowoduje pobranie i instalację innej wersji gry",
|
||||
"branchSwitching": "Przełączanie na {branch}...",
|
||||
"branchSwitched": "Pomyślnie przełączono na {branch}!",
|
||||
"installRequired": "Wymagana Instalacja",
|
||||
"branchInstallConfirm": "Gra zostanie zainstalowana dla gałęzi {branch}. Kontynuować?"
|
||||
},
|
||||
"uuid": {
|
||||
"modalTitle": "Zarządzanie UUID",
|
||||
@@ -148,10 +165,6 @@
|
||||
"notificationText": "Dołącz do naszej społeczności Discord!",
|
||||
"joinButton": "Dołącz Discord"
|
||||
},
|
||||
"skins": {
|
||||
"title": "Skiny",
|
||||
"comingSoon": "Personalizacja skórek już wkrótce..."
|
||||
},
|
||||
"common": {
|
||||
"confirm": "Potwierdź",
|
||||
"cancel": "Anuluj",
|
||||
@@ -160,7 +173,8 @@
|
||||
"delete": "Usuń",
|
||||
"edit": "Edytuj",
|
||||
"loading": "Ładowanie...",
|
||||
"apply": "Zastosuj"
|
||||
"apply": "Zastosuj",
|
||||
"install": "Zainstaluj"
|
||||
},
|
||||
"notifications": {
|
||||
"gameDataNotFound": "Błąd: Nie znaleziono danych gry",
|
||||
@@ -195,7 +209,9 @@
|
||||
"modsDownloadFailed": "Nie udało się pobrać moda: {error}",
|
||||
"modsToggleFailed": "Nie udało się przełączyć moda: {error}",
|
||||
"modsDeleteFailed": "Nie udało się usunąć moda: {error}",
|
||||
"modsModNotFound": "Nie znaleziono informacji o modzie"
|
||||
"modsModNotFound": "Nie znaleziono informacji o modzie",
|
||||
"hwAccelSaved": "Zapisano ustawienie przyspieszenia sprzętowego",
|
||||
"hwAccelSaveFailed": "Nie udało się zapisać ustawienia przyspieszenia sprzętowego"
|
||||
},
|
||||
"confirm": {
|
||||
"defaultTitle": "Potwierdź działanie",
|
||||
@@ -231,4 +247,4 @@
|
||||
"installingGameFiles": "Instalowanie plików gry...",
|
||||
"installComplete": "Instalacja zakończona!"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,9 +14,11 @@
|
||||
"install": {
|
||||
"title": "LANÇADOR JOGO GRATUITO",
|
||||
"playerName": "Nome do Jogador",
|
||||
"playerNamePlaceholder": "Digite seu nome", "gameBranch": "Versão do Jogo",
|
||||
"playerNamePlaceholder": "Digite seu nome",
|
||||
"gameBranch": "Versão do Jogo",
|
||||
"releaseVersion": "Lançamento (Estável)",
|
||||
"preReleaseVersion": "Pré-Lançamento (Experimental)", "customInstallation": "Instalação Personalizada",
|
||||
"preReleaseVersion": "Pré-Lançamento (Experimental)",
|
||||
"customInstallation": "Instalação Personalizada",
|
||||
"installationFolder": "Pasta de Instalação",
|
||||
"pathPlaceholder": "Local padrão",
|
||||
"browse": "Procurar",
|
||||
@@ -117,7 +119,7 @@
|
||||
"repairGame": "Reparar jogo",
|
||||
"reinstallGame": "Reinstalar arquivos do jogo (mantém os dados)",
|
||||
"gpuPreference": "Preferência de GPU",
|
||||
"gpuHint": "Selecione sua GPU preferida (Linux: afeta o DRI_PRIME)",
|
||||
"gpuHint": "Recurso exclusivo para laptops; defina como Integrado se estiver em um PC.",
|
||||
"gpuAuto": "Automático",
|
||||
"gpuIntegrated": "Integrada",
|
||||
"gpuDedicated": "Dedicada",
|
||||
@@ -129,6 +131,8 @@
|
||||
"closeLauncher": "Comportamento do Lançador",
|
||||
"closeOnStart": "Fechar Lançador ao iniciar o jogo",
|
||||
"closeOnStartDescription": "Fechar automaticamente o lançador após o Hytale ter sido iniciado",
|
||||
"hwAccel": "Aceleração de Hardware",
|
||||
"hwAccelDescription": "Ativar aceleração de hardware para o lançador",
|
||||
"gameBranch": "Versão do Jogo",
|
||||
"branchRelease": "Lançamento",
|
||||
"branchPreRelease": "Pré-Lançamento",
|
||||
@@ -161,7 +165,6 @@
|
||||
"notificationText": "Junte-se à nossa comunidade do Discord!",
|
||||
"joinButton": "Entrar no Discord"
|
||||
},
|
||||
|
||||
"common": {
|
||||
"confirm": "Confirmar",
|
||||
"cancel": "Cancelar",
|
||||
@@ -206,7 +209,9 @@
|
||||
"modsDownloadFailed": "Falha ao baixar mod: {error}",
|
||||
"modsToggleFailed": "Falha ao alternar mod: {error}",
|
||||
"modsDeleteFailed": "Falha ao excluir mod: {error}",
|
||||
"modsModNotFound": "Informações do mod não encontradas"
|
||||
"modsModNotFound": "Informações do mod não encontradas",
|
||||
"hwAccelSaved": "Configuração de aceleração de hardware salva",
|
||||
"hwAccelSaveFailed": "Falha ao salvar configuração de aceleração de hardware"
|
||||
},
|
||||
"confirm": {
|
||||
"defaultTitle": "Confirmar ação",
|
||||
|
||||
250
GUI/locales/ru-RU.json
Normal file
250
GUI/locales/ru-RU.json
Normal 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": "Установка завершена!"
|
||||
}
|
||||
}
|
||||
250
GUI/locales/sv-SE.json
Normal file
250
GUI/locales/sv-SE.json
Normal file
@@ -0,0 +1,250 @@
|
||||
{
|
||||
"nav": {
|
||||
"play": "Spela",
|
||||
"mods": "Moddar",
|
||||
"news": "Nyheter",
|
||||
"chat": "Spelarchatt",
|
||||
"settings": "Inställningar"
|
||||
},
|
||||
"header": {
|
||||
"playersLabel": "Spelare:",
|
||||
"manageProfiles": "Hantera profiler",
|
||||
"defaultProfile": "Standard"
|
||||
},
|
||||
"install": {
|
||||
"title": "GRATIS LAUNCHER",
|
||||
"playerName": "Spelarnamn",
|
||||
"playerNamePlaceholder": "Ange ditt namn",
|
||||
"gameBranch": "Spelversion",
|
||||
"releaseVersion": "Release (Stabil)",
|
||||
"preReleaseVersion": "Pre-Release (Experimentell)",
|
||||
"customInstallation": "Anpassad installation",
|
||||
"installationFolder": "Installationsmapp",
|
||||
"pathPlaceholder": "Standardplats",
|
||||
"browse": "Bläddra",
|
||||
"installButton": "INSTALLERA HYTALE",
|
||||
"installing": "INSTALLERAR..."
|
||||
},
|
||||
"play": {
|
||||
"ready": "REDO ATT SPELA",
|
||||
"subtitle": "Starta Hytale och börja äventyret",
|
||||
"playButton": "SPELA HYTALE",
|
||||
"latestNews": "SENASTE NYHETERNA",
|
||||
"viewAll": "VISA ALLA",
|
||||
"checking": "KONTROLLERAR...",
|
||||
"play": "SPELA"
|
||||
},
|
||||
"mods": {
|
||||
"searchPlaceholder": "Sök moddar...",
|
||||
"myMods": "MINA MODDAR",
|
||||
"previous": "FÖREGÅENDE",
|
||||
"next": "NÄSTA",
|
||||
"page": "Sida",
|
||||
"of": "av",
|
||||
"modalTitle": "MINA MODDAR",
|
||||
"noModsFound": "Inga moddar hittades",
|
||||
"noModsFoundDesc": "Försök justera din sökning",
|
||||
"noModsInstalled": "Inga moddar installerade",
|
||||
"noModsInstalledDesc": "Lägg till moddar från CurseForge eller importera lokala filer",
|
||||
"view": "VISA",
|
||||
"install": "INSTALLERA",
|
||||
"installed": "INSTALLERAD",
|
||||
"enable": "AKTIVERA",
|
||||
"disable": "INAKTIVERA",
|
||||
"active": "AKTIV",
|
||||
"disabled": "INAKTIVERAD",
|
||||
"delete": "Ta bort modd",
|
||||
"noDescription": "Ingen beskrivning tillgänglig",
|
||||
"confirmDelete": "Är du säker på att du vill ta bort \"{name}\"?",
|
||||
"confirmDeleteDesc": "Denna åtgärd kan inte ångras.",
|
||||
"confirmDeletion": "Bekräfta borttagning",
|
||||
"apiKeyRequired": "API-nyckel krävs",
|
||||
"apiKeyRequiredDesc": "CurseForge API-nyckel behövs för att bläddra bland moddar"
|
||||
},
|
||||
"news": {
|
||||
"title": "ALLA NYHETER",
|
||||
"readMore": "Läs mer"
|
||||
},
|
||||
"chat": {
|
||||
"title": "SPELARCHATT",
|
||||
"pickColor": "Färg",
|
||||
"inputPlaceholder": "Skriv ditt meddelande...",
|
||||
"send": "Skicka",
|
||||
"online": "online",
|
||||
"charCounter": "{current}/{max}",
|
||||
"secureChat": "Säker chatt - Länkar är censurerade",
|
||||
"joinChat": "Gå med i chatten",
|
||||
"chooseUsername": "Välj ett användarnamn för att gå med i spelarchartten",
|
||||
"username": "Användarnamn",
|
||||
"usernamePlaceholder": "Ange ditt användarnamn...",
|
||||
"usernameHint": "3-20 tecken, endast bokstäver, siffror, - och _",
|
||||
"joinButton": "Gå med i chatten",
|
||||
"colorModal": {
|
||||
"title": "Anpassa användarnamnsfargen",
|
||||
"chooseSolid": "Välj en enfärgad färg:",
|
||||
"customColor": "Anpassad färg:",
|
||||
"preview": "Förhandsvisning:",
|
||||
"previewUsername": "Användarnamn",
|
||||
"apply": "Använd färg"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "INSTÄLLNINGAR",
|
||||
"java": "Java Runtime",
|
||||
"useCustomJava": "Använd anpassad Java-sökväg",
|
||||
"javaDescription": "Ersätt den medföljande Java-installationen med din egen",
|
||||
"javaPath": "Java-körbar fil-sökväg",
|
||||
"javaPathPlaceholder": "Välj Java-sökväg...",
|
||||
"javaBrowse": "Bläddra",
|
||||
"javaHint": "Välj Java-installationsmappen (stöder Windows, Mac, Linux)",
|
||||
"discord": "Discord-integration",
|
||||
"enableRPC": "Aktivera Discord Rich Presence",
|
||||
"discordDescription": "Visa din launcher-aktivitet på Discord",
|
||||
"game": "Spelalternativ",
|
||||
"playerName": "Spelarnamn",
|
||||
"playerNamePlaceholder": "Ange spelarnamn",
|
||||
"playerNameHint": "Detta namn kommer att användas i spelet (1-16 tecken)",
|
||||
"openGameLocation": "Öppna spelplats",
|
||||
"openGameLocationDesc": "Öppna spelinstallationsmappen",
|
||||
"account": "Spelare UUID-hantering",
|
||||
"currentUUID": "Nuvarande UUID",
|
||||
"uuidPlaceholder": "Laddar UUID...",
|
||||
"copyUUID": "Kopiera UUID",
|
||||
"regenerateUUID": "Återskapa UUID",
|
||||
"uuidHint": "Din unika spelaridentifierare för detta användarnamn",
|
||||
"manageUUIDs": "Hantera alla UUID:er",
|
||||
"manageUUIDsDesc": "Visa och hantera alla spelare-UUID:er",
|
||||
"language": "Språk",
|
||||
"selectLanguage": "Välj språk",
|
||||
"repairGame": "Reparera spel",
|
||||
"reinstallGame": "Ominstallera spelfiler (bevarar data)",
|
||||
"gpuPreference": "GPU-preferens",
|
||||
"gpuHint": "Endast för bärbar dator; inställd på Integrerad om den är på datorn",
|
||||
"gpuAuto": "Auto",
|
||||
"gpuIntegrated": "Integrerad",
|
||||
"gpuDedicated": "Dedikerad",
|
||||
"logs": "SYSTEMLOGGAR",
|
||||
"logsCopy": "Kopiera",
|
||||
"logsRefresh": "Uppdatera",
|
||||
"logsFolder": "Öppna mapp",
|
||||
"logsLoading": "Laddar loggar...",
|
||||
"closeLauncher": "Launcher-beteende",
|
||||
"closeOnStart": "Stäng launcher vid spelstart",
|
||||
"closeOnStartDescription": "Stäng automatiskt launcher efter att Hytale har startats",
|
||||
"hwAccel": "Hårdvaruacceleration",
|
||||
"hwAccelDescription": "Aktivera hårdvaruacceleration för launchern",
|
||||
"gameBranch": "Spelgren",
|
||||
"branchRelease": "Release",
|
||||
"branchPreRelease": "Pre-Release",
|
||||
"branchHint": "Växla mellan stabil release- och experimentell pre-release-version",
|
||||
"branchWarning": "Att byta gren kommer att ladda ner och installera en annan spelversion",
|
||||
"branchSwitching": "Byter till {branch}...",
|
||||
"branchSwitched": "Bytte framgångsrikt till {branch}!",
|
||||
"installRequired": "Installation krävs",
|
||||
"branchInstallConfirm": "Spelet kommer att installeras för {branch}-grenen. Fortsätt?"
|
||||
},
|
||||
"uuid": {
|
||||
"modalTitle": "UUID-hantering",
|
||||
"currentUserUUID": "Nuvarande användar-UUID",
|
||||
"allPlayerUUIDs": "Alla spelare-UUID:er",
|
||||
"generateNew": "Generera ny UUID",
|
||||
"loadingUUIDs": "Laddar UUID:er...",
|
||||
"setCustomUUID": "Ange anpassad UUID",
|
||||
"customPlaceholder": "Ange anpassad UUID (format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)",
|
||||
"setUUID": "Ange UUID",
|
||||
"warning": "Varning: Att ange en anpassad UUID kommer att ändra din nuvarande spelaridentitet",
|
||||
"copyTooltip": "Kopiera UUID",
|
||||
"regenerateTooltip": "Generera ny UUID"
|
||||
},
|
||||
"profiles": {
|
||||
"modalTitle": "Hantera profiler",
|
||||
"newProfilePlaceholder": "Nytt profilnamn",
|
||||
"createProfile": "Skapa profil"
|
||||
},
|
||||
"discord": {
|
||||
"notificationText": "Gå med i vår Discord-gemenskap!",
|
||||
"joinButton": "Gå med i Discord"
|
||||
},
|
||||
"common": {
|
||||
"confirm": "Bekräfta",
|
||||
"cancel": "Avbryt",
|
||||
"save": "Spara",
|
||||
"close": "Stäng",
|
||||
"delete": "Ta bort",
|
||||
"edit": "Redigera",
|
||||
"loading": "Laddar...",
|
||||
"apply": "Verkställ",
|
||||
"install": "Installera"
|
||||
},
|
||||
"notifications": {
|
||||
"gameDataNotFound": "Fel: Speldata hittades inte",
|
||||
"gameUpdatedSuccess": "Spelet uppdaterades framgångsrikt! 🎉",
|
||||
"updateFailed": "Uppdatering misslyckades: {error}",
|
||||
"updateError": "Uppdateringsfel: {error}",
|
||||
"discordEnabled": "Discord Rich Presence aktiverad",
|
||||
"discordDisabled": "Discord Rich Presence inaktiverad",
|
||||
"discordSaveFailed": "Misslyckades med att spara Discord-inställning",
|
||||
"playerNameRequired": "Ange ett giltigt spelarnamn",
|
||||
"playerNameSaved": "Spelarnamn sparat framgångsrikt",
|
||||
"playerNameSaveFailed": "Misslyckades med att spara spelarnamn",
|
||||
"uuidCopied": "UUID kopierad till urklipp!",
|
||||
"uuidCopyFailed": "Misslyckades med att kopiera UUID",
|
||||
"uuidRegenNotAvailable": "UUID-återgenerering ej tillgänglig",
|
||||
"uuidRegenFailed": "Misslyckades med att återgenerera UUID",
|
||||
"uuidGenerated": "Ny UUID genererad framgångsrikt!",
|
||||
"uuidGeneratedShort": "Ny UUID genererad!",
|
||||
"uuidGenerateFailed": "Misslyckades med att generera ny UUID",
|
||||
"uuidRequired": "Ange en UUID",
|
||||
"uuidInvalidFormat": "Ogiltigt UUID-format",
|
||||
"uuidSetFailed": "Misslyckades med att ange anpassad UUID",
|
||||
"uuidSetSuccess": "Anpassad UUID angiven framgångsrikt!",
|
||||
"uuidDeleteFailed": "Misslyckades med att ta bort UUID",
|
||||
"uuidDeleteSuccess": "UUID borttagen framgångsrikt!",
|
||||
"modsDownloading": "Laddar ner {name}...",
|
||||
"modsTogglingMod": "Växlar modd...",
|
||||
"modsDeletingMod": "Tar bort modd...",
|
||||
"modsLoadingMods": "Laddar moddar från CurseForge...",
|
||||
"modsInstalledSuccess": "{name} installerad framgångsrikt! 🎉",
|
||||
"modsDeletedSuccess": "{name} borttagen framgångsrikt",
|
||||
"modsDownloadFailed": "Misslyckades med att ladda ner modd: {error}",
|
||||
"modsToggleFailed": "Misslyckades med att växla modd: {error}",
|
||||
"modsDeleteFailed": "Misslyckades med att ta bort modd: {error}",
|
||||
"modsModNotFound": "Moddinformation hittades inte",
|
||||
"hwAccelSaved": "Hårdvaruaccelerationsinställning sparad",
|
||||
"hwAccelSaveFailed": "Misslyckades med att spara hårdvaruaccelerationsinställning"
|
||||
},
|
||||
"confirm": {
|
||||
"defaultTitle": "Bekräfta åtgärd",
|
||||
"regenerateUuidTitle": "Generera ny UUID",
|
||||
"regenerateUuidMessage": "Är du säker på att du vill generera en ny UUID? Detta kommer att ändra din spelaridentitet.",
|
||||
"regenerateUuidButton": "Generera",
|
||||
"setCustomUuidTitle": "Ange anpassad UUID",
|
||||
"setCustomUuidMessage": "Är du säker på att du vill ange denna anpassade UUID? Detta kommer att ändra din spelaridentitet.",
|
||||
"setCustomUuidButton": "Ange UUID",
|
||||
"deleteUuidTitle": "Ta bort UUID",
|
||||
"deleteUuidMessage": "Är du säker på att du vill ta bort UUID:n för \"{username}\"? Denna åtgärd kan inte ångras.",
|
||||
"deleteUuidButton": "Ta bort",
|
||||
"uninstallGameTitle": "Avinstallera spel",
|
||||
"uninstallGameMessage": "Är du säker på att du vill avinstallera Hytale? Alla spelfiler kommer att tas bort.",
|
||||
"uninstallGameButton": "Avinstallera"
|
||||
},
|
||||
"progress": {
|
||||
"initializing": "Initierar...",
|
||||
"downloading": "Laddar ner...",
|
||||
"installing": "Installerar...",
|
||||
"extracting": "Extraherar...",
|
||||
"verifying": "Verifierar...",
|
||||
"switchingProfile": "Byter profil...",
|
||||
"profileSwitched": "Profil bytt!",
|
||||
"startingGame": "Startar spel...",
|
||||
"launching": "STARTAR...",
|
||||
"uninstallingGame": "Avinstallerar spel...",
|
||||
"gameUninstalled": "Spel avinstallerat framgångsrikt!",
|
||||
"uninstallFailed": "Avinstallation misslyckades: {error}",
|
||||
"startingUpdate": "Startar obligatorisk speluppdatering...",
|
||||
"installationComplete": "Installation slutförd framgångsrikt!",
|
||||
"installationFailed": "Installation misslyckades: {error}",
|
||||
"installingGameFiles": "Installerar spelfiler...",
|
||||
"installComplete": "Installation slutförd!"
|
||||
}
|
||||
}
|
||||
@@ -119,7 +119,7 @@
|
||||
"repairGame": "Oyunu Onarı",
|
||||
"reinstallGame": "Oyun dosyalarını yeniden kur (veri korur)",
|
||||
"gpuPreference": "GPU Tercihi",
|
||||
"gpuHint": "Tercih ettiğiniz GPU'yu seçin (Linux: DRI_PRIME'ı etkiler)",
|
||||
"gpuHint": "Sadece dizüstü bilgisayarlarda bulunan bir özellik; PC'de kullanılıyorsa Entegre olarak ayarlayın.",
|
||||
"gpuAuto": "Otomatik",
|
||||
"gpuIntegrated": "Entegre",
|
||||
"gpuDedicated": "Ayrılmış",
|
||||
@@ -131,6 +131,8 @@
|
||||
"closeLauncher": "Başlatıcı Davranışı",
|
||||
"closeOnStart": "Oyun başlatıldığında Başlatıcıyı Kapat",
|
||||
"closeOnStartDescription": "Hytale başlatıldıktan sonra başlatıcıyı otomatik olarak kapatın",
|
||||
"hwAccel": "Donanım Hızlandırma",
|
||||
"hwAccelDescription": "Başlatıcı için donanım hızlandırmasını etkinleştir",
|
||||
"gameBranch": "Oyun Dalı",
|
||||
"branchRelease": "Yayın",
|
||||
"branchPreRelease": "Ön-Yayın",
|
||||
@@ -207,7 +209,9 @@
|
||||
"modsDownloadFailed": "Mod indirilemedi: {error}",
|
||||
"modsToggleFailed": "Mod değiştirilemedi: {error}",
|
||||
"modsDeleteFailed": "Mod silinemedi: {error}",
|
||||
"modsModNotFound": "Mod bilgileri bulunamadı"
|
||||
"modsModNotFound": "Mod bilgileri bulunamadı",
|
||||
"hwAccelSaved": "Donanım hızlandırma ayarı kaydedildi",
|
||||
"hwAccelSaveFailed": "Donanım hızlandırma ayarı kaydedilemedi"
|
||||
},
|
||||
"confirm": {
|
||||
"defaultTitle": "Eylemi onayla",
|
||||
@@ -243,4 +247,4 @@
|
||||
"installingGameFiles": "Oyun dosyaları kuruluyor...",
|
||||
"installComplete": "Kurulum tamamlandı!"
|
||||
}
|
||||
}
|
||||
}
|
||||
1291
GUI/style.css
1291
GUI/style.css
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user