我对信息作了一个简单的本地化。所有消息都存储在静态类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()中的某些成员从未在运行时被调用呢?是否有一种方法可以在代码(编译时)中使用它们注册?这样,所有的调用都会以某种方式被注册,即使代码的宁静从未被使用过。key。我可以使用CallerMemberName,但是正确的键更有用,因为它们说明了确切的目的。例如,Lng.Configuration.Appearance.CaptionText。我可以打电话给Lng.Text(key, message),但是我必须管理密钥,确保它们的唯一性,这并不吸引我。发布于 2014-07-17 11:17:25
最近我做了一个国际化的项目,我们把Resources和西苏利泽程序结合起来,取得了很大的成功。当您在提取资源时手动输入密钥时,拥有这些资源可以解决您的密钥问题。您还得到了Resharper的大力支持,这使得整个过程变得轻而易举。
然后使用Sisulizer提取我们的Win窗体和WPF类中硬编码的资源和字符串。它可以导出一个CSV,你可以给你的翻译器,它也支持伪翻译,这使得测试这些应用程序也非常容易。
https://stackoverflow.com/questions/24798097
复制相似问题