الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف لي ان اعرف ان لغة الشاشه عربيه او انجليزيه

بدأه shalwan في 11 أبريل 2010 · 10 رد · 1,247 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني:

كلا منكم يعرف كيف يغير لغه النظام (shift+alt) سواءا عربيه او اجنبيه

سؤالي هنا

(بدلت من العربي الى الأجنبيه او العكس كيف لي ان اعرف اللغة الحاليه)

وفي الفورم من الداخل اضع(application.bidikeyboard:='00000401')

او (application.bidikeyboard:='00000409') الى الأجنبيه

لكن لا يوجد علامه او اعلام لي بشكل اللغه مثل الويندوز(EN او AR)

تم تعديل هذه المشاركة بواسطة shalwan في 11 أبريل 2010 في 17:49

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

#2

وين الفريق لم يرسل حلا

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

#3

إن كنت تبحث عن اللغة المحددة لتطبيق معين (مثلاً فتحت نسختين من المفكرة في الأولى قلبت الكتابة للغة العربية وفي الثانية للانكليزية) وتريد أن تحدد اللغة الخاصة بالأولى... استخدم Windows API:

GetWindowThreadProcessId بعد أن تقوم بتمرير مقبض النافذة النشطة لها وتحصل على Thread Process ID بالنتيجة. (بالتالي يمكنك تنفيذ العملية على برنامجك أو أي برنامج آخر)

(بالأسمبلي)

invoke GetWindowThreadProcessId,hCurrentWindow,NULL

ومن ثم تستدعيGetKeyboardLayout

invoke GetKeyboardLayout,eax

حيث eax هو الـ Thread Process ID الذي حصلت عليه من الدالة السابقة، وتحصل من التنفيذ على الـ input locale identifier الخاص بتلك النافذة (كل نافذة تملك locale منفصل عن الأخرى وهو ما تحتاجه أنت لا أكثر)

الـ local identifier يتكون كالتالي:

post-7008-12725304670101_thumb.png

ما يهمنا هو الـlanguage identifier

القيمة التي ستحصل عليها في الـ LOWORD من القيمة المعادة من GetKeyboardLayout هي الـ language id والتي تستطيع تمييزها من الجدول في الرابط السابق إلى اليسار.

يمكنك تحديد إحدى اللغات التي تريد (عربي / انكليزي)

بالتوفيق وعذراً على عدم كتابة شئ للدلفي.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

شكرا اخي xacker

ولكن سؤالي يخص برنامج بالدولفي

ارغب وضع بانيل ينغير عنوانها بنغير اللغه كلما غيرت انا اللغه

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

#5
shalwan كتب:

اخواني:

كلا منكم يعرف كيف يغير لغه النظام (shift+alt) سواءا عربيه او اجنبيه

سؤالي هنا

(بدلت من العربي الى الأجنبيه او العكس كيف لي ان اعرف اللغة الحاليه)

وفي الفورم من الداخل اضع(application.bidikeyboard:='00000401')

او (application.bidikeyboard:='00000409') الى الأجنبيه

لكن لا يوجد علامه او اعلام لي بشكل اللغه مثل الويندوز(EN او AR)

وين التاس من هذا الطلب ليس صعب بالنسبة لكم اما انا فلم اجدله حلا اسعفونا بالحلول حفظكم الله

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

#6

لم أشاهد الموضوع إلا اليوم , جيد أنك متابع للموضوع وقمت برفعه للأعلى وإلا لضاع بين المواضيع الأخرى

هناك طريقة تعتمد على الـ local hook وممكن تعميمها بعمل global hook وبذا يكون لديك Input Language Monitor ..

سأضع الكود هنا وإن وجدت أي مشكلة ضع تساؤلك وإن شاء الله الاعضاء في المنتدى ما يقصرون ...

var
  Form1: TForm1;
  CurrentHook: HHook;
  HookInstalled: boolean;

function SetupLocalHook: boolean;
function RemoveLocalHook: boolean;
function CallWndProc(code: integer; wParam: word; lParam: longword): longword; stdcall;

في OnCreate التابعة للـ Form نقوم باستدعاء SetupLocalHook ليتم إنشاء وبدء عمل الـ local hook

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
if not SetupLocalHook then
  ShowMessage('Local hook setup error!!');
end;

في OnDestroy التابعة للـ Form نستدعي RemoveLocalHook ليتم إيقاف والتخلص من hook .

procedure TForm1.FormDestroy(Sender: TObject);
begin
if not RemoveLocalHook then
  ShowMessage('Local hook removal error!!');
end;

وهنا الكود الخاص بدوال الـ hook

function SetupLocalHook: boolean;
begin
  CurrentHook:=setwindowshookex(WH_CALLWNDPROC,@CallWndProc,0,GetCurrentThreadID());
  if CurrentHook<>0  then SetupLocalHook:=true else SetupLocalHook:=false;
end;

function RemoveLocalHook: boolean;
begin
    RemoveLocalHook:=UnhookWindowsHookEx(CurrentHook);
end;

function CallWndProc(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
    if code<0 then
    begin
       CallWndProc := CallNextHookEx(CurrentHook,code,wParam,lparam);
       Exit;
    end;
    if (PCWPStruct(lParam).message=WM_INPUTLANGCHANGE ) then
    begin
      Form1.Label1.Caption:=inttohex(PCWPStruct(lParam).lParam,8);
    end;
    CallNextHookEx(CurrentHook,code,wParam,lparam);
    CallWndProc:=0;
    Exit;
end;

بعد جملة الشرط

if (PCWPStruct(lParam).message=WM_INPUTLANGCHANGE ) then

يمكنك إضافة الكود الخاص بك . راجع الوصلة التي أشار إليها X بخصوص الـ Language ID

إستخدام الـ subclassing قد يؤدي نفس الغرض ...

تم تعديل هذه المشاركة بواسطة YaSeenTA في 9 يونيو 2010 في 10:54

#7
YaSeenTA كتب:

لم أشاهد الموضوع إلا اليوم , جيد أنك متابع للموضوع وقمت برفعه للأعلى وإلا لضاع بين المواضيع الأخرى

هناك طريقة تعتمد على الـ local hook وممكن تعميمها بعمل global hook وبذا يكون لديك Input Language Monitor ..

سأضع الكود هنا وإن وجدت أي مشكلة ضع تساؤلك وإن شاء الله الاعضاء في المنتدى ما يقصرون ...

var
  Form1: TForm1;
  CurrentHook: HHook;
  HookInstalled: boolean;

function SetupLocalHook: boolean;
function RemoveLocalHook: boolean;
function CallWndProc(code: integer; wParam: word; lParam: longword): longword; stdcall;

في OnCreate التابعة للـ Form نقوم باستدعاء SetupLocalHook ليتم إنشاء وبدء عمل الـ local hook

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
if not SetupLocalHook then
  ShowMessage('Local hook setup error!!');
end;

في OnDestroy التابعة للـ Form نستدعي RemoveLocalHook ليتم إيقاف والتخلص من hook .

procedure TForm1.FormDestroy(Sender: TObject);
begin
if not RemoveLocalHook then
  ShowMessage('Local hook removal error!!');
end;

وهنا الكود الخاص بدوال الـ hook

function SetupLocalHook: boolean;
begin
  CurrentHook:=setwindowshookex(WH_CALLWNDPROC,@CallWndProc,0,GetCurrentThreadID());
  if CurrentHook<>0  then SetupLocalHook:=true else SetupLocalHook:=false;
end;

function RemoveLocalHook: boolean;
begin
    RemoveLocalHook:=UnhookWindowsHookEx(CurrentHook);
end;

function CallWndProc(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
    if code<0 then
    begin
       CallWndProc := CallNextHookEx(CurrentHook,code,wParam,lparam);
       Exit;
    end;
    if (PCWPStruct(lParam).message=WM_INPUTLANGCHANGE ) then
    begin
      Form1.Label1.Caption:=inttohex(PCWPStruct(lParam).lParam,8);
    end;
    CallNextHookEx(CurrentHook,code,wParam,lparam);
    CallWndProc:=0;
    Exit;
end;

بعد جملة الشرط

if (PCWPStruct(lParam).message=WM_INPUTLANGCHANGE ) then

يمكنك إضافة الكود الخاص بك . راجع الوصلة التي أشار إليها X بخصوص الـ Language ID

إستخدام الـ subclassing قد يؤدي نفس الغرض ...

السلام عليكم ورحمة الله وبركاته

شكرا يا اخ ياسين

سأحاول تطبيقه لأري هل انا فهمت العمليه وهل هو ما اريده ثم اعود اليك اخي

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

#8

السلام عليكم

لقراءة لغة النظام:

function GetWindowsLanguage: string; 
var 
 WinLanguage: array [0..50] of char; 
begin 
 VerLanguageName(GetSystemDefaultLangID, WinLanguage, 50); 
 Result := StrPas(WinLanguage); 
end;

طريقة أخرى:

function GetLayout: string;
begin
  SetLength(Result, KL_NAMELENGTH+1);
  if not GetKeyBoardLayoutName(PChar(Result)) then
    Result := 'Error: No layout name read';
end;

تم تعديل هذه المشاركة بواسطة kachwahed في 11 يونيو 2010 في 13:26

#9
kachwahed كتب:

السلام عليكم

لقراءة لغة النظام:

function GetWindowsLanguage: string; 
var 
 WinLanguage: array [0..50] of char; 
begin 
 VerLanguageName(GetSystemDefaultLangID, WinLanguage, 50); 
 Result := StrPas(WinLanguage); 
end;

طريقة أخرى:

function GetLayout: string;
begin
  SetLength(Result, KL_NAMELENGTH+1);
  if not GetKeyBoardLayoutName(PChar(Result)) then
    Result := 'Error: No layout name read';
end;

اخي kachwahedالسلام عليكم

طبقت ما افدتني به وبالنسبة لي ماقدمته جديد لا اعرفه وفعلا اوضح لي لغه النظام

لكن انا اريد كلما غيرت اللغه بأي فورم تظهر لي رسالة الأعلام عن اللغه

انا اريد وضع الفنكشن او استدعيه بالتايمر هل ممكن لك الشكر لأن ذلك ممكن يحل المشكله ولكن كيف

تم تعديل هذه المشاركة بواسطة shalwan في 11 يونيو 2010 في 21:54

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

#10
اقتباس
او استدعيه بالتايمر

إستخددام Timer ليس جيداً في جميع الحالات , فهو يستهلك الكثير من موراد النظام .

هل جربت المثال الذي وضعته لك؟

هل سؤالك كالتالي:

قمت بتغيير لغة الإدخال باستخدام alt+shift أو أي hotkey آخر خاص بتغيير لغة الإدخال او عن طريق الـmouse وتريد أن يستقبل برنامجك هذا التغيير ويتم الإعلام بأنه تم تغيير اللغة ومعرفة ماهي اللغة التي تم التغيير إليها ؟

إن كان هذا هو السؤال , جرب الكود في ردي السابق فهو يعطيك بداية جيدة لما تريد , ثم أخبرني بما صار معك حتى نبدأ تفاصيل أخرى .

1
#11
YaSeenTA كتب:

إستخددام Timer ليس جيداً في جميع الحالات , فهو يستهلك الكثير من موراد النظام .

هل جربت المثال الذي وضعته لك؟

هل سؤالك كالتالي:

قمت بتغيير لغة الإدخال باستخدام alt+shift أو أي hotkey آخر خاص بتغيير لغة الإدخال او عن طريق الـmouse وتريد أن يستقبل برنامجك هذا التغيير ويتم الإعلام بأنه تم تغيير اللغة ومعرفة ماهي اللغة التي تم التغيير إليها ؟

إن كان هذا هو السؤال , جرب الكود في ردي السابق فهو يعطيك بداية جيدة لما تريد , ثم أخبرني بما صار معك حتى نبدأ تفاصيل أخرى .

شكرا على التواصل وقد جربت هذا المكون وهو يعمل بشكل جيد وصحيح وهو المطلوب فلك الشكر

سأدخل بموضوع جديد ارغب مشاركتك فيه

نسأل الله الجنه لنا ولوالدينا ولمن لهم حق علينا

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…