Spaces:
Sleeping
Sleeping
""" | |
وحدة الترجمة المتكاملة | |
""" | |
import streamlit as st | |
import pandas as pd | |
import random | |
class TranslationApp: | |
""" | |
وحدة الترجمة المتكاملة للنظام | |
""" | |
def __init__(self): | |
""" | |
تهيئة وحدة الترجمة | |
""" | |
# تهيئة حالة الجلسة الخاصة بالترجمة إذا لم تكن موجودة | |
if 'translation_history' not in st.session_state: | |
# إنشاء بيانات تجريبية لسجل الترجمة | |
st.session_state.translation_history = self._generate_sample_history() | |
if 'translation_settings' not in st.session_state: | |
# إعدادات الترجمة الافتراضية | |
st.session_state.translation_settings = { | |
'default_source': 'ar', | |
'default_target': 'en', | |
'auto_translate': True, | |
'save_history': True, | |
'use_glossary': True | |
} | |
def run(self): | |
""" | |
تشغيل وحدة الترجمة | |
""" | |
st.markdown("<h2 class='module-title'>وحدة الترجمة المتكاملة</h2>", unsafe_allow_html=True) | |
# إنشاء تبويبات للترجمة المختلفة | |
tabs = st.tabs(["ترجمة النصوص", "ترجمة المستندات", "المصطلحات والقاموس", "الإعدادات"]) | |
with tabs[0]: | |
self._render_text_translation() | |
with tabs[1]: | |
self._render_document_translation() | |
with tabs[2]: | |
self._render_glossary() | |
with tabs[3]: | |
self._render_translation_settings() | |
def _render_text_translation(self): | |
""" | |
عرض واجهة ترجمة النصوص | |
""" | |
st.markdown("### ترجمة النصوص") | |
st.markdown("ترجمة النصوص بين اللغات المختلفة مع دعم المصطلحات التقنية") | |
# اختيار اللغات | |
col1, col2 = st.columns(2) | |
with col1: | |
source_lang = st.selectbox( | |
"اللغة المصدر", | |
options=["العربية", "الإنجليزية", "الفرنسية", "الإسبانية", "الألمانية"], | |
index=0, | |
key="source_lang" | |
) | |
with col2: | |
target_lang = st.selectbox( | |
"اللغة الهدف", | |
options=["الإنجليزية", "العربية", "الفرنسية", "الإسبانية", "الألمانية"], | |
index=0, | |
key="target_lang" | |
) | |
# زر تبديل اللغات | |
col1, col2, col3 = st.columns([1, 1, 4]) | |
with col2: | |
if st.button("تبديل اللغات", key="switch_langs"): | |
st.session_state.source_lang, st.session_state.target_lang = st.session_state.target_lang, st.session_state.source_lang | |
st.rerun() | |
# مربعات النص | |
source_text = st.text_area( | |
"النص المصدر", | |
height=150, | |
placeholder="أدخل النص المراد ترجمته هنا...", | |
key="source_text" | |
) | |
# زر الترجمة | |
if st.button("ترجمة", key="translate_btn"): | |
if source_text: | |
# محاكاة عملية الترجمة | |
translated_text = self._mock_translation(source_text, source_lang, target_lang) | |
# عرض النص المترجم | |
st.text_area( | |
"النص المترجم", | |
value=translated_text, | |
height=150, | |
key="translated_text" | |
) | |
# إضافة الترجمة إلى السجل | |
if st.session_state.translation_settings['save_history']: | |
new_entry = { | |
'id': len(st.session_state.translation_history) + 1, | |
'source_lang': source_lang, | |
'target_lang': target_lang, | |
'source_text': source_text[:50] + ('...' if len(source_text) > 50 else ''), | |
'date': pd.Timestamp.now().strftime("%Y-%m-%d %H:%M") | |
} | |
st.session_state.translation_history.insert(0, new_entry) | |
else: | |
st.warning("يرجى إدخال نص للترجمة", icon="⚠️") | |
# عرض سجل الترجمات الأخيرة | |
if st.session_state.translation_history: | |
st.markdown("### آخر الترجمات") | |
# عرض آخر 5 ترجمات | |
recent_translations = st.session_state.translation_history[:5] | |
for i, entry in enumerate(recent_translations): | |
with st.expander(f"{entry['source_lang']} إلى {entry['target_lang']} - {entry['date']}"): | |
st.markdown(f"**النص المصدر:** {entry['source_text']}") | |
def _render_document_translation(self): | |
""" | |
عرض واجهة ترجمة المستندات | |
""" | |
st.markdown("### ترجمة المستندات") | |
st.markdown("ترجمة المستندات بتنسيقات مختلفة مع الحفاظ على التنسيق الأصلي") | |
# اختيار اللغات | |
col1, col2 = st.columns(2) | |
with col1: | |
doc_source_lang = st.selectbox( | |
"اللغة المصدر", | |
options=["العربية", "الإنجليزية", "الفرنسية", "الإسبانية", "الألمانية"], | |
index=0, | |
key="doc_source_lang" | |
) | |
with col2: | |
doc_target_lang = st.selectbox( | |
"اللغة الهدف", | |
options=["الإنجليزية", "العربية", "الفرنسية", "الإسبانية", "الألمانية"], | |
index=0, | |
key="doc_target_lang" | |
) | |
# رفع الملف | |
uploaded_file = st.file_uploader( | |
"اختر ملفاً للترجمة", | |
type=["pdf", "docx", "xlsx", "pptx", "txt"], | |
key="doc_upload" | |
) | |
# خيارات الترجمة | |
st.markdown("#### خيارات الترجمة") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.checkbox("الحفاظ على التنسيق الأصلي", value=True, key="preserve_format") | |
st.checkbox("ترجمة الجداول", value=True, key="translate_tables") | |
with col2: | |
st.checkbox("ترجمة النصوص في الصور", value=False, key="translate_images") | |
st.checkbox("استخدام المصطلحات المخصصة", value=True, key="use_custom_terms") | |
# زر الترجمة | |
if st.button("ترجمة المستند", key="translate_doc_btn"): | |
if uploaded_file is not None: | |
# محاكاة عملية الترجمة | |
with st.spinner("جاري ترجمة المستند..."): | |
# محاكاة وقت المعالجة | |
import time | |
time.sleep(2) | |
st.success("تمت ترجمة المستند بنجاح!", icon="✅") | |
# زر تنزيل الملف المترجم (وهمي) | |
st.download_button( | |
label="تنزيل المستند المترجم", | |
data=b"محتوى وهمي للملف المترجم", | |
file_name=f"translated_{uploaded_file.name}", | |
mime="application/octet-stream", | |
key="download_translated_doc" | |
) | |
else: | |
st.warning("يرجى رفع ملف للترجمة", icon="⚠️") | |
def _render_glossary(self): | |
""" | |
عرض واجهة المصطلحات والقاموس | |
""" | |
st.markdown("### المصطلحات والقاموس") | |
st.markdown("إدارة المصطلحات التقنية والقاموس المخصص للمشاريع") | |
# إنشاء بيانات تجريبية للمصطلحات | |
glossary_terms = [ | |
{"term_ar": "مناقصة", "term_en": "Tender", "domain": "عقود"}, | |
{"term_ar": "عطاء", "term_en": "Bid", "domain": "عقود"}, | |
{"term_ar": "ضمان ابتدائي", "term_en": "Bid Bond", "domain": "عقود"}, | |
{"term_ar": "جدول الكميات", "term_en": "Bill of Quantities", "domain": "هندسة"}, | |
{"term_ar": "مواصفات فنية", "term_en": "Technical Specifications", "domain": "هندسة"}, | |
{"term_ar": "شروط تعاقدية", "term_en": "Contractual Terms", "domain": "قانوني"}, | |
{"term_ar": "غرامة تأخير", "term_en": "Delay Penalty", "domain": "قانوني"}, | |
{"term_ar": "تحليل الأسعار", "term_en": "Price Analysis", "domain": "مالي"}, | |
{"term_ar": "تدفق نقدي", "term_en": "Cash Flow", "domain": "مالي"}, | |
{"term_ar": "تقييم المخاطر", "term_en": "Risk Assessment", "domain": "إدارة"} | |
] | |
# تبويبات فرعية للمصطلحات | |
subtabs = st.tabs(["عرض المصطلحات", "إضافة مصطلح", "استيراد/تصدير"]) | |
with subtabs[0]: | |
# فلترة المصطلحات | |
domain_filter = st.multiselect( | |
"تصفية حسب المجال", | |
options=["الكل", "عقود", "هندسة", "قانوني", "مالي", "إدارة"], | |
default=["الكل"], | |
key="domain_filter" | |
) | |
# تطبيق التصفية | |
filtered_terms = glossary_terms | |
if "الكل" not in domain_filter: | |
filtered_terms = [term for term in glossary_terms if term['domain'] in domain_filter] | |
# عرض المصطلحات | |
if filtered_terms: | |
df = pd.DataFrame(filtered_terms) | |
df.columns = ["المصطلح (عربي)", "المصطلح (إنجليزي)", "المجال"] | |
st.dataframe(df, use_container_width=True) | |
else: | |
st.info("لا توجد مصطلحات تطابق معايير التصفية", icon="ℹ️") | |
with subtabs[1]: | |
# نموذج إضافة مصطلح جديد | |
st.markdown("#### إضافة مصطلح جديد") | |
col1, col2 = st.columns(2) | |
with col1: | |
new_term_ar = st.text_input("المصطلح بالعربية", key="new_term_ar") | |
with col2: | |
new_term_en = st.text_input("المصطلح بالإنجليزية", key="new_term_en") | |
new_term_domain = st.selectbox( | |
"المجال", | |
options=["عقود", "هندسة", "قانوني", "مالي", "إدارة", "أخرى"], | |
key="new_term_domain" | |
) | |
new_term_desc = st.text_area("الوصف (اختياري)", key="new_term_desc") | |
if st.button("إضافة المصطلح", key="add_term_btn"): | |
if new_term_ar and new_term_en: | |
st.success("تمت إضافة المصطلح بنجاح", icon="✅") | |
else: | |
st.warning("يرجى إدخال المصطلح باللغتين العربية والإنجليزية", icon="⚠️") | |
with subtabs[2]: | |
# استيراد وتصدير المصطلحات | |
st.markdown("#### استيراد وتصدير المصطلحات") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.markdown("##### استيراد المصطلحات") | |
st.file_uploader("اختر ملف المصطلحات (CSV, Excel)", type=["csv", "xlsx"], key="import_glossary") | |
st.button("استيراد", key="import_btn") | |
with col2: | |
st.markdown("##### تصدير المصطلحات") | |
export_format = st.radio( | |
"صيغة التصدير", | |
options=["CSV", "Excel", "PDF"], | |
horizontal=True, | |
key="export_format" | |
) | |
if st.button("تصدير", key="export_btn"): | |
st.success("تم تصدير المصطلحات بنجاح", icon="✅") | |
# زر تنزيل الملف المصدر (وهمي) | |
st.download_button( | |
label="تنزيل ملف المصطلحات", | |
data=b"محتوى وهمي لملف المصطلحات", | |
file_name=f"glossary_terms.{export_format.lower()}", | |
mime="application/octet-stream", | |
key="download_glossary" | |
) | |
def _render_translation_settings(self): | |
""" | |
عرض إعدادات الترجمة | |
""" | |
st.markdown("### إعدادات الترجمة") | |
st.markdown("تخصيص إعدادات وحدة الترجمة") | |
settings = st.session_state.translation_settings | |
# اللغات الافتراضية | |
st.markdown("#### اللغات الافتراضية") | |
col1, col2 = st.columns(2) | |
with col1: | |
default_source = st.selectbox( | |
"اللغة المصدر الافتراضية", | |
options=["العربية", "الإنجليزية", "الفرنسية", "الإسبانية", "الألمانية"], | |
index=0, | |
key="default_source" | |
) | |
with col2: | |
default_target = st.selectbox( | |
"اللغة الهدف الافتراضية", | |
options=["الإنجليزية", "العربية", "الفرنسية", "الإسبانية", "الألمانية"], | |
index=0, | |
key="default_target" | |
) | |
# خيارات عامة | |
st.markdown("#### خيارات عامة") | |
auto_translate = st.checkbox( | |
"ترجمة تلقائية أثناء الكتابة", | |
value=settings['auto_translate'], | |
key="auto_translate" | |
) | |
save_history = st.checkbox( | |
"حفظ سجل الترجمات", | |
value=settings['save_history'], | |
key="save_history" | |
) | |
use_glossary = st.checkbox( | |
"استخدام المصطلحات المخصصة", | |
value=settings['use_glossary'], | |
key="use_glossary" | |
) | |
# خيارات متقدمة | |
st.markdown("#### خيارات متقدمة") | |
translation_model = st.selectbox( | |
"نموذج الترجمة", | |
options=["نموذج عام", "نموذج متخصص للعقود", "نموذج متخصص للهندسة"], | |
key="translation_model" | |
) | |
# زر حفظ الإعدادات | |
if st.button("حفظ الإعدادات", key="save_translation_settings"): | |
st.session_state.translation_settings = { | |
'default_source': default_source, | |
'default_target': default_target, | |
'auto_translate': auto_translate, | |
'save_history': save_history, | |
'use_glossary': use_glossary | |
} | |
st.success("تم حفظ الإعدادات بنجاح", icon="✅") | |
def _mock_translation(self, text, source_lang, target_lang): | |
""" | |
محاكاة عملية الترجمة (للعرض فقط) | |
""" | |
# قاموس بسيط للترجمة | |
translations = { | |
"مناقصة": "Tender", | |
"عطاء": "Bid", | |
"مشروع": "Project", | |
"عقد": "Contract", | |
"تسعير": "Pricing", | |
"تحليل": "Analysis", | |
"وثائق": "Documents", | |
"شركة": "Company", | |
"مقاول": "Contractor", | |
"مالك": "Owner", | |
"Tender": "مناقصة", | |
"Bid": "عطاء", | |
"Project": "مشروع", | |
"Contract": "عقد", | |
"Pricing": "تسعير", | |
"Analysis": "تحليل", | |
"Documents": "وثائق", | |
"Company": "شركة", | |
"Contractor": "مقاول", | |
"Owner": "مالك" | |
} | |
# محاكاة بسيطة للترجمة | |
if source_lang == "العربية" and target_lang == "الإنجليزية": | |
for ar, en in translations.items(): | |
text = text.replace(ar, en) | |
return text | |
elif source_lang == "الإنجليزية" and target_lang == "العربية": | |
for en, ar in translations.items(): | |
text = text.replace(en, ar) | |
return text | |
else: | |
# للغات الأخرى، نعيد النص كما هو مع إضافة ملاحظة | |
return text + "\n\n[محاكاة للترجمة - هذه ليست ترجمة حقيقية]" | |
def _generate_sample_history(self): | |
""" | |
إنشاء بيانات تجريبية لسجل الترجمة | |
""" | |
sample_texts = [ | |
"تحليل وثائق المناقصة للمشروع", | |
"إعداد جدول الكميات والأسعار", | |
"مراجعة الشروط التعاقدية للمشروع", | |
"تقييم المخاطر المحتملة للمشروع", | |
"إعداد العرض الفني والمالي", | |
"Analysis of tender documents for the project", | |
"Preparation of bill of quantities and prices", | |
"Review of contractual terms for the project", | |
"Assessment of potential project risks", | |
"Preparation of technical and financial offer" | |
] | |
languages = ["العربية", "الإنجليزية"] | |
history = [] | |
for i in range(10): | |
source_lang = random.choice(languages) | |
target_lang = "الإنجليزية" if source_lang == "العربية" else "العربية" | |
# اختيار نص مناسب للغة المصدر | |
if source_lang == "العربية": | |
text_index = random.randint(0, 4) | |
else: | |
text_index = random.randint(5, 9) | |
# إنشاء تاريخ عشوائي خلال الشهر الماضي | |
days_ago = random.randint(0, 30) | |
entry_date = (pd.Timestamp.now() - pd.Timedelta(days=days_ago)).strftime("%Y-%m-%d %H:%M") | |
entry = { | |
'id': i + 1, | |
'source_lang': source_lang, | |
'target_lang': target_lang, | |
'source_text': sample_texts[text_index], | |
'date': entry_date | |
} | |
history.append(entry) | |
# ترتيب السجل حسب التاريخ (الأحدث أولاً) | |
history.sort(key=lambda x: x['date'], reverse=True) | |
return history | |