This page is likely outdated (last edited on 17 May 2006). Visit the new documentation for updated content.
I18nGettext
Table of contents |
Introduction
While the Gettext# library allows you to internationalize your code, we advise you to use our Mono.Posix assembly to do so.
Requirements
For running the samples you need the following:
- mono (>= 1.0) for translating console-based aplications.
- Gtk# (>= 1.0) for translating window-based aplications.
- Glade2 for creating the GUI, not really needed but very usefull
All the examples were tested using mono 1.1.6, Gtk# 1.9.3 and Gettext# 0.14.
Using GetText#
Installation
You can download the current version from here. The older version can the downloaded from this site. Older versions of Gettext doesn’t support C#, so older versions doesn’t work.
After downloading the package you need to uncompress it.
$ tar xvfz gettext-0.14.tar.gz
then
$ ./configure && make
within the created folder, by default the configure script allows the C# language so you don’t need any extra parameter, and finally, install using the root user
# make install
Now we can use the GetText# library for translating our application.
Using GetText# with console-based applications
For using GetText# we need to add the following namespace to our code: GNU.Gettext, then declare a variable that allows GetText# to set translatable strings and finally begin to replace all the strings that we need to translate using a method from GetText#.
For example, lets see the following code from a source file called Example.cs:
public class Example
{
public static void Main (string[] args)
{
System.Console.WriteLine ("Hello world!");
}
}
we should modify it in this way:
using GNU.Gettext; //Required namespace for i18n
public class Example
{
//This variable will allow us to set which strings are translatable
//"my_class" is a catalog identifier, used in the next section
private static GettextResourceManager _catalog = new GettextResourceManager ("my_class");
public static void Main (string[] args)
{
//This string is modified adding the method GetString() from the catalog variable
System.Console.WriteLine (_catalog.GetString ("Hello world!"));
}
}
There is only one string marked as translatable: “Hello world!”
_catalog.GetString ("Hello world!")
using the method GetString we mark any string as translatable, we need to repeat the process of marking-the-string in all the string that we need to translate. Lets compile our example.
$ mcs -r GNU.Gettext Example.cs
then lets run it
$ mono Example.exe
You’ll see that the output is still Hello world!, Why? Because we haven’t translated the string, we marked it as translatable, now we need to translate it. For doing that we need to get the strings from our source code using this statement:
$ xgettext --from-code=UTF-8 Example.cs -o es.po
Using the –from-code=UTF-8 parameter sets the source file format, and es.po will be the file which contain all the strings to translate. We will translate this sample from english to spanish. The stament used above creates a file called es.po, and its content is something like the following:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2004-08-13 04:08-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: Example.cs:11
msgid "Hello world!"
msgstr ""
Do not forget to change the CHARSET from this line
"Content-Type: text/plain; charset=CHARSET\n"
to something like this
"Content-Type: text/plain; charset=UTF-8\n"
See the following lines
#: Example.cs:11
msgid "Hello world!"
msgstr ""
You will notice three important sections:
- line number and source file: name where the translatable string exists
- translatable string: must not be changed
- translated string: empty by default, represents the new string which will be showed when running the translation.
After translating the file might look something like this:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2004-08-13 04:08-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: Example.cs:11
msgid "Hello world!"
msgstr "¡Hola mundo!"
Now we need to create the catalog, we use the following command for creating it
$ msgfmt --csharp -r my_class -l es es.po -d .
The stament used above generates a C# assembly due to the –csharp parameter, in the current directory, due to the parameter -d ., which is called automatically when the locale is es, due to the parameter -l es, the parameter -r my_class calls the catalog identifier which previouslly was defined in the source code. The library is within ./es/ and is called my_class.resources.dll.
Lets try again
$ LANG=es mono Example.exe
Warning: be sure to use LANG=es and not LANGUAGE=es for some reason with gettext-0.14.5 LANGUAGE=es will not work!
the output will be:
¡Hola mundo!
Using GetText# with window-based applications
TODO
Conclusions
TODO
Frequently Asked Questions
TODO