如何在SharpDevelop 4.2中启动国际化的WPF项目?
我想创建一个软件,用户可以在几种语言之间进行选择。
作为一个开始,我想学习如何处理国际化,因为我以前从未这样做过。
作为IDE我使用SharpDevelop或#develop,但你会拼写它。 我想使用C#和WPF,因为我现在也在学习XAML / WPF。
所以我在ShardDevelop中创建了一个新的WPF项目。 在主窗口上,我创建了一个ComboBox和一个TextBlock。
ComboBox获得两个条目:“德语”和“英语”。 textBlock应该显示“Hallo Welt!” 或“Hello World!”,具体取决于所选的语言。
现在是我陷入困境的部分。 我想每种语言都是XML / XAML-Style中的单独文件(有道理)。 这些文件在哪里以及如何加载它们及其内容以便加载所选语言的文本?
我找到了几个例子,但都是关于创建Resource-DLL和使用一些奇怪的程序将它们反编译回csv文件……我不明白,是不是有更简单的方法?
我采取了下一步。 现在通过“{StaticResource Strings.MainForm.hwText}”加载TextBlock的Text。 它现在看起来像这样:
我还为德语创建了一个ResourceDictionary,为英语创建了一个ResourceDictionary,它们都定义了我在TextBlock中使用的键。
在Application.Resources Part i中,默认情况下加载一个ResourceDictionary。
现在的问题是:如何在运行时“卸载”这个词典并将其替换为另一个词典?
当然我使用ComboBox的SelectionChange-Event,但我在那里做什么?
问题解决了!! 感谢kmatyaszek
虽然我根据我的需要改变了事件处理程序的代码:
Uri baseUri = new Uri(AppDomain.CurrentDomain.BaseDirectory); Uri uri = new Uri(baseUri,"Languages\\lang."+((sender as ComboBox).SelectedItem as ComboBoxItem).Tag.ToString()+".xaml"); if(File.Exists(uri.LocalPath) || File.Exists((uri = new Uri(baseUri,"Languages\\lang.de-DE.xaml")).LocalPath)){ ResourceDictionary dict = new ResourceDictionary(); dict.Source = uri; this.Resources.MergedDictionaries.Add(dict); }
如果您创建了两个ResourceDictionary文件,则可以通过DynamicResource
进行绑定。
例:
第一个资源文件(Lang.en-US.xaml):
Username: Password: Close Login
第二个资源文件(Lang.pl-PL.xaml):
Login: Hasło: Zamknij Zaloguj
在Application资源中设置默认语言:
假设我们有如下的ComboBox:
代码隐藏SelectionChanged:
private void cbLang_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { ResourceDictionary dict = new ResourceDictionary(); switch (((sender as ComboBox).SelectedItem as ComboBoxItem).Tag.ToString()) { case "en-US": dict.Source = new Uri("Lang.en-US.xaml", UriKind.Relative); break; case "pl-PL": dict.Source = new Uri("Lang.pl-PL.xaml", UriKind.Relative); break; default: break; } this.Resources.MergedDictionaries.Add(dict); }
你可以像这样绑定: