Internationalizing Desktop App within a couple years... What should we do now?

IMHO, to claim something is going to happens "in a few years" literally translates to "we hope one day" which really means "never". Although I would still skim over various tutorials to make sure you don't make any horrendous mistakes. Doing correct internationalization support now will mean less work in the future, and once you get use to it, it won't have any real affect on today's productivity. But if you can measure the goal in years, maybe it's not worth doing at all right now.

I have worked on two projects that did internationalization: a C# ASP.NET (existed before I joined the project) app and a PHP app (homebrewed my own method using a free Internationalization control and my own management app).

You should store all the text (labels, button text, etc etc) as data inside a database. Reference these with keys (I prefer to use the first 4 words, made uppercase, spaces converted to underscores and non alpha-numerics stripped out) and when you have a duplicate, append a number to the end. The benefit of this key method is the programmer has a pretty strong understanding of the content of the text just by looking at the key.

Write a utility to extract the data and build .NET resource files that you add into your project for compile. Create a separate resource file for each language. In your code, use the key to point to the proper entry.

I would skim over the MS documents on the subject: http://www.microsoft.com/globaldev/getwr/dotneti18n.mspx

Some basic things to avoid:

  • never ever ever use translation software, hire a pro or an intern taking that language at a local college
  • never try to create text by appending two existing entries, because grammar differs greately in each language, this will never work. So if you have a string that says "Click" and want one that says "Click Now", do not try to create a setup that merges two entries, or during translation, copy the word for click and translate the word now. Treat every string as a totally new translation from scratch

Some questions to think about…

How match can you afford to delay the shipment of the English version of your application to save a bit of cost internationalize later?

Will you still be trading if you don’t get the cash flow from shipping the English version quickly?

How will you get the UI right, if you don’t get feedback quickly from some customers about it?

How often will you rewrite the UI before you have to internationalize it?

Do you English customers wish to be able to customize strings in the UI, e.g. not everyone calls a “shipping note” the same think.

As a large part of the pain of internationalize is making sure you don’t break the English version, is automated system testing of the UI a better investment?

The only thing I think I will always do is: “Do not use composite strings that are built at run time from concatenated phrases” and if you do so, don’t spread the code that builds up the a single string over lots of methods.

Having your UI automatically resize (and layout) to cope with length of labels etc will save you lots of time over the years if you can do it cheaply. There a lots of 3rd party control sets for Windows Forms that lets you label text boxes etc without having to put the labels on as separate controls.

I just starting to internationalize a WinForms application, we hope to mostly be able to use the “name” of each control as the lookup key, without having to move lots into resource files etc. It is not always as hard as you think at first….


I will add to store and manipulate string data as Unicode (NVARCHAR in MS SQL).


Prepare it now, before you write all the strings in the codebase itself.

Everything after now will be too late. It's now or never!

It's true that it is a bit of extra effort to prepare well now, but not doing it will end up being a lot more expensive.

If you won't follow all the guidelines in the links below, at least heed points 1,2 and 7 of the summary which are very cheap to do now and which cause the most pain afterwards in my experience.

Check these guidelines and see for yourself why it's better to start now and get everything prepared.

  1. Developing world ready applications

  2. Best practices for developing world ready applications

Little extract:

  1. Move all localizable resources to separate resource-only DLLs. Localizable resources include user interface elements such as strings, error messages, dialog boxes, menus, and embedded object resources. (Moving the resources to a DLL afterwards will be a pain)
  2. Do not hardcode strings or user interface resources. (If you don't prepare, you know you will hardcode strings)
  3. Do not put nonlocalizable resources into the resource-only DLLs. This causes confusion for translators.
  4. Do not use composite strings that are built at run time from concatenated phrases. Composite strings are difficult to localize because they often assume an English grammatical order that does not apply to all languages. (After the interface design, changing phrases gets harder)
  5. Avoid ambiguous constructs such as "Empty Folder" where the strings can be translated differently depending on the grammatical roles of the strings' components. For example, "empty" can be either a verb or an adjective, and this can lead to different translations in languages such as Italian or French. (Same issue)
  6. Avoid using images and icons that contain text in your application. They are expensive to localize. (Use text rendered over the image)
  7. Allow plenty of room for the length of strings to expand in the user interface. In some languages, phrases can require 50-75 percent more space. (Same issue, if you don't plan for it now, redesign is more expensive)
  8. Use the System.Resources.ResourceManager class to retrieve resources based on culture.
  9. Use Microsoft Visual Studio .NET to create Windows Forms dialog boxes, so they can be localized using the Windows Forms Resource Editor (Winres.exe). Do not code Windows Forms dialog boxes by hand.