我正在翻译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。显然我错了。
另一方面,似乎当前线程的文化也不会影响库行为。
所以我问......
问:
提前致谢。
答案 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
};