4

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

我已经包含了在运行时动态转换 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.CultureDictionaryEvent被触发,所以我认为这会自动更新 GUI。显然我错了。

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

所以我问...

问:

提前致谢 。

4

3 回答 3

5

上次编译库时,我似乎无意中引入了一个错字(或者我的 HDD/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 提供程序处于活动状态,它就可以工作。

于 2013-02-04T07:37:45.393 回答
1

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

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

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

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

从 .resx 文件组中获取所有可用的文化

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

于 2013-02-03T02:07:28.563 回答
0

这并不能回答 OP 的问题,但我想我还是会把它贴在这里,因为问题的标题是相关的。

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

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

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

LocalizeDictionary.Instance.MissingKeyEvent += (sender, args) =>
{
    //Do something
};
于 2018-01-18T16:38:29.803 回答