I have never been a friend of proprietary localization tools for Freeware or Open Source applications. Using dxgettext, the Delphi port of GNU gettext looks like a much better option to me:
- Integration into the program (even much later than its development) is easy.
- Extraction of translatable strings can be done by command line programs and is therefore easily introduced into an automated build.
- A new translation can be added simply by creating a new directory with the correct structure, copying the empty translation file into it, and starting to translate the strings. This is something each user can do for themselves, there's no need to involve the original author for creation of a new translation. There is also instant gratification with this process - once the program is restarted the new translations are shown immediately.
- Changing an existing translation is even easier than creating a new one. Thus if a user finds spelling or other errors or needs for improvement in the translation they can correct them easily and send the changes to the author.
- New program versions work with old translations, the system degrades very gracefully - new and untranslated strings are simply shown unmodified.
- Translations can be made using only notepad, but there are several free tools for creating and managing translation files too; see the links on the dxgettext page. They are localized themselves, and have some advantages over a spreadsheet as well:
- The location of the strings in the source code can be shown (makes sense only for Open Source apps, of course).
- The percentage of translated strings is shown.
- Modifications to already translated strings are highlighted too.
- The whole system is mature and future-proof - I have used dxgettext for Delphi 4 programs, and there should be no changes necessary for Delphi 2009 even - translation files have always been UTF-8 encoded.
Using a spreadsheet for the translation doesn't seem a workable solution to me once you have more than a few languages. Suppose a new program version adds 2 new strings and changes 10 strings only slightly - wouldn't you need to add the new strings to and highlight the changed strings in all of the several dozen spreadsheet files and send them again to your translators? Using dxgettext you just mail the changed po file to all of them.
Edit:
There is an interesting comment about the problems there may be with dxgettext and libraries. I did never experience this, as I have stopped using resource strings altogether. The biggest part of our programs are in German, and only a few are in English or translated into several languages.
Our internal libraries use "_(...)" around all translatable strings. There are defines ENGLISH
and USEGETTEXT
that are set on a per-project basis. If ENGLISH
or USEGETTEXT
are defined, then the English texts are compiled into the DCUs, else the German text is compiled into the DCUs. If USEGETTEXT
is not defined "_()" is compiled as a function that returns its parameter as-is, else the dxgettext translation lookup is used.