I have a WinForms
application which I want to translate into multiple languages. However, I do not have any experience with localizing a WinForms
app, and I find very contradictory information about this subject.
Basically, what I want is:
strings
and ints
, but also a CultureInfo
Most solutions I've seen either have one .resx
file per Form
and/or external satellite assemblies.
.net Framework 3.5 SP1
if that matters.
Edit:
For the most part, Visual Studio already offers support for what I want, but there are two issues. When I set Form.Localizable
to true
I have this nice Designer
support, but this generates one resx
per Form
. The idea of manually overriding it in InitializeComponent
fails because it's designer-written code that will regularly be overwritten.
Theoretically, I only want to :
ComponentResourceManager
to point it to my global resx
and ApplyResources
to the overload that takes a CultureInfo
as third parameter.It seems as if I have to add a function call to my constructor that gets called after InitializeComponent()
and overrides its behaviour. That seems terribly inefficient, but Visual Studio is right when it warns about touching InitializeComponent()
.
At the moment, I am indeed rolling my own WinForms localization Framework
...
I've just completed a C# .Net 3.5 project with a similar problem. We were writing WinForms plugin for an existing multi-lingual application with 8 languages (including English).
This is how we did it:
Create all our forms and UI in the default language, English.
Put all our internal strings in a resource file (stuff not tied directly to a form like custom error messages and dialog box titles etc)
Once we had completed most of the work and testing we localised it.
Each form already had a .resx file but this was empty. We set the property 'Localizable' to true, the .resx file was filled with things like button sizes & strings.
For each of the other languages, we changed the 'Language' property on the form. We chose the basic version of each language eg: 'Spanish' instead of 'Spanish (Chile)' etc. so that it would work for every 'Spanish' dialect, I think.
Then we went through each control, translated its text and resized, if needed. This created a .resx per language and form combination.
We were then left with, for 8 languages, 8 .resx for each form and 8 .resx for the general strings. When compiled the output folder had the .dll we were creating and then a sub folder for each language with a .resources.dll in it.
We were able to test the versions of the UI in the designer by just changing the language property to check that we had the correct strings & layout.
All in all once we got our heads around it, it was quite easy and painless.
We didn't need to write any custom tweaks to the form loading