C#应用程序中的本地化

我正在创建一个基于WinForms / KryptonForms的C#应用​​程序,并且由于应用程序处于开发的一半,我认为我最好将本地化排序。 作为一个天生的和繁殖的PHP程序员(我知道C#是一个全新的水平),我会创建一个类来检测语言并自动将语言包分配给应用程序。然后使用语言对象来访问值。 我想知道我是否可以在最简单/最好的方法上得到一些例子。 我个人想要一些与应用程序设置相关的内容 通常我会做什么
MyApplication.Properties.Settings.Default.SomeKey
我希望有一个
MyApplication.Languages.Current.ApplicationTitle
MyApplication.Languages.en.ApplicationTitle
。 此外,通过仅为每个语言文件加载单个资源来提高速度也是有益的。 因此,语言加载英语,西班牙语用户被提升为该应用程序是英语,他想将其更改为西班牙语,他点击是,设置得到更新,应用程序重新启动并加载单个西班牙语语言包。 你对此有何看法? 编辑: 该应用程序基于XMPP协议并使用agsXMPP库。根据我的理解,每个向我发送他们在场的用户也应该发送他们的系统所使用的语言。 所以基本上如果有任何方法可以“掌握”存储单个单词的事实并且在我的应用程序中使用
__("some string")
是可能的,但同时我只是在看GUI文本。     
已邀请:
我们进行本地化的方式是: 将WinForm的“Localizable”属性设置为true(这将为该Form生成一个新的资源文件,例如标签文本,按钮,还有z-order等) 创建一个FormName.de.resx文件(“de”,因为我们是德语),然后存储需要在那里本地化的字符串(访问此资源文件通过ResourceManager类工作) 至于需要本地化的非WinForms代码,我们只需创建单独的资源文件 编译应用程序后,将创建AppName.resources.dll。这个dll包含你的应用程序的所有资源,然后可以与Visual Localize等工具一起使用,将字符串翻译成另一种语言,如英语或西班牙语等。     
你应该使用资源。 您可以动态更改语言: 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();
}
    
我们使用Resources.MyResources.SomeString,它以正确的语言自动翻译。资源文件名为MyResources.de-DE.resx,MyResources.nl-BE.resx等。 与Project Properties基本相同的方法。 样本翻译代码:
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) );
    }
    

要回复问题请先登录注册