Antelcat.I18N
给WPF/Avalonia应用程序提供响应式的多语言支持。
Nuget 包 Antelcat.I18N.WPF
Github
样例
用法
前提
-
准备一份资源文件
-
设计一个类用来提供资源Key值
这个类必须是partial
类,然后标注特性[ResourceKeysOf(Type)]
其中的type
就是资源文件生成的Resources.Desiginer.cs
中的类using Antelcat.Wpf.I18N.Attributes namespace Your.Project; [ReosurceKeysOf(typeof(Resources))] public partial class LangKeys{}
这个特性会自动生成另一部分类,包含资源的Key值
静态绑定
完成前面的步骤,接着在 .xaml
文件中就可以绑定了
<TextBlock Text="{I18N {x:Static yP:LangKeys.Language}}" />
切换语言的时候只需要调用
Antelcat.Wpf.I18N.I18NExtension.Culture = new CultureInfo("en");
这时候就能看到文本在动态更换
动态绑定
有时你的源文本并不是在你的应用程序中定义的,而是从其他来源(如网络)接收到的,也可以传递一个绑定来进行翻译
<TextBlock Text="{I18N {Binding Message}}"/>
内存中的文本更新和语言更新都能实时响应
多个文本组合和格式化
有些情况下,你需要将多个文本组合起来,或者对文本进行格式化,你可以使用I18N
和LanguageBinding
来实现。
如果你已经有了如下翻译的.resx
文件:
<data name="Current_is" xml:space="preserve">
<value>当前的 {0} 是 {1}</value>
</data>
<data name="Language" xml:space="preserve">
<value>语言</value>
</data>
<data name="Chinese" xml:space="preserve">
<value>中文</value>
</data>
并且在.xaml
中
<TextBlock>
<TextBlock.Text>
<I18N Key="{x:Static myProject:LangKeys.Current_is}">
<LanguageBinding Key="{x:Static myProject:LangKeys.Language}"/>
<Binding Path="Language"/> <!--source text from view model-->
</I18N>
</TextBlock.Text>
</TextBlock>
此时 I18N.Key
是字符串的模板,其中的 LanguageBinding
和 Binding
会提供模板的参数,他们会被按顺序格式化成最终的文本。同时保持整体的响应性。