C# 通过winforms中的resx进行本地化

C# 通过winforms中的resx进行本地化,c#,.net,winforms,localization,resx,C#,.net,Winforms,Localization,Resx,有很多关于它的问题,但仍然没有为我读到解决方案 我有我的所有资源在一个单独的项目,这个项目有一个资源文件夹,其中有3种语言 在构造函数中的任何控件中调用InitializeLanguage() 其中,我为正确的语言设置了正确的文本,如下所示: public void InitializeLanguage() { bOK.Text = Lastenboek.Language.Ok; cbSM.Text = Lastenboek.Language.Samenv

有很多关于它的问题,但仍然没有为我读到解决方案

我有我的所有资源在一个单独的项目,这个项目有一个资源文件夹,其中有3种语言

在构造函数中的任何控件中调用InitializeLanguage() 其中,我为正确的语言设置了正确的文本,如下所示:

public void InitializeLanguage()
    {
        bOK.Text = Lastenboek.Language.Ok;
        cbSM.Text = Lastenboek.Language.SamenvattendeMeetstaat;
        cbDM.Text = Lastenboek.Language.DetailMeetstaat;
        cbDMHeadingStyles.Text = Lastenboek.Language.KopStijlen;
        cbExportArtikelsZonderMeetstaat.Text = Lastenboek.Language.ArtikelsZonderMeetstaat;
        cbSMHeadingStyles.Text = Lastenboek.Language.KopStijlen;
        cbRamingsPrijs.Text = Lastenboek.Language.Ramingsprijs;
        cbBeknopteOmschrijving.Text = Lastenboek.Language.BeknopteOmschrijving;
        cbFaseSM.Text = Lastenboek.Language.GesplitstOpFase;
        groupBox3.Text = Lastenboek.Language.Filter;
        label2.Text = Lastenboek.Language.Tot;
        label1.Text = Lastenboek.Language.DatumVan;
        gbPrijzen.Text = Lastenboek.Language.Prijzen;
        label3.Text = Lastenboek.Language.Account;
        cbTotaalSM.Text = Lastenboek.Language.Totaal;
        groupBox4.Text = Lastenboek.Language.Template;
        label4.Text = Lastenboek.Language.Layout;
        Text = Lastenboek.Language.ExporteerMeetstaat;
    }

一切正常,但有时标签太小,无法容纳其他语言的文本。是否有一种在设计时更改语言并更改不同语言的维度的好方法?

是。您甚至不需要以编程方式设置本地化文本/图像和其他值

只需将表单上的
Localizable
属性设置为
true
,就可以在设计时切换语言,并在设计时编辑该语言的所有内容


启动应用程序时,表单将使用Windows语言。如果您想以编程方式更改它,只需设置
Thread.CurrentThread.CurrentUICulture
属性。您可能希望重新生成表单以应用该语言,或者显式调用
InitializeComponent()

问题在于,控件有动态文本,但您希望每种语言都有固定的“硬代码”控件大小

使用这种方法,维护可能会很复杂。翻译中的每一个变化都应该在UI中测试——它是否适合控件


另一种方法是支持控件的“自动调整大小”。Winforms具有
TableLayoutPanel
控件,该控件对于包含动态文本的控件非常有用。

您是否尝试过Label.Autosize属性?它们都设置为自动调整大小,但它们与其他控件重叠我认为您可以始终获取TextBox.Text.Length属性并调整宽度..抱歉,编辑了我以前的回答:它们与其他控件重叠,因此我必须更改其他控件的位置。是的,它们可以,这就是为什么他们提出了WPF并停止使用Windows窗体的原因。我知道这是一个选项,但是每个窗体或控件都有resx文件。当然,我在另一个项目的一个单独的resx文件中有一种语言的所有资源,这是本地化的首选方式。它们将被编译到你的程序集中,因此你不需要部署.resx文件。事实上,但现在我有一个问题,我不能在设计时更改语言,也不能更改每种语言的大小和位置。当然,这是本地化的首选方式-不同意。使用每个表单的资源文件,您将得到在其他表单中具有重复值的公共文本。想象一下,你想把单词
“Done”
改为
“Complete”
,它也是翻译的。如果所有表单都包含此单词,则需要遍历所有表单以update@Fabio:假设你有“家”、“年”、“季节”或其他不同形式的词,根据上下文的不同,这些词在多种语言中的翻译应该有所不同。早些时候,我们也使用了一个全局“translater”引擎,然后根据位置为每个资源键添加前缀,使它们唯一,甚至是OK和Cancel。引擎可以删除这些前缀以找到回退翻译,但结果表明使用首选方式更好。是的,即使有重复。+1用于提及“TableLayoutPanel”,MSFT甚至建议将其本地化。请参阅此处当前的“如何:使用AutoSize和TableLayoutPanel控件在Windows窗体上支持本地化”。在实践中,尽管你需要一些努力才能把你的头绕在它周围。让它发挥作用,并与某些其他属性相结合,可能会令人沮丧(并为那些后来不得不支持它的人,甚至是几个月或几年后的你自己,创造了一条学习曲线)。不过,它(在大部分情况下)起到了作用。