Add full DE/EN UI label translations across all pages
Add t() translation function to i18n.rs with ~200 key/value pairs covering navigation, card headers, field labels, buttons, filters, planting calendar rows, and general UI text in both German and English. Updated all 11 source files to use t(&lang, "key") instead of hardcoded English strings: app.rs (sidebar nav), all 7 page files (species, cultivars, families, suppliers, home, search, sources), and all 3 component files (planting_calendar, table_controls, plant_card). Boolean values (Yes/No/Annual) are also translated.
This commit is contained in:
+13
-10
@@ -2,6 +2,7 @@ use dioxus::prelude::*;
|
||||
use gloo_storage::{LocalStorage, Storage};
|
||||
|
||||
use crate::api;
|
||||
use crate::i18n::t;
|
||||
use crate::types::MeResponse;
|
||||
|
||||
/// Global language signal shared via context. Values: "de" or "en".
|
||||
@@ -61,6 +62,8 @@ fn Layout() -> Element {
|
||||
let auth = use_resource(|| async { api::get_current_user().await.ok() });
|
||||
let user: Option<MeResponse> = auth.read().as_ref().and_then(|r| r.clone());
|
||||
|
||||
let l = &*current_lang;
|
||||
|
||||
rsx! {
|
||||
div { class: "app-layout",
|
||||
nav { class: "sidebar",
|
||||
@@ -68,17 +71,17 @@ fn Layout() -> Element {
|
||||
span { class: "brand-icon", "\u{1F33F}" }
|
||||
div { class: "brand-text-group",
|
||||
span { class: "brand-text", "HerbAPI" }
|
||||
span { class: "brand-sub", "Plant Database" }
|
||||
span { class: "brand-sub", "{t(l, \"brand.sub\")}" }
|
||||
}
|
||||
}
|
||||
div { class: "sidebar-nav",
|
||||
NavLink { to: Route::Home {}, label: "Home" }
|
||||
NavLink { to: Route::FamilyList {}, label: "Families" }
|
||||
NavLink { to: Route::SpeciesList {}, label: "Species" }
|
||||
NavLink { to: Route::CultivarList {}, label: "Cultivars" }
|
||||
NavLink { to: Route::SupplierList {}, label: "Suppliers" }
|
||||
NavLink { to: Route::SearchPage {}, label: "Search" }
|
||||
NavLink { to: Route::Sources {}, label: "Sources" }
|
||||
NavLink { to: Route::Home {}, label: t(l, "nav.home") }
|
||||
NavLink { to: Route::FamilyList {}, label: t(l, "nav.families") }
|
||||
NavLink { to: Route::SpeciesList {}, label: t(l, "nav.species") }
|
||||
NavLink { to: Route::CultivarList {}, label: t(l, "nav.cultivars") }
|
||||
NavLink { to: Route::SupplierList {}, label: t(l, "nav.suppliers") }
|
||||
NavLink { to: Route::SearchPage {}, label: t(l, "nav.search") }
|
||||
NavLink { to: Route::Sources {}, label: t(l, "nav.sources") }
|
||||
}
|
||||
div { class: "sidebar-lang",
|
||||
div { class: "lang-toggle",
|
||||
@@ -103,9 +106,9 @@ fn Layout() -> Element {
|
||||
div { class: "sidebar-user",
|
||||
if let Some(ref u) = user {
|
||||
span { class: "user-name", "{u.nickname.as_deref().or(u.name.as_deref()).unwrap_or(&u.email)}" }
|
||||
a { class: "logout-link", href: "/auth/oidc/logout", "Logout" }
|
||||
a { class: "logout-link", href: "/auth/oidc/logout", "{t(l, \"btn.logout\")}" }
|
||||
} else {
|
||||
a { class: "login-link", href: "/auth/oidc/login", "Login" }
|
||||
a { class: "login-link", href: "/auth/oidc/login", "{t(l, \"btn.login\")}" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user