如何测试本地化的winforms应用程序?

时间:2010-04-16 01:49:44

标签: .net winforms localization

背景

我创建了示例窗口应用程序,用于学习实现本地化。我的每个表单都有两个RESX文件。一个用于保加利亚,一个用于法语(比利时)。它有默认文化英语(XX)

目前在本地测试我是以编程方式更改UICulture,即Thread.CurrentThread.CurrentUICulture = new CultureInfo(“fr-BE”);它工作正常。

问题:

如何在不以编程方式强制UI文化的情况下进行测试?我试过更改控制面板>区域选项>法语(比利时)的标准和格式。这改变了DatePickerControl,现在它显示日期法语。但是我仍然可以看到英文的Button文本,好像我通过编程方式注入CultureInfo来测试它变为法语。

如果我能够将标准和格式更改为法语,我还需要安装多语言用户界面包(MUI)吗?

还有一个问题:How do I test localization in a winforms application?但是它没有回答我的问题。

2 个答案:

答案 0 :(得分:2)

您可以使用安装了不同本地化操作系统的VM',即法语XP,日语XP等。我们使用此方法测试本地化,就像您说的那样,只更改语言/时区设置是不够的。

答案 1 :(得分:0)

为什么不将本地化设置放在配置文件中? 您的应用程序可以在加载时读取配置文件,并根据该应用程序应用正确的设置。 然后,您需要手动处理每个字符串的本地化。

我做过一次这样的工具(我在C#中做过):

Localization.cs

    using System.Globalization;
    using System;

    namespace DummyProject
    {
        public class Localization
        {
            private string _language = "en";

            public Localization()
            {
                if (CultureInfo.CurrentCulture.Name.StartsWith("de") == true)
                {
                    CurrentLanguage = "de";
                }
                else if (CultureInfo.CurrentCulture.Name.StartsWith("fr") == true)
                {
                    CurrentLanguage = "fr";
                }
                else if (CultureInfo.CurrentCulture.Name.StartsWith("es") == true)
                {
                    CurrentLanguage = "es";
                }
                else
                {
                    // Default english
                    CurrentLanguage = "en";
                }
            }

            //-------------------------

            public string CurrentLanguage
            {
                get
                {
                    return _language;
                }
                set
                {
                    _language = value;
                }
            }

            private string GetLocalizedString(
                string pDefault,
                string pDe = "",
                string pFr = "",
                string pEs = "")
            {
                string returnValue = pDefault;

                switch (_language)
                {
                    case "de":
                    returnValue = pDe;
                    break;
                case "fr":
                    returnValue = pFr;
                    break;
                case "es":
                    returnValue = pEs;
                    break;
                default:
                    returnValue = pDefault;
                    break;
                }
                if (String.IsNullOrEmpty(returnValue) == true)
                {
                    returnValue = pDefault;
                }
                return returnValue;
            }

            public string AboutToolStripMenuItem { get { return GetLocalizedString("A&bout", "Ü&ber", "&A Propos", "&Acerca"); } }

            public string AutocheckForUpdateToolStripMenuItem { get { return GetLocalizedString("&Autocheck for update", "&Automatisch nach Updates suchen", "&Vérifier automatiquement les mises à jour", "&Comprobar actualizaciones automáticamente"); } }

            public string TimeUpdater { get { return GetLocalizedString("Timer Updater", "Zum Timer-Upater", "Mettre a jour", "Actualización de temporizador"); } }

            public string CloseToolStripMenuItem { get { return GetLocalizedString("&Close", "&Beenden", "F&ermer", "&Cerrar"); } }
        }
    }

然后在你的主要课程中:

    private Localization _localization;

    public Form1()
    {
        InitializeComponent();

        _localization = new Localization();

        //----

        // Load localization setting here
        _localization.CurrentLanguage = "en";

        //----

        SetLocalization();
    }

    private void SetLocalization()
    {
        aboutToolStripMenuItem.Text = _localization.AboutToolStripMenuItem;
        autocheckForUpdateToolStripMenuItem.Text = _localization.AutocheckForUpdateToolStripMenuItem;
        bttn_TimerUpdater.Text = _localization.TimeUpdater;
        closeToolStripMenuItem.Text = _localization.CloseToolStripMenuItem;
    }