具有资源文件的动态本地化 WPF 应用程序

2024-01-17

试图使我的 wpf 应用程序本地化,我遵循这个 CodeProject 教程 https://www.codeproject.com/Articles/299436/WPF-Localization-for-Dummies.

我创建了本地化资源文件(例如 Resource.resx、Resource.en-US.resx)并将它们绑定到 xaml 中的标签元素上

<Label Foreground="{StaticResource ApplicationForgroundColor}" FontSize="21"
           Content="{x:Static strings:Resources.title}"/> 

在 LocalizedService 中我设置了CultureInfo关于一些变化事件

class LocalizationService
{
    public static void SetLanguage(string locale)
    {
        if (string.IsNullOrEmpty(locale)) locale = "en-US";
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(locale);
    }
}

该解决方案编译并显示正确的资源值,但由于静态绑定,我无法在运行时更改区域设置。 当我将内容绑定更改为DynamicResource如下所示,没有显示资源价值。

Content="{DynamicResource strings:Resources.title}"

如何将文本值绑定到本地化资源文件并在运行时动态更改它?


还有另一种方法代码无限在这里 https://codinginfinity.me/post/2015-05-10/localization_of_a_wpf_app_the_simple_approach它还使用包装器来动态绑定资源文件。 这里的INotifyPropertyChanged当区域设置更改时,事件会通知您的 ui 元素新的绑定资源文件。

您开始实现 BindingExtension:

public class LocalizationExtension : Binding
{
    public LocalizationExtension(string name) : base("[" + name + "]")
    {
        this.Mode = BindingMode.OneWay;
        this.Source = TranslationSource.Instance;
    }
}

然后你需要实现a之间的连接ResourceManagerCultureInfo它作为单例实现以启用同步访问。它定义了绑定元素的源,并在本地化更改时触发 INotifyPropertyChanged` 事件:

public class TranslationSource : INotifyPropertyChanged
{
    private static readonly TranslationSource instance = new TranslationSource();

    public static TranslationSource Instance
    {
        get { return instance; }
    }

    private readonly ResourceManager resManager = Resources.Strings.Resources.ResourceManager;
    private CultureInfo currentCulture = null;

    public string this[string key]
    {
        get { return this.resManager.GetString(key, this.currentCulture); }
    }

    public CultureInfo CurrentCulture
    {
        get { return this.currentCulture; }
        set
        {
            if (this.currentCulture != value)
            {
                this.currentCulture = value;
                var @event = this.PropertyChanged;
                if (@event != null)
                {
                    @event.Invoke(this, new PropertyChangedEventArgs(string.Empty));
                }
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

请注意,您的本地化资源文件(例如 Resource.resx、Resource.en-US.resx)位于该文件夹中<Project>/Resources/Strings/Resources/否则你需要更新这部分代码。

现在您可以使用这个新绑定:

<Label Foreground="{StaticResource ApplicationForgroundColor}" FontSize="21"
       Content="{util:Localization title}"/>

要在运行时更改区域设置,您需要设置:

public static void SetLanguage(string locale)
{
    if (string.IsNullOrEmpty(locale)) locale = "en-US";
    TranslationSource.Instance.CurrentCulture = new System.Globalization.CultureInfo(locale);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有资源文件的动态本地化 WPF 应用程序 的相关文章

随机推荐

  • 将引导日期时间选择器与 Vuejs 2 结合使用

    我想将日期时间选择器与 vue 2 或 webpack 集成 我尝试搜索但找不到相关文章 有没有人将日期时间选择器与Vue2或webpack集成 有任何示例代码可供参考吗 任何帮助将不胜感激 Thanks 只需谷歌搜索 您肯定可以找到有关该
  • 如何在 Linux 2.6.35 上从用户模式清除和无效 ARM v7 处理器缓存

    我尝试清除指令行的 ARM v7 处理器缓存并使之无效 因为指令代码在执行中可能会发生变化 为了达到效果 我尝试了两种变体 他们来了 我用过海湾合作委员会 清除缓存 函数 但没有给出所需的结果 缓存中的指令代码没有改变 我寻找了 GCC 的
  • CountDownLatch 是否受到虚假唤醒的影响?

    诸如等待 通知和锁定 条件之类的并发管理机制似乎受到以下因素的影响虚假唤醒 https en wikipedia org wiki Spurious wakeup 开发人员通过重新检查情况是否确实发生变化来应对这些意外的唤醒 当谈到 Cou
  • 如何使用 Sql Profiler 捕获 SqlBulkCopy 中传递的数据?

    我一直在使用 Sql Profiler 来捕获 SQL 语句并重新运行有问题的语句 很有用 但是 有些代码使用 SqlBulkCopy API 我不知道如何捕获这些代码 我看到临时表的创建 但没有填充它们 似乎 SqlBulkCopy 绕过
  • Activity 的实例什么时候会消亡?

    这是一个示例代码 让我有点想念 package com leak import android app Activity import android app ProgressDialog import android os AsyncTa
  • 随机选择设置位的有效方法

    我当前的爱好项目为纸牌游戏提供蒙特卡罗模拟French牌组 52 张牌 从 2 到 A 为了尽可能快地进行模拟 我在某些地方将多张卡表示为位掩码 这是一些 简化的 代码 public struct Card public enum Card
  • 将特征矩阵转换为 C++ 形式的三元组

    我认为 Eigen 使用压缩方法来存储稀疏矩阵 有什么方法可以从 std vectors 中提取特征稀疏矩阵的三重格式向量 Thanks 更多信息 三元组格式的示例 矩阵的三元组格式 A 3 0 4 0 0 0 1 0 0 2 0 5 4
  • Selenium - 跨域和 HTTPS 问题

    我使用 Selenium 来测试我的网站 该网站需要访问外部目录才能从中选择一些项目 问题是该目录是通过 HTTPS 协议发布在另一个域上的 我在互联网上搜索并阅读了许多有关 Selenium 和跨域问题的主题 但我仍然没有找到答案 有些主
  • 在 python seaborn 图中创建多列图例

    我在用seaborn distplot python3 并希望每个系列有 2 个标签 我尝试了一种黑客字符串格式方法 如下所示 bigkey and bigcount are longest string lengths of my key
  • 使用单个标识符 REST 方式嵌套资源路由

    在我的 Rails 应用程序中 两个实体之间有一个相当标准的 has many 关系 AFoo有零个或多个Bars a Bar恰好属于一个Foo Foo 和 Bar 均由单个整数 ID 值标识 这些值在其各自的所有实例中都是唯一的 Bar
  • iOS 保持状态栏为纵向

    我有一个使用接近传感器的应用程序 但接近传感器在横向模式下不起作用 我听说如果你将状态栏保持在纵向模式 传感器就会工作 我已经尝试过 但没有成功 UIApplication sharedApplication setStatusBarOri
  • SSRS 在组内交替行颜色

    我在获取替代行颜色时遇到一些问题 我尝试了不同的表达方式 这是我已经完成的最接近的表达方式 IIF RunningValue Fields agent name Value CountDistinct Nothing MOD 2 1 Gai
  • CHM 格式替代品?

    Microsoft CHM 格式非常有用 因为它提供了以下功能 带有树视图的目录 指数 索引搜索 基于 HTML 源 但这种格式已经过时并且有很多缺点 存在安全问题 允许执行 JavaScript 代码 不知道新的 HTML 格式 没有记录
  • 反应过渡组出现过渡无法正常工作

    我在用着反应过渡基团 http reactcommunity org react transition group transition渲染组件时处理动画 CSSTransition 我想要一个组件的简单淡入 转出似乎工作正常 但转入则不然
  • Tkinter 单选按钮指示器无法识别

    我希望我的单选按钮通过设置 Indicatoron 0 来使用本页提到的按钮框界面 http effbot org tkinterbook radiobutton htm http effbot org tkinterbook radiob
  • 使用多线程时如何使用Delphi设计时FireDac TFDQuery?

    我想设计我的TFDQuery使用组件编辑器 即在设计时设置 SQL 字符串 选项等 然后在线程中使用查询 我的问题是 线程的每个运行实例都需要自己的查询实例 否则它将不是线程安全的 我是否应该在线程开始运行时克隆查询 即在线程的 Execu
  • 检查 Windows 更新是否可用

    是否可以通过编程方式检查 Windows 是否有可用的新更新 欢迎任何建议 谢谢 The Windows更新代理 http msdn microsoft com en us library aa387287 28VS 85 29 aspxA
  • 如何将当前文档的innerHTML下载为文件?

    有没有办法可以下载当前文档innerHTML作为文件以编程方式 我做了以下尝试但没有成功 它确实下载了当前文档的源代码 但这不是我想要的 因为我想保留任何加载后的文档修改 var save document createElement a
  • 如何使用gin作为服务器编写prometheus导出器指标

    这是官方的prometheus golang client示例 package main import log net http github com prometheus client golang prometheus github c
  • 具有资源文件的动态本地化 WPF 应用程序

    试图使我的 wpf 应用程序本地化 我遵循这个 CodeProject 教程 https www codeproject com Articles 299436 WPF Localization for Dummies 我创建了本地化资源文