如何本地化Windows商店应用程序中的通知和combobox? (C#/ XAML,多语言应用程序工具包)

我有几个与Windowsapp store本地化的问题。 我能够像TextBlock.Text或Button.Content本地化xaml的东西( 我这样做就像这里所示 ),但我不知道如何本地化以下几点:

1)。 在我的combobox中的项目。

<ComboBox x:Name="comboBoxTopAppBar" Width="120" Margin="10,0,0,0" MinWidth="200" SelectedItem="{Binding SelectedStatus, Mode=TwoWay}"> <x:String>Item 1</x:String> <x:String>Item 2</x:String> <x:String>Item 3</x:String> </ComboBox> 

2)。 C#代码中的MessageDialogs(无需等待,因为catch块)

 new MessageDialog("Something went wrong. Please, check your login/password and internet connection.").ShowAsync(); 

3)。 Toast通知在C#代码(我正在使用“Windows运行时通过C#”类书籍)

 ToastNotificationManager.CreateToastNotifier() .Show(new ToastNotification(new ToastTemplate(ToastTemplateType.ToastText01) { Text = {"Fetching your data. Please, wait."}, Duration = ToastDuration.Short, })); 

我怎样才能本地化?

有趣的是,他们都结合在一起。

对于2)和3)你需要创建一个控制器,它将持有一个ResourceLoader对象。 您可以使用(如果使用Windows 8.1), ResourceLoader.GetForIndependentUse()

在您的ResourceController创建一个名为GetTranslation(string resource) 。 它看起来像这样:

 private static ResourceLoader resourceLoader = ResourceLoader.GetForIndependentUse(); public static string GetTranslation(string resource) { return resourceLoader.GetString(resource); } 

然后,只要你需要一个静态的,编码的翻译,只需调用ResourceController.GetString(*key of the string you want*)

这对于简单的代码调用非常有用,但不直接用于Xaml,比如你的场景1)。 不要害怕,因为你有转换器的魔力!

 public class ResourceTranslationConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { var valString = value as string; // If what is being converted is a string, return the resource translation // Else return something else, such as the object itself return valString == null ? value : ResourceController.GetString(valString); } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } } 

然后,所有你需要做的就是定义一次转换器(可能是你所有的xaml都可以访问的,可能是一个合并到你的App.xaml的字典),你可以随时在一个绑定中引用它!

对于这个例子,像这样的:

 <!-- This is defined somewhere accessible, or just in the Page Resources --> <!-- 'converters' is whichever namespace definition your converter is in --> <converters:ResourceTranslationConverter x:Key="ResourceTranslationConverter"/> <ComboBox x:Name="comboBoxTopAppBar" Width="120" Margin="10,0,0,0" MinWidth="200" SelectedItem="{Binding SelectedStatus, Mode=TwoWay}"> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Converter={StaticResource ResourceTranslationConverter}}" </DataTemplate> <ComboBox.ItemTemplate> <x:String>Item 1</x:String> <x:String>Item 2</x:String> <x:String>Item 3</x:String> </ComboBox> 

这样,所有的文本都会在运行时自动通过ResourceLoader传递。 您定义的任何新项目也将自动翻译(只要它们在您的资源中有条目并被翻译)。

希望这有助于和快乐的编码!

我想发布一个替代的问题(1)使用C#代码在ComboBox本地化项目。 这是更直接的:

XAML

 <ComboBox x:Name="comboBoxTopAppBar"/> 

C#

 var loader = ResourceLoader.GetForCurrentView(); comboBoxTopAppBar.Items.Add(loader.GetString("kItem1")); comboBoxTopAppBar.Items.Add(loader.GetString("kItem2")); comboBoxTopAppBar.Items.Add(loader.GetString("kItem3")); comboBoxTopAppBar.SelectedIndex = 0;