diff --git a/app/assets/css/launcher.css b/app/assets/css/launcher.css
index 8b239311..23930ad6 100644
--- a/app/assets/css/launcher.css
+++ b/app/assets/css/launcher.css
@@ -388,6 +388,17 @@ body, button {
background: rgba(0, 0, 0, 0.50);
}
+#loginOfflineContainer {
+ position: relative;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ width: 100%;
+ transition: filter 0.25s ease;
+ background: rgba(0, 0, 0, 0.50);
+}
+
/* Login cancel button styles. */
#loginCancelContainer {
position: absolute;
diff --git a/app/assets/images/lotip22.svg b/app/assets/images/lotip22.svg
new file mode 100644
index 00000000..bcde2b92
--- /dev/null
+++ b/app/assets/images/lotip22.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/assets/js/authmanager.js b/app/assets/js/authmanager.js
index 5a24f30a..717f2a89 100644
--- a/app/assets/js/authmanager.js
+++ b/app/assets/js/authmanager.js
@@ -167,6 +167,17 @@ exports.addMojangAccount = async function(username, password) {
}
}
+exports.addOfflineAccount = async function(username) {
+ try {
+ const ret = ConfigManager.addOfflineAccount(username)
+ ConfigManager.save()
+ return ret
+ } catch (err){
+ log.error(err)
+ return Promise.reject(mojangErrorDisplayable(MojangErrorCode.UNKNOWN))
+ }
+}
+
const AUTH_MODE = { FULL: 0, MS_REFRESH: 1, MC_REFRESH: 2 }
/**
@@ -309,6 +320,17 @@ exports.removeMicrosoftAccount = async function(uuid){
}
}
+exports.removeOfflineAccount = async function(uuid){
+ try {
+ ConfigManager.removeAuthAccount(uuid)
+ ConfigManager.save()
+ return Promise.resolve()
+ } catch (err){
+ log.error('Error while removing account', err)
+ return Promise.reject(err)
+ }
+}
+
/**
* Validate the selected account with Mojang's authserver. If the account is not valid,
* we will attempt to refresh the access token and update that value. If that fails, a
diff --git a/app/assets/js/configmanager.js b/app/assets/js/configmanager.js
index 38f864fe..74bbc437 100644
--- a/app/assets/js/configmanager.js
+++ b/app/assets/js/configmanager.js
@@ -1,5 +1,6 @@
const fs = require('fs-extra')
const { LoggerUtil } = require('helios-core')
+const { randomUUID } = require('crypto')
const os = require('os')
const path = require('path')
@@ -349,6 +350,20 @@ exports.addMojangAuthAccount = function(uuid, accessToken, username, displayName
return config.authenticationDatabase[uuid]
}
+exports.addOfflineAccount = function(username){
+ console.log("Yeah I try to create new offline account")
+ uuid = randomUUID()
+ config.selectedAccount = uuid
+ config.authenticationDatabase[uuid] = {
+ type: 'offline',
+ password: '',
+ username: username.trim(),
+ uuid: uuid.trim(),
+ displayName: username.trim()
+ }
+ return config.authenticationDatabase[uuid]
+}
+
/**
* Update the tokens of an authenticated microsoft account.
*
diff --git a/app/assets/js/scripts/login.js b/app/assets/js/scripts/login.js
index 30ff8937..c4f38bbf 100644
--- a/app/assets/js/scripts/login.js
+++ b/app/assets/js/scripts/login.js
@@ -11,8 +11,6 @@ const loginCancelContainer = document.getElementById('loginCancelContainer')
const loginCancelButton = document.getElementById('loginCancelButton')
const loginEmailError = document.getElementById('loginEmailError')
const loginUsername = document.getElementById('loginUsername')
-const loginPasswordError = document.getElementById('loginPasswordError')
-const loginPassword = document.getElementById('loginPassword')
const checkmarkContainer = document.getElementById('checkmarkContainer')
const loginRememberOption = document.getElementById('loginRememberOption')
const loginButton = document.getElementById('loginButton')
@@ -77,17 +75,7 @@ function validateEmail(value){
* @param {string} value The password value.
*/
function validatePassword(value){
- if(value){
- loginPasswordError.style.opacity = 0
- lp = true
- if(lu){
- loginDisabled(false)
- }
- } else {
- lp = false
- showError(loginPasswordError, Lang.queryJS('login.error.invalidValue'))
- loginDisabled(true)
- }
+ lp = true;
}
// Emphasize errors with shake when focus is lost.
@@ -95,17 +83,10 @@ loginUsername.addEventListener('focusout', (e) => {
validateEmail(e.target.value)
shakeError(loginEmailError)
})
-loginPassword.addEventListener('focusout', (e) => {
- validatePassword(e.target.value)
- shakeError(loginPasswordError)
-})
// Validate input for each field.
loginUsername.addEventListener('input', (e) => {
- validateEmail(e.target.value)
-})
-loginPassword.addEventListener('input', (e) => {
- validatePassword(e.target.value)
+ loginDisabled(false)
})
/**
@@ -143,7 +124,6 @@ function formDisabled(v){
loginDisabled(v)
loginCancelButton.disabled = v
loginUsername.disabled = v
- loginPassword.disabled = v
if(v){
checkmarkContainer.setAttribute('disabled', v)
} else {
@@ -187,7 +167,7 @@ loginButton.addEventListener('click', () => {
// Show loading stuff.
loginLoading(true)
- AuthManager.addMojangAccount(loginUsername.value, loginPassword.value).then((value) => {
+ AuthManager.addOfflineAccount(loginUsername.value).then((value) => {
updateSelectedAccount(value)
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.loggingIn'), Lang.queryJS('login.success'))
$('.circle-loader').toggleClass('load-complete')
@@ -202,7 +182,6 @@ loginButton.addEventListener('click', () => {
loginCancelEnabled(false) // Reset this for good measure.
loginViewCancelHandler = null // Reset this for good measure.
loginUsername.value = ''
- loginPassword.value = ''
$('.circle-loader').toggleClass('load-complete')
$('.checkmark').toggle()
loginLoading(false)
diff --git a/app/assets/js/scripts/loginOptions.js b/app/assets/js/scripts/loginOptions.js
index cdb1bc8e..e4f235b0 100644
--- a/app/assets/js/scripts/loginOptions.js
+++ b/app/assets/js/scripts/loginOptions.js
@@ -1,6 +1,7 @@
const loginOptionsCancelContainer = document.getElementById('loginOptionCancelContainer')
const loginOptionMicrosoft = document.getElementById('loginOptionMicrosoft')
-const loginOptionMojang = document.getElementById('loginOptionMojang')
+//const loginOptionMojang = document.getElementById('loginOptionMojang')
+const loginOptionOffline = document.getElementById('loginOptionOffline')
const loginOptionsCancelButton = document.getElementById('loginOptionCancelButton')
let loginOptionsCancellable = false
@@ -28,7 +29,7 @@ loginOptionMicrosoft.onclick = (e) => {
})
}
-loginOptionMojang.onclick = (e) => {
+loginOptionOffline.onclick = (e) => {
switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
loginViewOnSuccess = loginOptionsViewOnLoginSuccess
loginViewOnCancel = loginOptionsViewOnLoginCancel
diff --git a/app/assets/js/scripts/settings.js b/app/assets/js/scripts/settings.js
index 81a65a70..2ff898d5 100644
--- a/app/assets/js/scripts/settings.js
+++ b/app/assets/js/scripts/settings.js
@@ -342,15 +342,6 @@ settingsNavDone.onclick = () => {
const msftLoginLogger = LoggerUtil.getLogger('Microsoft Login')
const msftLogoutLogger = LoggerUtil.getLogger('Microsoft Logout')
-// Bind the add mojang account button.
-document.getElementById('settingsAddMojangAccount').onclick = (e) => {
- switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
- loginViewOnCancel = VIEWS.settings
- loginViewOnSuccess = VIEWS.settings
- loginCancelEnabled(true)
- })
-}
-
// Bind the add microsoft account button.
document.getElementById('settingsAddMicrosoftAccount').onclick = (e) => {
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
@@ -519,7 +510,7 @@ function processLogOut(val, isLastAccount){
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGOUT, uuid, isLastAccount)
})
} else {
- AuthManager.removeMojangAccount(uuid).then(() => {
+ AuthManager.removeOfflineAccount(uuid).then(() => {
if(!isLastAccount && uuid === prevSelAcc.uuid){
const selAcc = ConfigManager.getSelectedAccount()
refreshAuthAccountSelected(selAcc.uuid)
@@ -619,7 +610,8 @@ function refreshAuthAccountSelected(uuid){
}
const settingsCurrentMicrosoftAccounts = document.getElementById('settingsCurrentMicrosoftAccounts')
-const settingsCurrentMojangAccounts = document.getElementById('settingsCurrentMojangAccounts')
+//const settingsCurrentMojangAccounts = document.getElementById('settingsCurrentMojangAccounts')
+const settingsCurrentOfflineAccounts = document.getElementById('settingsCurrentOfflineAccounts')
/**
* Add auth account elements for each one stored in the authentication database.
@@ -634,6 +626,7 @@ function populateAuthAccounts(){
let microsoftAuthAccountStr = ''
let mojangAuthAccountStr = ''
+ let offlineAuthAccountStr = ''
authKeys.forEach((val) => {
const acc = authAccounts[val]
@@ -665,13 +658,14 @@ function populateAuthAccounts(){
if(acc.type === 'microsoft') {
microsoftAuthAccountStr += accHtml
} else {
- mojangAuthAccountStr += accHtml
+ offlineAuthAccountStr += accHtml
}
})
settingsCurrentMicrosoftAccounts.innerHTML = microsoftAuthAccountStr
- settingsCurrentMojangAccounts.innerHTML = mojangAuthAccountStr
+ //settingsCurrentMojangAccounts.innerHTML = mojangAuthAccountStr
+ settingsCurrentOfflineAccounts.innerHTML = offlineAuthAccountStr
}
/**
diff --git a/app/assets/js/scripts/uibinder.js b/app/assets/js/scripts/uibinder.js
index 5fe79df5..56309a30 100644
--- a/app/assets/js/scripts/uibinder.js
+++ b/app/assets/js/scripts/uibinder.js
@@ -17,6 +17,7 @@ let fatalStartupError = false
const VIEWS = {
landing: '#landingContainer',
loginOptions: '#loginOptionsContainer',
+ loginOffline: '#loginOfflineContainer',
login: '#loginContainer',
settings: '#settingsContainer',
welcome: '#welcomeContainer',
diff --git a/app/assets/lang/en_US.toml b/app/assets/lang/en_US.toml
index b9f64cfb..bb15e52e 100644
--- a/app/assets/lang/en_US.toml
+++ b/app/assets/lang/en_US.toml
@@ -1,344 +1,315 @@
[ejs.landing]
-updateAvailableTooltip = "Update Available"
-usernamePlaceholder = "Username"
-usernameEditButton = "Edit"
-settingsTooltip = "Settings"
-serverStatus = "SERVER"
-serverStatusPlaceholder = "OFFLINE"
-mojangStatus = "MOJANG STATUS"
-mojangStatusTooltipTitle = "Services"
-mojangStatusNETitle = "Non Essential"
-newsButton = "NEWS"
-launchButton = "PLAY"
-launchButtonPlaceholder = "• No Server Selected"
-launchDetails = "Please wait.."
-newsNavigationStatus = "{currentPage} of {totalPages}"
-newsErrorLoadSpan = "Checking for News.."
-newsErrorFailedSpan = "Failed to Load News"
-newsErrorRetryButton = "Try Again"
-newsErrorNoneSpan = "No News"
+updateAvailableTooltip = "Доступно обновление"
+usernamePlaceholder = "Имя пользователя"
+usernameEditButton = "Редактировать"
+settingsTooltip = "Настройки"
+serverStatus = "СЕРВЕР"
+serverStatusPlaceholder = "ОФФЛАЙН"
+mojangStatus = "СТАТУС MOJANG"
+mojangStatusTooltipTitle = "Сервисы"
+mojangStatusNETitle = "Необязательно"
+newsButton = "НОВОСТИ"
+launchButton = "ИГРАТЬ"
+launchButtonPlaceholder = "• Сервер не выбран"
+launchDetails = "Пожалуйста, подождите.."
+newsNavigationStatus = "{currentPage} из {totalPages}"
+newsErrorLoadSpan = "Проверка новостей.."
+newsErrorFailedSpan = "Не удалось загрузить новости"
+newsErrorRetryButton = "Попробовать снова"
+newsErrorNoneSpan = "Новостей нет"
[ejs.login]
-loginCancelText = "Cancel"
-loginSubheader = "MINECRAFT LOGIN"
-loginEmailError = "* Invalid Value"
-loginEmailPlaceholder = "EMAIL OR USERNAME"
-loginPasswordError = "* Required"
-loginPasswordPlaceholder = "PASSWORD"
+loginCancelText = "Отмена"
+loginSubheader = "ВХОД В MINECRAFT"
+loginEmailError = "* Неверное значение"
+loginEmailPlaceholder = "EMAIL ИЛИ ИМЯ ПОЛЬЗОВАТЕЛЯ"
+loginPasswordError = "* Обязательное поле"
+loginPasswordPlaceholder = "ПАРОЛЬ"
loginForgotPasswordLink = "https://minecraft.net/password/forgot/"
-loginForgotPasswordText = "forgot password?"
-loginRememberMeText = "remember me?"
-loginButtonText = "LOGIN"
+loginForgotPasswordText = "забыли пароль?"
+loginRememberMeText = "запомнить меня?"
+loginButtonText = "ВОЙТИ"
loginNeedAccountLink = "https://minecraft.net/store/minecraft-java-edition/"
-loginNeedAccountText = "Need an Account?"
-loginPasswordDisclaimer1 = "Your password is sent directly to mojang and never stored."
-loginPasswordDisclaimer2 = "{appName} is not affiliated with Mojang AB."
+loginNeedAccountText = "Нужен аккаунт?"
+loginPasswordDisclaimer1 = "Ваш пароль отправляется напрямую в Mojang и никогда не сохраняется."
+loginPasswordDisclaimer2 = "{appName} не связан с Mojang AB."
[ejs.loginOptions]
-loginOptionsTitle = "Login Options"
-loginWithMicrosoft = "Login with Microsoft"
-loginWithMojang = "Login with Mojang"
-cancelButton = "Cancel"
+loginOptionsTitle = "Опции входа"
+loginWithMicrosoft = "Войти через Microsoft"
+loginWithMojang = "Войти через Mojang"
+cancelButton = "Отмена"
[ejs.overlay]
-serverSelectHeader = "Available Servers"
-serverSelectConfirm = "Select"
-serverSelectCancel = "Cancel"
-accountSelectHeader = "Select an Account"
-accountSelectConfirm = "Select"
-accountSelectCancel = "Cancel"
+serverSelectHeader = "Доступные серверы"
+serverSelectConfirm = "Выбрать"
+serverSelectCancel = "Отмена"
+accountSelectHeader = "Выберите аккаунт"
+accountSelectConfirm = "Выбрать"
+accountSelectCancel = "Отмена"
[ejs.settings]
-navHeaderText = "Settings"
-navAccount = "Account"
+navHeaderText = "Настройки"
+navAccount = "Аккаунт"
navMinecraft = "Minecraft"
-navMods = "Mods"
+navMods = "Моды"
navJava = "Java"
-navLauncher = "Launcher"
-navAbout = "About"
-navUpdates = "Updates"
-navDone = "Done"
-tabAccountHeaderText = "Account Settings"
-tabAccountHeaderDesc = "Add new accounts or manage existing ones."
+navLauncher = "Лаунчер"
+navAbout = "О программе"
+navUpdates = "Обновления"
+navDone = "Готово"
+tabAccountHeaderText = "Настройки аккаунта"
+tabAccountHeaderDesc = "Добавляйте новые аккаунты или управляйте существующими."
microsoftAccount = "Microsoft"
-addMicrosoftAccount = "+ Add Microsoft Account"
+addMicrosoftAccount = "+ Добавить аккаунт Microsoft"
mojangAccount = "Mojang"
-addMojangAccount = "+ Add Mojang Account"
-minecraftTabHeaderText = "Minecraft Settings"
-minecraftTabHeaderDesc = "Options related to game launch."
-gameResolutionTitle = "Game Resolution"
-launchFullscreenTitle = "Launch in fullscreen."
-autoConnectTitle = "Automatically connect to the server on launch."
-launchDetachedTitle = "Launch game process detached from launcher."
-launchDetachedDesc = "If the game is not detached, closing the launcher will also close the game."
-tabModsHeaderText = "Mod Settings"
-tabModsHeaderDesc = "Enable or disable mods."
-switchServerButton = "Switch"
-requiredMods = "Required Mods"
-optionalMods = "Optional Mods"
-dropinMods = "Drop-in Mods"
-addMods = "Add Mods"
-dropinRefreshNote = "(F5 to Refresh)"
-shaderpacks = "Shaderpacks"
-shaderpackDesc = "Enable or disable shaders. Please note, shaders will only run smoothly on powerful setups. You may add custom packs here."
-selectShaderpack = "Select Shaderpack"
-tabJavaHeaderText = "Java Settings"
-tabJavaHeaderDesc = "Manage the Java configuration (advanced)."
-memoryTitle = "Memory"
-maxRAM = "Maximum RAM"
-minRAM = "Minimum RAM"
-memoryDesc = "The recommended minimum RAM is 3 gigabytes. Setting the minimum and maximum values to the same value may reduce lag."
-memoryTotalTitle = "Total"
-memoryAvailableTitle = "Available"
-javaExecutableTitle = "Java Executable"
-javaExecSelDialogTitle = "Select Java Executable"
-javaExecSelButtonText = "Choose File"
-javaExecDesc = "The Java executable is validated before game launch."
-javaPathDesc = "The path should end with {pathSuffix}."
-jvmOptsTitle = "Additional JVM Options"
-jvmOptsDesc = "Options to be provided to the JVM at runtime. -Xms and -Xmx should not be included."
-launcherTabHeaderText = "Launcher Settings"
-launcherTabHeaderDesc = "Options related to the launcher itself."
-allowPrereleaseTitle = "Allow Pre-Release Updates."
-allowPrereleaseDesc = "Pre-Releases include new features which may have not been fully tested or integrated.
This will always be true if you are using a pre-release version."
-dataDirectoryTitle = "Data Directory"
-selectDataDirectory = "Select Data Directory"
-chooseFolder = "Choose Folder"
-dataDirectoryDesc = "All game files and local Java installations will be stored in the data directory.
Screenshots and world saves are stored in the instance folder for the corresponding server configuration."
-aboutTabHeaderText = "About"
-aboutTabHeaderDesc = "View information and release notes for the current version."
+addMojangAccount = "+ Добавить аккаунт Mojang"
+minecraftTabHeaderText = "Настройки Minecraft"
+minecraftTabHeaderDesc = "Параметры, связанные с запуском игры."
+gameResolutionTitle = "Разрешение игры"
+launchFullscreenTitle = "Запуск в полноэкранном режиме."
+autoConnectTitle = "Автоматически подключаться к серверу при запуске."
+launchDetachedTitle = "Запускать игру отдельно от лаунчера."
+launchDetachedDesc = "Если игра не запущена отдельно, закрытие лаунчера приведет к закрытию игры."
+tabModsHeaderText = "Настройки модов"
+tabModsHeaderDesc = "Включайте или отключайте моды."
+switchServerButton = "Сменить сервер"
+requiredMods = "Обязательные моды"
+optionalMods = "Дополнительные моды"
+dropinMods = "Установленные моды"
+addMods = "Добавить моды"
+dropinRefreshNote = "(Нажмите F5 для обновления)"
+shaderpacks = "Шейдерпаки"
+shaderpackDesc = "Включайте или отключайте шейдеры. Учтите, что они требуют мощного компьютера. Вы можете добавлять собственные шейдерпаки здесь."
+selectShaderpack = "Выбрать шейдерпак"
+tabJavaHeaderText = "Настройки Java"
+tabJavaHeaderDesc = "Управление конфигурацией Java (для продвинутых пользователей)."
+memoryTitle = "Память"
+maxRAM = "Максимальный объем RAM"
+minRAM = "Минимальный объем RAM"
+memoryDesc = "Рекомендуемый минимум RAM — 3 ГБ. Установка одинаковых значений для минимума и максимума может снизить лаги."
+memoryTotalTitle = "Всего"
+memoryAvailableTitle = "Доступно"
+javaExecutableTitle = "Исполняемый файл Java"
+javaExecSelDialogTitle = "Выберите исполняемый файл Java"
+javaExecSelButtonText = "Выбрать файл"
+javaExecDesc = "Исполняемый файл Java проверяется перед запуском игры."
+javaPathDesc = "Путь должен заканчиваться на {pathSuffix}."
+jvmOptsTitle = "Дополнительные параметры JVM"
+jvmOptsDesc = "Опции, передаваемые JVM во время выполнения. -Xms и -Xmx не должны включаться."
+launcherTabHeaderText = "Настройки лаунчера"
+launcherTabHeaderDesc = "Параметры, связанные с самим лаунчером."
+allowPrereleaseTitle = "Разрешить обновления предварительных версий."
+allowPrereleaseDesc = "Предварительные версии включают новые функции, которые могут быть недостаточно протестированы.
Этот параметр всегда включен, если вы используете предварительную версию."
+dataDirectoryTitle = "Директория данных"
+selectDataDirectory = "Выбрать директорию данных"
+chooseFolder = "Выбрать папку"
+dataDirectoryDesc = "Все игровые файлы и локальные установки Java будут храниться в этой директории.
Скриншоты и сохранения миров хранятся в папке экземпляра соответствующей конфигурации сервера."
+aboutTabHeaderText = "О программе"
+aboutTabHeaderDesc = "Просмотр информации и заметок о текущей версии."
aboutTitle = "{appName}"
-stableRelease = "Stable Release"
-versionText = "Version "
-sourceGithub = "Source (GitHub)"
-support = "Support"
-devToolsConsole = "DevTools Console"
-releaseNotes = "Release Notes"
-changelog = "Changelog"
-noReleaseNotes = "No Release Notes"
-viewReleaseNotes = "View Release Notes on GitHub"
-launcherUpdatesHeaderText = "Launcher Updates"
-launcherUpdatesHeaderDesc = "Download, install, and review updates for the launcher."
-checkForUpdates = "Check for Updates"
-whatsNew = "What's New"
-updateReleaseNotes = "Update Release Notes"
+stableRelease = "Стабильный релиз"
+versionText = "Версия "
+sourceGithub = "Исходный код (GitHub)"
+support = "Поддержка"
+devToolsConsole = "Консоль DevTools"
+releaseNotes = "Примечания к выпуску"
+changelog = "История изменений"
+noReleaseNotes = "Нет примечаний к выпуску"
+viewReleaseNotes = "Просмотреть примечания к выпуску на GitHub"
+launcherUpdatesHeaderText = "Обновления лаунчера"
+launcherUpdatesHeaderDesc = "Загрузка, установка и просмотр обновлений лаунчера."
+checkForUpdates = "Проверить обновления"
+whatsNew = "Что нового"
+updateReleaseNotes = "Примечания к обновлению"
[ejs.waiting]
-waitingText = "Waiting for Microsoft.."
+waitingText = "Ожидание Microsoft.."
[ejs.welcome]
-continueButton = "CONTINUE"
-
+continueButton = "ПРОДОЛЖИТЬ"
[js.discord]
-waiting = "Waiting for Client.."
-state = "Server: {shortId}"
+waiting = "Ожидание клиента.."
+state = "Сервер: {shortId}"
[js.index]
-microsoftLoginTitle = "Microsoft Login"
-microsoftLogoutTitle = "Microsoft Logout"
+microsoftLoginTitle = "Вход через Microsoft"
+microsoftLogoutTitle = "Выход из Microsoft"
[js.login]
-login = "LOGIN"
-loggingIn = "LOGGING IN"
-success = "SUCCESS"
-tryAgain = "Try Again"
+login = "ВОЙТИ"
+loggingIn = "ВХОД В СИСТЕМУ"
+success = "УСПЕШНО"
+tryAgain = "Попробовать снова"
[js.login.error]
-invalidValue = "* Invalid Value"
-requiredValue = "* Required"
+invalidValue = "* Неверное значение"
+requiredValue = "* Обязательное поле"
[js.login.error.unknown]
-title = "Unknown Error During Login"
-desc = "An unknown error has occurred. Please see the console for details."
+title = "Неизвестная ошибка при входе"
+desc = "Произошла неизвестная ошибка. Подробности можно посмотреть в консоли."
[js.landing.launch]
-pleaseWait = "Please wait.."
-failureTitle = "Error During Launch"
-failureText = "See console (CTRL + Shift + i) for more details."
-okay = "Okay"
+pleaseWait = "Пожалуйста, подождите.."
+failureTitle = "Ошибка при запуске"
+failureText = "Смотрите консоль (CTRL + Shift + I) для подробностей."
+okay = "ОК"
[js.landing.selectedAccount]
-noAccountSelected = "No Account Selected"
+noAccountSelected = "Аккаунт не выбран"
[js.landing.selectedServer]
-noSelection = "No Server Selected"
-loading = "Loading.."
+noSelection = "Сервер не выбран"
+loading = "Загрузка.."
[js.landing.serverStatus]
-server = "SERVER"
-offline = "OFFLINE"
-players = "PLAYERS"
+server = "СЕРВЕР"
+offline = "ОФФЛАЙН"
+players = "ИГРОКИ"
[js.landing.systemScan]
-checking = "Checking system info.."
-noCompatibleJava = "No Compatible
Java Installation Found"
-installJavaMessage = "In order to launch Minecraft, you need a 64-bit installation of Java {major}. Would you like us to install a copy?"
-installJava = "Install Java"
-installJavaManually = "Install Manually"
-javaDownloadPrepare = "Preparing Java Download.."
-javaDownloadFailureTitle = "Error During Java Download"
-javaDownloadFailureText = "See console (CTRL + Shift + i) for more details."
-javaRequired = "Java is Required
to Launch"
-javaRequiredMessage = 'A valid x64 installation of Java {major} is required to launch.
Please refer to our Java Management Guide for instructions on how to manually install Java.'
-javaRequiredDismiss = "I Understand"
-javaRequiredCancel = "Go Back"
+checking = "Проверка информации о системе.."
+noCompatibleJava = "Совместимая
установка Java не найдена"
+installJavaMessage = "Для запуска Minecraft требуется 64-битная версия Java {major}. Установить её сейчас?"
+installJava = "Установить Java"
+installJavaManually = "Установить вручную"
+javaDownloadPrepare = "Подготовка загрузки Java.."
+javaDownloadFailureTitle = "Ошибка загрузки Java"
+javaDownloadFailureText = "Смотрите консоль (CTRL + Shift + I) для подробностей."
+javaRequired = "Для запуска требуется Java"
+javaRequiredMessage = "Для запуска необходима действительная 64-битная установка Java {major}.
Пожалуйста, ознакомьтесь с нашим Руководством по управлению Java, чтобы установить её вручную."
+javaRequiredDismiss = "Понял"
+javaRequiredCancel = "Назад"
[js.landing.downloadJava]
-findJdkFailure = "Failed to find OpenJDK distribution."
-javaDownloadCorruptedError = "Downloaded JDK has a bad hash, the file may be corrupted."
-extractingJava = "Extracting Java"
-javaInstalled = "Java Installed!"
+findJdkFailure = "Не удалось найти дистрибутив OpenJDK."
+javaDownloadCorruptedError = "Загруженный JDK поврежден, файл может быть испорчен."
+extractingJava = "Распаковка Java"
+javaInstalled = "Java установлена!"
[js.landing.dlAsync]
-loadingServerInfo = "Loading server information.."
-fatalError = "Fatal Error"
-unableToLoadDistributionIndex = "Could not load a copy of the distribution index. See the console (CTRL + Shift + i) for more details."
-pleaseWait = "Please wait.."
-errorDuringLaunchTitle = "Error During Launch"
-seeConsoleForDetails = "See console (CTRL + Shift + i) for more details."
-validatingFileIntegrity = "Validating file integrity.."
-errorDuringFileVerificationTitle = "Error During File Verification"
-downloadingFiles = "Downloading files.."
-errorDuringFileDownloadTitle = "Error During File Download"
-preparingToLaunch = "Preparing to launch.."
-launchingGame = "Launching game.."
-launchWrapperNotDownloaded = "The main file, LaunchWrapper, failed to download properly. As a result, the game cannot launch.
To fix this issue, temporarily turn off your antivirus software and launch the game again.
If you have time, please submit an issue and let us know what antivirus software you use. We'll contact them and try to straighten things out."
-doneEnjoyServer = "Done. Enjoy the server!"
-checkConsoleForDetails = "Please check the console (CTRL + Shift + i) for more details."
+loadingServerInfo = "Загрузка информации о сервере.."
+fatalError = "Критическая ошибка"
+unableToLoadDistributionIndex = "Не удалось загрузить индекс дистрибуции. Смотрите консоль (CTRL + Shift + I) для подробностей."
+pleaseWait = "Пожалуйста, подождите.."
+errorDuringLaunchTitle = "Ошибка при запуске"
+seeConsoleForDetails = "Смотрите консоль (CTRL + Shift + I) для подробностей."
+validatingFileIntegrity = "Проверка целостности файлов.."
+errorDuringFileVerificationTitle = "Ошибка при проверке файлов"
+downloadingFiles = "Загрузка файлов.."
+errorDuringFileDownloadTitle = "Ошибка при загрузке файлов"
+preparingToLaunch = "Подготовка к запуску.."
+launchingGame = "Запуск игры.."
+launchWrapperNotDownloaded = "Основной файл, LaunchWrapper, не был загружен должным образом. В результате игра не может быть запущена.
Чтобы исправить эту проблему, временно отключите антивирусное ПО и попробуйте снова.
Если у вас есть время, пожалуйста, сообщите об этой проблеме и укажите, каким антивирусом вы пользуетесь. Мы постараемся связаться с разработчиками антивируса и решить проблему."
+doneEnjoyServer = "Готово. Наслаждайтесь сервером!"
+checkConsoleForDetails = "Пожалуйста, проверьте консоль (CTRL + Shift + I) для подробностей."
[js.landing.news]
-checking = "Checking for News"
+checking = "Проверка новостей"
[js.landing.discord]
-loading = "Loading game.."
-joining = "Sailing to Westeros!"
-joined = "Exploring the Realm!"
+loading = "Загрузка игры.."
+joining = "Путешествие в Вестерос!"
+joined = "Исследование мира!"
[js.overlay]
-dismiss = "Dismiss"
+dismiss = "Закрыть"
[js.settings.fileSelectors]
-executables = "Executables"
-allFiles = "All Files"
+executables = "Исполняемые файлы"
+allFiles = "Все файлы"
[js.settings.mstfLogin]
-errorTitle = "Something Went Wrong"
-errorMessage = "Microsoft authentication failed. Please try again."
-okButton = "OK"
+errorTitle = "Что-то пошло не так"
+errorMessage = "Ошибка аутентификации Microsoft. Попробуйте еще раз."
+okButton = "ОК"
[js.settings.mstfLogout]
-errorTitle = "Something Went Wrong"
-errorMessage = "Microsoft logout failed. Please try again."
-okButton = "OK"
-
-[js.settings.authAccountSelect]
-selectButton = "Select Account"
-selectedButton = "Selected Account ✔"
-
-[js.settings.authAccountLogout]
-lastAccountWarningTitle = "Warning
This is Your Last Account"
-lastAccountWarningMessage = "In order to use the launcher you must be logged into at least one account. You will need to login again after.
Are you sure you want to log out?"
-confirmButton = "I'm Sure"
-cancelButton = "Cancel"
-
-[js.settings.authAccountPopulate]
-username = "Username"
-uuid = "UUID"
-selectAccount = "Select Account"
-selectedAccount = "Selected Account ✓"
-logout = "Log Out"
+errorTitle = "Что-то пошло не так"
+errorMessage = "Ошибка выхода из Microsoft. Попробуйте еще раз."
+okButton = "ОК"
[js.settings.dropinMods]
-removeButton = "Remove"
-deleteFailedTitle = "Failed to Delete
Drop-in Mod {fullName}"
-deleteFailedMessage = "Make sure the file is not in use and try again."
-failedToggleTitle = "Failed to Toggle
One or More Drop-in Mods"
-okButton = "Okay"
+removeButton = "Удалить"
+deleteFailedTitle = "Ошибка удаления
мода {fullName}"
+deleteFailedMessage = "Убедитесь, что файл не используется, и попробуйте снова."
+failedToggleTitle = "Ошибка переключения
одного или нескольких установленных модов"
+okButton = "ОК"
[js.settings.serverListing]
-mainServer = "Main Server"
+mainServer = "Основной сервер"
[js.settings.java]
-selectedJava = "Selected: Java {version} ({vendor})"
-invalidSelection = "Invalid Selection"
-requiresJava = "Requires Java {major} x64."
-availableOptions = "Available Options for Java {major} (HotSpot VM)"
+selectedJava = "Выбрано: Java {version} ({vendor})"
+invalidSelection = "Некорректный выбор"
+requiresJava = "Требуется Java {major} x64."
+availableOptions = "Доступные версии Java {major} (HotSpot VM)"
[js.settings.about]
-preReleaseTitle = "Pre-release"
-stableReleaseTitle = "Stable Release"
-releaseNotesFailed = "Failed to load release notes."
+preReleaseTitle = "Предварительная версия"
+stableReleaseTitle = "Стабильная версия"
+releaseNotesFailed = "Не удалось загрузить примечания к выпуску."
[js.settings.updates]
-newReleaseTitle = "New Release Available"
-newPreReleaseTitle = "New Pre-release Available"
-downloadingButton = "Downloading.."
-downloadButton = 'Download from GitHubClose the launcher and run the dmg to update.'
-latestVersionTitle = "You Are Running the Latest Version"
-checkForUpdatesButton = "Check for Updates"
-checkingForUpdatesButton = "Checking for Updates.."
+newReleaseTitle = "Доступно новое обновление"
+newPreReleaseTitle = "Доступна новая предварительная версия"
+downloadingButton = "Загрузка.."
+downloadButton = 'Загрузить с GitHubЗакройте лаунчер и запустите установщик для обновления.'
+latestVersionTitle = "У вас установлена последняя версия"
+checkForUpdatesButton = "Проверить обновления"
+checkingForUpdatesButton = "Проверка обновлений.."
[js.settings.msftLogin]
-errorTitle = "Microsoft Login Failed"
-errorMessage = "We were unable to authenticate your Microsoft account. Please try again."
-okButton = "OK"
+errorTitle = "Ошибка входа в Microsoft"
+errorMessage = "Не удалось выполнить аутентификацию в Microsoft. Попробуйте снова."
+okButton = "ОК"
+
+[js.settings.authAccountSelect]
+selectButton = "Выбрать аккаунт"
+selectedButton = "Выбранный аккаунт ✔"
+
+[js.settings.authAccountLogout]
+lastAccountWarningTitle = "Внимание
Это ваш последний аккаунт"
+lastAccountWarningMessage = "Для использования лаунчера необходимо быть авторизованным хотя бы в одном аккаунте. После выхода вам придется войти снова.
Вы уверены, что хотите выйти?"
+confirmButton = "Я уверен"
+cancelButton = "Отмена"
+
+[js.settings.authAccountPopulate]
+username = "Имя пользователя"
+uuid = "UUID"
+selectAccount = "Выбрать аккаунт"
+selectedAccount = "Выбранный аккаунт ✓"
+logout = "Выйти"
[js.uibinder.startup]
-fatalErrorTitle = "Fatal Error: Unable to Load Distribution Index"
-fatalErrorMessage = "A connection could not be established to our servers to download the distribution index. No local copies were available to load.
The distribution index is an essential file which provides the latest server information. The launcher is unable to start without it. Ensure you are connected to the internet and relaunch the application."
-closeButton = "Close"
+fatalErrorTitle = "Критическая ошибка: невозможно загрузить индекс дистрибуции"
+fatalErrorMessage = "Не удалось установить соединение с нашими серверами для загрузки индекса дистрибуции. Локальные копии отсутствуют.
Индекс дистрибуции — это важный файл, который содержит актуальную информацию о сервере. Лаунчер не сможет запуститься без него. Убедитесь, что у вас есть подключение к интернету, и перезапустите приложение."
+closeButton = "Закрыть"
[js.uibinder.validateAccount]
-failedMessageTitle = "Failed to Refresh Login"
-failedMessage = "We were unable to refresh the login for {account}. Please select another account or login again."
-failedMessageSelectAnotherAccount = "We were unable to refresh the login for {account}. Please login again."
-loginButton = "Login"
-selectAnotherAccountButton = "Select Another Account"
+failedMessageTitle = "Ошибка обновления входа"
+failedMessage = "Не удалось обновить вход для {account}. Пожалуйста, выберите другой аккаунт или войдите снова."
+failedMessageSelectAnotherAccount = "Не удалось обновить вход для {account}. Пожалуйста, войдите снова."
+loginButton = "Войти"
+selectAnotherAccountButton = "Выбрать другой аккаунт"
[js.uicore.autoUpdate]
-checkingForUpdateButton = "Checking for Updates..."
-installNowButton = "Install Now"
-checkForUpdatesButton = "Check for Updates"
+checkingForUpdateButton = "Проверка обновлений..."
+installNowButton = "Установить сейчас"
+checkForUpdatesButton = "Проверить обновления"
[js.auth.microsoft.error]
-noProfileTitle = "Error During Login:
Profile Not Set Up"
-noProfileDesc = "Your Microsoft account does not yet have a Minecraft profile set up. If you have recently purchased the game or redeemed it through Xbox Game Pass, you have to set up your profile on Minecraft.net.
If you have not yet purchased the game, you can also do that on Minecraft.net."
-noXboxAccountTitle = "Error During Login:
No Xbox Account"
-noXboxAccountDesc = "Your Microsoft account has no Xbox account associated with it."
-xblBannedTitle = "Error During Login:
Xbox Live Unavailable"
-xblBannedDesc = "Your Microsoft account is from a country where Xbox Live is not available or banned."
-under18Title = "Error During Login:
Parental Approval Required"
-under18Desc = "Accounts for users under the age of 18 must be added to a Family by an adult."
-unknownTitle = "Unknown Error During Login"
-unknownDesc = "An unknown error has occurred. Please see the console for details."
+noProfileTitle = "Ошибка входа:
Профиль не настроен"
+noProfileDesc = "Ваш аккаунт Microsoft еще не имеет профиля Minecraft. Если вы недавно купили игру или активировали ее через Xbox Game Pass, вам нужно настроить профиль на Minecraft.net.
Если вы еще не купили игру, вы можете сделать это на Minecraft.net."
+noXboxAccountTitle = "Ошибка входа:
Нет аккаунта Xbox"
+noXboxAccountDesc = "У вашей учетной записи Microsoft нет привязанного аккаунта Xbox."
+xblBannedTitle = "Ошибка входа:
Xbox Live недоступен"
+xblBannedDesc = "Ваш аккаунт Microsoft зарегистрирован в стране, где Xbox Live недоступен или заблокирован."
+under18Title = "Ошибка входа:
Требуется родительское разрешение"
+under18Desc = "Аккаунты пользователей младше 18 лет должны быть добавлены в «Семью» взрослым."
+unknownTitle = "Неизвестная ошибка входа"
+unknownDesc = "Произошла неизвестная ошибка. Подробности можно посмотреть в консоли."
+
-[js.auth.mojang.error]
-methodNotAllowedTitle = "Internal Error:
Method Not Allowed"
-methodNotAllowedDesc = "Method not allowed. Please report this error."
-notFoundTitle = "Internal Error:
Not Found"
-notFoundDesc = "The authentication endpoint was not found. Please report this issue."
-accountMigratedTitle = "Error During Login:
Account Migrated"
-accountMigratedDesc = "You've attempted to login with a migrated account. Try again using the account email as the username."
-invalidCredentialsTitle = "Error During Login:
Invalid Credentials"
-invalidCredentialsDesc = "The email or password you've entered is incorrect. Please try again."
-tooManyAttemptsTitle = "Error During Login:
Too Many Attempts"
-tooManyAttemptsDesc = "There have been too many login attempts with this account recently. Please try again later."
-invalidTokenTitle = "Error During Login:
Invalid Token"
-invalidTokenDesc = "The provided access token is invalid."
-tokenHasProfileTitle = "Error During Login:
Token Has Profile"
-tokenHasProfileDesc = "Access token already has a profile assigned. Selecting profiles is not implemented yet."
-credentialsMissingTitle = "Error During Login:
Credentials Missing"
-credentialsMissingDesc = "Username/password was not submitted or password is less than 3 characters."
-invalidSaltVersionTitle = "Error During Login:
Invalid Salt Version"
-invalidSaltVersionDesc = "Invalid salt version."
-unsupportedMediaTypeTitle = "Internal Error:
Unsupported Media Type"
-unsupportedMediaTypeDesc = "Unsupported media type. Please report this error."
-accountGoneTitle = "Error During Login:
Account Migrated"
-accountGoneDesc = "Account has been migrated to a Microsoft account. Please log in with Microsoft."
-unreachableTitle = "Error During Login:
Unreachable"
-unreachableDesc = "Unable to reach the authentication servers. Ensure that they are online and you are connected to the internet."
-gameNotPurchasedTitle = "Error During Login:
Game Not Purchased"
-gameNotPurchasedDesc = "The account you are trying to login with has not purchased a copy of Minecraft. You may purchase a copy on Minecraft.net"
-unknownErrorTitle = "Unknown Error During Login"
-unknownErrorDesc = "An unknown error has occurred. Please see the console for details."
diff --git a/app/assets/lang/ru_RU.toml b/app/assets/lang/ru_RU.toml
index b6bcdb5c..e9b2a150 100644
--- a/app/assets/lang/ru_RU.toml
+++ b/app/assets/lang/ru_RU.toml
@@ -231,10 +231,6 @@ errorTitle = "Что-то пошло не так"
errorMessage = "Ошибка выхода из Microsoft. Попробуйте еще раз."
okButton = "ОК"
-[js.settings.authAccountSelect]
-selectButton = "Выбрать аккаунт"
-selectedButton = "Выбранный аккаунт ✔"
-
[js.settings.authAccountLogout]
lastAccountWarningTitle = "Внимание
Это ваш последний аккаунт"
lastAccountWarningMessage = "Для использования лаунчера необходимо быть авторизованным хотя бы в одном аккаунте. После выхода вам придется войти снова.
Вы уверены, что хотите выйти?"
diff --git a/app/login.ejs b/app/login.ejs
index 2da80729..7892a822 100644
--- a/app/login.ejs
+++ b/app/login.ejs
@@ -18,19 +18,7 @@
<%- lang('login.loginEmailError') %>
-