如何在 SharpDevelop 4.2 中启动国际化的 WPF 项目?

2023-12-01

我想创建一个软件,用户可以在多种语言之间进行选择。

首先,我想学习如何处理国际化,因为我以前从未这样做过。

作为 IDE,我使用 SharpDevelop 或 #develop,但你可以拼写它。 我想使用 C# 和 WPF,因为我目前也在学习 XAML/WPF。

所以我在 ShardDevelop 中创建了一个新的 WPF 项目。 在主窗口上,我创建一个组合框和一个文本块。

组合框有两个条目:“德语”和“英语”。 文本块应显示“Hallo Welt!”或“Hello World!”,具体取决于所选的语言。

现在是我陷入困境的部分。 我想每种语言都有一个 XML/XAML 样式的单独文件(有道理)。 这些文件在哪里以及如何加载它们及其内容以便加载所选语言的文本?

我找到了几个例子,但都是关于创建 Resource-DLL 并使用一些奇怪的程序将它们反编译回 csv 文件......我不明白,有没有更简单的方法?


我采取了下一步。 TextBlock 的文本现在通过“{StaticResource Strings.MainForm.hwText}”加载。现在看起来像这样:

<TextBlock Text="{StaticResource Strings.MainForm.hwText}" />

我还为德语创建了一个 ResourceDictionary,为英语创建了一个 ResourceDictionary,它们都定义了我在 TextBlock 中使用的键。

在 Application.Resources 第一部分中,默认加载 ResourceDictionary 之一。

现在的问题是:我如何在运行时“卸载”这个字典并将其替换为另一个字典?

当然,我使用 ComboBox 的 SelectionChange-Event,但是我在那里做什么?


问题解决了!!感谢 克马蒂亚泽克

尽管我根据我的需要稍微更改了事件处理程序的代码:

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.

Example:

第一个资源文件(Lang.en-US.xaml):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:system="clr-namespace:System;assembly=mscorlib">

    <system:String x:Key="Username">Username:</system:String>
    <system:String x:Key="Password">Password:</system:String>
    <system:String x:Key="close">Close</system:String>
    <system:String x:Key="login">Login</system:String>        
</ResourceDictionary>

第二个资源文件(Lang.pl-PL.xaml):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:system="clr-namespace:System;assembly=mscorlib">

    <system:String x:Key="Username">Login:</system:String>
    <system:String x:Key="Password">Hasło:</system:String>
    <system:String x:Key="close">Zamknij</system:String>
    <system:String x:Key="login">Zaloguj</system:String>
</ResourceDictionary>

在应用程序资源中设置默认语言:

 <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Lang.en-US.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
 </Application.Resources>

假设我们有如下所示的 ComboBox:

<ComboBox Name="cbLang" Margin="2" SelectionChanged="cbLang_SelectionChanged" >
                <ComboBoxItem Content="English" Tag="en-US" />
                <ComboBoxItem Content="Polish" Tag="pl-PL" />
  </ComboBox>

代码隐藏选择已更改:

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

你可以像这样绑定:

 <TextBlock Text="{DynamicResource Username}" VerticalAlignment="Center" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 SharpDevelop 4.2 中启动国际化的 WPF 项目? 的相关文章

随机推荐

  • debian docker 上的 GLIBC 不兼容

    我正在尝试构建一个以 rust rocksdb 作为依赖项的 Rust 应用程序 使用最新的 rust docker 映像进行编译 然后将二进制文件移动到 debian 这就是我的 Dockerfile 的样子 FROM rust 1 61
  • 我可以从批量插入中检索lastInsertId吗?

    INSERT INTO details idactivity user hours val date VALUES 981 133 0 10500 2008 07 01 981 184 0 2750 2008 07 01 981 184 0
  • 捕获所有无效子域的 nginx 服务器块

    我在一台主机上有多个域 nginx 管理所有这些域 每个域都有自己的 SSL 证书 我使用 webroot 插件从 certbot 获取该证书 我在每个配置文件的末尾都有一个服务器块 作为 包罗万象 来自here and here 对于无效
  • 使用点斜杠的最佳实践是什么?

    我在日志文件中看到大量与在锚标记的 href 属性上使用点斜杠 相关的错误 仅当点击来自 java 客户端时才会发生 HTML文档 a href myPage php Link to a dot slash file a 访问日志条目 my
  • 线程无法访问该对象

    我声明了一个字段 WriteableBitmap colorBitmap 然后我创建了一个简单的线程来执行某些操作 private void doSomething bla bla bla colorBitmap new Writeable
  • 谷歌地图多个信息窗口不起作用

    我尝试使用 javascript 将多个标记和信息窗口添加到谷歌地图 下面是代码
  • 在ansible中用多个值替换多个模式

    我在用regex replace在ansible中过滤 我可以让它工作 但它真的很麻烦 这就是我正在做的 set fact variable value regex replace 84 89 regex replace 76 78 reg
  • Javascript 对项目进行排序,排除某些特定项目

    我正在尝试对一些项目进行排序 对地图进行排序 我可以成功对其进行排序 但我想根据其属性排除一些项目 现在我根据属性 价格这样排序 return product attr active f sort function pA pB return
  • yii 模型搜索,带有时间戳的日期范围

    任何人都可以发布如何使用日期选择器过滤网格视图时间戳 Y m d h m s 列 我的模型如下 public function search criteria new CDbCriteria criteria gt condition ti
  • rmarkdown 中的变量作为标题

    In short 如何在 rmarkdown 中的块内打印 html header 使用变量在代码块内创建标头 In long 假设我的数据集中有许多变量 名称也存储在向量 Vars 中 并且每组 3 个变量属于同一主题 我可以创建一个循环
  • 在 XSLT 中使用 HTML 实体(例如 )

    在 XSLT 中包含 html 实体的最佳方式是什么
  • 求和值时返回 NaN 的对象

    我承认我在 JavaScript 和 JSON 方面很弱 我花了很多时间试图弄清楚为什么我的对象中的数字相加时会返回 NaN 考虑到这一点 下面是我的 JSON 存储到一个变量中 var data acc ext id null cat c
  • 'mov cx, [bp+6]' 使用什么寻址模式?

    mov cx bp 6 使用什么寻址模式 处理器是intel 8086 我正在学习Douglas V Hall 的 微处理器和接口 我知道它的内存寻址模式 但不确定它是基于寻址模式还是索引寻址模式 bp 6 是基于寻址模式 来自原始 808
  • laravel 4 关系 - 如何显示用户投票记录的前 5 名排名

    我正在创建一个新闻源系统 正如你很容易猜到的那样 这超出了我的能力范围 请善待我 让我走上正轨 或者提供一些我可以继续做的事情 我有数百个事件 模型名称为 Event1 表 事件 我还有一个数据透视表 用户可以在其中分配任何事件的重要性 值
  • 绑定到画布

    我的类中有一个 canvas 属性 我想知道是否可以将其绑定到 xaml 中的画布 数据绑定在画布中如何工作
  • 从http get请求中读取非英文字符

    我在从 http get 请求获取希伯来字符时遇到问题 我得到像这样的正方形字符 而不是希伯来字符 英文字符没问题 这是我的功能 public String executeHttpGet String urlString throws Ex
  • 为什么我的收集器方法不能并行处理数据?

    然而 假设此归约中使用的结果容器是一个并发可修改的集合 例如 ConcurrentHashMap 在这种情况下 累加器的并行调用实际上可以将它们的结果同时存入同一个共享结果容器中 从而消除了组合器合并不同结果容器的需要 这可能会提高并行执行
  • Visual Studio 正则表达式使用宏删除 VB.NET 代码中的所有注释和空行

    我试图在宏的帮助下删除文件中的所有注释和空行 现在我想出了这个解决方案 它删除了注释 下面描述了一些错误 但无法删除之间的空白行 Sub CleanCode Dim regexComment As String REM d D r n
  • 尝试安装 Matlab 编译器运行时时出现 JRE 错误

    我再一次花了很多时间试图让一些东西发挥作用 但没有成功 我想在未安装 MATLAB 的 Ubuntu 13 04 上安装 MATLAB 编译器运行时 这就是我所做的 我下载了64位Linux版本R2012b 8 0 http www mat
  • 如何在 SharpDevelop 4.2 中启动国际化的 WPF 项目?

    我想创建一个软件 用户可以在多种语言之间进行选择 首先 我想学习如何处理国际化 因为我以前从未这样做过 作为 IDE 我使用 SharpDevelop 或 develop 但你可以拼写它 我想使用 C 和 WPF 因为我目前也在学习 XAM