divid_teacher / language_manager.py
Asem75's picture
Create language_manager.py
3c90321 verified
Raw
History Blame Contribute Delete
12.1 kB
"""
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()