PDA

View Full Version : سوال: مشکل با Multi Language نوشتن برنامه ؟!



Alirezanet
یک شنبه 04 بهمن 1388, 17:14 عصر
من یه برنامه به چند زبون نوشتم با استفاده از خاصیت Localizable و Language ...

1- فقط مشکل اینجاست که من توی یه فرم (option) زبون رو تغییر میدم ولی تغییرات اعمال نمیشه . باید فرم رو ببندم دوباره باز کنم تا تغییر کنه با این کد :


System.Threading.Thread.CurrentThread.CurrentUICul ture = New System.Globalization.CultureInfo("fa-IR")


2- روی فرم مادر ( Parent Mdi ) و فرم های دیگه نمیشه از قسمت Option تغییرات و اعمال کرد .!؟!؟
و در آخر این تنظیمات رو باید جایی مثلا توی Registry ذخیره کنیم یا با تغییر زبان برنامه وقتی که کاربر دفعه بعد برنامرو باز میکنه همون آخرین تغییرات اعمال شده !!؟؟

ACorvinus
یک شنبه 04 بهمن 1388, 17:56 عصر
سلام .

منظورتون از چند زبانه بودن چیه؟
شما میخواین زبان ورودی سیستم رو تغییر بدین یا اینکه مثلا زبان سیستمتون رو از English به Farsi تغییر دادین، کل کنترلهای فرمتون فارسی بشه و تنظیمات RTL و اینا؟

میشه واضح تر بگین؟

Alirezanet
یک شنبه 04 بهمن 1388, 18:17 عصر
خوب اگه آشنایی با خواص فرم (Localizable و language ) داشته باشین در صورت اینکه اولی رو true کنیم با انتخاب هر زبونی میتونیم تمامی lable ها تکس ها و ... رو در زبان تغییر کرده مثلا persian (Iran فارسی کنیم ... با کدی هم که بالا گذاشتم میشه بینشون سوئیچ کرد ..
ولی فکر میکنم تغییرات با کد بالا روی 1 فرم انجام میشه که مشکلاتی که قبلا گفتم پیش میاد.

Alirezanet
یک شنبه 04 بهمن 1388, 20:10 عصر
خوب مشکلات حل شد فقط 1 مشکل مونده :
فرم MdiParrent خصوصیاتش تغییر نمیکنه زمانی که Language رو عوض میکنیم .
کسی رویدادی که قبل از formload اجرا شه یه چیزی مثله app load سراغ داره ؟!؟!

چون من تنظیمات رو در فرم لود اصلی گذاشتم شاید روی خود همون فرم اعمال نمیشه .. :متفکر:

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

ACorvinus
یک شنبه 04 بهمن 1388, 20:34 عصر
شرمنده، من در این مورد اطلاعاتی ندارم.

اگه میتونستم، کمکتون می کردم به جواب برسین، موفق باشین.

ACorvinus
یک شنبه 04 بهمن 1388, 20:38 عصر
خوب مشکلات حل شد فقط 1 مشکل مونده :
فرم MdiParrent خصوصیاتش تغییر نمیکنه زمانی که Language رو عوض میکنیم .
کسی رویدادی که قبل از formload اجرا شه یه چیزی مثله app load سراغ داره ؟!؟!

چون من تنظیمات رو در فرم لود اصلی گذاشتم شاید روی خود همون فرم اعمال نمیشه .. :متفکر:

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


سلام دوباره.

رویداد HandleCreated قبل از رویداد Load اتفاق می افته.
حالا میشه یه کوچولو در مورد کارایی که انجام میدی توضیح بدی؟ به نظر جالب میاد!!!

ممنونم رفیق.

Alirezanet
یک شنبه 04 بهمن 1388, 20:54 عصر
ممنون... ولی امتحان کردم نشد :گریه: روی فرم اصلی نتونستم پیادش کنم ..
اگه خاصیت localizable رو true کنید میتونین بعد از اینکه توی Defult برنامرو نوشتین با تغییر زبان فرم مثلا به persian (Iran) تمام lable هارو فارسی کنید و هر وقت کاربر زبان رو عوض کرد به صورت فارسی یا english نمایش داده بشه ... با تغییر زبان در محیط طراحی برنامه vb یک فرم جدید به شما نشون میده که میتونید تغییرات ظاهری رو روش اعمال کنید و رویداد ها یکی هستند .
یه نمونه کوچیک که یکی از دوستامون توی همین سایت مدتها پیش گذاشته بود رو ضمیمه کردم.

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

ACorvinus
یک شنبه 04 بهمن 1388, 21:47 عصر
سلام.

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

شما میخواین دستورات رو در همون فرمی بنویسین که میخواین ازش new بگیرین، بهمین دلیل از من میپرسیدین که چه رویدادی قبل از Load اتفاق می افته.

شما برای فرم مد نظرتون یه روال New تعریف کنین، اینجوری:


Public Sub New()

End Sub


حالا دستورات عوض کردن زبان سیستم رو داخل این روال بنویسین و توجه کنین که دستور
InitializeComponent() رو بعد از اون دستورات بنویسین. ( امیدوارم گرفته باشین روش کارم رو)

اینم یه نمونه سورس:



Public Class TestForm
Public Enum lng
fa
en
End Enum
Public Sub New(ByVal lng As lng)
If lng = Form2.lng.en Then
System.Threading.Thread.CurrentThread.CurrentCultu re = New System.Globalization.CultureInfo("en-US")
System.Threading.Thread.CurrentThread.CurrentUICul ture = New System.Globalization.CultureInfo("en-US")
Else
System.Threading.Thread.CurrentThread.CurrentCultu re = New System.Globalization.CultureInfo("fa-IR")
System.Threading.Thread.CurrentThread.CurrentUICul ture = New System.Globalization.CultureInfo("fa-IR")
End If
InitializeComponent()
End Sub
End Class



منتظرم ببینم جواب گرفتین یا نه؟ بهم خبر بدین!!!

Alirezanet
یک شنبه 04 بهمن 1388, 22:14 عصر
مشکل فراموش کردن این کد بود که با کمکتون حل شد ... واقعا ممنون ....
InitializeComponent()

اگه کسی تو این ضمینه مشکلی داشت بگه تا واسش توضیح بدم .

Alirezanet
یک شنبه 04 بهمن 1388, 22:24 عصر
فقط یه مشکل اون حل شد و کار میکنه ولی وقتی از این کد (InitializeComponent()) استفاده میکنم مثلا توی فرم Load برنامه تمام ابجکتهارو 2تا میکنه ... مثلا یکیش قسمت فارسیم میشه و دومیش قسمت انگلیسی (که کار هم نمیکنه)

ACorvinus
یک شنبه 04 بهمن 1388, 22:46 عصر
فقط یه مشکل اون حل شد و کار میکنه ولی وقتی از این کد (InitializeComponent()) استفاده میکنم مثلا توی فرم Load برنامه تمام ابجکتهارو 2تا میکنه ... مثلا یکیش قسمت فارسیم میشه و دومیش قسمت انگلیسی (که کار هم نمیکنه)

دوست من دستور InitializeComponent نباید در FormLoad استفاده بشه چون با هر بار Load شدن فرم تمامی کنترل هارو از نو میسازه!!!

ببین، مثلا میخوای Default Language برنامت en باشه. اینو در یه جایی ذخیره کن که همیشه حتی بعد از خاتمه برنامه بمونه ( مثلا در Setting پروژه ).


حالا به هنگام اجرای برنامه در New هر فرم (میتونی این کارو در یه کلاس بنویسی و دیگه این کدهارو هر بار در هر فرم ننویسی) قبل از InitializeComponent چک کنی ببینی اگه در My.Setting مثلا Language برابر با en هست که ... یا هر زبانی هست کارهای مربوط به اون زبان رو انجام بدی و فقط یه بار InitializeComponent باید اجرا بشه.

نکته: روال New فقط برای زمانی نیست که حتما بخواییم از فرم New بگیریم.


بهم خبر بده!!!

Alirezanet
یک شنبه 04 بهمن 1388, 23:07 عصر
دیگه کامل شد واقعا ممنون :تشویق::تشویق::قلب::لبخندساد : .. این نکته که آخر صحبتها نوشتین خیلی کمک کرد من از فرم لود کد ها رو توی یه روال New گذاشتم و مشکل حل شد ...
فقط به نظر شما استفاده از SaveSitting بهتره یا Sitiing برنامه ؟! برای نگه داشتن زبان برنامه . من از Registry استفاده کردم .

ACorvinus
دوشنبه 05 بهمن 1388, 09:38 صبح
دیگه کامل شد واقعا ممنون :تشویق::تشویق::قلب::لبخندساد : .. این نکته که آخر صحبتها نوشتین خیلی کمک کرد من از فرم لود کد ها رو توی یه روال New گذاشتم و مشکل حل شد ...
فقط به نظر شما استفاده از SaveSitting بهتره یا Sitiing برنامه ؟! برای نگه داشتن زبان برنامه . من از Registry استفاده کردم .


سلام.

برای نگه داشتن زبان برنامه میتونین از همین Setting موجود در Project Properties استفاده کنین و فکر نکنم نیازی به Registry باشه.

مثلا اگر برنامه شما 5 زبانه باشه، برای هر زبان یه شماره بدین ( میتونین یه Enumerable تعریف کنین از نوع بایت و از شماره بدین برای هر زبان ) و شماره رو در Setting از نوع byte ذخیره کنین و هر بار که میخواین برنامه رو باز کنین برای تشخیص اینکه کدوم زبان باید بار بشه از یه Select Case استفاده کنین. اینجوری:


Public Enum lng As Byte
en = 0
fr = 1
tr = 2
ar = 3

'Other Language Symbole = Number
End Enum


تشخیص زبان:


Select Case My.Settings.lng
Case lng.en
'Commands
Case lng.fr
'Commands
Case lng.tr
'Commands
Case lng.ar
'Commands
Case Else
'Default Language Commands
End Select


ومفق باشی، اگه مشکلی بود من در خدمتم.

mohammadi4net
دوشنبه 05 بهمن 1388, 10:39 صبح
خیلی جالب بود بازم از دنیای دات نت یک چیز جدید یاد گرفتم داخل frmTest.Designer.vb رو نگاه کردم چیزی گیر نیاواردم متوجه شدم برای زبان فارسی یک فایل frmTest.fa-IR.resx ساخته می شه و نوشته های فارسی در داخل اون ذخیره می شن.
از جناب Alirezanet بابت این تکنیک ساده و کاربردی متشکرم