I have a winforms application that the users must be able to change the language at runtime.
To generalize the switch and avoid having to hard code control names I tried the following extension:
internal static void SetLanguage(this Form form, CultureInfo lang)
{
ComponentResourceManager resources = new ComponentResourceManager(form.GetType());
ApplyResourceToControl(resources, form, lang);
resources.ApplyResources(form, "$this", lang);
}
private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang)
{
foreach (Control c in control.Controls)
{
ApplyResourceToControl(resources, c, lang);
resources.ApplyResources(c, c.Name, lang);
}
}
This does change all the strings.
However a side effect of this is that the entire contents of the window is resized to that windows original startup size, no matter what the current size is.
How can I prevent the layout from changing or initiate a new layout calculation?
This is the complete code I am using now.
The change is to manually change the Text property only. If I get to localize other properties, the code will have to be expanded afterwards.
/// <summary>
/// Change language at runtime in the specified form
/// </summary>
internal static void SetLanguage(this Form form, CultureInfo lang)
{
//Set the language in the application
System.Threading.Thread.CurrentThread.CurrentUICulture = lang;
ComponentResourceManager resources = new ComponentResourceManager(form.GetType());
ApplyResourceToControl(resources, form.MainMenuStrip, lang);
ApplyResourceToControl(resources, form, lang);
//resources.ApplyResources(form, "$this", lang);
form.Text = resources.GetString("$this.Text", lang);
}
private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang)
{
foreach (Control c in control.Controls)
{
ApplyResourceToControl(resources, c, lang);
//resources.ApplyResources(c, c.Name, lang);
string text = resources.GetString(c.Name+".Text", lang);
if (text != null)
c.Text = text;
}
}
private static void ApplyResourceToControl(ComponentResourceManager resources, MenuStrip menu, CultureInfo lang)
{
foreach (ToolStripItem m in menu.Items)
{
//resources.ApplyResources(m, m.Name, lang);
string text = resources.GetString(m.Name + ".Text", lang);
if (text != null)
m.Text = text;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With