PDA

View Full Version : سوال: تشخیص زبان متن



milade
شنبه 05 بهمن 1387, 15:15 عصر
سلام
ببخشید من یه Textbox دارم که داخلش کاربر یه متن مینویسه .
حالا میخوام زبان متن رو تشخیص بدم ، حالا چه فارسی ، انگلیسی و ...
اولا اگه دارید یه نمونه کد بیدید
اگه هم نه کلاسش رو بگید تا خودم استفاده کنم .
(نظر خودم کد اسکی هست . این چه طوره؟)
ممنون از همگی

nokhodsiah2001
یک شنبه 06 بهمن 1387, 12:00 عصر
سلام عزیز
فکر کنم با تشخیص زبان کی بورد مشکلت حل می شه البته من ابتدا برنامه زبان رو فارسی میکنم ولی تا حالا سعی نکردم مثل شما عمل کنم
اینو ببین



Public Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Integer) As Integer


برای فارسی کردن کی بورد هم از این استفاده میکنم



LoadKeyboardLayout("00000429", 1)


نمی دونم به دردتون می خوره یا من اشتباه متوجه شدم

milade
یک شنبه 06 بهمن 1387, 12:08 عصر
با تشکر از شما
اما فکر کنم بد عنوان کردم
ببینید کاربر یه متن رو که من نمیدونم چی هست مثلا از یه جایی کپی میکنه ( مثلا چینی )
خوب حالا حتما الزام نیست که کیبورد هم چینی باشه چون در حد یه کپی و paste هستش
خوب حالا میخوام برنامه بتونه تشخیص بده زبان چیه !
با تشکر فراوان

minamorad
یک شنبه 19 اردیبهشت 1389, 14:01 عصر
سلام آقا ميلاد
اتفاقاً اين كاري كه شما مي‌فرماييد، همانند Auto Keyboard Switching از نرم‌افزارهاي Microsoft Office هست.
كاش مي‌توانستم كمكتون كنم. خودم هم خيلي دنبال جواب اين مسئله بودم، به صورت انگليسي و فارسي نيز در Google جستجو كردم و هيچي پيدا نكردم.
خودم يك راه حلي به نظرم رسيد كه حوصله نكردم آن را اجرا كنم. آن هم اين كه بايد يك روال يا ماژول بنويسيد و حروف مختلف از زبان‌هاي مختلف را در آن تعريف كنيد.
سپس اين روال هميشه بايد در حال جستجوي متن باشد. مثلاً با استفاده از تايمر مشخص نماييد كه اين روال هر چند ثانيه يا كمتر، متن موجود در محل Cursor را چك كند و اگر متن فارسي بود، Keyboard را با استفاده از كدي كه دوست عزيزمون دادند، فارسي كند و اگر انگليسي بود، انگليسي كنه.
براي زبان‌هاي ديگر هم همين طور.
اين تنها راه حلي است كه به ذهن من مي‌رسد.
اميدوارم كمكتون كنه.
خودم كه حوصله نكردم اين طرح را پياده كنم.
البته اين توضيح لازمه كه من در VB6 اين كار را مي‌خواستم انجام بدهم. شايد VB.Net خود به خود اين كار را انجام بده.
در ضمن اگر كسي اين كد را به هر شيوه‌اي، نوشت، خواهشاً در اختيار بقيه قرار بده كه خيلي لازمه.
در هر صورت، اميدوارم شما بتوانيد.

nafasak
یک شنبه 19 اردیبهشت 1389, 19:34 عصر
برای فارسی کردن کی بورد هم از این استفاده میکنم



LoadKeyboardLayout("00000429", 1)




سلام،

ببخشید کد بالا رو کجا باید نوشت ؟؟

minamorad
سه شنبه 28 اردیبهشت 1389, 14:44 عصر
با سلام به دوستان گرامي و عرض خسته نباشيد
ابتدا جواب جناب nafasak
همان طور كه دوست عزيزمون جناب nokhodsiah2001 فرمودند، شما بايد ابتدا كد زير را در ابتداي قسمت كد نويسي برنامة خودتان وارد كنيد. همة اين كد كاملاً در يك خط قرار مي‌گيرد. منظور از ابتداي قسمت كد نويسي را عرض مي‌كنم. شما روي Form دو بار كليك كنيد. صفحة كد نويسي باز مي‌شود. سپس در بالاترين قسمت آن، كه Declaration نام دارد، اين كد را Copy & Paste كنيد.





Public Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
Private Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long



سپس مي‌توانيد از كد زير در يك CommandBotton يا يك روال در هر جاي فرم براي تغيير زبان استفاده نماييد. فقط اين توضيح لازمه كه براي زبان فارسي از عدد "00000429" و براي زبان لاتين از عدد "00000409" استفاده نماييد.


LoadKeyboardLayout("00000429", 1)

خوب حالا از دوستان محترم و برنامه‌نويسان اين سايت شكايت دارم.
يعني يك نفر در اين سايت به اين بزرگي كه مرجع برنامه‌نويسان فارسي زبان در دنيا است، وجود ندارد كه قبلاً روي «تشخيص زبان متن» كار كرده باشد.
من كه خودم هر چه سعي كردم نتوانستم اين كار را انجام بدهم. از دوستان خواهشمندم اگر كسي هست، لطفاً جواب بده.
مي‌خواهم وقتي در يك TextBox، وقتي كاربر، روي متن داخل TextBox كليك كرد، برنامه خودش تشخيص بدهد كه زبان اين متن فارسي يا لاتين است. و سپس به طور خودكار زبان جاري صفحه كليد را عوض كند.
عوض كردن زبان كه در بالا آمده و دوستان در چندين پست مختلف آن را مطرح كردند. يك نمونه هم در همين پست وجود دارد.
اما «تشخيص زبان متن» به جواب نرسيده؟

قبلاً از كمك همة دوستان سپاسگزارم.

Mani_rf
سه شنبه 28 اردیبهشت 1389, 18:55 عصر
برای انجام این کار (اگر فقط دو زبان فارسی و انگلیسی مدنظر باشند) میتوانید از روش مقایسه کد های اسکی استفاده کنی.
نقطه شروع و پایان کد های اسکی در زبان های فارسی و انگلیسی با هم متفاوت است که میتوانید بررسی کنید که در صورتی که کد اسکی X در رنج کد های اسکی انگلیسی بود متن انگلیسی و اگر در رنج کد های فارسی بود، فارسی است. برای بالا بردن دقت عمل میتوانید تمام کاراکتر ها را چک کنید که در صورتی که از هر دوزبان استفاده شده بود برنامه به درستی پاسخ دهد.

minamorad
چهارشنبه 29 اردیبهشت 1389, 09:16 صبح
با سلام و تشكر فراوان، جناب Mani_rf

از اين كه جواب اينجانب رو داديد واقعاً متشكرم. ولي يك مشكلي هست، (البته در VB) و آن اين كه من نتونستم اين كار را انجام بدم. البته مدت زيادي روي اين مسئله فكر كردم. ولي به هيچ نتيجه‌اي نرسيدم.
البته، همان طور كه در پست 4 گفتم، مي‌خواهم كاري كنم كه تقريباً شبيه به Auto Keyboard Switching برنامة Microsoft Office بشه. يعني زماني كه روي هر كلمه يا حرف كليك مي‌كنيد، يا Cursor را در TextBox حركت مي‌دهيد، وقتي به كلمه‌اي از زبان ديگر مي‌رسيد، به صورت خودكار زبان را تشخيص بدهد و زبان را عوض كند.
شما برنامة نمونه داريد. آيا قبلاً براي اين كار كدي نوشته‌ايد؟
اگر نوشتيد، مي‌توانم خواهش كنم آن را براي استفاده قرار بدهيد.
اگر تمايل به ارائة كدتان نداريد، خواهش مي‌كنم بيشتر راهنمايي كنيد.

باز هم از راهنمايي شما سپاسگزارم.

naser_feb8646
چهارشنبه 29 اردیبهشت 1389, 16:59 عصر
سلام
خوب دوست عزیز شما از همان روشی که Mani_rf برای تعیین زبان استفاده کنید و در رویداد کلیک و چنج تکست باکس قرارش بدین و بعد با تشخیص نوع زبان صفحه کلید رو عوض کنید

minamorad
شنبه 01 خرداد 1389, 08:09 صبح
سلام مخصوص خدمت جناب Mani_rf
از راهنمايي خوبتون در پست 7 متشكرم

بعد از اين كه دوباره سعي كردم، توانستم برنامه‌اي بنويسم كه اين كار را انجام بده، ولي حالا به مشكلات ديگري برخورد كردم.
سورس كد (VB6) را با مقداري توضيح برايتان مي‌گذارم، لطفاً راهنمايي كنيد.

روال GetChar
اين روال از TextBox جاري، و از محل جاري مكان‌نما يك حرف را انتخاب مي‌كند، در صورتي كه حرف مساوي با يكي از حروف زير بود، بدون انجام هيچ عملي و بدون تغيير زبان، از روال خارج مي‌شود.
حروف ممنوع: ".:!@#$%^&*()_+-=<>/\|" و حرف فاصله يا Space " " (جمعاً 22 حرف)
توضيح: چون اين حروف به صورت پيش‌فرض در VB6 به صورت لاتين شناخته مي‌شوند، به همين دليل به محض تشخيص آنها، دستور Exit را قرار دادم. اگر كسي پيشنهاد يا راه حل بهتري دارد، لطفاً ارائه نمايد.
در صورتي كه حرف انتخاب شده، ممنوع نبود، آن حرف به روال FindCharAsciiCode ارسال مي‌شود.

در ضمن به جاي lblCursorPosition.Caption عبارت txtText.SelStart را وارد نماييد.



Public Sub GetChar()
Dim lngStart As Long
Dim lngEnd As Long
Dim strChar As String

If txtText(intID).Text = "" Then
Exit Sub
End If

lngStart = CLng(Val(lblCursorPosition.Caption))
lngEnd = Len(txtText(intID).Text)

If lngStart >= lngEnd Then
lngStart = lngEnd - 1
End If

strChar = Mid(txtText(intID).Text, lngStart + 1, 1)

If strChar = " " Or strChar = "." _
Or strChar = ":" Or strChar = "!" _
Or strChar = "@" Or strChar = "#" _
Or strChar = "$" Or strChar = "%" _
Or strChar = "^" Or strChar = "&" _
Or strChar = "*" Or strChar = "(" _
Or strChar = ")" Or strChar = "_" _
Or strChar = "+" Or strChar = "-" _
Or strChar = "=" Or strChar = "<" _
Or strChar = ">" Or strChar = "/" _
Or strChar = "\" Or strChar = "|" Then
Exit Sub
End If

FindCharAsciiCode strChar
End Sub


روال FindCharAsciiCode
اين روال حرف دريافت شده را در دو حلقة For بررسي مي‌نمايد. اگر كد اسكي اين حرف، با عدد شمارندة حلقه (يعني lngLatin يا lngFarsi) برابر بود، متغير بولين كه قبلاً در قسمت Declaration مربوط به Form تعريف شده، متناسب با كد حرف و زبان مورد نظر True يا False مي‌شود.
در اين برنامه نام اين متغير بولين blnFarsi است. اگر حرف مورد نظر لاتين بود، اين متغير False و اگر فارسي بود، True مي‌شود.
سپس روال Language اجرا مي‌شود.




Public Sub FindCharAsciiCode(ByVal Char As String)
On Error Resume Next

Dim lngLatin As Long
Dim lngFarsi As Long

For lngLatin = 32 To 128
If Asc(Char) = lngLatin Then
blnFarsi = False
End If
Next lngLatin

For lngFarsi = 129 To 254
If Asc(Char) = lngFarsi Then
blnFarsi = True
End If
Next lngFarsi

Language
End Sub


روال Language
اين روال با يك حلقة شرطي IF غلط (False) يا درست (True) بودن متغير blnFarsi را بررسي مي‌نمايد.
اگر متغير blnFarsi برابر False باشد، زبان صفحه كليد با استفاده از تابع API با نام LoadKeyboardLayout لاتين مي‌شود و اگر True باشد زبان صفحه كليد فارسي مي‌شود.




Public Sub Language()
If blnFarsi = False Then
lblLanguage.Caption = strEn
LoadKeyboardLayout "00000409", 1
ElseIf blnFarsi = True Then
lblLanguage.Caption = strFa
LoadKeyboardLayout "00000429", 1
End If
End Sub



راستي، كامپيوترم ويروسيه، وگرنه Source مي‌گذاشتم.
از كمك و راهنمايي‌هاي همة شما سپاسگزارم.

minamorad
سه شنبه 04 خرداد 1389, 08:58 صبح
سلام

يعني يك نفر هم پيدا نشد كه برنامة من را تست كند و انتقادي، پيشنهادي چيزي داشته باشد.

از شما دوستان عزيز خواهش مي‌كنم.
من مبتدي هستم و خيلي به برنامه‌نويسي وارد نيستم!
اگر شما كمكم نكنيد و انتقاد و پيشنهاد ندهيد، در آينده نمي‌توانم برنامه‌نويس خوبي باشم.

پس بي‌صبرانه خواهش مي‌كنم، برنامه پست قبل را تست كنيد.

اميد من، اول به خداست بعد هم به شما.

متشكرم.:قلب:

Mani_rf
سه شنبه 04 خرداد 1389, 16:43 عصر
شما برای این کار کافی است زمانی که مکان ، مکان نما عوض شدن حرف قبلی و بعدی آن را چک کنی تا بتوانی زبان مورد نظر را بیابی و زبان کیبرد را عوض کنی.
من متوجه نشدم با VB6 کار میکنی یا با VB.NET؟

minamorad
چهارشنبه 05 خرداد 1389, 07:04 صبح
سلام به همة دوستان و جناب Mani_rf

از اين كه مجدداً شما اولين نفري هستيد كه به كمك بنده آمديد، از شما ممنونم.
البته من هر چه سعي كردم، فقط توانستم حرف بعدي مكان‌نما را بخوانم و چك كنم. توي برنامه‌اي كه گذاشتم امتحان نماييد، متوجه مي‌شويد. به راهنمايي شما و همة دوستان محتاجم.

چون، توي كل سايت برنامه‌نويس به دنبال «تشخيص زبان متن» گشتم و چيزي پيدا نكردم، و فقط همين يك تاپيك را پيدا كردم، به خاطر همين مجبور شدم سئوالم را اينجا مطرح كنم.

من با زبان VB6 كار مي‌كنم. باز هم عذر مي‌خواهم اگر سئوال من از يك زبان قديميه. مي‌دانم كه نبايد در تاپيك مخصوص VB.Net سئوال VB بپرسم. خواهش مي‌كنم به بزرگواري خودتان ببخشيد.

در ضمن خدمت همه عرض مي‌كنم كه Source با آنتي ويروس جديد McAfee و به روز چك شده و آن را براي تست در اختيار دوستان قرار مي‌دهم.:لبخندساده:

متشكرم:قلب:

minamorad
سه شنبه 11 خرداد 1389, 07:02 صبح
سلام :خجالت:

خيلي شرمنده‌ام كرديد با تمام نظرها، انتقادات و پيشنهادات سازنده‌تان.:لبخند:

خواهش مي‌كنم هر كس اين برنامه را تست كرده، هر انتقادي يا پيشنهادي براي بهتر شدن برنامه دارد، بگويد.
من منتظر نظر همة دوستان در اين مورد هستم.
تو رو خدا من رو بيشتر از اين منتظر نگذاريد.

متشكرم. :قلب:

minamorad
پنج شنبه 13 خرداد 1389, 05:48 صبح
سلام.

خودم يك مشكل پيدا كردم. ولي راه حلي ندارم. با توجه به Source كه در اختيارتان قرار گرفته، لطف كنيد راهنمايي كنيد.
مشكل: وقتي Cursor در يك كلمة فارسي قرار دارد، اگر كليدهاي Alt+Left Shift را بزنيد. به صورت اتوماتيك، مجدداً زبان به فارسي تغيير مي‌كند! كسي راه حلي نداره.
البته يك راه حل هست، و آن هم اين كه دستورات داده شده در رويداد Timer را حذف كنم. ولي با اين كار ديگه «تشخيص زبان متن» تقريباً از كار مي‌افته.
لطفاً راهنمايي كنيد.

متشكرم. :قلب:

minamorad
دوشنبه 17 خرداد 1389, 07:43 صبح
سلام

تا به حال اين قدر از بي‌جواب ماندن خوشحال نشده بودم. چون الآن فكر مي‌كنم برنامه‌نويس از من حرفه‌اي‌تر پيدا نمي‌شه كه نتونسته يك اشكال از اين برنامه بگيره. :لبخند:

جاي تعجب داره كه بنده خودم سئوال مطرح مي‌كنم و خودم هم بايد دنبال جوابش باشم. :قهقهه:

خواهش مي‌كنم كمك كنيد. انتقاد، پيشنهاد، ايراد يا اشكال برنامه را به من بگوييد.

متشكرم. :قلب: