Added offline mode
This commit is contained in:
parent
bc9db0247a
commit
b800af378d
@ -388,6 +388,17 @@ body, button {
|
|||||||
background: rgba(0, 0, 0, 0.50);
|
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. */
|
/* Login cancel button styles. */
|
||||||
#loginCancelContainer {
|
#loginCancelContainer {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
1
app/assets/images/lotip22.svg
Normal file
1
app/assets/images/lotip22.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 22 22" version="1.1"><path d="M 11.390 2.737 C 13.530 2.957, 15.921 3.778, 16.704 4.561 C 17.487 5.344, 17.847 6.438, 17.505 6.992 C 17.162 7.547, 15.982 8, 14.882 8 C 13.782 8, 13.160 7.550, 13.500 7 C 13.848 6.437, 13.043 6, 11.657 6 C 9.795 6, 8.928 6.767, 8.098 9.149 C 7.494 10.881, 7 12.681, 7 13.149 C 7 13.617, 7.873 14, 8.941 14 C 10.009 14, 11.203 13.480, 11.595 12.845 C 12.057 12.099, 11.868 11.964, 11.058 12.464 C 10.195 12.998, 9.921 12.659, 10.174 11.368 C 10.465 9.878, 11.441 9.500, 14.994 9.500 C 18.191 9.500, 19.536 9.068, 19.755 7.971 C 19.924 7.131, 19.130 5.443, 17.992 4.221 C 16.417 2.532, 14.914 2.040, 11.711 2.168 L 7.500 2.336 11.390 2.737 M 5.813 4.683 C 6.534 4.972, 7.397 4.936, 7.729 4.604 C 8.061 4.272, 7.471 4.036, 6.417 4.079 C 5.252 4.127, 5.015 4.364, 5.813 4.683 M 15 13.465 C 15 14.270, 14.130 15.395, 13.066 15.965 C 12.002 16.534, 9.617 17, 7.766 17 C 5.915 17, 3.833 16.438, 3.141 15.750 C 2.131 14.748, 2.016 14.852, 2.558 16.278 C 2.931 17.256, 4.053 18.493, 5.052 19.028 C 6.051 19.563, 7.933 20, 9.235 20 C 10.536 20, 12.793 19.438, 14.249 18.750 C 15.706 18.063, 17.124 16.635, 17.400 15.577 C 17.677 14.519, 17.674 13.281, 17.393 12.826 C 17.112 12.372, 16.459 12, 15.941 12 C 15.423 12, 15 12.659, 15 13.465" stroke="none" fill="#040404" fill-rule="evenodd"/><path d="M 8 4 C 8 4.550, 7.411 5, 6.691 5 C 5.971 5, 4.674 7.213, 3.809 9.918 C 2.681 13.445, 2.542 15.142, 3.318 15.918 C 3.913 16.513, 5.915 17, 7.766 17 C 9.617 17, 12.002 16.534, 13.066 15.965 C 14.130 15.395, 15 14.270, 15 13.465 C 15 12.659, 14.352 12, 13.559 12 C 12.766 12, 11.840 12.450, 11.500 13 C 11.160 13.550, 10.009 14, 8.941 14 C 7.873 14, 7 13.617, 7 13.149 C 7 12.681, 7.494 10.881, 8.098 9.149 C 8.928 6.767, 9.795 6, 11.657 6 C 13.043 6, 13.848 6.437, 13.500 7 C 13.160 7.550, 13.782 8, 14.882 8 C 15.982 8, 17.162 7.547, 17.505 6.992 C 17.847 6.438, 17.456 5.313, 16.635 4.492 C 15.814 3.672, 13.536 3, 11.571 3 C 9.607 3, 8 3.450, 8 4" stroke="none" fill="#94a951" fill-rule="evenodd"/></svg>
|
After Width: | Height: | Size: 2.1 KiB |
@ -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 }
|
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,
|
* 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
|
* we will attempt to refresh the access token and update that value. If that fails, a
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
const fs = require('fs-extra')
|
const fs = require('fs-extra')
|
||||||
const { LoggerUtil } = require('helios-core')
|
const { LoggerUtil } = require('helios-core')
|
||||||
|
const { randomUUID } = require('crypto')
|
||||||
const os = require('os')
|
const os = require('os')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
|
||||||
@ -349,6 +350,20 @@ exports.addMojangAuthAccount = function(uuid, accessToken, username, displayName
|
|||||||
return config.authenticationDatabase[uuid]
|
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.
|
* Update the tokens of an authenticated microsoft account.
|
||||||
*
|
*
|
||||||
|
@ -11,8 +11,6 @@ const loginCancelContainer = document.getElementById('loginCancelContainer')
|
|||||||
const loginCancelButton = document.getElementById('loginCancelButton')
|
const loginCancelButton = document.getElementById('loginCancelButton')
|
||||||
const loginEmailError = document.getElementById('loginEmailError')
|
const loginEmailError = document.getElementById('loginEmailError')
|
||||||
const loginUsername = document.getElementById('loginUsername')
|
const loginUsername = document.getElementById('loginUsername')
|
||||||
const loginPasswordError = document.getElementById('loginPasswordError')
|
|
||||||
const loginPassword = document.getElementById('loginPassword')
|
|
||||||
const checkmarkContainer = document.getElementById('checkmarkContainer')
|
const checkmarkContainer = document.getElementById('checkmarkContainer')
|
||||||
const loginRememberOption = document.getElementById('loginRememberOption')
|
const loginRememberOption = document.getElementById('loginRememberOption')
|
||||||
const loginButton = document.getElementById('loginButton')
|
const loginButton = document.getElementById('loginButton')
|
||||||
@ -77,17 +75,7 @@ function validateEmail(value){
|
|||||||
* @param {string} value The password value.
|
* @param {string} value The password value.
|
||||||
*/
|
*/
|
||||||
function validatePassword(value){
|
function validatePassword(value){
|
||||||
if(value){
|
lp = true;
|
||||||
loginPasswordError.style.opacity = 0
|
|
||||||
lp = true
|
|
||||||
if(lu){
|
|
||||||
loginDisabled(false)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
lp = false
|
|
||||||
showError(loginPasswordError, Lang.queryJS('login.error.invalidValue'))
|
|
||||||
loginDisabled(true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emphasize errors with shake when focus is lost.
|
// Emphasize errors with shake when focus is lost.
|
||||||
@ -95,17 +83,10 @@ loginUsername.addEventListener('focusout', (e) => {
|
|||||||
validateEmail(e.target.value)
|
validateEmail(e.target.value)
|
||||||
shakeError(loginEmailError)
|
shakeError(loginEmailError)
|
||||||
})
|
})
|
||||||
loginPassword.addEventListener('focusout', (e) => {
|
|
||||||
validatePassword(e.target.value)
|
|
||||||
shakeError(loginPasswordError)
|
|
||||||
})
|
|
||||||
|
|
||||||
// Validate input for each field.
|
// Validate input for each field.
|
||||||
loginUsername.addEventListener('input', (e) => {
|
loginUsername.addEventListener('input', (e) => {
|
||||||
validateEmail(e.target.value)
|
loginDisabled(false)
|
||||||
})
|
|
||||||
loginPassword.addEventListener('input', (e) => {
|
|
||||||
validatePassword(e.target.value)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -143,7 +124,6 @@ function formDisabled(v){
|
|||||||
loginDisabled(v)
|
loginDisabled(v)
|
||||||
loginCancelButton.disabled = v
|
loginCancelButton.disabled = v
|
||||||
loginUsername.disabled = v
|
loginUsername.disabled = v
|
||||||
loginPassword.disabled = v
|
|
||||||
if(v){
|
if(v){
|
||||||
checkmarkContainer.setAttribute('disabled', v)
|
checkmarkContainer.setAttribute('disabled', v)
|
||||||
} else {
|
} else {
|
||||||
@ -187,7 +167,7 @@ loginButton.addEventListener('click', () => {
|
|||||||
// Show loading stuff.
|
// Show loading stuff.
|
||||||
loginLoading(true)
|
loginLoading(true)
|
||||||
|
|
||||||
AuthManager.addMojangAccount(loginUsername.value, loginPassword.value).then((value) => {
|
AuthManager.addOfflineAccount(loginUsername.value).then((value) => {
|
||||||
updateSelectedAccount(value)
|
updateSelectedAccount(value)
|
||||||
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.loggingIn'), Lang.queryJS('login.success'))
|
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.loggingIn'), Lang.queryJS('login.success'))
|
||||||
$('.circle-loader').toggleClass('load-complete')
|
$('.circle-loader').toggleClass('load-complete')
|
||||||
@ -202,7 +182,6 @@ loginButton.addEventListener('click', () => {
|
|||||||
loginCancelEnabled(false) // Reset this for good measure.
|
loginCancelEnabled(false) // Reset this for good measure.
|
||||||
loginViewCancelHandler = null // Reset this for good measure.
|
loginViewCancelHandler = null // Reset this for good measure.
|
||||||
loginUsername.value = ''
|
loginUsername.value = ''
|
||||||
loginPassword.value = ''
|
|
||||||
$('.circle-loader').toggleClass('load-complete')
|
$('.circle-loader').toggleClass('load-complete')
|
||||||
$('.checkmark').toggle()
|
$('.checkmark').toggle()
|
||||||
loginLoading(false)
|
loginLoading(false)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
const loginOptionsCancelContainer = document.getElementById('loginOptionCancelContainer')
|
const loginOptionsCancelContainer = document.getElementById('loginOptionCancelContainer')
|
||||||
const loginOptionMicrosoft = document.getElementById('loginOptionMicrosoft')
|
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')
|
const loginOptionsCancelButton = document.getElementById('loginOptionCancelButton')
|
||||||
|
|
||||||
let loginOptionsCancellable = false
|
let loginOptionsCancellable = false
|
||||||
@ -28,7 +29,7 @@ loginOptionMicrosoft.onclick = (e) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
loginOptionMojang.onclick = (e) => {
|
loginOptionOffline.onclick = (e) => {
|
||||||
switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
|
switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
|
||||||
loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
||||||
loginViewOnCancel = loginOptionsViewOnLoginCancel
|
loginViewOnCancel = loginOptionsViewOnLoginCancel
|
||||||
|
@ -342,15 +342,6 @@ settingsNavDone.onclick = () => {
|
|||||||
const msftLoginLogger = LoggerUtil.getLogger('Microsoft Login')
|
const msftLoginLogger = LoggerUtil.getLogger('Microsoft Login')
|
||||||
const msftLogoutLogger = LoggerUtil.getLogger('Microsoft Logout')
|
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.
|
// Bind the add microsoft account button.
|
||||||
document.getElementById('settingsAddMicrosoftAccount').onclick = (e) => {
|
document.getElementById('settingsAddMicrosoftAccount').onclick = (e) => {
|
||||||
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
switchView(getCurrentView(), VIEWS.waiting, 500, 500, () => {
|
||||||
@ -519,7 +510,7 @@ function processLogOut(val, isLastAccount){
|
|||||||
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGOUT, uuid, isLastAccount)
|
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGOUT, uuid, isLastAccount)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
AuthManager.removeMojangAccount(uuid).then(() => {
|
AuthManager.removeOfflineAccount(uuid).then(() => {
|
||||||
if(!isLastAccount && uuid === prevSelAcc.uuid){
|
if(!isLastAccount && uuid === prevSelAcc.uuid){
|
||||||
const selAcc = ConfigManager.getSelectedAccount()
|
const selAcc = ConfigManager.getSelectedAccount()
|
||||||
refreshAuthAccountSelected(selAcc.uuid)
|
refreshAuthAccountSelected(selAcc.uuid)
|
||||||
@ -619,7 +610,8 @@ function refreshAuthAccountSelected(uuid){
|
|||||||
}
|
}
|
||||||
|
|
||||||
const settingsCurrentMicrosoftAccounts = document.getElementById('settingsCurrentMicrosoftAccounts')
|
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.
|
* Add auth account elements for each one stored in the authentication database.
|
||||||
@ -634,6 +626,7 @@ function populateAuthAccounts(){
|
|||||||
|
|
||||||
let microsoftAuthAccountStr = ''
|
let microsoftAuthAccountStr = ''
|
||||||
let mojangAuthAccountStr = ''
|
let mojangAuthAccountStr = ''
|
||||||
|
let offlineAuthAccountStr = ''
|
||||||
|
|
||||||
authKeys.forEach((val) => {
|
authKeys.forEach((val) => {
|
||||||
const acc = authAccounts[val]
|
const acc = authAccounts[val]
|
||||||
@ -665,13 +658,14 @@ function populateAuthAccounts(){
|
|||||||
if(acc.type === 'microsoft') {
|
if(acc.type === 'microsoft') {
|
||||||
microsoftAuthAccountStr += accHtml
|
microsoftAuthAccountStr += accHtml
|
||||||
} else {
|
} else {
|
||||||
mojangAuthAccountStr += accHtml
|
offlineAuthAccountStr += accHtml
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
settingsCurrentMicrosoftAccounts.innerHTML = microsoftAuthAccountStr
|
settingsCurrentMicrosoftAccounts.innerHTML = microsoftAuthAccountStr
|
||||||
settingsCurrentMojangAccounts.innerHTML = mojangAuthAccountStr
|
//settingsCurrentMojangAccounts.innerHTML = mojangAuthAccountStr
|
||||||
|
settingsCurrentOfflineAccounts.innerHTML = offlineAuthAccountStr
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,6 +17,7 @@ let fatalStartupError = false
|
|||||||
const VIEWS = {
|
const VIEWS = {
|
||||||
landing: '#landingContainer',
|
landing: '#landingContainer',
|
||||||
loginOptions: '#loginOptionsContainer',
|
loginOptions: '#loginOptionsContainer',
|
||||||
|
loginOffline: '#loginOfflineContainer',
|
||||||
login: '#loginContainer',
|
login: '#loginContainer',
|
||||||
settings: '#settingsContainer',
|
settings: '#settingsContainer',
|
||||||
welcome: '#welcomeContainer',
|
welcome: '#welcomeContainer',
|
||||||
|
@ -1,344 +1,315 @@
|
|||||||
[ejs.landing]
|
[ejs.landing]
|
||||||
updateAvailableTooltip = "Update Available"
|
updateAvailableTooltip = "Доступно обновление"
|
||||||
usernamePlaceholder = "Username"
|
usernamePlaceholder = "Имя пользователя"
|
||||||
usernameEditButton = "Edit"
|
usernameEditButton = "Редактировать"
|
||||||
settingsTooltip = "Settings"
|
settingsTooltip = "Настройки"
|
||||||
serverStatus = "SERVER"
|
serverStatus = "СЕРВЕР"
|
||||||
serverStatusPlaceholder = "OFFLINE"
|
serverStatusPlaceholder = "ОФФЛАЙН"
|
||||||
mojangStatus = "MOJANG STATUS"
|
mojangStatus = "СТАТУС MOJANG"
|
||||||
mojangStatusTooltipTitle = "Services"
|
mojangStatusTooltipTitle = "Сервисы"
|
||||||
mojangStatusNETitle = "Non Essential"
|
mojangStatusNETitle = "Необязательно"
|
||||||
newsButton = "NEWS"
|
newsButton = "НОВОСТИ"
|
||||||
launchButton = "PLAY"
|
launchButton = "ИГРАТЬ"
|
||||||
launchButtonPlaceholder = "• No Server Selected"
|
launchButtonPlaceholder = "• Сервер не выбран"
|
||||||
launchDetails = "Please wait.."
|
launchDetails = "Пожалуйста, подождите.."
|
||||||
newsNavigationStatus = "{currentPage} of {totalPages}"
|
newsNavigationStatus = "{currentPage} из {totalPages}"
|
||||||
newsErrorLoadSpan = "Checking for News.."
|
newsErrorLoadSpan = "Проверка новостей.."
|
||||||
newsErrorFailedSpan = "Failed to Load News"
|
newsErrorFailedSpan = "Не удалось загрузить новости"
|
||||||
newsErrorRetryButton = "Try Again"
|
newsErrorRetryButton = "Попробовать снова"
|
||||||
newsErrorNoneSpan = "No News"
|
newsErrorNoneSpan = "Новостей нет"
|
||||||
|
|
||||||
[ejs.login]
|
[ejs.login]
|
||||||
loginCancelText = "Cancel"
|
loginCancelText = "Отмена"
|
||||||
loginSubheader = "MINECRAFT LOGIN"
|
loginSubheader = "ВХОД В MINECRAFT"
|
||||||
loginEmailError = "* Invalid Value"
|
loginEmailError = "* Неверное значение"
|
||||||
loginEmailPlaceholder = "EMAIL OR USERNAME"
|
loginEmailPlaceholder = "EMAIL ИЛИ ИМЯ ПОЛЬЗОВАТЕЛЯ"
|
||||||
loginPasswordError = "* Required"
|
loginPasswordError = "* Обязательное поле"
|
||||||
loginPasswordPlaceholder = "PASSWORD"
|
loginPasswordPlaceholder = "ПАРОЛЬ"
|
||||||
loginForgotPasswordLink = "https://minecraft.net/password/forgot/"
|
loginForgotPasswordLink = "https://minecraft.net/password/forgot/"
|
||||||
loginForgotPasswordText = "forgot password?"
|
loginForgotPasswordText = "забыли пароль?"
|
||||||
loginRememberMeText = "remember me?"
|
loginRememberMeText = "запомнить меня?"
|
||||||
loginButtonText = "LOGIN"
|
loginButtonText = "ВОЙТИ"
|
||||||
loginNeedAccountLink = "https://minecraft.net/store/minecraft-java-edition/"
|
loginNeedAccountLink = "https://minecraft.net/store/minecraft-java-edition/"
|
||||||
loginNeedAccountText = "Need an Account?"
|
loginNeedAccountText = "Нужен аккаунт?"
|
||||||
loginPasswordDisclaimer1 = "Your password is sent directly to mojang and never stored."
|
loginPasswordDisclaimer1 = "Ваш пароль отправляется напрямую в Mojang и никогда не сохраняется."
|
||||||
loginPasswordDisclaimer2 = "{appName} is not affiliated with Mojang AB."
|
loginPasswordDisclaimer2 = "{appName} не связан с Mojang AB."
|
||||||
|
|
||||||
[ejs.loginOptions]
|
[ejs.loginOptions]
|
||||||
loginOptionsTitle = "Login Options"
|
loginOptionsTitle = "Опции входа"
|
||||||
loginWithMicrosoft = "Login with Microsoft"
|
loginWithMicrosoft = "Войти через Microsoft"
|
||||||
loginWithMojang = "Login with Mojang"
|
loginWithMojang = "Войти через Mojang"
|
||||||
cancelButton = "Cancel"
|
cancelButton = "Отмена"
|
||||||
|
|
||||||
[ejs.overlay]
|
[ejs.overlay]
|
||||||
serverSelectHeader = "Available Servers"
|
serverSelectHeader = "Доступные серверы"
|
||||||
serverSelectConfirm = "Select"
|
serverSelectConfirm = "Выбрать"
|
||||||
serverSelectCancel = "Cancel"
|
serverSelectCancel = "Отмена"
|
||||||
accountSelectHeader = "Select an Account"
|
accountSelectHeader = "Выберите аккаунт"
|
||||||
accountSelectConfirm = "Select"
|
accountSelectConfirm = "Выбрать"
|
||||||
accountSelectCancel = "Cancel"
|
accountSelectCancel = "Отмена"
|
||||||
|
|
||||||
[ejs.settings]
|
[ejs.settings]
|
||||||
navHeaderText = "Settings"
|
navHeaderText = "Настройки"
|
||||||
navAccount = "Account"
|
navAccount = "Аккаунт"
|
||||||
navMinecraft = "Minecraft"
|
navMinecraft = "Minecraft"
|
||||||
navMods = "Mods"
|
navMods = "Моды"
|
||||||
navJava = "Java"
|
navJava = "Java"
|
||||||
navLauncher = "Launcher"
|
navLauncher = "Лаунчер"
|
||||||
navAbout = "About"
|
navAbout = "О программе"
|
||||||
navUpdates = "Updates"
|
navUpdates = "Обновления"
|
||||||
navDone = "Done"
|
navDone = "Готово"
|
||||||
tabAccountHeaderText = "Account Settings"
|
tabAccountHeaderText = "Настройки аккаунта"
|
||||||
tabAccountHeaderDesc = "Add new accounts or manage existing ones."
|
tabAccountHeaderDesc = "Добавляйте новые аккаунты или управляйте существующими."
|
||||||
microsoftAccount = "Microsoft"
|
microsoftAccount = "Microsoft"
|
||||||
addMicrosoftAccount = "+ Add Microsoft Account"
|
addMicrosoftAccount = "+ Добавить аккаунт Microsoft"
|
||||||
mojangAccount = "Mojang"
|
mojangAccount = "Mojang"
|
||||||
addMojangAccount = "+ Add Mojang Account"
|
addMojangAccount = "+ Добавить аккаунт Mojang"
|
||||||
minecraftTabHeaderText = "Minecraft Settings"
|
minecraftTabHeaderText = "Настройки Minecraft"
|
||||||
minecraftTabHeaderDesc = "Options related to game launch."
|
minecraftTabHeaderDesc = "Параметры, связанные с запуском игры."
|
||||||
gameResolutionTitle = "Game Resolution"
|
gameResolutionTitle = "Разрешение игры"
|
||||||
launchFullscreenTitle = "Launch in fullscreen."
|
launchFullscreenTitle = "Запуск в полноэкранном режиме."
|
||||||
autoConnectTitle = "Automatically connect to the server on launch."
|
autoConnectTitle = "Автоматически подключаться к серверу при запуске."
|
||||||
launchDetachedTitle = "Launch game process detached from launcher."
|
launchDetachedTitle = "Запускать игру отдельно от лаунчера."
|
||||||
launchDetachedDesc = "If the game is not detached, closing the launcher will also close the game."
|
launchDetachedDesc = "Если игра не запущена отдельно, закрытие лаунчера приведет к закрытию игры."
|
||||||
tabModsHeaderText = "Mod Settings"
|
tabModsHeaderText = "Настройки модов"
|
||||||
tabModsHeaderDesc = "Enable or disable mods."
|
tabModsHeaderDesc = "Включайте или отключайте моды."
|
||||||
switchServerButton = "Switch"
|
switchServerButton = "Сменить сервер"
|
||||||
requiredMods = "Required Mods"
|
requiredMods = "Обязательные моды"
|
||||||
optionalMods = "Optional Mods"
|
optionalMods = "Дополнительные моды"
|
||||||
dropinMods = "Drop-in Mods"
|
dropinMods = "Установленные моды"
|
||||||
addMods = "Add Mods"
|
addMods = "Добавить моды"
|
||||||
dropinRefreshNote = "(F5 to Refresh)"
|
dropinRefreshNote = "(Нажмите F5 для обновления)"
|
||||||
shaderpacks = "Shaderpacks"
|
shaderpacks = "Шейдерпаки"
|
||||||
shaderpackDesc = "Enable or disable shaders. Please note, shaders will only run smoothly on powerful setups. You may add custom packs here."
|
shaderpackDesc = "Включайте или отключайте шейдеры. Учтите, что они требуют мощного компьютера. Вы можете добавлять собственные шейдерпаки здесь."
|
||||||
selectShaderpack = "Select Shaderpack"
|
selectShaderpack = "Выбрать шейдерпак"
|
||||||
tabJavaHeaderText = "Java Settings"
|
tabJavaHeaderText = "Настройки Java"
|
||||||
tabJavaHeaderDesc = "Manage the Java configuration (advanced)."
|
tabJavaHeaderDesc = "Управление конфигурацией Java (для продвинутых пользователей)."
|
||||||
memoryTitle = "Memory"
|
memoryTitle = "Память"
|
||||||
maxRAM = "Maximum RAM"
|
maxRAM = "Максимальный объем RAM"
|
||||||
minRAM = "Minimum RAM"
|
minRAM = "Минимальный объем RAM"
|
||||||
memoryDesc = "The recommended minimum RAM is 3 gigabytes. Setting the minimum and maximum values to the same value may reduce lag."
|
memoryDesc = "Рекомендуемый минимум RAM — 3 ГБ. Установка одинаковых значений для минимума и максимума может снизить лаги."
|
||||||
memoryTotalTitle = "Total"
|
memoryTotalTitle = "Всего"
|
||||||
memoryAvailableTitle = "Available"
|
memoryAvailableTitle = "Доступно"
|
||||||
javaExecutableTitle = "Java Executable"
|
javaExecutableTitle = "Исполняемый файл Java"
|
||||||
javaExecSelDialogTitle = "Select Java Executable"
|
javaExecSelDialogTitle = "Выберите исполняемый файл Java"
|
||||||
javaExecSelButtonText = "Choose File"
|
javaExecSelButtonText = "Выбрать файл"
|
||||||
javaExecDesc = "The Java executable is validated before game launch."
|
javaExecDesc = "Исполняемый файл Java проверяется перед запуском игры."
|
||||||
javaPathDesc = "The path should end with <strong>{pathSuffix}</strong>."
|
javaPathDesc = "Путь должен заканчиваться на <strong>{pathSuffix}</strong>."
|
||||||
jvmOptsTitle = "Additional JVM Options"
|
jvmOptsTitle = "Дополнительные параметры JVM"
|
||||||
jvmOptsDesc = "Options to be provided to the JVM at runtime. <em>-Xms</em> and <em>-Xmx</em> should not be included."
|
jvmOptsDesc = "Опции, передаваемые JVM во время выполнения. <em>-Xms</em> и <em>-Xmx</em> не должны включаться."
|
||||||
launcherTabHeaderText = "Launcher Settings"
|
launcherTabHeaderText = "Настройки лаунчера"
|
||||||
launcherTabHeaderDesc = "Options related to the launcher itself."
|
launcherTabHeaderDesc = "Параметры, связанные с самим лаунчером."
|
||||||
allowPrereleaseTitle = "Allow Pre-Release Updates."
|
allowPrereleaseTitle = "Разрешить обновления предварительных версий."
|
||||||
allowPrereleaseDesc = "Pre-Releases include new features which may have not been fully tested or integrated.<br>This will always be true if you are using a pre-release version."
|
allowPrereleaseDesc = "Предварительные версии включают новые функции, которые могут быть недостаточно протестированы.<br>Этот параметр всегда включен, если вы используете предварительную версию."
|
||||||
dataDirectoryTitle = "Data Directory"
|
dataDirectoryTitle = "Директория данных"
|
||||||
selectDataDirectory = "Select Data Directory"
|
selectDataDirectory = "Выбрать директорию данных"
|
||||||
chooseFolder = "Choose Folder"
|
chooseFolder = "Выбрать папку"
|
||||||
dataDirectoryDesc = "All game files and local Java installations will be stored in the data directory.<br>Screenshots and world saves are stored in the instance folder for the corresponding server configuration."
|
dataDirectoryDesc = "Все игровые файлы и локальные установки Java будут храниться в этой директории.<br>Скриншоты и сохранения миров хранятся в папке экземпляра соответствующей конфигурации сервера."
|
||||||
aboutTabHeaderText = "About"
|
aboutTabHeaderText = "О программе"
|
||||||
aboutTabHeaderDesc = "View information and release notes for the current version."
|
aboutTabHeaderDesc = "Просмотр информации и заметок о текущей версии."
|
||||||
aboutTitle = "{appName}"
|
aboutTitle = "{appName}"
|
||||||
stableRelease = "Stable Release"
|
stableRelease = "Стабильный релиз"
|
||||||
versionText = "Version "
|
versionText = "Версия "
|
||||||
sourceGithub = "Source (GitHub)"
|
sourceGithub = "Исходный код (GitHub)"
|
||||||
support = "Support"
|
support = "Поддержка"
|
||||||
devToolsConsole = "DevTools Console"
|
devToolsConsole = "Консоль DevTools"
|
||||||
releaseNotes = "Release Notes"
|
releaseNotes = "Примечания к выпуску"
|
||||||
changelog = "Changelog"
|
changelog = "История изменений"
|
||||||
noReleaseNotes = "No Release Notes"
|
noReleaseNotes = "Нет примечаний к выпуску"
|
||||||
viewReleaseNotes = "View Release Notes on GitHub"
|
viewReleaseNotes = "Просмотреть примечания к выпуску на GitHub"
|
||||||
launcherUpdatesHeaderText = "Launcher Updates"
|
launcherUpdatesHeaderText = "Обновления лаунчера"
|
||||||
launcherUpdatesHeaderDesc = "Download, install, and review updates for the launcher."
|
launcherUpdatesHeaderDesc = "Загрузка, установка и просмотр обновлений лаунчера."
|
||||||
checkForUpdates = "Check for Updates"
|
checkForUpdates = "Проверить обновления"
|
||||||
whatsNew = "What's New"
|
whatsNew = "Что нового"
|
||||||
updateReleaseNotes = "Update Release Notes"
|
updateReleaseNotes = "Примечания к обновлению"
|
||||||
|
|
||||||
[ejs.waiting]
|
[ejs.waiting]
|
||||||
waitingText = "Waiting for Microsoft.."
|
waitingText = "Ожидание Microsoft.."
|
||||||
|
|
||||||
[ejs.welcome]
|
[ejs.welcome]
|
||||||
continueButton = "CONTINUE"
|
continueButton = "ПРОДОЛЖИТЬ"
|
||||||
|
|
||||||
|
|
||||||
[js.discord]
|
[js.discord]
|
||||||
waiting = "Waiting for Client.."
|
waiting = "Ожидание клиента.."
|
||||||
state = "Server: {shortId}"
|
state = "Сервер: {shortId}"
|
||||||
|
|
||||||
[js.index]
|
[js.index]
|
||||||
microsoftLoginTitle = "Microsoft Login"
|
microsoftLoginTitle = "Вход через Microsoft"
|
||||||
microsoftLogoutTitle = "Microsoft Logout"
|
microsoftLogoutTitle = "Выход из Microsoft"
|
||||||
|
|
||||||
[js.login]
|
[js.login]
|
||||||
login = "LOGIN"
|
login = "ВОЙТИ"
|
||||||
loggingIn = "LOGGING IN"
|
loggingIn = "ВХОД В СИСТЕМУ"
|
||||||
success = "SUCCESS"
|
success = "УСПЕШНО"
|
||||||
tryAgain = "Try Again"
|
tryAgain = "Попробовать снова"
|
||||||
|
|
||||||
[js.login.error]
|
[js.login.error]
|
||||||
invalidValue = "* Invalid Value"
|
invalidValue = "* Неверное значение"
|
||||||
requiredValue = "* Required"
|
requiredValue = "* Обязательное поле"
|
||||||
|
|
||||||
[js.login.error.unknown]
|
[js.login.error.unknown]
|
||||||
title = "Unknown Error During Login"
|
title = "Неизвестная ошибка при входе"
|
||||||
desc = "An unknown error has occurred. Please see the console for details."
|
desc = "Произошла неизвестная ошибка. Подробности можно посмотреть в консоли."
|
||||||
|
|
||||||
[js.landing.launch]
|
[js.landing.launch]
|
||||||
pleaseWait = "Please wait.."
|
pleaseWait = "Пожалуйста, подождите.."
|
||||||
failureTitle = "Error During Launch"
|
failureTitle = "Ошибка при запуске"
|
||||||
failureText = "See console (CTRL + Shift + i) for more details."
|
failureText = "Смотрите консоль (CTRL + Shift + I) для подробностей."
|
||||||
okay = "Okay"
|
okay = "ОК"
|
||||||
|
|
||||||
[js.landing.selectedAccount]
|
[js.landing.selectedAccount]
|
||||||
noAccountSelected = "No Account Selected"
|
noAccountSelected = "Аккаунт не выбран"
|
||||||
|
|
||||||
[js.landing.selectedServer]
|
[js.landing.selectedServer]
|
||||||
noSelection = "No Server Selected"
|
noSelection = "Сервер не выбран"
|
||||||
loading = "Loading.."
|
loading = "Загрузка.."
|
||||||
|
|
||||||
[js.landing.serverStatus]
|
[js.landing.serverStatus]
|
||||||
server = "SERVER"
|
server = "СЕРВЕР"
|
||||||
offline = "OFFLINE"
|
offline = "ОФФЛАЙН"
|
||||||
players = "PLAYERS"
|
players = "ИГРОКИ"
|
||||||
|
|
||||||
[js.landing.systemScan]
|
[js.landing.systemScan]
|
||||||
checking = "Checking system info.."
|
checking = "Проверка информации о системе.."
|
||||||
noCompatibleJava = "No Compatible<br>Java Installation Found"
|
noCompatibleJava = "Совместимая<br>установка Java не найдена"
|
||||||
installJavaMessage = "In order to launch Minecraft, you need a 64-bit installation of Java {major}. Would you like us to install a copy?"
|
installJavaMessage = "Для запуска Minecraft требуется 64-битная версия Java {major}. Установить её сейчас?"
|
||||||
installJava = "Install Java"
|
installJava = "Установить Java"
|
||||||
installJavaManually = "Install Manually"
|
installJavaManually = "Установить вручную"
|
||||||
javaDownloadPrepare = "Preparing Java Download.."
|
javaDownloadPrepare = "Подготовка загрузки Java.."
|
||||||
javaDownloadFailureTitle = "Error During Java Download"
|
javaDownloadFailureTitle = "Ошибка загрузки Java"
|
||||||
javaDownloadFailureText = "See console (CTRL + Shift + i) for more details."
|
javaDownloadFailureText = "Смотрите консоль (CTRL + Shift + I) для подробностей."
|
||||||
javaRequired = "Java is Required<br>to Launch"
|
javaRequired = "Для запуска требуется Java"
|
||||||
javaRequiredMessage = 'A valid x64 installation of Java {major} is required to launch.<br><br>Please refer to our <a href="https://github.com/dscalzi/HeliosLauncher/wiki/Java-Management#manually-installing-a-valid-version-of-java">Java Management Guide</a> for instructions on how to manually install Java.'
|
javaRequiredMessage = "Для запуска необходима действительная 64-битная установка Java {major}.<br><br>Пожалуйста, ознакомьтесь с нашим <a href=\"https://github.com/dscalzi/HeliosLauncher/wiki/Java-Management#manually-installing-a-valid-version-of-java\">Руководством по управлению Java</a>, чтобы установить её вручную."
|
||||||
javaRequiredDismiss = "I Understand"
|
javaRequiredDismiss = "Понял"
|
||||||
javaRequiredCancel = "Go Back"
|
javaRequiredCancel = "Назад"
|
||||||
|
|
||||||
[js.landing.downloadJava]
|
[js.landing.downloadJava]
|
||||||
findJdkFailure = "Failed to find OpenJDK distribution."
|
findJdkFailure = "Не удалось найти дистрибутив OpenJDK."
|
||||||
javaDownloadCorruptedError = "Downloaded JDK has a bad hash, the file may be corrupted."
|
javaDownloadCorruptedError = "Загруженный JDK поврежден, файл может быть испорчен."
|
||||||
extractingJava = "Extracting Java"
|
extractingJava = "Распаковка Java"
|
||||||
javaInstalled = "Java Installed!"
|
javaInstalled = "Java установлена!"
|
||||||
|
|
||||||
[js.landing.dlAsync]
|
[js.landing.dlAsync]
|
||||||
loadingServerInfo = "Loading server information.."
|
loadingServerInfo = "Загрузка информации о сервере.."
|
||||||
fatalError = "Fatal Error"
|
fatalError = "Критическая ошибка"
|
||||||
unableToLoadDistributionIndex = "Could not load a copy of the distribution index. See the console (CTRL + Shift + i) for more details."
|
unableToLoadDistributionIndex = "Не удалось загрузить индекс дистрибуции. Смотрите консоль (CTRL + Shift + I) для подробностей."
|
||||||
pleaseWait = "Please wait.."
|
pleaseWait = "Пожалуйста, подождите.."
|
||||||
errorDuringLaunchTitle = "Error During Launch"
|
errorDuringLaunchTitle = "Ошибка при запуске"
|
||||||
seeConsoleForDetails = "See console (CTRL + Shift + i) for more details."
|
seeConsoleForDetails = "Смотрите консоль (CTRL + Shift + I) для подробностей."
|
||||||
validatingFileIntegrity = "Validating file integrity.."
|
validatingFileIntegrity = "Проверка целостности файлов.."
|
||||||
errorDuringFileVerificationTitle = "Error During File Verification"
|
errorDuringFileVerificationTitle = "Ошибка при проверке файлов"
|
||||||
downloadingFiles = "Downloading files.."
|
downloadingFiles = "Загрузка файлов.."
|
||||||
errorDuringFileDownloadTitle = "Error During File Download"
|
errorDuringFileDownloadTitle = "Ошибка при загрузке файлов"
|
||||||
preparingToLaunch = "Preparing to launch.."
|
preparingToLaunch = "Подготовка к запуску.."
|
||||||
launchingGame = "Launching game.."
|
launchingGame = "Запуск игры.."
|
||||||
launchWrapperNotDownloaded = "The main file, LaunchWrapper, failed to download properly. As a result, the game cannot launch.<br><br>To fix this issue, temporarily turn off your antivirus software and launch the game again.<br><br>If you have time, please <a href=\"https://github.com/dscalzi/HeliosLauncher/issues\">submit an issue</a> and let us know what antivirus software you use. We'll contact them and try to straighten things out."
|
launchWrapperNotDownloaded = "Основной файл, LaunchWrapper, не был загружен должным образом. В результате игра не может быть запущена.<br><br>Чтобы исправить эту проблему, временно отключите антивирусное ПО и попробуйте снова.<br><br>Если у вас есть время, пожалуйста, <a href=\"https://github.com/dscalzi/HeliosLauncher/issues\">сообщите об этой проблеме</a> и укажите, каким антивирусом вы пользуетесь. Мы постараемся связаться с разработчиками антивируса и решить проблему."
|
||||||
doneEnjoyServer = "Done. Enjoy the server!"
|
doneEnjoyServer = "Готово. Наслаждайтесь сервером!"
|
||||||
checkConsoleForDetails = "Please check the console (CTRL + Shift + i) for more details."
|
checkConsoleForDetails = "Пожалуйста, проверьте консоль (CTRL + Shift + I) для подробностей."
|
||||||
|
|
||||||
[js.landing.news]
|
[js.landing.news]
|
||||||
checking = "Checking for News"
|
checking = "Проверка новостей"
|
||||||
|
|
||||||
[js.landing.discord]
|
[js.landing.discord]
|
||||||
loading = "Loading game.."
|
loading = "Загрузка игры.."
|
||||||
joining = "Sailing to Westeros!"
|
joining = "Путешествие в Вестерос!"
|
||||||
joined = "Exploring the Realm!"
|
joined = "Исследование мира!"
|
||||||
|
|
||||||
[js.overlay]
|
[js.overlay]
|
||||||
dismiss = "Dismiss"
|
dismiss = "Закрыть"
|
||||||
|
|
||||||
[js.settings.fileSelectors]
|
[js.settings.fileSelectors]
|
||||||
executables = "Executables"
|
executables = "Исполняемые файлы"
|
||||||
allFiles = "All Files"
|
allFiles = "Все файлы"
|
||||||
|
|
||||||
[js.settings.mstfLogin]
|
[js.settings.mstfLogin]
|
||||||
errorTitle = "Something Went Wrong"
|
errorTitle = "Что-то пошло не так"
|
||||||
errorMessage = "Microsoft authentication failed. Please try again."
|
errorMessage = "Ошибка аутентификации Microsoft. Попробуйте еще раз."
|
||||||
okButton = "OK"
|
okButton = "ОК"
|
||||||
|
|
||||||
[js.settings.mstfLogout]
|
[js.settings.mstfLogout]
|
||||||
errorTitle = "Something Went Wrong"
|
errorTitle = "Что-то пошло не так"
|
||||||
errorMessage = "Microsoft logout failed. Please try again."
|
errorMessage = "Ошибка выхода из Microsoft. Попробуйте еще раз."
|
||||||
okButton = "OK"
|
okButton = "ОК"
|
||||||
|
|
||||||
[js.settings.authAccountSelect]
|
|
||||||
selectButton = "Select Account"
|
|
||||||
selectedButton = "Selected Account ✔"
|
|
||||||
|
|
||||||
[js.settings.authAccountLogout]
|
|
||||||
lastAccountWarningTitle = "Warning<br>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.<br><br>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"
|
|
||||||
|
|
||||||
[js.settings.dropinMods]
|
[js.settings.dropinMods]
|
||||||
removeButton = "Remove"
|
removeButton = "Удалить"
|
||||||
deleteFailedTitle = "Failed to Delete<br>Drop-in Mod {fullName}"
|
deleteFailedTitle = "Ошибка удаления<br>мода {fullName}"
|
||||||
deleteFailedMessage = "Make sure the file is not in use and try again."
|
deleteFailedMessage = "Убедитесь, что файл не используется, и попробуйте снова."
|
||||||
failedToggleTitle = "Failed to Toggle<br>One or More Drop-in Mods"
|
failedToggleTitle = "Ошибка переключения<br>одного или нескольких установленных модов"
|
||||||
okButton = "Okay"
|
okButton = "ОК"
|
||||||
|
|
||||||
[js.settings.serverListing]
|
[js.settings.serverListing]
|
||||||
mainServer = "Main Server"
|
mainServer = "Основной сервер"
|
||||||
|
|
||||||
[js.settings.java]
|
[js.settings.java]
|
||||||
selectedJava = "Selected: Java {version} ({vendor})"
|
selectedJava = "Выбрано: Java {version} ({vendor})"
|
||||||
invalidSelection = "Invalid Selection"
|
invalidSelection = "Некорректный выбор"
|
||||||
requiresJava = "Requires Java {major} x64."
|
requiresJava = "Требуется Java {major} x64."
|
||||||
availableOptions = "Available Options for Java {major} (HotSpot VM)"
|
availableOptions = "Доступные версии Java {major} (HotSpot VM)"
|
||||||
|
|
||||||
[js.settings.about]
|
[js.settings.about]
|
||||||
preReleaseTitle = "Pre-release"
|
preReleaseTitle = "Предварительная версия"
|
||||||
stableReleaseTitle = "Stable Release"
|
stableReleaseTitle = "Стабильная версия"
|
||||||
releaseNotesFailed = "Failed to load release notes."
|
releaseNotesFailed = "Не удалось загрузить примечания к выпуску."
|
||||||
|
|
||||||
[js.settings.updates]
|
[js.settings.updates]
|
||||||
newReleaseTitle = "New Release Available"
|
newReleaseTitle = "Доступно новое обновление"
|
||||||
newPreReleaseTitle = "New Pre-release Available"
|
newPreReleaseTitle = "Доступна новая предварительная версия"
|
||||||
downloadingButton = "Downloading.."
|
downloadingButton = "Загрузка.."
|
||||||
downloadButton = 'Download from GitHub<span style="font-size: 10px;color: gray;text-shadow: none !important;">Close the launcher and run the dmg to update.</span>'
|
downloadButton = 'Загрузить с GitHub<span style="font-size: 10px;color: gray;text-shadow: none !important;">Закройте лаунчер и запустите установщик для обновления.</span>'
|
||||||
latestVersionTitle = "You Are Running the Latest Version"
|
latestVersionTitle = "У вас установлена последняя версия"
|
||||||
checkForUpdatesButton = "Check for Updates"
|
checkForUpdatesButton = "Проверить обновления"
|
||||||
checkingForUpdatesButton = "Checking for Updates.."
|
checkingForUpdatesButton = "Проверка обновлений.."
|
||||||
|
|
||||||
[js.settings.msftLogin]
|
[js.settings.msftLogin]
|
||||||
errorTitle = "Microsoft Login Failed"
|
errorTitle = "Ошибка входа в Microsoft"
|
||||||
errorMessage = "We were unable to authenticate your Microsoft account. Please try again."
|
errorMessage = "Не удалось выполнить аутентификацию в Microsoft. Попробуйте снова."
|
||||||
okButton = "OK"
|
okButton = "ОК"
|
||||||
|
|
||||||
|
[js.settings.authAccountSelect]
|
||||||
|
selectButton = "Выбрать аккаунт"
|
||||||
|
selectedButton = "Выбранный аккаунт ✔"
|
||||||
|
|
||||||
|
[js.settings.authAccountLogout]
|
||||||
|
lastAccountWarningTitle = "Внимание<br>Это ваш последний аккаунт"
|
||||||
|
lastAccountWarningMessage = "Для использования лаунчера необходимо быть авторизованным хотя бы в одном аккаунте. После выхода вам придется войти снова.<br><br>Вы уверены, что хотите выйти?"
|
||||||
|
confirmButton = "Я уверен"
|
||||||
|
cancelButton = "Отмена"
|
||||||
|
|
||||||
|
[js.settings.authAccountPopulate]
|
||||||
|
username = "Имя пользователя"
|
||||||
|
uuid = "UUID"
|
||||||
|
selectAccount = "Выбрать аккаунт"
|
||||||
|
selectedAccount = "Выбранный аккаунт ✓"
|
||||||
|
logout = "Выйти"
|
||||||
|
|
||||||
[js.uibinder.startup]
|
[js.uibinder.startup]
|
||||||
fatalErrorTitle = "Fatal Error: Unable to Load Distribution Index"
|
fatalErrorTitle = "Критическая ошибка: невозможно загрузить индекс дистрибуции"
|
||||||
fatalErrorMessage = "A connection could not be established to our servers to download the distribution index. No local copies were available to load. <br><br>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."
|
fatalErrorMessage = "Не удалось установить соединение с нашими серверами для загрузки индекса дистрибуции. Локальные копии отсутствуют.<br><br>Индекс дистрибуции — это важный файл, который содержит актуальную информацию о сервере. Лаунчер не сможет запуститься без него. Убедитесь, что у вас есть подключение к интернету, и перезапустите приложение."
|
||||||
closeButton = "Close"
|
closeButton = "Закрыть"
|
||||||
|
|
||||||
[js.uibinder.validateAccount]
|
[js.uibinder.validateAccount]
|
||||||
failedMessageTitle = "Failed to Refresh Login"
|
failedMessageTitle = "Ошибка обновления входа"
|
||||||
failedMessage = "We were unable to refresh the login for <strong>{account}</strong>. Please select another account or login again."
|
failedMessage = "Не удалось обновить вход для <strong>{account}</strong>. Пожалуйста, выберите другой аккаунт или войдите снова."
|
||||||
failedMessageSelectAnotherAccount = "We were unable to refresh the login for <strong>{account}</strong>. Please login again."
|
failedMessageSelectAnotherAccount = "Не удалось обновить вход для <strong>{account}</strong>. Пожалуйста, войдите снова."
|
||||||
loginButton = "Login"
|
loginButton = "Войти"
|
||||||
selectAnotherAccountButton = "Select Another Account"
|
selectAnotherAccountButton = "Выбрать другой аккаунт"
|
||||||
|
|
||||||
[js.uicore.autoUpdate]
|
[js.uicore.autoUpdate]
|
||||||
checkingForUpdateButton = "Checking for Updates..."
|
checkingForUpdateButton = "Проверка обновлений..."
|
||||||
installNowButton = "Install Now"
|
installNowButton = "Установить сейчас"
|
||||||
checkForUpdatesButton = "Check for Updates"
|
checkForUpdatesButton = "Проверить обновления"
|
||||||
|
|
||||||
[js.auth.microsoft.error]
|
[js.auth.microsoft.error]
|
||||||
noProfileTitle = "Error During Login:<br>Profile Not Set Up"
|
noProfileTitle = "Ошибка входа:<br>Профиль не настроен"
|
||||||
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 <a href=\"https://minecraft.net/\">Minecraft.net</a>.<br><br>If you have not yet purchased the game, you can also do that on <a href=\"https://minecraft.net/\">Minecraft.net</a>."
|
noProfileDesc = "Ваш аккаунт Microsoft еще не имеет профиля Minecraft. Если вы недавно купили игру или активировали ее через Xbox Game Pass, вам нужно настроить профиль на <a href=\"https://minecraft.net/\">Minecraft.net</a>.<br><br>Если вы еще не купили игру, вы можете сделать это на <a href=\"https://minecraft.net/\">Minecraft.net</a>."
|
||||||
noXboxAccountTitle = "Error During Login:<br>No Xbox Account"
|
noXboxAccountTitle = "Ошибка входа:<br>Нет аккаунта Xbox"
|
||||||
noXboxAccountDesc = "Your Microsoft account has no Xbox account associated with it."
|
noXboxAccountDesc = "У вашей учетной записи Microsoft нет привязанного аккаунта Xbox."
|
||||||
xblBannedTitle = "Error During Login:<br>Xbox Live Unavailable"
|
xblBannedTitle = "Ошибка входа:<br>Xbox Live недоступен"
|
||||||
xblBannedDesc = "Your Microsoft account is from a country where Xbox Live is not available or banned."
|
xblBannedDesc = "Ваш аккаунт Microsoft зарегистрирован в стране, где Xbox Live недоступен или заблокирован."
|
||||||
under18Title = "Error During Login:<br>Parental Approval Required"
|
under18Title = "Ошибка входа:<br>Требуется родительское разрешение"
|
||||||
under18Desc = "Accounts for users under the age of 18 must be added to a Family by an adult."
|
under18Desc = "Аккаунты пользователей младше 18 лет должны быть добавлены в «Семью» взрослым."
|
||||||
unknownTitle = "Unknown Error During Login"
|
unknownTitle = "Неизвестная ошибка входа"
|
||||||
unknownDesc = "An unknown error has occurred. Please see the console for details."
|
unknownDesc = "Произошла неизвестная ошибка. Подробности можно посмотреть в консоли."
|
||||||
|
|
||||||
|
|
||||||
[js.auth.mojang.error]
|
|
||||||
methodNotAllowedTitle = "Internal Error:<br>Method Not Allowed"
|
|
||||||
methodNotAllowedDesc = "Method not allowed. Please report this error."
|
|
||||||
notFoundTitle = "Internal Error:<br>Not Found"
|
|
||||||
notFoundDesc = "The authentication endpoint was not found. Please report this issue."
|
|
||||||
accountMigratedTitle = "Error During Login:<br>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:<br>Invalid Credentials"
|
|
||||||
invalidCredentialsDesc = "The email or password you've entered is incorrect. Please try again."
|
|
||||||
tooManyAttemptsTitle = "Error During Login:<br>Too Many Attempts"
|
|
||||||
tooManyAttemptsDesc = "There have been too many login attempts with this account recently. Please try again later."
|
|
||||||
invalidTokenTitle = "Error During Login:<br>Invalid Token"
|
|
||||||
invalidTokenDesc = "The provided access token is invalid."
|
|
||||||
tokenHasProfileTitle = "Error During Login:<br>Token Has Profile"
|
|
||||||
tokenHasProfileDesc = "Access token already has a profile assigned. Selecting profiles is not implemented yet."
|
|
||||||
credentialsMissingTitle = "Error During Login:<br>Credentials Missing"
|
|
||||||
credentialsMissingDesc = "Username/password was not submitted or password is less than 3 characters."
|
|
||||||
invalidSaltVersionTitle = "Error During Login:<br>Invalid Salt Version"
|
|
||||||
invalidSaltVersionDesc = "Invalid salt version."
|
|
||||||
unsupportedMediaTypeTitle = "Internal Error:<br>Unsupported Media Type"
|
|
||||||
unsupportedMediaTypeDesc = "Unsupported media type. Please report this error."
|
|
||||||
accountGoneTitle = "Error During Login:<br>Account Migrated"
|
|
||||||
accountGoneDesc = "Account has been migrated to a Microsoft account. Please log in with Microsoft."
|
|
||||||
unreachableTitle = "Error During Login:<br>Unreachable"
|
|
||||||
unreachableDesc = "Unable to reach the authentication servers. Ensure that they are online and you are connected to the internet."
|
|
||||||
gameNotPurchasedTitle = "Error During Login:<br>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 <a href=\"https://minecraft.net/\">Minecraft.net</a>"
|
|
||||||
unknownErrorTitle = "Unknown Error During Login"
|
|
||||||
unknownErrorDesc = "An unknown error has occurred. Please see the console for details."
|
|
||||||
|
@ -231,10 +231,6 @@ errorTitle = "Что-то пошло не так"
|
|||||||
errorMessage = "Ошибка выхода из Microsoft. Попробуйте еще раз."
|
errorMessage = "Ошибка выхода из Microsoft. Попробуйте еще раз."
|
||||||
okButton = "ОК"
|
okButton = "ОК"
|
||||||
|
|
||||||
[js.settings.authAccountSelect]
|
|
||||||
selectButton = "Выбрать аккаунт"
|
|
||||||
selectedButton = "Выбранный аккаунт ✔"
|
|
||||||
|
|
||||||
[js.settings.authAccountLogout]
|
[js.settings.authAccountLogout]
|
||||||
lastAccountWarningTitle = "Внимание<br>Это ваш последний аккаунт"
|
lastAccountWarningTitle = "Внимание<br>Это ваш последний аккаунт"
|
||||||
lastAccountWarningMessage = "Для использования лаунчера необходимо быть авторизованным хотя бы в одном аккаунте. После выхода вам придется войти снова.<br><br>Вы уверены, что хотите выйти?"
|
lastAccountWarningMessage = "Для использования лаунчера необходимо быть авторизованным хотя бы в одном аккаунте. После выхода вам придется войти снова.<br><br>Вы уверены, что хотите выйти?"
|
||||||
|
@ -18,19 +18,7 @@
|
|||||||
<span class="loginErrorSpan" id="loginEmailError"><%- lang('login.loginEmailError') %></span>
|
<span class="loginErrorSpan" id="loginEmailError"><%- lang('login.loginEmailError') %></span>
|
||||||
<input id="loginUsername" class="loginField" type="text" placeholder="<%- lang('login.loginEmailPlaceholder') %>"/>
|
<input id="loginUsername" class="loginField" type="text" placeholder="<%- lang('login.loginEmailPlaceholder') %>"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="loginFieldContainer">
|
|
||||||
<svg id="lockSVG" class="loginSVG" viewBox="40 32 60.36 70.43">
|
|
||||||
<g>
|
|
||||||
<path d="M86.16,54a16.38,16.38,0,1,0-32,0H44V102.7H96V54Zm-25.9-3.39a9.89,9.89,0,1,1,19.77,0A9.78,9.78,0,0,1,79.39,54H60.89A9.78,9.78,0,0,1,60.26,50.59ZM70,96.2a6.5,6.5,0,0,1-6.5-6.5,6.39,6.39,0,0,1,3.1-5.4V67h6.5V84.11a6.42,6.42,0,0,1,3.39,5.6A6.5,6.5,0,0,1,70,96.2Z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
<span class="loginErrorSpan" id="loginPasswordError"><%- lang('login.loginPasswordError') %></span>
|
|
||||||
<input id="loginPassword" class="loginField" type="password" placeholder="<%- lang('login.loginPasswordPlaceholder') %>"/>
|
|
||||||
</div>
|
|
||||||
<div id="loginOptions">
|
<div id="loginOptions">
|
||||||
<span class="loginSpanDim">
|
|
||||||
<a href="<%- lang('login.loginForgotPasswordLink') %>"><%- lang('login.loginForgotPasswordText') %></a>
|
|
||||||
</span>
|
|
||||||
<label id="checkmarkContainer">
|
<label id="checkmarkContainer">
|
||||||
<input id="loginRememberOption" type="checkbox" checked>
|
<input id="loginRememberOption" type="checkbox" checked>
|
||||||
<span id="loginRememberText" class="loginSpanDim"><%- lang('login.loginRememberMeText') %></span>
|
<span id="loginRememberText" class="loginSpanDim"><%- lang('login.loginRememberMeText') %></span>
|
||||||
|
@ -15,13 +15,8 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="loginOptionButtonContainer">
|
<div class="loginOptionButtonContainer">
|
||||||
<button id="loginOptionMojang" class="loginOptionButton">
|
<button id="loginOptionOffline" class="loginOptionButton">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 9.677 9.667">
|
<span><%- lang('loginOptions.loginWithOffline') %></span>
|
||||||
<path d="M-26.332-12.098h2.715c-1.357.18-2.574 1.23-2.715 2.633z" fill="#fff" />
|
|
||||||
<path d="M2.598.022h7.07L9.665 7c-.003 1.334-1.113 2.46-2.402 2.654H0V2.542C.134 1.2 1.3.195 2.598.022z" fill="#db2331" />
|
|
||||||
<path d="M1.54 2.844c.314-.76 1.31-.46 1.954-.528.785-.083 1.503.272 2.1.758l.164-.9c.327.345.587.756.964 1.052.28.254.655-.342.86-.013.42.864.408 1.86.54 2.795l-.788-.373C6.9 4.17 5.126 3.052 3.656 3.685c-1.294.592-1.156 2.65.06 3.255 1.354.703 2.953.51 4.405.292-.07.42-.34.87-.834.816l-4.95.002c-.5.055-.886-.413-.838-.89l.04-4.315z" fill="#fff" />
|
|
||||||
</svg>
|
|
||||||
<span><%- lang('loginOptions.loginWithMojang') %></span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -52,23 +52,20 @@
|
|||||||
<div class="settingsAuthAccountTypeContainer">
|
<div class="settingsAuthAccountTypeContainer">
|
||||||
<div class="settingsAuthAccountTypeHeader">
|
<div class="settingsAuthAccountTypeHeader">
|
||||||
<div class="settingsAuthAccountTypeHeaderLeft">
|
<div class="settingsAuthAccountTypeHeaderLeft">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 9.677 9.667">
|
<img src="assets/images/lotip22.svg"/>
|
||||||
<path d="M-26.332-12.098h2.715c-1.357.18-2.574 1.23-2.715 2.633z" fill="#fff" />
|
<span><%- lang('settings.offlineAccount') %></span>
|
||||||
<path d="M2.598.022h7.07L9.665 7c-.003 1.334-1.113 2.46-2.402 2.654H0V2.542C.134 1.2 1.3.195 2.598.022z" fill="#db2331" />
|
|
||||||
<path d="M1.54 2.844c.314-.76 1.31-.46 1.954-.528.785-.083 1.503.272 2.1.758l.164-.9c.327.345.587.756.964 1.052.28.254.655-.342.86-.013.42.864.408 1.86.54 2.795l-.788-.373C6.9 4.17 5.126 3.052 3.656 3.685c-1.294.592-1.156 2.65.06 3.255 1.354.703 2.953.51 4.405.292-.07.42-.34.87-.834.816l-4.95.002c-.5.055-.886-.413-.838-.89l.04-4.315z" fill="#fff" />
|
|
||||||
</svg>
|
|
||||||
<span><%- lang('settings.mojangAccount') %></span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="settingsAuthAccountTypeHeaderRight">
|
<div class="settingsAuthAccountTypeHeaderRight">
|
||||||
<button class="settingsAddAuthAccount" id="settingsAddMojangAccount"><%- lang('settings.addMojangAccount') %></button>
|
<button class="settingsAddAuthAccount" id="settingsAddOfflineAccount"><%- lang('settings.addOfflineAccount') %></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="settingsCurrentAccounts" id="settingsCurrentMojangAccounts">
|
<div class="settingsCurrentAccounts" id="settingsCurrentOfflineAccounts">
|
||||||
<!-- Mojang auth accounts populated here. -->
|
<!-- Mojang auth accounts populated here. -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="settingsTabMinecraft" class="settingsTab" style="display: none;">
|
<div id="settingsTabMinecraft" class="settingsTab" style="display: none;">
|
||||||
<div class="settingsTabHeader">
|
<div class="settingsTabHeader">
|
||||||
<span class="settingsTabHeaderText"><%- lang('settings.minecraftTabHeaderText') %></span>
|
<span class="settingsTabHeaderText"><%- lang('settings.minecraftTabHeaderText') %></span>
|
||||||
|
Loading…
Reference in New Issue
Block a user