用户定义的多种语言应用程序






3.69/5 (7投票s)
开发允许用户创建自己语言文件的多语言应用程序
引言
我最近的一个应用程序需要多语言功能。软件的用户很乐意为他的语言提供特定于语言的字符串。我只需要给他文件。多语言应用程序和本地化在很多地方都有讨论,但我还没有看到任何简单的方法,让最终用户可以通过简单地创建和编辑一个新的“语言文件”来创建自己的语言。这种可换肤的语言方法提供了大量的用户自定义,但在聘请翻译方面花费最少。

背景
这种方法创造了一个有趣的编程挑战。这个语言文件会是什么样的?应用程序将如何加载语言文件并更新控件?当我在应用程序的未来版本(它们有新的文本项)中创建新的表单和控件,而用户正在使用旧的语言文件时,会发生什么情况?我如何从应用程序中的任何地方访问“语言库”,而无需从一个表单传递到另一个表单?
这些问题基本上由两个词回答:反射和单例。好的,还有很多其他的词可以应用,但这两个概念帮助我最终找到了一个我喜欢的解决方案。
因此,废话不多说,这就是方法。
LanguageLoader
是一个单例类,包含应用程序字符串,可以读/写语言文件。可以在项目中的任何地方访问此类。如果您在应用程序中的任何地方更新它,则更新在其他地方可用。这个单例东西很酷!- 您将字符串添加到“
ApplicationStrings
”类中。此类由LanguageLoader
(用于加载和保存)通过反射访问。这个反射东西也很酷! - 为了方便地更新控件,如果每个表单都有一个更新表单上所有字符串的方法,这会很有帮助。可以在表单的“
Load
”方法中调用此方法,也可以在用户更改语言时调用此方法。
Using the Code
所以让我们开始吧
- 创建一个 Windows 窗体应用程序。
让我们添加一个标签。 Visual Studio 称它为“label1
”。 我感觉不太有创意,所以让我们保持原样。 我们还可以添加一个按钮,并将其命名为“button1
”。 - 现在是乐趣的部分。 将
LanguageLoader
和IniAccess
添加到解决方案中。 在LangaugeLoader
文件中,填写字符串的默认值。 (在文件的底部查找ApplicationStrings
类)。字符串的格式应该是:
ParentForm_StringName
(稍后会详细介绍)// // This is at the bottom of the LanguageLoader.cs file: // public class ApplicationStrings { public String MainForm_Button1Text = "Click me for a new dialog/form"; public String MainForm_Label1Text = "Hello, I'm a text label on the main form"; }
- 要将这些字符串显示在主表单上,请添加此方法。您可以从表单的“
Load
”方法或任何时候您想更新字符串时调用它。// // These are in the application’s main form source file: // private void UpdateLanguageOnControls() { // this function places language specific text on all "skin-able" text items button1.Text = LanguageLoader.appStrings.MainForm_Button1Text; label1.Text = LanguageLoader.appStrings.MainForm_Label1Text; } private void Form1_Load(object sender, EventArgs e) { UpdateLanguageOnControls(); }
基本上就是这样。 应用程序运行后,文件“EnglishUS.lng”将在应用程序文件夹中创建。 (注意:Vista 可能不允许在“Program Files”文件夹中写入文件)。
创建新语言
如果您编辑 LNG 文件(使用记事本或类似软件),编辑后的字符串将显示在应用程序中。 语言文件采用传统的 INI 格式,其中每个“section”是表单的名称,“key”是字符串的名称。 该 section 和 key 是从字符串变量的名称中提取的。 你还记得上面的 ParentForm_StringName
格式吗? ParentForm
成为 section,StringName
成为 key。
-------- contents of EnglishUS.lng --------
[MainForm]
Button1Text=Click me for a new dialog/form
Label1Text=Hello, I'm a text label on the main form
-------------------------------------------------
要创建新语言,只需打开一个现有的语言文件,然后将其另存为新名称并相应地更改字符串
-------- contents of PigLatin.lng --------
[MainForm]
Button1Text=ickClay emay orfay away ewnay ialog/formday
Label1Text=elloHay, I'mway away exttay abellay onway ethay ainmay ormfay
-------------------------------------------------
将语言应用于对话框或子表单
如果子表单(对话框等)需要访问语言,您可以使用与主表单相同的方法
将子表单的字符串添加到 ApplicationStrings
类
/// This is at the bottom of the LanguageLoader.cs file:
//
public class ApplicationStrings
{
public String MainForm_Button1Text = "Click me for a new dialog/form";
public String MainForm_Label1Text = "Hello, I'm a text label on the main form";
// these are new strings to be used in the dialog
public String DialogForm_Label1Text = "I'm the top label";
public String DialogForm_Label2Text = "I'm the bottom label";
}
通过创建和调用“UpdateLanguageOnControls
”方法(就像主表单上的方法一样)将字符串放在表单上:
//
// These are in the sub-form’s source file
//
// inside the DialogForm.cs file
private void UpdateLanguageOnControls()
{
// this function places language specific text on all "skin-able" text items.
label1.Text = LanguageLoader.appStrings.DialogForm_Label1Text;
label2.Text = LanguageLoader.appStrings.DialogForm_Label2Text;
}
private void DialogForm_Load(object sender, EventArgs e)
{
UpdateLanguageOnControls();
}
闭运算
这就是它:一种快速(也许是粗略)的多语言应用程序方法,允许用户创建自己的语言。 我很乐意收到您的反馈,所以让我们开始发布吧!或者换句话说: oSay erethay itway isway: away uickqay and(ay erhapspay irty)day approachway otay ulti-lingualmay appsway atthay allowway usersway otay eatecray 特别感谢在以下网址提供的猪拉丁语转换器:http://www.onlineconversion.com/pig_latin.htm。
历史
- 2009年9月25日:初始帖子