PDA

View Full Version : آموزش: نحوه ساخت برنامه چند زبانه به صورت ساده (Localization)



gwbasic
جمعه 20 مرداد 1391, 05:01 صبح
سلام دوستان با استفاده از امکانات دات نت و ویژوال استودیو نوشتن برنامه چند زبانه کار بسیار ساده ای هست. در ادامه روند پیاده سازی رو بصورت خلاصه مرور می کنیم.

ابتدا یک فرم با نام LocalizedForm‌ ایجاد می کنیم که دارای یک Label می باشد که خصوصیت Text آن Full Name‌ هست و یک TextBox و یک Button با نام btnSave که خصوصیت Text‌ آن Save می باشد. مانند فرم زیر:

91017
این فرم را ذخیره و سپس روی فرم کلیک کرده پراپرتی Localizable آن را true کنید. با این کار فرم ما قابلیت چند زبانه بودن را پیدا می کند.

حال دوباره فرم را ذخیره کرده و پراپرتی Language‌ را روی Persian قرار می دهیم (البته در VS 2010‌ دو مورد Persian‌ وجود دارد که اولی معادل fa و دومی معادل fa-IR می باشد و شما مورد دوم را انتخاب کنید) حالا می توانیم چیدمان و خصوصیات دیگر این فرم را بر اساس نیازمون تغییر بدیم.
فقط یک نکته را باید در نظر داشته باشیم که فرم اولی فرم پیش فرض (Default‌) و معادل en-US‌ می باشد. ما فقط در این فرم می توانیم کنترلی اضافه و یا کم کنیم.
این تغییرات را اعمال می کنیم:
پراپرتی Text مربوط به label‌ رو برابر "نام و نام خانوادگی" قرار می دهیم.
پراپرتی Text مربوط به btnSave‌ را برابر "ذخیره" مقدار دهی می کنیم.
دوباره فرم را ذخیره می کنیم

91018
اگر دقت کنیم در زیر این فرم فایل Resource با نام LocalizedForm.fa-IR.resx ایجاد شده است که حاوی اطلاعات مربوط به فرم فارسی ما می باشد.

91019

در ادامه فرمی با نام MainForm ایجاد می کنیم که دارای یک کمبو باکس با نام cboLanguage و یک button‌ با نام btnShowForm‌ ایجاد می کنیم مانند فرم زیر:

91020

پشت فرم کدهای زیر را می نویسیم:

public partial class MainForm : Form
{
private const string _Farsi = "Farsi";
private const string _English = "English";
private const string _farsiCulture = "fa-IR";
private const string _englishCulture = "en-US";
private List<string> _supportedLanguages;
public MainForm()
{
InitializeComponent();
Initialize();
}
private void Initialize()
{
_supportedLanguages = new List<string>();
_supportedLanguages.AddRange(new List<string> { _Farsi, _English });
}
private void MainForm_Load(object sender, EventArgs e)
{
cboLanguage.DataSource = _supportedLanguages;
cboLanguage.SelectedIndex = 0;
}
private void btnShowForm_Click(object sender, EventArgs e)
{
string selectedLanguage = cboLanguage.SelectedValue.ToString();
CultureInfo cultureInfo;
if (selectedLanguage == _Farsi)
{
cultureInfo = new CultureInfo(_farsiCulture);
}
else
{
cultureInfo = new CultureInfo(_englishCulture);
}
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
new LocalizedForm().ShowDialog();
}
}


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

حالا در ادامه می خواهیم پیغام هایمان را چند زبانه کنیم. برای اینکار روی پروژه کلیک راست کرده و از منوی باز شده Add و سپس New Item ... را انتخاب می کنیم و از پنجره باز شده آیتم Resources File را انتخاب می کنیم و نام آن را Messsage.resx انتخاب می کنیم. این فایل را برای پیام های انگلیسی و یک Resources File دیگر با نام Message.fa-IR.resx‌ ایجاد می کنیم. با دقت داشته باشیم که نام فایل باید یکی باشد و فقط fa-IR. باید به نام آن اضافه شود. حالا به ازای هر پیام در هر فایل یک متن ایجاد می کنیم.
بطور مثال می خواهیم وقتی روی دکمه ذخیره در فرم LocalizedForm کلیک شد پیغام مناسب بدهیم. برای این کار روی Message.resx‌ دابل کلیک کرده و در قسمت Name‌ آن SaveSucceeded و در قسمت Value‌ آن Save Succeeded را تایپ می کنیم و متناظر آن در Message.fa-IR.resx با همین Name‌ یعنی SaveSucceeded ‌‌یک سطر ایجاد می کنیم و روبری آن و در قسمت Value مقدار "ذخیره با موفقیت انجام شد" را می نویسیم.
و در نهایت در رویداد کلیک دکمه btnSave کد زیر را می نویسیم:

MessageBox.Show(Messages.SaveSucceeded);


کد بالا باعث می شود که در هر Culture‌ ای که باشیم پیغامی که در همان Culture‌ در فایل ریسورس ما موجود است نمایش داده شود.

Farshid007
جمعه 27 مرداد 1391, 18:06 عصر
چرا این کد ها رو پشت فرم بزاریم؟

خوب کد هارو بزاریم تو فایل Program.cs که همه ی فرم ها اینجوری بشن!

samadblaj
جمعه 27 مرداد 1391, 23:17 عصر
سلام ممنونم از آموزش کاملتون شما خیلی زحمت میکشید، واقعا نمیدونم چطور تشکر کنم...
فقط اگه امکانش بود پروژه رو هم پیوست کنید.(مرورگر من کد ها رو توی یک خط نمایش میده خیلی اذیت شدم تا پروژه رو نوشتم).
امیدوارم همیشه موفق و پیروز باشید./

gwbasic
شنبه 28 مرداد 1391, 07:03 صبح
Farshid007@:
این یک برنامه آموزشی هست که نحوه پیاده سازی فرم های چند زبانه رو بر اساس Culture آموزش می ده و اینکه چطور براساس تغییر Culture این تغییرات اعمال می شه وگرنه پرواضح هست که در یک برنامه کابردی Culture یک بار و آن هم در ابتدای برنامه در Startup اعمال می شه.

samadblaj@:
سورس کد رو حتما امشب up می کنم البته اگه مشکلی پیش نیاد (چند وقتی هست نمی دونم چرا که امکان up در سایت رو ندارم )

gwbasic
یک شنبه 29 مرداد 1391, 08:37 صبح
سورس کد ضمیمه شد

AmirGhasemi
چهارشنبه 01 شهریور 1391, 17:20 عصر
ممنون دوست عزيز از اينكه اين پست خوب را برايمان گذاشتي
من از اين كد استفاده مي كنم اما با errorزير مواجه مي شم هر چند اين error ربطي به كدهاي شما نداره اما كمك كن ببينم قصه چيه

Error 1 Task failed because "AL.exe" was not found, or the correct Microsoft Windows SDK is not installed. The task is looking for "AL.exe" in the "bin" subdirectory beneath the location specified in the InstallationFolder value of the registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0A. You may be able to solve the problem by doing one of the following: 1) Install the Microsoft Windows SDK for Windows Server 2008 and .NET Framework 3.5. 2) Install Visual Studio 2008. 3) Manually set the above registry key to the correct location. 4) Pass the correct location into the "ToolPath" parameter of the task. Test0531

gwbasic
چهارشنبه 01 شهریور 1391, 17:26 عصر
اینطور که از متن خطا پیداست احتمالا شما NET Framework 3.5. رو نصب نکردید.

AmirGhasemi
چهارشنبه 01 شهریور 1391, 17:33 عصر
عزيز NET Framework 3.5. نصب كرده ام و مدتهاست دارم ازش استفاده مي كنم
اين گير Registary چيه كه ميده؟

gwbasic
چهارشنبه 01 شهریور 1391, 19:50 عصر
پس یا ویِژوال استودیو رو نصب کنید یا دستی رجیستری رو ست کنید. مشک مربوط به سیستم شماست. به این تاپیک مربوط نمی شه

JustAcMilan
پنج شنبه 29 فروردین 1392, 15:09 عصر
میشه لطفا توضیح بدین چطور چنین امکانی رو به کل پروژه اضافه کنیم (یعنی با تغییر زبان ، کل پروژه زبونش عوض بشه)

gwbasic
جمعه 30 فروردین 1392, 00:03 صبح
میشه لطفا توضیح بدین چطور چنین امکانی رو به کل پروژه اضافه کنیم (یعنی با تغییر زبان ، کل پروژه زبونش عوض بشه)

همانطور که فرم LocalizedForm‌ را چند زبانه کردم، تمام فرم هاتون رو چند زبانه کنید

JustAcMilan
جمعه 30 فروردین 1392, 13:21 عصر
همانطور که فرم LocalizedForm‌ را چند زبانه کردم، تمام فرم هاتون رو چند زبانه کنید
منظور اینکه چطور کد هارو بزاریم تو فایل Program.cs ، چون من امتحان کردم کار نکرد

gwbasic
شنبه 31 فروردین 1392, 08:18 صبح
ببینید شما در هر جا و زمانی که بخواین فرمی را به زبان خاصی نمایش دهید می بایست قبل از نمایش فرم CurrentUICulture مربوط به Thread جاری رو تغییر بدین. بنابراین در Prgram می تونید قبل از Application.Run این عمل رو انجام بدین تا فرم نمایش داده شده به زبان مورد نظر باشد.

JustAcMilan
شنبه 31 فروردین 1392, 12:57 عصر
ببینید شما در هر جا و زمانی که بخواین فرمی را به زبان خاصی نمایش دهید می بایست قبل از نمایش فرم CurrentUICulture مربوط به Thread جاری رو تغییر بدین. بنابراین در Prgram می تونید قبل از Application.Run این عمل رو انجام بدین تا فرم نمایش داده شده به زبان مورد نظر باشد.
میشه از ارث بری فرمها استفاده کرد، که واسه یه فرم این کارا رو انجام بدیم بعد بقیه فرمها ازش ازث ببرن؟

gwbasic
شنبه 31 فروردین 1392, 13:21 عصر
ارث بری امریست جداگانه و هیچ منافاتی با Localization ندارد

skmr_ae
دوشنبه 30 اردیبهشت 1392, 10:28 صبح
سلام

ببخشید شما چطور اینها رو تشخیص دادید
یعنی برا زبان عربی و یا المانی و .. باید چی بنویسیم؟
private const string _Farsi = "Farsi";
private const string _English = "English";
private const string _farsiCulture = "fa-IR";
private const string _englishCulture = "en-US";
و اینکه چطور روی همه فرم ها چند زبانه بودن اعمال بشه مثلا در فرم اول که فارسی اتخاب شد در بقیه فرم ها زبان فارسی شه

ممنون

skmr_ae
جمعه 10 خرداد 1392, 16:29 عصر
کسی نیست جوابم رو بده؟؟؟؟

FastCode
جمعه 10 خرداد 1392, 16:48 عصر
با این حساب +۱ برای یونیکس/لینوکس/مونو/gtk:
104933
(عکس رو با یک برنامه آزمایشی crop کردم.حتی فاصله بین کارکتر ها رو هم حذف کرده که عکس رو کوچک کنه.)

gwbasic
جمعه 10 خرداد 1392, 21:58 عصر
سلام

ببخشید شما چطور اینها رو تشخیص دادید
یعنی برا زبان عربی و یا المانی و .. باید چی بنویسیم؟
private const string _Farsi = "Farsi";
private const string _English = "English";
private const string _farsiCulture = "fa-IR";
private const string _englishCulture = "en-US";
و اینکه چطور روی همه فرم ها چند زبانه بودن اعمال بشه مثلا در فرم اول که فارسی اتخاب شد در بقیه فرم ها زبان فارسی شه

ممنون

برای بدست آوردن لیست کد کشورها به این لینک (http://azuliadesigns.com/culture-codes/) مراجعه کنید

skmr_ae
شنبه 11 خرداد 1392, 10:50 صبح
هر کدوم از کدهای ستون اخر رو برا فرانسه میزارم جواب نمیده که!!!!!!!!

gwbasic
شنبه 11 خرداد 1392, 11:25 صبح
هر کدوم از کدهای ستون اخر رو برا فرانسه میزارم جواب نمیده که!!!!!!!!

برای فرانسه باید از fr-FR استفاده کنید اینکه جواب نمی ده یعنی چی؟ بیشتر توضیح بدین

skmr_ae
شنبه 11 خرداد 1392, 15:32 عصر
برای فرانسه باید از fr-FR استفاده کنید اینکه جواب نمی ده یعنی چی؟ بیشتر توضیح بدین

یعنی جای en-us اینی که شما میفرمایید رو گذاشتم اما باز فرم با انتخاب فرانسه فارسی بود؟؟
راستی نمیشه تول تیپ ها رو هم متناسی با زبان ها کرد؟
ممنون

gwbasic
شنبه 11 خرداد 1392, 17:40 عصر
ببینید شما Language فرم رو روی زبان مورد نظر قرار بدین و بعد تغییرات رو در فرم اعمال کنید و سپس فرم رو ذخیره کنید. حالا اگر در Solution Explorer روی علامت + فرم مورد نظر کلیک کنید فایلی با پسوند resx با نام مورد نظر می بینید مثلا fr یا هر نامی که در Language انتخاب کردین و در نتیجه در Culture هم همین نام را باید استفاده کنید

skmr_ae
یک شنبه 12 خرداد 1392, 10:07 صبح
ببینید شما Language فرم رو روی زبان مورد نظر قرار بدین و بعد تغییرات رو در فرم اعمال کنید و سپس فرم رو ذخیره کنید. حالا اگر در Solution Explorer روی علامت + فرم مورد نظر کلیک کنید فایلی با پسوند resx با نام مورد نظر می بینید مثلا fr یا هر نامی که در Language انتخاب کردین و در نتیجه در Culture هم همین نام را باید استفاده کنید

سلام
ببخشید وقتتون رو میگیرم من زبان فرم رو روی French (France) یا French هم قرار دادم اما هیچ تاثیری نداشت.!!
ممنون بابت راهنمایی تون

gwbasic
یک شنبه 12 خرداد 1392, 13:53 عصر
پروژتون رو اینجا بذارید ببینم

skmr_ae
دوشنبه 13 خرداد 1392, 10:12 صبح
حجمش زیاده
اما من همه چیزو رعایت کردم..

gwbasic
دوشنبه 13 خرداد 1392, 11:02 صبح
حجمش زیاده
اما من همه چیزو رعایت کردم..

دوست عزیز یک پروژه تستی ایجاد کنید نه پروژه اصلیتون

hossein_sh2008
دوشنبه 13 خرداد 1392, 12:00 عصر
سلام دوست عزيز
ممنون از اينكه آموزش هاي خوبي توي سايت ارائه مي دين
آيا امكانش هست كه ما اين متن روي ليبل ، دكمه، گريد و ... رو در يك فايل متني بنويسيم و ذخيره كنيم مانند خيلي از مديريت محتوا ها كه بتونيم سريع با تغيير معني كلمات برنامه رو بدون داشتن سورسش به هر زباني تغيير بديم؟

اگر ميشه يه نمونه كوچكش امكانش هست بذارين؟

gwbasic
دوشنبه 13 خرداد 1392, 13:21 عصر
فایلهای resx این کمک رو به شما می کنن به فرض شما یک فایل Message.resx دارین که متن تمام کنترل ها و پیام ها رو از اون می گیرین. خوب، حالا می تونین برای هر زبانی یک فایل جداگانه تعریف کنید (مثلا برای فارسی Message.Fa.resx) ولی Build Action اون رو None قرار بدین و Copy to Output Directory رو Copy Always در این حالت شما این فایل را بصورت جداگانه در کنار پروژه خواهید داشت و برای خواندن آن می تونید از کلاس ResXResourceReader استفاده کنید.

آقای یوسف نژاد در مورد Globalization سلسله مقالاتی ارائه کردن. به این لینک (http://www.dotnettips.info/search?term=Globalization+%D8%AF%D8%B1+ASP.NET+MVC ) برای توضیحات بیشتر مراجعه کنید

skmr_ae
پنج شنبه 16 خرداد 1392, 09:26 صبح
سلام
این کدهای من هست

private const string _Farsi = "Farsi";
private const string _English = "English";
private const string _French = "French";
private const string _farsiCulture = "fa-IR";
private const string _englishCulture = "en-US";
private const string _frenchCulture = "fr-FR";
---
_supportedLanguages.AddRange(new List<string> { _Farsi, _English , _French });
---
string selectedLanguage = cboLanguage.SelectedValue.ToString();
CultureInfo cultureInfo;

if (selectedLanguage == _Farsi)
{
cultureInfo = new CultureInfo(_farsiCulture);
}

else if (selectedLanguage == _English)
{
cultureInfo = new CultureInfo(_englishCulture);
}
else
{
cultureInfo = new CultureInfo(_frenchCulture);
}

Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
this.Hide();
new Form1().ShowDialog();

ممنون میشم راهنمایی کنید...

skmr_ae
پنج شنبه 16 خرداد 1392, 09:27 صبح
سلام
این کدهای من هست

private const string _Farsi = "Farsi";
private const string _English = "English";
private const string _French = "French";
private const string _farsiCulture = "fa-IR";
private const string _englishCulture = "en-US";
private const string _frenchCulture = "fr-FR";
---
_supportedLanguages.AddRange(new List<string> { _Farsi, _English , _French });
---
string selectedLanguage = cboLanguage.SelectedValue.ToString();
CultureInfo cultureInfo;

if (selectedLanguage == _Farsi)
{
cultureInfo = new CultureInfo(_farsiCulture);
}

else if (selectedLanguage == _English)
{
cultureInfo = new CultureInfo(_englishCulture);
}
else
{
cultureInfo = new CultureInfo(_frenchCulture);
}

Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
this.Hide();
new Form1().ShowDialog();

ممنون میشم راهنمایی کنید...

barnamenevisjavan
پنج شنبه 16 خرداد 1392, 09:57 صبح
http://uploadboy.com/yjuawmv6p7m5.html

gwbasic
پنج شنبه 16 خرداد 1392, 13:16 عصر
skmr_ae@
کدتون مشکلی نداره فقط LocalizedForm‌ یک resx با عنوان LocalizedForm.fr-FR.resx می بایست داشته باشد. هیچ نکته خاصی ندارد فقط تمامی موارد اشاره شد در آموزش را انجام بدید.

barnamenevisjavan@
در مورد فایلی که آپلود کردین توضیح می فرمایین چه هست‌

barnamenevisjavan
پنج شنبه 16 خرداد 1392, 13:36 عصر
skmr_ae@
کدتون مشکلی نداره فقط LocalizedForm‌ یک resx با عنوان LocalizedForm.fr-FR.resx می بایست داشته باشد. هیچ نکته خاصی ندارد فقط تمامی موارد اشاره شد در آموزش را انجام بدید.

barnamenevisjavan@
در مورد فایلی که آپلود کردین توضیح می فرمایین چه هست‌
فیلم تصویری چندزبانه کردن برنامه گفتم مربوط به همین موضوع هست شاید کمکی بکنه

jblaox
جمعه 17 خرداد 1392, 12:24 عصر
http://uploadboy.com/yjuawmv6p7m5.html

سلام

فایل رمز الود است !!

کلمه گذر کردن چیست ؟؟

barnamenevisjavan
دوشنبه 20 خرداد 1392, 20:47 عصر
www.barnamenevisjavan.com
یا
shadoow.ir

ParsiPax
چهارشنبه 22 خرداد 1392, 15:40 عصر
سلام.
با تشکر از آموزش عالی :)
آیا ممکنه بشه فرمی که در حال اجراست رو بدون بستنش تغییر زبان بدیم؟
و اینکه متدی برای ذخیره ی اطلاعات و لود اونا از رجیستری هست که با باز شدن برنامه بطور اتوماتیک زبان انتخابی کاربر رو لود کنه؟

barnamenevisjavan
چهارشنبه 22 خرداد 1392, 17:58 عصر
سلام.
با تشکر از آموزش عالی :)
آیا ممکنه بشه فرمی که در حال اجراست رو بدون بستنش تغییر زبان بدیم؟
و اینکه متدی برای ذخیره ی اطلاعات و لود اونا از رجیستری هست که با باز شدن برنامه بطور اتوماتیک زبان انتخابی کاربر رو لود کنه؟

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

ParsiPax
چهارشنبه 22 خرداد 1392, 19:09 عصر
ممنون barnamenevisjavan (http://barnamenevis.org/member.php?205725-barnamenevisjavan) جان :)

متدش چی هست؟

حالا اونم زیاد مهم نیست...

نظرتون در مورد این چیه؟ :

"آیا ممکنه بشه فرمی که در حال اجراست رو بدون بستنش تغییر زبان بدیم؟"

gwbasic
چهارشنبه 22 خرداد 1392, 20:49 عصر
خیر، همچین کاری به روش استفاده از Resource‌فایلها به شیوه ای که آموزش دادم عملی نیست و البته کاربرد آنچنانی ندارد در یک برنامه معمولا نیازی به این نیست که کاربر فرضا فرمها را به زبان فارسی باز کند و همون لحظه تصمیم بگیرد که انگلیسی نمایش داده شود.

shaghaghi
دوشنبه 21 مرداد 1392, 21:49 عصر
ضمن تشکر از راهنمایی شما
روش آموزش داده شده این پست را امتحان کردم بسیار جالب بود. ولی می خواستم بدانم اگر تعداد فرمهایمان در پروژه زیاد باشد برای افزودن زبان جدید به برنامه مجبوریم به تک تک اشیاء فرمهایمان مراجعه نماییم و عناوین آنها را ویرایش نماییم و مستلزم صرف زمان و دقت خواهیم بود.
اما اگر همانند ایده پیغام های شما یک resx برای هر زبان داشتیم اولا عناوین تکراری در آن نداریم و یک بار برای استفاده همه فرمهایمان آنرا ترجمه می کردیم و می توانستیم در کوتاه ترین زمان ممکن زبان جدید را اضافه نماییم (همانند آنچه در یک سری از نرم افزارها مرسوم است)
شاید اگر این ایده عملی شود چون یک فایل مرکزی برای ترجمه داریم بتوان تعریف زبان جدید و ترجمه را بدون نیاز به برنامه نویس و کامپایل مجدد برنامه به کاربر سپرد.
با تشکر

gwbasic
سه شنبه 22 مرداد 1392, 07:07 صبح
ضمن تشکر از راهنمایی شما
روش آموزش داده شده این پست را امتحان کردم بسیار جالب بود. ولی می خواستم بدانم اگر تعداد فرمهایمان در پروژه زیاد باشد برای افزودن زبان جدید به برنامه مجبوریم به تک تک اشیاء فرمهایمان مراجعه نماییم و عناوین آنها را ویرایش نماییم و مستلزم صرف زمان و دقت خواهیم بود.
اما اگر همانند ایده پیغام های شما یک resx برای هر زبان داشتیم اولا عناوین تکراری در آن نداریم و یک بار برای استفاده همه فرمهایمان آنرا ترجمه می کردیم و می توانستیم در کوتاه ترین زمان ممکن زبان جدید را اضافه نماییم (همانند آنچه در یک سری از نرم افزارها مرسوم است)
شاید اگر این ایده عملی شود چون یک فایل مرکزی برای ترجمه داریم بتوان تعریف زبان جدید و ترجمه را بدون نیاز به برنامه نویس و کامپایل مجدد برنامه به کاربر سپرد.
با تشکر

روشی که resx استفاده شود برای پیامها را می توان برای تغییر عنوان کنترل ها نیز استفاده کرد نکته ناگفته ای ندارد اما استفاده از resx های جا برای تغییر طراحی و چیدمان فرم کاربرد دارد جایی که شما می خواین در یک زبان Position کنترل ها رو نیز تغییر بدین. اگر به این امکان نیاز ندارین می توانید یک فایل برای resx داشته باشین و در Load فرم مقدار کنترل ها رو بر اساس این فایل مقدار دهی کنین

m_bilan
دوشنبه 27 آبان 1392, 17:46 عصر
کلا تاپیک مفیدی بود متشکرم