Initial work on localization.
This commit is contained in:
parent
a0520a9458
commit
c141475404
@ -1,6 +1,6 @@
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta charset="utf-8" http-equiv="Content-Security-Policy" content="script-src 'self'"/>
|
||||
<meta charset="utf-8" http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-In6B8teKZQll5heMl9bS7CESTbGvuAt3VVV86BUQBDk='"/>
|
||||
<title>Westeroscraft Launcher</title>
|
||||
<script src="./assets/js/scripts/uicore.js"></script>
|
||||
<script src="./assets/js/scripts/uibinder.js"></script>
|
||||
@ -43,5 +43,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
// Load language
|
||||
for(let key of Object.keys(Lang.query('html'))){
|
||||
document.getElementById(key).innerHTML = Lang.query(`html.${key}`)
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
21
app/assets/js/langloader.js
Normal file
21
app/assets/js/langloader.js
Normal file
@ -0,0 +1,21 @@
|
||||
const fs = require('fs-extra')
|
||||
const path = require('path')
|
||||
|
||||
let lang
|
||||
|
||||
exports.loadLanguage = function(id){
|
||||
lang = JSON.parse(fs.readFileSync(path.resolve('app', 'assets', 'lang', `${id}.json`))) || {}
|
||||
}
|
||||
|
||||
exports.query = function(id){
|
||||
let query = id.split('.')
|
||||
let res = lang
|
||||
for(let q of query){
|
||||
res = res[q]
|
||||
}
|
||||
return res === lang ? {} : res
|
||||
}
|
||||
|
||||
exports.queryJS = function(id){
|
||||
return exports.query(`js.${id}`)
|
||||
}
|
@ -5,6 +5,7 @@ const path = require('path')
|
||||
|
||||
const ConfigManager = require('./configmanager')
|
||||
const DistroManager = require('./distromanager')
|
||||
const LangLoader = require('./langloader')
|
||||
const logger = require('./loggerutil')('%c[Preloader]', 'color: #a02d2a; font-weight: bold')
|
||||
|
||||
logger.log('Loading..')
|
||||
@ -12,6 +13,9 @@ logger.log('Loading..')
|
||||
// Load ConfigManager
|
||||
ConfigManager.load()
|
||||
|
||||
// Load Strings
|
||||
LangLoader.loadLanguage('en_US')
|
||||
|
||||
function onDistroLoad(data){
|
||||
if(data != null){
|
||||
|
||||
|
@ -92,7 +92,7 @@ document.getElementById('launch_button').addEventListener('click', function(e){
|
||||
asyncSystemScan(mcVersion)
|
||||
} else {
|
||||
|
||||
setLaunchDetails('Please wait..')
|
||||
setLaunchDetails(Lang.queryJS('landing.launch.pleaseWait'))
|
||||
toggleLaunchArea(true)
|
||||
setLaunchPercentage(0, 100)
|
||||
|
||||
|
@ -56,7 +56,7 @@ function shakeError(element){
|
||||
function validateEmail(value){
|
||||
if(value){
|
||||
if(!basicEmail.test(value) && !validUsername.test(value)){
|
||||
showError(loginEmailError, '* Invalid Value')
|
||||
showError(loginEmailError, Lang.queryJS('login.error.invalidValue'))
|
||||
loginDisabled(true)
|
||||
lu = false
|
||||
} else {
|
||||
@ -68,7 +68,7 @@ function validateEmail(value){
|
||||
}
|
||||
} else {
|
||||
lu = false
|
||||
showError(loginEmailError, '* Required')
|
||||
showError(loginEmailError, Lang.queryJS('login.error.requiredValue'))
|
||||
loginDisabled(true)
|
||||
}
|
||||
}
|
||||
@ -87,7 +87,7 @@ function validatePassword(value){
|
||||
}
|
||||
} else {
|
||||
lp = false
|
||||
showError(loginPasswordError, '* Required')
|
||||
showError(loginPasswordError, Lang.queryJS('login.error.invalidValue'))
|
||||
loginDisabled(true)
|
||||
}
|
||||
}
|
||||
@ -129,10 +129,10 @@ function loginDisabled(v){
|
||||
function loginLoading(v){
|
||||
if(v){
|
||||
loginButton.setAttribute('loading', v)
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace('LOGIN', 'LOGGING IN')
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.login'), Lang.queryJS('login.loggingIn'))
|
||||
} else {
|
||||
loginButton.removeAttribute('loading')
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace('LOGGING IN', 'LOGIN')
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.loggingIn'), Lang.queryJS('login.login'))
|
||||
}
|
||||
}
|
||||
|
||||
@ -166,8 +166,8 @@ function resolveError(err){
|
||||
// Node error => err.code | err.message
|
||||
if(err.cause != null && err.cause === 'UserMigratedException') {
|
||||
return {
|
||||
title: 'Error During Login:<br>Invalid Credentials',
|
||||
desc: 'You\'ve attempted to login with a migrated account. Try again using the account email as the username.'
|
||||
title: Lang.queryJS('login.error.userMigrated.title'),
|
||||
desc: Lang.queryJS('login.error.userMigrated.desc')
|
||||
}
|
||||
} else {
|
||||
if(err.error != null){
|
||||
@ -175,13 +175,13 @@ function resolveError(err){
|
||||
if(err.errorMessage != null){
|
||||
if(err.errorMessage === 'Invalid credentials. Invalid username or password.'){
|
||||
return {
|
||||
title: 'Error During Login:<br>Invalid Credentials',
|
||||
desc: 'The email or password you\'ve entered is incorrect. Please try again.'
|
||||
title: Lang.queryJS('login.error.invalidCredentials.title'),
|
||||
desc: Lang.queryJS('login.error.invalidCredentials.desc')
|
||||
}
|
||||
} else if(err.errorMessage === 'Invalid credentials.'){
|
||||
return {
|
||||
title: 'Error During Login:<br>Too Many Attempts',
|
||||
desc: 'There have been too many login attempts with this account recently. Please try again later.'
|
||||
title: Lang.queryJS('login.error.rateLimit.title'),
|
||||
desc: Lang.queryJS('login.error.rateLimit.desc')
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -192,14 +192,14 @@ function resolveError(err){
|
||||
if(err.code === 'ENOENT'){
|
||||
// No Internet.
|
||||
return {
|
||||
title: 'Error During Login:<br>No Internet Connection',
|
||||
desc: 'You must be connected to the internet in order to login. Please connect and try again.'
|
||||
title: Lang.queryJS('login.error.noInternet.title'),
|
||||
desc: Lang.queryJS('login.error.noInternet.desc')
|
||||
}
|
||||
} else if(err.code === 'ENOTFOUND'){
|
||||
// Could not reach server.
|
||||
return {
|
||||
title: 'Error During Login:<br>Authentication Server Offline',
|
||||
desc: 'Mojang\'s authentication server is currently offline or unreachable. Please wait a bit and try again. You can check the status of the server on <a href="https://help.mojang.com/">Mojang\'s help portal</a>.'
|
||||
title: Lang.queryJS('login.error.authDown.title'),
|
||||
desc: Lang.queryJS('login.error.authDown.desc')
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -208,13 +208,13 @@ function resolveError(err){
|
||||
if(err.message != null){
|
||||
if(err.message === 'NotPaidAccount'){
|
||||
return {
|
||||
title: 'Error During Login:<br>Game Not Purchased',
|
||||
desc: 'The account you are trying to login with has not purchased a copy of Minecraft.<br>You may purchase a copy on <a href="https://minecraft.net/">Minecraft.net</a>'
|
||||
title: Lang.queryJS('login.error.notPaid.title'),
|
||||
desc: Lang.queryJS('login.error.notPaid.desc')
|
||||
}
|
||||
} else {
|
||||
// Unknown error with request.
|
||||
return {
|
||||
title: 'Error During Login:<br>Unknown Error',
|
||||
title: Lang.queryJS('login.error.unknown.title'),
|
||||
desc: err.message
|
||||
}
|
||||
}
|
||||
@ -264,7 +264,7 @@ loginButton.addEventListener('click', () => {
|
||||
|
||||
AuthManager.addAccount(loginUsername.value, loginPassword.value).then((value) => {
|
||||
updateSelectedAccount(value)
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace('LOGGING IN', 'SUCCESS')
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.loggingIn'), Lang.queryJS('login.success'))
|
||||
$('.circle-loader').toggleClass('load-complete')
|
||||
$('.checkmark').toggle()
|
||||
setTimeout(() => {
|
||||
@ -281,14 +281,14 @@ loginButton.addEventListener('click', () => {
|
||||
$('.circle-loader').toggleClass('load-complete')
|
||||
$('.checkmark').toggle()
|
||||
loginLoading(false)
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace('SUCCESS', 'LOGIN')
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.success'), Lang.queryJS('login.login'))
|
||||
formDisabled(false)
|
||||
})
|
||||
}, 1000)
|
||||
}).catch((err) => {
|
||||
loginLoading(false)
|
||||
const errF = resolveError(err)
|
||||
setOverlayContent(errF.title, errF.desc, 'Try Again')
|
||||
setOverlayContent(errF.title, errF.desc, Lang.queryJS('login.tryAgain'))
|
||||
setOverlayHandler(() => {
|
||||
formDisabled(false)
|
||||
toggleOverlay(false)
|
||||
|
@ -8,6 +8,7 @@ const path = require('path')
|
||||
const AuthManager = require('./assets/js/authmanager')
|
||||
const ConfigManager = require('./assets/js/configmanager')
|
||||
const DistroManager = require('./assets/js/distromanager')
|
||||
const Lang = require('./assets/js/langloader')
|
||||
|
||||
let rscShouldLoad = false
|
||||
let fatalStartupError = false
|
||||
|
49
app/assets/lang/en_US.json
Normal file
49
app/assets/lang/en_US.json
Normal file
@ -0,0 +1,49 @@
|
||||
{
|
||||
"html": {
|
||||
"avatarOverlay": "Dankname"
|
||||
},
|
||||
"js": {
|
||||
"login": {
|
||||
"error": {
|
||||
"invalidValue": "* Invalid Value",
|
||||
"requiredValue": "* Required",
|
||||
"userMigrated": {
|
||||
"title": "Error During Login:<br>Invalid Credentials",
|
||||
"desc": "You've attempted to login with a migrated account. Try again using the account email as the username."
|
||||
},
|
||||
"invalidCredentials": {
|
||||
"title": "Error During Login:<br>Invalid Credentials",
|
||||
"desc": "The email or password you've entered is incorrect. Please try again."
|
||||
},
|
||||
"rateLimit": {
|
||||
"title": "Error During Login:<br>Too Many Attempts",
|
||||
"desc": "There have been too many login attempts with this account recently. Please try again later."
|
||||
},
|
||||
"noInternet": {
|
||||
"title": "Error During Login:<br>No Internet Connection",
|
||||
"desc": "You must be connected to the internet in order to login. Please connect and try again."
|
||||
},
|
||||
"authDown": {
|
||||
"title": "Error During Login:<br>Authentication Server Offline",
|
||||
"desc": "Mojang's authentication server is currently offline or unreachable. Please wait a bit and try again. You can check the status of the server on <a href=\"https://help.mojang.com/\">Mojang's help portal</a>."
|
||||
},
|
||||
"notPaid": {
|
||||
"title": "Error During Login:<br>Game Not Purchased",
|
||||
"desc": "The account you are trying to login with has not purchased a copy of Minecraft.<br>You may purchase a copy on <a href=\"https://minecraft.net/\">Minecraft.net</a>"
|
||||
},
|
||||
"unknown": {
|
||||
"title": "Error During Login:<br>Unknown Error"
|
||||
}
|
||||
},
|
||||
"login": "LOGIN",
|
||||
"loggingIn": "LOGGING IN",
|
||||
"success": "SUCCESS",
|
||||
"tryAgain": "Try Again"
|
||||
},
|
||||
"landing": {
|
||||
"launch": {
|
||||
"pleaseWait": "Please wait.."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,3 +1,3 @@
|
||||
owner: WesterosCraftCode
|
||||
owner: dscalzi
|
||||
repo: ElectronLauncher
|
||||
provider: github
|
||||
|
Loading…
Reference in New Issue
Block a user