aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/account
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/account')
-rw-r--r--server/src/routes/ui/account/mod.rs80
-rw-r--r--server/src/routes/ui/account/settings.rs78
2 files changed, 100 insertions, 58 deletions
diff --git a/server/src/routes/ui/account/mod.rs b/server/src/routes/ui/account/mod.rs
index 6139a08..83a1447 100644
--- a/server/src/routes/ui/account/mod.rs
+++ b/server/src/routes/ui/account/mod.rs
@@ -6,19 +6,25 @@
pub mod session;
pub mod settings;
-use super::{error::MyError, layout::LayoutPage};
+use super::{
+ error::MyError,
+ layout::{trs, LayoutPage},
+};
use crate::{
database::Database,
- routes::ui::{
- account::session::Session, error::MyResult, home::rocket_uri_macro_r_home,
- layout::DynLayoutPage,
+ routes::{
+ locale::AcceptLanguage,
+ ui::{
+ account::session::Session, error::MyResult, home::rocket_uri_macro_r_home,
+ layout::DynLayoutPage,
+ },
},
uri,
};
use anyhow::anyhow;
use argon2::{password_hash::Salt, Argon2, PasswordHasher};
use chrono::Duration;
-use jellybase::CONF;
+use jellybase::{locale::tr, CONF};
use jellycommon::user::{User, UserPermission};
use rocket::{
form::{Contextual, Form},
@@ -42,24 +48,25 @@ pub struct RegisterForm {
}
#[get("/account/register")]
-pub async fn r_account_register() -> DynLayoutPage<'static> {
+pub async fn r_account_register(lang: AcceptLanguage) -> DynLayoutPage<'static> {
+ let AcceptLanguage(lang) = lang;
LayoutPage {
- title: "Register".to_string(),
+ title: tr(lang, "account.register").to_string(),
content: markup::new! {
form.account[method="POST", action=""] {
- h1 { "Register" }
+ h1 { @trs(&lang, "account.register") }
- label[for="inp-invitation"] { "Invite Code" }
+ label[for="inp-invitation"] { @trs(&lang, "account.register.invitation") }
input[type="text", id="inp-invitation", name="invitation"]; br;
- label[for="inp-username"] { "Username" }
+ label[for="inp-username"] { @trs(&lang, "account.username") }
input[type="text", id="inp-username", name="username"]; br;
- label[for="inp-password"] { "Password" }
+ label[for="inp-password"] { @trs(&lang, "account.password") }
input[type="password", id="inp-password", name="password"]; br;
- input[type="submit", value="Register now!"];
+ input[type="submit", value=&*tr(lang, "account.register.submit")];
- p { "Already have an account? " a[href=uri!(r_account_login())] { "Login here" } }
+ p { @trs(&lang, "account.register.login") " " a[href=uri!(r_account_login())] { @trs(&lang, "account.register.login_here") } }
}
},
..Default::default()
@@ -77,27 +84,35 @@ pub struct LoginForm {
}
#[get("/account/login")]
-pub fn r_account_login(sess: Option<Session>) -> DynLayoutPage<'static> {
+pub fn r_account_login(sess: Option<Session>, lang: AcceptLanguage) -> DynLayoutPage<'static> {
+ let AcceptLanguage(lang) = lang;
let logged_in = sess.is_some();
- let title = if logged_in { "Switch Account" } else { "Login" };
+ let title = tr(
+ lang,
+ if logged_in {
+ "account.login.switch"
+ } else {
+ "account.login"
+ },
+ );
LayoutPage {
title: title.to_string(),
content: markup::new! {
form.account[method="POST", action=""] {
- h1 { @title }
+ h1 { @title.to_string() }
- label[for="inp-username"] { "Username" }
+ label[for="inp-username"] { @trs(&lang, "account.username") }
input[type="text", id="inp-username", name="username"]; br;
- label[for="inp-password"] { "Password" }
+ label[for="inp-password"] { @trs(&lang, "account.password") }
input[type="password", id="inp-password", name="password"]; br;
- input[type="submit", value=title];
+ input[type="submit", value=&*tr(lang, if logged_in { "account.login.submit.switch" } else { "account.login.submit" })];
@if logged_in {
- p { "Need another account? " a[href=uri!(r_account_register())] { "Register here" } }
+ p { @trs(&lang, "account.login.register.switch") " " a[href=uri!(r_account_register())] { @trs(&lang, "account.login.register_here") } }
} else {
- p { "While logged in, a cookie will be used to identify you." }
- p { "Don't have an account yet? " a[href=uri!(r_account_register())] { "Register here" } }
+ p { @trs(&lang, "account.login.cookie_note") }
+ p { @trs(&lang, "account.login.register") " " a[href=uri!(r_account_register())] { @trs(&lang, "account.login.register_here") } }
}
}
},
@@ -106,13 +121,14 @@ pub fn r_account_login(sess: Option<Session>) -> DynLayoutPage<'static> {
}
#[get("/account/logout")]
-pub fn r_account_logout() -> DynLayoutPage<'static> {
+pub fn r_account_logout(lang: AcceptLanguage) -> DynLayoutPage<'static> {
+ let AcceptLanguage(lang) = lang;
LayoutPage {
- title: "Log out".to_string(),
+ title: tr(lang, "account.logout").to_string(),
content: markup::new! {
form.account[method="POST", action=""] {
- h1 { "Log out" }
- input[type="submit", value="Log out."];
+ h1 { @trs(&lang, "account.logout") }
+ input[type="submit", value=&*tr(lang, "account.logout.submit")];
}
},
..Default::default()
@@ -124,7 +140,9 @@ pub fn r_account_register_post<'a>(
database: &'a State<Database>,
_sess: Option<Session>,
form: Form<Contextual<'a, RegisterForm>>,
+ lang: AcceptLanguage,
) -> MyResult<DynLayoutPage<'a>> {
+ let AcceptLanguage(lang) = lang;
let logged_in = _sess.is_some();
let form = match &form.value {
Some(v) => v,
@@ -143,13 +161,13 @@ pub fn r_account_register_post<'a>(
)?;
Ok(LayoutPage {
- title: "Registration successful".to_string(),
+ title: tr(lang, "account.register.success.title").to_string(),
content: markup::new! {
- h1 { @if logged_in {
- "Registration successful, you may switch account now."
+ h1 { @trs(&lang, if logged_in {
+ "account.register.success.switch"
} else {
- "Registration successful, you may log in now."
- }}
+ "account.register.success"
+ })}
},
..Default::default()
})
diff --git a/server/src/routes/ui/account/settings.rs b/server/src/routes/ui/account/settings.rs
index 06754b1..2e170b0 100644
--- a/server/src/routes/ui/account/settings.rs
+++ b/server/src/routes/ui/account/settings.rs
@@ -6,14 +6,20 @@
use super::{format_form_error, hash_password};
use crate::{
database::Database,
- routes::ui::{
- account::{rocket_uri_macro_r_account_login, session::Session},
- error::MyResult,
- layout::{DynLayoutPage, LayoutPage},
+ routes::{
+ locale::AcceptLanguage,
+ ui::{
+ account::{rocket_uri_macro_r_account_login, session::Session},
+ error::MyResult,
+ layout::{trs, DynLayoutPage, LayoutPage},
+ },
},
uri,
};
-use jellybase::permission::PermissionSetExt;
+use jellybase::{
+ locale::{tr, Language},
+ permission::PermissionSetExt,
+};
use jellycommon::user::{PlayerKind, Theme, UserPermission};
use markup::{Render, RenderAttributeValue};
use rocket::{
@@ -39,7 +45,11 @@ fn option_len<'v>(value: &Option<String>, range: Range<usize>) -> form::Result<'
value.as_ref().map(|v| len(v, range)).unwrap_or(Ok(()))
}
-fn settings_page(session: Session, flash: Option<MyResult<String>>) -> DynLayoutPage<'static> {
+fn settings_page(
+ session: Session,
+ flash: Option<MyResult<String>>,
+ lang: Language,
+) -> DynLayoutPage<'static> {
LayoutPage {
title: "Settings".to_string(),
class: Some("settings"),
@@ -51,46 +61,46 @@ fn settings_page(session: Session, flash: Option<MyResult<String>>) -> DynLayout
Err(err) => { section.message { p.error { @format!("{err}") } } }
}
}
- h2 { "Account" }
+ h2 { @trs(&lang, "account") }
a.switch_account[href=uri!(r_account_login())] { "Switch Account" }
form[method="POST", action=uri!(r_account_settings_post())] {
- label[for="username"] { "Username" }
+ label[for="username"] { @trs(&lang, "account.username") }
input[type="text", id="username", disabled, value=&session.user.name];
- input[type="submit", disabled, value="Immutable"];
+ input[type="submit", disabled, value=&*tr(lang, "settings.immutable")];
}
form[method="POST", action=uri!(r_account_settings_post())] {
- label[for="display_name"] { "Display Name" }
+ label[for="display_name"] { @trs(&lang, "account.display_name") }
input[type="text", id="display_name", name="display_name", value=&session.user.display_name];
- input[type="submit", value="Update"];
+ input[type="submit", value=&*tr(lang, "settings.update")];
}
form[method="POST", action=uri!(r_account_settings_post())] {
- label[for="password"] { "Password" }
+ label[for="password"] { @trs(&lang, "account.password") }
input[type="password", id="password", name="password"];
- input[type="submit", value="Update"];
+ input[type="submit", value=&*tr(lang, "settings.update")];
}
- h2 { "Appearance" }
+ h2 { @trs(&lang, "settings.appearance") }
form[method="POST", action=uri!(r_account_settings_post())] {
fieldset {
- legend { "Theme" }
+ legend { @trs(&lang, "settings.appearance.theme") }
@for (t, tlabel) in Theme::LIST {
label { input[type="radio", name="theme", value=A(*t), checked=session.user.theme==*t]; @tlabel } br;
}
}
- input[type="submit", value="Apply"];
+ input[type="submit", value=&*tr(lang, "settings.apply")];
}
form[method="POST", action=uri!(r_account_settings_post())] {
fieldset {
- legend { "Preferred Media Player" }
+ legend { @trs(&lang, "settings.player_preference") }
@for (t, tlabel) in PlayerKind::LIST {
label { input[type="radio", name="player_preference", value=A(*t), checked=session.user.player_preference==*t]; @tlabel } br;
}
}
- input[type="submit", value="Apply"];
+ input[type="submit", value=&*tr(lang, "settings.apply")];
}
form[method="POST", action=uri!(r_account_settings_post())] {
label[for="native_secret"] { "Native Secret" }
input[type="password", id="native_secret", name="native_secret"];
- input[type="submit", value="Update"];
+ input[type="submit", value=&*tr(lang, "settings.update")];
p { "The secret can be found in " code{"$XDG_CONFIG_HOME/jellynative_secret"} " or by clicking " a.button[href="jellynative://show-secret-v1"] { "Show Secret" } "." }
}
},
@@ -106,8 +116,9 @@ impl<T: UriDisplay<Query>> Render for A<T> {
}
#[get("/account/settings")]
-pub fn r_account_settings(session: Session) -> DynLayoutPage<'static> {
- settings_page(session, None)
+pub fn r_account_settings(session: Session, lang: AcceptLanguage) -> DynLayoutPage<'static> {
+ let AcceptLanguage(lang) = lang;
+ settings_page(session, None, lang)
}
#[post("/account/settings", data = "<form>")]
@@ -115,7 +126,9 @@ pub fn r_account_settings_post(
session: Session,
database: &State<Database>,
form: Form<Contextual<SettingsForm>>,
+ lang: AcceptLanguage,
) -> MyResult<DynLayoutPage<'static>> {
+ let AcceptLanguage(lang) = lang;
session
.user
.permissions
@@ -123,7 +136,13 @@ pub fn r_account_settings_post(
let form = match &form.value {
Some(v) => v,
- None => return Ok(settings_page(session, Some(Err(format_form_error(form))))),
+ None => {
+ return Ok(settings_page(
+ session,
+ Some(Err(format_form_error(form))),
+ lang,
+ ))
+ }
};
let mut out = String::new();
@@ -131,19 +150,23 @@ pub fn r_account_settings_post(
database.update_user(&session.user.name, |user| {
if let Some(password) = &form.password {
user.password = hash_password(&session.user.name, password);
- out += "Password updated\n";
+ out += &*tr(lang, "settings.account.password.changed");
+ out += "\n";
}
if let Some(display_name) = &form.display_name {
user.display_name = display_name.clone();
- out += "Display name updated\n";
+ out += &*tr(lang, "settings.account.display_name.changed");
+ out += "\n";
}
if let Some(theme) = form.theme {
user.theme = theme;
- out += "Theme updated\n";
+ out += &*tr(lang, "settings.account.theme.changed");
+ out += "\n";
}
if let Some(player_preference) = form.player_preference {
user.player_preference = player_preference;
- out += "Player preference changed.\n";
+ out += &*tr(lang, "settings.player_preference.changed");
+ out += "\n";
}
if let Some(native_secret) = &form.native_secret {
user.native_secret = native_secret.to_owned();
@@ -155,9 +178,10 @@ pub fn r_account_settings_post(
Ok(settings_page(
session, // using the old session here, results in outdated theme being displayed
Some(Ok(if out.is_empty() {
- "Nothing changed :)".to_string()
+ tr(lang, "settings.no_change").to_string()
} else {
out
})),
+ lang,
))
}