PDA

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



Mask
چهارشنبه 29 آذر 1391, 21:28 عصر
با سلام.
چطوری میتونم تشخیص بدم که زبان جاری سیستم در حال حاضر چیه؟
جنتا نمونه کد پیدا کردم ، اما اونا تشخیص میدادند زبان برنامه رو چی الان سته، مانند:

function fff():Boolean;
begin
if GetKeyboardLayout(0) = $4290429 then
Result := True // Persian is Installed (SHN)
else
Result := False; // Persian is Not Installed (SHN)
end;
در صرتی که من وضعیت زبان رو در کل ویندوز نیاز دارم.
ممنون.

BORHAN TEC
چهارشنبه 29 آذر 1391, 22:17 عصر
سلام
اون (SHN) ها نشون میده که من این کد رو نوشته کرده بیدم! :لبخند:
دقت کنید که این کد در کل ویندوز هست و مربوط به برنامه ما نیست. این تابعی که نوشته بودم برای این که ببینه روی سیستم فارسی نصب هست یا خیر سعی می کرد که زبان سیستم را روی فارسی ست کنه. بعد فوراً چک می کرد که ببینه زبان سیستم روی فارسی ست شده یا نه؟ اگه ست شده بود نشون میده که فارسی روی سیستم نصب هست و اگر نه یعنی این که فارسی روی سیستم نصب نیست. شما قسمتی از تابع رو در اینجا قرار داده اید که دقیقاً همان کاری که می خواهید را انجام میدهد. شما برای کامل کردن این تابع می توانید از یک ساختار Case استفاده کنید.
در ضمن توجه داشته باشید به صورت عادی نمیشه زبان یک برنامه خاص رو روی یک زبان و بقیه را روی زبانهای دیگر ست کنیم، مگر اینکه خودمان مکانیزم آنرا پیاده سازی کرده باشیم(مثل فارسی سازها). در حالت کلی ویندوز چنین قابلیتی ندارد.
در ضمن اگر می خواهید که تابع خیلی کاملی بنویسید که تمام زبانها را تشخیص دهد از لیستی که در لینک زیر ارائه شده است استفاده کنید:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).aspx
موفق باشید...

یوسف زالی
چهارشنبه 29 آذر 1391, 23:51 عصر
سلام. فکر می کنم یه نگاه به این ها بد نباشه:
GetProcessPreferredUILanguages
GetUserPreferredUILanguages
در Kernel32

Mask
پنج شنبه 30 آذر 1391, 11:48 صبح
سلام.

ون (SHN) ها نشون میده که من این کد رو نوشته کرده بیدم!
بله دقیقا این کد شماست ماله این پسته (http://barnamenevis.org/showthread.php?302692-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D8%B2%D8%A8%D8%A7%D9%86-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2&p=1328275&viewfull=1#post1328275)
اما شما این کد رو تو یه تایمر بنویسید : مثل کد زیر :

function GetLang():Boolean;
begin
if GetKeyboardLayout(0) = $4290429 then
Result := True // Persian is Installed (SHN)
else
Result := False; // Persian is Not Installed (SHN)
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var Lang:string;
begin
if GetLang then
Lang:='FA'
else
Lang:='EN';
Memo1.Lines.Append(Lang);
end;
Interval تایمر رو بر روی 500 تنظیم کنید . حالا برید یه Notepad باز کنید و یه کلمه بنویسید و زبان سیستم رو تغییر بدید.
میبینید که تو ممو برنامه فقط EN نوشته میشه. چرا؟ چون این کد فقط زبان اون برنامه رو نشون میده.
با این اوصاف چطوری باید زبان کل سیستم رو بگیریم؟

یوسف زالی
پنج شنبه 30 آذر 1391, 12:34 عصر
Gold جان دیشب یه سرچی زدم براش، هر ترد زبان خودش رو داره. اون دو تا متد رو دادم چون فکر می کنم بشه باهاش زبان ترد Explorer رو دراورد.
ترد Explorer احتمالا همونیه که می خوای.

Mask
پنج شنبه 30 آذر 1391, 17:43 عصر
آقا نشد
هر چی ور رفتیم. msdn و این گوگل رو زیر رو کردیم. نشد.
هر کدی هست ، فقط زبان ست شده خود برنامه رو در میاره.
میترسم دست آخر به هوک کردن کیبورد برسم:افسرده:

Felony
شنبه 02 دی 1391, 12:04 عصر
چطوری میتونم تشخیص بدم که زبان جاری سیستم در حال حاضر چیه؟
زبان جاری سیستم یعنی چی ؟ سیستم زبان جاری نداره ! هر تردی زبان منحصر به فرد خودش رو نگهداری میکنه .


میترسم دست آخر به هوک کردن کیبورد برسم
که چی ؟ به چیزی که شما نیاز دارید کمکی نمیکنه ...

در آخر برای به دست آوردن زبان پیش فرض سیستم :

GetSystemDefaultLangID
GetSystemDefaultUILanguage
GetSystemDefaultLCID
GetSystemDefaultLocaleName


function DefaultFullLanguageName: string;
var
IdiomaID: LangID;
Idioma: array [0 .. 100] of char;
begin
IdiomaID := GetSystemDefaultLangID;
VerLanguageName(IdiomaID, Idioma, 100);
Result := String(Idioma);
end;

و


function GetSystemLocaleName: string;
var
DLLWnd: THandle;
localeString: LPWStr;
GetSystemDefaultLocaleName: function(const lpLocaleName: LPWStr;
cchLocaleName: integer): integer; stdcall;
begin
Result := '';
DLLWnd := LoadLibrary(kernel32); // <-<< als constante und nicht als String
if DLLWnd > 0 then // ala 'kernel32' sondern denn dann
begin // LoadLibrary('kernel32.dll')
try
@GetSystemDefaultLocaleName := GetProcAddress(DLLWnd,
'GetSystemDefaultLocaleName');

if @GetSystemDefaultLocaleName <> nil then
begin
localeString := AllocMem(1024);
if GetSystemDefaultLocaleName(localeString, 1024) > 0 then
Begin
Result := string(localeString); // <-<< localeString ist doch ein
End; // PWideChar also Unicode... *grübel*
end
else
MessageBox(Application.Handle,
'Failed to perform GetSystemDefaultLocaleName.',
PChar(Application.Title), MB_ICONERROR or MB_OK);

finally
FreeLibrary(DLLWnd);
end;
end;
end;

Mask
شنبه 02 دی 1391, 12:40 عصر
ان جاری سیستم یعنی چی ؟ سیستم زبان جاری نداره ! هر تردی زبان منحصر به فرد خودش رو نگهداری میکنه .
درسته هر ترد زبان خودش رو حفظ میکنه .
اما سوال من یه چیز دیگست .
ببین : سوال اینه :
یه تایمر و یه ممو بزارید رو فرم برنامه . حالا اینتروال تایمر رو بزار 500.
حالا تو تایمر میخام کدی بنویسم که وقتی زبان سیستم تغییر کرد تو ممو هم تغییر کنه.
خوب برنامه بازه . بزارش کنار.
یه نوت پد باز کن . به صورت پیشفزض تو ممو هی داره EN درج میکنه . من میخام حالا اگه تو نوت پد با ALT , Shift زبان سیستم رو تغییر دادم (یا به عبارت دیگه زبان ترد Notepad) رو تغییر دادم . حالا تو ممو بنویسه FA .
البته برنامه خاصی مد نظرم نیست .
من میخام برنامه من پشت کار باز باشه و همینطور که اون آیکن زبان کنار ساعت هی تبدیل به EN , FA میشه . برنامه منم همین تغییر رو بفهمه . فرقیم برام نمیکنه الان فوکوس رو چه برنامه ای است .
متوجه سوالم شدید ، یا بیشتر توضیح بدم.؟

Felony
شنبه 02 دی 1391, 14:08 عصر
خوب اول باید پنجره فعال رو گیر بیاری ( GetForegroundWindow ) ، بعد با استفاده از تابع GetWindowThreadProcessId باید ID ترد مالک اون پنجره رو به دست بیاری ، بعد هم با دادن این TID به تابع GetKeyboardLayout (http://www.google.com/url?q=http://msdn.microsoft.com/en-us/library/windows/desktop/ms646296(v%3Dvs.85).aspx&sa=U&ei=UJbVUJicFOex0QH2-oGIDg&ved=0CBoQFjAA&usg=AFQjCNGJJXhSd--qUnj9fQPPHAA09MDXUg)کد زبان مربوطه .

در مورد نوع برگشتی اون تابع GetKeyboardLayout هم که HKL هست این رو مطالعه کن (http://msdn.microsoft.com/en-us/library/windows/desktop/dd318691(v=vs.85).aspx) که باید کد زبان رو ازش استخراج کنی ، برای اون هم HiWord و LoWord در دلفی موجود هست . ( البته LoWord کار خاصی نمیکنه و فقط یک نگاشت به DWord هست ) .

یه نمونه هم برای تست نوشتم ببینم جواب میده یا نه که خدارو شکر رو سفیدمون کرد D:


var
TheradID: Cardinal;
Lang: Hkl;
LangName: array [0 .. 255] of Char;
begin
TheradID := GetWindowThreadProcessId(GetForegroundWindow, 0);
Lang := GetKeyboardLayout(TheradID);
GetLocaleInfo(LoWord(Lang), LOCALE_SLANGUAGE, LangName, SizeOf(LangName));
Memo1.Lines.Add(LangName);
end;

اینو ندیده بودم :

این تابعی که نوشته بودم برای این که ببینه روی سیستم فارسی نصب هست یا خیر سعی می کرد که زبان سیستم را روی فارسی ست کنه. بعد فوراً چک می کرد که ببینه زبان سیستم روی فارسی ست شده یا نه؟ اگه ست شده بود نشون میده که فارسی روی سیستم نصب هست و اگر نه یعنی این که فارسی روی سیستم نصب نیست.
بهتره از تابع GetUILanguageInfo (http://msdn.microsoft.com/en-us/library/windows/desktop/dd318133(v=vs.85).aspx)استفاده بشه .