Click here to Skip to main content
15,881,455 members
Articles / Desktop Programming / WPF

Simplest Way to Implement Multilingual WPF Application

Rate me:
Please Sign up or sign in to vote.
4.77/5 (33 votes)
31 Oct 2010CPOL4 min read 133.7K   7.1K   52   23
Easiest way to handle Localization in your WPF application

Introduction

Globalization is one of the concepts that comes to mind when we create applications that might run in different geographical locations. Based on the Culture code, we need to modify our application. This is a very common case for many developers. I thought let's discuss what I implemented as the most cunning way to deal with this in your WPF application.

Points of Interest

Globalization is the most common issue to every application. Many of us might have searched over time to find out the easiest way to do a Multilingual Application. Believe me, I did the same thing like you. After doing that, I found a lots of articles on the internet. For instance, you can see one from MSDN:

If you have already read the article, you might have found that there is no such actual implementation that clearly demonstrates the concept. That is why I thought of writing a concrete article for you to easily implement a truly Multilingual Application.

Using the Code

language.JPG

If you have downloaded the sample application, you can see that I have created a login screen, just to show how it works. To try, just run the application you will find a screen just like the one shown above.

Put Username and Password Same, and press login button. You will see the screen below:

language2.JPG

Next, go to Control Panel - > Regional & Language Option and change the Language to French(Canada), and Re run the application.

language3.JPG

You will find a different screen as below:

language1.JPG

And if you put credentials and press "connexion" (Login) button, you will see "Échec de l'authentification" (Authentication Failed).
Now I will discuss how can you implement this type of application yourself.

The Implementation

To start implementing this application, I have added one window. I have also designed the window with some look and feel. You can see them, but this is nothing to deal with our application, so I left out their implementation.

After creating the initial look and feel, which suits me, I added a folder named "Resources" (the name of which can be anything). I added two resource Dictionary to define my resource keys which I will use for my application.

language5.JPG

1. Creating the Resource File

The resource files are named as StringResources.xaml, StringResource.fr-CA.xaml, etc. You can add as many resource files as you want, each of which corresponds to its own Culture.
Inside the resource files, you must declare the ResourceKeys. I have used system:String to define the Resources.

XML
<ResourceDictionary 
      xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns: x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns: system="clr-namespace:System;assembly=mscorlib">

<system:String x:Key="close">Close</system:String>
<system:String x:Key="login">Login</system:String>
<!-- All StringResources Goes Here -->
</ResourceDictionary> 

Thus you can see, in addition to adding the ResourceDictionary to the Resources Folder, I have added one namespace which points to mscorlib, and named it as system. I have then added the string references like close, login, etc. which are defined to be replaced in the UI.

Similar to this, I have added another file for fr-CA, and named it as StringResource.fr-CA.xaml. This will hold all the keys that corresponds to the Resourcekeys for a machine set up with French Canadian.

XML
<ResourceDictionary 
        xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="close">Fermer</system:String>
<system:String x:Key="login">connexion</system:String>
</ResourceDictionary>

Thus you can see that I kept the same name for the keys to ensure everything works perfectly. If you have used ASP.NET Globalization, this is almost similar to it.

2. Adding a Resource

After you create the Resource file, it's time to add it to the window. To add, I have just implemented a method which you can place in some utility class. For simplicity, I left it in my window. The method looks like:

C#
private void SetLanguageDictionary()
{
ResourceDictionary dict = new ResourceDictionary();
switch (Thread.CurrentThread.CurrentCulture.ToString())
{
  case "en-US":
       dict.Source = new Uri("..\\Resources\\StringResources.xaml",  
                     UriKind.Relative);
       break;
case "fr-CA":
        dict.Source = new Uri("..\\Resources\\StringResources.fr-CA.xaml", 
                           UriKind.Relative);
        break;
default :
        dict.Source = new Uri("..\\Resources\\StringResources.xaml", 
                          UriKind.Relative);
        break;
}
this.Resources.MergedDictionaries.Add(dict);
} 

This is the most simple implementation. I have added the dictionaries directly to the window resources. I have created an object of ResourceDictionary and pointed to the file that is created for resource to its Source property. This will load the external file directly to the object. And finally added to Window.Resources using this.Resources.MergedDirectories.Add(). As you know, after compiling, WPF holds the relative path intact, so it will not create any errors during runtime.

3. Using the Resource

Finally, it's now time to point ResourceKeys to your XAML to ensure it picks up the appropriate key from the ResourceDictionary. Let us add some controls:

XML
<Button      x:Name="btnLogin"
             Click="btnLogin_Click"
             Content="{DynamicResource login}"
             Grid.Row="3"
             Grid.Column="0" 
             Padding="10" 
/>
<Button x:Name="btnClose"
        Content="{DynamicResource close}"
        Click="btnClose_Click"
        Grid.Row="3"
        Grid.Column="1" 
        Padding="10" 
/> 

You should note that I have always put the Content of the Button using DynamicResource. This is important to define, because we want the content to be replaced with the appropriate key defined to the Resource will be added later.

Hence, your application is ready.

You can download the sample application from here.

Points of Interest

You should note that you must define the key to the resource file before you use as DynamicResource. Otherwise, you will end up displaying nothing in the UI.

This implementation is totally based on UI elements, there is nothing to deal with translation of dynamic UI text. I will discuss about Translation of Language for dynamic User elements later in another article.

Conclusion

Thus, it is really fun to play with WPF, and as Multilingual application is most likely a common issue, I hope this article will help you in the long run. Try the sample application and see the actual implementation.

History

  • 31st October, 2010: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
President
India India
Did you like his post?

Oh, lets go a bit further to know him better.
Visit his Website : www.abhisheksur.com to know more about Abhishek.

Abhishek also authored a book on .NET 4.5 Features and recommends you to read it, you will learn a lot from it.
http://bit.ly/EXPERTCookBook

Basically he is from India, who loves to explore the .NET world. He loves to code and in his leisure you always find him talking about technical stuffs.

Working as a VP product of APPSeCONNECT, an integration platform of future, he does all sort of innovation around the product.

Have any problem? Write to him in his Forum.

You can also mail him directly to abhi2434@yahoo.com

Want a Coder like him for your project?
Drop him a mail to contact@abhisheksur.com

Visit His Blog

Dotnet Tricks and Tips



Dont forget to vote or share your comments about his Writing

Comments and Discussions

 
GeneralMy vote of 1 Pin
copa01724-Feb-20 22:27
copa01724-Feb-20 22:27 
GeneralRe: My vote of 1 Pin
pjrobot19882-Sep-20 5:41
pjrobot19882-Sep-20 5:41 
Questionfacing problem Pin
Member 1256813315-Jun-18 0:09
Member 1256813315-Jun-18 0:09 
QuestionHow to implement a dropdown having all language names and select any one of them and app changes. Pin
Ashish Jain(Be Jovial)16-Jun-15 19:42
Ashish Jain(Be Jovial)16-Jun-15 19:42 
QuestionUsing resource in code behind Pin
deltonio24-Mar-15 3:03
professionaldeltonio24-Mar-15 3:03 
AnswerRe: Using resource in code behind Pin
pjrobot19882-Sep-20 5:43
pjrobot19882-Sep-20 5:43 
GeneralRe: Using resource in code behind Pin
deltonio22-Sep-20 21:00
professionaldeltonio22-Sep-20 21:00 
QuestionDefault language Pin
Roberto Salemi10-Feb-15 23:45
Roberto Salemi10-Feb-15 23:45 
AnswerRe: Default language Pin
Ramson22-Feb-22 21:20
Ramson22-Feb-22 21:20 
Questionwarning Pin
ambika1215-Jan-14 18:40
ambika1215-Jan-14 18:40 
AnswerRe: warning Pin
pjrobot198817-Sep-19 5:35
pjrobot198817-Sep-19 5:35 
GeneralMy vote of 5 Pin
selvarajpearl13-Feb-13 0:00
selvarajpearl13-Feb-13 0:00 
GeneralMy vote of 5 Pin
Vipin Sahu10-Dec-12 12:18
Vipin Sahu10-Dec-12 12:18 
QuestionXMLParseException Pin
esteenbrink7-Nov-12 10:49
esteenbrink7-Nov-12 10:49 
GeneralMy vote of 5 Pin
Chen Noam6-Mar-12 10:57
Chen Noam6-Mar-12 10:57 
Great job !!!
Very simple to understand and implement.

Thanks,
Chen
GeneralMy vote of 5 Pin
Michał Zalewski1-Nov-10 3:14
Michał Zalewski1-Nov-10 3:14 
GeneralRe: My vote of 5 Pin
Abhishek Sur5-Dec-10 8:00
professionalAbhishek Sur5-Dec-10 8:00 
GeneralThere are some other ways too. I wrote about them here in case you want to compare Pin
Sacha Barber1-Nov-10 0:14
Sacha Barber1-Nov-10 0:14 
GeneralRe: There are some other ways too. I wrote about them here in case you want to compare Pin
Abhishek Sur4-Dec-10 21:28
professionalAbhishek Sur4-Dec-10 21:28 
GeneralRe: There are some other ways too. I wrote about them here in case you want to compare Pin
Abhishek Sur4-Dec-10 23:03
professionalAbhishek Sur4-Dec-10 23:03 
GeneralActzual Implementation of the MS LocBaml concept Pin
Reinhard Ostermeier31-Oct-10 22:29
Reinhard Ostermeier31-Oct-10 22:29 
GeneralRe: Actzual Implementation of the MS LocBaml concept Pin
Abhishek Sur4-Dec-10 21:30
professionalAbhishek Sur4-Dec-10 21:30 
GeneralMy vote of 5 Pin
Kunal Chowdhury «IN»31-Oct-10 16:45
professionalKunal Chowdhury «IN»31-Oct-10 16:45 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.