2010-03-30 54 views
0

我正在尝试在Silverlight 4.0中编写多语言应用程序,并且我可以从SampleData xaml文件中的动态文本开始替换静态文本。以下是我有:动态设置TextBlock的文本绑定

我的数据库

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

我的用户

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

正如你所看到的,我有7种语言,我想处理。现在,这加载我的文字的英文版本就好了。今天我花了很多时间试图弄清楚如何改变我的代码中的绑定,以便在需要时将其交换出来(可以说当我通过下拉菜单更改语言时)。

任何帮助将是伟大的!

回答

1

你正在走这个错误的路。在Silverlight中进行本地化的最佳做法是使用包含已翻译关键字的资源文件。下面是一些关于这个更多的信息:

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

编辑:

这里是我使用一个辅助类来保存翻译的字符串的例子。这些翻译可以从几乎任何地方加载。静态资源文件,XML,数据库或其他。我做得很匆忙,所以它不是很稳定。它只能在英语和瑞典语之间切换。

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> 

代码隐藏+ TranslationHelper类:

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

这是否允许我动态设置语言,而无需重新加载应用程序?在MSDN上的示例中,它将用户重定向到新页面 – 2010-03-30 13:33:46

+1

Aha。现在我明白你的所作所为。不,使用静态资源时,用户将无法实时切换语言。如果这是你需要的,你应该使用数据绑定。但是你的代码示例对我来说仍然看起来过于复杂。我正在准备自己的代码示例。我会很快在这里发布。 – 2010-03-30 14:05:03

+0

当你加载一个可以共享资源的孩子时,有没有什么办法让这个工作起作用?我试图把它放在一个类文件中,但是当我的UC在一个子文件夹中时它不想加载它。 – 2010-03-30 15:23:37

2

这听起来像你正在寻找这样的代码:

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

它所做的就是为您创建请求的语言和新的绑定,并用它来代替旧的绑定为标题的Text属性。

+0

最后我用这个问题,以及一些零部件。太糟糕了,我无法将两个答案都标记为已选中。 – 2010-03-30 18:57:40