Spaces:
Running on Zero
Running on Zero
| """ | |
| 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() |