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
,那么这是一种编译时预处理。我在寻找一种运行时预处理的方法(如果存在的话)。