""" language_manager.py مدير اللغات في منصة Divid Teacher مسؤول عن: - تجهيز المنصة لدعم أكثر من لغة مستقبلًا - إبقاء الواجهة الحالية عربية - دعم خاص لمادة اللغة الإنجليزية - تجهيز ملفات لغة داخل مجلد system/languages """ import json from pathlib import Path from datetime import datetime try: from config import SYSTEM_FOLDER, DEFAULT_LANGUAGE except Exception: SYSTEM_FOLDER = "system" DEFAULT_LANGUAGE = "ar" class LanguageManager: def __init__(self): self.system_folder = Path(SYSTEM_FOLDER) self.languages_folder = self.system_folder / "languages" self.languages_folder.mkdir(parents=True, exist_ok=True) self.default_language = DEFAULT_LANGUAGE or "ar" self.ar_file = self.languages_folder / "ar.json" self.en_file = self.languages_folder / "en.json" self.config_file = self.languages_folder / "language_config.json" if not self.ar_file.exists(): self.save_language_file("ar", self.default_ar()) if not self.en_file.exists(): self.save_language_file("en", self.default_en()) if not self.config_file.exists(): self.save_config(self.default_config()) # ====================================================== # الوقت # ====================================================== def now(self): return datetime.utcnow().isoformat() # ====================================================== # الإعداد الافتراضي # ====================================================== def default_config(self): return { "version": "1.0.0", "updated_at": self.now(), "default_language": "ar", "supported_languages": [ { "code": "ar", "name": "العربية", "enabled": True, "direction": "rtl" }, { "code": "en", "name": "English", "enabled": True, "direction": "ltr" } ], "rules": { "ui_language": "ar", "english_subject_can_use_bilingual_support": True, "reduce_translation_gradually": True, "future_multilingual_ready": True } } def default_ar(self): return { "language": "ar", "direction": "rtl", "texts": { "project_title": "منصة Divid Teacher", "login": "الدخول", "student": "الطالب", "parent": "ولي الأمر", "admin": "الإدارة", "level_test": "فحص المستوى", "general_culture": "الثقافة العامة", "lesson": "الدرس", "reports": "التقارير", "system": "النظام", "start": "ابدأ", "continue": "متابعة", "submit": "إرسال", "answer_required": "يرجى الإجابة حتى نكمل.", "focus_question": "سؤال تركيز", "checkpoint_question": "سؤال تحقق قبل الانتقال", "good_job": "أحسنت", "try_again": "حاول مرة أخرى بهدوء", "break_time": "وقت الاستراحة", "back_to_lesson": "نعود إلى الدرس" } } def default_en(self): return { "language": "en", "direction": "ltr", "texts": { "project_title": "Divid Teacher Platform", "login": "Login", "student": "Student", "parent": "Parent", "admin": "Admin", "level_test": "Level Test", "general_culture": "General Culture", "lesson": "Lesson", "reports": "Reports", "system": "System", "start": "Start", "continue": "Continue", "submit": "Submit", "answer_required": "Please answer so we can continue.", "focus_question": "Focus Question", "checkpoint_question": "Checkpoint Question", "good_job": "Good job", "try_again": "Try again calmly", "break_time": "Break time", "back_to_lesson": "Back to the lesson" } } # ====================================================== # قراءة وحفظ JSON # ====================================================== def load_json(self, path, default=None): try: with open(path, "r", encoding="utf-8") as f: return json.load(f) except Exception: return default if default is not None else {} def save_json(self, path, data): data["updated_at"] = self.now() with open(path, "w", encoding="utf-8") as f: json.dump( data, f, ensure_ascii=False, indent=4 ) return True # ====================================================== # ملفات اللغة # ====================================================== def language_path(self, language_code): language_code = str(language_code or "ar").strip().lower() return self.languages_folder / f"{language_code}.json" def load_language_file(self, language_code="ar"): path = self.language_path(language_code) if not path.exists(): if language_code == "en": self.save_language_file("en", self.default_en()) else: self.save_language_file("ar", self.default_ar()) return self.load_json(path, {}) def save_language_file(self, language_code, data): path = self.language_path(language_code) return self.save_json(path, data) def load_config(self): return self.load_json( self.config_file, self.default_config() ) def save_config(self, config): return self.save_json( self.config_file, config ) # ====================================================== # النصوص # ====================================================== def get_text(self, key, language_code=None): if language_code is None: language_code = self.default_language data = self.load_language_file(language_code) texts = data.get("texts", {}) if key in texts: return texts[key] ar_data = self.load_language_file("ar") return ar_data.get("texts", {}).get(key, key) def set_text(self, key, value, language_code="ar"): data = self.load_language_file(language_code) data.setdefault("texts", {}) data["texts"][key] = value self.save_language_file(language_code, data) return True # ====================================================== # دعم مادة الإنجليزية # ====================================================== def subject_language_policy(self, subject, student=None): subject = str(subject or "").strip().lower() if "english" in subject or "انج" in subject or "إنج" in subject: return { "subject": "لغة إنجليزية", "primary_explanation_language": "en", "support_language": "ar", "bilingual_support": True, "translation_level": self.estimate_translation_level(student), "rule": "استخدم الإنجليزية تدريجيًا مع دعم عربي عند الحاجة." } return { "subject": subject, "primary_explanation_language": "ar", "support_language": "ar", "bilingual_support": False, "translation_level": "none", "rule": "استخدم العربية في الشرح." } def estimate_translation_level(self, student): if not student: return "medium" progress = student.get("progress", {}) english_score = progress.get("english", 0) try: english_score = float(english_score) except Exception: english_score = 0 if english_score < 40: return "high" if english_score < 70: return "medium" return "low" # ====================================================== # تعليمات للذكاء الاصطناعي # ====================================================== def build_language_instruction(self, subject, student=None): policy = self.subject_language_policy( subject=subject, student=student ) if policy["bilingual_support"]: return f""" سياسة اللغة لمادة الإنجليزية: - اللغة الأساسية للدرس: الإنجليزية. - لغة الدعم: العربية. - مستوى الترجمة: {policy.get("translation_level", "medium")}. - إذا كان الطالب ضعيفًا، اشرح المعنى بالعربية ثم أعد الجملة بالإنجليزية. - إذا تحسن الطالب، قلل الترجمة تدريجيًا. - لا تجعل الطالب يعتمد على الترجمة دائمًا. """.strip() return """ سياسة اللغة: - استخدم العربية في الشرح. - اجعل الجمل واضحة ومناسبة لعمر الطالب. """.strip() # ====================================================== # إدارة اللغات من الإدارة # ====================================================== def add_supported_language(self, code, name, direction="ltr", enabled=True): config = self.load_config() config.setdefault("supported_languages", []) code = str(code or "").strip().lower() if not code: return False found = False for lang in config["supported_languages"]: if lang.get("code") == code: lang["name"] = name lang["direction"] = direction lang["enabled"] = enabled found = True break if not found: config["supported_languages"].append({ "code": code, "name": name, "direction": direction, "enabled": enabled }) self.save_config(config) path = self.language_path(code) if not path.exists(): self.save_language_file(code, { "language": code, "direction": direction, "texts": {} }) return True def list_supported_languages(self): config = self.load_config() return config.get("supported_languages", []) # ====================================================== # ملخص # ====================================================== def summary(self): config = self.load_config() text = "# إعدادات اللغات\n\n" text += f"اللغة الافتراضية: {config.get('default_language', 'ar')}\n\n" text += "## اللغات المدعومة\n" for lang in config.get("supported_languages", []): text += f""" - {lang.get("name", "")} - الرمز: {lang.get("code", "")} - الاتجاه: {lang.get("direction", "")} - مفعلة: {lang.get("enabled", True)} """ return text.strip()