lang: improved, Home view translation
This commit is contained in:
parent
a8f1cccae3
commit
18c4ca719b
@ -1,11 +1,17 @@
|
|||||||
|
import { reloadView } from '../index.js'
|
||||||
|
|
||||||
export default class LanguageManager {
|
export default class LanguageManager {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.availableLanguages = ['en', 'fr'];
|
this.availableLanguages = ['en', 'fr'];
|
||||||
|
|
||||||
|
this.dict = null;
|
||||||
this.currentLang = 'en'
|
this.currentLang = 'en'
|
||||||
this.chosenLang = localStorage.getItem('preferedLanguage') || this.currentLang;
|
this.chosenLang = localStorage.getItem('preferedLanguage') || this.currentLang;
|
||||||
if (this.chosenLang !== this.currentLang && this.availableLanguages.includes(this.chosenLang)) {
|
if (this.chosenLang !== this.currentLang && this.availableLanguages.includes(this.chosenLang)) {
|
||||||
this.translatePage();
|
this.translatePage();
|
||||||
|
this.currentLang = this.chosenLang;
|
||||||
|
} else {
|
||||||
|
this.loadDict(this.chosenLang);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13,33 +19,48 @@ export default class LanguageManager {
|
|||||||
if (this.currentLang === this.chosenLang)
|
if (this.currentLang === this.chosenLang)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let dictUrl = `${location.origin}/static/js/lang/${this.chosenLang}.json`;
|
await this.loadDict(this.chosenLang);
|
||||||
let translation = await fetch(dictUrl).then(response => {
|
if (!this.dict)
|
||||||
if (response.status !== 200)
|
|
||||||
return null;
|
|
||||||
return response.json();
|
|
||||||
});
|
|
||||||
if (!translation) {
|
|
||||||
console.log(`No translation found for language ${this.chosenLang}`);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
|
||||||
document.querySelectorAll('[data-i18n]').forEach(el => {
|
document.querySelectorAll('[data-i18n]').forEach(el => {
|
||||||
let key = el.getAttribute('data-i18n');
|
let key = el.getAttribute('data-i18n');
|
||||||
el.innerHTML = translation[key];
|
el.innerHTML = this.dict[key];
|
||||||
})
|
})
|
||||||
|
await reloadView();
|
||||||
|
|
||||||
this.currentLang = this.chosenLang;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
async changeLanguage(lang) {
|
async changeLanguage(lang) {
|
||||||
if (lang === this.currentLang || !this.availableLanguages.includes(lang))
|
if (lang === this.currentLang || !this.availableLanguages.includes(lang))
|
||||||
return;
|
return 1;
|
||||||
|
|
||||||
this.chosenLang = lang;
|
this.chosenLang = lang;
|
||||||
if (await this.translatePage() !== 0)
|
if (await this.translatePage() !== 0)
|
||||||
return;
|
return 1;
|
||||||
|
|
||||||
|
this.currentLang = this.chosenLang;
|
||||||
localStorage.setItem('preferedLanguage', lang);
|
localStorage.setItem('preferedLanguage', lang);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
async loadDict(lang) {
|
||||||
|
let dictUrl = `${location.origin}/static/js/lang/${lang}.json`;
|
||||||
|
let response = await fetch(dictUrl);
|
||||||
|
|
||||||
|
if (response.status !== 200) {
|
||||||
|
console.log(`No translation found for language ${lang}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dict = await response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
get(key, defaultTxt) {
|
||||||
|
if (!this.dict)
|
||||||
|
return defaultTxt;
|
||||||
|
|
||||||
|
return this.dict[key] || defaultTxt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,9 +48,11 @@ const navigateTo = async (uri) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const reloadView = async _ => renderView(lastView);
|
||||||
|
|
||||||
async function renderView(view)
|
async function renderView(view)
|
||||||
{
|
{
|
||||||
let content = await view.getHtml();
|
let content = await view?.getHtml();
|
||||||
if (content == null)
|
if (content == null)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@ -141,12 +143,19 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|||||||
|
|
||||||
//Languages
|
//Languages
|
||||||
Array.from(document.getElementById('languageSelector').children).forEach(el => {
|
Array.from(document.getElementById('languageSelector').children).forEach(el => {
|
||||||
el.onclick = _ => client.lang.changeLanguage(el.value);
|
el.onclick = async _ => {
|
||||||
|
if (await client.lang.changeLanguage(el.value))
|
||||||
|
return;
|
||||||
|
document.querySelector('#languageSelector > .active')?.classList.remove('active');
|
||||||
|
el.classList.add('active');
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
document.querySelector(`#languageSelector > [value=${client.lang.chosenLang}]`)
|
||||||
|
?.classList.add('active');
|
||||||
|
|
||||||
await client.isAuthentificate();
|
await client.isAuthentificate();
|
||||||
router(location.pathname);
|
router(location.pathname);
|
||||||
document.querySelector('a[href=\'' + location.pathname + '\']')?.classList.add('active');
|
document.querySelector('a[href=\'' + location.pathname + '\']')?.classList.add('active');
|
||||||
});
|
});
|
||||||
|
|
||||||
export { client, navigateTo }
|
export { client, navigateTo, reloadView }
|
||||||
|
@ -5,5 +5,10 @@
|
|||||||
"navbarRegister": "Register",
|
"navbarRegister": "Register",
|
||||||
"navbarProfile": "My Profile",
|
"navbarProfile": "My Profile",
|
||||||
"navbarSettings": "Settings",
|
"navbarSettings": "Settings",
|
||||||
"navbarLogout": "Logout"
|
"navbarLogout": "Logout",
|
||||||
|
"homeTitle": "Home",
|
||||||
|
"homeOnline": "Play online",
|
||||||
|
"homeOffline": "Play offline",
|
||||||
|
"homeMe": "Me",
|
||||||
|
"homeLogout": "Logout"
|
||||||
}
|
}
|
||||||
|
@ -5,5 +5,10 @@
|
|||||||
"navbarRegister": "S'inscrire",
|
"navbarRegister": "S'inscrire",
|
||||||
"navbarProfile": "Mon Profil",
|
"navbarProfile": "Mon Profil",
|
||||||
"navbarSettings": "Paramètres",
|
"navbarSettings": "Paramètres",
|
||||||
"navbarLogout": "Se déconnecter"
|
"navbarLogout": "Se déconnecter",
|
||||||
|
"homeTitle": "Maison",
|
||||||
|
"homeOnline": "Jouer en ligne",
|
||||||
|
"homeOffline": "Jouer hors ligne",
|
||||||
|
"homeMe": "Moi",
|
||||||
|
"homeLogout": "Se déconnecter"
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { client } from "../index.js";
|
||||||
import AbstractAuthentificateView from "./abstracts/AbstractAuthentifiedView.js";
|
import AbstractAuthentificateView from "./abstracts/AbstractAuthentifiedView.js";
|
||||||
|
|
||||||
export default class extends AbstractAuthentificateView {
|
export default class extends AbstractAuthentificateView {
|
||||||
@ -8,11 +9,11 @@ export default class extends AbstractAuthentificateView {
|
|||||||
|
|
||||||
async getHtml() {
|
async getHtml() {
|
||||||
return /* HTML */ `
|
return /* HTML */ `
|
||||||
<h1>HOME</h1>
|
<h1>${client.lang.get('homeTitle', 'Home')}</h1>
|
||||||
<a href="/matchmaking" class="nav__link" data-link>Play a game</a>
|
<a href="/matchmaking" data-link>${client.lang.get('homeOnline', 'Play online')}</a>
|
||||||
<a href="/games/offline" class="nav__link" data-link>Play offline</a>
|
<a href="/games/offline" data-link>${client.lang.get('homeOffline', 'Play offline')}</a>
|
||||||
<a href="/me" class="nav__link" data-link>Me</a>
|
<a href="/me" data-link>${client.lang.get('homeMe', 'Me')}</a>
|
||||||
<a href="/logout" class="nav__link" data-link>Logout</a>
|
<a href="/logout" data-link>${client.lang.get('homeLogout', 'Logout')}</a>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user