rush_sync_server/commands/lang/
manager.rs

1// commands/lang/manager.rs - MIT FEHLENDER METHODE
2
3use super::persistence::LanguagePersistence;
4use crate::core::prelude::*;
5use crate::i18n::{
6    get_available_languages, get_command_translation, get_current_language, set_language,
7};
8
9/// Zentrale Verwaltung aller Language-Operationen
10pub struct LanguageManager;
11
12impl LanguageManager {
13    /// Zeigt aktuellen Status und verfügbare Sprachen
14    pub fn show_status() -> String {
15        let current_lang = get_current_language();
16        let available_langs = get_available_languages().join(", ");
17
18        let current = get_command_translation("system.commands.language.current", &[&current_lang]);
19        let available =
20            get_command_translation("system.commands.language.available", &[&available_langs]);
21
22        format!("{}\n{}", current, available)
23    }
24
25    /// Ändert die Sprache komplett (i18n + Config + Persistence)
26    pub async fn change_language(lang: &str) -> Result<String> {
27        // ✅ 1. VALIDIERUNG + i18n setzen
28        match set_language(lang) {
29            Ok(()) => {
30                // ✅ 2. CONFIG PERSISTIEREN
31                if let Err(e) = LanguagePersistence::save_to_config(lang).await {
32                    log::error!("Failed to save language config: {}", e);
33                    // Trotzdem Success, da i18n gesetzt wurde
34                }
35
36                // ✅ 3. SUCCESS MESSAGE (in neuer Sprache!)
37                Ok(Self::create_save_message(
38                    lang,
39                    &get_command_translation(
40                        "system.commands.language.changed",
41                        &[&lang.to_uppercase()],
42                    ),
43                ))
44            }
45            Err(e) => {
46                // ✅ 4. ERROR MESSAGE
47                Ok(get_command_translation(
48                    "system.commands.language.invalid",
49                    &[&e.to_string()],
50                ))
51            }
52        }
53    }
54
55    /// Verarbeitet __SAVE_LANGUAGE__ Messages von screen.rs
56    pub async fn process_save_message(message: &str) -> Option<String> {
57        if !message.starts_with("__SAVE_LANGUAGE__") {
58            return None;
59        }
60
61        let parts: Vec<&str> = message.split("__MESSAGE__").collect();
62        if parts.len() != 2 {
63            return None;
64        }
65
66        let lang_part = parts[0].replace("__SAVE_LANGUAGE__", "");
67        let display_message = parts[1];
68
69        // ✅ CACHE wird automatisch in set_language geleert
70        if let Err(e) = crate::i18n::set_language(&lang_part) {
71            return Some(format!("Fehler beim Setzen der Sprache: {}", e));
72        }
73
74        // ✅ CONFIG SPEICHERN
75        if let Err(e) = LanguagePersistence::save_to_config(&lang_part).await {
76            log::error!("Failed to save language config: {}", e);
77        }
78
79        Some(display_message.to_string())
80    }
81
82    /// Erstellt das spezielle Save-Message Format für screen.rs
83    fn create_save_message(lang: &str, display_text: &str) -> String {
84        format!("__SAVE_LANGUAGE__{}__MESSAGE__{}", lang, display_text)
85    }
86
87    /// ✅ FEHLENDE METHODE: Erstellt Save Message Format (public für command.rs)
88    pub fn create_save_message_format(lang: &str, display_text: &str) -> String {
89        format!("__SAVE_LANGUAGE__{}__MESSAGE__{}", lang, display_text)
90    }
91
92    /// Direkter Language-Switch ohne Config-Save (für interne Nutzung)
93    pub fn switch_language_only(lang: &str) -> Result<()> {
94        set_language(lang)
95    }
96
97    /// Gibt verfügbare Sprachen zurück
98    pub fn get_available() -> Vec<String> {
99        get_available_languages()
100    }
101
102    /// Gibt aktuelle Sprache zurück
103    pub fn get_current() -> String {
104        get_current_language()
105    }
106}