C# 消息的动态本地化
我对消息进行了简单的本地化。所有消息都存储在静态类C# 消息的动态本地化,c#,wpf,winforms,C#,Wpf,Winforms,我对消息进行了简单的本地化。所有消息都存储在静态类Lng public static partial class Lng { public static readonly string AppName = "My application"; public static class Category1 { public static readonly string ConfirmDelete = "Are you sure want to delete?";
Lng
public static partial class Lng
{
public static readonly string AppName = "My application";
public static class Category1
{
public static readonly string ConfirmDelete = "Are you sure want to delete?";
}
}
在代码中,使用与引用字段一样简单
MessageBox.Show(Lng.Category1.ConfirmDelete, ...
还有一位经理,负责以下工作:
- 语言选择
- 加载对应的翻译
- 通过反射更新字段
- 在应用程序退出时导出当前选定的语言以进行更新(如果选择了默认语言,则为任何其他语言创建第一个翻译)
TranslateLng("Lng.", typeof(Lng));
...
private static void TranslateLng(string parent, Type type)
{
foreach (Type nested in type.GetNestedTypes())
{
string child = string.Format("{0}{1}.", parent, nested.Name);
TranslateLng(child, nested);
foreach (var field in nested.GetFields())
{
string key = child + field.Name;
DefaultAdd(key, (string)field.GetValue(null)); // store value in default language dictionary (if not created yet)
field.SetValue(null, GetValue(key)); // get value for currently selected language
}
}
该系统有一个问题:所有消息都定义在一个类中,需要手动管理(在更新使用它们的代码时删除和更新消息) 我正在考虑将管理器更改为动态注册字符串,并将用法简化为
MessageBox.Show(Lng.Text("Are you sure want to delete?"), ...
这样,文本就在它使用的地方定义,重复的文本可以由管理器处理,等等
然而,有两个问题:
- 在应用程序运行结束时,我需要所有消息的完整列表,以导出完整的消息列表(对于当前选定的语言)。如果在运行时从未调用过一些
,会怎么样?在代码中使用它们时,是否有方法注册它们?这样,所有调用都将以某种方式注册,即使从未使用“代码和平”Lng.Text()
- 如何生成
。我可以使用,但正确的键更有用,因为它们告诉了确切的目的。例如,键
。我可以调用Lng.Configuration.Appearance.CaptionText
,但是我必须管理密钥,确保它们的唯一性,这对我没有吸引力Lng.Text(key,message)
资源
与该项目相结合,取得了巨大成功。当您在提取资源时手动输入密钥时,拥有这些资源可以解决密钥问题。您还可以从Resharper
获得强大的支持,这使整个过程变得轻而易举
然后使用
Sisulizer
提取资源以及Win表单和WPF类中硬编码的字符串。它可以导出一个CSV,你可以给你的翻译人员,它也支持CSV,这使得测试此类应用程序非常容易。你的问题是什么?你为什么不正常地使用资源进行本地化?请参阅和@ThomasLevesque,请参阅问题
部分。如果方法调用没有被调用,如何注册它们(如果可能,如果没有-是否有我需要的替代方法)?如何组织密钥生成?或者你可以回答你将如何组织我试图实现的目标(如果这与我的方法完全不同)。@Sonhja,因为winforms和wpf中的默认本地化是垃圾。全是废话。管理应用程序资源甚至不如使用静态字段好(比较添加字符串和引用字符串所需的工作量,在我的例子中以及微软提供的例子中)。谢谢,但我不是问如何本地化。它已经本地化了,而且两种方法都非常有效:本地化过程和动态语言选择。我只是想优化它。硬编码字符串
听起来很有趣,但是如果你说Resharper
,那么这是一种编译时预处理。我在寻找一种运行时预处理的方法(如果存在的话)。