lang: add locale in django and login view
This commit is contained in:
parent
a82cf1377b
commit
2786212b9c
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@ db.sqlite3
|
|||||||
**/migrations/**
|
**/migrations/**
|
||||||
/profiles/static/avatars/*
|
/profiles/static/avatars/*
|
||||||
!/profiles/static/avatars/default.env
|
!/profiles/static/avatars/default.env
|
||||||
|
*.mo
|
||||||
|
22
accounts/locale/fr/LC_MESSAGES/django.po
Normal file
22
accounts/locale/fr/LC_MESSAGES/django.po
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-02-01 13:59+0100\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
#: views/login.py:22
|
||||||
|
msgid "Invalid username or password."
|
||||||
|
msgstr "Nom d'utilisateur ou mot de passe incorect."
|
@ -4,6 +4,7 @@ from rest_framework import permissions, status
|
|||||||
from django.http import HttpRequest
|
from django.http import HttpRequest
|
||||||
from django.contrib.auth import login
|
from django.contrib.auth import login
|
||||||
from rest_framework.authentication import SessionAuthentication
|
from rest_framework.authentication import SessionAuthentication
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
from ..serializers.login import LoginSerializer
|
from ..serializers.login import LoginSerializer
|
||||||
|
|
||||||
@ -18,6 +19,6 @@ class LoginView(APIView):
|
|||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
user = serializer.get_user(data)
|
user = serializer.get_user(data)
|
||||||
if user is None:
|
if user is None:
|
||||||
return Response({'login': ['Invalid username or password.']}, status.HTTP_401_UNAUTHORIZED)
|
return Response({'login': [_('Invalid username or password.')]}, status.HTTP_401_UNAUTHORIZED)
|
||||||
login(request, user)
|
login(request, user)
|
||||||
return Response({'id': user.pk}, status=status.HTTP_200_OK)
|
return Response({'id': user.pk}, status=status.HTTP_200_OK)
|
||||||
|
@ -20,6 +20,7 @@ import TournamentsView from "./views/tournament/TournamentsListView.js";
|
|||||||
import TournamentCreateView from "./views/tournament/TournamentCreateView.js";
|
import TournamentCreateView from "./views/tournament/TournamentCreateView.js";
|
||||||
|
|
||||||
let client = new Client(location.origin);
|
let client = new Client(location.origin);
|
||||||
|
let lang = client.lang;
|
||||||
|
|
||||||
let lastView = undefined;
|
let lastView = undefined;
|
||||||
let lastPageUrlBeforeLogin = undefined;
|
let lastPageUrlBeforeLogin = undefined;
|
||||||
@ -144,13 +145,13 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|||||||
//Languages
|
//Languages
|
||||||
Array.from(document.getElementById('languageSelector').children).forEach(el => {
|
Array.from(document.getElementById('languageSelector').children).forEach(el => {
|
||||||
el.onclick = async _ => {
|
el.onclick = async _ => {
|
||||||
if (await client.lang.changeLanguage(el.value))
|
if (await lang.changeLanguage(el.value))
|
||||||
return;
|
return;
|
||||||
document.querySelector('#languageSelector > .active')?.classList.remove('active');
|
document.querySelector('#languageSelector > .active')?.classList.remove('active');
|
||||||
el.classList.add('active');
|
el.classList.add('active');
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
document.querySelector(`#languageSelector > [value=${client.lang.chosenLang}]`)
|
document.querySelector(`#languageSelector > [value=${lang.chosenLang}]`)
|
||||||
?.classList.add('active');
|
?.classList.add('active');
|
||||||
|
|
||||||
await client.isAuthentificate();
|
await client.isAuthentificate();
|
||||||
@ -158,4 +159,4 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|||||||
document.querySelector('a[href=\'' + location.pathname + '\']')?.classList.add('active');
|
document.querySelector('a[href=\'' + location.pathname + '\']')?.classList.add('active');
|
||||||
});
|
});
|
||||||
|
|
||||||
export { client, navigateTo, reloadView }
|
export { client, lang, navigateTo, reloadView }
|
||||||
|
@ -11,5 +11,13 @@
|
|||||||
"homeOnline": "Play online",
|
"homeOnline": "Play online",
|
||||||
"homeOffline": "Play offline",
|
"homeOffline": "Play offline",
|
||||||
"homeMe": "Me",
|
"homeMe": "Me",
|
||||||
"homeLogout": "Logout"
|
"homeLogout": "Logout",
|
||||||
|
"loginWindowTitle": "Login",
|
||||||
|
"loginFormTitle": "Login",
|
||||||
|
"loginFormUsername": "Username",
|
||||||
|
"loginFormPassword": "Password",
|
||||||
|
"loginFormButton": "Login",
|
||||||
|
"loginNoAccount": "No account yet?",
|
||||||
|
"loginRegister": "Register",
|
||||||
|
"errorEmptyField": "This field may not be blank."
|
||||||
}
|
}
|
||||||
|
@ -11,5 +11,13 @@
|
|||||||
"homeOnline": "Jouer en ligne",
|
"homeOnline": "Jouer en ligne",
|
||||||
"homeOffline": "Jouer hors ligne",
|
"homeOffline": "Jouer hors ligne",
|
||||||
"homeMe": "Moi",
|
"homeMe": "Moi",
|
||||||
"homeLogout": "Déconnexion"
|
"homeLogout": "Déconnexion",
|
||||||
|
"loginWindowTitle": "Connexion",
|
||||||
|
"loginFormTitle": "Connexion",
|
||||||
|
"loginFormUsername": "Nom d'utilisateur",
|
||||||
|
"loginFormPassword": "Mot de passe",
|
||||||
|
"loginFormButton": "Connexion",
|
||||||
|
"loginNoAccount": "Pas de compte?",
|
||||||
|
"loginRegister": "S'inscrire",
|
||||||
|
"errorEmptyField": "Ce champ ne peut être vide."
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
import { client } from "../index.js";
|
import { lang } 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 {
|
||||||
constructor(params) {
|
constructor(params) {
|
||||||
super(params, client.lang.get('homeWindowTitle', 'Home'));
|
super(params, lang.get('homeWindowTitle', 'Home'));
|
||||||
this.redirect_url = "/login"
|
this.redirect_url = "/login"
|
||||||
}
|
}
|
||||||
|
|
||||||
async getHtml() {
|
async getHtml() {
|
||||||
return /* HTML */ `
|
return /* HTML */ `
|
||||||
<h1>${client.lang.get('homeTitle', 'Home')}</h1>
|
<h1>${lang.get('homeTitle', 'Home')}</h1>
|
||||||
<a href="/matchmaking" data-link>${client.lang.get('homeOnline', 'Play online')}</a>
|
<a href="/matchmaking" data-link>${lang.get('homeOnline', 'Play online')}</a>
|
||||||
<a href="/games/offline" data-link>${client.lang.get('homeOffline', 'Play offline')}</a>
|
<a href="/games/offline" data-link>${lang.get('homeOffline', 'Play offline')}</a>
|
||||||
<a href="/me" data-link>${client.lang.get('homeMe', 'Me')}</a>
|
<a href="/me" data-link>${lang.get('homeMe', 'Me')}</a>
|
||||||
<a href="/logout" data-link>${client.lang.get('homeLogout', 'Logout')}</a>
|
<a href="/logout" data-link>${lang.get('homeLogout', 'Logout')}</a>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { client, navigateTo } from "../../index.js";
|
import { client, lang, navigateTo } from "../../index.js";
|
||||||
import { clear, fill_errors } from "../../utils/formUtils.js";
|
import { clear, fill_errors } from "../../utils/formUtils.js";
|
||||||
import AbstractNonAuthentifiedView from "../abstracts/AbstractNonAuthentified.js";
|
import AbstractNonAuthentifiedView from "../abstracts/AbstractNonAuthentified.js";
|
||||||
|
|
||||||
@ -10,10 +10,10 @@ async function login(redirectTo = '/home')
|
|||||||
let password = document.getElementById('passwordInput').value;
|
let password = document.getElementById('passwordInput').value;
|
||||||
|
|
||||||
if (username === '') {
|
if (username === '') {
|
||||||
document.getElementById('username').innerHTML = 'This field may not be blank.';
|
document.getElementById('username').innerHTML = lang.get('errorEmptyField', 'This field may not be blank.');
|
||||||
}
|
}
|
||||||
if (password === '') {
|
if (password === '') {
|
||||||
document.getElementById('password').innerHTML = 'This field may not be blank.';
|
document.getElementById('password').innerHTML = lang.get('errorEmptyField', 'This field may not be blank.');
|
||||||
}
|
}
|
||||||
if (username === '' || password === '')
|
if (username === '' || password === '')
|
||||||
return;
|
return;
|
||||||
@ -32,7 +32,7 @@ async function login(redirectTo = '/home')
|
|||||||
|
|
||||||
export default class extends AbstractNonAuthentifiedView {
|
export default class extends AbstractNonAuthentifiedView {
|
||||||
constructor(params, lastUrlBeforeLogin = '/home') {
|
constructor(params, lastUrlBeforeLogin = '/home') {
|
||||||
super(params, "Login", lastUrlBeforeLogin);
|
super(params, lang.get('loginWindowTitle', 'Login'), lastUrlBeforeLogin);
|
||||||
this.redirectTo = lastUrlBeforeLogin;
|
this.redirectTo = lastUrlBeforeLogin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,21 +56,21 @@ export default class extends AbstractNonAuthentifiedView {
|
|||||||
return `
|
return `
|
||||||
<div class='container-fluid'>
|
<div class='container-fluid'>
|
||||||
<form class='border border-2 rounded bg-light-subtle mx-auto p-2 col-md-7 col-lg-4'>
|
<form class='border border-2 rounded bg-light-subtle mx-auto p-2 col-md-7 col-lg-4'>
|
||||||
<h4 class='text-center fw-semibold mb-4'>Login</h4>
|
<h4 class='text-center fw-semibold mb-4'>${lang.get('loginFormTitle', 'Login')}</h4>
|
||||||
<div class='form-floating mb-2'>
|
<div class='form-floating mb-2'>
|
||||||
<input type='text' class='form-control' id='usernameInput' placeholder='Username'>
|
<input type='text' class='form-control' id='usernameInput' placeholder='Username'>
|
||||||
<label for='usernameInput'>Username</label>
|
<label for='usernameInput'>${lang.get('loginFormUsername', 'Username')}</label>
|
||||||
<span class='text-danger' id='username'></span>
|
<span class='text-danger' id='username'></span>
|
||||||
</div>
|
</div>
|
||||||
<div class='form-floating'>
|
<div class='form-floating'>
|
||||||
<input type='password' class='form-control' id='passwordInput' placeholder='Password'>
|
<input type='password' class='form-control' id='passwordInput' placeholder='Password'>
|
||||||
<label for='passwordInput'>Password</label>
|
<label for='passwordInput'>${lang.get('loginFormPassword', 'Password')}</label>
|
||||||
<span class='text-danger' id='password'></span>
|
<span class='text-danger' id='password'></span>
|
||||||
</div>
|
</div>
|
||||||
<div class='d-flex'>
|
<div class='d-flex'>
|
||||||
<button type='button' class='btn btn-primary mt-3 mb-2' id='loginButton'>Login</button>
|
<button type='button' class='btn btn-primary mt-3 mb-2' id='loginButton'>${lang.get('loginFormButton', 'Login')}</button>
|
||||||
<span class='text-danger my-auto mx-2' id='login'></span>
|
<span class='text-danger my-auto mx-2' id='login'></span>
|
||||||
<p class='ms-auto mt-auto'>No account yet? <a href='/register' data-link>Register</a></p>
|
<p class='ms-auto mt-auto'>${lang.get('loginNoAccount', 'No account yet?')} <a href='/register' data-link>${lang.get('loginRegister', 'Register')}</a></p>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user