Translate login page

This commit is contained in:
JonnyWong16 2021-06-05 00:01:39 -07:00
commit 89cde72f98
No known key found for this signature in database
GPG key ID: B1F1F9807184697A
6 changed files with 173 additions and 92 deletions

View file

@ -151,11 +151,11 @@
<li><a href="#" id="nav-restart"><i class="fa fa-fw fa-refresh"></i> ${_('base.nav.restart')}</a></li> <li><a href="#" id="nav-restart"><i class="fa fa-fw fa-refresh"></i> ${_('base.nav.restart')}</a></li>
<li><a href="#" id="nav-shutdown"><i class="fa fa-fw fa-power-off"></i> ${_('base.nav.shutdown')}</a></li> <li><a href="#" id="nav-shutdown"><i class="fa fa-fw fa-power-off"></i> ${_('base.nav.shutdown')}</a></li>
% else: % else:
<li><a href="#" data-target="#admin-login-modal" data-toggle="modal"><i class="fa fa-fw fa-lock"></i> ${_('base.nav.admin_login')}</a></li> <li><a href="#" data-target="#admin-login-modal" data-toggle="modal"><i class="fa fa-fw fa-lock"></i> ${_('login.admin_login')}</a></li>
<li role="separator" class="divider"></li> <li role="separator" class="divider"></li>
% endif % endif
% if _session['exp']: % if _session['exp']:
<li><a href="${http_root}auth/logout"><i class="fa fa-fw fa-sign-out"></i> ${_('base.nav.sign_out')}</a></li> <li><a href="${http_root}auth/logout"><i class="fa fa-fw fa-sign-out"></i> ${_('login.sign_out')}</a></li>
% endif % endif
</ul> </ul>
</li> </li>
@ -180,19 +180,19 @@ ${next.modalIncludes()}
<form id="login-form"> <form id="login-form">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
<h4 class="modal-title">${_('base.nav.admin_login')}</h4> <h4 class="modal-title">${_('login.admin_login')}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="col-md-6" style="margin: auto;"> <div class="col-md-6" style="margin: auto;">
<div class="form-group"> <div class="form-group">
<label for="username" class="control-label"> <label for="username" class="control-label">
Username ${_('login.username')}
</label> </label>
<input type="text" id="username" name="username" class="form-control" autocorrect="off" autocapitalize="off"> <input type="text" id="username" name="username" class="form-control" autocorrect="off" autocapitalize="off">
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="password" class="control-label"> <label for="password" class="control-label">
Password ${_('login.password')}
</label> </label>
<input type="password" id="password" name="password" class="form-control"> <input type="password" id="password" name="password" class="form-control">
</div> </div>
@ -287,15 +287,15 @@ ${next.modalIncludes()}
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
<h4 class="modal-title">Confirm</h4> <h4 class="modal-title">${_('global.confirm')}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div id="confirm-message" style="text-align: center; margin-top: 20px; margin-bottom: 20px;"> <div id="confirm-message" style="text-align: center; margin-top: 20px; margin-bottom: 20px;">
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-dark" data-dismiss="modal">Cancel</button> <button type="button" class="btn btn-dark" data-dismiss="modal">${_('global.cancel')}</button>
<button type="button" class="btn btn-danger btn-ok" data-dismiss="modal" id="confirm-button">Confirm</button> <button type="button" class="btn btn-danger btn-ok" data-dismiss="modal" id="confirm-button">${_('global.confirm')}</button>
</div> </div>
</div> </div>
</div> </div>

View file

@ -54,16 +54,16 @@
% if plex_login: % if plex_login:
<li class="open"> <li class="open">
<div class="link login-method-header"> <div class="link login-method-header">
Sign In with Plex ${_('login.sign_in_plex')}
</div> </div>
<ul class="submenu login-button-plex" style="display: block;"> <ul class="submenu login-button-plex" style="display: block;">
<li> <li>
<div> <div>
<button id="sign-in-plex" class="btn btn-bright login-button"><i class="fa fa-sign-in"></i>&nbsp; Sign In</button> <button id="sign-in-plex" class="btn btn-bright login-button"><i class="fa fa-sign-in"></i>&nbsp; ${_('login.sign_in')}</button>
</div> </div>
<div class="remember-group"> <div class="remember-group">
<label class="control-label"> <label class="control-label">
<input type="checkbox" id="remember_me_plex" name="remember_me_plex" title="for 30 days" value="1" checked="checked" /> Remember me <input type="checkbox" id="remember_me_plex" name="remember_me_plex" title="for 30 days" value="1" checked="checked" /> ${_('login.remember_me')}
</label> </label>
</div> </div>
</li> </li>
@ -72,30 +72,30 @@
% endif % endif
<li class="${'open' if not plex_login else ''}"> <li class="${'open' if not plex_login else ''}">
<div class="link login-method-header"> <div class="link login-method-header">
Sign In with Tautulli ${_('login.sign_in_tautulli')}
</div> </div>
<ul class="submenu" style="${'display: block;' if not plex_login else ''}"> <ul class="submenu" style="${'display: block;' if not plex_login else ''}">
<li> <li>
<form id="login-form"> <form id="login-form">
<div class="form-group"> <div class="form-group">
<label for="username" class="control-label"> <label for="username" class="control-label">
Username ${_('login.username')}
</label> </label>
<input type="text" id="username" name="username" class="form-control" autocorrect="off" autocapitalize="off" autofocus> <input type="text" id="username" name="username" class="form-control" autocorrect="off" autocapitalize="off" autofocus>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="password" class="control-label"> <label for="password" class="control-label">
Password ${_('login.password')}
</label> </label>
<input type="password" id="password" name="password" class="form-control"> <input type="password" id="password" name="password" class="form-control">
</div> </div>
<div class="form-group"> <div class="form-group">
<span class="remember-group"> <span class="remember-group">
<label class="control-label"> <label class="control-label">
<input type="checkbox" id="remember_me" name="remember_me" title="for 30 days" value="1" checked="checked" /> Remember me <input type="checkbox" id="remember_me" name="remember_me" title="for 30 days" value="1" checked="checked" /> ${_('login.remember_me')}
</label> </label>
</span> </span>
<button id="sign-in" type="submit" class="btn btn-bright login-button"><i class="fa fa-sign-in"></i>&nbsp; Sign In</button> <button id="sign-in" type="submit" class="btn btn-bright login-button"><i class="fa fa-sign-in"></i>&nbsp; ${_('login.sign_in')}</button>
</div> </div>
</form> </form>
</li> </li>
@ -119,7 +119,7 @@
signIn(true, authToken); signIn(true, authToken);
} }
function OAuthErrorCallback() { function OAuthErrorCallback() {
$('#sign-in-alert').text('Error communicating with Plex.tv.').show(); $('#sign-in-alert').text('${_("login.error_plex_communication")}').show();
} }
$('#sign-in-plex').click(function() { $('#sign-in-plex').click(function() {
@ -134,9 +134,9 @@
function signIn(plex, token) { function signIn(plex, token) {
$('.login-container button').prop('disabled', true); $('.login-container button').prop('disabled', true);
if (plex) { if (plex) {
$('#sign-in-plex').html('<i class="fa fa-refresh fa-spin"></i>&nbsp; Sign In'); $('#sign-in-plex').html('<i class="fa fa-refresh fa-spin"></i>&nbsp; ${_("login.sign_in")}');
} else { } else {
$('#sign-in').html('<i class="fa fa-refresh fa-spin"></i>&nbsp; Sign In'); $('#sign-in').html('<i class="fa fa-refresh fa-spin"></i>&nbsp; ${_("login.sign_in")}');
} }
const username = plex ? null : $('#username').val(); const username = plex ? null : $('#username').val();
@ -164,23 +164,23 @@
}, },
401: function(xhr, status) { 401: function(xhr, status) {
if (plex) { if (plex) {
$('#sign-in-alert').text('Invalid Plex Login.').show(); $('#sign-in-alert').text('${_("login.error_plex_invalid")}').show();
} else { } else {
$('#sign-in-alert').text('Incorrect username or password.').show(); $('#sign-in-alert').text('${_("login.error_tautulli_invalid")}').show();
$('#username').focus(); $('#username').focus();
} }
}, },
429: function(xhr, status) { 429: function(xhr, status) {
var retry = Math.ceil(xhr.getResponseHeader('Retry-After') / 60) var retry = Math.ceil(xhr.getResponseHeader('Retry-After') / 60)
$('#sign-in-alert').text('Too many login attempts. Try again in ' + retry + ' minute(s).').show(); $('#sign-in-alert').text(${_("login.error_retry")}).show();
} }
}, },
complete: function() { complete: function() {
$('.login-container button').prop('disabled', false); $('.login-container button').prop('disabled', false);
if (plex) { if (plex) {
$('#sign-in-plex').html('<i class="fa fa-sign-in"></i>&nbsp; Sign In'); $('#sign-in-plex').html('<i class="fa fa-sign-in"></i>&nbsp; ${_("login.sign_in")}');
} else { } else {
$('#sign-in').html('<i class="fa fa-sign-in"></i>&nbsp; Sign In'); $('#sign-in').html('<i class="fa fa-sign-in"></i>&nbsp; ${_("login.sign_in")}');
} }
} }
}); });

View file

@ -1,2 +1,2 @@
pybabel extract -F babel.cfg -o tautulli.pot ../.. pybabel extract -F babel.cfg -o tautulli.pot --charset=utf-8 --sort-output --copyright-holder=Tautulli ../..
pybabel compile -D tautulli -d . -l en pybabel compile -D tautulli -d . -l en

View file

@ -14,50 +14,80 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.7-dev\n" "X-Generator: Weblate 4.7-dev\n"
msgid "base.nav.libraries" msgid "base.nav.check_for_updates"
msgstr "Libraries" msgstr "Check for Updates"
msgid "base.nav.users"
msgstr "Users"
msgid "base.nav.history"
msgstr "History"
msgid "base.nav.graphs"
msgstr "Graphs"
msgid "base.nav.synced_items"
msgstr "Synced Items"
msgid "base.nav.settings"
msgstr "Settings"
msgid "base.nav.view_logs"
msgstr "View Logs"
msgid "base.nav.support"
msgstr "Support"
msgid "base.nav.donate" msgid "base.nav.donate"
msgstr "Donate" msgstr "Donate"
msgid "base.nav.check_for_updates" msgid "base.nav.graphs"
msgstr "Check for Updates" msgstr "Graphs"
msgid "base.nav.history"
msgstr "History"
msgid "base.nav.libraries"
msgstr "Libraries"
msgid "base.nav.restart" msgid "base.nav.restart"
msgstr "Restart" msgstr "Restart"
msgid "base.nav.settings"
msgstr "Settings"
msgid "base.nav.shutdown" msgid "base.nav.shutdown"
msgstr "Shutdown" msgstr "Shutdown"
msgid "base.nav.admin_login" msgid "base.nav.support"
msgstr "Support"
msgid "base.nav.synced_items"
msgstr "Synced Items"
msgid "base.nav.users"
msgstr "Users"
msgid "base.nav.view_logs"
msgstr "View Logs"
msgid "global.cancel"
msgstr "Cancel"
msgid "global.confirm"
msgstr "Confirm"
msgid "login.admin_login"
msgstr "Admin Login" msgstr "Admin Login"
msgid "base.nav.sign_out" msgid "login.error_plex_communication"
msgstr "Sign Out" msgstr "Error communicating with Plex.tv."
msgid "login.error_plex_invalid"
msgstr "Invalid Plex login."
msgid "login.error_retry"
msgstr "`Too many login attempts. Try again in ${retry} minute(s).`"
msgid "login.error_tautulli_invalid"
msgstr "Incorrect username or password."
msgid "login.password"
msgstr "Password"
msgid "login.remember_me" msgid "login.remember_me"
msgstr "Remember me" msgstr "Remember me"
msgid "login.sign_in" msgid "login.sign_in"
msgstr "Sign In" msgstr "Sign In"
msgid "login.sign_in_plex"
msgstr "Sign In with Plex"
msgid "login.sign_in_tautulli"
msgstr "Sign In with Tautulli"
msgid "login.sign_out"
msgstr "Sign Out"
msgid "login.username"
msgstr "Username"

View file

@ -1,5 +1,5 @@
# Translations template for PROJECT. # Translations template for PROJECT.
# Copyright (C) 2021 ORGANIZATION # Copyright (C) 2021 Tautulli
# This file is distributed under the same license as the PROJECT project. # This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021. # FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
# #
@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-04 21:44-0700\n" "POT-Creation-Date: 2021-06-05 00:01-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,19 +17,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.0\n" "Generated-By: Babel 2.9.0\n"
#: ../../data/interfaces/default/base.html:107 #: ../../data/interfaces/default/base.html:149
#: ../../data/interfaces/default/base.html:109 msgid "base.nav.check_for_updates"
msgid "base.nav.libraries"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:112 #: ../../data/interfaces/default/base.html:146
#: ../../data/interfaces/default/base.html:114 msgid "base.nav.donate"
msgid "base.nav.users"
msgstr ""
#: ../../data/interfaces/default/base.html:117
#: ../../data/interfaces/default/base.html:119
msgid "base.nav.history"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:122 #: ../../data/interfaces/default/base.html:122
@ -37,53 +30,111 @@ msgstr ""
msgid "base.nav.graphs" msgid "base.nav.graphs"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:127 #: ../../data/interfaces/default/base.html:117
#: ../../data/interfaces/default/base.html:129 #: ../../data/interfaces/default/base.html:119
msgid "base.nav.synced_items" msgid "base.nav.history"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:140 #: ../../data/interfaces/default/base.html:107
msgid "base.nav.settings" #: ../../data/interfaces/default/base.html:109
msgstr "" msgid "base.nav.libraries"
#: ../../data/interfaces/default/base.html:142
msgid "base.nav.view_logs"
msgstr ""
#: ../../data/interfaces/default/base.html:144
msgid "base.nav.support"
msgstr ""
#: ../../data/interfaces/default/base.html:146
msgid "base.nav.donate"
msgstr ""
#: ../../data/interfaces/default/base.html:149
msgid "base.nav.check_for_updates"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:151 #: ../../data/interfaces/default/base.html:151
msgid "base.nav.restart" msgid "base.nav.restart"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:140
msgid "base.nav.settings"
msgstr ""
#: ../../data/interfaces/default/base.html:152 #: ../../data/interfaces/default/base.html:152
msgid "base.nav.shutdown" msgid "base.nav.shutdown"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:154 #: ../../data/interfaces/default/base.html:144
#: ../../data/interfaces/default/base.html:183 msgid "base.nav.support"
msgid "base.nav.admin_login"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:158 #: ../../data/interfaces/default/base.html:127
msgid "base.nav.sign_out" #: ../../data/interfaces/default/base.html:129
msgid "base.nav.synced_items"
msgstr ""
#: ../../data/interfaces/default/base.html:112
#: ../../data/interfaces/default/base.html:114
msgid "base.nav.users"
msgstr ""
#: ../../data/interfaces/default/base.html:142
msgid "base.nav.view_logs"
msgstr ""
#: ../../data/interfaces/default/base.html:297
msgid "global.cancel"
msgstr ""
#: ../../data/interfaces/default/base.html:290
#: ../../data/interfaces/default/base.html:298
msgid "global.confirm"
msgstr ""
#: ../../data/interfaces/default/base.html:154
#: ../../data/interfaces/default/base.html:183
msgid "login.admin_login"
msgstr ""
#: ../../data/interfaces/default/login.html:122
msgid "login.error_plex_communication"
msgstr ""
#: ../../data/interfaces/default/login.html:167
msgid "login.error_plex_invalid"
msgstr ""
#: ../../data/interfaces/default/login.html:175
msgid "login.error_retry"
msgstr ""
#: ../../data/interfaces/default/login.html:169
msgid "login.error_tautulli_invalid"
msgstr ""
#: ../../data/interfaces/default/base.html:195
#: ../../data/interfaces/default/login.html:88
msgid "login.password"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:202 #: ../../data/interfaces/default/base.html:202
#: ../../data/interfaces/default/login.html:66
#: ../../data/interfaces/default/login.html:95
msgid "login.remember_me" msgid "login.remember_me"
msgstr "" msgstr ""
#: ../../data/interfaces/default/base.html:210 #: ../../data/interfaces/default/base.html:210
#: ../../data/interfaces/default/login.html:62
#: ../../data/interfaces/default/login.html:98
#: ../../data/interfaces/default/login.html:137
#: ../../data/interfaces/default/login.html:139
#: ../../data/interfaces/default/login.html:181
#: ../../data/interfaces/default/login.html:183
msgid "login.sign_in" msgid "login.sign_in"
msgstr "" msgstr ""
#: ../../data/interfaces/default/login.html:57
msgid "login.sign_in_plex"
msgstr ""
#: ../../data/interfaces/default/login.html:75
msgid "login.sign_in_tautulli"
msgstr ""
#: ../../data/interfaces/default/base.html:158
msgid "login.sign_out"
msgstr ""
#: ../../data/interfaces/default/base.html:189
#: ../../data/interfaces/default/login.html:82
msgid "login.username"
msgstr ""