translate / index.html
joermd's picture
Update index.html
ff95748 verified
raw
history blame
9.69 kB
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>تحليل النصوص والترجمات – وضع Streaming</title>
<!-- استيراد Tailwind CSS وFontAwesome -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
<style>
/* تأثيرات الخلفية والحركة */
@keyframes gradient {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
.animate-gradient {
background-size: 200% 200%;
animation: gradient 15s ease infinite;
}
.transition-all { transition: all 0.3s ease-in-out; }
.animate-scale { transition: transform 0.2s ease-in-out; }
.animate-scale:hover { transform: scale(1.02); }
.pulse-animation { animation: pulse 2s infinite; }
@keyframes pulse {
0% { box-shadow: 0 0 0 0 rgba(0,0,0,0.2); }
70% { box-shadow: 0 0 0 10px rgba(0,0,0,0); }
100% { box-shadow: 0 0 0 0 rgba(0,0,0,0); }
}
/* تنسيق النصوص */
.text-comparison { line-height: 1.8; white-space: pre-wrap; }
.highlight {
color: white;
background-color: #ef4444;
padding: 0 3px;
border-radius: 3px;
font-weight: bold;
}
/* تقسيم الأسطر */
.line-item {
margin-bottom: 1rem;
padding: 0.5rem;
border-bottom: 1px dashed #ccc;
}
.line-number {
font-weight: bold;
color: #4B5563;
margin-left: 0.5rem;
}
.line-text { display: inline-block; }
/* تصميم البطاقات */
.card {
background-color: #fff;
border-radius: 1rem;
box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1);
padding: 2rem;
border: 1px solid #f3f4f6;
}
.card-hover:hover {
box-shadow: 0 10px 25px -5px rgba(0,0,0,0.2);
transform: translateY(-3px);
}
.icon { margin-left: 0.5rem; }
.upload-label {
display: flex;
flex-direction: row-reverse;
align-items: center;
justify-content: center;
}
/* مؤشر التحميل */
.spinner {
border: 4px solid #f3f3f3;
border-top: 4px solid #4f46e5;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* منطقة سلسلة التفكير */
#chainOfThought {
display: none;
margin-top: 1rem;
background-color: #f9fafb;
padding: 1rem;
border: 1px solid #e5e7eb;
border-radius: 0.5rem;
font-size: 0.9rem;
direction: ltr;
text-align: left;
}
</style>
</head>
<body class="bg-gradient-to-br from-gray-100 via-blue-100 to-indigo-100 min-h-screen">
<div class="max-w-5xl mx-auto py-12">
<!-- رأس الصفحة -->
<header class="text-center mb-12">
<h1 class="text-5xl font-bold mb-4 animate-gradient">تحليل النصوص والترجمات</h1>
<p class="text-2xl">ترجم النص الهدف إلى العربية مع التعليم، ثم قارن مع النص المصدر واخرج الاختلافات (النصوص الناقصة) فقط.</p>
</header>
<!-- منطقة الإدخال -->
<div class="space-y-6">
<div>
<label class="block text-2xl font-bold mb-2">النص المصدر</label>
<textarea id="sourceText" class="w-full p-4 border rounded-lg" rows="6" placeholder="اكتب النص المصدر هنا..."></textarea>
</div>
<div>
<label class="block text-2xl font-bold mb-2">النص الهدف</label>
<textarea id="targetText" class="w-full p-4 border rounded-lg" rows="6" placeholder="اكتب النص الهدف هنا..."></textarea>
</div>
</div>
<!-- زر التحليل ومؤشر التحميل -->
<div class="mt-6 flex items-center justify-center space-x-4">
<button id="analyzeBtn" class="px-8 py-4 bg-indigo-600 text-white font-bold rounded-lg hover:bg-indigo-700 transition">
تحليل ومراجعة النصوص
</button>
<div id="loadingIndicator" class="spinner hidden"></div>
</div>
<!-- منطقة سلسلة التفكير -->
<div id="chainOfThought" class="mt-6">
<strong>سلسلة التفكير:</strong>
<pre id="chainText" class="whitespace-pre-wrap text-gray-700"></pre>
</div>
<!-- منطقة النتائج -->
<div id="resultSection" class="mt-8 hidden">
<h2 class="text-3xl font-bold mb-4">النتائج:</h2>
<div id="diffResult" class="p-4 border rounded-lg"></div>
</div>
</div>
<script>
(function(){
"use strict";
// برومت بسيط: ترجمة النص الهدف إلى العربية مع التعليم، ثم قارن بين النص المصدر والنص الهدف المُترجم واخرج الاختلافات (النصوص الناقصة) فقط مع وضعها بين أقواس.
const PROMPT = `ترجم النص الهدف إلى العربية مع التعليم، ثم قارن بين النص المصدر والنص الهدف المُترجم واخرج الاختلافات فقط (النصوص الناقصة) مع وضعها بين أقواس ().
النص المصدر:
{source}
النص الهدف:
{target}`;
// دالة عرض مؤشر التحميل
const showLoading = () => {
document.getElementById('loadingIndicator').classList.remove('hidden');
};
const hideLoading = () => {
document.getElementById('loadingIndicator').classList.add('hidden');
};
// دالة إرسال الطلب إلى DeepSeek مع تفعيل خاصية streaming
async function analyzeText(source, target) {
const payload = {
model: "deepseek-chat",
messages: [
{ role: "system", content: "أنت نموذج DeepSeek؛ ترجم النص الهدف إلى العربية مع التعليم ثم قارن بينه وبين النص المصدر واخرج الاختلافات (النصوص الناقصة) فقط مع وضعها بين أقواس ()." },
{ role: "user", content: PROMPT.replace("{source}", source).replace("{target}", target) }
],
temperature: 0.3,
max_tokens: 1024,
stream: true
};
console.log("Payload:", payload);
try {
const response = await fetch("https://api.deepseek.com/chat/completions", {
method: "POST",
headers: {
"Authorization": "Bearer sk-15606736ed9e4aea8b7cc11a195d2b01",
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
if (!response.ok) {
throw new Error("حدث خطأ في الاتصال: " + response.statusText);
}
// قراءة الاستجابة على شكل تدفق
const reader = response.body.getReader();
const decoder = new TextDecoder();
let result = "";
while (true) {
const { done, value } = await reader.read();
if (done) break;
result += decoder.decode(value, { stream: true });
// تحديث سلسلة التفكير بشكل مستمر
document.getElementById('chainText').innerText = result;
}
return result;
} catch (error) {
throw error;
}
}
// دالة بسيطة لمعالجة النتيجة: هنا نضع الاختلافات بين أقواس
function processResult(source, analysisOutput) {
// على سبيل المثال: افترض أن الاختلافات تظهر بين علامتي __ للنص المفقود
let processed = analysisOutput.replace(/__(.*?)__/g, '<span class="highlight">($1)</span>');
return processed;
}
// مستمع الزر
document.getElementById('analyzeBtn').addEventListener('click', async () => {
const sourceText = document.getElementById('sourceText').value.trim();
const targetText = document.getElementById('targetText').value.trim();
if (!sourceText || !targetText) {
alert("يرجى إدخال كلا النصين.");
return;
}
// إخفاء النتائج الحالية وإظهار مؤشر التحميل
document.getElementById('resultSection').classList.add('hidden');
document.getElementById('chainOfThought').style.display = "none";
showLoading();
try {
const analysisOutput = await analyzeText(sourceText, targetText);
// عرض سلسلة التفكير بعد استقبال البيانات
document.getElementById('chainOfThought').style.display = "block";
// معالجة الناتج وتطبيق التظليل
const diffResult = processResult(sourceText, analysisOutput);
document.getElementById('diffResult').innerHTML = diffResult;
document.getElementById('resultSection').classList.remove('hidden');
} catch (error) {
alert("خطأ أثناء التحليل: " + error.message);
} finally {
hideLoading();
}
});
})();
</script>
</body>
</html>