Search code examples
wpfvb.netwpf-controlsembedded-resource

why the culture is not getting set in my application with Thread.Current code?


I have created a localization application in WPF. I have bind the controls in the xaml like this.

<Label Name="languageLabel" Content="{x:Static Resources:Resources.languageLabel}" Style="{StaticResource CommonRepSecStyle}" />

Everything works fine but still I am not sure the techniques I applied are good. I created a resource manager and assigned the string values to controls like this.

        Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
        Dim localResource As System.Resources.ResourceManager = New System.Resources.ResourceManager("LocalTest.Resources", System.Reflection.Assembly.GetExecutingAssembly())

        languageLabel.Content = localResource.GetString("languageLabel", culture)
       stateLabel.Content = localResource.GetString("stateLabel", culture)
        cityLabel.Content = localResource.GetString("cityLabel", culture)
       stateComboBox.Text = localResource.GetString("stateComboBox", culture)
        cityComboBox.Text = localResource.GetString("cityComboBox", culture)
        infoLabel.Content = localResource.GetString("infoLabel", culture)
        infoTextBox.Text = localResource.GetString("infoTextBox", culture)
        localResources.ReleaseAllResources()

It does not seems to work until I assigned the values to the controls? Is there any way to improve this? Thank you!

Edit : The complete code is here

    Imports System.IO
    Imports System.Windows.Controls
    Imports System.Globalization
    Imports System.Configuration
    Imports System.Threading
    Imports System.ComponentModel
    Imports System.Resources
    Imports System.Windows.Markup
    Imports System.Reflection
    Imports System.Uri
    Namespace LocalTest

Public Class MainWindow
    Private cultureName As String


    Public Sub New()

        '    '    ' This call is required by the designer.
        InitializeComponent()

        '    '    ' Add any initialization after the InitializeComponent() call.

    End Sub
    Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded


    End Sub
    Private Sub ButtonEnglish_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles ButtonEnglish.Click
        cultureName = "en-US"

        SetControlsCulture()
        'Dim ob As Object
        'ob = Application.Current.TryFindResource("Resources.en-US.resx")

        'Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
        'Thread.CurrentThread.CurrentUICulture  = CultureInfo.CreateSpecificCulture("en-US")

    End Sub

    Private Sub ButtonFrench_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles ButtonFrench.Click
        cultureName = "fr-CA"
        System.Threading.Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr-CA")

        SetControlsCulture()

    End Sub
    ' Dim s As String = r.GetString("LabelContent", culture)
    'Thread.CurrentThread.CurrentCulture = culture
    'Thread.CurrentThread.CurrentUICulture = culture


    ''' <summary>
    ''' Select the Controls Culture
    ''' </summary>
    ''' <remarks></remarks>

    Private Sub SetControlsCulture()
        Select Case cultureName
            Case "fr-CA"
                UIControlsBinding()
            Case "en-US"
                UIControlsBinding()
        End Select
    End Sub
   Private Sub UIControlsBinding()
        Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
        Dim localResource As System.Resources.ResourceManager = New      System.Resources.ResourceManager("LocalTest.Resources", System.Reflection.Assembly.GetExecutingAssembly())
     languageLabel.Content = localResource.GetString("languageLabel", culture)
     stateLabel.Content = localResource.GetString("stateLabel", culture)
     cityLabel.Content = localResource.GetString("cityLabel", culture)
     stateComboBox.Text = localResource.GetString("stateComboBox", culture)
     cityComboBox.Text = localResource.GetString("cityComboBox", culture)
    infoLabel.Content = localResource.GetString("infoLabel", culture)
    infoTextBox.Text = localResource.GetString("infoTextBox", culture)
    localResources.ReleaseAllResources() 
    End Sub
    End class
    End Namespace

Solution

  • To add resources in WPF add a Resource.resx and a Resource.NL-nl.resx (or language of choice) file to the properties folder of you project. Add a resource with name StateLabel and a value in each resourcefile. Don't forget to change the Access Modifier to Public

    Add xml namespace to your window/usercontrol: xmlns:Resources="clr-namespace:WpfApplication2.Properties" (where WpfApplication2 is your application name)

    Add a label to your window/usercontrol <Label Content="{x:Static Resources:Resources.StateLabel}"></Label>

    To change language call this from code to set the appropriate language (in this case Dutch):

    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL");