تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] مشروع قاموس
#11
اتذكر كوني ذكرت فقط وضع المسافة بعد فقط وليس قبل
والمسافة يتم وضعها فى Function وكذلك فى الحدث لـ BtnTranslate_Click
وتكون المسافة بعد جملة التعريف فقط ليس اكثر

انظر اخى الفاضل Doctor GME
الامر بكل بساطة وسهولة جداً وبدون اى تعقيد
تعال عند كود الـ Function واجعله بهذا الشكل
كود :
   Function GetExactSubtitles(ByVal content As String) As String

       Using cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MyDatabase.accdb")
           cnn.Open()
           content = content.Replace(vbNewLine, " * ")
           Try
               Dim sql As String = "SELECT * FROM [Translations] ORDER BY Len(English) DESC"
               Using adp As New OleDbDataAdapter(sql, cnn)
                   Dim tbl As New DataTable
                   If adp.Fill(tbl) > 0 Then
                       For Each row As DataRow In tbl.Rows
                           content = content.Replace(row.Item("English") & Space(1), row.Item("Arabic") & Space(1))
                       Next
                   End If
               End Using
               content = content.Replace(" * ", vbNewLine)
               Return content
           Catch ex As Exception
               MsgBox(ex.Message)
               Return Nothing
           End Try
           cnn.Close()
       End Using

   End Function

انا لم اذكر ماذا قمت به وما التغيير البسيط أو باصح الاضافة البسيطة التى تمت فى الكود بالاعلى
حتى اجد منك ردك التالى بتوضيح بما تم فى الكود من التعديل وما فكرتها حتى اكون على يقين ان الاستخدام للكود ليس كا نسخ ولصق فقط
وكذلك لتفيد الزائر للموضوع هنا بما هو التعديل ليتم عمل نجاح الكود فى الترجمة

الان كل ما عليك فعله هو ان تجعل كود حدث الزر بهذا الشكل
كود :
       ArabicTextbox.Text = GetExactSubtitles(EnglishTextbox.Text & Space(1))

وهو نفس الكود الذى قمت بتوضيحه فى ردي السابق
الان يمكنك الاختبار تعدد الكلمات فى السطر الواحد وايضاً تعدد الاسطر والكلمات
الرد }}}
تم الشكر بواسطة: asemshahen5 , Doctor GME , Doctor GME
#12
محاولة من محاولاتي ليست ناجحة 100% لكنها بداية جيدة و تحتاج الكثير من التنقيح و الشروط لتصبح ناجحة .


الملفات المرفقة
.zip   Translator1.zip (الحجم : 76.55 ك ب / التحميلات : 9)
الرد }}}
تم الشكر بواسطة: عبد العزيز البسكري , سعود
#13
الرد }}}
تم الشكر بواسطة: asemshahen5 , عبد العزيز البسكري
#14
أخى kiki
شكراً لمجهودك الكبير وعذراً على تأخرى فى الرد لانشغالى فى تجريب الكود
هناك مشكلة بسيطة ظهرت لم أفهم سببها
هذا هو أحد السجلات فى قاعدة البيانات:



عند البحث عن ?now تخرج النتيجة بلا مشاكل
ولكن عند البحث عن ?know مثلاً تخرج النتيجة هكذا: الآن؟k
مثل المشكلة الأولى تماماً وكأن ؟ تلغى ما تم تعديله بالكود ولا تتقيد بوجود مسافات
هذا هو الكود النهائى:

كود :
Imports System.Data.OleDb

Public Class Form1

   Function GetExactSubtitles(ByVal content As String) As String


       Using cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MyDatabase.accdb")
           cnn.Open()
           content = content.Replace(vbNewLine, " * ").Replace(" ?", "?")
           Try
               Dim sql As String = "SELECT * FROM [Translations] ORDER BY Len(English) DESC"
               Using adp As New OleDbDataAdapter(sql, cnn)
                   Dim tbl As New DataTable
                   If adp.Fill(tbl) > 0 Then
                       For Each row As DataRow In tbl.Rows
                           content = content.Replace(row.Item("English") & Space(1), row.Item("Arabic") & Space(1))
                       Next
                   End If
               End Using
               content = content.Replace(" * ", vbNewLine)
               Return content
           Catch ex As Exception
               MsgBox(ex.Message)
               Return String.Empty
           End Try

           cnn.Close()
       End Using

   End Function

   Private Sub BtnTranslate_Click(sender As Object, e As EventArgs) Handles BtnTranslate.Click

       ArabicTextbox.Text = GetExactSubtitles(EnglishTextbox.Text & Space(1))

   End Sub
End Class

ولم أضف كما تلاحظ سوى الجزء الخاص بالاستبدال فى هذا السطر لأطابق قاعدة البيانات:

كود :
content = content.Replace(vbNewLine, " * ").Replace(" ?", "?")

فما هى اقتراحاتك

أخى asemshahen5
محاولة جيدة ولكن لا يمكن إضافة قاعدة البيانات لكود البرنامج
فالمفترض أنها تحتوى على ملايين الصفوف
الرد }}}
تم الشكر بواسطة: عبد العزيز البسكري
#15
لا عليك اخى Doctor GME
فالامر بسيط جداً ويجب عليك ان تفهم شياً مهماً
عندما نتحدث عن الترجمة يعنى يجب ان تعتبر ان لكل حرف او رمز مقاماً
بمعنى عندما نقول now فهى كلمة وعندما اقول know فهى كلمة وايضاً واهمهما عندما اقول كلاً من ؟ و & و ) و ( فكل منهم كلمة
لهما قيمة عكسية فعلياً زيها زى اى كلمة تكتب كما هو فى now و know
فالتالى هو عند اضافة البيانات فى قاعدة البيانات نكتب التالى
now
know
?
&
(
)

وتكون قيمتها فى العربي التالى
الآن
أعرف
؟
)
(

لاحظ الاختلاف بين كل ما ذكر وملاحظة الاختلاف
اولاً كون كل رمز هو مستقراً بنفس قيمة الكلمة وايضاً ستقرر من تكرارها وعدم توقعات المستخدم كيف يستخدمها
اذا بدون مسافة او بمسافة واحدة او اكثر وما شبه
خليني اعطي مثالاً لتتاكد الامر انت تقول قمت بعمل
now?
الى هنا وجميل طيب تعال كده وخليها بهذا الشكل
now?. أو now?.. أو now?, أو now?._
لا تقول انك هتخمن كل حاجة قد يكتبها وتكتبها وتشجلها بقاعدة البانات
بينما قيمة واحدة فقط تعفى كل هذا

طيب الان بعد انهاء مشكلة عدم اعطاء كل رمز قيمته كا كلمة مستقلة
وعلمنا كيفية الحل ما هو الكود الذى سيضاف على الكود الحالى لتجنب مشكلة مثل اذا كتب المستخدمة
مثل ؟ بعد الكلمة بدون مسافةوما شبه بكل سهولة وبساطة تامة
تتذكر هذا السطر من ردي السابق
كود :
content = content.Replace(vbNewLine, " * ")

كل ما ستفعله هو التالى مثلاً يا تكرار السطر ليكون اسفل منه هذا الشكل
كود :
content = content.Replace("?", " ?")

أو تغيير السطر ليصبح بهذا الشكل
كود :
content = content.Replace(vbNewLine, " * ").Replace("?", " ?")

وتاتى على الكود المعاكس اللى بالاسفل وهو
كود :
content = content.Replace(" * ", vbNewLine)

وتعمل الامر نفسه وهو كالتالى
كود :
content = content.Replace(" * ", vbNewLine).Replace(" ؟", "؟")

انتبه لتغير شكل ؟ عن الاعلى لان الان اصبح مترجم للعربية
ستقوم بتطبيق الامر على هذا النحو الى اى رمز لديك كما ذكرته بالاعلى
ساترك انت من تقوم بالباقى حتى توضح الصورة كاملتاً معاك وتعتاد على الامر
الرد }}}
تم الشكر بواسطة: Doctor GME
#16
أخى kiki
جربت ما اقترحته كثيراً ولكن المشكلة كما هى
بعد تعديل كل ما اقترحته حاولت ترجمة كلمة now ونجحت
ولكن know تعطى نفس الخطأ الآنk
فى حين nowk تنجح ولا يتم ترجمتها لعدم وجودها فى قاعدة البيانات
والسبب واضح طبعاً بسبب هذا السطر

كود :
                           content = content.Replace(row.Item("English") & Space(1), row.Item("Arabic") & Space(1))

فهو يشترط وجود مسافة بعد الكلمة فقط ولذلك عند نقل حرف k بعد الكلمة ولم يجد البرنامج مسافة بينهما لم تتم الترجمة
فى حين قبلها لم تمثل مشكلة وترجم البرنامج جزء من الكلمة فقط
كل ما أريده هو وضع شرط أن يسبق الكلمة المترجمة مسافة جديدة أو سطر جديد أو بداية الفقرة (أى لا يسبقها سطر جديد ولكنها أول كلمة فى الفقرة)
يمكننى أن أجعلها مثلاً هكذا:

كود :
                           content = content.Replace(Space(1) & row.Item("English") & Space(1), row.Item("Arabic") & Space(1))

ولكن كما هو واضح هذا يشترط وجود مسافة فقط ولكن لا يحقق المطلوب فلو كانت الكلمة فى بداية سطر جديد أو فى بداية الفقرة كما أوضحت سيحدث نفس الخطأ
قمت بإرفاق البرنامج النهائى لو أردت أن تجربه بنفسك وشكراً لمجهودك


الملفات المرفقة
.rar   Translator.rar (الحجم : 85.13 ك ب / التحميلات : 6)
الرد }}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم