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 本地化扩展翻译窗口的推荐方法是什么?
- 如何列出可用的翻译?
提前谢谢.
看来我上次编译库时不小心引入了一个错字(或者我的硬盘/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 提供程序处于活动状态,它就会起作用。
LocalizeExtension
的 Culture
属性独立于线程的 UI 区域性。有时这可能是需要的,因为线程区域性确实会影响很多事情。我们在自己的项目中使用该扩展,并手动设置线程区域性以匹配LocalizeDictionary
的区域性。
通常,这应该自动更新 UI。确保在 XAML 中使用LocText
标记扩展,例如:
<TextBlock Text="{lex:LocText Bla:Bla:Bla}" />
更新:要获取可用翻译的列表,您可以尝试以下操作:
从 .resx 文件组获取所有可用的区域性
但是,我建议您只在代码中提供语言的修复列表,或者如果您使用的是 IoC 容器,请在此处注册可用语言。
这并没有回答OP的问题,但我想无论如何我都会在这里发布它,供那些从谷歌徘徊在这里的人使用,因为问题的标题是相关的。
我遇到了一个问题,在运行时更改语言时,我的应用程序将被部分翻译。起初以为这是一个约定问题,因为我每个页面都有单独的资源,但真正的问题是第一页中的最后一个控件无法翻译,所以它打破了链条,导致所有子页面都没有被翻译。
我正在翻译文本块的FallbackValue
,当绑定为 null 时,我使用此属性显示默认文本。
无论如何,要捕获此类错误,您可以订阅以下事件:
LocalizeDictionary.Instance.MissingKeyEvent += (sender, args) =>
{
//Do something
};