构建一个接受语言包的应用程序

时间:2013-06-21 18:03:53

标签: c# asp.net-mvc multilingual

我在这里迷失了,我需要指导。

我需要构建一个支持语言包的Web应用程序......我们的想法是从默认语言(如英语)开始,然后客户端就可以下载语言包并安装它然后选择默认语言和任何其他已安装的语言。这个问题上有什么模式吗?也许我可以学习一个开源软件(并以此为例)?或者也许有一些关于它的文献?

Edit1:这里的想法是用户将在内部部署Web应用程序(或云IaaS)并安装尽可能多的语言包,应用程序将检查浏览器语言和检查是否有一个兼容的语言包转换为... .Net已经使用需要重新编译的本地化资源文件来做... ...

1 个答案:

答案 0 :(得分:2)

unix世界的例子是gettext,但我打赌你正在寻找更现代的东西。

在它的底部,你必须构造消耗字符串的代码,以使用成员来读取要处理/打印/等的字符串,例如this.mainForm.Title = StringLib.MainFormTitle

StringLib只是一个具有大量get / set属性的大型静态类。

然后,为您希望支持的每种语言创建单独的程序集,将它们命名为langpack.en-US.dll,langpack.it-IT.dll等。每个都包含两个类 - 一个您将实例化的类获取有关语言包(文化,版本等)和另一个类的元数据,在调用时,填充StringLib类的静态属性。

在运行时,查找所有langpack文件,然后使用反射加载它们。使用反射来确定lang包的名称,将其显示在列表中供用户选择。用户选择一个langpack,然后在lang包中调用初始化程序类。初始化程序通过大量调用来初始化StringLib类的属性,然后离开。

在MainApp.csproj中:

public class StringLib {
    public static string MainFormTitle { get; set; }
    ...
}

在langpack.en-US.csproj中:

public class LangPackDescriptor : ILangPackDescriptor { 
    public readonly string LangPackName = "American English";
    public readonly string CultureString = "en-US";
    ...
}

public class EnUsLangPackInit : ILangPackInit { 
    public void Init() {
        StringLib.MainFormTitle = "My Application Name"
        ...
    }
}

在langpack.it-IT.csproj

public class LangPackDescriptor : ILangPackDescriptor { 
    public static string LangPackName = "Italian";
    public string string CultureString = "it-IT";
    ...
}

public class ItItLangPackInit : ILangPackInit{ 
    public void Init() {
        StringLib.MainFormTitle = "Il Nome Del Mio Applicazione"
        ...
    }
}

使用反射进行初始化,给定文件名:

public void LoadLang(string filename) {
   Assembly langpackAssembly;
   ILangPackDescriptor descriptor;
   ILangPackInit initializer;

   langpackAssembly = Assembly.LoadFrom(filename);

   Type[] langpackTypes = langpackAssembly.GetExportedTypes();

   foreach( Type foundType in langpackTypes ) {
        if ( foundType.GetInterfaces().Contains<Type>( typeof(ILangPackDescriptor) ) ) {
            descriptor = Activator.CreateInstance(foundType);
        }

        if ( foundType.GetInterfaces().Contains<Type>( typeof(ILangPackInit) ) ) {
            initializer = Activator.CreateInstance(foundType);
        }
   }

   // If the passed-in file was the langpack.en-US.dll file, then this 
   // calls langpack.en-US.dll's EnUsLangPackInit.Init() method.
   initializer.Init();
}