2010-03-30 4 views
0

Я пытаюсь написать многоязычное приложение в Silverlight 4.0 и я в точке, где я могу начать замену моего статического текста динамическим текстом из файла xaml SampleData. Вот что у меня есть:Динамически установлен текстовое связывание 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

<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

EDIT:

Вот пример, где я использую вспомогательный класс для хранения переведенных строк. Эти переводы могут быть загружены примерно из любого места. Статические файлы ресурсов, 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> 

Code-за + 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 он перенаправляет пользователя на новую страницу –

+1

Aha. Теперь я вижу, что вам нужно. Нет, пользователь не сможет переключать язык «на лету» при использовании статических ресурсов. Если это то, что вам нужно, вы, вероятно, должны перейти с привязкой данных. Но ваш пример кода по-прежнему выглядит слишком сложным для меня. Я готовлю собственный пример кода. Я отправлю его здесь в ближайшее время. –

+0

Есть ли способ заставить это работать, когда вы загружаете ребенка, он может совместно использовать ресурсы? Я попытался поместить это в файл класса, но он не хочет загружать его, когда мой UC находится в подпапке –

2

Похоже, что вы ищете код:

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

Всего это делает создать новый Binding для языка вы просили и использовать его для замены старого связывания свойства текста заголовка.

+0

Я закончил с использованием этого, а также для некоторых частей. Жаль, что я не могу отметить оба ответа, как отмечено. –

Смежные вопросы