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

本文关键字:语言 应用程序 一个 构建 | 更新日期: 2023-09-27 18:19:21

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

我需要建立一个web应用程序,将支持语言包…这个想法是从一个默认语言开始,比如英语,然后客户端将能够下载一个语言包并安装它,然后在默认语言和任何其他已安装的语言之间进行选择。这件事有什么规律吗?也许是一个我可以学习的开源软件(并作为一个例子)?或者是一些关于它的文献?

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

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

来自unix世界的示例是gettext,但我打赌您正在寻找更现代的东西。

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

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

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

在运行时查找所有的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();
}