Aug 27, 2010

Windows Form Localization in .NET

This article explains the steps to implement localization for windows app using .NET

1. Design the interface by using table layout panel.

2. Change the localizable property of form to true.

3. Select the language by using the language property of form. It will create new resource file for that language.

4. Change the text property of each and every control into selected language.

5. Create the main resource for each and every language and add that into myproject folder of an application. By using this files we use to handle the message box and runtime string localization.

For example Resources.resx = file is use for default language( english-US)

Resources.es-MX.resx = this is for Spanish(Mexico).

To create this resources file: Add new item select the resource files add it to my project folder and Change its couple of property. OR you can use following tools

Custom tool :- VbMyResourcesResXFileCodeGenerator.

Custom tool namespace :- My.Resources.

6. Now access resource file to localize message in messagebox and runtime strings.

MessageBox.Show(My.Resources.NameOfString, My.Resources.Title, MessageBoxButtons.YesNo)7. Our goal is to localize app on changing combobox (cboLanguage). For this we use settings file and add/update following block of code and update with your project namespace

[vb]

Public Shared ReadOnly Property [Default]() As MySettings

Get

#If _MyType = "WindowsForms" Then

If Not addedHandler Then

SyncLock addedHandlerLockObject

If Not addedHandler Then

AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings

addedHandler = True

End If

End SyncLock

End If

#End If

Return defaultInstance

End Get

End Property

<Global.System.Configuration.UserScopedSettingAttribute(), _

Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _

Global.System.Configuration.DefaultSettingValueAttribute("en-US")> _

Public Property UserLanguagePreference() As String

Get

Return CType(Me("UserLanguagePreference"), String)

End Get

Set(ByVal value As String)

Me("UserLanguagePreference") = value

End Set

End Property

End Class

End Namespace

Namespace My

<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _

Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _

Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _

Friend Module MySettingsProperty

<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _

Friend ReadOnly Property Settings() As Global.<namespace>.My.MySettings

Get

Return Global.<namespace>.My.MySettings.Default

End Get

End Property

End Module

End Namespace

[/vb]

On selection change event of combobox add following code:

[vb]

Dim lang As String = ""

lang=cboLanguage.selectedvalue.tostring

My.Settings.UserLangualgePreference=lang

My.Settings.Save()

My.Application.ChangeUICulture(My.Settings.UserLanguagePreference)

'*** refresh current form(say Mainform) with localized strings

LoadFormResources()

[/vb]

Note: in combobox display member= Language Name (English)

Value Member = Language Code (en-US)

Add this method to refresh current form:

[vb]

Private Sub LoadFormResources()

Dim crm As ComponentResourceManager

crm = New ComponentResourceManager(GetType(MainForm))

Dim controlCollobj As New ControlsCollection(Me)

For Each aControl As Control In controlCollobj.Controls

crm.ApplyResources(aControl, aControl.Name)

Next aControl

End Sub

[/vb]

Hope, It helps.