65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.69/5 (7投票s)

2009 年 9 月 25 日

CPOL

4分钟阅读

viewsIcon

32075

downloadIcon

519

开发允许用户创建自己语言文件的多语言应用程序

引言

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

背景

这种方法创造了一个有趣的编程挑战。这个语言文件会是什么样的?应用程序将如何加载语言文件并更新控件?当我在应用程序的未来版本(它们有新的文本项)中创建新的表单和控件,而用户正在使用旧的语言文件时,会发生什么情况?我如何从应用程序中的任何地方访问“语言库”,而无需从一个表单传递到另一个表单?

这些问题基本上由两个词回答:反射和单例。好的,还有很多其他的词可以应用,但这两个概念帮助我最终找到了一个我喜欢的解决方案。
因此,废话不多说,这就是方法。

  1. LanguageLoader 是一个单例类,包含应用程序字符串,可以读/写语言文件。可以在项目中的任何地方访问此类。如果您在应用程序中的任何地方更新它,则更新在其他地方可用。这个单例东西很酷!
  2. 您将字符串添加到“ApplicationStrings”类中。此类由 LanguageLoader(用于加载和保存)通过反射访问。这个反射东西也很酷!
  3. 为了方便地更新控件,如果每个表单都有一个更新表单上所有字符串的方法,这会很有帮助。可以在表单的“Load”方法中调用此方法,也可以在用户更改语言时调用此方法。

Using the Code

所以让我们开始吧

  1. 创建一个 Windows 窗体应用程序。
    让我们添加一个标签。 Visual Studio 称它为“label1”。  我感觉不太有创意,所以让我们保持原样。 我们还可以添加一个按钮,并将其命名为“button1”。

  2. 现在是乐趣的部分。 将 LanguageLoaderIniAccess 添加到解决方案中。 在 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";
    }
  3. 要将这些字符串显示在主表单上,请添加此方法。您可以从表单的“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日:初始帖子
© . All rights reserved.