import os import json import logging import gradio as gr logger = logging.getLogger("app.translation") def get_translation(text, target_lang, cache): if target_lang.lower() in ["en", "english"]: return text if target_lang not in cache: cache[target_lang] = {} if text in cache[target_lang]: return cache[target_lang][text] try: from deep_translator import GoogleTranslator # Reverse map if needed, but localize_init passes the full name "German" # We need to robustly map "German" -> "de" or just use the code # Actually localize_init sets `lang = code_map.get(lang_code, "English")` # So we are passing "German". Deep Translator needs "de". # Let's add a robust mapper inside get_translation or strict code usage # Simple mapper for standard languages lang_map = { "german": "de", "french": "fr", "spanish": "es", "italian": "it", "portuguese": "pt", "russian": "ru", "japanese": "ja", "chinese": "zh-CN", "english": "en" } target_iso = lang_map.get(target_lang.lower(), target_lang.lower()) translator = GoogleTranslator(source='auto', target=target_iso) trans = translator.translate(text) cache[target_lang][text] = trans return trans except Exception as e: logger.error(f"Translation error: {e}") return text def localize_init(lang_code="en"): # Map codes code_map = {"de": "German", "fr": "French", "es": "Spanish", "it": "Italian", "pt": "Portuguese", "ru": "Russian", "ja": "Japanese", "zh": "Chinese"} lang = code_map.get(lang_code, "English") cache_file = "translation_cache.json" cache = {} if os.path.exists(cache_file): try: with open(cache_file, "r") as f: cache = json.load(f) except: pass dirty = False def translate(text): nonlocal dirty t = get_translation(text, lang, cache) if t != text: dirty = True return t res = { "welcome": translate("Hello. I am Sage 6.5. I can consult the Oracle for your Name, a specific Topic, or a specific Date. How shall I assist you?"), "label_short": translate("Short Answers"), "placeholder": translate("Type your message..."), "lang": lang } if dirty: try: with open(cache_file, "w") as f: json.dump(cache, f, indent=2) except: pass return res