Difference between revisions of "Supporting GUI Translation"

From ScummVM :: Wiki
Jump to navigation Jump to search
m (Add link to file format description)
Line 3: Line 3:
== Mark translatable strings in the source code ==
== Mark translatable strings in the source code ==
In order to make a string translatable you have to use one of the following pseudofunctions in your code:
In order to make a string translatable you have to use one of the following pseudofunctions in your code:
*  ''_(char *)'' -  Main way to mark strings. You need it in majority of cases.
* ''_(char *)'' -  Main way to mark strings. You need it in majority of cases.
* ''_s(char *)'' - Function used to mark static string constants. For instance, when you have static arrays which need to be translated. In this case you mark these strings with _s(), and then use ''_()'' at the place where you need to perform the substitution.
* ''_c(char *, char *)'' - Another way to mark strings. It attaches the string to a context so that we can have different translations for the same string. The second argument is the context.
*  ''_t(char *)'' - Function used for console messages. It applies charset conversion to the output. But this feature is available only on those platforms which have full blown -liconv)
* ''_s(char *)'' - Function used to mark static string constants. For instance, when you have static arrays which need to be translated. In this case you mark these strings with _s(), and then use ''_()'' or ''_c()'' at the place where you need to perform the substitution.
<syntax type="C++">
<syntax type="C++">
static const char* foo = _s("Some translatable text");
static const char *foo = _s("Some translatable text");
StaticTextWidget* bar = new StaticTextWidget(this, "name", _(foo),  _("Some other translatable text for the tooltip"));
StaticTextWidget *bar = new StaticTextWidget(this, "name", _(foo),  _("Some other translatable text for the tooltip"));
StaticTextWidget *path = new StaticTextWidget(this, "name", _("None", "path"));
StaticTextWidget *soundfont = new StaticTextWidget(this, "name", _("None", "soundfont"));
</syntax>
</syntax>
In the above example "None" can be translated differently depending if it refers to a path or a soundfont.


== Update the translation template file ==
== Update the translation template file ==

Revision as of 20:21, 23 August 2010

This page describes what developers need to do to make some part of the ScummVM GUI translatable. Therefore it concerns in particular the porters and developers working on the GUI.

Mark translatable strings in the source code

In order to make a string translatable you have to use one of the following pseudofunctions in your code:

  • _(char *) -  Main way to mark strings. You need it in majority of cases.
  • _c(char *, char *) - Another way to mark strings. It attaches the string to a context so that we can have different translations for the same string. The second argument is the context.
  • _s(char *) - Function used to mark static string constants. For instance, when you have static arrays which need to be translated. In this case you mark these strings with _s(), and then use _() or _c() at the place where you need to perform the substitution.

<syntax type="C++"> static const char *foo = _s("Some translatable text"); StaticTextWidget *bar = new StaticTextWidget(this, "name", _(foo), _("Some other translatable text for the tooltip")); StaticTextWidget *path = new StaticTextWidget(this, "name", _("None", "path")); StaticTextWidget *soundfont = new StaticTextWidget(this, "name", _("None", "soundfont")); </syntax>

In the above example "None" can be translated differently depending if it refers to a path or a soundfont.

Update the translation template file

  1. All the files that contain translatable text should be listed in the po/POTFILES file. So if you are adding translatable text into a file, you should make sure that file is listed in POTFILES and otherwise add it to the list.
  2. You should then update the scummvm.pot template file by running "make updatepot". You need to have the gettext tool installed to run that command.

The translations are transformed into a translations.dat file (which can be done by executing "make translations-dat"), and the gettext tools are not needed for the compilation or executation of ScummVM. They are only needed to update the scummvm.pot template file and the translations when translatable strings are added, removed or modified in the source code.

Translations file format

See Supporting GUI Translation/Translations DAT Format for a description of the format of the translations.dat file.

TO DO

  • Updating interface without restart. This will require moving much code to reflowLayout() for all dialogs and is a big piece of work.
  • Situations with strings not fitting into widgets. No code around that. Suggestions are welcome.
  • Behaviour for non-ASCII hotkeys (surrounded by tildes) is undefined and was not even tested.
  • Add support for context-based translation. For example only one translation for "None" can be provided and will be used everywhere "None" is used in the english GUI. In french depending on the grammatical gender of the word to which it refers (e.g. Extra Path, Soundfont) the translation should be different but for the moment it is not possible. The gettext tools now support a standard way to do context-based translation (see http://www.gnu.org/software/hello/manual/gettext/Contexts.html) but our po2c script does not. The TranslationManager would also need to be modified.