提问人:RobertPitt 提问时间:7/14/2010 最后编辑:TylerHRobertPitt 更新时间:5/3/2016 访问量:11174
C# 应用程序中的本地化
Localization in C# Application
问:
我正在创建一个基于 WinForms / KryptonForms 的 C# 应用程序,由于该应用程序处于开发中途,我心想我最好对本地化进行整理。
作为一个土生土长的PHP程序员(我知道C#是一个全新的水平),我会创建一个类来检测语言,并自动将语言包分配给应用程序。然后使用 Language 对象访问这些值。
我想知道我是否可以获得一些关于最简单/最佳方法的例子。
我个人想要一些类似于应用程序设置的东西
例如,我通常会做的地方,我希望有一个和。MyApplication.Properties.Settings.Default.SomeKey
MyApplication.Languages.Current.ApplicationTitle
MyApplication.Languages.en.ApplicationTitle
此外,通过仅加载每个语言文件的单个资源来提高速度也是有益的。
因此,语言以英语加载,西班牙语用户被提升为此应用程序是英语的,他是否想将其更改为西班牙语,他单击“是”,设置得到更新,应用程序重新启动并加载单个西班牙语语言包。
您对此有何看法?
编辑:
该应用程序基于 XMPP 协议并使用 agsXMPP 库。据我了解,每个向我发送其状态的用户也应该发送其系统所在的语言。
因此,基本上,如果有任何方法可以“掌握”存储单个单词并在我的应用程序中使用 的事实,但与此同时,我只是在查看 GUI 文本。__("some string")
答:
我们进行本地化的方式是:
- 将 WinForm 的 “Localizable” 属性设置为 true(这将为该 Form 生成一个新的资源文件,例如包含标签、按钮的文本,以及 z 顺序等)
- 创建一个 FormName.de.resx 文件(“de”,因为我们是德语),然后将需要本地化的字符串存储在其中(通过 ResourceManager 类访问此资源文件)
- 对于需要本地化的非 WinForms 代码,我们只需创建单独的资源文件
编译应用后,将创建 AppName.resources.dll。此 dll 包含应用程序的所有资源,然后可以与 Visual Localize 等工具一起使用,将字符串翻译成另一种语言,如英语或西班牙语等。
评论
lang.en.dll
lang.de.dll
我们使用 Resources.MyResources.SomeString,它会自动翻译成正确的语言。资源文件名为 MyResources.de-DE.resx、MyResources.nl-BE.resx 等。 方法基本上与项目属性相同。
示例翻译代码:
public void TranslateForm()
{
menuItem11.Text = Resources.MyResources.Nieuw;
menuItem12.Text = Resources.MyResources.Verwijderen;
menuItem13.Text = Resources.MyResources.Kopieren;
}
或者您可以手动完成,例如:
menuItem11.Text = Translator.GetString("New", "de-DE" );
...
public static string GetString( string varname )
{
string resourceName = typeof(Vertaling).Namespace + ".Resources.MyResources";
ResourceManager rm = new ResourceManager(resourceName, Assembly.GetExecutingAssembly());
return rm.GetString(varname);
}
public static string GetString( string varname, string taalCode )
{
string resourceName = typeof(Vertaling).Namespace + ".Resources.MyResources";
ResourceManager rm = new ResourceManager(resourceName, Assembly.GetExecutingAssembly());
return rm.GetString(varname, new CultureInfo(taalCode) );
}
评论
this.LoginLabel.Text = Language.Current.LoginLabel;
您应该使用资源。
您可以动态更改语言:
1) 在控制台应用程序中:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
double a = 100.12;
Console.WriteLine("{0} - {1}", Thread.CurrentThread.CurrentCulture, a);
Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
Console.WriteLine("{0} - {1}", Thread.CurrentThread.CurrentCulture, a);
Console.ReadLine();
2)在WinForms应用程序中,我们可以重新打开表单以应用本地化资源 (在表单设计器中使用 Localizable 和 Language 属性为每种语言自动生成资源):
if (Thread.CurrentThread.CurrentCulture.Name == "en-US")
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
}
else
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
double a = 100.12;
textBox1.Text = a.ToString(Thread.CurrentThread.CurrentCulture);
Form1 f = new Form1();
f.ShowDialog();
3)使用许多具有自己本地化的线程
private void button1_Click(object sender, EventArgs e)
{
// for example main thread language is en-US
Thread t = new Thread(StartForm);
t.CurrentUICulture = new CultureInfo("ru-RU");
t.Start();
//t.Join();
}
public static void StartForm()
{
Form1 f = new Form1();
f.ShowDialog();
}
评论
上一个:PHP中的国际化
下一个:使用 Node.JS
评论
File
Help
Options
Error