WPF 本地化扩展:运行时翻译窗口

本文关键字:翻译 窗口 运行时 本地化 扩展 WPF | 更新日期: 2023-09-27 17:57:22

我正在翻译WPF窗口。我正在使用 WPF 本地化扩展。到目前为止,我只有用于测试目的的西班牙语翻译<Resource>.es.resx文件中。在设计时翻译工作。所以我想我走在正确的轨道上.

我已经包含了在运行时动态翻译 GUI 的菜单项。最初我尝试了这个(天真的)命令...

public class CmdTranslateUI : ICommand
{
    bool ICommand.CanExecute(object parameter)
    {
        // TODO: Query available translations
        return true;
    }
    public event EventHandler CanExecuteChanged;
    void ICommand.Execute(object parameter)
    {
        LocalizeDictionary.Instance.Culture = new CultureInfo(
            (string) parameter);
    }
}

。并且每种语言的菜单项都以这种方式在 XAML 中绑定到它。

<MenuItem Header="Español" CommandParameter="es-ES">
    <MenuItem.Command>
        <l:CmdTranslateUI />
    </MenuItem.Command>
</MenuItem>

事实是 这种方法不起作用 .无论如何,文化信息仍设置为"en-US"。我在设置时读到LocalizeDictionary.Instance.Culture触发了它的DictionaryEvent,所以我认为这会自动更新 GUI .显然我错了.

另一方面,似乎当前线程的文化也不会影响库的行为。

所以我问...

问:

  • 在运行时使用 WPF 本地化扩展翻译窗口的推荐方法是什么?
  • 如何列出可用的翻译?

提前谢谢.

WPF 本地化扩展:运行时翻译窗口

看来我上次编译库时不小心引入了一个错字(或者我的硬盘/CPU中有鬼魂)。设置LocalizeDictionary.Instance.SetCurrentThreadCulture后,语言切换现在可以工作。

仅供记录,这就是上面提到的命令类应该是什么样子

public class CmdTranslateUI : ICommand
{
    bool ICommand.CanExecute(object parameter)
    {
        CultureInfo ci = new CultureInfo((string)parameter);
        foreach (CultureInfo c in ResxLocalizationProvider.Instance.AvailableCultures)
        {
            if (ci.Name == c.Name)
                return true;
            else if (ci.Parent.Name == c.Name)
                return true;
        }
        return false;
    }
    public event EventHandler CanExecuteChanged;
    void ICommand.Execute(object parameter)
    {
        LocalizeDictionary.Instance.SetCurrentThreadCulture = true;
        LocalizeDictionary.Instance.Culture = new CultureInfo(
            (string) parameter);
    }
}

。至少这是一种简单的方法,只要资源文件 L10N 提供程序处于活动状态,它就会起作用。

LocalizeExtensionCulture 属性独立于线程的 UI 区域性。有时这可能是需要的,因为线程区域性确实会影响很多事情。我们在自己的项目中使用该扩展,并手动设置线程区域性以匹配LocalizeDictionary的区域性。

通常,这应该自动更新 UI。确保在 XAML 中使用LocText标记扩展,例如:

<TextBlock Text="{lex:LocText Bla:Bla:Bla}" />

更新:要获取可用翻译的列表,您可以尝试以下操作:

从 .resx 文件组获取所有可用的区域性

但是,我建议您只在代码中提供语言的修复列表,或者如果您使用的是 IoC 容器,请在此处注册可用语言。

这并没有回答OP的问题,但我想无论如何我都会在这里发布它,供那些从谷歌徘徊在这里的人使用,因为问题的标题是相关的。

我遇到了一个问题,在运行时更改语言时,我的应用程序将被部分翻译。起初以为这是一个约定问题,因为我每个页面都有单独的资源,但真正的问题是第一页中的最后一个控件无法翻译,所以它打破了链条,导致所有子页面都没有被翻译。

我正在翻译文本块的FallbackValue,当绑定为 null 时,我使用此属性显示默认文本。

无论如何,要捕获此类错误,您可以订阅以下事件:

LocalizeDictionary.Instance.MissingKeyEvent += (sender, args) =>
{
    //Do something
};