Building a localized application and ensuring that the correct language is used in its GUI (a process also called internationalization or i18n) has always been quite simple in .NET. Resx resource files natively support multiple localized versions (which are built into "satellite" dll assemblies) and automaticaly determine the correct resources to read from (eventually falling back to the base language).

This is done by creating a simple resource file containing all strings of your application (for instance, Strings.resx) and then define a localized version of the same strings in separate resource files (Strings.it.resx for the italian strings, Strings.de-CH.resx for the swiss-german dialect version... etc.).

String resources and localized versions.

Visual Studio will create a static Strings class (defined in Strings.Designer.cs) that you can use to retrieve each single string (this also allows you to retrieve the localized strings in a strongly typed fashion, ensuring that you won't have null strings and exceptions thrown around randomly in your code).

More...