Search code examples
c#silverlight

Dynamically set TextBlock's text binding


I am attempting to write a multilingual application in Silverlight 4.0 and I at the point where I can start replacing my static text with dynamic text from a SampleData xaml file. Here is what I have:

My Database

<SampleData:something xmlns:SampleData="clr-namespace:Expression.Blend.SampleData.MyDatabase" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <SampleData:something.mysystemCollection>
    <SampleData:mysystem ID="1" English="Menu" German="Menü" French="Menu" Spanish="Menú" Swedish="Meny" Italian="Menu" Dutch="Menu" />
  </SampleData:something.mysystemCollection>
</SampleData:something>

My UserControl

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
    x:Class="Something.MyUC" d:DesignWidth="1000" d:DesignHeight="600">
    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MyDatabase}}">
        <Grid Height="50" Margin="8,20,8,0" VerticalAlignment="Top" d:DataContext="{Binding mysystemCollection[1]}" x:Name="gTitle">
            <TextBlock x:Name="Title" Text="{Binding English}" TextWrapping="Wrap" Foreground="#FF00A33D" TextAlignment="Center" FontSize="22"/>
        </Grid>
    </Grid>
</UserControl>

As you can see, I have 7 languages that I want to deal with. Right now this loads the English version of my text just fine. I have spent the better part of today trying to figure out how to change the binding in my code to swap this out when I needed (lets say when I change the language via drop down).


Solution

  • You are going about this the wrong way. Best practice for localization in Silverlight is to use resource files holding the translated keywords. Here is some more info about this:

    http://msdn.microsoft.com/en-us/library/cc838238%28VS.95%29.aspx

    EDIT:

    Here is an example where I use a helper class to hold the translated strings. These translations could then be loaded from just about anywhere. Static resource files, xml, database or whatever. I made this in a hurry, so it is not very stable. And it only switches between english and swedish.

    XAML:

    <UserControl x:Class="SilverlightApplication13.MainPage"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 xmlns:local="clr-namespace:SilverlightApplication13"
                 mc:Ignorable="d"
                 d:DesignWidth="640"
                 d:DesignHeight="480">
    
        <UserControl.Resources>
            <local:TranslationHelper x:Key="TranslationHelper"></local:TranslationHelper>
        </UserControl.Resources>
    
        <Grid x:Name="LayoutRoot">
            <StackPanel>
    
                <TextBlock Margin="10"
                           Text="{Binding Home, Source={StaticResource TranslationHelper}}"></TextBlock>
    
                <TextBlock Margin="10"
                           Text="{Binding Contact, Source={StaticResource TranslationHelper}}"></TextBlock>
    
                <TextBlock Margin="10"
                           Text="{Binding Links, Source={StaticResource TranslationHelper}}"></TextBlock>
    
                <Button Content="English"
                        HorizontalAlignment="Left"
                        Click="BtnEnglish_Click"
                        Margin="10"></Button>
    
                <Button Content="Swedish"
                        HorizontalAlignment="Left"
                        Click="BtnSwedish_Click"
                        Margin="10"></Button>
            </StackPanel>
        </Grid>
    </UserControl>
    

    Code-behind + TranslationHelper class:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Threading;
    using System.ComponentModel;
    
    namespace SilverlightApplication13
    {
        public partial class MainPage : UserControl
        {
            public MainPage()
            {
                InitializeComponent();
    
                //Default
                (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("en-US");
            }
    
            private void BtnEnglish_Click(object sender, RoutedEventArgs e)
            {
                (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("en-US");
            }
    
            private void BtnSwedish_Click(object sender, RoutedEventArgs e)
            {
                (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("sv-SE");
            }
        }
    
        public class TranslationHelper : INotifyPropertyChanged
        {
            private string _Contact;
    
            /// <summary>
            /// Contact Property
            /// </summary>
            public string Contact
            {
                get { return _Contact; }
                set
                {
                    _Contact = value;
                    OnPropertyChanged("Contact");
                }
            }
    
            private string _Links;
    
            /// <summary>
            /// Links Property
            /// </summary>
            public string Links
            {
                get { return _Links; }
                set
                {
                    _Links = value;
                    OnPropertyChanged("Links");
                }
            }
    
            private string _Home;
    
            /// <summary>
            /// Home Property
            /// </summary>
            public string Home
            {
                get { return _Home; }
                set
                {
                    _Home = value;
                    OnPropertyChanged("Home");
                }
            }
    
    
    
            public TranslationHelper()
            {
                //Default
                SetLanguage("en-US");
            }
    
            public void SetLanguage(string cultureName)
            {
                //Hard coded values, need to be loaded from db or elsewhere
    
                switch (cultureName)
                {
                    case "sv-SE":
                        Contact = "Kontakt";
                        Links = "Länkar";
                        Home = "Hem";
                        break;
    
                    case "en-US":
                        Contact = "Contact";
                        Links = "Links";
                        Home = "Home";
                        break;
    
                    default:
                        break;
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected virtual void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    }