Pergunta

Estou tentando escrever um aplicativo multilíngue no Silverlight 4.0 e i no ponto em que posso começar a substituir meu texto estático por texto dinâmico de um arquivo sampledata xaml. Aqui está o que eu tenho:

Meu banco de dados

<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>

Meu 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>

Como você pode ver, tenho 7 idiomas com os quais quero lidar. No momento, isso carrega a versão em inglês do meu texto muito bem. Passei a melhor parte de hoje tentando descobrir como alterar a ligação no meu código para trocar isso quando eu precisava (digamos quando eu altero o idioma via suspenso).

Foi útil?

Solução

Você está fazendo isso da maneira errada. A melhor prática para localização no Silverlight é usar arquivos de recursos que mantêm as palavras -chave traduzidas. Aqui estão mais algumas informações sobre isso:

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

EDITAR:

Aqui está um exemplo em que eu uso uma classe auxiliar para manter as cordas traduzidas. Essas traduções poderiam então ser carregadas de praticamente qualquer lugar. Arquivos de recursos estáticos, XML, banco de dados ou qualquer outra coisa. Eu fiz isso com pressa, então não é muito estável. E isso só alterna entre inglês e sueco.

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 + TradlationHelper 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));
            }
        }
    }
}

Outras dicas

Parece que você está procurando um código como este:

Title.SetBinding(TextProperty, new Binding { Path = new PropertyPath(language) });

Tudo o que faz é criar uma nova ligação para o idioma que você solicitou e usá -lo para substituir a ligação antiga pela propriedade de texto do título.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top