remember me

EBO <eric.bouhana@softalys.com> committé le 2026-03-23 21:16

651a506b9405aa2ce695ec21ddbe8909d25ce559

1 parent(s)

23 fichiers modifiés +3062 -2873
A crates/rustwarden-core/locales/de.yml
+67 -0
@@ -0,0 +1,67 @@
1 +# Deutsche Übersetzungen — rustwarden-core
2 +# Abschnitte: error, common, i18n, email, oauth, rate_limit, session
3 +
4 +# Fehlermeldungen
5 +error:
6 + invalid_credentials: "Ungültige Anmeldedaten"
7 + email_invalid: "Ungültige E-Mail"
8 + required_field: "Dieses Feld ist erforderlich"
9 + unauthorized: "Nicht autorisiert"
10 + not_found: "Ressource nicht gefunden"
11 + validation: "Validierungsfehler: {message}"
12 + database: "Datenbankfehler"
13 + internal: "Interner Serverfehler"
14 + invalid_token: "Ungültiges Token"
15 + token_expired: "Token abgelaufen"
16 + token_reused: "Token wiederverwendet - bitte erneut authentifizieren"
17 + must_change_password: "Passwortänderung erforderlich"
18 + authentication_required: "Authentifizierung erforderlich"
19 + insufficient_permissions: "Unzureichende Berechtigungen"
20 + config: "Serverkonfigurationsfehler"
21 + template: "Template-Fehler"
22 + validation_field:
23 + username_min_length: "Der Benutzername muss mindestens {min} Zeichen enthalten"
24 + password_min_length: "Das Passwort muss mindestens {min} Zeichen enthalten"
25 + email_format: "Die E-Mail-Adresse ist ungültig"
26 + password_require_uppercase: "Das Passwort muss mindestens einen Großbuchstaben enthalten"
27 + password_require_lowercase: "Das Passwort muss mindestens einen Kleinbuchstaben enthalten"
28 + password_require_digits: "Das Passwort muss mindestens eine Ziffer enthalten"
29 + password_require_special: "Das Passwort muss mindestens ein Sonderzeichen (!@#$%^&*()_+-=[]{}|;:,.<>?) enthalten"
30 +
31 +# Allgemeine Nachrichten
32 +common:
33 + welcome: "Willkommen {username}"
34 + loading: "Laden..."
35 + save: "Speichern"
36 + cancel: "Abbrechen"
37 + delete: "Löschen"
38 + edit: "Bearbeiten"
39 + create: "Erstellen"
40 +
41 +# E-Mail-Verifizierung
42 +email_verify:
43 + config_error: "Server-Konfigurationsfehler. Bitte kontaktieren Sie den Administrator."
44 + success: "Ihre E-Mail-Adresse wurde erfolgreich verifiziert. Sie können sich jetzt in Ihr Konto einloggen."
45 + invalid_link: "Der Verifizierungslink ist ungültig oder abgelaufen."
46 +
47 +# E-Mail-Betreffs
48 +email_subject:
49 + password_reset: "Passwort zurücksetzen"
50 + email_validation: "Bestätigung Ihrer E-Mail-Adresse"
51 + welcome: "Willkommen bei RustWarden!"
52 +
53 +# Rate Limiting
54 +rate_limit:
55 + exceeded: "Zu viele Anfragen. Bitte versuchen Sie es später erneut."
56 + password_change: "Zu viele Passwortänderungsanfragen. Bitte warten Sie, bevor Sie es erneut versuchen."
57 +
58 +# OAuth
59 +oauth:
60 + divider: "oder"
61 + login_with: "Anmelden mit {provider}"
62 + error_denied: "Anmeldung vom Anbieter verweigert."
63 + error_generic: "OAuth-Anmeldefehler."
64 +
65 +# Sitzungen
66 +session:
67 + ip_unavailable: "Nicht verfügbar"
A crates/rustwarden-core/locales/en.yml
+81 -0
@@ -0,0 +1,81 @@
1 +# English translations — rustwarden-core
2 +# Sections: error, common, i18n, email, oauth, rate_limit, session
3 +
4 +# Error messages
5 +error:
6 + invalid_credentials: "Invalid credentials"
7 + email_invalid: "Invalid email"
8 + required_field: "This field is required"
9 + unauthorized: "Unauthorized"
10 + not_found: "Resource not found"
11 + validation: "Validation error: {message}"
12 + database: "Database error occurred"
13 + internal: "Internal server error"
14 + invalid_token: "Invalid token"
15 + token_expired: "Token expired"
16 + token_reused: "Token reused - please re-authenticate"
17 + must_change_password: "Password change required"
18 + authentication_required: "Authentication required"
19 + insufficient_permissions: "Insufficient permissions"
20 + config: "Server configuration error"
21 + template: "Template error"
22 + validation_field:
23 + username_min_length: "Username must contain at least {min} characters"
24 + password_min_length: "Password must contain at least {min} characters"
25 + email_format: "Email address is not valid"
26 + password_require_uppercase: "Password must contain at least one uppercase letter"
27 + password_require_lowercase: "Password must contain at least one lowercase letter"
28 + password_require_digits: "Password must contain at least one digit"
29 + password_require_special: "Password must contain at least one special character (!@#$%^&*()_+-=[]{}|;:,.<>?)"
30 +
31 +# Common messages
32 +common:
33 + welcome: "Welcome {username}"
34 + loading: "Loading..."
35 + save: "Save"
36 + cancel: "Cancel"
37 + delete: "Delete"
38 + edit: "Edit"
39 + create: "Create"
40 +
41 +# i18n messages
42 +i18n:
43 + language_updated: "Language preference updated. Please reload the page to apply changes."
44 + invalid_language: "Invalid language code. Supported: fr, en, de, es"
45 +
46 +# Email verification messages
47 +email_verify:
48 + config_error: "Server configuration error. Please contact the administrator."
49 + success: "Your email address has been successfully verified. You can now log in to your account."
50 + invalid_link: "The verification link is invalid or has expired."
51 +
52 +# Email subjects
53 +email_subject:
54 + password_reset: "Password Reset"
55 + email_validation: "Verify Your Email Address"
56 + welcome: "Welcome to RustWarden!"
57 +
58 +# Password Change Confirmation Email
59 +password_change_confirmation:
60 + subject: "Password Change Confirmation"
61 + greeting: "Hello {username}"
62 + message: "You have requested to change your password for your {app_name} account. To confirm this change, click the link below."
63 + button_text: "Confirm Password Change"
64 + expires_message: "This link is valid for {hours} hours and is single-use."
65 + footer: "This email was sent automatically, please do not reply."
66 +
67 +# Rate limiting
68 +rate_limit:
69 + exceeded: "Too many requests. Please try again later."
70 + password_change: "Too many password change requests. Please wait before trying again."
71 +
72 +# OAuth
73 +oauth:
74 + divider: "or"
75 + login_with: "Sign in with {provider}"
76 + error_denied: "Login denied by provider."
77 + error_generic: "OAuth login error."
78 +
79 +# Sessions
80 +session:
81 + ip_unavailable: "Unavailable"
A crates/rustwarden-core/locales/es.yml
+67 -0
@@ -0,0 +1,67 @@
1 +# Traducciones en español — rustwarden-core
2 +# Secciones: error, common, i18n, email, oauth, rate_limit, session
3 +
4 +# Mensajes de error
5 +error:
6 + invalid_credentials: "Credenciales inválidas"
7 + email_invalid: "Email inválido"
8 + required_field: "Este campo es obligatorio"
9 + unauthorized: "No autorizado"
10 + not_found: "Recurso no encontrado"
11 + validation: "Error de validación: {message}"
12 + database: "Error de base de datos"
13 + internal: "Error interno del servidor"
14 + invalid_token: "Token inválido"
15 + token_expired: "Token expirado"
16 + token_reused: "Token reutilizado - por favor vuelva a autenticarse"
17 + must_change_password: "Cambio de contraseña requerido"
18 + authentication_required: "Autenticación requerida"
19 + insufficient_permissions: "Permisos insuficientes"
20 + config: "Error de configuración del servidor"
21 + template: "Error de plantilla"
22 + validation_field:
23 + username_min_length: "El nombre de usuario debe contener al menos {min} caracteres"
24 + password_min_length: "La contraseña debe contener al menos {min} caracteres"
25 + email_format: "La dirección de correo electrónico no es válida"
26 + password_require_uppercase: "La contraseña debe contener al menos una letra mayúscula"
27 + password_require_lowercase: "La contraseña debe contener al menos una letra minúscula"
28 + password_require_digits: "La contraseña debe contener al menos un dígito"
29 + password_require_special: "La contraseña debe contener al menos un carácter especial (!@#$%^&*()_+-=[]{}|;:,.<>?)"
30 +
31 +# Mensajes comunes
32 +common:
33 + welcome: "Bienvenido {username}"
34 + loading: "Cargando..."
35 + save: "Guardar"
36 + cancel: "Cancelar"
37 + delete: "Eliminar"
38 + edit: "Editar"
39 + create: "Crear"
40 +
41 +# Verificación de email
42 +email_verify:
43 + config_error: "Error de configuración del servidor. Por favor, contacte al administrador."
44 + success: "Su dirección de correo electrónico ha sido verificada con éxito. Ahora puede iniciar sesión en su cuenta."
45 + invalid_link: "El enlace de verificación es inválido o ha expirado."
46 +
47 +# Asuntos de email
48 +email_subject:
49 + password_reset: "Restablecimiento de contraseña"
50 + email_validation: "Verifique su dirección de correo electrónico"
51 + welcome: "¡Bienvenido a RustWarden!"
52 +
53 +# Rate limiting
54 +rate_limit:
55 + exceeded: "Demasiadas solicitudes. Por favor, inténtelo de nuevo más tarde."
56 + password_change: "Demasiadas solicitudes de cambio de contraseña. Por favor, espere antes de intentarlo de nuevo."
57 +
58 +# OAuth
59 +oauth:
60 + divider: "o"
61 + login_with: "Iniciar sesión con {provider}"
62 + error_denied: "Inicio de sesión denegado por el proveedor."
63 + error_generic: "Error de inicio de sesión OAuth."
64 +
65 +# Sesiones
66 +session:
67 + ip_unavailable: "No disponible"
A crates/rustwarden-core/locales/fr.yml
+82 -0
@@ -0,0 +1,82 @@
1 +# Traductions françaises — rustwarden-core
2 +# Sections : error, common, i18n, email, oauth, rate_limit, session
3 +
4 +# Messages d'erreur
5 +error:
6 + invalid_credentials: "Identifiants incorrects"
7 + email_invalid: "Email invalide"
8 + required_field: "Ce champ est requis"
9 + unauthorized: "Non autorisé"
10 + not_found: "Ressource non trouvée"
11 + validation: "Erreur de validation : {message}"
12 + database: "Erreur de base de données"
13 + internal: "Erreur interne du serveur"
14 + invalid_token: "Token invalide"
15 + token_expired: "Token expiré"
16 + token_reused: "Token réutilisé - veuillez vous ré-authentifier"
17 + must_change_password: "Changement de mot de passe requis"
18 + authentication_required: "Authentification requise"
19 + insufficient_permissions: "Permissions insuffisantes"
20 + config: "Erreur de configuration du serveur"
21 + template: "Erreur de rendu de template"
22 + validation_field:
23 + username_min_length: "Le nom d'utilisateur doit contenir au moins {min} caractères"
24 + password_min_length: "Le mot de passe doit contenir au moins {min} caractères"
25 + email_format: "L'adresse email n'est pas valide"
26 + password_require_uppercase: "Le mot de passe doit contenir au moins une majuscule"
27 + password_require_lowercase: "Le mot de passe doit contenir au moins une minuscule"
28 + password_require_digits: "Le mot de passe doit contenir au moins un chiffre"
29 + password_require_special: "Le mot de passe doit contenir au moins un caractère spécial (!@#$%^&*()_+-=[]{}|;:,.<>?)"
30 +
31 +# Messages généraux
32 +common:
33 + welcome: "Bienvenue {username}"
34 + loading: "Chargement..."
35 + save: "Enregistrer"
36 + cancel: "Annuler"
37 + delete: "Supprimer"
38 + edit: "Modifier"
39 + create: "Créer"
40 + load_more: "Charger plus"
41 +
42 +# Messages i18n
43 +i18n:
44 + language_updated: "Préférence de langue mise à jour. Veuillez recharger la page pour appliquer les changements."
45 + invalid_language: "Code de langue invalide. Langues supportées : fr, en, de, es"
46 +
47 +# Vérification d'email
48 +email_verify:
49 + config_error: "Erreur de configuration du serveur. Veuillez contacter l'administrateur."
50 + success: "Votre adresse email a été vérifiée avec succès. Vous pouvez maintenant vous connecter à votre compte."
51 + invalid_link: "Le lien de vérification est invalide ou a expiré."
52 +
53 +# Sujets d'email
54 +email_subject:
55 + password_reset: "Réinitialisation de votre mot de passe"
56 + email_validation: "Vérification de votre adresse email"
57 + welcome: "Bienvenue sur RustWarden !"
58 +
59 +# Email de confirmation de changement de mot de passe
60 +password_change_confirmation:
61 + subject: "Confirmation de changement de mot de passe"
62 + greeting: "Bonjour {username}"
63 + message: "Vous avez demandé à changer votre mot de passe pour votre compte {app_name}. Pour confirmer ce changement, cliquez sur le lien ci-dessous."
64 + button_text: "Confirmer le changement de mot de passe"
65 + expires_message: "Ce lien est valide pendant {hours} heures et est à usage unique."
66 + footer: "Cet email a été envoyé automatiquement, merci de ne pas y répondre."
67 +
68 +# Rate limiting
69 +rate_limit:
70 + exceeded: "Trop de requêtes. Veuillez réessayer plus tard."
71 + password_change: "Trop de demandes de changement de mot de passe. Veuillez patienter avant de réessayer."
72 +
73 +# OAuth
74 +oauth:
75 + divider: "ou"
76 + login_with: "Se connecter avec {provider}"
77 + error_denied: "Connexion refusée par le fournisseur."
78 + error_generic: "Erreur lors de la connexion OAuth."
79 +
80 +# Sessions
81 +session:
82 + ip_unavailable: "Non disponible"
M crates/rustwarden-core/src/app.rs
+10 -6
@@ -464,13 +464,17 @@ impl RustwardenBuilder {
464 464 async fn init_i18n(extra_dirs: &[PathBuf]) -> Arc<I18nService> {
465 465 let service = I18nService::new();
466 466
467 - let dirs: Vec<&str> = if extra_dirs.is_empty() {
468 - vec!["locales"]
469 - } else {
470 - extra_dirs.iter().map(|p| p.to_str().unwrap_or("locales")).collect()
471 - };
467 + // Charger d'abord les traductions des crates du framework,
468 + // puis les dirs supplementaires (app consommatrice).
469 + let mut dirs: Vec<String> = vec![
470 + "crates/rustwarden-core/locales".to_string(),
471 + "crates/rustwarden-ui/locales".to_string(),
472 + ];
473 + for extra in extra_dirs {
474 + dirs.push(extra.to_string_lossy().to_string());
475 + }
472 476
473 - for dir in dirs {
477 + for dir in &dirs {
474 478 match load_translations_from_directory(dir).await {
475 479 Ok(all_translations) => {
476 480 let mut locale_count = 0;
M crates/rustwarden-core/src/auth/handlers.rs
+57 -7
@@ -45,6 +45,10 @@ pub struct LoginRequest {
45 45 pub username: String,
46 46 #[validate(length(min = 1))]
47 47 pub password: String,
48 + /// Si true, le refresh token a une durée de vie étendue.
49 + /// Défaut : false (rétrocompatibilité).
50 + #[serde(default)]
51 + pub remember_me: bool,
48 52 }
49 53
50 54 #[derive(Debug, Serialize)]
@@ -62,6 +66,8 @@ pub struct LoginResponse {
62 66 pub refresh_token: Option<String>,
63 67 pub token_type: String,
64 68 pub expires_in: i64,
69 + /// Durée de vie du refresh token en secondes.
70 + pub refresh_expires_in: i64,
65 71 pub user: UserInfo,
66 72 }
67 73
@@ -88,6 +94,8 @@ pub struct RefreshResponse {
88 94 pub refresh_token: Option<String>,
89 95 pub token_type: String,
90 96 pub expires_in: i64,
97 + /// Durée de vie du refresh token en secondes.
98 + pub refresh_expires_in: i64,
91 99 }
92 100
93 101 #[derive(Debug, Deserialize, Validate)]
@@ -297,10 +305,17 @@ pub async fn login(
297 305 // No need to store in session serveur - JWT is stateless
298 306 tracing::debug!("JWT token generated for user {}", user.username);
299 307
308 + // Remember me: use extended refresh token duration
309 + let rt_expiration_days = if payload.remember_me {
310 + auth_config.remember_me_expiration_days
311 + } else {
312 + auth_config.refresh_token_expiration_days
313 + };
314 +
300 315 let created_rt = RefreshTokenService::create_refresh_token(
301 316 &db,
302 317 user.id,
303 - auth_config.refresh_token_expiration_days,
318 + rt_expiration_days,
304 319 )
305 320 .await?;
306 321
@@ -312,6 +327,7 @@ pub async fn login(
312 327 refresh_token,
313 328 token_type: "Bearer".to_string(),
314 329 expires_in: auth_config.jwt_expiration_minutes * 60, // Convert minutes to seconds
330 + refresh_expires_in: rt_expiration_days * 86400, // Convert days to seconds
315 331 user: UserInfo {
316 332 id: user.id,
317 333 username: user.username.clone(),
@@ -722,7 +738,7 @@ pub async fn refresh_token(
722 738 State(db): State<DatabaseConnection>,
723 739 headers: HeaderMap,
724 740 Json(payload): Json<RefreshRequest>,
725 -) -> Result<Json<RefreshResponse>, AppError> {
741 +) -> Result<Response, AppError> {
726 742 // SEC-C2: Per-IP rate limiting
727 743 if let Err(_resp) = crate::middleware::rate_limit::check_auth_rate_limit(&headers) {
728 744 return Err(AppError::Validation("Too many requests. Please try again later.".to_string()));
@@ -780,11 +796,17 @@ pub async fn refresh_token(
780 796 let access_token =
781 797 JwtService::generate_token(&auth_config, user.id, &user.username, roles.clone(), permissions)?;
782 798
799 + // Preserve original refresh token duration (remember me tokens stay long-lived)
800 + let original_duration_days = (old_token.expires_at - old_token.created_at).num_days();
801 + let rt_expiration_days = original_duration_days
802 + .min(auth_config.remember_me_expiration_days)
803 + .max(auth_config.refresh_token_expiration_days);
804 +
783 805 // Generate new refresh token (rotation)
784 806 let new_created_rt = RefreshTokenService::create_refresh_token(
785 807 &db,
786 808 user.id,
787 - auth_config.refresh_token_expiration_days,
809 + rt_expiration_days,
788 810 )
789 811 .await?;
790 812
@@ -792,19 +814,47 @@ pub async fn refresh_token(
792 814 RefreshTokenService::mark_as_replaced(&db, old_token.id, new_created_rt.model.id).await?;
793 815
794 816 tracing::info!(
795 - "User {} refreshed tokens successfully (rotation complete)",
796 - user.username
817 + "User {} refreshed tokens successfully (rotation complete, refresh duration={}d)",
818 + user.username,
819 + rt_expiration_days
797 820 );
798 821
799 822 // Build response with new tokens
800 823 let response = RefreshResponse {
801 - access_token,
824 + access_token: access_token.clone(),
802 825 refresh_token: Some(new_created_rt.plain_token),
803 826 token_type: "Bearer".to_string(),
804 827 expires_in: auth_config.jwt_expiration_minutes * 60,
828 + refresh_expires_in: rt_expiration_days * 86400,
805 829 };
806 830
807 - Ok(Json(response))
831 + // Set JWT cookie (same as login) so web clients get the new access token automatically
832 + let same_site = match auth_config.cookie_same_site.to_lowercase().as_str() {
833 + "strict" => axum_extra::extract::cookie::SameSite::Strict,
834 + "lax" => axum_extra::extract::cookie::SameSite::Lax,
835 + "none" => axum_extra::extract::cookie::SameSite::None,
836 + _ => axum_extra::extract::cookie::SameSite::Strict,
837 + };
838 +
839 + let cookie = axum_extra::extract::cookie::Cookie::build(("jwt_token", access_token))
840 + .http_only(true)
841 + .same_site(same_site)
842 + .secure(auth_config.cookie_secure)
843 + .path("/")
844 + .max_age(Duration::seconds(auth_config.jwt_expiration_minutes * 60));
845 +
846 + let json_response: Response = Json(response).into_response();
847 + let (mut parts, body) = json_response.into_parts();
848 +
849 + parts.headers.append(
850 + axum::http::header::SET_COOKIE,
851 + cookie
852 + .to_string()
853 + .parse()
854 + .map_err(|e| AppError::Internal(format!("Failed to create cookie header: {}", e)))?,
855 + );
856 +
857 + Ok(Response::from_parts(parts, body))
808 858 }
809 859
810 860 #[cfg(test)]
M crates/rustwarden-core/src/config/auth.rs
+30 -0
@@ -37,6 +37,9 @@ pub struct AuthConfig {
37 37 pub jwt_expiration_minutes: i64,
38 38 pub jwt_issuer: String,
39 39 pub refresh_token_expiration_days: i64,
40 + /// Durée du refresh token quand "remember me" est activé.
41 + /// Variable : REMEMBER_ME_EXPIRATION_DAYS (défaut : 30)
42 + pub remember_me_expiration_days: i64,
40 43 pub session_timeout_minutes: i64,
41 44 pub session_backend: SessionBackend,
42 45 pub redis_url: Option<String>,
@@ -87,6 +90,32 @@ impl AuthConfig {
87 90 .and_then(|v| v.parse::<i64>().ok())
88 91 .unwrap_or(7);
89 92
93 + let remember_me_expiration_days = env::var("REMEMBER_ME_EXPIRATION_DAYS")
94 + .ok()
95 + .and_then(|v| v.parse::<i64>().ok())
96 + .unwrap_or(30);
97 +
98 + if remember_me_expiration_days < refresh_token_expiration_days {
99 + return Err(format!(
100 + "REMEMBER_ME_EXPIRATION_DAYS ({}) must be >= REFRESH_TOKEN_EXPIRATION_DAYS ({})",
101 + remember_me_expiration_days, refresh_token_expiration_days
102 + ));
103 + }
104 +
105 + if remember_me_expiration_days > 90 {
106 + return Err(format!(
107 + "REMEMBER_ME_EXPIRATION_DAYS ({}) must be <= 90 days",
108 + remember_me_expiration_days
109 + ));
110 + }
111 +
112 + if remember_me_expiration_days > 60 {
113 + tracing::warn!(
114 + "REMEMBER_ME_EXPIRATION_DAYS={} is greater than 60 days. Consider reducing for security.",
115 + remember_me_expiration_days
116 + );
117 + }
118 +
90 119 let session_timeout_minutes = env::var("SESSION_TIMEOUT_MINUTES")
91 120 .ok()
92 121 .and_then(|v| v.parse::<i64>().ok())
@@ -164,6 +193,7 @@ impl AuthConfig {
164 193 jwt_expiration_minutes,
165 194 jwt_issuer,
166 195 refresh_token_expiration_days,
196 + remember_me_expiration_days,
167 197 session_timeout_minutes,
168 198 session_backend,
169 199 redis_url,
A crates/rustwarden-ui/locales/de.yml
+548 -0
@@ -0,0 +1,548 @@
1 +# Deutsche Übersetzungen — rustwarden-ui
2 +# UI-spezifische Abschnitte (Seiten, Formulare, Navigation, Admin-Panels)
3 +
4 +# Anmeldung
5 +login:
6 + title: "Anmeldung"
7 + page_title: "Anmeldung - RustCloud"
8 + page_description: "Anmeldung bei RustCloud"
9 + subtitle: "Melden Sie sich in Ihrem Cloud-Bereich an"
10 + username: "Benutzername"
11 + password: "Passwort"
12 + submit: "Anmelden"
13 + remember_me: "Angemeldet bleiben"
14 + tab_login: "Anmeldung"
15 + tab_register: "Registrierung"
16 + register_title: "Konto erstellen"
17 + register_submit: "Mein Konto erstellen"
18 + username_placeholder: "Ihr Benutzername"
19 + password_placeholder: "Ihr Passwort"
20 + username_placeholder_register: "Ihr Benutzername (min. 3 Zeichen)"
21 + password_placeholder_register: "Ihr Passwort (min. 8 Zeichen)"
22 + email_placeholder: "ihre@email.de"
23 + forgot_password: "Passwort vergessen?"
24 + email_not_verified: "E-Mail nicht verifiziert?"
25 + resend_verification: "Bestätigungs-E-Mail erneut senden"
26 + already_have_account: "Bereits ein Konto?"
27 + sign_in_link: "Anmelden"
28 + success_message: "Anmeldung erfolgreich! Weiterleitung..."
29 + error_message: "Anmeldefehler. Überprüfen Sie Ihre Anmeldedaten."
30 + email_unverified_message: "Ihre E-Mail ist nicht verifiziert. Klicken Sie unten, um den Link erneut zu senden."
31 + resend_button: "Bestätigungs-E-Mail erneut senden"
32 + resend_success: "Bestätigungs-E-Mail gesendet, falls das Konto existiert."
33 + resend_error: "Anfrage kann derzeit nicht gesendet werden."
34 + resend_prompt: "Bitte geben Sie Ihre E-Mail ein, bevor Sie erneut senden."
35 + register_success: "Konto erfolgreich erstellt! Bitte überprüfen Sie Ihre E-Mail."
36 + register_error: "Registrierungsfehler"
37 + email_label: "E-Mail"
38 + footer_text: "Nextcloud Fork in Rust"
39 +
40 +# Bestätigungs-E-Mail erneut senden
41 +resend_verification:
42 + page_title: "Bestätigungs-E-Mail erneut senden - RustWarden"
43 + title: "Bestätigungs-E-Mail erneut senden"
44 + subtitle: "Geben Sie Ihre E-Mail-Adresse ein, um einen neuen Bestätigungslink zu erhalten."
45 + email_label: "E-Mail-Adresse"
46 + email_placeholder: "sie@beispiel.de"
47 + submit: "Bestätigungslink senden"
48 + back_to_login: "Zurück zur Anmeldung"
49 + error_default: "Die Anfrage konnte nicht gesendet werden."
50 + success_default: "Wenn das Konto existiert und nicht verifiziert ist, wurde eine E-Mail gesendet."
51 + error_missing_email: "Bitte geben Sie Ihre E-Mail ein."
52 + error_cannot_send: "Die Anfrage kann derzeit nicht gesendet werden."
53 +
54 +# Passwort zurücksetzen (über E-Mail-Link)
55 +password_reset:
56 + page_title: "Passwort zurücksetzen"
57 + title: "Passwort zurücksetzen"
58 + subtitle: "Geben Sie unten Ihr neues Passwort ein."
59 + new_password_label: "Neues Passwort"
60 + new_password_placeholder: "Neues sicheres Passwort"
61 + requirements: "⚠️ Muss enthalten: 8+ Zeichen, Großbuchstabe, Kleinbuchstabe, Ziffer, Sonderzeichen"
62 + confirm_password_label: "Passwort bestätigen"
63 + confirm_password_placeholder: "Bestätigen Sie Ihr neues Passwort"
64 + missing_token_url: "Zurücksetzungs-Token fehlt in der URL."
65 + missing_token: "Zurücksetzungs-Token fehlt."
66 + missing_new_password: "Bitte geben Sie ein neues Passwort ein."
67 + passwords_not_match: "Die Passwörter stimmen nicht überein."
68 + success_message: "Ihr Passwort wurde erfolgreich zurückgesetzt. Sie können sich jetzt anmelden."
69 + error_link_invalid: "Das Passwort konnte nicht zurückgesetzt werden. Der Link ist möglicherweise abgelaufen oder ungültig."
70 + error_generic: "Das Passwort kann derzeit nicht zurückgesetzt werden."
71 +
72 +# Einstellungen
73 +settings:
74 + title: "Einstellungen"
75 + page_title: "Einstellungen - RustWarden"
76 + subtitle: "Verwalten Sie Ihre Präferenzen und Kontoeinstellungen"
77 + profile_title: "Mein Profil"
78 + profile_desc: "Bearbeiten Sie Ihre persönlichen Informationen (Benutzername, E-Mail)"
79 + password_title: "Passwort"
80 + password_desc: "Ändern Sie Ihr Passwort, um Ihr Konto zu sichern"
81 + sessions_title: "Aktive Sitzungen"
82 + sessions_desc: "Verwalten Sie Ihre aktiven Sitzungen und widerrufen Sie den Zugriff von anderen Geräten"
83 + preferences_title: "Präferenzen"
84 + preferences_desc: "Passen Sie Ihre Erfahrung an (Design, Sprache)"
85 + access: "Zugriff"
86 + info_title: "Informationen"
87 + info_desc: "Verwenden Sie die obigen Abschnitte, um verschiedene Aspekte Ihres Kontos zu verwalten. Alle Änderungen sind sicher und erfordern Ihre Authentifizierung."
88 + language: "Sprache"
89 + language_description: "Wählen Sie Ihre bevorzugte Sprache"
90 + save: "Speichern"
91 + saved: "Einstellungen gespeichert"
92 +
93 +# Startseite
94 +home:
95 + welcome: "Willkommen, {username}!"
96 + subtitle: "Willkommen in Ihrem persönlichen Bereich"
97 + my_account: "Mein Konto"
98 + stat_username: "Benutzername"
99 + stat_email: "E-Mail"
100 + stat_member_since: "Mitglied seit"
101 + stat_roles: "Rollen"
102 +
103 +# Präferenzen
104 +preferences:
105 + title: "Anzeigeeinstellungen"
106 + page_title: "Anzeigeeinstellungen - RustCloud"
107 + subtitle: "Passen Sie das Erscheinungsbild der Benutzeroberfläche an"
108 + theme: "Design"
109 + theme_light: "Hell"
110 + theme_light_desc: "Helle und saubere Benutzeroberfläche"
111 + theme_dark: "Dunkel"
112 + theme_dark_desc: "Reduziert Augenbelastung"
113 + theme_auto: "Automatisch"
114 + theme_auto_desc: "Passt sich der Tageszeit an"
115 + theme_preview: "Das Design wird sofort nach dem Speichern angewendet"
116 + language: "Sprache"
117 + language_fr: "Français"
118 + language_fr_desc: "Benutzeroberfläche auf Französisch"
119 + language_en: "English"
120 + language_en_desc: "Englische Benutzeroberfläche"
121 + language_de: "Deutsch"
122 + language_de_desc: "Deutsche Benutzeroberfläche"
123 + language_es: "Español"
124 + language_es_desc: "Spanische Benutzeroberfläche"
125 + translation_warning: "Die vollständige Übersetzung der Benutzeroberfläche befindet sich in der Entwicklung. Einige Elemente können auf Französisch bleiben."
126 + modified: "Einstellungen geändert"
127 + modified_desc: "Speichern Sie Ihre Änderungen, um sie anzuwenden"
128 + save: "Einstellungen speichern"
129 + saving: "Speichern..."
130 + cancel: "Abbrechen"
131 + saved_success: "Einstellungen erfolgreich gespeichert!"
132 + saved_reload: "Einstellungen erfolgreich gespeichert!\n\nDie Sprache wurde geändert. Möchten Sie die Seite jetzt neu laden, um die Änderungen anzuwenden?"
133 + error: "Fehler: {message}"
134 + network_error: "Netzwerkfehler. Bitte versuchen Sie es erneut."
135 + sync_title: "Ihre Einstellungen sind synchronisiert"
136 + sync_desc: "Ihre Anzeigeeinstellungen werden gespeichert und automatisch auf allen Geräten angewendet, die mit Ihrem RustCloud-Konto verbunden sind."
137 + preview_dark: "Vorschau: Dunkles Design wird angewendet"
138 + preview_light: "Vorschau: Helles Design wird angewendet"
139 + preview_auto: "Vorschau: Automatisches Design wird angewendet"
140 +
141 +# Profil
142 +profile:
143 + title: "Mein Profil"
144 + page_title: "Mein Profil - RustCloud"
145 + subtitle: "Bearbeiten Sie Ihre persönlichen Informationen"
146 + account_info: "Kontoinformationen"
147 + username: "Benutzername"
148 + username_public: "Öffentlich sichtbar"
149 + username_placeholder: "Ihr Benutzername"
150 + username_pattern: "Nur Buchstaben, Zahlen, Bindestriche und Unterstriche"
151 + email: "E-Mail"
152 + email_placeholder: "ihre@email.de"
153 + save: "Änderungen speichern"
154 + saving: "Speichern..."
155 + saved: "Profil erfolgreich aktualisiert"
156 + error: "Fehler beim Aktualisieren des Profils"
157 + email_label: "E-Mail-Adresse"
158 + email_used_for: "Wird für die Anmeldung verwendet"
159 + email_warning: "⚠️ Sie werden nach der Änderung abgemeldet"
160 + email_change_info: "E-Mail-Änderungen erfordern aus Sicherheitsgründen eine erneute Anmeldung."
161 + username_help: "3-50 Zeichen (Buchstaben, Zahlen, -, _)"
162 + additional_info: "Zusätzliche Informationen"
163 + account_created: "Konto erstellt am"
164 + roles: "Rollen"
165 + linked_accounts_title: "Verknüpfte Konten"
166 + no_linked_accounts: "Keine externen Konten verknüpft."
167 + linked_since: "Verknüpft seit"
168 + unlink_button: "Trennen"
169 + unlink_confirm: "Möchten Sie dieses Konto wirklich trennen?"
170 + unlink_error: "Dieses Konto konnte nicht getrennt werden."
171 + cannot_unlink_last: "Ihre letzte Authentifizierungsmethode kann nicht entfernt werden."
172 +
173 +# Breadcrumb
174 +breadcrumb:
175 + home: "Startseite"
176 + settings: "Einstellungen"
177 + admin: "Verwaltung"
178 + preferences: "Präferenzen"
179 + profile: "Profil"
180 + password: "Passwort"
181 + sessions: "Sitzungen"
182 +
183 +# Admin
184 +admin:
185 + dashboard:
186 + title: "Verwaltung"
187 + heading: "Administrator-Dashboard"
188 + users_card_title: "Benutzer"
189 + users_card_subtitle: "Benutzer gesamt"
190 + access_button: "Zugreifen"
191 + sessions_card_title: "Aktive Sitzungen"
192 + sessions_card_subtitle: "Laufende Sitzungen"
193 + admins_card_title: "Administratoren"
194 + admins_card_subtitle: "Admin-Konten"
195 + last_activity_card_title: "Letzte Aktivität"
196 + last_activity_card_subtitle: "Letzte Anmeldung"
197 + audit_section_title: "Audit-Log-Statistiken"
198 + audit_total_logs: "Logs gesamt"
199 + audit_last_24h: "Letzte 24h"
200 + audit_by_level: "Nach Stufe"
201 + chart_label: "Logs nach Stufe"
202 + roles_card_title: "Rollenverwaltung"
203 + roles_card_desc: "Rollen und granulare Berechtigungen verwalten"
204 + roles_stat_title: "Rollen"
205 + settings_card_title: "Anwendungseinstellungen"
206 + settings_card_desc: "Globale Anwendungseinstellungen konfigurieren"
207 + apps_card_title: "Anwendungsverwaltung"
208 + apps_card_desc: "Modulare Anwendungen aktivieren oder deaktivieren"
209 + orgs_card_title: "Organisationsverwaltung"
210 + orgs_card_desc: "Organisationen und deren Mitglieder erstellen und verwalten"
211 + orgs_stat_title: "Organisationen"
212 + orgs_members_stat_title: "Mitglieder gesamt"
213 + roles_list:
214 + page_title: "Rollenverwaltung"
215 + breadcrumb_roles: "Rollen"
216 + title: "Rollen"
217 + create_role: "Rolle erstellen"
218 + table_name: "Name"
219 + table_description: "Beschreibung"
220 + table_users: "Benutzer"
221 + table_permissions: "Berechtigungen"
222 + table_actions: "Aktionen"
223 + edit: "Bearbeiten"
224 + delete: "Löschen"
225 + no_roles: "Keine Rollen gefunden."
226 + protected_hint: "Geschützt"
227 + delete_confirm_title: "Löschen bestätigen"
228 + delete_confirm_message: "Möchten Sie die Rolle wirklich löschen"
229 + delete_button: "Löschen"
230 + role_form:
231 + title_create: "Rolle erstellen"
232 + title_edit: "Rolle bearbeiten"
233 + breadcrumb_create: "Erstellen"
234 + breadcrumb_edit: "Bearbeiten"
235 + back_to_list: "Zurück zur Liste"
236 + name_label: "Rollenname"
237 + name_placeholder: "z.B. moderator"
238 + description_label: "Beschreibung"
239 + description_placeholder: "Rollenbeschreibung..."
240 + permissions_label: "Berechtigungen"
241 + protected_name_hint: "Der Name dieser Rolle kann nicht geändert werden."
242 + cancel: "Abbrechen"
243 + submit_create: "Rolle erstellen"
244 + submit_edit: "Änderungen speichern"
245 + errors:
246 + title: "Fehlercodes"
247 + description: "Dokumentation der Anwendungsfehlercodes. Jeder Fehlercode ist mit einer Middleware verknüpft und liefert Kontextinformationen für die Fehlersuche."
248 + breadcrumb_errors: "Fehlercodes"
249 + table_code: "Code"
250 + table_description: "Beschreibung"
251 + table_category: "Kategorie"
252 + table_middleware: "Middleware"
253 + table_context: "Kontext"
254 + table_example: "Beispiel"
255 + legend_title: "Legende"
256 + legend_code: "Eindeutige Fehler-ID (Format: CATEGORY_NUMBER)"
257 + legend_description: "Beschreibung des Fehlers"
258 + legend_category: "Fehlertyp (Authentifizierung, CSRF, Rate Limiting, etc.)"
259 + legend_middleware: "Middleware, die diesen Fehler erzeugt"
260 + legend_context: "Detaillierte Erklärung, wann dieser Fehler auftritt"
261 + legend_example: "Konkretes Beispiel einer Situation, die diesen Fehler erzeugt"
262 + error_auth001_desc: "Ungültige Anmeldedaten"
263 + error_auth001_category: "Authentifizierung"
264 + error_auth001_context: "Der Benutzer hat bei der Anmeldung falsche Anmeldedaten eingegeben"
265 + error_auth001_example: "Anmeldeversuch mit falschem Passwort"
266 + error_auth002_desc: "Ungültiges Token"
267 + error_auth002_category: "Authentifizierung"
268 + error_auth002_context: "Das bereitgestellte JWT-Token ist ungültig oder fehlerhaft"
269 + error_auth002_example: "Beschädigtes JWT-Token oder mit anderem Schlüssel signiert"
270 + error_auth003_desc: "Token abgelaufen"
271 + error_auth003_category: "Authentifizierung"
272 + error_auth003_context: "Das JWT-Token ist abgelaufen und muss erneuert werden"
273 + error_auth003_example: "Zugriffsversuch mit abgelaufenem Token nach der Gültigkeitsdauer"
274 + error_csrf001_desc: "CSRF-Token fehlt"
275 + error_csrf001_category: "CSRF-Schutz"
276 + error_csrf001_context: "Die POST/PUT/DELETE-Anfrage enthält kein CSRF-Token"
277 + error_csrf001_example: "Formular ohne CSRF-Token im Header oder Body abgesendet"
278 + error_csrf002_desc: "Ungültiges CSRF-Token"
279 + error_csrf002_category: "CSRF-Schutz"
280 + error_csrf002_context: "Das bereitgestellte CSRF-Token stimmt nicht mit dem Sitzungs-Token überein"
281 + error_csrf002_example: "Geändertes oder gestohlenes CSRF-Token"
282 + error_rate001_desc: "Ratenlimit überschritten"
283 + error_rate001_category: "Rate Limiting"
284 + error_rate001_context: "Die Anzahl der Anfragen pro Minute wurde überschritten"
285 + error_rate001_example: "Mehr als 100 Anfragen/Min auf Admin-Endpunkten"
286 + error_valid001_desc: "Ungültige Eingabedaten"
287 + error_valid001_category: "Validierung"
288 + error_valid001_context: "Die bereitgestellten Daten entsprechen nicht den Validierungsregeln"
289 + error_valid001_example: "Ungültiges E-Mail-Format oder fehlendes Pflichtfeld"
290 + error_valid002_desc: "Passwortkomplexität nicht erfüllt"
291 + error_valid002_category: "Validierung"
292 + error_valid002_context: "Das Passwort erfüllt nicht die konfigurierten Komplexitätsregeln"
293 + error_valid002_example: "Passwort zu kurz oder fehlende erforderliche Zeichen"
294 + error_rbac001_desc: "Unzureichende Berechtigungen"
295 + error_rbac001_category: "Autorisierung"
296 + error_rbac001_context: "Der Benutzer hat nicht die erforderlichen Berechtigungen für diese Aktion"
297 + error_rbac001_example: "Nicht-Admin-Benutzer versucht auf /admin/users zuzugreifen"
298 + error_rbac002_desc: "Administratorrolle erforderlich"
299 + error_rbac002_category: "Autorisierung"
300 + error_rbac002_context: "Die Aktion erfordert eine Administratorrolle"
301 + error_rbac002_example: "Versuch einen Benutzer ohne Admin-Rolle zu löschen"
302 + error_db001_desc: "Datenbankoperationsfehler"
303 + error_db001_category: "Datenbank"
304 + error_db001_context: "Eine Datenbankoperation ist fehlgeschlagen"
305 + error_db001_example: "Fremdschlüssel-Constraint verletzt oder DB-Verbindung verloren"
306 + error_db002_desc: "Ressource nicht gefunden"
307 + error_db002_category: "Datenbank"
308 + error_db002_context: "Die angeforderte Ressource existiert nicht in der Datenbank"
309 + error_db002_example: "Benutzer mit nicht existierender ID"
310 + user_form:
311 + breadcrumb_create: "Erstellen"
312 + breadcrumb_edit: "Bearbeiten"
313 + title_create: "Benutzer erstellen"
314 + title_edit: "Benutzer bearbeiten"
315 + back_to_list: "Zurück zur Liste"
316 + username_label: "Benutzername"
317 + username_placeholder: "benutzername"
318 + username_readonly_hint: "Der Benutzername kann nach der Erstellung nicht geändert werden"
319 + email_label: "E-Mail"
320 + email_placeholder: "benutzer@example.com"
321 + password_label: "Passwort"
322 + password_optional: "Optional"
323 + password_placeholder: "Leer lassen, um ein zufälliges Passwort zu generieren"
324 + password_hint: "Wenn leer gelassen, wird automatisch ein sicheres Passwort generiert"
325 + roles_label: "Rollen"
326 + roles_hint: "Wählen Sie mindestens eine Rolle"
327 + must_change_password_label: "Passwortänderung erzwingen"
328 + must_change_password_desc: "Der Benutzer muss sein Passwort bei der nächsten Anmeldung ändern"
329 + cancel: "Abbrechen"
330 + submit_create: "Benutzer erstellen"
331 + submit_edit: "Änderungen speichern"
332 + settings:
333 + title: "Anwendungseinstellungen"
334 + page_title: "Anwendungseinstellungen - Admin - RustCloud"
335 + subtitle: "Globale RustCloud-Konfiguration"
336 + general: "Allgemein"
337 + app_name: "Anwendungsname"
338 + app_domain: "Domäne"
339 + app_domain_placeholder: "example.com"
340 + app_description: "Beschreibung"
341 + allow_registration: "Registrierung erlauben"
342 + allow_registration_desc: "Benutzer können Konten von der Startseite aus erstellen"
343 + email_validation_required: "E-Mail-Validierung erforderlich"
344 + email_validation_required_desc: "Benutzer müssen ihre E-Mail validieren, bevor sie sich anmelden können"
345 + save: "Einstellungen speichern"
346 + cancel: "Abbrechen"
347 + saved: "Einstellungen erfolgreich gespeichert"
348 + error: "Fehler beim Speichern der Einstellungen"
349 + network_error: "Netzwerkfehler. Bitte versuchen Sie es erneut."
350 + password_security: "Passwortsicherheit"
351 + password_min_length: "Mindestlänge"
352 + password_min_length_hint: "Zwischen 6 und 128 Zeichen"
353 + password_complexity: "Komplexitätsanforderungen"
354 + require_uppercase: "Großbuchstabe erforderlich"
355 + require_lowercase: "Kleinbuchstabe erforderlich"
356 + require_digits: "Ziffer erforderlich"
357 + require_special: "Sonderzeichen erforderlich"
358 + password_change_require_email: "E-Mail-Bestätigung für Passwortänderung"
359 + password_change_require_email_desc: "Wenn aktiviert, wird eine Bestätigungs-E-Mail gesendet, um jede Passwortänderung zu validieren. Andernfalls wird die Änderung sofort angewendet."
360 + password_expiration: "Passwortablauf"
361 + password_expiration_desc: "Periodische Passwortänderung erzwingen"
362 + expiration_days: "Ablauf nach (Tagen)"
363 + expiration_alert: "E-Mail-Warnung vor Ablauf"
364 + expiration_alert_days: "Warnung (Tage vorher)"
365 + audit_logging: "Audit-Protokollierung"
366 + log_level: "Protokollebene"
367 + log_level_debug: "DEBUG - Alle Details"
368 + log_level_info: "INFO - Normale Informationen"
369 + log_level_warn: "WARN - Nur Warnungen"
370 + log_level_error: "ERROR - Nur Fehler"
371 + log_level_hint: "Steuert die Ausführlichkeit der Audit-Logs"
372 + log_retention: "Log-Aufbewahrung (Tage)"
373 + log_retention_hint: "Aufbewahrungsdauer der Logs (1-365 Tage)"
374 + audit_info_message: "Audit-Logs zeichnen alle administrativen Aktionen auf (Erstellung, Änderung, Löschung von Benutzern)."
375 + save_changes: "Änderungen speichern"
376 + save_changes_desc: "Einstellungen werden sofort angewendet"
377 + saving: "Speichern..."
378 + save_success: "Einstellungen erfolgreich gespeichert!"
379 + save_error_prefix: "Fehler"
380 + # OAuth / SSO admin settings
381 + oauth_sso_title: "OAuth / SSO"
382 + oauth_enabled_label: "OAuth aktivieren"
383 + oauth_enabled_desc: "Anmeldung über externe Anbieter erlauben (Google, GitHub, etc.)"
384 + oauth_redirect_url_label: "Basis-Weiterleitungs-URL"
385 + oauth_redirect_url_desc: "Basis-URL für OAuth-Callbacks (z.B. https://meineapp.example.com)"
386 + oauth_auto_register_label: "Automatische Registrierung"
387 + oauth_auto_register_desc: "Automatisch ein Konto erstellen, wenn die E-Mail nicht existiert"
388 + oauth_link_existing_label: "Bestehende Konten verknüpfen"
389 + oauth_link_existing_desc: "Automatisch ein OAuth-Konto verknüpfen, wenn die verifizierte E-Mail übereinstimmt"
390 + oauth_client_id: "Client-ID"
391 + oauth_client_secret: "Client-Secret"
392 + oauth_tenant: "Mandanten-ID"
393 + oauth_redirect_uri: "Weiterleitungs-URI"
394 + oauth_copy_uri: "Kopieren"
395 + oauth_secret_configured: "Konfiguriert"
396 + oauth_secret_not_configured: "Nicht konfiguriert"
397 + oauth_secret_change: "Ändern"
398 + oauth_restart_warning: "Änderungen an Anmeldedaten erfordern einen Neustart der Anwendung."
399 + oauth_env_info: "Anmeldedaten können auch über Umgebungsvariablen gesetzt werden (OAUTH_*_CLIENT_ID, etc.)."
400 + oauth_google_label: "Google"
401 + oauth_google_desc: "OpenID Connect"
402 + oauth_github_label: "GitHub"
403 + oauth_github_desc: "OAuth2"
404 + oauth_discord_label: "Discord"
405 + oauth_discord_desc: "OAuth2"
406 + oauth_microsoft_label: "Microsoft"
407 + oauth_microsoft_desc: "OpenID Connect"
408 + users_list:
409 + page_title: "Benutzerverwaltung - Admin - RustCloud"
410 + title: "Benutzerverwaltung"
411 + breadcrumb_users: "Benutzer"
412 + create_user: "Benutzer erstellen"
413 + search_label: "Suchen"
414 + search_placeholder: "Benutzername oder E-Mail..."
415 + role_filter_label: "Rolle"
416 + all_roles: "Alle Rollen"
417 + per_page_label: "Pro Seite"
418 + search_button: "Suchen"
419 + results_summary: "Anzeige von {count} Benutzer(n) von {total} insgesamt"
420 + page_info: "Seite {page} von {total_pages}"
421 + table_username: "Benutzername"
422 + table_email: "E-Mail"
423 + table_roles: "Rollen"
424 + table_created_at: "Erstellt am"
425 + table_last_login: "Letzte Anmeldung"
426 + table_actions: "Aktionen"
427 + never: "Nie"
428 + edit: "Bearbeiten"
429 + no_users: "Keine Benutzer gefunden"
430 + reset_password_title: "Passwort zurücksetzen"
431 + reset_generate: "Zufälliges Passwort generieren"
432 + reset_custom: "Benutzerdefiniertes Passwort festlegen"
433 + reset_new_password_label: "Neues Passwort"
434 + reset_new_password_placeholder: "Mindestens 8 Zeichen, Großbuchstabe, Kleinbuchstabe, Ziffer, Sonderzeichen"
435 + reset_password_requirements: "⚠️ Muss enthalten: 8+ Zeichen, Großbuchstabe, Kleinbuchstabe, Ziffer, Sonderzeichen"
436 + reset_invalidate_sessions: "Alle aktiven Sitzungen für diesen Benutzer ungültig machen"
437 + reset_invalidate_sessions_desc: "Der Benutzer muss sich nach der Änderung erneut anmelden"
438 + reset_button: "Zurücksetzen"
439 + delete_confirm_title: "⚠️ Löschung bestätigen"
440 + delete_confirm_message: "Sind Sie sicher, dass Sie diesen Benutzer löschen möchten?"
441 + delete_confirm_username: "Benutzername:"
442 + delete_confirm_email: "E-Mail:"
443 + delete_irreversible: "Diese Aktion ist unwiderruflich!"
444 + delete_button: "Endgültig löschen"
445 + delete: "Löschen"
446 + delete_error: "Fehler beim Löschen des Benutzers"
447 + network_error: "Netzwerkfehler"
448 + edit_user_title: "Benutzer bearbeiten"
449 + resetting: "Zurücksetzen..."
450 + reset_by_email_title: "Zurücksetzen per E-Mail"
451 + reset_email: "Per E-Mail zurücksetzen"
452 + close: "Schließen"
453 + password_reset_success_title: "Passwort zurückgesetzt"
454 + password_warning_once: "Dieses Passwort wird nur einmal angezeigt. Kopieren Sie es jetzt!"
455 + new_password_label: "Neues Passwort"
456 + copy: "Kopieren"
457 + password_copied: "Passwort in die Zwischenablage kopiert"
458 + password_set_success: "Passwort erfolgreich zurückgesetzt"
459 + reset_error: "Fehler beim Zurücksetzen des Passworts"
460 +
461 +# Passwort ändern
462 +password:
463 + title: "Mein Passwort ändern"
464 + page_title: "Mein Passwort ändern - RustCloud"
465 + subtitle: "Ändern Sie Ihr Passwort, um Ihr Konto zu sichern. Eine Bestätigungs-E-Mail wird gesendet, um die Änderung zu validieren."
466 + subtitle_no_email: "Ändern Sie Ihr Passwort, um Ihr Konto zu sichern."
467 + must_change_message: "⚠️ Sie müssen Ihr Passwort ändern, bevor Sie fortfahren können."
468 + new_password: "Neues Passwort"
469 + current_password: "Aktuelles Passwort"
470 + current_password_placeholder: "Ihr aktuelles Passwort"
471 + new_password_placeholder: "Sicheres neues Passwort"
472 + required: "Erforderlich"
473 + requirements: "📌 Anforderungen: 8+ Zeichen, Großbuchstabe, Kleinbuchstabe, Ziffer, Sonderzeichen"
474 + strength: "Passwortstärke:"
475 + strength_weak: "Schwach"
476 + strength_medium: "Mittel"
477 + strength_strong: "Stark ✓"
478 + strength_too_short: "zu kurz"
479 + strength_missing_lowercase: "Kleinbuchstabe fehlt"
480 + strength_missing_uppercase: "Großbuchstabe fehlt"
481 + strength_missing_digit: "Ziffer fehlt"
482 + strength_missing_special: "Sonderzeichen fehlt"
483 + confirm_password: "Neues Passwort bestätigen"
484 + confirm_password_placeholder: "Wiederholen Sie das neue Passwort"
485 + passwords_match: "✓ Passwörter stimmen überein"
486 + passwords_not_match: "✗ Passwörter stimmen nicht überein"
487 + change_button: "Passwort ändern"
488 + changing: "Änderung läuft..."
489 + logout_warning_title: "Abmeldung von anderen Sitzungen"
490 + logout_warning_desc: "Alle Ihre anderen aktiven Sitzungen werden nach der Passwortänderung automatisch abgemeldet. Nur Ihre aktuelle Sitzung bleibt aktiv."
491 + save: "Neues Passwort speichern"
492 + saving: "Speichern..."
493 + saved: "Eine Bestätigungs-E-Mail wurde an Ihre Adresse gesendet. Klicken Sie auf den Link in der E-Mail, um die Passwortänderung zu bestätigen."
494 + saved_direct: "Passwort erfolgreich geändert! Ihre anderen Sitzungen wurden abgemeldet."
495 + error: "Fehler beim Ändern des Passworts"
496 + error_all_fields_required: "Alle Felder sind erforderlich."
497 + error_empty_data: "Die zu sendenden Daten sind leer."
498 + error_invalid_data: "Ungültige Daten. Überprüfen Sie, ob alle Felder ausgefüllt sind."
499 + error_incorrect_current: "Aktuelles Passwort ist falsch."
500 + error_reading_response: "Fehler beim Lesen der Serverantwort"
501 + error_415: "Fehler 415: Der Server hat die Daten nicht im erwarteten JSON-Format erhalten. Bitte versuchen Sie es erneut."
502 + network_error: "Netzwerkfehler. Bitte versuchen Sie es erneut."
503 + security_tips_title: "Sicherheitstipps"
504 + security_tip_unique: "Verwenden Sie ein eindeutiges Passwort, das Sie nicht anderswo verwenden"
505 + security_tip_share: "Teilen Sie Ihr Passwort niemals mit jemandem"
506 + security_tip_regular: "Ändern Sie Ihr Passwort regelmäßig (alle 3-6 Monate)"
507 + security_tip_2fa: "Aktivieren Sie die Zwei-Faktor-Authentifizierung, falls verfügbar"
508 + security_tip_manager: "Verwenden Sie einen Passwort-Manager für mehr Sicherheit"
509 +
510 +# Sitzungen
511 +sessions:
512 + title: "Aktive Sitzungen"
513 + page_title: "Aktive Sitzungen - RustCloud"
514 + subtitle: "Verwalten Sie Geräte, die mit Ihrem Konto verbunden sind"
515 + current_session: "Aktuelle Sitzung"
516 + current_badge: "Aktuell"
517 + unknown_device: "Unbekanntes Gerät"
518 + ip_address: "IP-Adresse:"
519 + created_at: "Erstellt am:"
520 + last_activity: "Letzte Aktivität:"
521 + session_id: "Sitzungs-ID:"
522 + revoke: "Widerrufen"
523 + revoke_confirm: "Sind Sie sicher, dass Sie die Sitzung für \"{device}\" widerrufen möchten?\n\nDieses Gerät wird sofort getrennt."
524 + revoke_success: "Sitzung erfolgreich widerrufen!"
525 + revoke_error: "Fehler beim Widerrufen der Sitzung"
526 + no_sessions: "Keine aktiven Sitzungen"
527 + no_sessions_desc: "Sie haben derzeit keine aktiven Sitzungen"
528 + danger_zone: "Gefahrenzone"
529 + danger_zone_desc: "Trennen Sie alle anderen Geräte in einer Aktion (Ihre aktuelle Sitzung bleibt aktiv)."
530 + revoke_all: "Alle anderen Sitzungen widerrufen"
531 + revoke_all_confirm: "⚠️ WARNUNG\n\nSind Sie sicher, dass Sie ALLE Ihre anderen Sitzungen widerrufen möchten?\n\nAlle Ihre anderen Geräte werden getrennt. Nur Ihre aktuelle Sitzung bleibt aktiv."
532 + revoke_all_success: "Alle anderen Sitzungen wurden widerrufen!"
533 + revoke_all_error: "Fehler beim Widerrufen. Einige Sitzungen wurden möglicherweise nicht widerrufen."
534 + about_title: "Über Sitzungen"
535 + about_desc: "Eine Sitzung wird bei jeder Anmeldung von einem anderen Gerät oder Browser erstellt. Das Widerrufen einer Sitzung trennt dieses Gerät sofort. Ihre aktuelle Sitzung kann von dieser Seite nicht widerrufen werden (melden Sie sich ab, um dies zu tun)."
536 + back_to_settings: "Zurück zu den Einstellungen"
537 +
538 +# Navigation menu (navbar)
539 +nav:
540 + home: "Startseite"
541 + settings: "Einstellungen"
542 + admin: "Administration"
543 +
544 +# User menu
545 +user_menu:
546 + profile: "Profil"
547 + logout: "Abmelden"
548 + settings: "Einstellungen"
A crates/rustwarden-ui/locales/en.yml
+555 -0
@@ -0,0 +1,555 @@
1 +# English translations — rustwarden-ui
2 +# UI-specific sections (pages, forms, navigation, admin panels)
3 +
4 +# Login
5 +login:
6 + title: "Login"
7 + page_title: "Login - RustCloud"
8 + page_description: "Login to RustCloud"
9 + subtitle: "Sign in to your cloud space"
10 + username: "Username"
11 + password: "Password"
12 + submit: "Sign in"
13 + remember_me: "Remember me"
14 + tab_login: "Login"
15 + tab_register: "Register"
16 + register_title: "Create an account"
17 + register_submit: "Create my account"
18 + username_placeholder: "Your username"
19 + password_placeholder: "Your password"
20 + username_placeholder_register: "Your username (min. 3 characters)"
21 + password_placeholder_register: "Your password (min. 8 characters)"
22 + email_placeholder: "your@email.com"
23 + forgot_password: "Forgot password?"
24 + email_not_verified: "Email not verified?"
25 + resend_verification: "Resend verification email"
26 + already_have_account: "Already have an account?"
27 + sign_in_link: "Sign in"
28 + success_message: "Login successful! Redirecting..."
29 + error_message: "Login error. Check your credentials."
30 + email_unverified_message: "Your email is not verified. Click below to resend the link."
31 + resend_button: "Resend verification email"
32 + resend_success: "Verification email sent if the account exists."
33 + resend_error: "Unable to send the request at this time."
34 + resend_prompt: "Please enter your email before resending."
35 + register_success: "Account created successfully! Please check your email."
36 + register_error: "Registration error"
37 + email_label: "Email"
38 + footer_text: "Nextcloud fork in Rust"
39 +
40 +# Resend verification email
41 +resend_verification:
42 + page_title: "Resend verification email - RustWarden"
43 + title: "Resend verification email"
44 + subtitle: "Enter your email address to receive a new verification link."
45 + email_label: "Email address"
46 + email_placeholder: "you@example.com"
47 + submit: "Send verification link"
48 + back_to_login: "Back to login"
49 + error_default: "Unable to send the request."
50 + success_default: "If the account exists and is not verified, an email has been sent."
51 + error_missing_email: "Please enter your email."
52 + error_cannot_send: "Unable to send the request at this time."
53 +
54 +# Password reset (from email link)
55 +password_reset:
56 + page_title: "Reset password"
57 + title: "Reset password"
58 + subtitle: "Enter your new password below."
59 + new_password_label: "New password"
60 + new_password_placeholder: "New secure password"
61 + requirements: "⚠️ Must contain: 8+ characters, uppercase, lowercase, digit, special character"
62 + confirm_password_label: "Confirm password"
63 + confirm_password_placeholder: "Confirm your new password"
64 + missing_token_url: "Reset token missing in URL."
65 + missing_token: "Reset token is missing."
66 + missing_new_password: "Please enter a new password."
67 + passwords_not_match: "Passwords do not match."
68 + success_message: "Your password has been reset successfully. You can now log in."
69 + error_link_invalid: "Unable to reset password. The link may be expired or invalid."
70 + error_generic: "Unable to reset password at this time."
71 +
72 +# Settings
73 +settings:
74 + title: "Settings"
75 + page_title: "Settings - RustWarden"
76 + subtitle: "Manage your preferences and account settings"
77 + profile_title: "My Profile"
78 + profile_desc: "Edit your personal information (username, email)"
79 + password_title: "Password"
80 + password_desc: "Change your password to secure your account"
81 + sessions_title: "Active Sessions"
82 + sessions_desc: "Manage your active sessions and revoke access from other devices"
83 + preferences_title: "Preferences"
84 + preferences_desc: "Customize your experience (theme, language)"
85 + access: "Access"
86 + info_title: "Information"
87 + info_desc: "Use the sections above to manage different aspects of your account. All changes are secure and require your authentication."
88 + language: "Language"
89 + language_description: "Choose your preferred language"
90 + save: "Save"
91 + saved: "Settings saved"
92 +
93 +# Home page
94 +home:
95 + welcome: "Welcome, {username}!"
96 + subtitle: "Welcome to your personal space"
97 + my_account: "My Account"
98 + stat_username: "Username"
99 + stat_email: "Email"
100 + stat_member_since: "Member since"
101 + stat_roles: "Roles"
102 +
103 +# Preferences
104 +preferences:
105 + title: "Display Preferences"
106 + page_title: "Display Preferences - RustCloud"
107 + subtitle: "Customize the interface appearance"
108 + theme: "Theme"
109 + theme_light: "Light"
110 + theme_light_desc: "Bright and clean interface"
111 + theme_dark: "Dark"
112 + theme_dark_desc: "Reduces eye strain"
113 + theme_auto: "Automatic"
114 + theme_auto_desc: "Adapts to time of day"
115 + theme_preview: "The theme will be applied immediately after saving"
116 + language: "Language"
117 + language_fr: "Français"
118 + language_fr_desc: "Interface in French"
119 + language_en: "English"
120 + language_en_desc: "English interface"
121 + language_de: "Deutsch"
122 + language_de_desc: "German interface"
123 + language_es: "Español"
124 + language_es_desc: "Spanish interface"
125 + translation_warning: "Complete interface translation is under development. Some elements may remain in French."
126 + modified: "Preferences modified"
127 + modified_desc: "Save your changes to apply them"
128 + save: "Save preferences"
129 + saving: "Saving..."
130 + cancel: "Cancel"
131 + saved_success: "Preferences saved successfully!"
132 + saved_reload: "Preferences saved successfully!\n\nThe language has been changed. Do you want to reload the page now to apply the changes?"
133 + error: "Error: {message}"
134 + network_error: "Network error. Please try again."
135 + sync_title: "Your preferences are synchronized"
136 + sync_desc: "Your display preferences are saved and automatically apply to all devices connected to your RustCloud account."
137 + preview_dark: "Preview: Dark theme will be applied"
138 + preview_light: "Preview: Light theme will be applied"
139 + preview_auto: "Preview: Automatic theme will be applied"
140 +
141 +# Profile
142 +profile:
143 + title: "My Profile"
144 + page_title: "My Profile - RustCloud"
145 + subtitle: "Edit your personal information"
146 + account_info: "Account Information"
147 + username: "Username"
148 + username_public: "Publicly visible"
149 + username_placeholder: "Your username"
150 + username_pattern: "Letters, numbers, dashes and underscores only"
151 + email: "Email"
152 + email_placeholder: "your@email.com"
153 + save: "Save changes"
154 + saving: "Saving..."
155 + saved: "Profile updated successfully"
156 + error: "Error updating profile"
157 + email_label: "Email address"
158 + email_used_for: "Used for login"
159 + email_warning: "⚠️ You will be logged out after modification"
160 + email_change_info: "Email changes require reconnection for security reasons."
161 + username_help: "3-50 characters (letters, numbers, -, _)"
162 + additional_info: "Additional Information"
163 + account_created: "Account created on"
164 + roles: "Roles"
165 + linked_accounts_title: "Linked Accounts"
166 + no_linked_accounts: "No external accounts linked."
167 + linked_since: "Linked since"
168 + unlink_button: "Unlink"
169 + unlink_confirm: "Are you sure you want to unlink this account?"
170 + unlink_error: "Unable to unlink this account."
171 + cannot_unlink_last: "Cannot remove your last authentication method."
172 +
173 +# Breadcrumb
174 +breadcrumb:
175 + home: "Home"
176 + settings: "Settings"
177 + admin: "Administration"
178 + preferences: "Preferences"
179 + profile: "Profile"
180 + password: "Password"
181 + sessions: "Sessions"
182 +
183 +# Admin
184 +admin:
185 + dashboard:
186 + title: "Administration"
187 + heading: "Administrator Dashboard"
188 + users_card_title: "Users"
189 + users_card_subtitle: "Total users"
190 + access_button: "Access"
191 + sessions_card_title: "Active Sessions"
192 + sessions_card_subtitle: "Ongoing sessions"
193 + admins_card_title: "Administrators"
194 + admins_card_subtitle: "Admin accounts"
195 + last_activity_card_title: "Last Activity"
196 + last_activity_card_subtitle: "Last login"
197 + audit_section_title: "Audit Log Statistics"
198 + audit_total_logs: "Total logs"
199 + audit_last_24h: "Last 24h"
200 + audit_by_level: "By level"
201 + chart_label: "Logs by level"
202 + roles_card_title: "Roles Management"
203 + roles_card_desc: "Manage roles and granular permissions"
204 + roles_stat_title: "Roles"
205 + settings_card_title: "Application Settings"
206 + settings_card_desc: "Configure global application settings"
207 + apps_card_title: "Application Management"
208 + apps_card_desc: "Enable or disable modular applications"
209 + orgs_card_title: "Organisation Management"
210 + orgs_card_desc: "Create and manage organisations and their members"
211 + orgs_stat_title: "Organisations"
212 + orgs_members_stat_title: "Total members"
213 + roles_list:
214 + page_title: "Roles Management"
215 + breadcrumb_roles: "Roles"
216 + title: "Roles"
217 + create_role: "Create a role"
218 + table_name: "Name"
219 + table_description: "Description"
220 + table_users: "Users"
221 + table_permissions: "Permissions"
222 + table_actions: "Actions"
223 + edit: "Edit"
224 + delete: "Delete"
225 + no_roles: "No roles found."
226 + protected_hint: "Protected"
227 + delete_confirm_title: "Confirm deletion"
228 + delete_confirm_message: "Are you sure you want to delete the role"
229 + delete_button: "Delete"
230 + role_form:
231 + title_create: "Create a role"
232 + title_edit: "Edit role"
233 + breadcrumb_create: "Create"
234 + breadcrumb_edit: "Edit"
235 + back_to_list: "Back to list"
236 + name_label: "Role name"
237 + name_placeholder: "e.g. moderator"
238 + description_label: "Description"
239 + description_placeholder: "Role description..."
240 + permissions_label: "Permissions"
241 + protected_name_hint: "This role name cannot be changed."
242 + cancel: "Cancel"
243 + submit_create: "Create role"
244 + submit_edit: "Save changes"
245 + errors:
246 + title: "Error Codes"
247 + description: "Application error code documentation. Each error code is associated with a middleware and provides context information for debugging."
248 + breadcrumb_errors: "Error Codes"
249 + table_code: "Code"
250 + table_description: "Description"
251 + table_category: "Category"
252 + table_middleware: "Middleware"
253 + table_context: "Context"
254 + table_example: "Example"
255 + legend_title: "Legend"
256 + legend_code: "Unique error identifier (format: CATEGORY_NUMBER)"
257 + legend_description: "Description of the error"
258 + legend_category: "Error type (Authentication, CSRF, Rate Limiting, etc.)"
259 + legend_middleware: "Middleware responsible for generating this error"
260 + legend_context: "Detailed explanation of when this error occurs"
261 + legend_example: "Concrete example of a situation generating this error"
262 + error_auth001_desc: "Invalid credentials"
263 + error_auth001_category: "Authentication"
264 + error_auth001_context: "The user provided incorrect credentials during login"
265 + error_auth001_example: "Login attempt with an incorrect password"
266 + error_auth002_desc: "Invalid token"
267 + error_auth002_category: "Authentication"
268 + error_auth002_context: "The provided JWT token is invalid or malformed"
269 + error_auth002_example: "Corrupted JWT token or signed with a different key"
270 + error_auth003_desc: "Token expired"
271 + error_auth003_category: "Authentication"
272 + error_auth003_context: "The JWT token has expired and needs to be renewed"
273 + error_auth003_example: "Access attempt with an expired token after the validity period"
274 + error_csrf001_desc: "Missing CSRF token"
275 + error_csrf001_category: "CSRF Protection"
276 + error_csrf001_context: "The POST/PUT/DELETE request does not contain a CSRF token"
277 + error_csrf001_example: "Form submitted without a CSRF token in the header or body"
278 + error_csrf002_desc: "Invalid CSRF token"
279 + error_csrf002_category: "CSRF Protection"
280 + error_csrf002_context: "The provided CSRF token does not match the session token"
281 + error_csrf002_example: "Modified or stolen CSRF token"
282 + error_rate001_desc: "Rate limit exceeded"
283 + error_rate001_category: "Rate Limiting"
284 + error_rate001_context: "The number of requests per minute has been exceeded"
285 + error_rate001_example: "More than 100 requests/min on admin endpoints"
286 + error_valid001_desc: "Invalid input data"
287 + error_valid001_category: "Validation"
288 + error_valid001_context: "The provided data does not comply with validation rules"
289 + error_valid001_example: "Invalid email format or missing required field"
290 + error_valid002_desc: "Password complexity not met"
291 + error_valid002_category: "Validation"
292 + error_valid002_context: "The password does not meet the configured complexity rules"
293 + error_valid002_example: "Password too short or missing required characters"
294 + error_rbac001_desc: "Insufficient permissions"
295 + error_rbac001_category: "Authorization"
296 + error_rbac001_context: "The user does not have the necessary permissions for this action"
297 + error_rbac001_example: "Non-admin user attempting to access /admin/users"
298 + error_rbac002_desc: "Admin role required"
299 + error_rbac002_category: "Authorization"
300 + error_rbac002_context: "The action requires an administrator role"
301 + error_rbac002_example: "Attempting to delete a user without admin role"
302 + error_db001_desc: "Database operation error"
303 + error_db001_category: "Database"
304 + error_db001_context: "A database operation failed"
305 + error_db001_example: "Foreign key constraint violated or DB connection lost"
306 + error_db002_desc: "Resource not found"
307 + error_db002_category: "Database"
308 + error_db002_context: "The requested resource does not exist in the database"
309 + error_db002_example: "User with non-existent ID"
310 + user_form:
311 + breadcrumb_create: "Create"
312 + breadcrumb_edit: "Edit"
313 + title_create: "Create a user"
314 + title_edit: "Edit a user"
315 + back_to_list: "Back to list"
316 + username_label: "Username"
317 + username_placeholder: "username"
318 + username_readonly_hint: "Username cannot be changed after creation"
319 + email_label: "Email"
320 + email_placeholder: "user@example.com"
321 + password_label: "Password"
322 + password_optional: "Optional"
323 + password_placeholder: "Leave empty to generate a random password"
324 + password_hint: "If left empty, a secure password will be automatically generated"
325 + roles_label: "Roles"
326 + roles_hint: "Select at least one role"
327 + must_change_password_label: "Force password change"
328 + must_change_password_desc: "The user will have to change their password at next login"
329 + cancel: "Cancel"
330 + submit_create: "Create user"
331 + submit_edit: "Save changes"
332 + settings:
333 + title: "Application Settings"
334 + page_title: "Application Settings - Admin - RustCloud"
335 + subtitle: "Global RustCloud configuration"
336 + general: "General"
337 + app_name: "Application name"
338 + app_domain: "Domain"
339 + app_domain_placeholder: "example.com"
340 + app_description: "Description"
341 + allow_registration: "Allow registration"
342 + allow_registration_desc: "Users can create accounts from the home page"
343 + email_validation_required: "Email validation required"
344 + email_validation_required_desc: "Users must validate their email before they can log in"
345 + save: "Save settings"
346 + cancel: "Cancel"
347 + saved: "Settings saved successfully"
348 + error: "Error saving settings"
349 + network_error: "Network error. Please try again."
350 + password_security: "Password Security"
351 + password_min_length: "Minimum length"
352 + password_min_length_hint: "Between 6 and 128 characters"
353 + password_complexity: "Complexity requirements"
354 + require_uppercase: "Uppercase required"
355 + require_lowercase: "Lowercase required"
356 + require_digits: "Digit required"
357 + require_special: "Special character required"
358 + password_change_require_email: "Email confirmation for password change"
359 + password_change_require_email_desc: "When enabled, a confirmation email is sent to validate any password change. Otherwise, the change is applied immediately."
360 + password_expiration: "Password expiration"
361 + password_expiration_desc: "Force periodic password change"
362 + expiration_days: "Expiration after (days)"
363 + expiration_alert: "Email alert before expiration"
364 + expiration_alert_days: "Alert (days before)"
365 + audit_logging: "Audit Logging"
366 + log_level: "Log level"
367 + log_level_debug: "DEBUG - All details"
368 + log_level_info: "INFO - Normal information"
369 + log_level_warn: "WARN - Warnings only"
370 + log_level_error: "ERROR - Errors only"
371 + log_level_hint: "Controls the verbosity of audit logs"
372 + log_retention: "Log retention (days)"
373 + log_retention_hint: "Log retention period (1-365 days)"
374 + audit_info_message: "Audit logs record all administrative actions (creation, modification, deletion of users)."
375 + save_changes: "Save changes"
376 + save_changes_desc: "Settings will be applied immediately"
377 + saving: "Saving..."
378 + save_success: "Settings saved successfully!"
379 + save_error_prefix: "Error"
380 + # OAuth / SSO admin settings
381 + oauth_sso_title: "OAuth / SSO"
382 + oauth_enabled_label: "Enable OAuth"
383 + oauth_enabled_desc: "Allow login via external providers (Google, GitHub, etc.)"
384 + oauth_redirect_url_label: "Base redirect URL"
385 + oauth_redirect_url_desc: "Base URL for OAuth callbacks (e.g. https://myapp.example.com)"
386 + oauth_auto_register_label: "Auto-registration"
387 + oauth_auto_register_desc: "Automatically create an account if the email does not exist"
388 + oauth_link_existing_label: "Link existing accounts"
389 + oauth_link_existing_desc: "Automatically link an OAuth account if the verified email matches"
390 + oauth_client_id: "Client ID"
391 + oauth_client_secret: "Client Secret"
392 + oauth_tenant: "Tenant ID"
393 + oauth_redirect_uri: "Redirect URI"
394 + oauth_copy_uri: "Copy"
395 + oauth_secret_configured: "Configured"
396 + oauth_secret_not_configured: "Not configured"
397 + oauth_secret_change: "Change"
398 + oauth_restart_warning: "Credential changes require an application restart."
399 + oauth_env_info: "Credentials can also be set via environment variables (OAUTH_*_CLIENT_ID, etc.)."
400 + oauth_google_label: "Google"
401 + oauth_google_desc: "OpenID Connect"
402 + oauth_github_label: "GitHub"
403 + oauth_github_desc: "OAuth2"
404 + oauth_discord_label: "Discord"
405 + oauth_discord_desc: "OAuth2"
406 + oauth_microsoft_label: "Microsoft"
407 + oauth_microsoft_desc: "OpenID Connect"
408 + users_list:
409 + page_title: "User Management - Admin - RustCloud"
410 + title: "User Management"
411 + breadcrumb_users: "Users"
412 + create_user: "Create user"
413 + search_label: "Search"
414 + search_placeholder: "Username or email..."
415 + role_filter_label: "Role"
416 + all_roles: "All roles"
417 + per_page_label: "Per page"
418 + search_button: "Search"
419 + results_summary: "Showing {count} user(s) out of {total} total"
420 + page_info: "Page {page} of {total_pages}"
421 + table_username: "Username"
422 + table_email: "Email"
423 + table_roles: "Roles"
424 + table_created_at: "Created on"
425 + table_last_login: "Last login"
426 + table_actions: "Actions"
427 + never: "Never"
428 + edit: "Edit"
429 + no_users: "No users found"
430 + reset_password_title: "Reset password"
431 + reset_generate: "Generate random password"
432 + reset_custom: "Set custom password"
433 + reset_email: "Reset by email"
434 + reset_new_password_label: "New password"
435 + reset_new_password_placeholder: "Minimum 8 characters, uppercase, lowercase, digit, special character"
436 + reset_password_requirements: "⚠️ Must contain: 8+ characters, uppercase, lowercase, digit, special character"
437 + reset_invalidate_sessions: "Invalidate all active sessions for this user"
438 + reset_invalidate_sessions_desc: "The user will need to log in again after the change"
439 + reset_button: "Reset"
440 + delete_confirm_title: "⚠️ Confirm deletion"
441 + delete_confirm_message: "Are you sure you want to delete this user?"
442 + delete_confirm_username: "Username:"
443 + delete_confirm_email: "Email:"
444 + delete_irreversible: "This action is irreversible!"
445 + delete_button: "Delete permanently"
446 + delete: "Delete"
447 + delete_error: "Error deleting user"
448 + network_error: "Network error"
449 + edit_user_title: "Edit user"
450 + resetting: "Resetting..."
451 + reset_by_email_title: "Reset by email"
452 + close: "Close"
453 + password_reset_success_title: "Password reset"
454 + password_warning_once: "This password will only be displayed once. Copy it now!"
455 + new_password_label: "New password"
456 + copy: "Copy"
457 + password_copied: "Password copied to clipboard"
458 + password_set_success: "Password reset successfully"
459 + reset_error: "Error resetting password"
460 +
461 +# Password Change
462 +password:
463 + title: "Change my password"
464 + page_title: "Change my password - RustCloud"
465 + subtitle: "Modify your password to secure your account. A confirmation email will be sent to validate the change."
466 + subtitle_no_email: "Modify your password to secure your account."
467 + must_change_message: "⚠️ You must change your password before continuing."
468 + new_password: "New password"
469 + current_password: "Current password"
470 + current_password_placeholder: "Your current password"
471 + new_password_placeholder: "Secure new password"
472 + required: "Required"
473 + requirements: "📌 Requirements: 8+ characters, uppercase, lowercase, digit, special character"
474 + strength: "Password strength:"
475 + strength_weak: "Weak"
476 + strength_medium: "Medium"
477 + strength_strong: "Strong ✓"
478 + strength_too_short: "too short"
479 + strength_missing_lowercase: "missing lowercase"
480 + strength_missing_uppercase: "missing uppercase"
481 + strength_missing_digit: "missing digit"
482 + strength_missing_special: "missing special character"
483 + confirm_password: "Confirm new password"
484 + confirm_password_placeholder: "Repeat the new password"
485 + passwords_match: "✓ Passwords match"
486 + passwords_not_match: "✗ Passwords do not match"
487 + change_button: "Change password"
488 + changing: "Changing..."
489 + logout_warning_title: "Logout from other sessions"
490 + logout_warning_desc: "All your other active sessions will be automatically logged out after the password change. Only your current session will remain active."
491 + save: "Save new password"
492 + saving: "Saving..."
493 + saved: "A confirmation email has been sent to your address. Click the link in the email to validate the password change."
494 + saved_direct: "Password changed successfully! Your other sessions have been logged out."
495 + error: "Error changing password"
496 + error_all_fields_required: "All fields are required."
497 + error_empty_data: "The data to send is empty."
498 + error_invalid_data: "Invalid data. Check that all fields are filled."
499 + error_incorrect_current: "Current password is incorrect."
500 + error_reading_response: "Error reading server response"
501 + error_415: "Error 415: The server did not receive the data in the expected JSON format. Please try again."
502 + network_error: "Network error. Please try again."
503 + security_tips_title: "Security Tips"
504 + security_tip_unique: "Use a unique password that you don't use elsewhere"
505 + security_tip_share: "Never share your password with anyone"
506 + security_tip_regular: "Change your password regularly (every 3-6 months)"
507 + security_tip_2fa: "Enable two-factor authentication if available"
508 + security_tip_manager: "Use a password manager for better security"
509 + pending_request_message: "⚠️ A password change request is pending email confirmation."
510 + pending_request_info: "A confirmation email has been sent to your address. Click the link in the email to confirm the change."
511 + pending_request_cancel: "Cancel pending request"
512 + pending_request_canceled: "Request canceled successfully"
513 + pending_request_cancel_error: "Error canceling the request"
514 + confirmation_sent: "Confirmation email sent! Check your inbox."
515 + confirmation_error: "Error sending confirmation email"
516 +
517 +# Sessions
518 +sessions:
519 + title: "Active sessions"
520 + page_title: "Active sessions - RustCloud"
521 + subtitle: "Manage devices connected to your account"
522 + current_session: "Current session"
523 + current_badge: "Current"
524 + unknown_device: "Unknown device"
525 + ip_address: "IP Address:"
526 + created_at: "Created on:"
527 + last_activity: "Last activity:"
528 + session_id: "Session ID:"
529 + revoke: "Revoke"
530 + revoke_confirm: "Are you sure you want to revoke the session for \"{device}\"?\n\nThis device will be disconnected immediately."
531 + revoke_success: "Session revoked successfully!"
532 + revoke_error: "Error revoking session"
533 + no_sessions: "No active sessions"
534 + no_sessions_desc: "You currently have no active sessions"
535 + danger_zone: "Danger Zone"
536 + danger_zone_desc: "Disconnect all other devices in one action (your current session will remain active)."
537 + revoke_all: "Revoke all other sessions"
538 + revoke_all_confirm: "⚠️ WARNING\n\nAre you sure you want to revoke ALL your other sessions?\n\nAll your other devices will be disconnected. Only your current session will remain active."
539 + revoke_all_success: "All other sessions have been revoked!"
540 + revoke_all_error: "Error revoking. Some sessions may not have been revoked."
541 + about_title: "About sessions"
542 + about_desc: "A session is created each time you log in from a different device or browser. Revoking a session immediately disconnects that device. Your current session cannot be revoked from this page (log out to do that)."
543 + back_to_settings: "Back to settings"
544 +
545 +# Navigation menu (navbar)
546 +nav:
547 + home: "Home"
548 + settings: "Settings"
549 + admin: "Administration"
550 +
551 +# User menu
552 +user_menu:
553 + profile: "Profile"
554 + logout: "Logout"
555 + settings: "Settings"
A crates/rustwarden-ui/locales/es.yml
+548 -0
@@ -0,0 +1,548 @@
1 +# Traducciones en español — rustwarden-ui
2 +# Secciones específicas de UI (páginas, formularios, navegación, paneles de administración)
3 +
4 +# Inicio de sesión
5 +login:
6 + title: "Iniciar sesión"
7 + page_title: "Iniciar sesión - RustCloud"
8 + page_description: "Iniciar sesión en RustCloud"
9 + subtitle: "Inicie sesión en su espacio en la nube"
10 + username: "Nombre de usuario"
11 + password: "Contraseña"
12 + submit: "Iniciar sesión"
13 + remember_me: "Recordarme"
14 + tab_login: "Iniciar sesión"
15 + tab_register: "Registrarse"
16 + register_title: "Crear una cuenta"
17 + register_submit: "Crear mi cuenta"
18 + username_placeholder: "Su nombre de usuario"
19 + password_placeholder: "Su contraseña"
20 + username_placeholder_register: "Su nombre de usuario (mín. 3 caracteres)"
21 + password_placeholder_register: "Su contraseña (mín. 8 caracteres)"
22 + email_placeholder: "su@email.com"
23 + forgot_password: "¿Olvidó su contraseña?"
24 + email_not_verified: "¿Email no verificado?"
25 + resend_verification: "Reenviar email de verificación"
26 + already_have_account: "¿Ya tiene una cuenta?"
27 + sign_in_link: "Iniciar sesión"
28 + success_message: "¡Inicio de sesión exitoso! Redirigiendo..."
29 + error_message: "Error de inicio de sesión. Verifique sus credenciales."
30 + email_unverified_message: "Su email no está verificado. Haga clic a continuación para reenviar el enlace."
31 + resend_button: "Reenviar email de verificación"
32 + resend_success: "Email de verificación enviado si la cuenta existe."
33 + resend_error: "No se puede enviar la solicitud en este momento."
34 + resend_prompt: "Por favor ingrese su email antes de reenviar."
35 + register_success: "¡Cuenta creada con éxito! Por favor verifique su email."
36 + register_error: "Error en el registro"
37 + email_label: "Correo electrónico"
38 + footer_text: "Fork de Nextcloud en Rust"
39 +
40 +# Reenviar email de verificación
41 +resend_verification:
42 + page_title: "Reenviar email de verificación - RustWarden"
43 + title: "Reenviar email de verificación"
44 + subtitle: "Ingrese su dirección de correo electrónico para recibir un nuevo enlace de verificación."
45 + email_label: "Dirección de correo electrónico"
46 + email_placeholder: "usted@ejemplo.com"
47 + submit: "Enviar enlace de verificación"
48 + back_to_login: "Volver al inicio de sesión"
49 + error_default: "No se pudo enviar la solicitud."
50 + success_default: "Si la cuenta existe y no está verificada, se ha enviado un email."
51 + error_missing_email: "Por favor ingrese su correo electrónico."
52 + error_cannot_send: "No se puede enviar la solicitud en este momento."
53 +
54 +# Restablecimiento de contraseña (desde enlace de email)
55 +password_reset:
56 + page_title: "Restablecer contraseña"
57 + title: "Restablecer contraseña"
58 + subtitle: "Ingrese su nueva contraseña a continuación."
59 + new_password_label: "Nueva contraseña"
60 + new_password_placeholder: "Nueva contraseña segura"
61 + requirements: "⚠️ Debe contener: 8+ caracteres, mayúscula, minúscula, dígito, carácter especial"
62 + confirm_password_label: "Confirmar contraseña"
63 + confirm_password_placeholder: "Confirme su nueva contraseña"
64 + missing_token_url: "Falta el token de restablecimiento en la URL."
65 + missing_token: "Falta el token de restablecimiento."
66 + missing_new_password: "Por favor ingrese una nueva contraseña."
67 + passwords_not_match: "Las contraseñas no coinciden."
68 + success_message: "Su contraseña ha sido restablecida con éxito. Ahora puede iniciar sesión."
69 + error_link_invalid: "No se pudo restablecer la contraseña. El enlace puede haber expirado o ser inválido."
70 + error_generic: "No se puede restablecer la contraseña en este momento."
71 +
72 +# Configuración
73 +settings:
74 + title: "Configuración"
75 + page_title: "Configuración - RustWarden"
76 + subtitle: "Gestione sus preferencias y configuración de cuenta"
77 + profile_title: "Mi Perfil"
78 + profile_desc: "Edite su información personal (nombre de usuario, email)"
79 + password_title: "Contraseña"
80 + password_desc: "Cambie su contraseña para asegurar su cuenta"
81 + sessions_title: "Sesiones activas"
82 + sessions_desc: "Gestione sus sesiones activas y revoque el acceso desde otros dispositivos"
83 + preferences_title: "Preferencias"
84 + preferences_desc: "Personalice su experiencia (tema, idioma)"
85 + access: "Acceder"
86 + info_title: "Información"
87 + info_desc: "Utilice las secciones anteriores para gestionar diferentes aspectos de su cuenta. Todos los cambios son seguros y requieren su autenticación."
88 + language: "Idioma"
89 + language_description: "Elija su idioma preferido"
90 + save: "Guardar"
91 + saved: "Configuración guardada"
92 +
93 +# Página de inicio
94 +home:
95 + welcome: "¡Bienvenido, {username}!"
96 + subtitle: "Bienvenido a tu espacio personal"
97 + my_account: "Mi Cuenta"
98 + stat_username: "Nombre de usuario"
99 + stat_email: "Correo electrónico"
100 + stat_member_since: "Miembro desde"
101 + stat_roles: "Roles"
102 +
103 +# Preferencias
104 +preferences:
105 + title: "Preferencias de visualización"
106 + page_title: "Preferencias de visualización - RustCloud"
107 + subtitle: "Personalice la apariencia de la interfaz"
108 + theme: "Tema"
109 + theme_light: "Claro"
110 + theme_light_desc: "Interfaz brillante y limpia"
111 + theme_dark: "Oscuro"
112 + theme_dark_desc: "Reduce la fatiga visual"
113 + theme_auto: "Automático"
114 + theme_auto_desc: "Se adapta a la hora del día"
115 + theme_preview: "El tema se aplicará inmediatamente después de guardar"
116 + language: "Idioma"
117 + language_fr: "Français"
118 + language_fr_desc: "Interfaz en francés"
119 + language_en: "English"
120 + language_en_desc: "Interfaz en inglés"
121 + language_de: "Deutsch"
122 + language_de_desc: "Interfaz en alemán"
123 + language_es: "Español"
124 + language_es_desc: "Interfaz en español"
125 + translation_warning: "La traducción completa de la interfaz está en desarrollo. Algunos elementos pueden permanecer en francés."
126 + modified: "Preferencias modificadas"
127 + modified_desc: "Guarde sus cambios para aplicarlos"
128 + save: "Guardar preferencias"
129 + saving: "Guardando..."
130 + cancel: "Cancelar"
131 + saved_success: "¡Preferencias guardadas con éxito!"
132 + saved_reload: "¡Preferencias guardadas con éxito!\n\nEl idioma ha sido cambiado. ¿Desea recargar la página ahora para aplicar los cambios?"
133 + error: "Error: {message}"
134 + network_error: "Error de red. Por favor intente nuevamente."
135 + sync_title: "Sus preferencias están sincronizadas"
136 + sync_desc: "Sus preferencias de visualización se guardan y se aplican automáticamente en todos los dispositivos conectados a su cuenta RustCloud."
137 + preview_dark: "Vista previa: Se aplicará el tema oscuro"
138 + preview_light: "Vista previa: Se aplicará el tema claro"
139 + preview_auto: "Vista previa: Se aplicará el tema automático"
140 +
141 +# Perfil
142 +profile:
143 + title: "Mi Perfil"
144 + page_title: "Mi Perfil - RustCloud"
145 + subtitle: "Edite su información personal"
146 + account_info: "Información de la cuenta"
147 + username: "Nombre de usuario"
148 + username_public: "Visible públicamente"
149 + username_placeholder: "Su nombre de usuario"
150 + username_pattern: "Solo letras, números, guiones y guiones bajos"
151 + email: "Email"
152 + email_placeholder: "su@email.com"
153 + save: "Guardar cambios"
154 + saving: "Guardando..."
155 + saved: "Perfil actualizado con éxito"
156 + error: "Error al actualizar el perfil"
157 + email_label: "Dirección de correo electrónico"
158 + email_used_for: "Se utiliza para iniciar sesión"
159 + email_warning: "⚠️ Será desconectado después de la modificación"
160 + email_change_info: "Los cambios de correo electrónico requieren reconexión por razones de seguridad."
161 + username_help: "3-50 caracteres (letras, números, -, _)"
162 + additional_info: "Información adicional"
163 + account_created: "Cuenta creada el"
164 + roles: "Roles"
165 + linked_accounts_title: "Cuentas vinculadas"
166 + no_linked_accounts: "No hay cuentas externas vinculadas."
167 + linked_since: "Vinculada desde"
168 + unlink_button: "Desvincular"
169 + unlink_confirm: "¿Está seguro de que desea desvincular esta cuenta?"
170 + unlink_error: "No se pudo desvincular esta cuenta."
171 + cannot_unlink_last: "No se puede eliminar su último método de autenticación."
172 +
173 +# Breadcrumb
174 +breadcrumb:
175 + home: "Inicio"
176 + settings: "Configuración"
177 + admin: "Administración"
178 + preferences: "Preferencias"
179 + profile: "Perfil"
180 + password: "Contraseña"
181 + sessions: "Sesiones"
182 +
183 +# Administración
184 +admin:
185 + dashboard:
186 + title: "Administración"
187 + heading: "Panel de Administración"
188 + users_card_title: "Usuarios"
189 + users_card_subtitle: "Usuarios totales"
190 + access_button: "Acceder"
191 + sessions_card_title: "Sesiones activas"
192 + sessions_card_subtitle: "Sesiones en curso"
193 + admins_card_title: "Administradores"
194 + admins_card_subtitle: "Cuentas admin"
195 + last_activity_card_title: "Última actividad"
196 + last_activity_card_subtitle: "Último inicio de sesión"
197 + audit_section_title: "Estadísticas de logs de auditoría"
198 + audit_total_logs: "Logs totales"
199 + audit_last_24h: "Últimas 24h"
200 + audit_by_level: "Por nivel"
201 + chart_label: "Logs por nivel"
202 + roles_card_title: "Gestión de Roles"
203 + roles_card_desc: "Gestionar roles y permisos granulares"
204 + roles_stat_title: "Roles"
205 + settings_card_title: "Configuración de la Aplicación"
206 + settings_card_desc: "Configurar los parámetros globales de la aplicación"
207 + apps_card_title: "Gestión de Aplicaciones"
208 + apps_card_desc: "Activar o desactivar aplicaciones modulares"
209 + orgs_card_title: "Gestión de Organizaciones"
210 + orgs_card_desc: "Crear y gestionar organizaciones y sus miembros"
211 + orgs_stat_title: "Organizaciones"
212 + orgs_members_stat_title: "Miembros totales"
213 + roles_list:
214 + page_title: "Gestión de roles"
215 + breadcrumb_roles: "Roles"
216 + title: "Roles"
217 + create_role: "Crear un rol"
218 + table_name: "Nombre"
219 + table_description: "Descripción"
220 + table_users: "Usuarios"
221 + table_permissions: "Permisos"
222 + table_actions: "Acciones"
223 + edit: "Editar"
224 + delete: "Eliminar"
225 + no_roles: "No se encontraron roles."
226 + protected_hint: "Protegido"
227 + delete_confirm_title: "Confirmar eliminación"
228 + delete_confirm_message: "¿Está seguro de que desea eliminar el rol"
229 + delete_button: "Eliminar"
230 + role_form:
231 + title_create: "Crear un rol"
232 + title_edit: "Editar rol"
233 + breadcrumb_create: "Crear"
234 + breadcrumb_edit: "Editar"
235 + back_to_list: "Volver a la lista"
236 + name_label: "Nombre del rol"
237 + name_placeholder: "ej: moderator"
238 + description_label: "Descripción"
239 + description_placeholder: "Descripción del rol..."
240 + permissions_label: "Permisos"
241 + protected_name_hint: "El nombre de este rol no se puede cambiar."
242 + cancel: "Cancelar"
243 + submit_create: "Crear rol"
244 + submit_edit: "Guardar cambios"
245 + errors:
246 + title: "Códigos de Error"
247 + description: "Documentación de los códigos de error de la aplicación. Cada código de error está asociado a un middleware y proporciona información de contexto para la depuración."
248 + breadcrumb_errors: "Códigos de Error"
249 + table_code: "Código"
250 + table_description: "Descripción"
251 + table_category: "Categoría"
252 + table_middleware: "Middleware"
253 + table_context: "Contexto"
254 + table_example: "Ejemplo"
255 + legend_title: "Leyenda"
256 + legend_code: "Identificador único del error (formato: CATEGORY_NUMBER)"
257 + legend_description: "Descripción del error"
258 + legend_category: "Tipo de error (Autenticación, CSRF, Rate Limiting, etc.)"
259 + legend_middleware: "Middleware responsable de generar este error"
260 + legend_context: "Explicación detallada de cuándo ocurre este error"
261 + legend_example: "Ejemplo concreto de una situación que genera este error"
262 + error_auth001_desc: "Credenciales inválidas"
263 + error_auth001_category: "Autenticación"
264 + error_auth001_context: "El usuario proporcionó credenciales incorrectas al iniciar sesión"
265 + error_auth001_example: "Intento de inicio de sesión con contraseña incorrecta"
266 + error_auth002_desc: "Token inválido"
267 + error_auth002_category: "Autenticación"
268 + error_auth002_context: "El token JWT proporcionado es inválido o está malformado"
269 + error_auth002_example: "Token JWT corrupto o firmado con una clave diferente"
270 + error_auth003_desc: "Token expirado"
271 + error_auth003_category: "Autenticación"
272 + error_auth003_context: "El token JWT ha expirado y debe renovarse"
273 + error_auth003_example: "Intento de acceso con un token expirado después del período de validez"
274 + error_csrf001_desc: "Token CSRF faltante"
275 + error_csrf001_category: "Protección CSRF"
276 + error_csrf001_context: "La solicitud POST/PUT/DELETE no contiene un token CSRF"
277 + error_csrf001_example: "Formulario enviado sin token CSRF en el header o body"
278 + error_csrf002_desc: "Token CSRF inválido"
279 + error_csrf002_category: "Protección CSRF"
280 + error_csrf002_context: "El token CSRF proporcionado no coincide con el token de sesión"
281 + error_csrf002_example: "Token CSRF modificado o robado"
282 + error_rate001_desc: "Límite de tasa excedido"
283 + error_rate001_category: "Rate Limiting"
284 + error_rate001_context: "Se ha excedido el número de solicitudes por minuto"
285 + error_rate001_example: "Más de 100 solicitudes/min en endpoints admin"
286 + error_valid001_desc: "Datos de entrada inválidos"
287 + error_valid001_category: "Validación"
288 + error_valid001_context: "Los datos proporcionados no cumplen con las reglas de validación"
289 + error_valid001_example: "Formato de email inválido o campo requerido faltante"
290 + error_valid002_desc: "Complejidad de contraseña no cumplida"
291 + error_valid002_category: "Validación"
292 + error_valid002_context: "La contraseña no cumple con las reglas de complejidad configuradas"
293 + error_valid002_example: "Contraseña demasiado corta o sin los caracteres requeridos"
294 + error_rbac001_desc: "Permisos insuficientes"
295 + error_rbac001_category: "Autorización"
296 + error_rbac001_context: "El usuario no tiene los permisos necesarios para esta acción"
297 + error_rbac001_example: "Usuario no administrador intentando acceder a /admin/users"
298 + error_rbac002_desc: "Rol de administrador requerido"
299 + error_rbac002_category: "Autorización"
300 + error_rbac002_context: "La acción requiere un rol de administrador"
301 + error_rbac002_example: "Intento de eliminar un usuario sin rol admin"
302 + error_db001_desc: "Error de operación de base de datos"
303 + error_db001_category: "Base de datos"
304 + error_db001_context: "Una operación de base de datos falló"
305 + error_db001_example: "Restricción de clave foránea violada o conexión DB perdida"
306 + error_db002_desc: "Recurso no encontrado"
307 + error_db002_category: "Base de datos"
308 + error_db002_context: "El recurso solicitado no existe en la base de datos"
309 + error_db002_example: "Usuario con ID inexistente"
310 + user_form:
311 + breadcrumb_create: "Crear"
312 + breadcrumb_edit: "Modificar"
313 + title_create: "Crear un usuario"
314 + title_edit: "Modificar un usuario"
315 + back_to_list: "Volver a la lista"
316 + username_label: "Nombre de usuario"
317 + username_placeholder: "nombre_usuario"
318 + username_readonly_hint: "El nombre de usuario no se puede cambiar después de la creación"
319 + email_label: "Email"
320 + email_placeholder: "usuario@example.com"
321 + password_label: "Contraseña"
322 + password_optional: "Opcional"
323 + password_placeholder: "Dejar vacío para generar una contraseña aleatoria"
324 + password_hint: "Si se deja vacío, se generará automáticamente una contraseña segura"
325 + roles_label: "Roles"
326 + roles_hint: "Seleccione al menos un rol"
327 + must_change_password_label: "Forzar cambio de contraseña"
328 + must_change_password_desc: "El usuario deberá cambiar su contraseña en el próximo inicio de sesión"
329 + cancel: "Cancelar"
330 + submit_create: "Crear usuario"
331 + submit_edit: "Guardar cambios"
332 + settings:
333 + title: "Configuración de la aplicación"
334 + page_title: "Configuración de la aplicación - Admin - RustCloud"
335 + subtitle: "Configuración global de RustCloud"
336 + general: "General"
337 + app_name: "Nombre de la aplicación"
338 + app_domain: "Dominio"
339 + app_domain_placeholder: "example.com"
340 + app_description: "Descripción"
341 + allow_registration: "Permitir registro"
342 + allow_registration_desc: "Los usuarios pueden crear cuentas desde la página de inicio"
343 + email_validation_required: "Validación de email requerida"
344 + email_validation_required_desc: "Los usuarios deben validar su email antes de poder iniciar sesión"
345 + save: "Guardar configuración"
346 + cancel: "Cancelar"
347 + saved: "Configuración guardada con éxito"
348 + error: "Error al guardar la configuración"
349 + network_error: "Error de red. Por favor intente nuevamente."
350 + password_security: "Seguridad de Contraseñas"
351 + password_min_length: "Longitud mínima"
352 + password_min_length_hint: "Entre 6 y 128 caracteres"
353 + password_complexity: "Requisitos de complejidad"
354 + require_uppercase: "Mayúscula requerida"
355 + require_lowercase: "Minúscula requerida"
356 + require_digits: "Dígito requerido"
357 + require_special: "Carácter especial requerido"
358 + password_change_require_email: "Confirmación por email del cambio de contraseña"
359 + password_change_require_email_desc: "Cuando está activado, se envía un correo de confirmación para validar cualquier cambio de contraseña. De lo contrario, el cambio se aplica inmediatamente."
360 + password_expiration: "Expiración de contraseñas"
361 + password_expiration_desc: "Forzar cambio periódico de contraseña"
362 + expiration_days: "Expiración después de (días)"
363 + expiration_alert: "Alerta por email antes de la expiración"
364 + expiration_alert_days: "Alerta (días antes)"
365 + audit_logging: "Registro de Auditoría"
366 + log_level: "Nivel de log"
367 + log_level_debug: "DEBUG - Todos los detalles"
368 + log_level_info: "INFO - Información normal"
369 + log_level_warn: "WARN - Solo advertencias"
370 + log_level_error: "ERROR - Solo errores"
371 + log_level_hint: "Controla la verbosidad de los logs de auditoría"
372 + log_retention: "Retención de logs (días)"
373 + log_retention_hint: "Período de retención de logs (1-365 días)"
374 + audit_info_message: "Los logs de auditoría registran todas las acciones administrativas (creación, modificación, eliminación de usuarios)."
375 + save_changes: "Guardar cambios"
376 + save_changes_desc: "La configuración se aplicará inmediatamente"
377 + saving: "Guardando..."
378 + save_success: "¡Configuración guardada con éxito!"
379 + save_error_prefix: "Error"
380 + # OAuth / SSO admin settings
381 + oauth_sso_title: "OAuth / SSO"
382 + oauth_enabled_label: "Activar OAuth"
383 + oauth_enabled_desc: "Permitir inicio de sesión a través de proveedores externos (Google, GitHub, etc.)"
384 + oauth_redirect_url_label: "URL base de redirección"
385 + oauth_redirect_url_desc: "URL base para callbacks OAuth (ej: https://miapp.example.com)"
386 + oauth_auto_register_label: "Auto-registro"
387 + oauth_auto_register_desc: "Crear automáticamente una cuenta si el correo no existe"
388 + oauth_link_existing_label: "Vincular cuentas existentes"
389 + oauth_link_existing_desc: "Vincular automáticamente una cuenta OAuth si el correo verificado coincide"
390 + oauth_client_id: "Client ID"
391 + oauth_client_secret: "Client Secret"
392 + oauth_tenant: "Tenant ID"
393 + oauth_redirect_uri: "URI de redirección"
394 + oauth_copy_uri: "Copiar"
395 + oauth_secret_configured: "Configurado"
396 + oauth_secret_not_configured: "No configurado"
397 + oauth_secret_change: "Cambiar"
398 + oauth_restart_warning: "Los cambios de credenciales requieren un reinicio de la aplicación."
399 + oauth_env_info: "Las credenciales también se pueden configurar mediante variables de entorno (OAUTH_*_CLIENT_ID, etc.)."
400 + oauth_google_label: "Google"
401 + oauth_google_desc: "OpenID Connect"
402 + oauth_github_label: "GitHub"
403 + oauth_github_desc: "OAuth2"
404 + oauth_discord_label: "Discord"
405 + oauth_discord_desc: "OAuth2"
406 + oauth_microsoft_label: "Microsoft"
407 + oauth_microsoft_desc: "OpenID Connect"
408 + users_list:
409 + page_title: "Gestión de Usuarios - Admin - RustCloud"
410 + title: "Gestión de Usuarios"
411 + breadcrumb_users: "Usuarios"
412 + create_user: "Crear usuario"
413 + search_label: "Buscar"
414 + search_placeholder: "Nombre de usuario o email..."
415 + role_filter_label: "Rol"
416 + all_roles: "Todos los roles"
417 + per_page_label: "Por página"
418 + search_button: "Buscar"
419 + results_summary: "Mostrando {count} usuario(s) de {total} total"
420 + page_info: "Página {page} de {total_pages}"
421 + table_username: "Nombre de usuario"
422 + table_email: "Email"
423 + table_roles: "Roles"
424 + table_created_at: "Creado el"
425 + table_last_login: "Último inicio de sesión"
426 + table_actions: "Acciones"
427 + never: "Nunca"
428 + edit: "Modificar"
429 + no_users: "No se encontraron usuarios"
430 + reset_password_title: "Restablecer contraseña"
431 + reset_generate: "Generar contraseña aleatoria"
432 + reset_custom: "Establecer contraseña personalizada"
433 + reset_new_password_label: "Nueva contraseña"
434 + reset_new_password_placeholder: "Mínimo 8 caracteres, mayúscula, minúscula, dígito, carácter especial"
435 + reset_password_requirements: "⚠️ Debe contener: 8+ caracteres, mayúscula, minúscula, dígito, carácter especial"
436 + reset_invalidate_sessions: "Invalidar todas las sesiones activas de este usuario"
437 + reset_invalidate_sessions_desc: "El usuario deberá iniciar sesión nuevamente después del cambio"
438 + reset_button: "Restablecer"
439 + delete_confirm_title: "⚠️ Confirmar eliminación"
440 + delete_confirm_message: "¿Está seguro de que desea eliminar este usuario?"
441 + delete_confirm_username: "Nombre de usuario:"
442 + delete_confirm_email: "Email:"
443 + delete_irreversible: "¡Esta acción es irreversible!"
444 + delete_button: "Eliminar permanentemente"
445 + delete: "Eliminar"
446 + delete_error: "Error al eliminar el usuario"
447 + network_error: "Error de red"
448 + edit_user_title: "Modificar usuario"
449 + resetting: "Restableciendo..."
450 + reset_by_email_title: "Restablecer por email"
451 + reset_email: "Restablecer por email"
452 + close: "Cerrar"
453 + password_reset_success_title: "Contraseña restablecida"
454 + password_warning_once: "¡Esta contraseña solo se mostrará una vez. Cópiela ahora!"
455 + new_password_label: "Nueva contraseña"
456 + copy: "Copiar"
457 + password_copied: "Contraseña copiada al portapapeles"
458 + password_set_success: "Contraseña restablecida con éxito"
459 + reset_error: "Error al restablecer la contraseña"
460 +
461 +# Cambio de contraseña
462 +password:
463 + title: "Cambiar mi contraseña"
464 + page_title: "Cambiar mi contraseña - RustCloud"
465 + subtitle: "Modifique su contraseña para asegurar su cuenta. Se enviará un correo electrónico de confirmación para validar el cambio."
466 + subtitle_no_email: "Modifique su contraseña para asegurar su cuenta."
467 + must_change_message: "⚠️ Debe cambiar su contraseña antes de continuar."
468 + new_password: "Nueva contraseña"
469 + current_password: "Contraseña actual"
470 + current_password_placeholder: "Su contraseña actual"
471 + new_password_placeholder: "Nueva contraseña segura"
472 + required: "Requerido"
473 + requirements: "📌 Requisitos: 8+ caracteres, mayúscula, minúscula, dígito, carácter especial"
474 + strength: "Fortaleza de la contraseña:"
475 + strength_weak: "Débil"
476 + strength_medium: "Medio"
477 + strength_strong: "Fuerte ✓"
478 + strength_too_short: "demasiado corta"
479 + strength_missing_lowercase: "falta minúscula"
480 + strength_missing_uppercase: "falta mayúscula"
481 + strength_missing_digit: "falta dígito"
482 + strength_missing_special: "falta carácter especial"
483 + confirm_password: "Confirmar nueva contraseña"
484 + confirm_password_placeholder: "Repita la nueva contraseña"
485 + passwords_match: "✓ Las contraseñas coinciden"
486 + passwords_not_match: "✗ Las contraseñas no coinciden"
487 + change_button: "Cambiar contraseña"
488 + changing: "Cambiando..."
489 + logout_warning_title: "Cerrar sesión de otras sesiones"
490 + logout_warning_desc: "Todas sus otras sesiones activas se cerrarán automáticamente después del cambio de contraseña. Solo su sesión actual permanecerá activa."
491 + save: "Guardar nueva contraseña"
492 + saving: "Guardando..."
493 + saved: "Se ha enviado un correo electrónico de confirmación a su dirección. Haga clic en el enlace del correo para validar el cambio de contraseña."
494 + saved_direct: "¡Contraseña cambiada con éxito! Sus otras sesiones han sido cerradas."
495 + error: "Error al cambiar la contraseña"
496 + error_all_fields_required: "Todos los campos son obligatorios."
497 + error_empty_data: "Los datos a enviar están vacíos."
498 + error_invalid_data: "Datos inválidos. Verifique que todos los campos estén completos."
499 + error_incorrect_current: "La contraseña actual es incorrecta."
500 + error_reading_response: "Error al leer la respuesta del servidor"
501 + error_415: "Error 415: El servidor no recibió los datos en el formato JSON esperado. Por favor intente nuevamente."
502 + network_error: "Error de red. Por favor intente nuevamente."
503 + security_tips_title: "Consejos de seguridad"
504 + security_tip_unique: "Use una contraseña única que no use en otro lugar"
505 + security_tip_share: "Nunca comparta su contraseña con nadie"
506 + security_tip_regular: "Cambie su contraseña regularmente (cada 3-6 meses)"
507 + security_tip_2fa: "Active la autenticación de dos factores si está disponible"
508 + security_tip_manager: "Use un administrador de contraseñas para mayor seguridad"
509 +
510 +# Sesiones
511 +sessions:
512 + title: "Sesiones activas"
513 + page_title: "Sesiones activas - RustCloud"
514 + subtitle: "Gestione los dispositivos conectados a su cuenta"
515 + current_session: "Sesión actual"
516 + current_badge: "Actual"
517 + unknown_device: "Dispositivo desconocido"
518 + ip_address: "Dirección IP:"
519 + created_at: "Creada el:"
520 + last_activity: "Última actividad:"
521 + session_id: "ID de sesión:"
522 + revoke: "Revocar"
523 + revoke_confirm: "¿Está seguro de que desea revocar la sesión para \"{device}\"?\n\nEste dispositivo será desconectado inmediatamente."
524 + revoke_success: "¡Sesión revocada con éxito!"
525 + revoke_error: "Error al revocar la sesión"
526 + no_sessions: "No hay sesiones activas"
527 + no_sessions_desc: "Actualmente no tiene sesiones activas"
528 + danger_zone: "Zona de peligro"
529 + danger_zone_desc: "Desconecte todos los demás dispositivos en una sola acción (su sesión actual permanecerá activa)."
530 + revoke_all: "Revocar todas las demás sesiones"
531 + revoke_all_confirm: "⚠️ ADVERTENCIA\n\n¿Está seguro de que desea revocar TODAS sus demás sesiones?\n\nTodos sus demás dispositivos serán desconectados. Solo su sesión actual permanecerá activa."
532 + revoke_all_success: "¡Todas las demás sesiones han sido revocadas!"
533 + revoke_all_error: "Error al revocar. Es posible que algunas sesiones no hayan sido revocadas."
534 + about_title: "Acerca de las sesiones"
535 + about_desc: "Se crea una sesión cada vez que inicia sesión desde un dispositivo o navegador diferente. Revocar una sesión desconecta inmediatamente ese dispositivo. Su sesión actual no puede ser revocada desde esta página (cierre sesión para hacerlo)."
536 + back_to_settings: "Volver a configuración"
537 +
538 +# Navigation menu (navbar)
539 +nav:
540 + home: "Inicio"
541 + settings: "Configuración"
542 + admin: "Administración"
543 +
544 +# User menu
545 +user_menu:
546 + profile: "Perfil"
547 + logout: "Cerrar sesión"
548 + settings: "Configuración"
A crates/rustwarden-ui/locales/fr.yml
+655 -0
@@ -0,0 +1,655 @@
1 +# Traductions françaises — rustwarden-ui
2 +# Sections : login, pages utilisateur, admin, navigation
3 +
4 +# Connexion
5 +login:
6 + title: "Connexion"
7 + page_title: "Connexion - RustCloud"
8 + page_description: "Connexion à RustCloud"
9 + subtitle: "Connectez-vous à votre espace cloud"
10 + username: "Nom d'utilisateur"
11 + password: "Mot de passe"
12 + submit: "Se connecter"
13 + remember_me: "Se souvenir de moi"
14 + tab_login: "Connexion"
15 + tab_register: "Inscription"
16 + register_title: "Créer un compte"
17 + register_submit: "Créer mon compte"
18 + username_placeholder: "Votre nom d'utilisateur"
19 + password_placeholder: "Votre mot de passe"
20 + username_placeholder_register: "Votre nom d'utilisateur (min. 3 caractères)"
21 + password_placeholder_register: "Votre mot de passe (min. 8 caractères)"
22 + email_placeholder: "votre@email.com"
23 + forgot_password: "Mot de passe oublié ?"
24 + email_not_verified: "Email non vérifié ?"
25 + resend_verification: "Renvoyer l'email de validation"
26 + already_have_account: "Déjà un compte ?"
27 + sign_in_link: "Se connecter"
28 + success_message: "Connexion réussie ! Redirection..."
29 + error_message: "Erreur de connexion. Vérifiez vos identifiants."
30 + email_unverified_message: "Votre email n'est pas vérifié. Cliquez ci-dessous pour renvoyer le lien."
31 + resend_button: "Renvoyer l'email de validation"
32 + resend_success: "Email de validation renvoyé si le compte existe."
33 + resend_error: "Impossible d'envoyer la demande pour l'instant."
34 + resend_prompt: "Veuillez renseigner votre email avant de renvoyer."
35 + register_success: "Compte créé avec succès ! Veuillez vérifier votre email."
36 + register_error: "Erreur lors de l'inscription"
37 + email_label: "Email"
38 + footer_text: "Fork de Nextcloud en Rust"
39 +
40 +# Renvoyer l'email de validation
41 +resend_verification:
42 + page_title: "Renvoyer l'email de validation - RustWarden"
43 + title: "Renvoyer l'email de validation"
44 + subtitle: "Entrez votre adresse email pour recevoir un nouveau lien de validation."
45 + email_label: "Adresse email"
46 + email_placeholder: "vous@example.com"
47 + submit: "Envoyer le lien de validation"
48 + back_to_login: "Revenir à la connexion"
49 + error_default: "Impossible d'envoyer la demande."
50 + success_default: "Si le compte existe et n'est pas vérifié, un email a été envoyé."
51 + error_missing_email: "Veuillez renseigner votre email."
52 + error_cannot_send: "Impossible d'envoyer la demande pour l'instant."
53 +
54 +# Réinitialisation de mot de passe (via lien email)
55 +password_reset:
56 + page_title: "Réinitialiser le mot de passe"
57 + title: "Réinitialiser le mot de passe"
58 + subtitle: "Entrez votre nouveau mot de passe ci-dessous."
59 + new_password_label: "Nouveau mot de passe"
60 + new_password_placeholder: "Nouveau mot de passe sécurisé"
61 + requirements: "⚠️ Doit contenir : 8+ caractères, majuscule, minuscule, chiffre, caractère spécial"
62 + confirm_password_label: "Confirmer le mot de passe"
63 + confirm_password_placeholder: "Confirmez votre nouveau mot de passe"
64 + missing_token_url: "Token de réinitialisation manquant dans l'URL."
65 + missing_token: "Token de réinitialisation manquant."
66 + missing_new_password: "Veuillez entrer un nouveau mot de passe."
67 + passwords_not_match: "Les mots de passe ne correspondent pas."
68 + success_message: "Votre mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter."
69 + error_link_invalid: "Impossible de réinitialiser le mot de passe. Le lien peut être expiré ou invalide."
70 + error_generic: "Impossible de réinitialiser le mot de passe pour l'instant."
71 +
72 +# Paramètres
73 +settings:
74 + title: "Paramètres"
75 + page_title: "Paramètres - RustWarden"
76 + subtitle: "Gérez vos préférences et paramètres de compte"
77 + profile_title: "Mon Profil"
78 + profile_desc: "Modifiez vos informations personnelles (nom d'utilisateur, email)"
79 + password_title: "Mot de passe"
80 + password_desc: "Changez votre mot de passe pour sécuriser votre compte"
81 + sessions_title: "Sessions actives"
82 + sessions_desc: "Gérez vos sessions actives et révoquez l'accès depuis d'autres appareils"
83 + preferences_title: "Préférences"
84 + preferences_desc: "Personnalisez votre expérience (thème, langue)"
85 + access: "Accéder"
86 + info_title: "Informations"
87 + info_desc: "Utilisez les sections ci-dessus pour gérer différents aspects de votre compte. Toutes les modifications sont sécurisées et nécessitent votre authentification."
88 + language: "Langue"
89 + language_description: "Choisissez votre langue préférée"
90 + save: "Enregistrer"
91 + saved: "Paramètres enregistrés"
92 +
93 +# Page d'accueil
94 +home:
95 + welcome: "Bienvenue, {username} !"
96 + subtitle: "Bienvenue sur votre espace personnel"
97 + my_account: "Mon Compte"
98 + stat_username: "Nom d'utilisateur"
99 + stat_email: "Email"
100 + stat_member_since: "Membre depuis"
101 + stat_roles: "Rôles"
102 +
103 +# Préférences
104 +preferences:
105 + title: "Préférences d'affichage"
106 + page_title: "Préférences d'affichage - RustCloud"
107 + subtitle: "Personnalisez l'apparence de l'interface"
108 + theme: "Thème"
109 + theme_light: "Clair"
110 + theme_light_desc: "Interface lumineuse et épurée"
111 + theme_dark: "Sombre"
112 + theme_dark_desc: "Réduit la fatigue oculaire"
113 + theme_auto: "Automatique"
114 + theme_auto_desc: "S'adapte à l'heure de la journée"
115 + theme_preview: "Le thème sera appliqué immédiatement après l'enregistrement"
116 + language: "Langue"
117 + language_fr: "Français"
118 + language_fr_desc: "Interface en français"
119 + language_en: "English"
120 + language_en_desc: "English interface"
121 + language_de: "Deutsch"
122 + language_de_desc: "Deutsche Benutzeroberfläche"
123 + language_es: "Español"
124 + language_es_desc: "Interfaz en español"
125 + translation_warning: "La traduction complète de l'interface est en cours de développement. Certains éléments peuvent rester en français."
126 + modified: "Préférences modifiées"
127 + modified_desc: "Enregistrez vos changements pour les appliquer"
128 + save: "Enregistrer les préférences"
129 + saving: "Enregistrement..."
130 + cancel: "Annuler"
131 + saved_success: "Préférences enregistrées avec succès !"
132 + saved_reload: "Préférences enregistrées avec succès !\n\nLa langue a été modifiée. Voulez-vous recharger la page maintenant pour appliquer les changements ?"
133 + error: "Erreur : {message}"
134 + network_error: "Erreur réseau. Veuillez réessayer."
135 + sync_title: "Vos préférences sont synchronisées"
136 + sync_desc: "Vos préférences d'affichage sont enregistrées et s'appliquent automatiquement sur tous vos appareils connectés à votre compte RustCloud."
137 + preview_dark: "Aperçu : Thème sombre sera appliqué"
138 + preview_light: "Aperçu : Thème clair sera appliqué"
139 + preview_auto: "Aperçu : Thème automatique sera appliqué"
140 +
141 +# Profil
142 +profile:
143 + title: "Mon Profil"
144 + page_title: "Mon Profil - RustCloud"
145 + subtitle: "Modifiez vos informations personnelles"
146 + account_info: "Informations du compte"
147 + username: "Nom d'utilisateur"
148 + username_public: "Visible publiquement"
149 + username_placeholder: "Votre nom d'utilisateur"
150 + username_pattern: "Lettres, chiffres, tirets et underscores uniquement"
151 + email: "Email"
152 + email_placeholder: "votre@email.com"
153 + save: "Enregistrer les modifications"
154 + saving: "Enregistrement..."
155 + saved: "Profil mis à jour avec succès"
156 + error: "Erreur lors de la mise à jour du profil"
157 + email_label: "Adresse email"
158 + email_used_for: "Utilisée pour la connexion"
159 + email_warning: "⚠️ Vous serez déconnecté après la modification"
160 + email_change_info: "Les modifications d'email nécessitent une reconnexion pour des raisons de sécurité."
161 + username_help: "3-50 caractères (lettres, chiffres, -, _)"
162 + additional_info: "Informations supplémentaires"
163 + account_created: "Compte créé le"
164 + roles: "Rôles"
165 + linked_accounts_title: "Comptes liés"
166 + no_linked_accounts: "Aucun compte externe lié."
167 + linked_since: "Lié depuis"
168 + unlink_button: "Délier"
169 + unlink_confirm: "Êtes-vous sûr de vouloir délier ce compte ?"
170 + unlink_error: "Impossible de délier ce compte."
171 + cannot_unlink_last: "Impossible de supprimer votre dernier moyen d'authentification."
172 +
173 +# Breadcrumb
174 +breadcrumb:
175 + home: "Accueil"
176 + settings: "Paramètres"
177 + admin: "Administration"
178 + preferences: "Préférences"
179 + profile: "Profil"
180 + password: "Mot de passe"
181 + users: "Utilisateurs"
182 + sessions: "Sessions"
183 +
184 +# Admin
185 +admin:
186 + dashboard:
187 + title: "Administration"
188 + heading: "Tableau de bord Administrateur"
189 + users_card_title: "Utilisateurs"
190 + users_card_subtitle: "Total utilisateurs"
191 + access_button: "Accéder"
192 + sessions_card_title: "Sessions actives"
193 + sessions_card_subtitle: "Sessions en cours"
194 + admins_card_title: "Administrateurs"
195 + admins_card_subtitle: "Comptes admin"
196 + last_activity_card_title: "Dernière activité"
197 + last_activity_card_subtitle: "Dernière connexion"
198 + audit_section_title: "Statistiques des logs d'audit"
199 + audit_total_logs: "Total des logs"
200 + audit_last_24h: "Dernières 24h"
201 + audit_by_level: "Par niveau"
202 + chart_label: "Logs par niveau"
203 + roles_card_title: "Gestion des Rôles"
204 + roles_card_desc: "Gérer les rôles et les permissions granulaires"
205 + roles_stat_title: "Rôles"
206 + settings_card_title: "Paramètres Application"
207 + settings_card_desc: "Configurer les paramètres globaux de l'application"
208 + apps_card_title: "Gestion des Applications"
209 + apps_card_desc: "Activer ou désactiver les applications modulaires"
210 + orgs_card_title: "Gestion des Organisations"
211 + orgs_card_desc: "Créer et gérer les organisations et leurs membres"
212 + orgs_stat_title: "Organisations"
213 + orgs_members_stat_title: "Membres totaux"
214 + roles_list:
215 + page_title: "Gestion des rôles"
216 + breadcrumb_roles: "Rôles"
217 + title: "Rôles"
218 + create_role: "Créer un rôle"
219 + table_name: "Nom"
220 + table_description: "Description"
221 + table_users: "Utilisateurs"
222 + table_permissions: "Permissions"
223 + table_actions: "Actions"
224 + edit: "Modifier"
225 + delete: "Supprimer"
226 + no_roles: "Aucun rôle trouvé."
227 + protected_hint: "Protégé"
228 + delete_confirm_title: "Confirmer la suppression"
229 + delete_confirm_message: "Êtes-vous sûr de vouloir supprimer le rôle"
230 + delete_button: "Supprimer"
231 + role_form:
232 + title_create: "Créer un rôle"
233 + title_edit: "Modifier le rôle"
234 + breadcrumb_create: "Créer"
235 + breadcrumb_edit: "Modifier"
236 + back_to_list: "Retour à la liste"
237 + name_label: "Nom du rôle"
238 + name_placeholder: "ex: moderator"
239 + description_label: "Description"
240 + description_placeholder: "Description du rôle..."
241 + permissions_label: "Permissions"
242 + protected_name_hint: "Le nom de ce rôle ne peut pas être modifié."
243 + cancel: "Annuler"
244 + submit_create: "Créer le rôle"
245 + submit_edit: "Enregistrer les modifications"
246 + errors:
247 + title: "Codes d'Erreur"
248 + description: "Documentation des codes d'erreur de l'application. Chaque code d'erreur est associé à un middleware et fournit des informations de contexte pour le débogage."
249 + breadcrumb_errors: "Codes d'Erreur"
250 + table_code: "Code"
251 + table_description: "Description"
252 + table_category: "Catégorie"
253 + table_middleware: "Middleware"
254 + table_context: "Contexte"
255 + table_example: "Exemple"
256 + legend_title: "Légende"
257 + legend_code: "Identifiant unique de l'erreur (format: CATEGORY_NUMBER)"
258 + legend_description: "Description en français de l'erreur"
259 + legend_category: "Type d'erreur (Authentification, CSRF, Rate Limiting, etc.)"
260 + legend_middleware: "Middleware responsable de générer cette erreur"
261 + legend_context: "Explication détaillée de quand cette erreur se produit"
262 + legend_example: "Exemple concret de situation générant cette erreur"
263 + error_auth001_desc: "Identifiants invalides"
264 + error_auth001_category: "Authentification"
265 + error_auth001_context: "L'utilisateur a fourni des identifiants incorrects lors de la connexion"
266 + error_auth001_example: "Tentative de connexion avec un mot de passe incorrect"
267 + error_auth002_desc: "Token invalide"
268 + error_auth002_category: "Authentification"
269 + error_auth002_context: "Le token JWT fourni est invalide ou malformé"
270 + error_auth002_example: "Token JWT corrompu ou signé avec une clé différente"
271 + error_auth003_desc: "Token expiré"
272 + error_auth003_category: "Authentification"
273 + error_auth003_context: "Le token JWT a expiré et doit être renouvelé"
274 + error_auth003_example: "Tentative d'accès avec un token expiré après la durée de validité"
275 + error_csrf001_desc: "Token CSRF manquant"
276 + error_csrf001_category: "CSRF Protection"
277 + error_csrf001_context: "La requête POST/PUT/DELETE ne contient pas de token CSRF"
278 + error_csrf001_example: "Formulaire soumis sans token CSRF dans le header ou le body"
279 + error_csrf002_desc: "Token CSRF invalide"
280 + error_csrf002_category: "CSRF Protection"
281 + error_csrf002_context: "Le token CSRF fourni ne correspond pas au token de la session"
282 + error_csrf002_example: "Token CSRF modifié ou volé"
283 + error_rate001_desc: "Limite de taux dépassée"
284 + error_rate001_category: "Rate Limiting"
285 + error_rate001_context: "Le nombre de requêtes par minute a été dépassé"
286 + error_rate001_example: "Plus de 100 requêtes/min sur les endpoints admin"
287 + error_valid001_desc: "Données d'entrée invalides"
288 + error_valid001_category: "Validation"
289 + error_valid001_context: "Les données fournies ne respectent pas les règles de validation"
290 + error_valid001_example: "Email au format invalide ou champ requis manquant"
291 + error_valid002_desc: "Complexité du mot de passe non respectée"
292 + error_valid002_category: "Validation"
293 + error_valid002_context: "Le mot de passe ne respecte pas les règles de complexité configurées"
294 + error_valid002_example: "Mot de passe trop court ou ne contenant pas les caractères requis"
295 + error_rbac001_desc: "Permissions insuffisantes"
296 + error_rbac001_category: "Autorisation"
297 + error_rbac001_context: "L'utilisateur n'a pas les permissions nécessaires pour cette action"
298 + error_rbac001_example: "Utilisateur non-admin tentant d'accéder à /admin/users"
299 + error_rbac002_desc: "Rôle administrateur requis"
300 + error_rbac002_category: "Autorisation"
301 + error_rbac002_context: "L'action nécessite le rôle administrateur"
302 + error_rbac002_example: "Tentative de suppression d'utilisateur sans rôle admin"
303 + error_db001_desc: "Erreur d'opération de base de données"
304 + error_db001_category: "Base de données"
305 + error_db001_context: "Une opération de base de données a échoué"
306 + error_db001_example: "Contrainte de clé étrangère violée ou connexion DB perdue"
307 + error_db002_desc: "Ressource non trouvée"
308 + error_db002_category: "Base de données"
309 + error_db002_context: "La ressource demandée n'existe pas dans la base de données"
310 + error_db002_example: "Utilisateur avec ID inexistant"
311 + user_form:
312 + breadcrumb_create: "Créer"
313 + breadcrumb_edit: "Modifier"
314 + title_create: "Créer un utilisateur"
315 + title_edit: "Modifier un utilisateur"
316 + back_to_list: "Retour à la liste"
317 + username_label: "Nom d'utilisateur"
318 + username_placeholder: "nom_utilisateur"
319 + username_readonly_hint: "Le nom d'utilisateur ne peut pas être modifié après création"
320 + email_label: "Email"
321 + email_placeholder: "utilisateur@example.com"
322 + password_label: "Mot de passe"
323 + password_optional: "Optionnel"
324 + password_placeholder: "Laisser vide pour générer un mot de passe aléatoire"
325 + password_hint: "Si laissé vide, un mot de passe sécurisé sera généré automatiquement"
326 + roles_label: "Rôles"
327 + roles_hint: "Sélectionnez au moins un rôle"
328 + must_change_password_label: "Forcer le changement de mot de passe"
329 + must_change_password_desc: "L'utilisateur devra changer son mot de passe à la prochaine connexion"
330 + cancel: "Annuler"
331 + submit_create: "Créer l'utilisateur"
332 + submit_edit: "Enregistrer les modifications"
333 + settings:
334 + title: "Paramètres de l'Application"
335 + page_title: "Paramètres de l'Application - Admin - RustCloud"
336 + subtitle: "Configuration globale de RustCloud"
337 + general: "Général"
338 + app_name: "Nom de l'application"
339 + app_domain: "Domaine"
340 + app_domain_placeholder: "example.com"
341 + app_description: "Description"
342 + allow_registration: "Permettre l'enregistrement"
343 + allow_registration_desc: "Les utilisateurs peuvent créer des comptes depuis la page d'accueil"
344 + email_validation_required: "Validation email requise"
345 + email_validation_required_desc: "Les utilisateurs doivent valider leur email avant de pouvoir se connecter"
346 + save: "Enregistrer les paramètres"
347 + cancel: "Annuler"
348 + saved: "Paramètres enregistrés avec succès"
349 + error: "Erreur lors de l'enregistrement"
350 + network_error: "Erreur réseau. Veuillez réessayer."
351 + password_security: "Sécurité des Mots de Passe"
352 + password_min_length: "Longueur minimale"
353 + password_min_length_hint: "Entre 6 et 128 caractères"
354 + password_complexity: "Exigences de complexité"
355 + require_uppercase: "Majuscule requise"
356 + require_lowercase: "Minuscule requise"
357 + require_digits: "Chiffre requis"
358 + require_special: "Caractère spécial requis"
359 + password_change_require_email: "Confirmation par email du changement de mot de passe"
360 + password_change_require_email_desc: "Lorsqu'activé, un email de confirmation est envoyé pour valider tout changement de mot de passe. Sinon, le changement est appliqué immédiatement."
361 + password_expiration: "Expiration des mots de passe"
362 + password_expiration_desc: "Forcer le changement périodique"
363 + expiration_days: "Expiration après (jours)"
364 + expiration_alert: "Alerte email avant expiration"
365 + expiration_alert_days: "Alerte (jours avant)"
366 + audit_logging: "Journalisation des Audits"
367 + log_level: "Niveau de log"
368 + log_level_debug: "DEBUG - Tous les détails"
369 + log_level_info: "INFO - Informations normales"
370 + log_level_warn: "WARN - Avertissements uniquement"
371 + log_level_error: "ERROR - Erreurs uniquement"
372 + log_level_hint: "Contrôle la verbosité des logs d'audit"
373 + log_retention: "Rétention des logs (jours)"
374 + log_retention_hint: "Durée de conservation des logs (1-365 jours)"
375 + audit_info_message: "Les logs d'audit enregistrent toutes les actions administratives (création, modification, suppression d'utilisateurs)."
376 + save_changes: "Sauvegarder les modifications"
377 + save_changes_desc: "Les paramètres seront appliqués immédiatement"
378 + saving: "Enregistrement..."
379 + save_success: "Paramètres enregistrés avec succès !"
380 + save_error_prefix: "Erreur"
381 + oauth_sso_title: "OAuth / SSO"
382 + oauth_enabled_label: "Activer OAuth"
383 + oauth_enabled_desc: "Autorise la connexion via des fournisseurs externes (Google, GitHub, etc.)"
384 + oauth_redirect_url_label: "URL de redirection de base"
385 + oauth_redirect_url_desc: "URL de base pour les callbacks OAuth (ex: https://monapp.example.com)"
386 + oauth_auto_register_label: "Auto-inscription"
387 + oauth_auto_register_desc: "Créer automatiquement un compte si l'email n'existe pas"
388 + oauth_link_existing_label: "Lier les comptes existants"
389 + oauth_link_existing_desc: "Lier automatiquement un compte OAuth si l'email vérifié correspond"
390 + oauth_client_id: "Client ID"
391 + oauth_client_secret: "Client Secret"
392 + oauth_tenant: "Tenant ID"
393 + oauth_redirect_uri: "URI de redirection"
394 + oauth_copy_uri: "Copier"
395 + oauth_secret_configured: "Configuré"
396 + oauth_secret_not_configured: "Non configuré"
397 + oauth_secret_change: "Modifier"
398 + oauth_restart_warning: "Les modifications de credentials nécessitent un redémarrage de l'application."
399 + oauth_env_info: "Les credentials peuvent aussi être configurées via variables d'environnement (OAUTH_*_CLIENT_ID, etc.)."
400 + oauth_google_label: "Google"
401 + oauth_google_desc: "OpenID Connect"
402 + oauth_github_label: "GitHub"
403 + oauth_github_desc: "OAuth2"
404 + oauth_discord_label: "Discord"
405 + oauth_discord_desc: "OAuth2"
406 + oauth_microsoft_label: "Microsoft"
407 + oauth_microsoft_desc: "OpenID Connect"
408 + users_list:
409 + page_title: "Gestion des Utilisateurs - Admin - RustCloud"
410 + title: "Gestion des Utilisateurs"
411 + breadcrumb_users: "Utilisateurs"
412 + create_user: "Créer un utilisateur"
413 + search_label: "Rechercher"
414 + search_placeholder: "Nom d'utilisateur ou email..."
415 + role_filter_label: "Rôle"
416 + all_roles: "Tous les rôles"
417 + per_page_label: "Par page"
418 + search_button: "Rechercher"
419 + results_summary: "Affichage de {count} utilisateur(s) sur {total} total"
420 + page_info: "Page {page} sur {total_pages}"
421 + table_username: "Nom d'utilisateur"
422 + table_email: "Email"
423 + table_roles: "Rôles"
424 + table_created_at: "Créé le"
425 + table_last_login: "Dernière connexion"
426 + table_actions: "Actions"
427 + never: "Jamais"
428 + edit: "Modifier"
429 + delete: "Supprimer"
430 + reset_password: "Réinitialiser le mot de passe"
431 + no_users: "Aucun utilisateur trouvé"
432 + reset_password_title: "Réinitialiser le mot de passe"
433 + reset_generate: "Générer un mot de passe aléatoire"
434 + reset_custom: "Définir un mot de passe personnalisé"
435 + reset_email: "Réinitialiser par email"
436 + reset_new_password_label: "Nouveau mot de passe"
437 + reset_new_password_placeholder: "Minimum 8 caractères, majuscule, minuscule, chiffre, caractère spécial"
438 + reset_password_requirements: "⚠️ Doit contenir : 8+ caractères, majuscule, minuscule, chiffre, caractère spécial"
439 + reset_invalidate_sessions: "Invalider toutes les sessions actives de cet utilisateur"
440 + reset_invalidate_sessions_desc: "L'utilisateur devra se reconnecter après le changement"
441 + reset_button: "Réinitialiser"
442 + delete_confirm_title: "⚠️ Confirmer la suppression"
443 + delete_confirm_message: "Êtes-vous sûr de vouloir supprimer cet utilisateur ?"
444 + delete_confirm_username: "Nom d'utilisateur :"
445 + delete_confirm_email: "Email :"
446 + delete_irreversible: "Cette action est irréversible !"
447 + delete_button: "Supprimer définitivement"
448 + edit_user_title: "Modifier l'utilisateur"
449 + delete_error: "Erreur lors de la suppression de l'utilisateur"
450 + network_error: "Erreur réseau"
451 + resetting: "Réinitialisation..."
452 + reset_by_email_title: "Réinitialisation par email"
453 + close: "Fermer"
454 + password_reset_success_title: "Mot de passe réinitialisé"
455 + password_warning_once: "Ce mot de passe ne sera affiché qu'une seule fois. Copiez-le maintenant !"
456 + new_password_label: "Nouveau mot de passe"
457 + copy: "Copier"
458 + password_copied: "Mot de passe copié dans le presse-papiers"
459 + password_set_success: "Mot de passe réinitialisé avec succès"
460 + reset_error: "Erreur lors de la réinitialisation du mot de passe"
461 +
462 +# Password Change
463 +password:
464 + title: "Changer mon mot de passe"
465 + page_title: "Changer mon mot de passe - RustCloud"
466 + subtitle: "Modifiez votre mot de passe pour sécuriser votre compte. Un email de confirmation vous sera envoyé pour valider le changement."
467 + subtitle_no_email: "Modifiez votre mot de passe pour sécuriser votre compte."
468 + must_change_message: "⚠️ Vous devez changer votre mot de passe avant de continuer."
469 + new_password: "Nouveau mot de passe"
470 + current_password: "Mot de passe actuel"
471 + current_password_placeholder: "Votre mot de passe actuel"
472 + new_password_placeholder: "Nouveau mot de passe sécurisé"
473 + required: "Requis"
474 + requirements: "📌 Respectez les exigences de complexité indiquées ci-dessous."
475 + strength: "Force du mot de passe :"
476 + strength_weak: "Faible"
477 + strength_medium: "Moyen"
478 + strength_strong: "Fort ✓"
479 + strength_too_short: "trop court"
480 + strength_missing_lowercase: "minuscule manquante"
481 + strength_missing_uppercase: "majuscule manquante"
482 + strength_missing_digit: "chiffre manquant"
483 + strength_missing_special: "caractère spécial manquant"
484 + confirm_password: "Confirmer le nouveau mot de passe"
485 + confirm_password_placeholder: "Répétez le nouveau mot de passe"
486 + passwords_match: "✓ Les mots de passe correspondent"
487 + passwords_not_match: "✗ Les mots de passe ne correspondent pas"
488 + change_button: "Changer le mot de passe"
489 + changing: "Changement en cours..."
490 + logout_warning_title: "Déconnexion des autres sessions"
491 + logout_warning_desc: "Toutes vos autres sessions actives seront automatiquement déconnectées après le changement de mot de passe. Seule votre session actuelle restera active."
492 + save: "Enregistrer le nouveau mot de passe"
493 + saving: "Enregistrement..."
494 + saved: "Un email de confirmation a été envoyé à votre adresse. Cliquez sur le lien dans l'email pour valider le changement de mot de passe."
495 + saved_direct: "Mot de passe changé avec succès ! Vos autres sessions ont été déconnectées."
496 + error: "Erreur lors de la modification du mot de passe"
497 + error_all_fields_required: "Tous les champs sont requis."
498 + error_empty_data: "Les données à envoyer sont vides."
499 + error_invalid_data: "Données invalides. Vérifiez que tous les champs sont remplis."
500 + error_incorrect_current: "Mot de passe actuel incorrect."
501 + error_reading_response: "Erreur lors de la lecture de la réponse du serveur"
502 + error_415: "Erreur 415 : Le serveur n'a pas reçu les données au format JSON attendu. Veuillez réessayer."
503 + network_error: "Erreur réseau. Veuillez réessayer."
504 + security_tips_title: "Conseils de sécurité"
505 + security_tip_unique: "Utilisez un mot de passe unique que vous n'utilisez pas ailleurs"
506 + security_tip_share: "Ne partagez jamais votre mot de passe avec qui que ce soit"
507 + security_tip_regular: "Changez votre mot de passe régulièrement (tous les 3-6 mois)"
508 + security_tip_2fa: "Activez l'authentification à deux facteurs si disponible"
509 + security_tip_manager: "Utilisez un gestionnaire de mots de passe pour plus de sécurité"
510 + pending_request_message: "⚠️ Une demande de changement de mot de passe est en attente de confirmation par email."
511 + pending_request_info: "Un email de confirmation a été envoyé à votre adresse. Cliquez sur le lien dans l'email pour confirmer le changement."
512 + pending_request_cancel: "Annuler la demande en attente"
513 + pending_request_canceled: "Demande annulée avec succès"
514 + pending_request_cancel_error: "Erreur lors de l'annulation de la demande"
515 + confirmation_sent: "Email de confirmation envoyé ! Vérifiez votre boîte de réception."
516 + confirmation_error: "Erreur lors de l'envoi de l'email de confirmation"
517 +
518 +# Sessions
519 +sessions:
520 + title: "Sessions actives"
521 + page_title: "Sessions actives - RustCloud"
522 + subtitle: "Gérez les appareils connectés à votre compte"
523 + current_session: "Session actuelle"
524 + current_badge: "Actuelle"
525 + unknown_device: "Appareil inconnu"
526 + ip_address: "Adresse IP :"
527 + created_at: "Créée le :"
528 + last_activity: "Dernière activité :"
529 + session_id: "ID Session :"
530 + revoke: "Révoquer"
531 + revoke_confirm: "Êtes-vous sûr de vouloir révoquer la session pour \"{device}\" ?\n\nCet appareil sera déconnecté immédiatement."
532 + revoke_success: "Session révoquée avec succès !"
533 + revoke_error: "Erreur lors de la révocation de la session"
534 + no_sessions: "Aucune session active"
535 + no_sessions_desc: "Vous n'avez actuellement aucune session active"
536 + danger_zone: "Zone de danger"
537 + danger_zone_desc: "Déconnectez tous les autres appareils en une seule action (votre session actuelle restera active)."
538 + revoke_all: "Révoquer toutes les autres sessions"
539 + revoke_all_confirm: "⚠️ ATTENTION\n\nÊtes-vous sûr de vouloir révoquer TOUTES vos autres sessions ?\n\nTous vos autres appareils seront déconnectés. Seule votre session actuelle restera active."
540 + revoke_all_success: "Toutes les autres sessions ont été révoquées !"
541 + revoke_all_error: "Erreur lors de la révocation. Certaines sessions n'ont peut-être pas été révoquées."
542 + about_title: "À propos des sessions"
543 + about_desc: "Une session est créée à chaque connexion depuis un appareil ou navigateur différent. Révoquer une session déconnecte immédiatement cet appareil. Votre session actuelle ne peut pas être révoquée depuis cette page (déconnectez-vous pour cela)."
544 + back_to_settings: "Retour aux paramètres"
545 +
546 +# Navigation menu (navbar)
547 +nav:
548 + home: "Accueil"
549 + settings: "Paramètres"
550 + admin: "Administration"
551 +
552 +# User menu
553 +user_menu:
554 + profile: "Profil"
555 + logout: "Déconnexion"
556 + settings: "Paramètres"
557 +
558 +# Organisations
559 +organisations:
560 + list:
561 + title: "Gestion des Organisations"
562 + create: "Créer une organisation"
563 + search: "Rechercher"
564 + search_placeholder: "Nom ou description..."
565 + no_organisations: "Aucune organisation trouvée"
566 + results_summary: "Résultats"
567 + manage_members: "Gérer les membres"
568 + table:
569 + name: "Nom"
570 + description: "Description"
571 + members: "Membres"
572 + created_at: "Créée le"
573 + actions: "Actions"
574 + create:
575 + title: "Créer une organisation"
576 + submit: "Créer"
577 + success: "Organisation créée avec succès"
578 + error:
579 + already_exists: "L'organisation '{gid}' existe déjà"
580 + invalid_gid: "Format de gid invalide: {gid}"
581 + generic: "Une erreur est survenue lors de la création de l'organisation"
582 + edit:
583 + title: "Modifier l'organisation"
584 + submit: "Enregistrer"
585 + update:
586 + success: "Organisation mise à jour avec succès"
587 + delete:
588 + success: "Organisation supprimée avec succès"
589 + confirm: "Êtes-vous sûr de vouloir supprimer cette organisation ? Cette action est irréversible."
590 + form:
591 + name_label: "Nom"
592 + name_placeholder: "Nom de l'organisation"
593 + description_label: "Description"
594 + description_placeholder: "Description de l'organisation (optionnel)"
595 + gid_label: "Identifiant (GID)"
596 + gid_placeholder: "identifiant-unique"
597 + gid_help: "Identifiant unique (lettres, chiffres, underscores uniquement, max 64 caractères)"
598 + members:
599 + title: "Membres de l'organisation"
600 + add_member: "Ajouter un membre"
601 + search_user_label: "Rechercher un utilisateur"
602 + search_user_placeholder: "Nom d'utilisateur ou email..."
603 + no_members: "Aucun membre dans cette organisation"
604 + back_to_list: "Retour à la liste"
605 + table:
606 + username: "Nom d'utilisateur"
607 + role: "Rôle"
608 + joined_at: "Rejoint le"
609 + actions: "Actions"
610 + add_success: "Membre ajouté avec succès"
611 + remove_success: "Membre retiré avec succès"
612 + add_error: "Erreur lors de l'ajout du membre"
613 + remove_error: "Erreur lors du retrait du membre"
614 + user_not_found: "Utilisateur '{search}' non trouvé"
615 + error:
616 + organisation_not_found: "Organisation '{gid}' non trouvée"
617 + already_member: "Cet utilisateur est déjà membre de l'organisation"
618 +
619 +# Sharing
620 +sharing:
621 + modal:
622 + title: "Partager une ressource"
623 + resource_label: "Ressource"
624 + resource_type_label: "Type"
625 + expiration_label: "Date d'expiration (optionnel)"
626 + expiration_help: "Le partage expirera automatiquement à cette date"
627 + cancel_button: "Annuler"
628 + submit_button: "Partager"
629 + close_button: "Fermer"
630 + success_message: "Partage créé avec succès"
631 + error_message: "Erreur lors de la création du partage"
632 + error:
633 + already_exists: "Ce partage existe déjà pour cette ressource et cette organisation"
634 + components:
635 + share_button_label: "Partager"
636 + permissions_label: "Permissions"
637 + permissions_help: "Choisissez les permissions accordées pour ce partage"
638 + share_with_label: "Partager avec"
639 + user_tab_label: "Utilisateur"
640 + organisation_tab_label: "Organisation"
641 + select_user_label: "Sélectionner un utilisateur"
642 + search_user_placeholder: "Rechercher un utilisateur..."
643 + select_organisation_label: "Sélectionner une organisation"
644 + select_organisation_placeholder: "Choisir une organisation..."
645 + no_organisations_message: "Aucune organisation disponible"
646 + permissions:
647 + read_only: "Lecture seule"
648 + read_only_value: "1"
649 + read_only_description: "Peut uniquement consulter la ressource"
650 + read_write: "Lecture + Écriture"
651 + read_write_value: "3"
652 + read_write_description: "Peut consulter et modifier la ressource"
653 + all: "Toutes les permissions"
654 + all_value: "15"
655 + all_description: "Peut consulter, modifier, supprimer et partager"
D crates/rustwarden-ui/templates/admin/dashboard.html
+0 -195
@@ -1,195 +0,0 @@
1 -{% extends "base.html" %}
2 -
3 -{% block title %}{{ page_title }}{% endblock %}
4 -
5 -{% block navbar %}
6 -{% include "components/navbar.html" %}
7 -{% endblock %}
8 -
9 -{% block content %}
10 -<div class="container mx-auto px-4 py-4">
11 - <!-- Breadcrumb -->
12 - <div class="text-sm breadcrumbs mb-3">
13 - <ul>
14 - <li><a href="/">{{ breadcrumb_home }}</a></li>
15 - <li>{{ breadcrumb_admin }}</li>
16 - </ul>
17 - </div>
18 -
19 - <h1 class="text-2xl font-bold mb-4">{{ heading }}</h1>
20 -
21 - <!-- Statistics Cards -->
22 - <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-4">
23 - <!-- Total Users Card -->
24 - <div class="card bg-base-100 shadow-md">
25 - <div class="card-body p-4">
26 - <h2 class="card-title text-primary text-base">👥 {{ users_card_title }}</h2>
27 - <p class="text-xs text-base-content/70 mb-1">{{ users_card_subtitle }}</p>
28 - <p class="text-2xl font-bold">{{ total_users }}</p>
29 - <div class="card-actions justify-end mt-2">
30 - <a href="/admin/users" class="btn btn-primary btn-sm">{{ access_button }}</a>
31 - </div>
32 - </div>
33 - </div>
34 -
35 - <!-- Active Sessions Card -->
36 - <div class="card bg-base-100 shadow-md">
37 - <div class="card-body p-4">
38 - <h2 class="card-title text-secondary text-base">🔐 {{ sessions_card_title }}</h2>
39 - <p class="text-xs text-base-content/70 mb-1">{{ sessions_card_subtitle }}</p>
40 - <p class="text-2xl font-bold">{{ active_sessions }}</p>
41 - </div>
42 - </div>
43 -
44 - <!-- Admins Card -->
45 - <div class="card bg-base-100 shadow-md">
46 - <div class="card-body p-4">
47 - <h2 class="card-title text-accent text-base">👑 {{ admins_card_title }}</h2>
48 - <p class="text-xs text-base-content/70 mb-1">{{ admins_card_subtitle }}</p>
49 - <p class="text-2xl font-bold">{{ total_admins }}</p>
50 - </div>
51 - </div>
52 -
53 - <!-- Last Activity Card -->
54 - <div class="card bg-base-100 shadow-md">
55 - <div class="card-body p-4">
56 - <h2 class="card-title text-info text-base">⏰ {{ last_activity_card_title }}</h2>
57 - <p class="text-xs text-base-content/70 mb-1">{{ last_activity_card_subtitle }}</p>
58 - <p class="text-base font-semibold">{{ last_activity }}</p>
59 - </div>
60 - </div>
61 - </div>
62 -
63 - <!-- Audit Log Statistics (if available) -->
64 - {% if has_audit_logs %}
65 - <div class="card bg-base-100 shadow-md mb-4">
66 - <div class="card-body p-4">
67 - <h2 class="card-title text-lg mb-3">📊 {{ audit_section_title }}</h2>
68 - <div class="grid grid-cols-1 lg:grid-cols-2 gap-4">
69 - <!-- Histogram Chart -->
70 - <div>
71 - <canvas id="audit-logs-chart" width="400" height="200"></canvas>
72 - </div>
73 - <!-- Statistics and Legends -->
74 - <div class="space-y-3">
75 - <div class="grid grid-cols-2 gap-3">
76 - <div>
77 - <p class="text-xs text-base-content/70">{{ audit_total_logs_label }}</p>
78 - <p class="text-xl font-bold">{{ audit_total_logs }}</p>
79 - </div>
80 - <div>
81 - <p class="text-xs text-base-content/70">{{ audit_last_24h }}</p>
82 - <p class="text-xl font-bold">{{ audit_logs_last_24h }}</p>
83 - </div>
84 - </div>
85 - <div>
86 - <p class="text-xs text-base-content/70 mb-2">{{ audit_by_level }}</p>
87 - <div class="flex flex-wrap gap-2">
88 - <span class="badge badge-info badge-sm">DEBUG: {{ audit_debug_count }}</span>
89 - <span class="badge badge-success badge-sm">INFO: {{ audit_info_count }}</span>
90 - <span class="badge badge-warning badge-sm">WARN: {{ audit_warn_count }}</span>
91 - <span class="badge badge-error badge-sm">ERROR: {{ audit_error_count }}</span>
92 - </div>
93 - </div>
94 - </div>
95 - </div>
96 - </div>
97 - </div>
98 - {% endif %}
99 -
100 - <!-- Navigation Links -->
101 - <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
102 - <a href="/admin/roles" class="card bg-base-100 shadow-md hover:shadow-lg transition-shadow">
103 - <div class="card-body p-4">
104 - <h2 class="card-title text-warning text-base">🛡️ {{ roles_card_title }}</h2>
105 - <p class="text-sm">{{ roles_card_desc }}</p>
106 - <div class="stats shadow-sm mt-2">
107 - <div class="stat py-1 px-2">
108 - <div class="stat-title text-xs">{{ roles_stat_title }}</div>
109 - <div class="stat-value text-base">{{ total_roles }}</div>
110 - </div>
111 - </div>
112 - <div class="card-actions justify-end mt-2">
113 - <button class="btn btn-warning btn-sm">{{ access_button }}</button>
114 - </div>
115 - </div>
116 - </a>
117 -
118 - <a href="/admin/settings" class="card bg-base-100 shadow-md hover:shadow-lg transition-shadow">
119 - <div class="card-body p-4">
120 - <h2 class="card-title text-secondary text-base">⚙️ {{ settings_card_title }}</h2>
121 - <p class="text-sm">{{ settings_card_desc }}</p>
122 - <div class="card-actions justify-end mt-2">
123 - <button class="btn btn-secondary btn-sm">{{ access_button }}</button>
124 - </div>
125 - </div>
126 - </a>
127 -
128 - <a href="/admin/apps" class="card bg-base-100 shadow-md hover:shadow-lg transition-shadow">
129 - <div class="card-body p-4">
130 - <h2 class="card-title text-accent text-base">📦 {{ apps_card_title }}</h2>
131 - <p class="text-sm">{{ apps_card_desc }}</p>
132 - <div class="card-actions justify-end mt-2">
133 - <button class="btn btn-accent btn-sm">{{ access_button }}</button>
134 - </div>
135 - </div>
136 - </a>
137 -
138 - </div>
139 -</div>
140 -{% endblock %}
141 -
142 -{% block scripts %}
143 -{% if has_audit_logs %}
144 -<script src="/static/js/chart.umd.min.js"></script>
145 -<script>
146 -document.addEventListener('DOMContentLoaded', function() {
147 - const ctx = document.getElementById('audit-logs-chart');
148 - if (ctx) {
149 - new Chart(ctx, {
150 - type: 'bar',
151 - data: {
152 - labels: ['DEBUG', 'INFO', 'WARN', 'ERROR'],
153 - datasets: [{
154 - label: '{{ chart_label }}',
155 - data: [
156 - {{ audit_debug_count }},
157 - {{ audit_info_count }},
158 - {{ audit_warn_count }},
159 - {{ audit_error_count }}
160 - ],
161 - backgroundColor: [
162 - 'rgba(59, 130, 246, 0.5)', // info
163 - 'rgba(34, 197, 94, 0.5)', // success
164 - 'rgba(251, 191, 36, 0.5)', // warning
165 - 'rgba(239, 68, 68, 0.5)' // error
166 - ],
167 - borderColor: [
168 - 'rgba(59, 130, 246, 1)',
169 - 'rgba(34, 197, 94, 1)',
170 - 'rgba(251, 191, 36, 1)',
171 - 'rgba(239, 68, 68, 1)'
172 - ],
173 - borderWidth: 1
174 - }]
175 - },
176 - options: {
177 - responsive: true,
178 - maintainAspectRatio: true,
179 - scales: {
180 - y: {
181 - beginAtZero: true
182 - }
183 - },
184 - plugins: {
185 - legend: {
186 - display: false
187 - }
188 - }
189 - }
190 - });
191 - }
192 -});
193 -</script>
194 -{% endif %}
195 -{% endblock %}
M crates/rustwarden-ui/templates/base.html
+49 -0
@@ -170,6 +170,55 @@
170 170 document.addEventListener('DOMContentLoaded', function() {
171 171 updateLanguageDisplay();
172 172 });
173 +
174 + // --- Auto-refresh JWT (Remember Me) ---
175 + // Silently refreshes the JWT access token before it expires,
176 + // so users with "remember me" keep their session alive.
177 + (function() {
178 + var refreshToken = localStorage.getItem('refresh_token');
179 + var rememberMe = localStorage.getItem('remember_me');
180 + if (!refreshToken || rememberMe !== 'true') return;
181 +
182 + // JWT lifetime in seconds (stored at login, default 15 min = 900s)
183 + var expiresIn = parseInt(localStorage.getItem('jwt_expires_in') || '900', 10);
184 + // Refresh 2 minutes before expiration (minimum 30s)
185 + var intervalMs = Math.max((expiresIn - 120), 30) * 1000;
186 +
187 + function doRefresh() {
188 + var token = localStorage.getItem('refresh_token');
189 + if (!token || localStorage.getItem('remember_me') !== 'true') return;
190 +
191 + fetch('/api/v1/auth/refresh', {
192 + method: 'POST',
193 + headers: { 'Content-Type': 'application/json' },
194 + credentials: 'include',
195 + body: JSON.stringify({ refresh_token: token })
196 + })
197 + .then(function(response) {
198 + if (response.ok) return response.json();
199 + throw new Error('refresh_failed');
200 + })
201 + .then(function(data) {
202 + // Rotate refresh token
203 + if (data.refresh_token) {
204 + localStorage.setItem('refresh_token', data.refresh_token);
205 + }
206 + // Update interval if server reports different expires_in
207 + if (data.expires_in) {
208 + localStorage.setItem('jwt_expires_in', String(data.expires_in));
209 + }
210 + })
211 + .catch(function() {
212 + // Token expired or revoked — clean up and redirect to login
213 + localStorage.removeItem('refresh_token');
214 + localStorage.removeItem('remember_me');
215 + localStorage.removeItem('jwt_expires_in');
216 + window.location.href = '/login';
217 + });
218 + }
219 +
220 + setInterval(doRefresh, intervalMs);
221 + })();
173 222 </script>
174 223 </body>
175 224 </html>
M crates/rustwarden-ui/templates/fragments/user_menu_dropdown.html
+5 -0
@@ -49,6 +49,11 @@
49 49
50 50 <script>
51 51 function handleLogout() {
52 + // Clean up remember-me / auto-refresh state
53 + localStorage.removeItem('refresh_token');
54 + localStorage.removeItem('remember_me');
55 + localStorage.removeItem('jwt_expires_in');
56 +
52 57 // Send logout request with credentials (cookies)
53 58 fetch('/api/v1/auth/logout', {
54 59 method: 'POST',
M crates/rustwarden-ui/templates/login.html
+20 -3
@@ -384,10 +384,13 @@
384 384 }
385 385 hideResendBlock();
386 386
387 + const rememberMe = document.getElementById('remember').checked;
388 +
387 389 // Create JSON payload
388 390 const payload = JSON.stringify({
389 391 username: username,
390 - password: password
392 + password: password,
393 + remember_me: rememberMe
391 394 });
392 395
393 396 // Use fetch API to send JSON request
@@ -420,7 +423,21 @@
420 423 document.getElementById('success-text').textContent = i18nMessages.successMessage;
421 424 successDiv.classList.remove('hidden');
422 425 }
423 -
426 +
427 + // Store refresh token and remember_me flag for auto-refresh
428 + if (data.refresh_token) {
429 + localStorage.setItem('refresh_token', data.refresh_token);
430 + }
431 + if (rememberMe) {
432 + localStorage.setItem('remember_me', 'true');
433 + // Store expires_in so auto-refresh on next page knows the interval
434 + if (data.expires_in) {
435 + localStorage.setItem('jwt_expires_in', String(data.expires_in));
436 + }
437 + } else {
438 + localStorage.removeItem('remember_me');
439 + }
440 +
424 441 // T130: Check if user must change password
425 442 if (data.user && data.user.must_change_password === true) {
426 443 // Redirect to password change page with must_change flag
@@ -429,7 +446,7 @@
429 446 }, 500);
430 447 return;
431 448 }
432 -
449 +
433 450 // SEC-H2: safe redirect after login
434 451 setTimeout(() => {
435 452 window.location.href = getSafeRedirect();
M crates/rustwarden-ui/templates/settings/password.html
+1 -1
@@ -155,7 +155,7 @@
155 155 <div class="card-actions justify-end">
156 156 {% if must_change %}
157 157 <a href="/api/v1/auth/logout" class="btn btn-ghost"
158 - onclick="event.preventDefault(); fetch('/api/v1/auth/logout', {method:'POST', credentials:'include', headers:{'Accept':'text/html'}}).then(()=>window.location.href='/login');">
158 + onclick="event.preventDefault(); localStorage.removeItem('refresh_token'); localStorage.removeItem('remember_me'); localStorage.removeItem('jwt_expires_in'); fetch('/api/v1/auth/logout', {method:'POST', credentials:'include', headers:{'Accept':'text/html'}}).then(()=>window.location.href='/login');">
159 159 {{ logout_label }}
160 160 </a>
161 161 {% else %}
A docs/spec-remember-me.md
+282 -0
@@ -0,0 +1,282 @@
1 +# Spécification : "Se souvenir de moi" (Remember Me)
2 +
3 +**Version** : 1.0
4 +**Date** : 2026-03-23
5 +**Composant** : `rustwarden-core` (crate framework)
6 +**Statut** : Proposition
7 +
8 +---
9 +
10 +## 1. Contexte et problème
11 +
12 +Les utilisateurs perdent leur session fréquemment à cause de la combinaison de trois timers :
13 +
14 +| Timer | Valeur par défaut | Effet |
15 +|-------|-------------------|-------|
16 +| `JWT_EXPIRATION_MINUTES` | 15 min | Cookie `jwt_token` expiré, requêtes rejetées |
17 +| `SESSION_TIMEOUT_MINUTES` | 30 min | Session serveur invalidée après inactivité |
18 +| `REFRESH_TOKEN_EXPIRATION_DAYS` | 7 jours | Impossibilité de renouveler le JWT |
19 +
20 +Sans mécanisme de renouvellement automatique côté client, dès que le JWT expire (15 min), l'utilisateur est déconnecté même si son refresh token est encore valide.
21 +
22 +## 2. Objectif
23 +
24 +Ajouter un champ optionnel `remember_me` au flux d'authentification pour permettre aux utilisateurs de maintenir une session longue durée tout en préservant la sécurité du JWT court.
25 +
26 +**Principe fondamental** : le JWT (access token) reste toujours court (5-15 min). Seule la durée du refresh token et du cookie de refresh changent selon le choix de l'utilisateur.
27 +
28 +## 3. Changements requis
29 +
30 +### 3.1 `LoginRequest` — Nouveau champ
31 +
32 +**Fichier** : `crates/rustwarden-core/src/auth/handlers.rs` (ligne 43)
33 +
34 +```rust
35 +#[derive(Debug, Deserialize, Validate)]
36 +pub struct LoginRequest {
37 + #[validate(length(min = 1))]
38 + pub username: String,
39 + #[validate(length(min = 1))]
40 + pub password: String,
41 + /// Si true, le refresh token a une durée de vie étendue.
42 + /// Défaut : false (rétrocompatibilité).
43 + #[serde(default)]
44 + pub remember_me: bool,
45 +}
46 +```
47 +
48 +`#[serde(default)]` garantit la **rétrocompatibilité** : les clients existants qui n'envoient pas ce champ obtiennent `false`.
49 +
50 +### 3.2 `AuthConfig` — Nouvelle variable d'environnement
51 +
52 +**Fichier** : `crates/rustwarden-core/src/config/auth.rs`
53 +
54 +```rust
55 +pub struct AuthConfig {
56 + // ... champs existants ...
57 +
58 + /// Durée du refresh token quand "remember me" est activé.
59 + /// Variable : REMEMBER_ME_EXPIRATION_DAYS (défaut : 30)
60 + pub remember_me_expiration_days: i64,
61 +}
62 +```
63 +
64 +Chargement :
65 +
66 +```rust
67 +let remember_me_expiration_days = env::var("REMEMBER_ME_EXPIRATION_DAYS")
68 + .ok()
69 + .and_then(|v| v.parse::<i64>().ok())
70 + .unwrap_or(30);
71 +```
72 +
73 +**Contrainte de validation** : `remember_me_expiration_days` doit être >= `refresh_token_expiration_days` et <= 90 jours. Log un warning si > 60 jours.
74 +
75 +### 3.3 Handler `login()` — Logique conditionnelle
76 +
77 +**Fichier** : `crates/rustwarden-core/src/auth/handlers.rs`, fonction `login()`
78 +
79 +Modifier la création du refresh token (actuellement ligne 300-305) :
80 +
81 +```rust
82 +// Avant (actuel) :
83 +let created_rt = RefreshTokenService::create_refresh_token(
84 + &db,
85 + user.id,
86 + auth_config.refresh_token_expiration_days,
87 +).await?;
88 +
89 +// Après :
90 +let rt_expiration_days = if payload.remember_me {
91 + auth_config.remember_me_expiration_days
92 +} else {
93 + auth_config.refresh_token_expiration_days
94 +};
95 +
96 +let created_rt = RefreshTokenService::create_refresh_token(
97 + &db,
98 + user.id,
99 + rt_expiration_days,
100 +).await?;
101 +```
102 +
103 +### 3.4 `LoginResponse` — Information de durée
104 +
105 +**Fichier** : `crates/rustwarden-core/src/auth/handlers.rs`
106 +
107 +Ajouter un champ pour que le client sache quand renouveler :
108 +
109 +```rust
110 +#[derive(Debug, Serialize)]
111 +pub struct LoginResponse {
112 + pub access_token: String,
113 + pub refresh_token: Option<String>,
114 + pub token_type: String,
115 + pub expires_in: i64,
116 + /// Durée de vie du refresh token en secondes.
117 + /// Permet au client de planifier le renouvellement ou d'afficher
118 + /// la durée restante de la session.
119 + pub refresh_expires_in: i64,
120 + pub user: UserInfo,
121 +}
122 +```
123 +
124 +Valeur : `rt_expiration_days * 86400`.
125 +
126 +### 3.5 Endpoint `refresh_token()` — Propagation de la durée
127 +
128 +**Fichier** : `crates/rustwarden-core/src/auth/handlers.rs`, fonction `refresh_token()`
129 +
130 +Problème : lors du renouvellement, la durée du nouveau refresh token utilise `auth_config.refresh_token_expiration_days` (7 jours), ce qui **raccourcit** un token "remember me" de 30 jours à chaque rotation.
131 +
132 +**Solution** : conserver la durée restante originale ou la durée "remember me" lors de la rotation.
133 +
134 +Option recommandée — **conserver la durée configurée du token d'origine** :
135 +
136 +```rust
137 +// Dans refresh_token(), après validation du old_token :
138 +let original_duration_days = (old_token.expires_at - old_token.created_at).num_days();
139 +
140 +// Utiliser cette durée pour le nouveau token (plafonné à remember_me_expiration_days)
141 +let rt_expiration_days = original_duration_days
142 + .min(auth_config.remember_me_expiration_days)
143 + .max(auth_config.refresh_token_expiration_days);
144 +
145 +let new_created_rt = RefreshTokenService::create_refresh_token(
146 + &db,
147 + user.id,
148 + rt_expiration_days,
149 +).await?;
150 +```
151 +
152 +Ainsi, un token "remember me" de 30 jours génère un nouveau token de 30 jours à chaque rotation, sans jamais dépasser la limite configurée.
153 +
154 +### 3.6 `RefreshResponse` — Même ajout
155 +
156 +```rust
157 +#[derive(Debug, Serialize)]
158 +pub struct RefreshResponse {
159 + pub access_token: String,
160 + pub refresh_token: Option<String>,
161 + pub token_type: String,
162 + pub expires_in: i64,
163 + pub refresh_expires_in: i64, // Nouveau
164 +}
165 +```
166 +
167 +## 4. Variables d'environnement
168 +
169 +| Variable | Défaut | Description |
170 +|----------|--------|-------------|
171 +| `REMEMBER_ME_EXPIRATION_DAYS` | 30 | Durée du refresh token avec "remember me" |
172 +| `REFRESH_TOKEN_EXPIRATION_DAYS` | 7 | Durée du refresh token sans "remember me" (inchangé) |
173 +| `JWT_EXPIRATION_MINUTES` | 15 | Durée du JWT access token (inchangé) |
174 +
175 +## 5. Matrice de sécurité
176 +
177 +| Vecteur d'attaque | Mitigation | Statut |
178 +|-------------------|------------|--------|
179 +| Vol du JWT | Durée courte (15 min), inchangée | Existant |
180 +| Vol du refresh token (localStorage) | Rotation + détection de réutilisation + hash SHA-256 en base | Existant |
181 +| Brute-force refresh | Rate limiting (5/min/IP) | Existant |
182 +| Accumulation de tokens | Limite 10 tokens actifs/utilisateur | Existant |
183 +| Session longue après vol de credentials | Le refresh token étendu ne bypass pas la révocation au logout ni au changement de mot de passe | Existant |
184 +| Refresh token "remember me" volé | Fenêtre d'exploitation plus longue (30j vs 7j) — **risque accepté** car mitigé par rotation et détection de réutilisation | Nouveau — acceptable |
185 +| Appareil partagé / oubli de déconnexion | L'utilisateur choisit explicitement "Se souvenir de moi" — pas activé par défaut | Par design |
186 +
187 +### Recommandation complémentaire (optionnelle, hors scope v1)
188 +
189 +Pour les applications sensibles, envisager à terme :
190 +- **Révocation par appareil** : endpoint `DELETE /api/v1/auth/sessions/{token_id}` pour révoquer un refresh token spécifique depuis un écran "Appareils connectés"
191 +- **Notification de nouvelle connexion** : email à l'utilisateur lors d'un login depuis un nouveau user-agent/IP
192 +
193 +## 6. Rétrocompatibilité
194 +
195 +| Composant | Impact |
196 +|-----------|--------|
197 +| API `POST /api/v1/auth/login` | Aucun — `remember_me` est optionnel (`#[serde(default)]`) |
198 +| API `POST /api/v1/auth/refresh` | Aucun — le comportement par défaut reste 7 jours |
199 +| `LoginResponse` / `RefreshResponse` | Nouveau champ `refresh_expires_in` — les clients qui ne le lisent pas ne sont pas affectés |
200 +| `.env` | Aucune variable existante modifiée. `REMEMBER_ME_EXPIRATION_DAYS` est optionnelle |
201 +| Applications consommatrices | Aucune modification requise. Le comportement est identique si `remember_me` n'est pas envoyé |
202 +
203 +## 7. Côté client (hors scope rustwarden-core, pour l'application consommatrice)
204 +
205 +Pour que la fonctionnalité soit complète, l'application consommatrice (ex : PasterMan) devra :
206 +
207 +1. **Checkbox dans le formulaire de login** : envoyer `"remember_me": true` dans le body JSON
208 +2. **Stocker le flag** : `localStorage.setItem("remember_me", "true")` si coché
209 +3. **Auto-refresh JS** : si `remember_me === "true"`, mettre en place un `setInterval` qui appelle `POST /api/v1/auth/refresh` toutes les `(JWT_EXPIRATION - 2 min)` (soit ~13 min par défaut) avec le refresh token stocké
210 +4. **Mise à jour du refresh token** : à chaque réponse de refresh, remplacer l'ancien refresh token en localStorage par le nouveau (rotation)
211 +5. **Nettoyage au logout** : supprimer `remember_me` et `refresh_token` du localStorage
212 +
213 +Exemple de timer auto-refresh :
214 +
215 +```javascript
216 +function setupAutoRefresh(expiresInSeconds) {
217 + const refreshInterval = (expiresInSeconds - 120) * 1000; // 2 min avant expiration
218 + setInterval(async () => {
219 + const refreshToken = localStorage.getItem("refresh_token");
220 + if (!refreshToken || localStorage.getItem("remember_me") !== "true") return;
221 +
222 + const response = await fetch("/api/v1/auth/refresh", {
223 + method: "POST",
224 + headers: { "Content-Type": "application/json" },
225 + credentials: "include",
226 + body: JSON.stringify({ refresh_token: refreshToken }),
227 + });
228 +
229 + if (response.ok) {
230 + const data = await response.json();
231 + if (data.refresh_token) {
232 + localStorage.setItem("refresh_token", data.refresh_token);
233 + }
234 + // Le nouveau JWT est automatiquement set via le cookie HttpOnly par le serveur
235 + } else {
236 + // Token expiré ou révoqué — rediriger vers login
237 + localStorage.removeItem("refresh_token");
238 + localStorage.removeItem("remember_me");
239 + window.location.href = "/login";
240 + }
241 + }, refreshInterval);
242 +}
243 +```
244 +
245 +> **Note** : l'endpoint `POST /api/v1/auth/refresh` ne set pas actuellement de cookie `jwt_token` dans la réponse (contrairement à `login()`). Il faudra soit ajouter ce set-cookie dans le handler `refresh_token()`, soit que le client utilise le `access_token` de la réponse JSON pour un header `Authorization: Bearer`. La première option (set-cookie) est recommandée pour la cohérence avec le flux web.
246 +
247 +## 8. Tests à ajouter
248 +
249 +### Tests unitaires (`crates/rustwarden-core`)
250 +
251 +1. **`test_login_without_remember_me`** — `remember_me` absent ou `false` → refresh token avec durée standard (7j)
252 +2. **`test_login_with_remember_me`** — `remember_me: true` → refresh token avec durée étendue (30j)
253 +3. **`test_remember_me_default_false`** — Désérialisation d'un body sans champ `remember_me` → `false`
254 +4. **`test_refresh_preserves_duration`** — Rotation d'un token "remember me" → le nouveau token conserve la durée étendue
255 +5. **`test_refresh_caps_duration`** — La durée du nouveau token ne dépasse jamais `remember_me_expiration_days`
256 +6. **`test_remember_me_config_validation`** — `REMEMBER_ME_EXPIRATION_DAYS` < `REFRESH_TOKEN_EXPIRATION_DAYS` → erreur de configuration
257 +7. **`test_login_response_includes_refresh_expires_in`** — Le champ `refresh_expires_in` est présent et correct
258 +
259 +### Tests d'intégration
260 +
261 +8. **`test_full_remember_me_flow`** — Login avec `remember_me: true` → attendre expiration JWT → refresh → vérifier nouveau JWT valide
262 +9. **`test_logout_revokes_remember_me_tokens`** — Login "remember me" → logout → refresh échoue
263 +
264 +## 9. Fichiers impactés (résumé)
265 +
266 +| Fichier | Modification |
267 +|---------|-------------|
268 +| `crates/rustwarden-core/src/config/auth.rs` | Ajouter `remember_me_expiration_days` à `AuthConfig` |
269 +| `crates/rustwarden-core/src/auth/handlers.rs` | `LoginRequest` + champ, `LoginResponse` + champ, `RefreshResponse` + champ, logique dans `login()` et `refresh_token()` |
270 +| `.env.example` | Documenter `REMEMBER_ME_EXPIRATION_DAYS` |
271 +
272 +Aucune migration de base de données nécessaire — la table `refresh_token` stocke déjà `expires_at` par token.
273 +
274 +## 10. Critères d'acceptation
275 +
276 +- [ ] Un client envoyant `{"username":"x","password":"y"}` (sans `remember_me`) a un comportement identique à l'actuel
277 +- [ ] Un client envoyant `{"username":"x","password":"y","remember_me":true}` reçoit un refresh token avec `expires_at` = now + `REMEMBER_ME_EXPIRATION_DAYS`
278 +- [ ] La rotation du refresh token conserve la durée d'origine (pas de raccourcissement à 7j)
279 +- [ ] `LoginResponse` et `RefreshResponse` incluent `refresh_expires_in` en secondes
280 +- [ ] La durée maximale est plafonnée par configuration (défaut 30j, max recommandé 90j)
281 +- [ ] Tous les mécanismes de sécurité existants (rotation, détection de réutilisation, révocation au logout, limite par utilisateur) s'appliquent sans modification
282 +- [ ] Les tests existants passent sans modification
D locales/de.yml
+0 -614
@@ -1,614 +0,0 @@
1 -# Deutsche Übersetzungen für RustCloud
2 -# Format: hierarchische Schlüssel mit Punkten
3 -
4 -# Anmeldung
5 -login:
6 - title: "Anmeldung"
7 - page_title: "Anmeldung - RustCloud"
8 - page_description: "Anmeldung bei RustCloud"
9 - subtitle: "Melden Sie sich in Ihrem Cloud-Bereich an"
10 - username: "Benutzername"
11 - password: "Passwort"
12 - submit: "Anmelden"
13 - remember_me: "Angemeldet bleiben"
14 - tab_login: "Anmeldung"
15 - tab_register: "Registrierung"
16 - register_title: "Konto erstellen"
17 - register_submit: "Mein Konto erstellen"
18 - username_placeholder: "Ihr Benutzername"
19 - password_placeholder: "Ihr Passwort"
20 - username_placeholder_register: "Ihr Benutzername (min. 3 Zeichen)"
21 - password_placeholder_register: "Ihr Passwort (min. 8 Zeichen)"
22 - email_placeholder: "ihre@email.de"
23 - forgot_password: "Passwort vergessen?"
24 - email_not_verified: "E-Mail nicht verifiziert?"
25 - resend_verification: "Bestätigungs-E-Mail erneut senden"
26 - already_have_account: "Bereits ein Konto?"
27 - sign_in_link: "Anmelden"
28 - success_message: "Anmeldung erfolgreich! Weiterleitung..."
29 - error_message: "Anmeldefehler. Überprüfen Sie Ihre Anmeldedaten."
30 - email_unverified_message: "Ihre E-Mail ist nicht verifiziert. Klicken Sie unten, um den Link erneut zu senden."
31 - resend_button: "Bestätigungs-E-Mail erneut senden"
32 - resend_success: "Bestätigungs-E-Mail gesendet, falls das Konto existiert."
33 - resend_error: "Anfrage kann derzeit nicht gesendet werden."
34 - resend_prompt: "Bitte geben Sie Ihre E-Mail ein, bevor Sie erneut senden."
35 - register_success: "Konto erfolgreich erstellt! Bitte überprüfen Sie Ihre E-Mail."
36 - register_error: "Registrierungsfehler"
37 - email_label: "E-Mail"
38 - footer_text: "Nextcloud Fork in Rust"
39 -
40 -# Fehlermeldungen
41 -error:
42 - invalid_credentials: "Ungültige Anmeldedaten"
43 - email_invalid: "Ungültige E-Mail"
44 - required_field: "Dieses Feld ist erforderlich"
45 - unauthorized: "Nicht autorisiert"
46 - not_found: "Ressource nicht gefunden"
47 - validation: "Validierungsfehler: {message}"
48 - database: "Datenbankfehler"
49 - internal: "Interner Serverfehler"
50 - invalid_token: "Ungültiges Token"
51 - token_expired: "Token abgelaufen"
52 - token_reused: "Token wiederverwendet - bitte erneut authentifizieren"
53 - must_change_password: "Passwortänderung erforderlich"
54 - authentication_required: "Authentifizierung erforderlich"
55 - insufficient_permissions: "Unzureichende Berechtigungen"
56 - config: "Serverkonfigurationsfehler"
57 - template: "Template-Fehler"
58 - validation_field:
59 - username_min_length: "Der Benutzername muss mindestens {min} Zeichen enthalten"
60 - password_min_length: "Das Passwort muss mindestens {min} Zeichen enthalten"
61 - email_format: "Die E-Mail-Adresse ist ungültig"
62 - password_require_uppercase: "Das Passwort muss mindestens einen Großbuchstaben enthalten"
63 - password_require_lowercase: "Das Passwort muss mindestens einen Kleinbuchstaben enthalten"
64 - password_require_digits: "Das Passwort muss mindestens eine Ziffer enthalten"
65 - password_require_special: "Das Passwort muss mindestens ein Sonderzeichen (!@#$%^&*()_+-=[]{}|;:,.<>?) enthalten"
66 -
67 -# Bestätigungs-E-Mail erneut senden
68 -resend_verification:
69 - page_title: "Bestätigungs-E-Mail erneut senden - RustWarden"
70 - title: "Bestätigungs-E-Mail erneut senden"
71 - subtitle: "Geben Sie Ihre E-Mail-Adresse ein, um einen neuen Bestätigungslink zu erhalten."
72 - email_label: "E-Mail-Adresse"
73 - email_placeholder: "sie@beispiel.de"
74 - submit: "Bestätigungslink senden"
75 - back_to_login: "Zurück zur Anmeldung"
76 - error_default: "Die Anfrage konnte nicht gesendet werden."
77 - success_default: "Wenn das Konto existiert und nicht verifiziert ist, wurde eine E-Mail gesendet."
78 - error_missing_email: "Bitte geben Sie Ihre E-Mail ein."
79 - error_cannot_send: "Die Anfrage kann derzeit nicht gesendet werden."
80 -
81 -# Passwort zurücksetzen (über E-Mail-Link)
82 -password_reset:
83 - page_title: "Passwort zurücksetzen"
84 - title: "Passwort zurücksetzen"
85 - subtitle: "Geben Sie unten Ihr neues Passwort ein."
86 - new_password_label: "Neues Passwort"
87 - new_password_placeholder: "Neues sicheres Passwort"
88 - requirements: "⚠️ Muss enthalten: 8+ Zeichen, Großbuchstabe, Kleinbuchstabe, Ziffer, Sonderzeichen"
89 - confirm_password_label: "Passwort bestätigen"
90 - confirm_password_placeholder: "Bestätigen Sie Ihr neues Passwort"
91 - missing_token_url: "Zurücksetzungs-Token fehlt in der URL."
92 - missing_token: "Zurücksetzungs-Token fehlt."
93 - missing_new_password: "Bitte geben Sie ein neues Passwort ein."
94 - passwords_not_match: "Die Passwörter stimmen nicht überein."
95 - success_message: "Ihr Passwort wurde erfolgreich zurückgesetzt. Sie können sich jetzt anmelden."
96 - error_link_invalid: "Das Passwort konnte nicht zurückgesetzt werden. Der Link ist möglicherweise abgelaufen oder ungültig."
97 - error_generic: "Das Passwort kann derzeit nicht zurückgesetzt werden."
98 -
99 -# Einstellungen
100 -settings:
101 - title: "Einstellungen"
102 - page_title: "Einstellungen - RustWarden"
103 - subtitle: "Verwalten Sie Ihre Präferenzen und Kontoeinstellungen"
104 - profile_title: "Mein Profil"
105 - profile_desc: "Bearbeiten Sie Ihre persönlichen Informationen (Benutzername, E-Mail)"
106 - password_title: "Passwort"
107 - password_desc: "Ändern Sie Ihr Passwort, um Ihr Konto zu sichern"
108 - sessions_title: "Aktive Sitzungen"
109 - sessions_desc: "Verwalten Sie Ihre aktiven Sitzungen und widerrufen Sie den Zugriff von anderen Geräten"
110 - preferences_title: "Präferenzen"
111 - preferences_desc: "Passen Sie Ihre Erfahrung an (Design, Sprache)"
112 - access: "Zugriff"
113 - info_title: "Informationen"
114 - info_desc: "Verwenden Sie die obigen Abschnitte, um verschiedene Aspekte Ihres Kontos zu verwalten. Alle Änderungen sind sicher und erfordern Ihre Authentifizierung."
115 - language: "Sprache"
116 - language_description: "Wählen Sie Ihre bevorzugte Sprache"
117 - save: "Speichern"
118 - saved: "Einstellungen gespeichert"
119 -
120 -# Startseite
121 -home:
122 - welcome: "Willkommen, {username}!"
123 - subtitle: "Willkommen in Ihrem persönlichen Bereich"
124 - my_account: "Mein Konto"
125 - stat_username: "Benutzername"
126 - stat_email: "E-Mail"
127 - stat_member_since: "Mitglied seit"
128 - stat_roles: "Rollen"
129 -
130 -# Allgemeine Nachrichten
131 -common:
132 - welcome: "Willkommen {username}"
133 - loading: "Laden..."
134 - save: "Speichern"
135 - cancel: "Abbrechen"
136 - delete: "Löschen"
137 - edit: "Bearbeiten"
138 - create: "Erstellen"
139 -
140 -# Präferenzen
141 -preferences:
142 - title: "Anzeigeeinstellungen"
143 - page_title: "Anzeigeeinstellungen - RustCloud"
144 - subtitle: "Passen Sie das Erscheinungsbild der Benutzeroberfläche an"
145 - theme: "Design"
146 - theme_light: "Hell"
147 - theme_light_desc: "Helle und saubere Benutzeroberfläche"
148 - theme_dark: "Dunkel"
149 - theme_dark_desc: "Reduziert Augenbelastung"
150 - theme_auto: "Automatisch"
151 - theme_auto_desc: "Passt sich der Tageszeit an"
152 - theme_preview: "Das Design wird sofort nach dem Speichern angewendet"
153 - language: "Sprache"
154 - language_fr: "Français"
155 - language_fr_desc: "Benutzeroberfläche auf Französisch"
156 - language_en: "English"
157 - language_en_desc: "Englische Benutzeroberfläche"
158 - language_de: "Deutsch"
159 - language_de_desc: "Deutsche Benutzeroberfläche"
160 - language_es: "Español"
161 - language_es_desc: "Spanische Benutzeroberfläche"
162 - translation_warning: "Die vollständige Übersetzung der Benutzeroberfläche befindet sich in der Entwicklung. Einige Elemente können auf Französisch bleiben."
163 - modified: "Einstellungen geändert"
164 - modified_desc: "Speichern Sie Ihre Änderungen, um sie anzuwenden"
165 - save: "Einstellungen speichern"
166 - saving: "Speichern..."
167 - cancel: "Abbrechen"
168 - saved_success: "Einstellungen erfolgreich gespeichert!"
169 - saved_reload: "Einstellungen erfolgreich gespeichert!\n\nDie Sprache wurde geändert. Möchten Sie die Seite jetzt neu laden, um die Änderungen anzuwenden?"
170 - error: "Fehler: {message}"
171 - network_error: "Netzwerkfehler. Bitte versuchen Sie es erneut."
172 - sync_title: "Ihre Einstellungen sind synchronisiert"
173 - sync_desc: "Ihre Anzeigeeinstellungen werden gespeichert und automatisch auf allen Geräten angewendet, die mit Ihrem RustCloud-Konto verbunden sind."
174 - preview_dark: "Vorschau: Dunkles Design wird angewendet"
175 - preview_light: "Vorschau: Helles Design wird angewendet"
176 - preview_auto: "Vorschau: Automatisches Design wird angewendet"
177 -
178 -# Profil
179 -profile:
180 - title: "Mein Profil"
181 - page_title: "Mein Profil - RustCloud"
182 - subtitle: "Bearbeiten Sie Ihre persönlichen Informationen"
183 - account_info: "Kontoinformationen"
184 - username: "Benutzername"
185 - username_public: "Öffentlich sichtbar"
186 - username_placeholder: "Ihr Benutzername"
187 - username_pattern: "Nur Buchstaben, Zahlen, Bindestriche und Unterstriche"
188 - email: "E-Mail"
189 - email_placeholder: "ihre@email.de"
190 - save: "Änderungen speichern"
191 - saving: "Speichern..."
192 - saved: "Profil erfolgreich aktualisiert"
193 - error: "Fehler beim Aktualisieren des Profils"
194 - email_label: "E-Mail-Adresse"
195 - email_used_for: "Wird für die Anmeldung verwendet"
196 - email_warning: "⚠️ Sie werden nach der Änderung abgemeldet"
197 - email_change_info: "E-Mail-Änderungen erfordern aus Sicherheitsgründen eine erneute Anmeldung."
198 - username_help: "3-50 Zeichen (Buchstaben, Zahlen, -, _)"
199 - additional_info: "Zusätzliche Informationen"
200 - account_created: "Konto erstellt am"
201 - roles: "Rollen"
202 - linked_accounts_title: "Verknüpfte Konten"
203 - no_linked_accounts: "Keine externen Konten verknüpft."
204 - linked_since: "Verknüpft seit"
205 - unlink_button: "Trennen"
206 - unlink_confirm: "Möchten Sie dieses Konto wirklich trennen?"
207 - unlink_error: "Dieses Konto konnte nicht getrennt werden."
208 - cannot_unlink_last: "Ihre letzte Authentifizierungsmethode kann nicht entfernt werden."
209 -
210 -# Breadcrumb
211 -breadcrumb:
212 - home: "Startseite"
213 - settings: "Einstellungen"
214 - admin: "Verwaltung"
215 - preferences: "Präferenzen"
216 - profile: "Profil"
217 - password: "Passwort"
218 - sessions: "Sitzungen"
219 -
220 -# Admin
221 -admin:
222 - dashboard:
223 - title: "Verwaltung"
224 - heading: "Administrator-Dashboard"
225 - users_card_title: "Benutzer"
226 - users_card_subtitle: "Benutzer gesamt"
227 - access_button: "Zugreifen"
228 - sessions_card_title: "Aktive Sitzungen"
229 - sessions_card_subtitle: "Laufende Sitzungen"
230 - admins_card_title: "Administratoren"
231 - admins_card_subtitle: "Admin-Konten"
232 - last_activity_card_title: "Letzte Aktivität"
233 - last_activity_card_subtitle: "Letzte Anmeldung"
234 - audit_section_title: "Audit-Log-Statistiken"
235 - audit_total_logs: "Logs gesamt"
236 - audit_last_24h: "Letzte 24h"
237 - audit_by_level: "Nach Stufe"
238 - chart_label: "Logs nach Stufe"
239 - roles_card_title: "Rollenverwaltung"
240 - roles_card_desc: "Rollen und granulare Berechtigungen verwalten"
241 - roles_stat_title: "Rollen"
242 - settings_card_title: "Anwendungseinstellungen"
243 - settings_card_desc: "Globale Anwendungseinstellungen konfigurieren"
244 - apps_card_title: "Anwendungsverwaltung"
245 - apps_card_desc: "Modulare Anwendungen aktivieren oder deaktivieren"
246 - orgs_card_title: "Organisationsverwaltung"
247 - orgs_card_desc: "Organisationen und deren Mitglieder erstellen und verwalten"
248 - orgs_stat_title: "Organisationen"
249 - orgs_members_stat_title: "Mitglieder gesamt"
250 - roles_list:
251 - page_title: "Rollenverwaltung"
252 - breadcrumb_roles: "Rollen"
253 - title: "Rollen"
254 - create_role: "Rolle erstellen"
255 - table_name: "Name"
256 - table_description: "Beschreibung"
257 - table_users: "Benutzer"
258 - table_permissions: "Berechtigungen"
259 - table_actions: "Aktionen"
260 - edit: "Bearbeiten"
261 - delete: "Löschen"
262 - no_roles: "Keine Rollen gefunden."
263 - protected_hint: "Geschützt"
264 - delete_confirm_title: "Löschen bestätigen"
265 - delete_confirm_message: "Möchten Sie die Rolle wirklich löschen"
266 - delete_button: "Löschen"
267 - role_form:
268 - title_create: "Rolle erstellen"
269 - title_edit: "Rolle bearbeiten"
270 - breadcrumb_create: "Erstellen"
271 - breadcrumb_edit: "Bearbeiten"
272 - back_to_list: "Zurück zur Liste"
273 - name_label: "Rollenname"
274 - name_placeholder: "z.B. moderator"
275 - description_label: "Beschreibung"
276 - description_placeholder: "Rollenbeschreibung..."
277 - permissions_label: "Berechtigungen"
278 - protected_name_hint: "Der Name dieser Rolle kann nicht geändert werden."
279 - cancel: "Abbrechen"
280 - submit_create: "Rolle erstellen"
281 - submit_edit: "Änderungen speichern"
282 - errors:
283 - title: "Fehlercodes"
284 - description: "Dokumentation der Anwendungsfehlercodes. Jeder Fehlercode ist mit einer Middleware verknüpft und liefert Kontextinformationen für die Fehlersuche."
285 - breadcrumb_errors: "Fehlercodes"
286 - table_code: "Code"
287 - table_description: "Beschreibung"
288 - table_category: "Kategorie"
289 - table_middleware: "Middleware"
290 - table_context: "Kontext"
291 - table_example: "Beispiel"
292 - legend_title: "Legende"
293 - legend_code: "Eindeutige Fehler-ID (Format: CATEGORY_NUMBER)"
294 - legend_description: "Beschreibung des Fehlers"
295 - legend_category: "Fehlertyp (Authentifizierung, CSRF, Rate Limiting, etc.)"
296 - legend_middleware: "Middleware, die diesen Fehler erzeugt"
297 - legend_context: "Detaillierte Erklärung, wann dieser Fehler auftritt"
298 - legend_example: "Konkretes Beispiel einer Situation, die diesen Fehler erzeugt"
299 - error_auth001_desc: "Ungültige Anmeldedaten"
300 - error_auth001_category: "Authentifizierung"
301 - error_auth001_context: "Der Benutzer hat bei der Anmeldung falsche Anmeldedaten eingegeben"
302 - error_auth001_example: "Anmeldeversuch mit falschem Passwort"
303 - error_auth002_desc: "Ungültiges Token"
304 - error_auth002_category: "Authentifizierung"
305 - error_auth002_context: "Das bereitgestellte JWT-Token ist ungültig oder fehlerhaft"
306 - error_auth002_example: "Beschädigtes JWT-Token oder mit anderem Schlüssel signiert"
307 - error_auth003_desc: "Token abgelaufen"
308 - error_auth003_category: "Authentifizierung"
309 - error_auth003_context: "Das JWT-Token ist abgelaufen und muss erneuert werden"
310 - error_auth003_example: "Zugriffsversuch mit abgelaufenem Token nach der Gültigkeitsdauer"
311 - error_csrf001_desc: "CSRF-Token fehlt"
312 - error_csrf001_category: "CSRF-Schutz"
313 - error_csrf001_context: "Die POST/PUT/DELETE-Anfrage enthält kein CSRF-Token"
314 - error_csrf001_example: "Formular ohne CSRF-Token im Header oder Body abgesendet"
315 - error_csrf002_desc: "Ungültiges CSRF-Token"
316 - error_csrf002_category: "CSRF-Schutz"
317 - error_csrf002_context: "Das bereitgestellte CSRF-Token stimmt nicht mit dem Sitzungs-Token überein"
318 - error_csrf002_example: "Geändertes oder gestohlenes CSRF-Token"
319 - error_rate001_desc: "Ratenlimit überschritten"
320 - error_rate001_category: "Rate Limiting"
321 - error_rate001_context: "Die Anzahl der Anfragen pro Minute wurde überschritten"
322 - error_rate001_example: "Mehr als 100 Anfragen/Min auf Admin-Endpunkten"
323 - error_valid001_desc: "Ungültige Eingabedaten"
324 - error_valid001_category: "Validierung"
325 - error_valid001_context: "Die bereitgestellten Daten entsprechen nicht den Validierungsregeln"
326 - error_valid001_example: "Ungültiges E-Mail-Format oder fehlendes Pflichtfeld"
327 - error_valid002_desc: "Passwortkomplexität nicht erfüllt"
328 - error_valid002_category: "Validierung"
329 - error_valid002_context: "Das Passwort erfüllt nicht die konfigurierten Komplexitätsregeln"
330 - error_valid002_example: "Passwort zu kurz oder fehlende erforderliche Zeichen"
331 - error_rbac001_desc: "Unzureichende Berechtigungen"
332 - error_rbac001_category: "Autorisierung"
333 - error_rbac001_context: "Der Benutzer hat nicht die erforderlichen Berechtigungen für diese Aktion"
334 - error_rbac001_example: "Nicht-Admin-Benutzer versucht auf /admin/users zuzugreifen"
335 - error_rbac002_desc: "Administratorrolle erforderlich"
336 - error_rbac002_category: "Autorisierung"
337 - error_rbac002_context: "Die Aktion erfordert eine Administratorrolle"
338 - error_rbac002_example: "Versuch einen Benutzer ohne Admin-Rolle zu löschen"
339 - error_db001_desc: "Datenbankoperationsfehler"
340 - error_db001_category: "Datenbank"
341 - error_db001_context: "Eine Datenbankoperation ist fehlgeschlagen"
342 - error_db001_example: "Fremdschlüssel-Constraint verletzt oder DB-Verbindung verloren"
343 - error_db002_desc: "Ressource nicht gefunden"
344 - error_db002_category: "Datenbank"
345 - error_db002_context: "Die angeforderte Ressource existiert nicht in der Datenbank"
346 - error_db002_example: "Benutzer mit nicht existierender ID"
347 - user_form:
348 - breadcrumb_create: "Erstellen"
349 - breadcrumb_edit: "Bearbeiten"
350 - title_create: "Benutzer erstellen"
351 - title_edit: "Benutzer bearbeiten"
352 - back_to_list: "Zurück zur Liste"
353 - username_label: "Benutzername"
354 - username_placeholder: "benutzername"
355 - username_readonly_hint: "Der Benutzername kann nach der Erstellung nicht geändert werden"
356 - email_label: "E-Mail"
357 - email_placeholder: "benutzer@example.com"
358 - password_label: "Passwort"
359 - password_optional: "Optional"
360 - password_placeholder: "Leer lassen, um ein zufälliges Passwort zu generieren"
361 - password_hint: "Wenn leer gelassen, wird automatisch ein sicheres Passwort generiert"
362 - roles_label: "Rollen"
363 - roles_hint: "Wählen Sie mindestens eine Rolle"
364 - must_change_password_label: "Passwortänderung erzwingen"
365 - must_change_password_desc: "Der Benutzer muss sein Passwort bei der nächsten Anmeldung ändern"
366 - cancel: "Abbrechen"
367 - submit_create: "Benutzer erstellen"
368 - submit_edit: "Änderungen speichern"
369 - settings:
370 - title: "Anwendungseinstellungen"
371 - page_title: "Anwendungseinstellungen - Admin - RustCloud"
372 - subtitle: "Globale RustCloud-Konfiguration"
373 - general: "Allgemein"
374 - app_name: "Anwendungsname"
375 - app_domain: "Domäne"
376 - app_domain_placeholder: "example.com"
377 - app_description: "Beschreibung"
378 - allow_registration: "Registrierung erlauben"
379 - allow_registration_desc: "Benutzer können Konten von der Startseite aus erstellen"
380 - email_validation_required: "E-Mail-Validierung erforderlich"
381 - email_validation_required_desc: "Benutzer müssen ihre E-Mail validieren, bevor sie sich anmelden können"
382 - save: "Einstellungen speichern"
383 - cancel: "Abbrechen"
384 - saved: "Einstellungen erfolgreich gespeichert"
385 - error: "Fehler beim Speichern der Einstellungen"
386 - network_error: "Netzwerkfehler. Bitte versuchen Sie es erneut."
387 - password_security: "Passwortsicherheit"
388 - password_min_length: "Mindestlänge"
389 - password_min_length_hint: "Zwischen 6 und 128 Zeichen"
390 - password_complexity: "Komplexitätsanforderungen"
391 - require_uppercase: "Großbuchstabe erforderlich"
392 - require_lowercase: "Kleinbuchstabe erforderlich"
393 - require_digits: "Ziffer erforderlich"
394 - require_special: "Sonderzeichen erforderlich"
395 - password_change_require_email: "E-Mail-Bestätigung für Passwortänderung"
396 - password_change_require_email_desc: "Wenn aktiviert, wird eine Bestätigungs-E-Mail gesendet, um jede Passwortänderung zu validieren. Andernfalls wird die Änderung sofort angewendet."
397 - password_expiration: "Passwortablauf"
398 - password_expiration_desc: "Periodische Passwortänderung erzwingen"
399 - expiration_days: "Ablauf nach (Tagen)"
400 - expiration_alert: "E-Mail-Warnung vor Ablauf"
401 - expiration_alert_days: "Warnung (Tage vorher)"
402 - audit_logging: "Audit-Protokollierung"
403 - log_level: "Protokollebene"
404 - log_level_debug: "DEBUG - Alle Details"
405 - log_level_info: "INFO - Normale Informationen"
406 - log_level_warn: "WARN - Nur Warnungen"
407 - log_level_error: "ERROR - Nur Fehler"
408 - log_level_hint: "Steuert die Ausführlichkeit der Audit-Logs"
409 - log_retention: "Log-Aufbewahrung (Tage)"
410 - log_retention_hint: "Aufbewahrungsdauer der Logs (1-365 Tage)"
411 - audit_info_message: "Audit-Logs zeichnen alle administrativen Aktionen auf (Erstellung, Änderung, Löschung von Benutzern)."
412 - save_changes: "Änderungen speichern"
413 - save_changes_desc: "Einstellungen werden sofort angewendet"
414 - saving: "Speichern..."
415 - save_success: "Einstellungen erfolgreich gespeichert!"
416 - save_error_prefix: "Fehler"
417 - # OAuth / SSO admin settings
418 - oauth_sso_title: "OAuth / SSO"
419 - oauth_enabled_label: "OAuth aktivieren"
420 - oauth_enabled_desc: "Anmeldung über externe Anbieter erlauben (Google, GitHub, etc.)"
421 - oauth_redirect_url_label: "Basis-Weiterleitungs-URL"
422 - oauth_redirect_url_desc: "Basis-URL für OAuth-Callbacks (z.B. https://meineapp.example.com)"
423 - oauth_auto_register_label: "Automatische Registrierung"
424 - oauth_auto_register_desc: "Automatisch ein Konto erstellen, wenn die E-Mail nicht existiert"
425 - oauth_link_existing_label: "Bestehende Konten verknüpfen"
426 - oauth_link_existing_desc: "Automatisch ein OAuth-Konto verknüpfen, wenn die verifizierte E-Mail übereinstimmt"
427 - oauth_client_id: "Client-ID"
428 - oauth_client_secret: "Client-Secret"
429 - oauth_tenant: "Mandanten-ID"
430 - oauth_redirect_uri: "Weiterleitungs-URI"
431 - oauth_copy_uri: "Kopieren"
432 - oauth_secret_configured: "Konfiguriert"
433 - oauth_secret_not_configured: "Nicht konfiguriert"
434 - oauth_secret_change: "Ändern"
435 - oauth_restart_warning: "Änderungen an Anmeldedaten erfordern einen Neustart der Anwendung."
436 - oauth_env_info: "Anmeldedaten können auch über Umgebungsvariablen gesetzt werden (OAUTH_*_CLIENT_ID, etc.)."
437 - oauth_google_label: "Google"
438 - oauth_google_desc: "OpenID Connect"
439 - oauth_github_label: "GitHub"
440 - oauth_github_desc: "OAuth2"
441 - oauth_discord_label: "Discord"
442 - oauth_discord_desc: "OAuth2"
443 - oauth_microsoft_label: "Microsoft"
444 - oauth_microsoft_desc: "OpenID Connect"
445 - users_list:
446 - page_title: "Benutzerverwaltung - Admin - RustCloud"
447 - title: "Benutzerverwaltung"
448 - breadcrumb_users: "Benutzer"
449 - create_user: "Benutzer erstellen"
450 - search_label: "Suchen"
451 - search_placeholder: "Benutzername oder E-Mail..."
452 - role_filter_label: "Rolle"
453 - all_roles: "Alle Rollen"
454 - per_page_label: "Pro Seite"
455 - search_button: "Suchen"
456 - results_summary: "Anzeige von {count} Benutzer(n) von {total} insgesamt"
457 - page_info: "Seite {page} von {total_pages}"
458 - table_username: "Benutzername"
459 - table_email: "E-Mail"
460 - table_roles: "Rollen"
461 - table_created_at: "Erstellt am"
462 - table_last_login: "Letzte Anmeldung"
463 - table_actions: "Aktionen"
464 - never: "Nie"
465 - edit: "Bearbeiten"
466 - no_users: "Keine Benutzer gefunden"
467 - reset_password_title: "Passwort zurücksetzen"
468 - reset_generate: "Zufälliges Passwort generieren"
469 - reset_custom: "Benutzerdefiniertes Passwort festlegen"
470 - reset_new_password_label: "Neues Passwort"
471 - reset_new_password_placeholder: "Mindestens 8 Zeichen, Großbuchstabe, Kleinbuchstabe, Ziffer, Sonderzeichen"
472 - reset_password_requirements: "⚠️ Muss enthalten: 8+ Zeichen, Großbuchstabe, Kleinbuchstabe, Ziffer, Sonderzeichen"
473 - reset_invalidate_sessions: "Alle aktiven Sitzungen für diesen Benutzer ungültig machen"
474 - reset_invalidate_sessions_desc: "Der Benutzer muss sich nach der Änderung erneut anmelden"
475 - reset_button: "Zurücksetzen"
476 - delete_confirm_title: "⚠️ Löschung bestätigen"
477 - delete_confirm_message: "Sind Sie sicher, dass Sie diesen Benutzer löschen möchten?"
478 - delete_confirm_username: "Benutzername:"
479 - delete_confirm_email: "E-Mail:"
480 - delete_irreversible: "Diese Aktion ist unwiderruflich!"
481 - delete_button: "Endgültig löschen"
482 - delete: "Löschen"
483 - delete_error: "Fehler beim Löschen des Benutzers"
484 - network_error: "Netzwerkfehler"
485 - edit_user_title: "Benutzer bearbeiten"
486 - resetting: "Zurücksetzen..."
487 - reset_by_email_title: "Zurücksetzen per E-Mail"
488 - reset_email: "Per E-Mail zurücksetzen"
489 - close: "Schließen"
490 - password_reset_success_title: "Passwort zurückgesetzt"
491 - password_warning_once: "Dieses Passwort wird nur einmal angezeigt. Kopieren Sie es jetzt!"
492 - new_password_label: "Neues Passwort"
493 - copy: "Kopieren"
494 - password_copied: "Passwort in die Zwischenablage kopiert"
495 - password_set_success: "Passwort erfolgreich zurückgesetzt"
496 - reset_error: "Fehler beim Zurücksetzen des Passworts"
497 -
498 -# Passwort ändern
499 -password:
500 - title: "Mein Passwort ändern"
501 - page_title: "Mein Passwort ändern - RustCloud"
502 - subtitle: "Ändern Sie Ihr Passwort, um Ihr Konto zu sichern. Eine Bestätigungs-E-Mail wird gesendet, um die Änderung zu validieren."
503 - subtitle_no_email: "Ändern Sie Ihr Passwort, um Ihr Konto zu sichern."
504 - must_change_message: "⚠️ Sie müssen Ihr Passwort ändern, bevor Sie fortfahren können."
505 - new_password: "Neues Passwort"
506 - current_password: "Aktuelles Passwort"
507 - current_password_placeholder: "Ihr aktuelles Passwort"
508 - new_password_placeholder: "Sicheres neues Passwort"
509 - required: "Erforderlich"
510 - requirements: "📌 Anforderungen: 8+ Zeichen, Großbuchstabe, Kleinbuchstabe, Ziffer, Sonderzeichen"
511 - strength: "Passwortstärke:"
512 - strength_weak: "Schwach"
513 - strength_medium: "Mittel"
514 - strength_strong: "Stark ✓"
515 - strength_too_short: "zu kurz"
516 - strength_missing_lowercase: "Kleinbuchstabe fehlt"
517 - strength_missing_uppercase: "Großbuchstabe fehlt"
518 - strength_missing_digit: "Ziffer fehlt"
519 - strength_missing_special: "Sonderzeichen fehlt"
520 - confirm_password: "Neues Passwort bestätigen"
521 - confirm_password_placeholder: "Wiederholen Sie das neue Passwort"
522 - passwords_match: "✓ Passwörter stimmen überein"
523 - passwords_not_match: "✗ Passwörter stimmen nicht überein"
524 - change_button: "Passwort ändern"
525 - changing: "Änderung läuft..."
526 - logout_warning_title: "Abmeldung von anderen Sitzungen"
527 - logout_warning_desc: "Alle Ihre anderen aktiven Sitzungen werden nach der Passwortänderung automatisch abgemeldet. Nur Ihre aktuelle Sitzung bleibt aktiv."
528 - save: "Neues Passwort speichern"
529 - saving: "Speichern..."
530 - saved: "Eine Bestätigungs-E-Mail wurde an Ihre Adresse gesendet. Klicken Sie auf den Link in der E-Mail, um die Passwortänderung zu bestätigen."
531 - saved_direct: "Passwort erfolgreich geändert! Ihre anderen Sitzungen wurden abgemeldet."
532 - error: "Fehler beim Ändern des Passworts"
533 - error_all_fields_required: "Alle Felder sind erforderlich."
534 - error_empty_data: "Die zu sendenden Daten sind leer."
535 - error_invalid_data: "Ungültige Daten. Überprüfen Sie, ob alle Felder ausgefüllt sind."
536 - error_incorrect_current: "Aktuelles Passwort ist falsch."
537 - error_reading_response: "Fehler beim Lesen der Serverantwort"
538 - error_415: "Fehler 415: Der Server hat die Daten nicht im erwarteten JSON-Format erhalten. Bitte versuchen Sie es erneut."
539 - network_error: "Netzwerkfehler. Bitte versuchen Sie es erneut."
540 - security_tips_title: "Sicherheitstipps"
541 - security_tip_unique: "Verwenden Sie ein eindeutiges Passwort, das Sie nicht anderswo verwenden"
542 - security_tip_share: "Teilen Sie Ihr Passwort niemals mit jemandem"
543 - security_tip_regular: "Ändern Sie Ihr Passwort regelmäßig (alle 3-6 Monate)"
544 - security_tip_2fa: "Aktivieren Sie die Zwei-Faktor-Authentifizierung, falls verfügbar"
545 - security_tip_manager: "Verwenden Sie einen Passwort-Manager für mehr Sicherheit"
546 -
547 -# Sitzungen
548 -sessions:
549 - title: "Aktive Sitzungen"
550 - page_title: "Aktive Sitzungen - RustCloud"
551 - subtitle: "Verwalten Sie Geräte, die mit Ihrem Konto verbunden sind"
552 - current_session: "Aktuelle Sitzung"
553 - current_badge: "Aktuell"
554 - unknown_device: "Unbekanntes Gerät"
555 - ip_address: "IP-Adresse:"
556 - created_at: "Erstellt am:"
557 - last_activity: "Letzte Aktivität:"
558 - session_id: "Sitzungs-ID:"
559 - revoke: "Widerrufen"
560 - revoke_confirm: "Sind Sie sicher, dass Sie die Sitzung für \"{device}\" widerrufen möchten?\n\nDieses Gerät wird sofort getrennt."
561 - revoke_success: "Sitzung erfolgreich widerrufen!"
562 - revoke_error: "Fehler beim Widerrufen der Sitzung"
563 - no_sessions: "Keine aktiven Sitzungen"
564 - no_sessions_desc: "Sie haben derzeit keine aktiven Sitzungen"
565 - danger_zone: "Gefahrenzone"
566 - danger_zone_desc: "Trennen Sie alle anderen Geräte in einer Aktion (Ihre aktuelle Sitzung bleibt aktiv)."
567 - revoke_all: "Alle anderen Sitzungen widerrufen"
568 - revoke_all_confirm: "⚠️ WARNUNG\n\nSind Sie sicher, dass Sie ALLE Ihre anderen Sitzungen widerrufen möchten?\n\nAlle Ihre anderen Geräte werden getrennt. Nur Ihre aktuelle Sitzung bleibt aktiv."
569 - revoke_all_success: "Alle anderen Sitzungen wurden widerrufen!"
570 - revoke_all_error: "Fehler beim Widerrufen. Einige Sitzungen wurden möglicherweise nicht widerrufen."
571 - about_title: "Über Sitzungen"
572 - about_desc: "Eine Sitzung wird bei jeder Anmeldung von einem anderen Gerät oder Browser erstellt. Das Widerrufen einer Sitzung trennt dieses Gerät sofort. Ihre aktuelle Sitzung kann von dieser Seite nicht widerrufen werden (melden Sie sich ab, um dies zu tun)."
573 - back_to_settings: "Zurück zu den Einstellungen"
574 -
575 -# Navigation menu (navbar)
576 -nav:
577 - home: "Startseite"
578 - settings: "Einstellungen"
579 - admin: "Administration"
580 -
581 -# User menu
582 -user_menu:
583 - profile: "Profil"
584 - logout: "Abmelden"
585 - settings: "Einstellungen"
586 -
587 -# Email verification messages
588 -email_verify:
589 - config_error: "Server-Konfigurationsfehler. Bitte kontaktieren Sie den Administrator."
590 - success: "Ihre E-Mail-Adresse wurde erfolgreich verifiziert. Sie können sich jetzt in Ihr Konto einloggen."
591 - invalid_link: "Der Verifizierungslink ist ungültig oder abgelaufen."
592 -
593 -# Email subjects
594 -email_subject:
595 - password_reset: "Passwort zurücksetzen"
596 - email_validation: "Bestätigung Ihrer E-Mail-Adresse"
597 - welcome: "Willkommen bei RustWarden!"
598 -
599 -# Rate limiting
600 -rate_limit:
601 - exceeded: "Zu viele Anfragen. Bitte versuchen Sie es später erneut."
602 - password_change: "Zu viele Passwortänderungsanfragen. Bitte warten Sie, bevor Sie es erneut versuchen."
603 -
604 -# OAuth
605 -oauth:
606 - divider: "oder"
607 - login_with: "Anmelden mit {provider}"
608 - error_denied: "Anmeldung vom Anbieter verweigert."
609 - error_generic: "OAuth-Anmeldefehler."
610 -
611 -# Sessions
612 -session:
613 - ip_unavailable: "Nicht verfügbar"
614 -
D locales/en.yml
+0 -635
@@ -1,635 +0,0 @@
1 -# English translations for RustCloud
2 -# Format: hierarchical keys with dots
3 -
4 -# Login
5 -login:
6 - title: "Login"
7 - page_title: "Login - RustCloud"
8 - page_description: "Login to RustCloud"
9 - subtitle: "Sign in to your cloud space"
10 - username: "Username"
11 - password: "Password"
12 - submit: "Sign in"
13 - remember_me: "Remember me"
14 - tab_login: "Login"
15 - tab_register: "Register"
16 - register_title: "Create an account"
17 - register_submit: "Create my account"
18 - username_placeholder: "Your username"
19 - password_placeholder: "Your password"
20 - username_placeholder_register: "Your username (min. 3 characters)"
21 - password_placeholder_register: "Your password (min. 8 characters)"
22 - email_placeholder: "your@email.com"
23 - forgot_password: "Forgot password?"
24 - email_not_verified: "Email not verified?"
25 - resend_verification: "Resend verification email"
26 - already_have_account: "Already have an account?"
27 - sign_in_link: "Sign in"
28 - success_message: "Login successful! Redirecting..."
29 - error_message: "Login error. Check your credentials."
30 - email_unverified_message: "Your email is not verified. Click below to resend the link."
31 - resend_button: "Resend verification email"
32 - resend_success: "Verification email sent if the account exists."
33 - resend_error: "Unable to send the request at this time."
34 - resend_prompt: "Please enter your email before resending."
35 - register_success: "Account created successfully! Please check your email."
36 - register_error: "Registration error"
37 - email_label: "Email"
38 - footer_text: "Nextcloud fork in Rust"
39 -
40 -# Resend verification email
41 -resend_verification:
42 - page_title: "Resend verification email - RustWarden"
43 - title: "Resend verification email"
44 - subtitle: "Enter your email address to receive a new verification link."
45 - email_label: "Email address"
46 - email_placeholder: "you@example.com"
47 - submit: "Send verification link"
48 - back_to_login: "Back to login"
49 - error_default: "Unable to send the request."
50 - success_default: "If the account exists and is not verified, an email has been sent."
51 - error_missing_email: "Please enter your email."
52 - error_cannot_send: "Unable to send the request at this time."
53 -
54 -# Password reset (from email link)
55 -password_reset:
56 - page_title: "Reset password"
57 - title: "Reset password"
58 - subtitle: "Enter your new password below."
59 - new_password_label: "New password"
60 - new_password_placeholder: "New secure password"
61 - requirements: "⚠️ Must contain: 8+ characters, uppercase, lowercase, digit, special character"
62 - confirm_password_label: "Confirm password"
63 - confirm_password_placeholder: "Confirm your new password"
64 - missing_token_url: "Reset token missing in URL."
65 - missing_token: "Reset token is missing."
66 - missing_new_password: "Please enter a new password."
67 - passwords_not_match: "Passwords do not match."
68 - success_message: "Your password has been reset successfully. You can now log in."
69 - error_link_invalid: "Unable to reset password. The link may be expired or invalid."
70 - error_generic: "Unable to reset password at this time."
71 -
72 -# Error messages
73 -error:
74 - invalid_credentials: "Invalid credentials"
75 - email_invalid: "Invalid email"
76 - required_field: "This field is required"
77 - unauthorized: "Unauthorized"
78 - not_found: "Resource not found"
79 - validation: "Validation error: {message}"
80 - database: "Database error occurred"
81 - internal: "Internal server error"
82 - invalid_token: "Invalid token"
83 - token_expired: "Token expired"
84 - token_reused: "Token reused - please re-authenticate"
85 - must_change_password: "Password change required"
86 - authentication_required: "Authentication required"
87 - insufficient_permissions: "Insufficient permissions"
88 - config: "Server configuration error"
89 - template: "Template error"
90 - validation_field:
91 - username_min_length: "Username must contain at least {min} characters"
92 - password_min_length: "Password must contain at least {min} characters"
93 - email_format: "Email address is not valid"
94 - password_require_uppercase: "Password must contain at least one uppercase letter"
95 - password_require_lowercase: "Password must contain at least one lowercase letter"
96 - password_require_digits: "Password must contain at least one digit"
97 - password_require_special: "Password must contain at least one special character (!@#$%^&*()_+-=[]{}|;:,.<>?)"
98 -
99 -# Settings
100 -settings:
101 - title: "Settings"
102 - page_title: "Settings - RustWarden"
103 - subtitle: "Manage your preferences and account settings"
104 - profile_title: "My Profile"
105 - profile_desc: "Edit your personal information (username, email)"
106 - password_title: "Password"
107 - password_desc: "Change your password to secure your account"
108 - sessions_title: "Active Sessions"
109 - sessions_desc: "Manage your active sessions and revoke access from other devices"
110 - preferences_title: "Preferences"
111 - preferences_desc: "Customize your experience (theme, language)"
112 - access: "Access"
113 - info_title: "Information"
114 - info_desc: "Use the sections above to manage different aspects of your account. All changes are secure and require your authentication."
115 - language: "Language"
116 - language_description: "Choose your preferred language"
117 - save: "Save"
118 - saved: "Settings saved"
119 -
120 -# Home page
121 -home:
122 - welcome: "Welcome, {username}!"
123 - subtitle: "Welcome to your personal space"
124 - my_account: "My Account"
125 - stat_username: "Username"
126 - stat_email: "Email"
127 - stat_member_since: "Member since"
128 - stat_roles: "Roles"
129 -
130 -# Common messages
131 -common:
132 - welcome: "Welcome {username}"
133 - loading: "Loading..."
134 - save: "Save"
135 - cancel: "Cancel"
136 - delete: "Delete"
137 - edit: "Edit"
138 - create: "Create"
139 -
140 -# i18n messages
141 -i18n:
142 - language_updated: "Language preference updated. Please reload the page to apply changes."
143 - invalid_language: "Invalid language code. Supported: fr, en, de, es"
144 -
145 -# Preferences
146 -preferences:
147 - title: "Display Preferences"
148 - page_title: "Display Preferences - RustCloud"
149 - subtitle: "Customize the interface appearance"
150 - theme: "Theme"
151 - theme_light: "Light"
152 - theme_light_desc: "Bright and clean interface"
153 - theme_dark: "Dark"
154 - theme_dark_desc: "Reduces eye strain"
155 - theme_auto: "Automatic"
156 - theme_auto_desc: "Adapts to time of day"
157 - theme_preview: "The theme will be applied immediately after saving"
158 - language: "Language"
159 - language_fr: "Français"
160 - language_fr_desc: "Interface in French"
161 - language_en: "English"
162 - language_en_desc: "English interface"
163 - language_de: "Deutsch"
164 - language_de_desc: "German interface"
165 - language_es: "Español"
166 - language_es_desc: "Spanish interface"
167 - translation_warning: "Complete interface translation is under development. Some elements may remain in French."
168 - modified: "Preferences modified"
169 - modified_desc: "Save your changes to apply them"
170 - save: "Save preferences"
171 - saving: "Saving..."
172 - cancel: "Cancel"
173 - saved_success: "Preferences saved successfully!"
174 - saved_reload: "Preferences saved successfully!\n\nThe language has been changed. Do you want to reload the page now to apply the changes?"
175 - error: "Error: {message}"
176 - network_error: "Network error. Please try again."
177 - sync_title: "Your preferences are synchronized"
178 - sync_desc: "Your display preferences are saved and automatically apply to all devices connected to your RustCloud account."
179 - preview_dark: "Preview: Dark theme will be applied"
180 - preview_light: "Preview: Light theme will be applied"
181 - preview_auto: "Preview: Automatic theme will be applied"
182 -
183 -# Profile
184 -profile:
185 - title: "My Profile"
186 - page_title: "My Profile - RustCloud"
187 - subtitle: "Edit your personal information"
188 - account_info: "Account Information"
189 - username: "Username"
190 - username_public: "Publicly visible"
191 - username_placeholder: "Your username"
192 - username_pattern: "Letters, numbers, dashes and underscores only"
193 - email: "Email"
194 - email_placeholder: "your@email.com"
195 - save: "Save changes"
196 - saving: "Saving..."
197 - saved: "Profile updated successfully"
198 - error: "Error updating profile"
199 - email_label: "Email address"
200 - email_used_for: "Used for login"
201 - email_warning: "⚠️ You will be logged out after modification"
202 - email_change_info: "Email changes require reconnection for security reasons."
203 - username_help: "3-50 characters (letters, numbers, -, _)"
204 - additional_info: "Additional Information"
205 - account_created: "Account created on"
206 - roles: "Roles"
207 - linked_accounts_title: "Linked Accounts"
208 - no_linked_accounts: "No external accounts linked."
209 - linked_since: "Linked since"
210 - unlink_button: "Unlink"
211 - unlink_confirm: "Are you sure you want to unlink this account?"
212 - unlink_error: "Unable to unlink this account."
213 - cannot_unlink_last: "Cannot remove your last authentication method."
214 -
215 -# Breadcrumb
216 -breadcrumb:
217 - home: "Home"
218 - settings: "Settings"
219 - admin: "Administration"
220 - preferences: "Preferences"
221 - profile: "Profile"
222 - password: "Password"
223 - sessions: "Sessions"
224 -
225 -# Admin
226 -admin:
227 - dashboard:
228 - title: "Administration"
229 - heading: "Administrator Dashboard"
230 - users_card_title: "Users"
231 - users_card_subtitle: "Total users"
232 - access_button: "Access"
233 - sessions_card_title: "Active Sessions"
234 - sessions_card_subtitle: "Ongoing sessions"
235 - admins_card_title: "Administrators"
236 - admins_card_subtitle: "Admin accounts"
237 - last_activity_card_title: "Last Activity"
238 - last_activity_card_subtitle: "Last login"
239 - audit_section_title: "Audit Log Statistics"
240 - audit_total_logs: "Total logs"
241 - audit_last_24h: "Last 24h"
242 - audit_by_level: "By level"
243 - chart_label: "Logs by level"
244 - roles_card_title: "Roles Management"
245 - roles_card_desc: "Manage roles and granular permissions"
246 - roles_stat_title: "Roles"
247 - settings_card_title: "Application Settings"
248 - settings_card_desc: "Configure global application settings"
249 - apps_card_title: "Application Management"
250 - apps_card_desc: "Enable or disable modular applications"
251 - orgs_card_title: "Organisation Management"
252 - orgs_card_desc: "Create and manage organisations and their members"
253 - orgs_stat_title: "Organisations"
254 - orgs_members_stat_title: "Total members"
255 - roles_list:
256 - page_title: "Roles Management"
257 - breadcrumb_roles: "Roles"
258 - title: "Roles"
259 - create_role: "Create a role"
260 - table_name: "Name"
261 - table_description: "Description"
262 - table_users: "Users"
263 - table_permissions: "Permissions"
264 - table_actions: "Actions"
265 - edit: "Edit"
266 - delete: "Delete"
267 - no_roles: "No roles found."
268 - protected_hint: "Protected"
269 - delete_confirm_title: "Confirm deletion"
270 - delete_confirm_message: "Are you sure you want to delete the role"
271 - delete_button: "Delete"
272 - role_form:
273 - title_create: "Create a role"
274 - title_edit: "Edit role"
275 - breadcrumb_create: "Create"
276 - breadcrumb_edit: "Edit"
277 - back_to_list: "Back to list"
278 - name_label: "Role name"
279 - name_placeholder: "e.g. moderator"
280 - description_label: "Description"
281 - description_placeholder: "Role description..."
282 - permissions_label: "Permissions"
283 - protected_name_hint: "This role name cannot be changed."
284 - cancel: "Cancel"
285 - submit_create: "Create role"
286 - submit_edit: "Save changes"
287 - errors:
288 - title: "Error Codes"
289 - description: "Application error code documentation. Each error code is associated with a middleware and provides context information for debugging."
290 - breadcrumb_errors: "Error Codes"
291 - table_code: "Code"
292 - table_description: "Description"
293 - table_category: "Category"
294 - table_middleware: "Middleware"
295 - table_context: "Context"
296 - table_example: "Example"
297 - legend_title: "Legend"
298 - legend_code: "Unique error identifier (format: CATEGORY_NUMBER)"
299 - legend_description: "Description of the error"
300 - legend_category: "Error type (Authentication, CSRF, Rate Limiting, etc.)"
301 - legend_middleware: "Middleware responsible for generating this error"
302 - legend_context: "Detailed explanation of when this error occurs"
303 - legend_example: "Concrete example of a situation generating this error"
304 - error_auth001_desc: "Invalid credentials"
305 - error_auth001_category: "Authentication"
306 - error_auth001_context: "The user provided incorrect credentials during login"
307 - error_auth001_example: "Login attempt with an incorrect password"
308 - error_auth002_desc: "Invalid token"
309 - error_auth002_category: "Authentication"
310 - error_auth002_context: "The provided JWT token is invalid or malformed"
311 - error_auth002_example: "Corrupted JWT token or signed with a different key"
312 - error_auth003_desc: "Token expired"
313 - error_auth003_category: "Authentication"
314 - error_auth003_context: "The JWT token has expired and needs to be renewed"
315 - error_auth003_example: "Access attempt with an expired token after the validity period"
316 - error_csrf001_desc: "Missing CSRF token"
317 - error_csrf001_category: "CSRF Protection"
318 - error_csrf001_context: "The POST/PUT/DELETE request does not contain a CSRF token"
319 - error_csrf001_example: "Form submitted without a CSRF token in the header or body"
320 - error_csrf002_desc: "Invalid CSRF token"
321 - error_csrf002_category: "CSRF Protection"
322 - error_csrf002_context: "The provided CSRF token does not match the session token"
323 - error_csrf002_example: "Modified or stolen CSRF token"
324 - error_rate001_desc: "Rate limit exceeded"
325 - error_rate001_category: "Rate Limiting"
326 - error_rate001_context: "The number of requests per minute has been exceeded"
327 - error_rate001_example: "More than 100 requests/min on admin endpoints"
328 - error_valid001_desc: "Invalid input data"
329 - error_valid001_category: "Validation"
330 - error_valid001_context: "The provided data does not comply with validation rules"
331 - error_valid001_example: "Invalid email format or missing required field"
332 - error_valid002_desc: "Password complexity not met"
333 - error_valid002_category: "Validation"
334 - error_valid002_context: "The password does not meet the configured complexity rules"
335 - error_valid002_example: "Password too short or missing required characters"
336 - error_rbac001_desc: "Insufficient permissions"
337 - error_rbac001_category: "Authorization"
338 - error_rbac001_context: "The user does not have the necessary permissions for this action"
339 - error_rbac001_example: "Non-admin user attempting to access /admin/users"
340 - error_rbac002_desc: "Admin role required"
341 - error_rbac002_category: "Authorization"
342 - error_rbac002_context: "The action requires an administrator role"
343 - error_rbac002_example: "Attempting to delete a user without admin role"
344 - error_db001_desc: "Database operation error"
345 - error_db001_category: "Database"
346 - error_db001_context: "A database operation failed"
347 - error_db001_example: "Foreign key constraint violated or DB connection lost"
348 - error_db002_desc: "Resource not found"
349 - error_db002_category: "Database"
350 - error_db002_context: "The requested resource does not exist in the database"
351 - error_db002_example: "User with non-existent ID"
352 - user_form:
353 - breadcrumb_create: "Create"
354 - breadcrumb_edit: "Edit"
355 - title_create: "Create a user"
356 - title_edit: "Edit a user"
357 - back_to_list: "Back to list"
358 - username_label: "Username"
359 - username_placeholder: "username"
360 - username_readonly_hint: "Username cannot be changed after creation"
361 - email_label: "Email"
362 - email_placeholder: "user@example.com"
363 - password_label: "Password"
364 - password_optional: "Optional"
365 - password_placeholder: "Leave empty to generate a random password"
366 - password_hint: "If left empty, a secure password will be automatically generated"
367 - roles_label: "Roles"
368 - roles_hint: "Select at least one role"
369 - must_change_password_label: "Force password change"
370 - must_change_password_desc: "The user will have to change their password at next login"
371 - cancel: "Cancel"
372 - submit_create: "Create user"
373 - submit_edit: "Save changes"
374 - settings:
375 - title: "Application Settings"
376 - page_title: "Application Settings - Admin - RustCloud"
377 - subtitle: "Global RustCloud configuration"
378 - general: "General"
379 - app_name: "Application name"
380 - app_domain: "Domain"
381 - app_domain_placeholder: "example.com"
382 - app_description: "Description"
383 - allow_registration: "Allow registration"
384 - allow_registration_desc: "Users can create accounts from the home page"
385 - email_validation_required: "Email validation required"
386 - email_validation_required_desc: "Users must validate their email before they can log in"
387 - save: "Save settings"
388 - cancel: "Cancel"
389 - saved: "Settings saved successfully"
390 - error: "Error saving settings"
391 - network_error: "Network error. Please try again."
392 - password_security: "Password Security"
393 - password_min_length: "Minimum length"
394 - password_min_length_hint: "Between 6 and 128 characters"
395 - password_complexity: "Complexity requirements"
396 - require_uppercase: "Uppercase required"
397 - require_lowercase: "Lowercase required"
398 - require_digits: "Digit required"
399 - require_special: "Special character required"
400 - password_change_require_email: "Email confirmation for password change"
401 - password_change_require_email_desc: "When enabled, a confirmation email is sent to validate any password change. Otherwise, the change is applied immediately."
402 - password_expiration: "Password expiration"
403 - password_expiration_desc: "Force periodic password change"
404 - expiration_days: "Expiration after (days)"
405 - expiration_alert: "Email alert before expiration"
406 - expiration_alert_days: "Alert (days before)"
407 - audit_logging: "Audit Logging"
408 - log_level: "Log level"
409 - log_level_debug: "DEBUG - All details"
410 - log_level_info: "INFO - Normal information"
411 - log_level_warn: "WARN - Warnings only"
412 - log_level_error: "ERROR - Errors only"
413 - log_level_hint: "Controls the verbosity of audit logs"
414 - log_retention: "Log retention (days)"
415 - log_retention_hint: "Log retention period (1-365 days)"
416 - audit_info_message: "Audit logs record all administrative actions (creation, modification, deletion of users)."
417 - save_changes: "Save changes"
418 - save_changes_desc: "Settings will be applied immediately"
419 - saving: "Saving..."
420 - save_success: "Settings saved successfully!"
421 - save_error_prefix: "Error"
422 - # OAuth / SSO admin settings
423 - oauth_sso_title: "OAuth / SSO"
424 - oauth_enabled_label: "Enable OAuth"
425 - oauth_enabled_desc: "Allow login via external providers (Google, GitHub, etc.)"
426 - oauth_redirect_url_label: "Base redirect URL"
427 - oauth_redirect_url_desc: "Base URL for OAuth callbacks (e.g. https://myapp.example.com)"
428 - oauth_auto_register_label: "Auto-registration"
429 - oauth_auto_register_desc: "Automatically create an account if the email does not exist"
430 - oauth_link_existing_label: "Link existing accounts"
431 - oauth_link_existing_desc: "Automatically link an OAuth account if the verified email matches"
432 - oauth_client_id: "Client ID"
433 - oauth_client_secret: "Client Secret"
434 - oauth_tenant: "Tenant ID"
435 - oauth_redirect_uri: "Redirect URI"
436 - oauth_copy_uri: "Copy"
437 - oauth_secret_configured: "Configured"
438 - oauth_secret_not_configured: "Not configured"
439 - oauth_secret_change: "Change"
440 - oauth_restart_warning: "Credential changes require an application restart."
441 - oauth_env_info: "Credentials can also be set via environment variables (OAUTH_*_CLIENT_ID, etc.)."
442 - oauth_google_label: "Google"
443 - oauth_google_desc: "OpenID Connect"
444 - oauth_github_label: "GitHub"
445 - oauth_github_desc: "OAuth2"
446 - oauth_discord_label: "Discord"
447 - oauth_discord_desc: "OAuth2"
448 - oauth_microsoft_label: "Microsoft"
449 - oauth_microsoft_desc: "OpenID Connect"
450 - users_list:
451 - page_title: "User Management - Admin - RustCloud"
452 - title: "User Management"
453 - breadcrumb_users: "Users"
454 - create_user: "Create user"
455 - search_label: "Search"
456 - search_placeholder: "Username or email..."
457 - role_filter_label: "Role"
458 - all_roles: "All roles"
459 - per_page_label: "Per page"
460 - search_button: "Search"
461 - results_summary: "Showing {count} user(s) out of {total} total"
462 - page_info: "Page {page} of {total_pages}"
463 - table_username: "Username"
464 - table_email: "Email"
465 - table_roles: "Roles"
466 - table_created_at: "Created on"
467 - table_last_login: "Last login"
468 - table_actions: "Actions"
469 - never: "Never"
470 - edit: "Edit"
471 - no_users: "No users found"
472 - reset_password_title: "Reset password"
473 - reset_generate: "Generate random password"
474 - reset_custom: "Set custom password"
475 - reset_email: "Reset by email"
476 - reset_new_password_label: "New password"
477 - reset_new_password_placeholder: "Minimum 8 characters, uppercase, lowercase, digit, special character"
478 - reset_password_requirements: "⚠️ Must contain: 8+ characters, uppercase, lowercase, digit, special character"
479 - reset_invalidate_sessions: "Invalidate all active sessions for this user"
480 - reset_invalidate_sessions_desc: "The user will need to log in again after the change"
481 - reset_button: "Reset"
482 - delete_confirm_title: "⚠️ Confirm deletion"
483 - delete_confirm_message: "Are you sure you want to delete this user?"
484 - delete_confirm_username: "Username:"
485 - delete_confirm_email: "Email:"
486 - delete_irreversible: "This action is irreversible!"
487 - delete_button: "Delete permanently"
488 - delete: "Delete"
489 - delete_error: "Error deleting user"
490 - network_error: "Network error"
491 - edit_user_title: "Edit user"
492 - resetting: "Resetting..."
493 - reset_by_email_title: "Reset by email"
494 - close: "Close"
495 - password_reset_success_title: "Password reset"
496 - password_warning_once: "This password will only be displayed once. Copy it now!"
497 - new_password_label: "New password"
498 - copy: "Copy"
499 - password_copied: "Password copied to clipboard"
500 - password_set_success: "Password reset successfully"
501 - reset_error: "Error resetting password"
502 -
503 -# Password Change
504 -password:
505 - title: "Change my password"
506 - page_title: "Change my password - RustCloud"
507 - subtitle: "Modify your password to secure your account. A confirmation email will be sent to validate the change."
508 - subtitle_no_email: "Modify your password to secure your account."
509 - must_change_message: "⚠️ You must change your password before continuing."
510 - new_password: "New password"
511 - current_password: "Current password"
512 - current_password_placeholder: "Your current password"
513 - new_password_placeholder: "Secure new password"
514 - required: "Required"
515 - requirements: "📌 Requirements: 8+ characters, uppercase, lowercase, digit, special character"
516 - strength: "Password strength:"
517 - strength_weak: "Weak"
518 - strength_medium: "Medium"
519 - strength_strong: "Strong ✓"
520 - strength_too_short: "too short"
521 - strength_missing_lowercase: "missing lowercase"
522 - strength_missing_uppercase: "missing uppercase"
523 - strength_missing_digit: "missing digit"
524 - strength_missing_special: "missing special character"
525 - confirm_password: "Confirm new password"
526 - confirm_password_placeholder: "Repeat the new password"
527 - passwords_match: "✓ Passwords match"
528 - passwords_not_match: "✗ Passwords do not match"
529 - change_button: "Change password"
530 - changing: "Changing..."
531 - logout_warning_title: "Logout from other sessions"
532 - logout_warning_desc: "All your other active sessions will be automatically logged out after the password change. Only your current session will remain active."
533 - save: "Save new password"
534 - saving: "Saving..."
535 - saved: "A confirmation email has been sent to your address. Click the link in the email to validate the password change."
536 - saved_direct: "Password changed successfully! Your other sessions have been logged out."
537 - error: "Error changing password"
538 - error_all_fields_required: "All fields are required."
539 - error_empty_data: "The data to send is empty."
540 - error_invalid_data: "Invalid data. Check that all fields are filled."
541 - error_incorrect_current: "Current password is incorrect."
542 - error_reading_response: "Error reading server response"
543 - error_415: "Error 415: The server did not receive the data in the expected JSON format. Please try again."
544 - network_error: "Network error. Please try again."
545 - security_tips_title: "Security Tips"
546 - security_tip_unique: "Use a unique password that you don't use elsewhere"
547 - security_tip_share: "Never share your password with anyone"
548 - security_tip_regular: "Change your password regularly (every 3-6 months)"
549 - security_tip_2fa: "Enable two-factor authentication if available"
550 - security_tip_manager: "Use a password manager for better security"
551 - pending_request_message: "⚠️ A password change request is pending email confirmation."
552 - pending_request_info: "A confirmation email has been sent to your address. Click the link in the email to confirm the change."
553 - pending_request_cancel: "Cancel pending request"
554 - pending_request_canceled: "Request canceled successfully"
555 - pending_request_cancel_error: "Error canceling the request"
556 - confirmation_sent: "Confirmation email sent! Check your inbox."
557 - confirmation_error: "Error sending confirmation email"
558 -
559 -# Password Change Confirmation Email
560 -password_change_confirmation:
561 - subject: "Password Change Confirmation"
562 - greeting: "Hello {username}"
563 - message: "You have requested to change your password for your {app_name} account. To confirm this change, click the link below."
564 - button_text: "Confirm Password Change"
565 - expires_message: "This link is valid for {hours} hours and is single-use."
566 - footer: "This email was sent automatically, please do not reply."
567 -
568 -# Sessions
569 -sessions:
570 - title: "Active sessions"
571 - page_title: "Active sessions - RustCloud"
572 - subtitle: "Manage devices connected to your account"
573 - current_session: "Current session"
574 - current_badge: "Current"
575 - unknown_device: "Unknown device"
576 - ip_address: "IP Address:"
577 - created_at: "Created on:"
578 - last_activity: "Last activity:"
579 - session_id: "Session ID:"
580 - revoke: "Revoke"
581 - revoke_confirm: "Are you sure you want to revoke the session for \"{device}\"?\n\nThis device will be disconnected immediately."
582 - revoke_success: "Session revoked successfully!"
583 - revoke_error: "Error revoking session"
584 - no_sessions: "No active sessions"
585 - no_sessions_desc: "You currently have no active sessions"
586 - danger_zone: "Danger Zone"
587 - danger_zone_desc: "Disconnect all other devices in one action (your current session will remain active)."
588 - revoke_all: "Revoke all other sessions"
589 - revoke_all_confirm: "⚠️ WARNING\n\nAre you sure you want to revoke ALL your other sessions?\n\nAll your other devices will be disconnected. Only your current session will remain active."
590 - revoke_all_success: "All other sessions have been revoked!"
591 - revoke_all_error: "Error revoking. Some sessions may not have been revoked."
592 - about_title: "About sessions"
593 - about_desc: "A session is created each time you log in from a different device or browser. Revoking a session immediately disconnects that device. Your current session cannot be revoked from this page (log out to do that)."
594 - back_to_settings: "Back to settings"
595 -
596 -# Navigation menu (navbar)
597 -nav:
598 - home: "Home"
599 - settings: "Settings"
600 - admin: "Administration"
601 -
602 -# User menu
603 -user_menu:
604 - profile: "Profile"
605 - logout: "Logout"
606 - settings: "Settings"
607 -
608 -# Email verification messages
609 -email_verify:
610 - config_error: "Server configuration error. Please contact the administrator."
611 - success: "Your email address has been successfully verified. You can now log in to your account."
612 - invalid_link: "The verification link is invalid or has expired."
613 -
614 -# Email subjects
615 -email_subject:
616 - password_reset: "Password Reset"
617 - email_validation: "Verify Your Email Address"
618 - welcome: "Welcome to RustWarden!"
619 -
620 -# Rate limiting
621 -rate_limit:
622 - exceeded: "Too many requests. Please try again later."
623 - password_change: "Too many password change requests. Please wait before trying again."
624 -
625 -# OAuth
626 -oauth:
627 - divider: "or"
628 - login_with: "Sign in with {provider}"
629 - error_denied: "Login denied by provider."
630 - error_generic: "OAuth login error."
631 -
632 -# Sessions
633 -session:
634 - ip_unavailable: "Unavailable"
635 -
D locales/es.yml
+0 -614
@@ -1,614 +0,0 @@
1 -# Traducciones en español para RustCloud
2 -# Formato: claves jerárquicas con puntos
3 -
4 -# Inicio de sesión
5 -login:
6 - title: "Iniciar sesión"
7 - page_title: "Iniciar sesión - RustCloud"
8 - page_description: "Iniciar sesión en RustCloud"
9 - subtitle: "Inicie sesión en su espacio en la nube"
10 - username: "Nombre de usuario"
11 - password: "Contraseña"
12 - submit: "Iniciar sesión"
13 - remember_me: "Recordarme"
14 - tab_login: "Iniciar sesión"
15 - tab_register: "Registrarse"
16 - register_title: "Crear una cuenta"
17 - register_submit: "Crear mi cuenta"
18 - username_placeholder: "Su nombre de usuario"
19 - password_placeholder: "Su contraseña"
20 - username_placeholder_register: "Su nombre de usuario (mín. 3 caracteres)"
21 - password_placeholder_register: "Su contraseña (mín. 8 caracteres)"
22 - email_placeholder: "su@email.com"
23 - forgot_password: "¿Olvidó su contraseña?"
24 - email_not_verified: "¿Email no verificado?"
25 - resend_verification: "Reenviar email de verificación"
26 - already_have_account: "¿Ya tiene una cuenta?"
27 - sign_in_link: "Iniciar sesión"
28 - success_message: "¡Inicio de sesión exitoso! Redirigiendo..."
29 - error_message: "Error de inicio de sesión. Verifique sus credenciales."
30 - email_unverified_message: "Su email no está verificado. Haga clic a continuación para reenviar el enlace."
31 - resend_button: "Reenviar email de verificación"
32 - resend_success: "Email de verificación enviado si la cuenta existe."
33 - resend_error: "No se puede enviar la solicitud en este momento."
34 - resend_prompt: "Por favor ingrese su email antes de reenviar."
35 - register_success: "¡Cuenta creada con éxito! Por favor verifique su email."
36 - register_error: "Error en el registro"
37 - email_label: "Correo electrónico"
38 - footer_text: "Fork de Nextcloud en Rust"
39 -
40 -# Mensajes de error
41 -error:
42 - invalid_credentials: "Credenciales inválidas"
43 - email_invalid: "Email inválido"
44 - required_field: "Este campo es obligatorio"
45 - unauthorized: "No autorizado"
46 - not_found: "Recurso no encontrado"
47 - validation: "Error de validación: {message}"
48 - database: "Error de base de datos"
49 - internal: "Error interno del servidor"
50 - invalid_token: "Token inválido"
51 - token_expired: "Token expirado"
52 - token_reused: "Token reutilizado - por favor vuelva a autenticarse"
53 - must_change_password: "Cambio de contraseña requerido"
54 - authentication_required: "Autenticación requerida"
55 - insufficient_permissions: "Permisos insuficientes"
56 - config: "Error de configuración del servidor"
57 - template: "Error de plantilla"
58 - validation_field:
59 - username_min_length: "El nombre de usuario debe contener al menos {min} caracteres"
60 - password_min_length: "La contraseña debe contener al menos {min} caracteres"
61 - email_format: "La dirección de correo electrónico no es válida"
62 - password_require_uppercase: "La contraseña debe contener al menos una letra mayúscula"
63 - password_require_lowercase: "La contraseña debe contener al menos una letra minúscula"
64 - password_require_digits: "La contraseña debe contener al menos un dígito"
65 - password_require_special: "La contraseña debe contener al menos un carácter especial (!@#$%^&*()_+-=[]{}|;:,.<>?)"
66 -
67 -# Reenviar email de verificación
68 -resend_verification:
69 - page_title: "Reenviar email de verificación - RustWarden"
70 - title: "Reenviar email de verificación"
71 - subtitle: "Ingrese su dirección de correo electrónico para recibir un nuevo enlace de verificación."
72 - email_label: "Dirección de correo electrónico"
73 - email_placeholder: "usted@ejemplo.com"
74 - submit: "Enviar enlace de verificación"
75 - back_to_login: "Volver al inicio de sesión"
76 - error_default: "No se pudo enviar la solicitud."
77 - success_default: "Si la cuenta existe y no está verificada, se ha enviado un email."
78 - error_missing_email: "Por favor ingrese su correo electrónico."
79 - error_cannot_send: "No se puede enviar la solicitud en este momento."
80 -
81 -# Restablecimiento de contraseña (desde enlace de email)
82 -password_reset:
83 - page_title: "Restablecer contraseña"
84 - title: "Restablecer contraseña"
85 - subtitle: "Ingrese su nueva contraseña a continuación."
86 - new_password_label: "Nueva contraseña"
87 - new_password_placeholder: "Nueva contraseña segura"
88 - requirements: "⚠️ Debe contener: 8+ caracteres, mayúscula, minúscula, dígito, carácter especial"
89 - confirm_password_label: "Confirmar contraseña"
90 - confirm_password_placeholder: "Confirme su nueva contraseña"
91 - missing_token_url: "Falta el token de restablecimiento en la URL."
92 - missing_token: "Falta el token de restablecimiento."
93 - missing_new_password: "Por favor ingrese una nueva contraseña."
94 - passwords_not_match: "Las contraseñas no coinciden."
95 - success_message: "Su contraseña ha sido restablecida con éxito. Ahora puede iniciar sesión."
96 - error_link_invalid: "No se pudo restablecer la contraseña. El enlace puede haber expirado o ser inválido."
97 - error_generic: "No se puede restablecer la contraseña en este momento."
98 -
99 -# Configuración
100 -settings:
101 - title: "Configuración"
102 - page_title: "Configuración - RustWarden"
103 - subtitle: "Gestione sus preferencias y configuración de cuenta"
104 - profile_title: "Mi Perfil"
105 - profile_desc: "Edite su información personal (nombre de usuario, email)"
106 - password_title: "Contraseña"
107 - password_desc: "Cambie su contraseña para asegurar su cuenta"
108 - sessions_title: "Sesiones activas"
109 - sessions_desc: "Gestione sus sesiones activas y revoque el acceso desde otros dispositivos"
110 - preferences_title: "Preferencias"
111 - preferences_desc: "Personalice su experiencia (tema, idioma)"
112 - access: "Acceder"
113 - info_title: "Información"
114 - info_desc: "Utilice las secciones anteriores para gestionar diferentes aspectos de su cuenta. Todos los cambios son seguros y requieren su autenticación."
115 - language: "Idioma"
116 - language_description: "Elija su idioma preferido"
117 - save: "Guardar"
118 - saved: "Configuración guardada"
119 -
120 -# Página de inicio
121 -home:
122 - welcome: "¡Bienvenido, {username}!"
123 - subtitle: "Bienvenido a tu espacio personal"
124 - my_account: "Mi Cuenta"
125 - stat_username: "Nombre de usuario"
126 - stat_email: "Correo electrónico"
127 - stat_member_since: "Miembro desde"
128 - stat_roles: "Roles"
129 -
130 -# Mensajes comunes
131 -common:
132 - welcome: "Bienvenido {username}"
133 - loading: "Cargando..."
134 - save: "Guardar"
135 - cancel: "Cancelar"
136 - delete: "Eliminar"
137 - edit: "Editar"
138 - create: "Crear"
139 -
140 -# Preferencias
141 -preferences:
142 - title: "Preferencias de visualización"
143 - page_title: "Preferencias de visualización - RustCloud"
144 - subtitle: "Personalice la apariencia de la interfaz"
145 - theme: "Tema"
146 - theme_light: "Claro"
147 - theme_light_desc: "Interfaz brillante y limpia"
148 - theme_dark: "Oscuro"
149 - theme_dark_desc: "Reduce la fatiga visual"
150 - theme_auto: "Automático"
151 - theme_auto_desc: "Se adapta a la hora del día"
152 - theme_preview: "El tema se aplicará inmediatamente después de guardar"
153 - language: "Idioma"
154 - language_fr: "Français"
155 - language_fr_desc: "Interfaz en francés"
156 - language_en: "English"
157 - language_en_desc: "Interfaz en inglés"
158 - language_de: "Deutsch"
159 - language_de_desc: "Interfaz en alemán"
160 - language_es: "Español"
161 - language_es_desc: "Interfaz en español"
162 - translation_warning: "La traducción completa de la interfaz está en desarrollo. Algunos elementos pueden permanecer en francés."
163 - modified: "Preferencias modificadas"
164 - modified_desc: "Guarde sus cambios para aplicarlos"
165 - save: "Guardar preferencias"
166 - saving: "Guardando..."
167 - cancel: "Cancelar"
168 - saved_success: "¡Preferencias guardadas con éxito!"
169 - saved_reload: "¡Preferencias guardadas con éxito!\n\nEl idioma ha sido cambiado. ¿Desea recargar la página ahora para aplicar los cambios?"
170 - error: "Error: {message}"
171 - network_error: "Error de red. Por favor intente nuevamente."
172 - sync_title: "Sus preferencias están sincronizadas"
173 - sync_desc: "Sus preferencias de visualización se guardan y se aplican automáticamente en todos los dispositivos conectados a su cuenta RustCloud."
174 - preview_dark: "Vista previa: Se aplicará el tema oscuro"
175 - preview_light: "Vista previa: Se aplicará el tema claro"
176 - preview_auto: "Vista previa: Se aplicará el tema automático"
177 -
178 -# Perfil
179 -profile:
180 - title: "Mi Perfil"
181 - page_title: "Mi Perfil - RustCloud"
182 - subtitle: "Edite su información personal"
183 - account_info: "Información de la cuenta"
184 - username: "Nombre de usuario"
185 - username_public: "Visible públicamente"
186 - username_placeholder: "Su nombre de usuario"
187 - username_pattern: "Solo letras, números, guiones y guiones bajos"
188 - email: "Email"
189 - email_placeholder: "su@email.com"
190 - save: "Guardar cambios"
191 - saving: "Guardando..."
192 - saved: "Perfil actualizado con éxito"
193 - error: "Error al actualizar el perfil"
194 - email_label: "Dirección de correo electrónico"
195 - email_used_for: "Se utiliza para iniciar sesión"
196 - email_warning: "⚠️ Será desconectado después de la modificación"
197 - email_change_info: "Los cambios de correo electrónico requieren reconexión por razones de seguridad."
198 - username_help: "3-50 caracteres (letras, números, -, _)"
199 - additional_info: "Información adicional"
200 - account_created: "Cuenta creada el"
201 - roles: "Roles"
202 - linked_accounts_title: "Cuentas vinculadas"
203 - no_linked_accounts: "No hay cuentas externas vinculadas."
204 - linked_since: "Vinculada desde"
205 - unlink_button: "Desvincular"
206 - unlink_confirm: "¿Está seguro de que desea desvincular esta cuenta?"
207 - unlink_error: "No se pudo desvincular esta cuenta."
208 - cannot_unlink_last: "No se puede eliminar su último método de autenticación."
209 -
210 -# Breadcrumb
211 -breadcrumb:
212 - home: "Inicio"
213 - settings: "Configuración"
214 - admin: "Administración"
215 - preferences: "Preferencias"
216 - profile: "Perfil"
217 - password: "Contraseña"
218 - sessions: "Sesiones"
219 -
220 -# Administración
221 -admin:
222 - dashboard:
223 - title: "Administración"
224 - heading: "Panel de Administración"
225 - users_card_title: "Usuarios"
226 - users_card_subtitle: "Usuarios totales"
227 - access_button: "Acceder"
228 - sessions_card_title: "Sesiones activas"
229 - sessions_card_subtitle: "Sesiones en curso"
230 - admins_card_title: "Administradores"
231 - admins_card_subtitle: "Cuentas admin"
232 - last_activity_card_title: "Última actividad"
233 - last_activity_card_subtitle: "Último inicio de sesión"
234 - audit_section_title: "Estadísticas de logs de auditoría"
235 - audit_total_logs: "Logs totales"
236 - audit_last_24h: "Últimas 24h"
237 - audit_by_level: "Por nivel"
238 - chart_label: "Logs por nivel"
239 - roles_card_title: "Gestión de Roles"
240 - roles_card_desc: "Gestionar roles y permisos granulares"
241 - roles_stat_title: "Roles"
242 - settings_card_title: "Configuración de la Aplicación"
243 - settings_card_desc: "Configurar los parámetros globales de la aplicación"
244 - apps_card_title: "Gestión de Aplicaciones"
245 - apps_card_desc: "Activar o desactivar aplicaciones modulares"
246 - orgs_card_title: "Gestión de Organizaciones"
247 - orgs_card_desc: "Crear y gestionar organizaciones y sus miembros"
248 - orgs_stat_title: "Organizaciones"
249 - orgs_members_stat_title: "Miembros totales"
250 - roles_list:
251 - page_title: "Gestión de roles"
252 - breadcrumb_roles: "Roles"
253 - title: "Roles"
254 - create_role: "Crear un rol"
255 - table_name: "Nombre"
256 - table_description: "Descripción"
257 - table_users: "Usuarios"
258 - table_permissions: "Permisos"
259 - table_actions: "Acciones"
260 - edit: "Editar"
261 - delete: "Eliminar"
262 - no_roles: "No se encontraron roles."
263 - protected_hint: "Protegido"
264 - delete_confirm_title: "Confirmar eliminación"
265 - delete_confirm_message: "¿Está seguro de que desea eliminar el rol"
266 - delete_button: "Eliminar"
267 - role_form:
268 - title_create: "Crear un rol"
269 - title_edit: "Editar rol"
270 - breadcrumb_create: "Crear"
271 - breadcrumb_edit: "Editar"
272 - back_to_list: "Volver a la lista"
273 - name_label: "Nombre del rol"
274 - name_placeholder: "ej: moderator"
275 - description_label: "Descripción"
276 - description_placeholder: "Descripción del rol..."
277 - permissions_label: "Permisos"
278 - protected_name_hint: "El nombre de este rol no se puede cambiar."
279 - cancel: "Cancelar"
280 - submit_create: "Crear rol"
281 - submit_edit: "Guardar cambios"
282 - errors:
283 - title: "Códigos de Error"
284 - description: "Documentación de los códigos de error de la aplicación. Cada código de error está asociado a un middleware y proporciona información de contexto para la depuración."
285 - breadcrumb_errors: "Códigos de Error"
286 - table_code: "Código"
287 - table_description: "Descripción"
288 - table_category: "Categoría"
289 - table_middleware: "Middleware"
290 - table_context: "Contexto"
291 - table_example: "Ejemplo"
292 - legend_title: "Leyenda"
293 - legend_code: "Identificador único del error (formato: CATEGORY_NUMBER)"
294 - legend_description: "Descripción del error"
295 - legend_category: "Tipo de error (Autenticación, CSRF, Rate Limiting, etc.)"
296 - legend_middleware: "Middleware responsable de generar este error"
297 - legend_context: "Explicación detallada de cuándo ocurre este error"
298 - legend_example: "Ejemplo concreto de una situación que genera este error"
299 - error_auth001_desc: "Credenciales inválidas"
300 - error_auth001_category: "Autenticación"
301 - error_auth001_context: "El usuario proporcionó credenciales incorrectas al iniciar sesión"
302 - error_auth001_example: "Intento de inicio de sesión con contraseña incorrecta"
303 - error_auth002_desc: "Token inválido"
304 - error_auth002_category: "Autenticación"
305 - error_auth002_context: "El token JWT proporcionado es inválido o está malformado"
306 - error_auth002_example: "Token JWT corrupto o firmado con una clave diferente"
307 - error_auth003_desc: "Token expirado"
308 - error_auth003_category: "Autenticación"
309 - error_auth003_context: "El token JWT ha expirado y debe renovarse"
310 - error_auth003_example: "Intento de acceso con un token expirado después del período de validez"
311 - error_csrf001_desc: "Token CSRF faltante"
312 - error_csrf001_category: "Protección CSRF"
313 - error_csrf001_context: "La solicitud POST/PUT/DELETE no contiene un token CSRF"
314 - error_csrf001_example: "Formulario enviado sin token CSRF en el header o body"
315 - error_csrf002_desc: "Token CSRF inválido"
316 - error_csrf002_category: "Protección CSRF"
317 - error_csrf002_context: "El token CSRF proporcionado no coincide con el token de sesión"
318 - error_csrf002_example: "Token CSRF modificado o robado"
319 - error_rate001_desc: "Límite de tasa excedido"
320 - error_rate001_category: "Rate Limiting"
321 - error_rate001_context: "Se ha excedido el número de solicitudes por minuto"
322 - error_rate001_example: "Más de 100 solicitudes/min en endpoints admin"
323 - error_valid001_desc: "Datos de entrada inválidos"
324 - error_valid001_category: "Validación"
325 - error_valid001_context: "Los datos proporcionados no cumplen con las reglas de validación"
326 - error_valid001_example: "Formato de email inválido o campo requerido faltante"
327 - error_valid002_desc: "Complejidad de contraseña no cumplida"
328 - error_valid002_category: "Validación"
329 - error_valid002_context: "La contraseña no cumple con las reglas de complejidad configuradas"
330 - error_valid002_example: "Contraseña demasiado corta o sin los caracteres requeridos"
331 - error_rbac001_desc: "Permisos insuficientes"
332 - error_rbac001_category: "Autorización"
333 - error_rbac001_context: "El usuario no tiene los permisos necesarios para esta acción"
334 - error_rbac001_example: "Usuario no administrador intentando acceder a /admin/users"
335 - error_rbac002_desc: "Rol de administrador requerido"
336 - error_rbac002_category: "Autorización"
337 - error_rbac002_context: "La acción requiere un rol de administrador"
338 - error_rbac002_example: "Intento de eliminar un usuario sin rol admin"
339 - error_db001_desc: "Error de operación de base de datos"
340 - error_db001_category: "Base de datos"
341 - error_db001_context: "Una operación de base de datos falló"
342 - error_db001_example: "Restricción de clave foránea violada o conexión DB perdida"
343 - error_db002_desc: "Recurso no encontrado"
344 - error_db002_category: "Base de datos"
345 - error_db002_context: "El recurso solicitado no existe en la base de datos"
346 - error_db002_example: "Usuario con ID inexistente"
347 - user_form:
348 - breadcrumb_create: "Crear"
349 - breadcrumb_edit: "Modificar"
350 - title_create: "Crear un usuario"
351 - title_edit: "Modificar un usuario"
352 - back_to_list: "Volver a la lista"
353 - username_label: "Nombre de usuario"
354 - username_placeholder: "nombre_usuario"
355 - username_readonly_hint: "El nombre de usuario no se puede cambiar después de la creación"
356 - email_label: "Email"
357 - email_placeholder: "usuario@example.com"
358 - password_label: "Contraseña"
359 - password_optional: "Opcional"
360 - password_placeholder: "Dejar vacío para generar una contraseña aleatoria"
361 - password_hint: "Si se deja vacío, se generará automáticamente una contraseña segura"
362 - roles_label: "Roles"
363 - roles_hint: "Seleccione al menos un rol"
364 - must_change_password_label: "Forzar cambio de contraseña"
365 - must_change_password_desc: "El usuario deberá cambiar su contraseña en el próximo inicio de sesión"
366 - cancel: "Cancelar"
367 - submit_create: "Crear usuario"
368 - submit_edit: "Guardar cambios"
369 - settings:
370 - title: "Configuración de la aplicación"
371 - page_title: "Configuración de la aplicación - Admin - RustCloud"
372 - subtitle: "Configuración global de RustCloud"
373 - general: "General"
374 - app_name: "Nombre de la aplicación"
375 - app_domain: "Dominio"
376 - app_domain_placeholder: "example.com"
377 - app_description: "Descripción"
378 - allow_registration: "Permitir registro"
379 - allow_registration_desc: "Los usuarios pueden crear cuentas desde la página de inicio"
380 - email_validation_required: "Validación de email requerida"
381 - email_validation_required_desc: "Los usuarios deben validar su email antes de poder iniciar sesión"
382 - save: "Guardar configuración"
383 - cancel: "Cancelar"
384 - saved: "Configuración guardada con éxito"
385 - error: "Error al guardar la configuración"
386 - network_error: "Error de red. Por favor intente nuevamente."
387 - password_security: "Seguridad de Contraseñas"
388 - password_min_length: "Longitud mínima"
389 - password_min_length_hint: "Entre 6 y 128 caracteres"
390 - password_complexity: "Requisitos de complejidad"
391 - require_uppercase: "Mayúscula requerida"
392 - require_lowercase: "Minúscula requerida"
393 - require_digits: "Dígito requerido"
394 - require_special: "Carácter especial requerido"
395 - password_change_require_email: "Confirmación por email del cambio de contraseña"
396 - password_change_require_email_desc: "Cuando está activado, se envía un correo de confirmación para validar cualquier cambio de contraseña. De lo contrario, el cambio se aplica inmediatamente."
397 - password_expiration: "Expiración de contraseñas"
398 - password_expiration_desc: "Forzar cambio periódico de contraseña"
399 - expiration_days: "Expiración después de (días)"
400 - expiration_alert: "Alerta por email antes de la expiración"
401 - expiration_alert_days: "Alerta (días antes)"
402 - audit_logging: "Registro de Auditoría"
403 - log_level: "Nivel de log"
404 - log_level_debug: "DEBUG - Todos los detalles"
405 - log_level_info: "INFO - Información normal"
406 - log_level_warn: "WARN - Solo advertencias"
407 - log_level_error: "ERROR - Solo errores"
408 - log_level_hint: "Controla la verbosidad de los logs de auditoría"
409 - log_retention: "Retención de logs (días)"
410 - log_retention_hint: "Período de retención de logs (1-365 días)"
411 - audit_info_message: "Los logs de auditoría registran todas las acciones administrativas (creación, modificación, eliminación de usuarios)."
412 - save_changes: "Guardar cambios"
413 - save_changes_desc: "La configuración se aplicará inmediatamente"
414 - saving: "Guardando..."
415 - save_success: "¡Configuración guardada con éxito!"
416 - save_error_prefix: "Error"
417 - # OAuth / SSO admin settings
418 - oauth_sso_title: "OAuth / SSO"
419 - oauth_enabled_label: "Activar OAuth"
420 - oauth_enabled_desc: "Permitir inicio de sesión a través de proveedores externos (Google, GitHub, etc.)"
421 - oauth_redirect_url_label: "URL base de redirección"
422 - oauth_redirect_url_desc: "URL base para callbacks OAuth (ej: https://miapp.example.com)"
423 - oauth_auto_register_label: "Auto-registro"
424 - oauth_auto_register_desc: "Crear automáticamente una cuenta si el correo no existe"
425 - oauth_link_existing_label: "Vincular cuentas existentes"
426 - oauth_link_existing_desc: "Vincular automáticamente una cuenta OAuth si el correo verificado coincide"
427 - oauth_client_id: "Client ID"
428 - oauth_client_secret: "Client Secret"
429 - oauth_tenant: "Tenant ID"
430 - oauth_redirect_uri: "URI de redirección"
431 - oauth_copy_uri: "Copiar"
432 - oauth_secret_configured: "Configurado"
433 - oauth_secret_not_configured: "No configurado"
434 - oauth_secret_change: "Cambiar"
435 - oauth_restart_warning: "Los cambios de credenciales requieren un reinicio de la aplicación."
436 - oauth_env_info: "Las credenciales también se pueden configurar mediante variables de entorno (OAUTH_*_CLIENT_ID, etc.)."
437 - oauth_google_label: "Google"
438 - oauth_google_desc: "OpenID Connect"
439 - oauth_github_label: "GitHub"
440 - oauth_github_desc: "OAuth2"
441 - oauth_discord_label: "Discord"
442 - oauth_discord_desc: "OAuth2"
443 - oauth_microsoft_label: "Microsoft"
444 - oauth_microsoft_desc: "OpenID Connect"
445 - users_list:
446 - page_title: "Gestión de Usuarios - Admin - RustCloud"
447 - title: "Gestión de Usuarios"
448 - breadcrumb_users: "Usuarios"
449 - create_user: "Crear usuario"
450 - search_label: "Buscar"
451 - search_placeholder: "Nombre de usuario o email..."
452 - role_filter_label: "Rol"
453 - all_roles: "Todos los roles"
454 - per_page_label: "Por página"
455 - search_button: "Buscar"
456 - results_summary: "Mostrando {count} usuario(s) de {total} total"
457 - page_info: "Página {page} de {total_pages}"
458 - table_username: "Nombre de usuario"
459 - table_email: "Email"
460 - table_roles: "Roles"
461 - table_created_at: "Creado el"
462 - table_last_login: "Último inicio de sesión"
463 - table_actions: "Acciones"
464 - never: "Nunca"
465 - edit: "Modificar"
466 - no_users: "No se encontraron usuarios"
467 - reset_password_title: "Restablecer contraseña"
468 - reset_generate: "Generar contraseña aleatoria"
469 - reset_custom: "Establecer contraseña personalizada"
470 - reset_new_password_label: "Nueva contraseña"
471 - reset_new_password_placeholder: "Mínimo 8 caracteres, mayúscula, minúscula, dígito, carácter especial"
472 - reset_password_requirements: "⚠️ Debe contener: 8+ caracteres, mayúscula, minúscula, dígito, carácter especial"
473 - reset_invalidate_sessions: "Invalidar todas las sesiones activas de este usuario"
474 - reset_invalidate_sessions_desc: "El usuario deberá iniciar sesión nuevamente después del cambio"
475 - reset_button: "Restablecer"
476 - delete_confirm_title: "⚠️ Confirmar eliminación"
477 - delete_confirm_message: "¿Está seguro de que desea eliminar este usuario?"
478 - delete_confirm_username: "Nombre de usuario:"
479 - delete_confirm_email: "Email:"
480 - delete_irreversible: "¡Esta acción es irreversible!"
481 - delete_button: "Eliminar permanentemente"
482 - delete: "Eliminar"
483 - delete_error: "Error al eliminar el usuario"
484 - network_error: "Error de red"
485 - edit_user_title: "Modificar usuario"
486 - resetting: "Restableciendo..."
487 - reset_by_email_title: "Restablecer por email"
488 - reset_email: "Restablecer por email"
489 - close: "Cerrar"
490 - password_reset_success_title: "Contraseña restablecida"
491 - password_warning_once: "¡Esta contraseña solo se mostrará una vez. Cópiela ahora!"
492 - new_password_label: "Nueva contraseña"
493 - copy: "Copiar"
494 - password_copied: "Contraseña copiada al portapapeles"
495 - password_set_success: "Contraseña restablecida con éxito"
496 - reset_error: "Error al restablecer la contraseña"
497 -
498 -# Cambio de contraseña
499 -password:
500 - title: "Cambiar mi contraseña"
501 - page_title: "Cambiar mi contraseña - RustCloud"
502 - subtitle: "Modifique su contraseña para asegurar su cuenta. Se enviará un correo electrónico de confirmación para validar el cambio."
503 - subtitle_no_email: "Modifique su contraseña para asegurar su cuenta."
504 - must_change_message: "⚠️ Debe cambiar su contraseña antes de continuar."
505 - new_password: "Nueva contraseña"
506 - current_password: "Contraseña actual"
507 - current_password_placeholder: "Su contraseña actual"
508 - new_password_placeholder: "Nueva contraseña segura"
509 - required: "Requerido"
510 - requirements: "📌 Requisitos: 8+ caracteres, mayúscula, minúscula, dígito, carácter especial"
511 - strength: "Fortaleza de la contraseña:"
512 - strength_weak: "Débil"
513 - strength_medium: "Medio"
514 - strength_strong: "Fuerte ✓"
515 - strength_too_short: "demasiado corta"
516 - strength_missing_lowercase: "falta minúscula"
517 - strength_missing_uppercase: "falta mayúscula"
518 - strength_missing_digit: "falta dígito"
519 - strength_missing_special: "falta carácter especial"
520 - confirm_password: "Confirmar nueva contraseña"
521 - confirm_password_placeholder: "Repita la nueva contraseña"
522 - passwords_match: "✓ Las contraseñas coinciden"
523 - passwords_not_match: "✗ Las contraseñas no coinciden"
524 - change_button: "Cambiar contraseña"
525 - changing: "Cambiando..."
526 - logout_warning_title: "Cerrar sesión de otras sesiones"
527 - logout_warning_desc: "Todas sus otras sesiones activas se cerrarán automáticamente después del cambio de contraseña. Solo su sesión actual permanecerá activa."
528 - save: "Guardar nueva contraseña"
529 - saving: "Guardando..."
530 - saved: "Se ha enviado un correo electrónico de confirmación a su dirección. Haga clic en el enlace del correo para validar el cambio de contraseña."
531 - saved_direct: "¡Contraseña cambiada con éxito! Sus otras sesiones han sido cerradas."
532 - error: "Error al cambiar la contraseña"
533 - error_all_fields_required: "Todos los campos son obligatorios."
534 - error_empty_data: "Los datos a enviar están vacíos."
535 - error_invalid_data: "Datos inválidos. Verifique que todos los campos estén completos."
536 - error_incorrect_current: "La contraseña actual es incorrecta."
537 - error_reading_response: "Error al leer la respuesta del servidor"
538 - error_415: "Error 415: El servidor no recibió los datos en el formato JSON esperado. Por favor intente nuevamente."
539 - network_error: "Error de red. Por favor intente nuevamente."
540 - security_tips_title: "Consejos de seguridad"
541 - security_tip_unique: "Use una contraseña única que no use en otro lugar"
542 - security_tip_share: "Nunca comparta su contraseña con nadie"
543 - security_tip_regular: "Cambie su contraseña regularmente (cada 3-6 meses)"
544 - security_tip_2fa: "Active la autenticación de dos factores si está disponible"
545 - security_tip_manager: "Use un administrador de contraseñas para mayor seguridad"
546 -
547 -# Sesiones
548 -sessions:
549 - title: "Sesiones activas"
550 - page_title: "Sesiones activas - RustCloud"
551 - subtitle: "Gestione los dispositivos conectados a su cuenta"
552 - current_session: "Sesión actual"
553 - current_badge: "Actual"
554 - unknown_device: "Dispositivo desconocido"
555 - ip_address: "Dirección IP:"
556 - created_at: "Creada el:"
557 - last_activity: "Última actividad:"
558 - session_id: "ID de sesión:"
559 - revoke: "Revocar"
560 - revoke_confirm: "¿Está seguro de que desea revocar la sesión para \"{device}\"?\n\nEste dispositivo será desconectado inmediatamente."
561 - revoke_success: "¡Sesión revocada con éxito!"
562 - revoke_error: "Error al revocar la sesión"
563 - no_sessions: "No hay sesiones activas"
564 - no_sessions_desc: "Actualmente no tiene sesiones activas"
565 - danger_zone: "Zona de peligro"
566 - danger_zone_desc: "Desconecte todos los demás dispositivos en una sola acción (su sesión actual permanecerá activa)."
567 - revoke_all: "Revocar todas las demás sesiones"
568 - revoke_all_confirm: "⚠️ ADVERTENCIA\n\n¿Está seguro de que desea revocar TODAS sus demás sesiones?\n\nTodos sus demás dispositivos serán desconectados. Solo su sesión actual permanecerá activa."
569 - revoke_all_success: "¡Todas las demás sesiones han sido revocadas!"
570 - revoke_all_error: "Error al revocar. Es posible que algunas sesiones no hayan sido revocadas."
571 - about_title: "Acerca de las sesiones"
572 - about_desc: "Se crea una sesión cada vez que inicia sesión desde un dispositivo o navegador diferente. Revocar una sesión desconecta inmediatamente ese dispositivo. Su sesión actual no puede ser revocada desde esta página (cierre sesión para hacerlo)."
573 - back_to_settings: "Volver a configuración"
574 -
575 -# Navigation menu (navbar)
576 -nav:
577 - home: "Inicio"
578 - settings: "Configuración"
579 - admin: "Administración"
580 -
581 -# User menu
582 -user_menu:
583 - profile: "Perfil"
584 - logout: "Cerrar sesión"
585 - settings: "Configuración"
586 -
587 -# Email verification messages
588 -email_verify:
589 - config_error: "Error de configuración del servidor. Por favor, contacte al administrador."
590 - success: "Su dirección de correo electrónico ha sido verificada con éxito. Ahora puede iniciar sesión en su cuenta."
591 - invalid_link: "El enlace de verificación es inválido o ha expirado."
592 -
593 -# Email subjects
594 -email_subject:
595 - password_reset: "Restablecimiento de contraseña"
596 - email_validation: "Verifique su dirección de correo electrónico"
597 - welcome: "¡Bienvenido a RustWarden!"
598 -
599 -# Rate limiting
600 -rate_limit:
601 - exceeded: "Demasiadas solicitudes. Por favor, inténtelo de nuevo más tarde."
602 - password_change: "Demasiadas solicitudes de cambio de contraseña. Por favor, espere antes de intentarlo de nuevo."
603 -
604 -# OAuth
605 -oauth:
606 - divider: "o"
607 - login_with: "Iniciar sesión con {provider}"
608 - error_denied: "Inicio de sesión denegado por el proveedor."
609 - error_generic: "Error de inicio de sesión OAuth."
610 -
611 -# Sessions
612 -session:
613 - ip_unavailable: "No disponible"
614 -
D locales/fr.yml
+0 -737
@@ -1,737 +0,0 @@
1 -# Traductions françaises pour RustCloud
2 -# Format: clés hiérarchiques avec points
3 -
4 -# Connexion
5 -login:
6 - title: "Connexion"
7 - page_title: "Connexion - RustCloud"
8 - page_description: "Connexion à RustCloud"
9 - subtitle: "Connectez-vous à votre espace cloud"
10 - username: "Nom d'utilisateur"
11 - password: "Mot de passe"
12 - submit: "Se connecter"
13 - remember_me: "Se souvenir de moi"
14 - tab_login: "Connexion"
15 - tab_register: "Inscription"
16 - register_title: "Créer un compte"
17 - register_submit: "Créer mon compte"
18 - username_placeholder: "Votre nom d'utilisateur"
19 - password_placeholder: "Votre mot de passe"
20 - username_placeholder_register: "Votre nom d'utilisateur (min. 3 caractères)"
21 - password_placeholder_register: "Votre mot de passe (min. 8 caractères)"
22 - email_placeholder: "votre@email.com"
23 - forgot_password: "Mot de passe oublié ?"
24 - email_not_verified: "Email non vérifié ?"
25 - resend_verification: "Renvoyer l'email de validation"
26 - already_have_account: "Déjà un compte ?"
27 - sign_in_link: "Se connecter"
28 - success_message: "Connexion réussie ! Redirection..."
29 - error_message: "Erreur de connexion. Vérifiez vos identifiants."
30 - email_unverified_message: "Votre email n'est pas vérifié. Cliquez ci-dessous pour renvoyer le lien."
31 - resend_button: "Renvoyer l'email de validation"
32 - resend_success: "Email de validation renvoyé si le compte existe."
33 - resend_error: "Impossible d'envoyer la demande pour l'instant."
34 - resend_prompt: "Veuillez renseigner votre email avant de renvoyer."
35 - register_success: "Compte créé avec succès ! Veuillez vérifier votre email."
36 - register_error: "Erreur lors de l'inscription"
37 - email_label: "Email"
38 - footer_text: "Fork de Nextcloud en Rust"
39 -
40 -# Renvoyer l'email de validation
41 -resend_verification:
42 - page_title: "Renvoyer l'email de validation - RustWarden"
43 - title: "Renvoyer l'email de validation"
44 - subtitle: "Entrez votre adresse email pour recevoir un nouveau lien de validation."
45 - email_label: "Adresse email"
46 - email_placeholder: "vous@example.com"
47 - submit: "Envoyer le lien de validation"
48 - back_to_login: "Revenir à la connexion"
49 - error_default: "Impossible d'envoyer la demande."
50 - success_default: "Si le compte existe et n'est pas vérifié, un email a été envoyé."
51 - error_missing_email: "Veuillez renseigner votre email."
52 - error_cannot_send: "Impossible d'envoyer la demande pour l'instant."
53 -
54 -# Réinitialisation de mot de passe (via lien email)
55 -password_reset:
56 - page_title: "Réinitialiser le mot de passe"
57 - title: "Réinitialiser le mot de passe"
58 - subtitle: "Entrez votre nouveau mot de passe ci-dessous."
59 - new_password_label: "Nouveau mot de passe"
60 - new_password_placeholder: "Nouveau mot de passe sécurisé"
61 - requirements: "⚠️ Doit contenir : 8+ caractères, majuscule, minuscule, chiffre, caractère spécial"
62 - confirm_password_label: "Confirmer le mot de passe"
63 - confirm_password_placeholder: "Confirmez votre nouveau mot de passe"
64 - missing_token_url: "Token de réinitialisation manquant dans l'URL."
65 - missing_token: "Token de réinitialisation manquant."
66 - missing_new_password: "Veuillez entrer un nouveau mot de passe."
67 - passwords_not_match: "Les mots de passe ne correspondent pas."
68 - success_message: "Votre mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter."
69 - error_link_invalid: "Impossible de réinitialiser le mot de passe. Le lien peut être expiré ou invalide."
70 - error_generic: "Impossible de réinitialiser le mot de passe pour l'instant."
71 -
72 -# Messages d'erreur
73 -error:
74 - invalid_credentials: "Identifiants incorrects"
75 - email_invalid: "Email invalide"
76 - required_field: "Ce champ est requis"
77 - unauthorized: "Non autorisé"
78 - not_found: "Ressource non trouvée"
79 - validation: "Erreur de validation : {message}"
80 - database: "Erreur de base de données"
81 - internal: "Erreur interne du serveur"
82 - invalid_token: "Token invalide"
83 - token_expired: "Token expiré"
84 - token_reused: "Token réutilisé - veuillez vous ré-authentifier"
85 - must_change_password: "Changement de mot de passe requis"
86 - authentication_required: "Authentification requise"
87 - insufficient_permissions: "Permissions insuffisantes"
88 - config: "Erreur de configuration du serveur"
89 - template: "Erreur de rendu de template"
90 - validation_field:
91 - username_min_length: "Le nom d'utilisateur doit contenir au moins {min} caractères"
92 - password_min_length: "Le mot de passe doit contenir au moins {min} caractères"
93 - email_format: "L'adresse email n'est pas valide"
94 - password_require_uppercase: "Le mot de passe doit contenir au moins une majuscule"
95 - password_require_lowercase: "Le mot de passe doit contenir au moins une minuscule"
96 - password_require_digits: "Le mot de passe doit contenir au moins un chiffre"
97 - password_require_special: "Le mot de passe doit contenir au moins un caractère spécial (!@#$%^&*()_+-=[]{}|;:,.<>?)"
98 -
99 -# Paramètres
100 -settings:
101 - title: "Paramètres"
102 - page_title: "Paramètres - RustWarden"
103 - subtitle: "Gérez vos préférences et paramètres de compte"
104 - profile_title: "Mon Profil"
105 - profile_desc: "Modifiez vos informations personnelles (nom d'utilisateur, email)"
106 - password_title: "Mot de passe"
107 - password_desc: "Changez votre mot de passe pour sécuriser votre compte"
108 - sessions_title: "Sessions actives"
109 - sessions_desc: "Gérez vos sessions actives et révoquez l'accès depuis d'autres appareils"
110 - preferences_title: "Préférences"
111 - preferences_desc: "Personnalisez votre expérience (thème, langue)"
112 - access: "Accéder"
113 - info_title: "Informations"
114 - info_desc: "Utilisez les sections ci-dessus pour gérer différents aspects de votre compte. Toutes les modifications sont sécurisées et nécessitent votre authentification."
115 - language: "Langue"
116 - language_description: "Choisissez votre langue préférée"
117 - save: "Enregistrer"
118 - saved: "Paramètres enregistrés"
119 -
120 -# Page d'accueil
121 -home:
122 - welcome: "Bienvenue, {username} !"
123 - subtitle: "Bienvenue sur votre espace personnel"
124 - my_account: "Mon Compte"
125 - stat_username: "Nom d'utilisateur"
126 - stat_email: "Email"
127 - stat_member_since: "Membre depuis"
128 - stat_roles: "Rôles"
129 -
130 -# Messages généraux
131 -common:
132 - welcome: "Bienvenue {username}"
133 - loading: "Chargement..."
134 - save: "Enregistrer"
135 - cancel: "Annuler"
136 - delete: "Supprimer"
137 - edit: "Modifier"
138 - create: "Créer"
139 - load_more: "Charger plus"
140 -
141 -# Messages i18n
142 -i18n:
143 - language_updated: "Préférence de langue mise à jour. Veuillez recharger la page pour appliquer les changements."
144 - invalid_language: "Code de langue invalide. Langues supportées : fr, en, de, es"
145 -
146 -# Préférences
147 -preferences:
148 - title: "Préférences d'affichage"
149 - page_title: "Préférences d'affichage - RustCloud"
150 - subtitle: "Personnalisez l'apparence de l'interface"
151 - theme: "Thème"
152 - theme_light: "Clair"
153 - theme_light_desc: "Interface lumineuse et épurée"
154 - theme_dark: "Sombre"
155 - theme_dark_desc: "Réduit la fatigue oculaire"
156 - theme_auto: "Automatique"
157 - theme_auto_desc: "S'adapte à l'heure de la journée"
158 - theme_preview: "Le thème sera appliqué immédiatement après l'enregistrement"
159 - language: "Langue"
160 - language_fr: "Français"
161 - language_fr_desc: "Interface en français"
162 - language_en: "English"
163 - language_en_desc: "English interface"
164 - language_de: "Deutsch"
165 - language_de_desc: "Deutsche Benutzeroberfläche"
166 - language_es: "Español"
167 - language_es_desc: "Interfaz en español"
168 - translation_warning: "La traduction complète de l'interface est en cours de développement. Certains éléments peuvent rester en français."
169 - modified: "Préférences modifiées"
170 - modified_desc: "Enregistrez vos changements pour les appliquer"
171 - save: "Enregistrer les préférences"
172 - saving: "Enregistrement..."
173 - cancel: "Annuler"
174 - saved_success: "Préférences enregistrées avec succès !"
175 - saved_reload: "Préférences enregistrées avec succès !\n\nLa langue a été modifiée. Voulez-vous recharger la page maintenant pour appliquer les changements ?"
176 - error: "Erreur : {message}"
177 - network_error: "Erreur réseau. Veuillez réessayer."
178 - sync_title: "Vos préférences sont synchronisées"
179 - sync_desc: "Vos préférences d'affichage sont enregistrées et s'appliquent automatiquement sur tous vos appareils connectés à votre compte RustCloud."
180 - preview_dark: "Aperçu : Thème sombre sera appliqué"
181 - preview_light: "Aperçu : Thème clair sera appliqué"
182 - preview_auto: "Aperçu : Thème automatique sera appliqué"
183 -
184 -# Profil
185 -profile:
186 - title: "Mon Profil"
187 - page_title: "Mon Profil - RustCloud"
188 - subtitle: "Modifiez vos informations personnelles"
189 - account_info: "Informations du compte"
190 - username: "Nom d'utilisateur"
191 - username_public: "Visible publiquement"
192 - username_placeholder: "Votre nom d'utilisateur"
193 - username_pattern: "Lettres, chiffres, tirets et underscores uniquement"
194 - email: "Email"
195 - email_placeholder: "votre@email.com"
196 - save: "Enregistrer les modifications"
197 - saving: "Enregistrement..."
198 - saved: "Profil mis à jour avec succès"
199 - error: "Erreur lors de la mise à jour du profil"
200 - email_label: "Adresse email"
201 - email_used_for: "Utilisée pour la connexion"
202 - email_warning: "⚠️ Vous serez déconnecté après la modification"
203 - email_change_info: "Les modifications d'email nécessitent une reconnexion pour des raisons de sécurité."
204 - username_help: "3-50 caractères (lettres, chiffres, -, _)"
205 - additional_info: "Informations supplémentaires"
206 - account_created: "Compte créé le"
207 - roles: "Rôles"
208 - linked_accounts_title: "Comptes liés"
209 - no_linked_accounts: "Aucun compte externe lié."
210 - linked_since: "Lié depuis"
211 - unlink_button: "Délier"
212 - unlink_confirm: "Êtes-vous sûr de vouloir délier ce compte ?"
213 - unlink_error: "Impossible de délier ce compte."
214 - cannot_unlink_last: "Impossible de supprimer votre dernier moyen d'authentification."
215 -
216 -# Breadcrumb
217 -breadcrumb:
218 - home: "Accueil"
219 - settings: "Paramètres"
220 - admin: "Administration"
221 - preferences: "Préférences"
222 - profile: "Profil"
223 - password: "Mot de passe"
224 - users: "Utilisateurs"
225 - sessions: "Sessions"
226 -
227 -# Admin Settings
228 -admin:
229 - dashboard:
230 - title: "Administration"
231 - heading: "Tableau de bord Administrateur"
232 - users_card_title: "Utilisateurs"
233 - users_card_subtitle: "Total utilisateurs"
234 - access_button: "Accéder"
235 - sessions_card_title: "Sessions actives"
236 - sessions_card_subtitle: "Sessions en cours"
237 - admins_card_title: "Administrateurs"
238 - admins_card_subtitle: "Comptes admin"
239 - last_activity_card_title: "Dernière activité"
240 - last_activity_card_subtitle: "Dernière connexion"
241 - audit_section_title: "Statistiques des logs d'audit"
242 - audit_total_logs: "Total des logs"
243 - audit_last_24h: "Dernières 24h"
244 - audit_by_level: "Par niveau"
245 - chart_label: "Logs par niveau"
246 - roles_card_title: "Gestion des Rôles"
247 - roles_card_desc: "Gérer les rôles et les permissions granulaires"
248 - roles_stat_title: "Rôles"
249 - settings_card_title: "Paramètres Application"
250 - settings_card_desc: "Configurer les paramètres globaux de l'application"
251 - apps_card_title: "Gestion des Applications"
252 - apps_card_desc: "Activer ou désactiver les applications modulaires"
253 - orgs_card_title: "Gestion des Organisations"
254 - orgs_card_desc: "Créer et gérer les organisations et leurs membres"
255 - orgs_stat_title: "Organisations"
256 - orgs_members_stat_title: "Membres totaux"
257 - roles_list:
258 - page_title: "Gestion des rôles"
259 - breadcrumb_roles: "Rôles"
260 - title: "Rôles"
261 - create_role: "Créer un rôle"
262 - table_name: "Nom"
263 - table_description: "Description"
264 - table_users: "Utilisateurs"
265 - table_permissions: "Permissions"
266 - table_actions: "Actions"
267 - edit: "Modifier"
268 - delete: "Supprimer"
269 - no_roles: "Aucun rôle trouvé."
270 - protected_hint: "Protégé"
271 - delete_confirm_title: "Confirmer la suppression"
272 - delete_confirm_message: "Êtes-vous sûr de vouloir supprimer le rôle"
273 - delete_button: "Supprimer"
274 - role_form:
275 - title_create: "Créer un rôle"
276 - title_edit: "Modifier le rôle"
277 - breadcrumb_create: "Créer"
278 - breadcrumb_edit: "Modifier"
279 - back_to_list: "Retour à la liste"
280 - name_label: "Nom du rôle"
281 - name_placeholder: "ex: moderator"
282 - description_label: "Description"
283 - description_placeholder: "Description du rôle..."
284 - permissions_label: "Permissions"
285 - protected_name_hint: "Le nom de ce rôle ne peut pas être modifié."
286 - cancel: "Annuler"
287 - submit_create: "Créer le rôle"
288 - submit_edit: "Enregistrer les modifications"
289 - errors:
290 - title: "Codes d'Erreur"
291 - description: "Documentation des codes d'erreur de l'application. Chaque code d'erreur est associé à un middleware et fournit des informations de contexte pour le débogage."
292 - breadcrumb_errors: "Codes d'Erreur"
293 - table_code: "Code"
294 - table_description: "Description"
295 - table_category: "Catégorie"
296 - table_middleware: "Middleware"
297 - table_context: "Contexte"
298 - table_example: "Exemple"
299 - legend_title: "Légende"
300 - legend_code: "Identifiant unique de l'erreur (format: CATEGORY_NUMBER)"
301 - legend_description: "Description en français de l'erreur"
302 - legend_category: "Type d'erreur (Authentification, CSRF, Rate Limiting, etc.)"
303 - legend_middleware: "Middleware responsable de générer cette erreur"
304 - legend_context: "Explication détaillée de quand cette erreur se produit"
305 - legend_example: "Exemple concret de situation générant cette erreur"
306 - error_auth001_desc: "Identifiants invalides"
307 - error_auth001_category: "Authentification"
308 - error_auth001_context: "L'utilisateur a fourni des identifiants incorrects lors de la connexion"
309 - error_auth001_example: "Tentative de connexion avec un mot de passe incorrect"
310 - error_auth002_desc: "Token invalide"
311 - error_auth002_category: "Authentification"
312 - error_auth002_context: "Le token JWT fourni est invalide ou malformé"
313 - error_auth002_example: "Token JWT corrompu ou signé avec une clé différente"
314 - error_auth003_desc: "Token expiré"
315 - error_auth003_category: "Authentification"
316 - error_auth003_context: "Le token JWT a expiré et doit être renouvelé"
317 - error_auth003_example: "Tentative d'accès avec un token expiré après la durée de validité"
318 - error_csrf001_desc: "Token CSRF manquant"
319 - error_csrf001_category: "CSRF Protection"
320 - error_csrf001_context: "La requête POST/PUT/DELETE ne contient pas de token CSRF"
321 - error_csrf001_example: "Formulaire soumis sans token CSRF dans le header ou le body"
322 - error_csrf002_desc: "Token CSRF invalide"
323 - error_csrf002_category: "CSRF Protection"
324 - error_csrf002_context: "Le token CSRF fourni ne correspond pas au token de la session"
325 - error_csrf002_example: "Token CSRF modifié ou volé"
326 - error_rate001_desc: "Limite de taux dépassée"
327 - error_rate001_category: "Rate Limiting"
328 - error_rate001_context: "Le nombre de requêtes par minute a été dépassé"
329 - error_rate001_example: "Plus de 100 requêtes/min sur les endpoints admin"
330 - error_valid001_desc: "Données d'entrée invalides"
331 - error_valid001_category: "Validation"
332 - error_valid001_context: "Les données fournies ne respectent pas les règles de validation"
333 - error_valid001_example: "Email au format invalide ou champ requis manquant"
334 - error_valid002_desc: "Complexité du mot de passe non respectée"
335 - error_valid002_category: "Validation"
336 - error_valid002_context: "Le mot de passe ne respecte pas les règles de complexité configurées"
337 - error_valid002_example: "Mot de passe trop court ou ne contenant pas les caractères requis"
338 - error_rbac001_desc: "Permissions insuffisantes"
339 - error_rbac001_category: "Autorisation"
340 - error_rbac001_context: "L'utilisateur n'a pas les permissions nécessaires pour cette action"
341 - error_rbac001_example: "Utilisateur non-admin tentant d'accéder à /admin/users"
342 - error_rbac002_desc: "Rôle administrateur requis"
343 - error_rbac002_category: "Autorisation"
344 - error_rbac002_context: "L'action nécessite le rôle administrateur"
345 - error_rbac002_example: "Tentative de suppression d'utilisateur sans rôle admin"
346 - error_db001_desc: "Erreur d'opération de base de données"
347 - error_db001_category: "Base de données"
348 - error_db001_context: "Une opération de base de données a échoué"
349 - error_db001_example: "Contrainte de clé étrangère violée ou connexion DB perdue"
350 - error_db002_desc: "Ressource non trouvée"
351 - error_db002_category: "Base de données"
352 - error_db002_context: "La ressource demandée n'existe pas dans la base de données"
353 - error_db002_example: "Utilisateur avec ID inexistant"
354 - user_form:
355 - breadcrumb_create: "Créer"
356 - breadcrumb_edit: "Modifier"
357 - title_create: "Créer un utilisateur"
358 - title_edit: "Modifier un utilisateur"
359 - back_to_list: "Retour à la liste"
360 - username_label: "Nom d'utilisateur"
361 - username_placeholder: "nom_utilisateur"
362 - username_readonly_hint: "Le nom d'utilisateur ne peut pas être modifié après création"
363 - email_label: "Email"
364 - email_placeholder: "utilisateur@example.com"
365 - password_label: "Mot de passe"
366 - password_optional: "Optionnel"
367 - password_placeholder: "Laisser vide pour générer un mot de passe aléatoire"
368 - password_hint: "Si laissé vide, un mot de passe sécurisé sera généré automatiquement"
369 - roles_label: "Rôles"
370 - roles_hint: "Sélectionnez au moins un rôle"
371 - must_change_password_label: "Forcer le changement de mot de passe"
372 - must_change_password_desc: "L'utilisateur devra changer son mot de passe à la prochaine connexion"
373 - cancel: "Annuler"
374 - submit_create: "Créer l'utilisateur"
375 - submit_edit: "Enregistrer les modifications"
376 - settings:
377 - title: "Paramètres de l'Application"
378 - page_title: "Paramètres de l'Application - Admin - RustCloud"
379 - subtitle: "Configuration globale de RustCloud"
380 - general: "Général"
381 - app_name: "Nom de l'application"
382 - app_domain: "Domaine"
383 - app_domain_placeholder: "example.com"
384 - app_description: "Description"
385 - allow_registration: "Permettre l'enregistrement"
386 - allow_registration_desc: "Les utilisateurs peuvent créer des comptes depuis la page d'accueil"
387 - email_validation_required: "Validation email requise"
388 - email_validation_required_desc: "Les utilisateurs doivent valider leur email avant de pouvoir se connecter"
389 - save: "Enregistrer les paramètres"
390 - cancel: "Annuler"
391 - saved: "Paramètres enregistrés avec succès"
392 - error: "Erreur lors de l'enregistrement"
393 - network_error: "Erreur réseau. Veuillez réessayer."
394 - password_security: "Sécurité des Mots de Passe"
395 - password_min_length: "Longueur minimale"
396 - password_min_length_hint: "Entre 6 et 128 caractères"
397 - password_complexity: "Exigences de complexité"
398 - require_uppercase: "Majuscule requise"
399 - require_lowercase: "Minuscule requise"
400 - require_digits: "Chiffre requis"
401 - require_special: "Caractère spécial requis"
402 - password_change_require_email: "Confirmation par email du changement de mot de passe"
403 - password_change_require_email_desc: "Lorsqu'activé, un email de confirmation est envoyé pour valider tout changement de mot de passe. Sinon, le changement est appliqué immédiatement."
404 - password_expiration: "Expiration des mots de passe"
405 - password_expiration_desc: "Forcer le changement périodique"
406 - expiration_days: "Expiration après (jours)"
407 - expiration_alert: "Alerte email avant expiration"
408 - expiration_alert_days: "Alerte (jours avant)"
409 - audit_logging: "Journalisation des Audits"
410 - log_level: "Niveau de log"
411 - log_level_debug: "DEBUG - Tous les détails"
412 - log_level_info: "INFO - Informations normales"
413 - log_level_warn: "WARN - Avertissements uniquement"
414 - log_level_error: "ERROR - Erreurs uniquement"
415 - log_level_hint: "Contrôle la verbosité des logs d'audit"
416 - log_retention: "Rétention des logs (jours)"
417 - log_retention_hint: "Durée de conservation des logs (1-365 jours)"
418 - audit_info_message: "Les logs d'audit enregistrent toutes les actions administratives (création, modification, suppression d'utilisateurs)."
419 - save_changes: "Sauvegarder les modifications"
420 - save_changes_desc: "Les paramètres seront appliqués immédiatement"
421 - saving: "Enregistrement..."
422 - save_success: "Paramètres enregistrés avec succès !"
423 - save_error_prefix: "Erreur"
424 - # OAuth / SSO admin settings
425 - oauth_sso_title: "OAuth / SSO"
426 - oauth_enabled_label: "Activer OAuth"
427 - oauth_enabled_desc: "Autorise la connexion via des fournisseurs externes (Google, GitHub, etc.)"
428 - oauth_redirect_url_label: "URL de redirection de base"
429 - oauth_redirect_url_desc: "URL de base pour les callbacks OAuth (ex: https://monapp.example.com)"
430 - oauth_auto_register_label: "Auto-inscription"
431 - oauth_auto_register_desc: "Créer automatiquement un compte si l'email n'existe pas"
432 - oauth_link_existing_label: "Lier les comptes existants"
433 - oauth_link_existing_desc: "Lier automatiquement un compte OAuth si l'email vérifié correspond"
434 - oauth_client_id: "Client ID"
435 - oauth_client_secret: "Client Secret"
436 - oauth_tenant: "Tenant ID"
437 - oauth_redirect_uri: "URI de redirection"
438 - oauth_copy_uri: "Copier"
439 - oauth_secret_configured: "Configuré"
440 - oauth_secret_not_configured: "Non configuré"
441 - oauth_secret_change: "Modifier"
442 - oauth_restart_warning: "Les modifications de credentials nécessitent un redémarrage de l'application."
443 - oauth_env_info: "Les credentials peuvent aussi être configurées via variables d'environnement (OAUTH_*_CLIENT_ID, etc.)."
444 - oauth_google_label: "Google"
445 - oauth_google_desc: "OpenID Connect"
446 - oauth_github_label: "GitHub"
447 - oauth_github_desc: "OAuth2"
448 - oauth_discord_label: "Discord"
449 - oauth_discord_desc: "OAuth2"
450 - oauth_microsoft_label: "Microsoft"
451 - oauth_microsoft_desc: "OpenID Connect"
452 - users_list:
453 - page_title: "Gestion des Utilisateurs - Admin - RustCloud"
454 - title: "Gestion des Utilisateurs"
455 - breadcrumb_users: "Utilisateurs"
456 - create_user: "Créer un utilisateur"
457 - search_label: "Rechercher"
458 - search_placeholder: "Nom d'utilisateur ou email..."
459 - role_filter_label: "Rôle"
460 - all_roles: "Tous les rôles"
461 - per_page_label: "Par page"
462 - search_button: "Rechercher"
463 - results_summary: "Affichage de {count} utilisateur(s) sur {total} total"
464 - page_info: "Page {page} sur {total_pages}"
465 - table_username: "Nom d'utilisateur"
466 - table_email: "Email"
467 - table_roles: "Rôles"
468 - table_created_at: "Créé le"
469 - table_last_login: "Dernière connexion"
470 - table_actions: "Actions"
471 - never: "Jamais"
472 - edit: "Modifier"
473 - delete: "Supprimer"
474 - reset_password: "Réinitialiser le mot de passe"
475 - no_users: "Aucun utilisateur trouvé"
476 - reset_password_title: "Réinitialiser le mot de passe"
477 - reset_generate: "Générer un mot de passe aléatoire"
478 - reset_custom: "Définir un mot de passe personnalisé"
479 - reset_email: "Réinitialiser par email"
480 - reset_new_password_label: "Nouveau mot de passe"
481 - reset_new_password_placeholder: "Minimum 8 caractères, majuscule, minuscule, chiffre, caractère spécial"
482 - reset_password_requirements: "⚠️ Doit contenir : 8+ caractères, majuscule, minuscule, chiffre, caractère spécial"
483 - reset_invalidate_sessions: "Invalider toutes les sessions actives de cet utilisateur"
484 - reset_invalidate_sessions_desc: "L'utilisateur devra se reconnecter après le changement"
485 - reset_button: "Réinitialiser"
486 - delete_confirm_title: "⚠️ Confirmer la suppression"
487 - delete_confirm_message: "Êtes-vous sûr de vouloir supprimer cet utilisateur ?"
488 - delete_confirm_username: "Nom d'utilisateur :"
489 - delete_confirm_email: "Email :"
490 - delete_irreversible: "Cette action est irréversible !"
491 - delete_button: "Supprimer définitivement"
492 - edit_user_title: "Modifier l'utilisateur"
493 - delete_error: "Erreur lors de la suppression de l'utilisateur"
494 - network_error: "Erreur réseau"
495 - resetting: "Réinitialisation..."
496 - reset_by_email_title: "Réinitialisation par email"
497 - close: "Fermer"
498 - password_reset_success_title: "Mot de passe réinitialisé"
499 - password_warning_once: "Ce mot de passe ne sera affiché qu'une seule fois. Copiez-le maintenant !"
500 - new_password_label: "Nouveau mot de passe"
501 - copy: "Copier"
502 - password_copied: "Mot de passe copié dans le presse-papiers"
503 - password_set_success: "Mot de passe réinitialisé avec succès"
504 - reset_error: "Erreur lors de la réinitialisation du mot de passe"
505 -
506 -# Password Change
507 -password:
508 - title: "Changer mon mot de passe"
509 - page_title: "Changer mon mot de passe - RustCloud"
510 - subtitle: "Modifiez votre mot de passe pour sécuriser votre compte. Un email de confirmation vous sera envoyé pour valider le changement."
511 - subtitle_no_email: "Modifiez votre mot de passe pour sécuriser votre compte."
512 - must_change_message: "⚠️ Vous devez changer votre mot de passe avant de continuer."
513 - new_password: "Nouveau mot de passe"
514 - current_password: "Mot de passe actuel"
515 - current_password_placeholder: "Votre mot de passe actuel"
516 - new_password_placeholder: "Nouveau mot de passe sécurisé"
517 - required: "Requis"
518 - requirements: "📌 Respectez les exigences de complexité indiquées ci-dessous."
519 - strength: "Force du mot de passe :"
520 - strength_weak: "Faible"
521 - strength_medium: "Moyen"
522 - strength_strong: "Fort ✓"
523 - strength_too_short: "trop court"
524 - strength_missing_lowercase: "minuscule manquante"
525 - strength_missing_uppercase: "majuscule manquante"
526 - strength_missing_digit: "chiffre manquant"
527 - strength_missing_special: "caractère spécial manquant"
528 - confirm_password: "Confirmer le nouveau mot de passe"
529 - confirm_password_placeholder: "Répétez le nouveau mot de passe"
530 - passwords_match: "✓ Les mots de passe correspondent"
531 - passwords_not_match: "✗ Les mots de passe ne correspondent pas"
532 - change_button: "Changer le mot de passe"
533 - changing: "Changement en cours..."
534 - logout_warning_title: "Déconnexion des autres sessions"
535 - logout_warning_desc: "Toutes vos autres sessions actives seront automatiquement déconnectées après le changement de mot de passe. Seule votre session actuelle restera active."
536 - save: "Enregistrer le nouveau mot de passe"
537 - saving: "Enregistrement..."
538 - saved: "Un email de confirmation a été envoyé à votre adresse. Cliquez sur le lien dans l'email pour valider le changement de mot de passe."
539 - saved_direct: "Mot de passe changé avec succès ! Vos autres sessions ont été déconnectées."
540 - error: "Erreur lors de la modification du mot de passe"
541 - error_all_fields_required: "Tous les champs sont requis."
542 - error_empty_data: "Les données à envoyer sont vides."
543 - error_invalid_data: "Données invalides. Vérifiez que tous les champs sont remplis."
544 - error_incorrect_current: "Mot de passe actuel incorrect."
545 - error_reading_response: "Erreur lors de la lecture de la réponse du serveur"
546 - error_415: "Erreur 415 : Le serveur n'a pas reçu les données au format JSON attendu. Veuillez réessayer."
547 - network_error: "Erreur réseau. Veuillez réessayer."
548 - security_tips_title: "Conseils de sécurité"
549 - security_tip_unique: "Utilisez un mot de passe unique que vous n'utilisez pas ailleurs"
550 - security_tip_share: "Ne partagez jamais votre mot de passe avec qui que ce soit"
551 - security_tip_regular: "Changez votre mot de passe régulièrement (tous les 3-6 mois)"
552 - security_tip_2fa: "Activez l'authentification à deux facteurs si disponible"
553 - security_tip_manager: "Utilisez un gestionnaire de mots de passe pour plus de sécurité"
554 - pending_request_message: "⚠️ Une demande de changement de mot de passe est en attente de confirmation par email."
555 - pending_request_info: "Un email de confirmation a été envoyé à votre adresse. Cliquez sur le lien dans l'email pour confirmer le changement."
556 - pending_request_cancel: "Annuler la demande en attente"
557 - pending_request_canceled: "Demande annulée avec succès"
558 - pending_request_cancel_error: "Erreur lors de l'annulation de la demande"
559 - confirmation_sent: "Email de confirmation envoyé ! Vérifiez votre boîte de réception."
560 - confirmation_error: "Erreur lors de l'envoi de l'email de confirmation"
561 -
562 -# Password Change Confirmation Email
563 -password_change_confirmation:
564 - subject: "Confirmation de changement de mot de passe"
565 - greeting: "Bonjour {username}"
566 - message: "Vous avez demandé à changer votre mot de passe pour votre compte {app_name}. Pour confirmer ce changement, cliquez sur le lien ci-dessous."
567 - button_text: "Confirmer le changement de mot de passe"
568 - expires_message: "Ce lien est valide pendant {hours} heures et est à usage unique."
569 - footer: "Cet email a été envoyé automatiquement, merci de ne pas y répondre."
570 -
571 -# Sessions
572 -sessions:
573 - title: "Sessions actives"
574 - page_title: "Sessions actives - RustCloud"
575 - subtitle: "Gérez les appareils connectés à votre compte"
576 - current_session: "Session actuelle"
577 - current_badge: "Actuelle"
578 - unknown_device: "Appareil inconnu"
579 - ip_address: "Adresse IP :"
580 - created_at: "Créée le :"
581 - last_activity: "Dernière activité :"
582 - session_id: "ID Session :"
583 - revoke: "Révoquer"
584 - revoke_confirm: "Êtes-vous sûr de vouloir révoquer la session pour \"{device}\" ?\n\nCet appareil sera déconnecté immédiatement."
585 - revoke_success: "Session révoquée avec succès !"
586 - revoke_error: "Erreur lors de la révocation de la session"
587 - no_sessions: "Aucune session active"
588 - no_sessions_desc: "Vous n'avez actuellement aucune session active"
589 - danger_zone: "Zone de danger"
590 - danger_zone_desc: "Déconnectez tous les autres appareils en une seule action (votre session actuelle restera active)."
591 - revoke_all: "Révoquer toutes les autres sessions"
592 - revoke_all_confirm: "⚠️ ATTENTION\n\nÊtes-vous sûr de vouloir révoquer TOUTES vos autres sessions ?\n\nTous vos autres appareils seront déconnectés. Seule votre session actuelle restera active."
593 - revoke_all_success: "Toutes les autres sessions ont été révoquées !"
594 - revoke_all_error: "Erreur lors de la révocation. Certaines sessions n'ont peut-être pas été révoquées."
595 - about_title: "À propos des sessions"
596 - about_desc: "Une session est créée à chaque connexion depuis un appareil ou navigateur différent. Révoquer une session déconnecte immédiatement cet appareil. Votre session actuelle ne peut pas être révoquée depuis cette page (déconnectez-vous pour cela)."
597 - back_to_settings: "Retour aux paramètres"
598 -
599 -# Navigation menu (navbar)
600 -nav:
601 - home: "Accueil"
602 - settings: "Paramètres"
603 - admin: "Administration"
604 -
605 -# User menu
606 -user_menu:
607 - profile: "Profil"
608 - logout: "Déconnexion"
609 - settings: "Paramètres"
610 -
611 -# Organisations
612 -organisations:
613 - list:
614 - title: "Gestion des Organisations"
615 - create: "Créer une organisation"
616 - search: "Rechercher"
617 - search_placeholder: "Nom ou description..."
618 - no_organisations: "Aucune organisation trouvée"
619 - results_summary: "Résultats"
620 - manage_members: "Gérer les membres"
621 - table:
622 - name: "Nom"
623 - description: "Description"
624 - members: "Membres"
625 - created_at: "Créée le"
626 - actions: "Actions"
627 - create:
628 - title: "Créer une organisation"
629 - submit: "Créer"
630 - success: "Organisation créée avec succès"
631 - error:
632 - already_exists: "L'organisation '{gid}' existe déjà"
633 - invalid_gid: "Format de gid invalide: {gid}"
634 - generic: "Une erreur est survenue lors de la création de l'organisation"
635 - edit:
636 - title: "Modifier l'organisation"
637 - submit: "Enregistrer"
638 - update:
639 - success: "Organisation mise à jour avec succès"
640 - delete:
641 - success: "Organisation supprimée avec succès"
642 - confirm: "Êtes-vous sûr de vouloir supprimer cette organisation ? Cette action est irréversible."
643 - form:
644 - name_label: "Nom"
645 - name_placeholder: "Nom de l'organisation"
646 - description_label: "Description"
647 - description_placeholder: "Description de l'organisation (optionnel)"
648 - gid_label: "Identifiant (GID)"
649 - gid_placeholder: "identifiant-unique"
650 - gid_help: "Identifiant unique (lettres, chiffres, underscores uniquement, max 64 caractères)"
651 - members:
652 - title: "Membres de l'organisation"
653 - add_member: "Ajouter un membre"
654 - search_user_label: "Rechercher un utilisateur"
655 - search_user_placeholder: "Nom d'utilisateur ou email..."
656 - no_members: "Aucun membre dans cette organisation"
657 - back_to_list: "Retour à la liste"
658 - table:
659 - username: "Nom d'utilisateur"
660 - role: "Rôle"
661 - joined_at: "Rejoint le"
662 - actions: "Actions"
663 - add_success: "Membre ajouté avec succès"
664 - remove_success: "Membre retiré avec succès"
665 - add_error: "Erreur lors de l'ajout du membre"
666 - remove_error: "Erreur lors du retrait du membre"
667 - user_not_found: "Utilisateur '{search}' non trouvé"
668 - error:
669 - organisation_not_found: "Organisation '{gid}' non trouvée"
670 - already_member: "Cet utilisateur est déjà membre de l'organisation"
671 -
672 -# Sharing
673 -sharing:
674 - modal:
675 - title: "Partager une ressource"
676 - resource_label: "Ressource"
677 - resource_type_label: "Type"
678 - expiration_label: "Date d'expiration (optionnel)"
679 - expiration_help: "Le partage expirera automatiquement à cette date"
680 - cancel_button: "Annuler"
681 - submit_button: "Partager"
682 - close_button: "Fermer"
683 - success_message: "Partage créé avec succès"
684 - error_message: "Erreur lors de la création du partage"
685 - error:
686 - already_exists: "Ce partage existe déjà pour cette ressource et cette organisation"
687 - components:
688 - share_button_label: "Partager"
689 - permissions_label: "Permissions"
690 - permissions_help: "Choisissez les permissions accordées pour ce partage"
691 - share_with_label: "Partager avec"
692 - user_tab_label: "Utilisateur"
693 - organisation_tab_label: "Organisation"
694 - select_user_label: "Sélectionner un utilisateur"
695 - search_user_placeholder: "Rechercher un utilisateur..."
696 - select_organisation_label: "Sélectionner une organisation"
697 - select_organisation_placeholder: "Choisir une organisation..."
698 - no_organisations_message: "Aucune organisation disponible"
699 - permissions:
700 - read_only: "Lecture seule"
701 - read_only_value: "1"
702 - read_only_description: "Peut uniquement consulter la ressource"
703 - read_write: "Lecture + Écriture"
704 - read_write_value: "3"
705 - read_write_description: "Peut consulter et modifier la ressource"
706 - all: "Toutes les permissions"
707 - all_value: "15"
708 - all_description: "Peut consulter, modifier, supprimer et partager"
709 -
710 -# Email verification messages
711 -email_verify:
712 - config_error: "Erreur de configuration du serveur. Veuillez contacter l'administrateur."
713 - success: "Votre adresse email a été vérifiée avec succès. Vous pouvez maintenant vous connecter à votre compte."
714 - invalid_link: "Le lien de vérification est invalide ou a expiré."
715 -
716 -# Email subjects
717 -email_subject:
718 - password_reset: "Réinitialisation de votre mot de passe"
719 - email_validation: "Vérification de votre adresse email"
720 - welcome: "Bienvenue sur RustWarden !"
721 -
722 -# Rate limiting
723 -rate_limit:
724 - exceeded: "Trop de requêtes. Veuillez réessayer plus tard."
725 - password_change: "Trop de demandes de changement de mot de passe. Veuillez patienter avant de réessayer."
726 -
727 -# OAuth
728 -oauth:
729 - divider: "ou"
730 - login_with: "Se connecter avec {provider}"
731 - error_denied: "Connexion refusée par le fournisseur."
732 - error_generic: "Erreur lors de la connexion OAuth."
733 -
734 -# Sessions
735 -session:
736 - ip_unavailable: "Non disponible"
737 -
M tools/rustwarden-cli/src/start_project.rs
+2 -2
@@ -510,9 +510,9 @@ fn copy_resources(
510 510 with_ui: bool,
511 511 ) -> Result<(), Box<dyn std::error::Error>> {
512 512 let dirs_to_copy: Vec<&str> = if with_ui {
513 - vec!["locales", "static", "database"]
513 + vec!["static", "database"]
514 514 } else {
515 - vec!["locales", "database"]
515 + vec!["database"]
516 516 };
517 517
518 518 for dir_name in dirs_to_copy {
M tools/rustwarden-cli/src/update_project.rs
+3 -59
@@ -8,9 +8,6 @@ use crate::version;
8 8
9 9 /// Fichiers et dossiers du framework qui sont remplaces lors de la mise a jour.
10 10 const FRAMEWORK_CRATES: &[&str] = &["rustwarden-core", "rustwarden-ui"];
11 -/// Ressources partagees mises a jour. Le dossier database/ est exclu car il
12 -/// contient les volumes Docker et le .env avec les credentials du projet.
13 -const FRAMEWORK_RESOURCES: &[&str] = &["locales", "static"];
14 11
15 12 /// Fichiers du projet consommateur qu'on ne touche JAMAIS.
16 13 const PROTECTED_FILES: &[&str] = &[
@@ -58,14 +55,11 @@ pub fn run() -> Result<(), Box<dyn std::error::Error>> {
58 55 }
59 56
60 57 // --- Backup ---
61 - let backup_dir = create_backup(&project_dir, has_ui)?;
58 + let backup_dir = create_backup(&project_dir)?;
62 59
63 60 // --- Mise a jour des crates ---
64 61 let stats = update_crates(&rustwarden_root, &project_dir, has_ui, &custom_templates)?;
65 62
66 - // --- Mise a jour des ressources ---
67 - update_resources(&rustwarden_root, &project_dir, has_ui)?;
68 -
69 63 // --- Reecrire le fichier de version ---
70 64 version::write_version(&project_dir, &new_version)?;
71 65
@@ -223,12 +217,6 @@ fn print_update_plan(project_dir: &Path, has_ui: bool, custom_templates: &[Strin
223 217 if has_ui {
224 218 println!(" - crates/rustwarden-ui/");
225 219 }
226 - for res in FRAMEWORK_RESOURCES {
227 - let p = project_dir.join(res);
228 - if p.exists() || (has_ui || *res != "static") {
229 - println!(" - {res}/");
230 - }
231 - }
232 220
233 221 println!(
234 222 "\n {} :",
@@ -368,8 +356,8 @@ fn print_summary(
368 356 // Backup
369 357 // ---------------------------------------------------------------------------
370 358
371 -/// Cree un backup des crates et ressources du framework dans le projet.
372 -fn create_backup(project_dir: &Path, has_ui: bool) -> Result<PathBuf, Box<dyn std::error::Error>> {
359 +/// Cree un backup des crates du framework dans le projet.
360 +fn create_backup(project_dir: &Path) -> Result<PathBuf, Box<dyn std::error::Error>> {
373 361 let timestamp = chrono::Local::now().format("%Y%m%d_%H%M%S");
374 362 let backup_dir = project_dir.join(format!(".rustwarden-backup-{timestamp}"));
375 363 fs::create_dir_all(&backup_dir)?;
@@ -389,15 +377,6 @@ fn create_backup(project_dir: &Path, has_ui: bool) -> Result<PathBuf, Box<dyn st
389 377 }
390 378 }
391 379
392 - for res in FRAMEWORK_RESOURCES {
393 - let src = project_dir.join(res);
394 - if src.exists() && (has_ui || *res != "static") {
395 - let dst = backup_dir.join(res);
396 - copy_dir_recursive(&src, &dst)?;
397 - println!(" {} {res}/", style("→").dim(),);
398 - }
399 - }
400 -
401 380 Ok(backup_dir)
402 381 }
403 382
@@ -608,41 +587,6 @@ fn is_custom_template(file_path: &Path, crate_name: &str, custom_templates: &[St
608 587 custom_templates.iter().any(|t| t == relative)
609 588 }
610 589
611 -/// Met a jour les ressources partagees (locales, static).
612 -fn update_resources(
613 - rustwarden_root: &Path,
614 - project_dir: &Path,
615 - has_ui: bool,
616 -) -> Result<(), Box<dyn std::error::Error>> {
617 - println!(
618 - "\n{}",
619 - style("── Mise a jour des ressources ──").cyan().bold()
620 - );
621 -
622 - for res in FRAMEWORK_RESOURCES {
623 - // Ne pas copier static/ si le projet n'a pas d'UI
624 - if *res == "static" && !has_ui {
625 - continue;
626 - }
627 -
628 - let src = rustwarden_root.join(res);
629 - let dst = project_dir.join(res);
630 -
631 - if !src.exists() {
632 - continue;
633 - }
634 -
635 - if dst.exists() {
636 - fs::remove_dir_all(&dst)?;
637 - }
638 - copy_dir_recursive(&src, &dst)?;
639 -
640 - println!(" {} {res}/", style("✓").green().bold(),);
641 - }
642 -
643 - Ok(())
644 -}
645 -
646 590 // ---------------------------------------------------------------------------
647 591 // Decouverte du workspace Rustwarden
648 592 // ---------------------------------------------------------------------------