# مباحث متفرقه برنامه نویسی > پروژه‌های Open Source >  تبدیل صفحات انگلیسی اینترنت به صفحات فارسی با مرورگر

## pesarkhobeee

به نام یزدان پاک
سلام به همه ی دوستان :خجالت:  اسم  من فرید و به pesarkhobeee معروفم .
قبل از هر چیزی ذکر این نکته ضروری که من تازه کارم و فقط یک ساله که به طور پیوسته برنامه نویسی می کنم که اون رو هم فقط با کتاب خوندن یاد گرفتم ! پس انتظار کد های تر و تمیز از من نداشته باشین !؟
و همچنین بی اشکال!
میرم سر اصل مطلب من با استفاده از دیتا بیسی (  Data Base ) که اقا بهزاد برای دیکشنریش ( Dictionary ) در اختیار ما گذاشتن یه بر نامه ناقص فقط برای اینکه فکرم رو نشون بدم نوشتم که در اون یک مرورگر اینترنت تعبیه شده و یک دکمه خاص ! ( چه فکر بزرگی ! باید مواظب باشم ماکروسافت منو ند وزده ؟ )
اون دکه اسمش دیکشنریه ! و این جوری کار می کنه که وقتی دنبال ٫ درست حسابی ترین سایت در مورد تحقیق تون !؟! بودین و ییهو به یه سایت انگلیسی بر خوردین با زدن اون به سایت فارسی تبدیل می شه البته با کمی تلاش خودتون !!!
تا حالا فکر کردین چرا برنامه ای نیومده که متن انگلیسی رو گرفته و متن کامل فارسی شو تحویل بده ؟ خب به خاطر اینکه یه کلمه چند تا معنی داره !!! و برنامه ها نمی تونن تشخیص بدن کدوم معنی برای متن مورد نظر مناسبه . منم نمی خوام هوش مصنوعی به برنامه بدم چون کمی تا قسمتی واقع بینم ! ایده من استفاده از منوهای کشوییه ! به این صورت که متن انگلیسی رو گرفته و معنی های هر کلمه رو با همون ترتیب در منوی های کشویی می گذاره و ما فقط باید معنی های درست رو انتخاب کنیم تا بفهمیم سایت مورد نظر می خواد چی بگه ! بهمین سادگی بهمین خوشمزگی اینترنت ( گلابی ؟؟؟ )
این کار باعث صرفه جویی زیادی در وقت و پول اینترنت میشه.
حال کردید ! حالا به چند پیام بازرگانی توجه کنید تا بقیشو بگم .............................................
برنامه نصفه نیمه منو ٫ میتونید از ادرس  :               http://d01.megashares.com/?d01=2c6da1a  بگرید و نگاه کنید البته توجه به چند نکته ضروریه :

-	این برنامه با Visual Basic 6 نوشته شده 
-	میشه گفت ویرایش الفاست و پر از باگ و مشکل ! به صورت کثیف برنامه نویسی شده و اگه تونستید سر در بیارید از بیل گیتس یه جایزه می گیرید !
-	یکی ازمشکلاتی که باعث شد بخش کدهای ترجمه سایت ها  پیچیده بشه اینه که نمی شه  دو حلقه رو به صورت تو در تو استفاده کرد یا من نتونستم؟ البته در اخرین لحظات ایده استفاده از function به سرم زد !
-	اگه خواستید برنامه رو امتحان کنید فایل HTML تون رو حداقل رو یه سرور مجازی قرار بدین چون فعلا فایل های روی هارد رو قبول نمی کنه و حتما اون فایل HTML تون محتوای کمی داشته باشه چون برتامه قاتی داره ها.
-	و هزار رو یه چیز ندیده ی دیگه ( سرزمین عجایب ها ! بشتاااااااابید)

البته اون قدر ها هم بد نیست و اگه کمی دقت کنید با راهنمایی هایی که من تو کد ها گذاشتم خیلی راحت الگوریتم برنامه رو می فهمید . 
ما نیازمند کمک های سبزتان هستیم ٫ شماره حسا .. ٫ ببخشید یه لحظه قاتی کردم ٫ مخلص یه دست صدا نداره و همه چیز رو همگان دانند پس اونایی که حاضرند یه خدمت جانانه به جامعه فارسی زبانان اینترنت بکنند اعلام امادگی بکنند و حتما ایمیل بزنند یا خودتون در همین قسمت نتیجه کارتون رو بزارید . (  از لینوس تروالز که کمتر نیستسم )
ایمیل من :
pesarkhobeee@yahoo.com
تو این فکر بودم اسمه گروه رو گروه گلابی بزارم ! شاید فکر کنید مسخرست ولی از apple برای خارجی ها که مسخره تر نیست فکرشو بکنید ٫ شرکت سیب !
اسم گروه ٫ باعث ایجاد روحیه  گروهی و اتحاد بین اعضای گروه می شه . 
البته من فکر های دیگه هم دارم که همشون در مورد نقاط ضعف ایرانی ها روی اینترنته . تا ببینیم چقدر استقبال از این فکر مون می شه . شاید بشه از کد های fire fox استفاده کرد ٫ فقط چه جوریش رو شما بگین ؟ یه مرورگر فارسی قوی که انگلیسیش ملسه !  
من منتظرتونم ٫ همت کنید و بگید :
یا علی

----------


## hariva

راستش را بخواهی من نتوانستم برنامه ات را کامپایل کنم لطفا فایل EXE آن را هم بگذار.در ضمن کاشکی عنوان این مقاله را گروه گلابی می گذاشتی تا مشتری بیشتر جذب شود.

من سورس برنامه را دیدم و در این مدت روی آن خیلی کار کردم.مشکل اصلی همانی  کاری است که به تایمر سپردی.

نظر من این است.
ابتدا متن html را برداریم و قسمت هایی که دارای کلمات  است را مشخص کنیم(با اضافه کردن یک تگ من درآوردی).
سپس متن را از اول تا آخر پردازش کرده و هر جا تگ من در آوردی را دیدیم برویم و معنی کلمه ی بجای آن قرار دهیم.
در آخر تگ من در آوردی را حذف کنیم

من دو تابع نوشتم

اولی بخش های دارای متن را پیدا میکند.



Public Sub htmlProcessor(ByVal html As String)


        Dim start As Integer
        Dim length As Integer
        Dim newcode As String

        'find body location
        '========================
        BodyStart = InStr(1, html, "<body", CompareMethod.Text)
        BodyFinish = InStr(1, html, "</body>", CompareMethod.Text) + 6
        Body = Mid(html, BodyStart, BodyFinish - BodyStart + 1)

        '========================
        NewHead = Mid(html, 1, BodyStart - 1)

        NewBody = Body
        '========================
        i = 1
        Do
            TagStart = InStr(i, NewBody, "<")
            TagFinish = InStr(i, NewBody, ">")

            Select Case TagStart - TagFinish



                Case 1 ' Body="    ><i...."
                    i = TagStart + 1

                Case Is > 0         ' Body="   >matin<i      ......"


                    start = TagFinish + 1
                    length = TagStart - TagFinish - 1

                    newcode = NewCodeGenerator(Mid(NewBody, start, length))
                    NewBody = Mid(NewBody, 1, start - 1) & newcode & Mid(NewBody, start + length)
                    i = start + Len(newcode) + 2

                Case 1 - TagFinish  ' Body="<        >matin<i..."

                    TagStart = InStr(TagFinish, NewBody, "<")

                    start = TagFinish + 1
                    length = TagStart - TagFinish - 1

                    newcode = NewCodeGenerator(Mid(NewBody, start, length))

                    NewBody = Mid(NewBody, 1, start - 1) & newcode & Mid(NewBody, start + length)


                    i = start + Len(newcode) + 1


                Case Is < 0   ' Body="i    >"

                    i = TagFinish + 1

            End Select


            TagStart = 0
            TagFinish = 0

        Loop Until i > Len(NewBody)




        NewHtml = NewHead & NewBody







    End Sub




کد دوم هم برای ساختن  متن جدید است که تابع اول از آن استفاده میکند.



Public Function NewCodeGenerator(ByVal txt As String) As String



        txt = Replace(txt, "!", " ! ")
        txt = Replace(txt, "؟", " ؟ ")
        txt = Replace(txt, ".", " . ")
        txt = Replace(txt, "،", " ، ")
        txt = Replace(txt, ":", " : ")

        txt = Replace(txt, "(", "( ")
        txt = Replace(txt, ")", " )")

        'txt = txt.Trim.Replace("  ", " ")


        txt = CompleteTrim(txt)


        Dim NCd As String

        Dim WordArr() As String







        WordArr = Split(txt)



        If first = False Then

            idx = 0
            ReDim words(1, UBound(WordArr))
            first = True

        Else

            ReDim Preserve words(1, idx + WordArr.GetUpperBound(0))

        End If


        For i = 0 To WordArr.GetUpperBound(0)
            words(0, i + idx) = WordArr(i)
            NCd = NCd & "<matin>" & i + idx & "</matin>"

        Next


        idx = idx + WordArr.GetUpperBound(0) + 1

        Return NCd

    End Function

----------


## pesarkhobeee

سلام 
ظاهرا که برنامه منو کسی نتونسته اجرا کنه ! منم که این روزا درگیر کنکورم!؟!
ولی فکر می کنم بدونم مشکل کجاست!
همه اول ایده شون رو می گن بعد گروه تشکیل میدن و بعد برنامشون می یاد بیرون!
ولی من اول یه برنامهع دست و پا شکسته دادم!
خب هدف این تایپیک رفع نیازهای ایرانیان در کار با اینترنته.
در گام اول یه مرورگر وب رو به یه دیکشنری مجهز میکنه!
البته نوع  ترجمه در اون فرق می کنه و سریعتر از هر روشی!"البته بعد از کامل شدن"
و چیز دیگه که قراره به اون اضافه بشه این قابلیته که قراره خود کاربر مثل یه پازل گرامر اونو درست کنه.
و این دو روش باعث سهولت و تسریع عملیات ترجمه می شه.
برای دیدن نوع ترجمه به عکسهای زیر که قبل و بعد ترجمه رو در مرورگر نشون می ده مراجعه کنید!
در گام هایبعد سعی در استفاده از الگوریتم های خاص برای افزایش سرعت دیدن وب با خطوط ما می شه!
از این ساده تر نمی تونم بگم.
منتظر نظر های شما وکمک هاتون هستم!

----------


## pesarkhobeee

من قسمتی از سایت موزیلا رو که مربوط به هک کردن و اس تفاده شخصی از فایر فوکسه معنی کردم که به این تایپیک هم ربط داره.
شما می تونید اونو در ادرس زیر مشاهده کنید:
http://www.barnamenevis.org/sh...d.php?p=359387

----------


## pesarkhobeee

سلام :چشمک: 
بعد از مدتها بلاخره ویرایش جدید برنامه اماده شد.
البته این دفعه دیگه موقع نگاه کردن به کدها سرتون گیج نمیره چون من از کلاس و یه کم شیع گرایی استفاده کردم و نتیجش قابل فهم تر شدن کد هاست.
خب امیدوارم ایندفعه چند نفر به کمکم بیان چون هنوز برنامه مشکل داره.
مشکلات فعلی :
1.	برنامه قادر به باز کردن فایلهای html و ... از روی هارد نیست چون کاپونت inet نمیتونه این فایلها رو باز کنه ( یا من نتونستم!) پس برای امتحان برنامه باید یه سرور وب رو کمپیوترتون نصب باشه مثل IIS یا Apache و بعد در ادرس بار اینجوری بنویسید localhost/test.html .
2.	 در ضمن برای اینکه بعد از معنی کردن صفحه تون فونت های فارسی معنیا رو درست ببینید باید صفحتون تگ 
<meta http-equiv="Content-Type" content="text/html; charset=windows-1256">
رو داشته باشه و من هنوز راهی رو برای اضافه کردن خودکار این خصوصیت به صفحه پیدا نکردم.
3.	صفحه ای که با این برنامه معنی میکنید سعی کنید ساده باشه و مثلا سایت yahoo رو ندین معنی کنه چون هنوز نمیتونه سایتهای پیچیده از نظر تگ رو معنی کنه که باید این مشکل هم رفع بشه!
4.	موقع معنی کردن میبینید که کلماتی که کنارشون نقطه یا نشونه داره رو نمیتونه معنی کنه که اینم ان شاء ال... حل میشه.
امیدوارم تونسته باشم کدهارو مرتب کنم تا همه ازش سر در بیارن.
به امید موفقیت :لبخند گشاده!: .

----------


## pesarkhobeee

سلام
فکر جدیدی برای روش هم کاری کردن به فکرم رسید!
و اون پرسیدن سوال از شماست!
سوالاتی که حل اونا موجب پیشرفت برنامه میشه.
مثل:
https://barnamenevis.org/showthread.php?p=385003
که اگه حل بشه ویرایش جدید برنامه که خیلی کمتر مشکل داره هم اماده اپلود میشه!

----------


## pesarkhobeee

باید بگم این ویرایش دارای اشکالات کمتریه و امکان Open کردن فایل ها هم به اون افزوده شده که دیگه احتیاجی به راه انداختن سرور مجازی نیست!
خب شاید بپرسین چرا دفعه پیش نبود؟
چون الگوریتمی که من برای باز و بسته کردن و فرستادن اطلاعات به دیکشنری استفاده میکرد از کامپونت Inet استفاده میکرد که با فایل های توی هارد یکم مشکل داشت! اما با نتایج نه چندان کاملی که از سوال لینک شده ی پست بالا بدست اومد که در اینجا جا داره از killer-star تشکر کنم تونستم چند چیز رو حذف کنم که یکیش همون کامپونته بود.
اما براتون از قابلیت های دیگه بگم که:
پشتیبانی از تگ های HTML که در اون تگ های متون شناسایی و متن درون انها معنی میشود ولی تگ های دیگر مثل جعبه های متن ودکمه ها و ... در عملیات معنی کردن نادیده گرفته میشوند پس مشگلی با اغلب سایت ها که دارای تگ های معمولی هستند دیگه نداره.
سرعت معنی کردن صفحات بهبود چشمگیری کرده و اگه مشکلی در خلال عملیات پیش نیاد تا 3 دقیقه میتونه انواع متون رو معنی کنه.
همچنین چندین باگ اساسی هم تعمیر شده.
و در کل این ویرایش کاربر پسند تره!
در ضمبمه این پست میتونید این ویرایش رو بگیرید.
اما در مورد ادامه کار!!!!!!!!!!!!!!!!!!!
من نمیدونم که چرا هیچکس به طور عمومی بر روی این طرح کار نکرد؟
ولی چند پیشنهاد به طور خصوصی شد!
اگه شما جواب این سوال رو میدونید خوشحال میشم به منم بگید.
بهر حال بعد از این اگه همکاری نشه منم دچار مشکل در بروز کردن این تایپیک میشم چون منم مشکلات خاص خودم رو دارم وتازه اونا دارن شروع میشن!
و در اخر امیدوارم حد اقل تونسته باشم ایده مو در مورد روش بهینه تر وکاراتر معنی کردن !  با شما به اشتراک گذاشته باشم .
پسر خوبه
23/6/1386

----------


## hariva

برنامه بسیار کند کار میکند.یعنی در حقیقت در مورد سایت ها که اصلا نتوانستم نتیجه ای بگیرم.یک فایل متن ساده را هم که به برنامه دادم نتیجه ی زیاد جالبی نداد آنهم بخاطر نوع دیتابی برنامه است.ایده ی کمبوباکس اگرچه خوب است اما زیاد هم چهره ی خوبی به برنامه نمیدهد.فکر کنم باید دیتابیس بهتری برای این برنامه درست کنیم.

----------


## pesarkhobeee

خوشبختانه بلاخره یکی اظهار نظر کرد!
با عرض تشکر!
در مورد توضیح ای که در پست بالا داده بودید باید بگم که من اشکالات ای که تصحیح شده بود رو گفتم ولی اگه از مشکلات موجود چیزی نگفتم به علت اینکه اون مشکلات در پست انتشار نسخه اول قید شده بود که یکی از اونا :



> 2. در ضمن برای اینکه بعد از معنی کردن صفحه تون فونت های فارسی معنیا رو درست ببینید باید صفحتون تگ 
> <meta http-equiv="Content-Type" content="text/html; charset=windows-1256">


بود و اگه  این مورد رو در اسنادتون رعایت کنید دیگه به مشکل بر نمی خورید.
در مورد ریشه این مشکل هم با شما موافقم که از دیتا بیس برنامه و شاید از الگوریتم زمان بر اونه!
دیتا بیس رو که همون تور که در پست های بالا ذکر کردم از خود این انجمن بر داشتم ولی اگه درست یادم بیاد شما در حال دنبال کردن یه برنامه ایجا د دیتا بیس دیکشنری امروزی هستید که مشتاقانه مونتظر اماده شدن اون و استفادش هستم.
در مورد الگوریتم هم سواد ما همینقدره!!!!!!!! شما ما رو راهنمایی کنید.
اگه در مورد معنی کردن سایتها هم شک دارید میتونم اسکرین شاتشو اینجا بزارم! 
فقط چیزی که باید بگم این عکسها عملکرد برنامه رو رو تگ های وب ثابت میکنه و سایت دم دسته انگلیسیم همین بود که از کلمات سختی استفاده نکردهبود و اصلا احتیاجی به معنی کردن نداشت!

----------


## hariva

اگه مشکل با اضافه کردن این تگی که فرمودید حل میشه باید کاری کنیم که وقتی html جدید ساخته میشود این کد ها بدان افزوده شود.
در مورد دیتابیس اولا باید دنبال دیتابیس های دیگر هم بروید.برای اینکه همین دیتابیس موجود را تا حدودی بهتر کنیم ابتدا باید آنهایی که معنی فارسی شان یک کلمه است را جدا کنیم.
در ضمن بهتر است دیتابیس دیگری برای اینکار بسازیم.نظر من استفاده از دیتابیس واژگان اینگلیسی بر مبنای تعداد کاربردشان در متون است.من یک نمونه اش را دارم که اگر هزار واژه اول را معنی کنیم نتیجه اش خیلی بهتر خواهد بود و در ضمن به کمبو باکس هم نیازی ندارد.تعداد 41284 تا واژه پر کاربرد انگلیسی را دارد.

من این دیتابیس را از روی سایت ویکی دیکشنری ساختم که مجوز آن هم fdl است
این را به عنوان هدیه به برنامه شما میدهم. ترجمه کردنش با شما و سایر دوستان.

----------


## hariva

فعلا ترجمه اش نکن.چون نصفش رو ترجمه کردم.

در ضمن با الگوریتمی که قبلا به شما داده بودم و متاسفانه آنرا حذف کردید. به نتیجه ای که در فایل ضمیمه شده است رسیدم.فکر کنم برای شروع بد نباشد.

فایل temp.html ترجمه صفحه اول بی بی سی میباشد.البته باید انکودینک را یو تی اف هشت کنید و صفحه را راست به چپ فرمایید

----------


## pesarkhobeee

با تشکر از زحمات شما
ولی من متوجه چند چیز نمی شم!
اول از همه در مورد ترجمه ارائه شده  فکر نکنم به هیچ وجه با برنامه ای که من ارائه کردم صورت گرفته باشه!
چون جدای از ایده منو های کشویی که اساس ساخت این برنامه بود و شما حذفش کردین ! برنامه من دارای نواقص خاص خودشه که در کدهای HTML صفحه ارائه شده ندیدمشون! مگر اینکه شما از ویرایش بسیار تغییر کرده نسخه 0.0.1 استفاده کرده باشید!!  
دوم اینکه اساس این تایپیک بر این بوده که برنامه ای اراعه کنه که سرعت ترجمه توسط شخص رو بالا ببره. در توضیحات اولیه هم گفتم که چرا تا حالا برنامه ای نبوده که کل متنو گرفته و معنیش رو ارائه بده! حالا اگه ما با داشتن یه دیتا بیس که پر کار بردترین کلمات به همراه پر کاربردترین معانی رو داشته باشیم! باز هم احتمال درست بودن معانی هر کلمه پنجاه درصده و بر فرض درست بودن معنی کل کلمات صفحه ! باز هم به علت فرق کردن دستور زبان ها وقتی اینها پیش هم قرار میگیرن جمله ی درستی ایجاد نمی شه! این همون علتی بود که منو به فکر منوهایکشویی انداخت!چون انعطاف حفظ میشه و خود کاربر همراه با معنی کردن میفهمه جمله داره چی میگه که متاسفانه صفحه معنی شده ی شما فاقد جمله بندی درسته و به همین دلیل من به شخصه فکر کردم با یک سری جمله های گنگ ترفم نه با یه سری کلمه که باید خودم جمله بندیشو پیدا کنم!
در مورد دیتا بیسی که در اختیار من گذاشتید من فکر کردم به جای معنی کردن اون با تلفیق اون با دیتا بیس قبلی میتونم یه دیتابیس جدید بسازم که علاوه بر داشتن کل معانی در هنگام سوال و جواب از اون از روی نظم پر کاربردترین کلمات به جستجو بپردازه که مطمئنا باعث کاهش زمان جستجو و در کل پایین امدن زمان معنی کردن کل صفحه میشه و فعلا دارم رو این کار میکنم!
و در اخر در مورد حذف الگوریتم شما باید بگم من یک بار به بی سواد بودن خودم اعتراف کردم!در این مورد هم با وجود تلاشم نتونستم بفهمم الگوریتم شما میخاد چی بگه؟ و هدفش چیه!!!
امیدوارم فکر نکنید من یه دیکتاتورم که فقط نظرات خودشو قبول داره! بی صبرانه منتظر نظرات شما در مورد برنامه و ایده هام هستم ! همینطور که خودم تمام نظراتمو در مورد فایل شما گفتم!
و اگه باز هم فکر میکنید که ایده و روش شما بهتره , مشتا قانه در انتظار دیدن برنامه ی شما هستم.

----------


## hariva

شما سرور مایی ، اختیار دارید.
درست است من آن را به کمک یک نسخه ی تغیر یافته ی نسخه 0.01 انجام داده بودم. ترجمه ماشینی همانطور که شما میفرمایید بسیار مشکل تر از چیزی است که من ارائه دادم.از افزودن عامل گرامر که شما گفتید بگذریم اگر کتاب "در آمدی بر اصول ترجمه" را بخوانیم میبینیم که ترجمه ماشینی در بهترین شرایطی که فعلا انجام میشود هم چیز ناقصی است.کنون ما از آن مرحله بسیار دوریم و جای صحبت از ترجمه ماشینی به کمک هوش مصنوعی نیست.
در مورد برنامه فعلی که نصخه دوم آن در دو ورژن من و شما وجود دارد.
الف-در همین وضعیت فعلی هم نتیجه کار زیاد با نتیجه مترجم هابی نظیر پدیده و پارس تفاوتی ندارد.این خوبی برنامه ما نیست چون خودمان بیشتر میدانیم چقدر کار باید ببرد بلکه بر طراحی غیر علمی مترجم های موجود تاکید دارد که بعد از 8 نسخه هنوز هم مشکلات بنیادی دارند. حالا برنامه ما که نسخه 0.02 است تازه.
ب-من با تقسیم برنامه به اجزای کوچکتر موافقم به نظر من روال کار باید اینگونه باشد

1-بخش اول html را پردازش کند. انکودینگ آنرا تغیر دهد و صفحه را گر چپ به راست است راست به چپ کند.در ضمن تگ های body را به بخش دوم بفرستد.

2-بخش دوم body را بگیرد و بخش های دارای متن آن را مشخص کند.بخش های دارای متن معمولا تا جایی که من پرس و جو کردم معمولا بین دو >< قرار دارند.
البته استثنایی هم وجود دارد آن هم کاراکتر خط جدید می باشد که میتوان آنها را در اول کار حذف کرد.حالا که قسمت های متن دار پیدا شد باید واژه های آنرا مشخص کنیم.برای این کار از تابع شماره یک استفاده میکنیم.

تابع شماره یک:این تابع بخش متن دار را میگیرد و کلمات آنرا دانه به دانه بین دو تگ من در آوردی قرار میدهد.در نسخه ای که من استفاده کردم این تگها استفاده شد <x>  و </x>  . 

3-بخش سوم: در این بخش متن جدید html پردازش شده و معنی کلمات جایگزین عبارات داخل تگ من در آوردی میشود.
این کار میتواند به دو صورت انجام گیرد روش او قرار دادن مستقیم واژه است (همانند روش من) و دوم قرار دادن آیتمی انتخابی همانند کمبوباکسی که شما استفاده کردید.
در این بخش رعایت کردن این نکته ضروری است که برخی واژه ها مانند the نباید ترجمه شوند چون معادل ندارند.دوم اینکه اگر با مراجعه به دیتابیس واژه ای یافت نشد ابتدا باید ببینیم که شاید واژه جمع باشد. با برداشتن  s و یا es آخر آن اگر باقی کلمه در دیتابیس پیدا شد میتوان معنی آن واژه را با افزودن یک ها ساخت. و با این کار تا حدودی زیادی بر کارایی برنامه افزود

و در آخر میتوان به ابتدای متن ترجمه شده چند خط نیز خودمان اضافه کنیم که مثلا این صفحه توسط نرم افزار فلان ترجمه شده است و اینکه معمولا ترجمه ماشینی دارای خطاهای زیادی است.

مشکلی که فعلا دراین  پروژه وجود دارد این است که من با vb.net کار میکنم و شما با vb6 اگر شما به ویبی دات نت مهاجرت کنید خیلی بهتر خواهد بود. من سر فرصت برنامه نوشته شده خودم را که فعلا خیلی کثیف نوشته شده است را ویرایش میکنم و در همین جا قرار میدهم.

----------


## pesarkhobeee

راستش حلال که شما بخشهای اصلی برنامه رو که باید درست بشن یا بهبود بیابن گفتید من هم لازم دیدم تا به چند نکته اشاره کنم!
روال های اصلی که در کلاس دیکشنری برنامه وجود داره به شرح زیره:

HtmlReceiver()
HtmlProcessor()
NewCodeGenerator()
Cuter(a As Variant)
[/LTR]
حالا تک تک به شرح وظائف اونها میپردازم تا رابطشون با اون سه قسمتی که مشخص کردید معلوم بشه!
البته من دارم از روی ویرایش 0.0.2 برنامه اینها رو میگم که در چند قسمت به طور اساسی با ویرایش قبلی فرق کرده که در پایین اشاره خواهم کرد.
--------------------------------------------------------------------------------------------------
HtmlReceiver()
این روال دو وضیفه اصلی رو به دوش میکشه
1.	گرفتن کدهای HTML که به علت استفاده از

interface.brwWebBrowser.Document.Body.InnerHtml()

نمی تواند کدهای بالای تگ BODY را بگیرد و این از مشکلات برنامه است!
2.	ایجاد فاصله بین علائم نوشتاری و کلمات برای رفع مشکل معنی کردن این کلمات مانند

Htmlcode = Replace(Htmlcode, ".", " . ")


-----------------------------------------------------------------------------------------------
HtmlProcessor()
این روال به جدا کردن کلمات از لابلی تگ ها و فرستادن اونها برای معنی کردن میپردازه!
توجه داشته باشید که:



> -بخش دوم body را بگیرد و بخش های دارای متن آن را مشخص کند.بخش های دارای متن معمولا تا جایی که من پرس و جو کردم معمولا بین دو >< قرار دارند.


کاملا اشتباه! چون ممکنه بین >< اجزای یک فرم باشه یا چیز دیگه که به متن مربوط نیست! برای حل این مشکل من در ویرایش دوم در این روال مکانیزمی رو تعبیه کردم تا تگ هایی رو که به متن ربط داره تشخیص بده و برای معنی کردن بفرسته.
-----------------------------------------------------------------------------------------------

NewCodeGenerator()
در اینجا برنامه به پرس و جو از بانک اطلاعاتی میپردازه و معانی رو برای قرار گرفتن در کمبوباکس اماده میکنه
----------------------------------------------------------------------------------------------
Cuter(a As Variant)
 این روال کل معانی یک کلمه رو گرفته و هر معنی رو در یک خانه کمبو باکس قرار میده


همون طور که میبینید تمام اون سه بخشی که گفتید تعبیه شده ولی نیاز به کامل و بالغ شدن داره.
من همیشه عقیده داشتم این سایت بهترین فرمه :متفکر:  :متفکر:  ولی در خصوص اداره ی برنامه های اوپن سورس قابلیت کمی داره!  :خیلی عصبانی:  :خیلی عصبانی: برای همین اگر هر کس رو یکی از روال های بالا کار کنه از دوباره کاری جلوگیری میشه ! همچنین به دلیل خاصیت شیع گرایی کلاسها این روالهل خیلی کم به هم ربط دارن پس هر کسی میتونه روش خودشو در روالی که روش داره کار میکنه به کار ببره و طرف مقابل لزوما نباید از اون سر در بیاره!

----------


## hariva

بین ><  کدام اجزای فرم قرار دارد و علامت مشخصه ی اینها چیست. اگر هرچیزی غیر از تگ باشد اصولا در روال مشخص نمیشود.

----------


## pesarkhobeee

من نمیدونم شما از رو چی این رو گفتین!
ولی برنامه من با جمع کردن دونه به دونه حرف ها و تشکیل کلمه ها ! اونا رو برای معنی کردن میفرسته و اگه این حرفها وکلمه بین دو تگ غیر متنی باشه هم در نسخه اول فرقی براش نمیکرد و دستور معنی کردن اون رو میداد!

----------


## hariva

ببخشید که خیلی دیر به اینجا سر زدم
جمع کردن دونه دونه ی حرفها فکر نکنم زیاد ایده یخوبی باشه.استفاده از تابع split که خیلی بهتره

----------


## pesarkhobeee

از راهنماییتون ممنونم.
فقط من نمیدونم این تابع چی هست؟
میشه بیشتر توضیح بدین و اگه میشه یه مثال بزنید!

----------


## hariva

spite یک تابع است که کلمات یک متن را جدا کرده و در درون یک متغیر آرایه ای قرار میدهد



txt="ali is a student"
Arr = Split(txt)




نتیجه این تابع این میشود که متغیر Arr شامل چهار عضو بشود که هر کدام یکی از واژه های جمله txt می باشند.

----------


## am 241

من تازه این تاپیک رو دیدم  :متفکر: 
از اول دنبال کردم به این نتیجه رسیدم که اگه شما ها اجازه بدین منم روش کار کنم 
با اجازه بزرگترها :
اولین پیشنهاد : چون این برنامه تک تک حروف رو میخونه سرعتش کمه پس بهتره کلمه ای بخونه
که من الان روش کار میکنم خبرشو بهتون میدم :چشمک:

----------


## pesarkhobeee

سلام
من فکر میکنم که داریم همگی یه کار میکنیم ! با شروع شدن دانشگاها و مدارس دیگه وقت زیادی در اختیار هیچ کدوممون نیست ! پس بییاین برای یه بار هم شده سعی در هم کاری و کار گروهی درست بکنیم!
من فکر میکنم الان هممون در مورد تابع split کار می کنیم ! من یه برنامه کوچولو نوشتم که بتونم  خروجی مورد نظر یعنی کلمات رو برای دیکشنری بگیره که از دو تا جعبه متن و یه دکمه استفاده میکنه!
متن برنامه:

Private Sub Command1_Click()
Dim Htmlcode As String
Htmlcode = Text2.Text
'========================
Htmlcode = Replace(Htmlcode, ".", " . ")
Htmlcode = Replace(Htmlcode, "?", " ? ")
Htmlcode = Replace(Htmlcode, "!", " ! ")
Htmlcode = Replace(Htmlcode, "“", " “ ")
Htmlcode = Replace(Htmlcode, ",", " , ")
Htmlcode = Replace(Htmlcode, "”", " ” ")
Htmlcode = Replace(Htmlcode, "'", " ' ")
Htmlcode = Replace(Htmlcode, ":", " : ")
Htmlcode = Replace(Htmlcode, "=", " = ")
Htmlcode = Replace(Htmlcode, "/", " / ")
'========================
Dim a() As String
a() = Split(Htmlcode)
'========================
For x = LBound(a) To UBound(a)
Text1.Text = Text1.Text & " - " & a(x)
Next
End Sub



و ورودی داده شده: 


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<p>HI</p>
<p>this is a sample page</p>
<p>&nbsp;  </p>
</body>
</html>



و خروجی گرفته شده:


 - < - ! - DOCTYPE - HTML - PUBLIC - "- - / -  - / - W3C - / -  - / - DTD - HTML - 4 - . - 01 - Transitional - / -  - / - EN"
"http - : -  - / -  - / - www - . - w3 - . - org - / - TR - / - html4 - / - loose - . - dtd">
<html>
<head>
<title>Untitled - Document< - / - title>
<meta - http-equiv - = - "Content-Type" - content - = - "text - / - html; - charset - = - iso-8859-1">
 


همون طور که مشاهده میشه این کدها نمیتونه خروجی مورد نظر رو به ما بده ! حالا پیشنهاد شما چیه؟

----------


## hariva

پیشنهاد من اینه که.

اول بخش های متن دار را با یک تابع جدا کنیم.یعنی بخش های زیر در کد نمونه شما

یعنی اینها

hi

thise is a sample page

nbsp;  

سپس در مرحله بعدی هر کدام از این بخشها به بخش کد جدید ساز برود

در بخش کد جدید ساز بوسیله تابع splite کلمه های متن تفکیک شده و هرکدام ترجمه شود و کد جدید جایگزین کلمه شود
برنامه نویسی بخش اول تا حدودی کار مشکلی شده است.دو تابع وجود دارد که یکی مال من است و دیگری از جناب پسر خوبه که متاسفانه هردو دارای ایراداتی هستند.البته مال من بهتر است  :لبخند گشاده!:

----------


## pesarkhobeee

سلام
ببخشید میشه شما هم یه کد کوچولو بنویسید تا ایدتونو به طور عملی نشون بده!مخصوصا بخش اولشو
ممنون

----------


## hariva

چشم این هم از کد



    Public Sub htmlProcessor(ByVal html As String)


        'amade sazi matn ghabl az hame
        Select Case SourceLang
            Case "Farsi"
                NewHtml = Replace(NewHtml, "ی", "ی")
                NewHtml = Replace(NewHtml, "ک", "ک")

        End Select


        Dim start As Integer

        Dim length As Integer

        Dim newcode As String

        'find body location
        '========================
        BodyStart = InStr(1, html, "<body", CompareMethod.Text)
        BodyFinish = InStr(1, html, "</body>", CompareMethod.Text) + 6
        Body = Mid(html, BodyStart, BodyFinish - BodyStart + 1)


        '========================
        NewHead = Mid(html, 1, BodyStart - 1)

        NewBody = Body
        '========================
        i = 1
        Do
            TagStart = InStr(i, NewBody, "<")
            TagFinish = InStr(i, NewBody, ">")

            Select Case TagStart - TagFinish



                Case 1 ' Body="    ><i...."
                    i = TagStart + 1

                Case Is > 0         ' Body="   >matin<i      ......"


                    start = TagFinish + 1
                    length = TagStart - TagFinish - 1

                    newcode = NewCodeGenerator(Mid(NewBody, start, length))
                    NewBody = Mid(NewBody, 1, start - 1) & newcode & Mid(NewBody, start + length)
                    i = start + Len(newcode) + 2

                Case 1 - TagFinish  ' Body="<        >matin<i..."

                    TagStart = InStr(TagFinish, NewBody, "<")

                    start = TagFinish + 1
                    length = TagStart - TagFinish - 1

                    newcode = NewCodeGenerator(Mid(NewBody, start, length))

                    NewBody = Mid(NewBody, 1, start - 1) & newcode & Mid(NewBody, start + length)


                    i = start + Len(newcode) + 1


                Case Is < 0   ' Body="i    >"

                    i = TagFinish + 1

            End Select


            TagStart = 0
            TagFinish = 0

        Loop Until i > Len(NewBody)




        NewHtml = NewHead & NewBody




    End Sub


Public Function NewCodeGenerator(ByVal txt As String) As String

      

                txt = Replace(txt, "0", "۰")
                txt = Replace(txt, "1", "۱")
                txt = Replace(txt, "2", "۲")
                txt = Replace(txt, "3", "۳")
                txt = Replace(txt, "4", "۴")
                txt = Replace(txt, "5", "۵")
                txt = Replace(txt, "6", "۶")
                txt = Replace(txt, "7", "۷")
                txt = Replace(txt, "8", "۸")
                txt = Replace(txt, "9", "۹")


        txt = Replace(txt, "!", " ! ")
        txt = Replace(txt, "؟", " ؟ ")
        txt = Replace(txt, ".", " . ")
        txt = Replace(txt, "،", " ، ")
        txt = Replace(txt, ":", " : ")

        txt = Replace(txt, "(", "( ")
        txt = Replace(txt, ")", " )")



        txt = CompleteTrim(txt)


        Dim NCd As String

        Dim WordArr() As String


        WordArr = Split(txt)



        If first = False Then

            idx = 0
            ReDim words(1, UBound(WordArr))
            first = True

        Else

            ReDim Preserve words(1, idx + WordArr.GetUpperBound(0))

        End If


        For i = 0 To WordArr.GetUpperBound(0)
            words(0, i + idx) = WordArr(i)
            NCd = NCd & "<X>" & i + idx & "</X>"

        Next


        idx = idx + WordArr.GetUpperBound(0) + 1

        Return NCd

    End Function

----------


## pesarkhobeee

سلام
کد شما با vb6 من چند تا مشکل داره!
اولیش CompareMethod.Text در 
BodyStart = InStr(1, html, "<body", CompareMethod.Text)
است ! چون vb در اینجا سه حالت از پیش تعیین شده بیشتر نمیگیره!
دوم 
txt = CompleteTrim(txt)
است که  CompleteTrim در  کد داده شده نیست!
و سوم 
Return NCd
که در کد قبلیتون هم بود و vb اینو قبول نداره!
بهر حال فکر کنم شما از نت بهره می برید و من خواهش میکنم مثل من یه ورودی به برنامتون بدید و خروجی اون رو هم مثل من در این جا بگذارید تا ما اثر واقعی برنامتون رو ببنیم.

----------


## am 241

من هم کامپیوترم ویروسی شده هم دانشگاه تمام وقتم رو گرفته آخه ترم آخرو پروژه و هزارتا مشکله دیگه 
به نظر من باید تگهای معروف رو که میتونه توش متن قرار بگیره رو شناسایی کرد و در برنامه ذخیره کرد تا لازم نباشه از اول تا آخرو بخونه
مثل این
dim p as string
p="<p>"
 و هرگاه به این تگ رسید بره و توش رو بخونه الان یادم نمیاد چه دستوری داخل یک متن رو سرچ میکرد اما فکر کنم instr بود
t=instr(HTML,p,1)

----------


## pesarkhobeee

سلام
من بلاخره یه کد تقریبا خوب با split نوشتم.
این کدمه:

Option Explicit

Private Sub Command1_Click()
Dim Htmlcode As String
Dim AllowDic As Boolean
Dim text As Boolean
Dim x As Integer
Htmlcode = Text2.text
'========================
Htmlcode = Replace(Htmlcode, ".", " . ")
Htmlcode = Replace(Htmlcode, "?", " ? ")
Htmlcode = Replace(Htmlcode, "!", " ! ")
Htmlcode = Replace(Htmlcode, "“", " “ ")
Htmlcode = Replace(Htmlcode, ",", " , ")
Htmlcode = Replace(Htmlcode, "”", " ” ")
Htmlcode = Replace(Htmlcode, "'", " ' ")
Htmlcode = Replace(Htmlcode, ":", " : ")
'Htmlcode = Replace(Htmlcode, "=", " = ")
'Htmlcode = Replace(Htmlcode, "/", " / ")
Htmlcode = Replace(Htmlcode, "<", " <")
Htmlcode = Replace(Htmlcode, ">", "> ")
'========================
Dim a() As String
a() = Split(Htmlcode)
'========================
For x = LBound(a) To UBound(a)

If (a(x) Like "<*>") = True Then
AllowDic = False
text = False
Else
text = True
End If

Select Case a(x)
 Case "<pre>"
AllowDic = True
 Case "<hl>"
AllowDic = True
 Case "<h6>"
AllowDic = True
 Case "<b>"
AllowDic = True
 Case "<i>"
AllowDic = True
 Case "<tt>"
AllowDic = True
 Case "<cite>"
AllowDic = True
 Case "<em>"
AllowDic = True
 Case "<strong>"
AllowDic = True
 Case "<p>"
AllowDic = True
 Case "<br>"
AllowDic = True
 Case "<blockquote>"
AllowDic = True
 Case "<dl>"
AllowDic = True
 Case "<dt>"
AllowDic = True
 Case "<dd>"
AllowDic = True
 Case "<ol>"
AllowDic = True
 Case "<li>"
AllowDic = True
 Case "<ul>"
AllowDic = True
Case Else

    If (a(x) Like "<div*>") = True Then
     AllowDic = True
     ElseIf (a(x) Like "<p*>") = True Then
     AllowDic = True
    ElseIf (a(x) Like "<font*>") = True Then
    AllowDic = True
     End If

 End Select
 


If AllowDic = True And text = True Then
Text1.text = Text1.text & " - " & a(x)
End If

Next

End Sub



این ورودیه:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<p>farid is pesarkhobeee </p>
<p class="style1">yes</p>
<p class="style1"><a href="http://google.com" title="google.com" target="_blank">google</a></p>
<table width="200" border="1">
  <tr>
    <th scope="row">1</th>
    <td>4</td>
    <td>a</td>
  </tr>
  <tr>
    <th scope="row">2</th>
    <td>5</td>
    <td>b</td>
  </tr>
  <tr>
    <th scope="row">3</th>
    <td>6</td>
    <td>c</td>
  </tr>
</table>
<p>November 10, 2007</p>
<p>&nbsp;</p>
</body>
</html>



اینم خروجیه:


- farid - is - pesarkhobeee -  - November - 10 - , -  - 2007 - &nbsp;


فقط تو بعضی صفحات خیلی بزرگ دچار اشکال میشه!
نظر شما چیه؟

----------


## pesarkhobeee

خب بلاخره بعد از مدتها نسخه سوم از این برنامه هم اماده شد! :قهقهه:  :قهقهه:  :قهقهه: 
البته فکر کنم اخرین نسخه ای باشه که از این ایده ! من ساختم و در اون الگوریتم تشخیص متن رو عوض کردم که موجب بهبود چشمگیر سرعت معنی کردن شده که یکی از مشکلات اصلی برنامه بود.
این مدت هم درگیر دانشگاه بودم که نتونستم زودتر اینو تحویل بدم! ولی میخوام از تمام کسانی که تو این مدت من رو یاری کردن تشکر کنم .
مخصوصا یک تشکر مخصوص از هریوا ! :لبخند:  :لبخند:  :لبخند: 
البته فکر نکنید که برنامه دیگه مشکل نداره! توصیه میکنم رو صفحات متوسط امتحانش کنید تا به مشکل بر نخورید!
کل هدف این تایپیک نشان دادن یک ایده نو در دیکشنری ها بود که فکر میکنم نسخه سه این هدف رو تامین کرد!
بیشتر از این نمی تونم رو این برنامه وقت بزارم چون سرم خیلی شلوغ تر شده و فکر میکنم فکر های خیلی بهتری هم دارم!
در اخر تمام کدهای این برنامه رو تحت لیسانس LGPL به جامعه متن باز تقدیم میکنم. :خجالت:  :خجالت:  :خجالت:

----------


## aidin1386

دوست عزیز این زیاد فکر خوبی نیست که به همین زودی جا بزنی! :عصبانی: 
من برنامه رو دارم دانلود می کنم و می خوام بدونم آیا مایل هستی که به کمک برخی از دوستان این سایت که در انگلیسی پیشقدم هستن یک دیتا بیس درست کنیم که تقریباً تمام اصطلاحات، ضرب الامثل ها، فریزها و کلاز ها و ... تو اون جمع آوری شده. :متفکر: 

فکر کنم :متفکر: فکر خوبی باشه! چند نفره می شه. البته بستگی به خودت داره! در این صورت نه تنها اون کمبوباکس ها از بین می رن بلکه سرعت هم چند برابر می شه!

در هر صورت، ایدت عالی بود. :تشویق:

----------


## pesarkhobeee

|از تعریفت ممنونم.
گفتی که به همین زودی جا زدم! شاید درست بگی ! ولی اگه دیدی غیر من تا حالا کسی از این پروژه حمایت جدی کرده اون وقت من بازم حاضرم رو این پروژه کار کنم!
بهر حال من ایدمو نشون دادم که اصلش همون کمبو باکسا بود . حالا شما میفرمایید اون کمبو باکس ها در صورت داشتن یه دیتابیس خوب خذف میشن!!!!
چه جوری؟ چون در واقعیت یه کلمه چند معنی داره و ما نمیدونیم در متن مورد نظر کدوم درسته!!!
خلاصه امیدوارم موفق باشید و کدهای من هم بتونه کمکتون کنه ولی من تا اخر امتحانای این ترم قصد تجدید نظر ندارم!

----------


## EMANOEL

با تشکر  :تشویق:  :تشویق:

----------


## iranmdp

دوست عزیز فکر استفاده از combobox برای معنی کردن جالبه ولی بهتر نیست که چند دیتابیس با عنوان های مختلف به طور مثال کامپیوتر ، معماری و.. درست کنی بعد نرم افزار قبل از ترجمه در درجه ی اول عنوان و در درجه ی دوم متن سایت را بخواند و اگر به طور مثال کلمات در ارتباط با کامپیوتر در آن زیاد بود متن را با استفاده از دیتابیس کامپیوتر ترجمه کنه .
نوشتنش هم خیلی راحته .
اگه خواستین این رو هم بهش اضافه کنین در خدمت هستیم

----------


## Sundown

سلام
اولا چند تا پیشنهاد :
ببین نمیتونی از بانک اطلاعاتی انگلیسی به فارسی بابیلون استفاده کنی؟ (خیلی کامل هستش)
ثانیا :
به نظر من با یه زبان دیگه مثل سی شارپ یا جاوا ادامه بدید بهتر نیست ؟ (هر چی کر رو نگاه کردم نتونستم دلیل قانع کننده ای برای استفاده از VB پیدا کنم )


در ضمن یه توضیحی بدم این روشی که به کار بردید یعنی هر کلمه توی یه کمبو نمایش داده بشه از چند جهت خیلی مورد قبول نیست ( هر چند به طور کامل می دونم که درست کردن چیزی غیر از این آسان نیست )اولا چون هر کمبو باید لود بشه سرعت به شدت کاهش پیدا میکنه .دوما ظاهر برنامه پس از ترجمه اصلا جالب از آب در نمیاد . سوما : نمی تونستید توی بانک برای هر کلمه یه معنی بنویسید که نیازی به استفاده از کمبو و نمایش همه ی معانی نداشته باشد

در ضمن چرا هم کلمات انگلیسی و هم کلمات فارسی رو در یه جدول قرار ندادید تا راحت تر باشید (درست هست که سرعتش خیلی تغییر نمیکنه ولی توی برنامه های این چنینی یه ثانیه هم یه ثانیه هست دیگه)

راستی بانک برنامه رو از جایی آوردید یا خودتون ساختین (اگه خودتون ساختید که بابا ایول به این حوصله )

بچه ها با اجازتون من از بانک شما استفاده کردم خیلی به دردم خورد( راضی باشیدا        اون دنیا جلومون رو نگیرید  :چشمک:  )

ولی حتی اگه این برنامه خوب از آب در نیاد اگه بتونید حداقل بانک برنامه رو روز به روز بهتر کنید واقعا عالی میشه ( حداقل چشم بابیلون درآد که دیکشنریش رو دم دقیقه Expird میکنه )
به نظر من اگه گروهی بتونید بانک رو گسترش دهید خیلی خوب میشه ( مثلا هر کی یه 10 صفحه از آکسفورد رو بهش اضافه کنه چی میشه ؟!عالی                  راستی اسمش رو هم بذارید دیکشنری گلابی

----------

