WPF Localize Extension:在运行时翻译窗口

时间:2013-02-03 01:40:39

标签: c# wpf internationalization

我正在翻译WPF窗口。我正在使用WPF Localize Extension。到目前为止,我只在<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 Localize Extension在运行时翻译窗口的推荐方法是什么?
  • 我如何列出可用的翻译?

提前致谢。

3 个答案:

答案 0 :(得分:6)

上次我编译库时(或者我的硬盘/ 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提供程序处于活动状态就可以正常工作。

答案 1 :(得分:1)

LocalizeExtension的{​​{1}}属性独立于线程UI文化。有时可能需要这样做,因为线程文化确实会影响很多事情。我们在自己的项目中使用扩展,并手动设置线程文化以匹配Culture的文化。

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

LocText

<强>更新: 要获取可用翻译列表,您可以尝试这样做:

Get all available cultures from a .resx file group

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

答案 2 :(得分:0)

这不符合OP的问题,但我认为无论如何我都会在谷歌这里发帖,因为这个问题的标题是相关的。

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

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

无论如何,要捕获这样的错误,您可以订阅以下事件:

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