背景
我创建了示例窗口应用程序,用于学习实现本地化。我的每个表单都有两个RESX文件。一个用于保加利亚,一个用于法语(比利时)。它有默认文化英语(XX)
目前在本地测试我是以编程方式更改UICulture,即Thread.CurrentThread.CurrentUICulture = new CultureInfo(“fr-BE”);它工作正常。
问题:
如何在不以编程方式强制UI文化的情况下进行测试?我试过更改控制面板>区域选项>法语(比利时)的标准和格式。这改变了DatePickerControl,现在它显示日期法语。但是我仍然可以看到英文的Button文本,好像我通过编程方式注入CultureInfo来测试它变为法语。
如果我能够将标准和格式更改为法语,我还需要安装多语言用户界面包(MUI)吗?
还有一个问题:How do I test localization in a winforms application?但是它没有回答我的问题。
答案 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;
}