如何在Windows应用商店应用中本地化通知和组合框? (C#/ XAML,多语言应用工具包)

时间:2014-05-07 11:45:53

标签: windows localization windows-runtime windows-store-apps winrt-xaml

我在Windows商店应用本地化方面存在一些问题。我能够本地化像TextBlock.Text或Button.Content(I'm doing it in the same way as shown here)之类的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)。 C#代码中的Toast通知(我正在使用来自&#34的类库;通过C#和#34的Windows Runtime;书籍)

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

我如何本地化?

2 个答案:

答案 0 :(得分:2)

有趣的是,他们都联系在一起。

对于2)和3),您需要创建一个包含ResourceLoader对象的Controller。您可以使用(如果使用Windows 8.1)ResourceLoader.GetForIndependentUse()

在名为ResourceController的{​​{1}}中创建一种方法。它看起来像这样:

GetTranslation(string resource)

然后,只要您需要静态的编码翻译,只需拨打private static ResourceLoader resourceLoader = ResourceLoader.GetForIndependentUse(); public static string GetTranslation(string resource) { return resourceLoader.GetString(resource); }

这适用于简单的代码调用,但不能直接用于Xaml,例如您的方案1)。但不要害怕,因为你拥有转换器的魔力!

ResourceController.GetString(*key of the string you want*)

然后,你所要做的就是定义转换器一次(可能在某个地方可以从你的所有xaml访问,可能是一个字典合并到你的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(); } } 中),你可以随时在绑定中引用它!

对于这个例子,例如:

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> 。您定义的任何新项目也将自动翻译(只要他们在您的资源中有一个条目并进行翻译)。

希望这有助于编码!

答案 1 :(得分:0)

我想发布问题的替代方法(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;