Gettext 
   is a set of tools, guidelines, directory naming conventions 
   and a runtime library. Together, they are the standard way to translate
   applications in the *nix environment. Don't be scared, you can use
   it on Windows as well. I don't want to describe the whole system here,
   just the things you need to translate your application - you can read 
   the manual
   if you want more information.
  
   The gettext system translates replaces whole strings with the translated
   equivalent in the target language. This means that you don't have to 
   invent array keys but can keep the original string in the code, which 
   makes it a lot more readable. The translations are written down in 
   so-called .po-files, where "po" stands for
   "portable object". They contain the human-readable and human-editable
   translation of the strings to the target language. To speed up the
   live-translation process when the application is running, they are
   compiled to .mo-files, "machine object" files.
   These files are required to be in a certain directory structure:
   
locale
  -language-
    LC_MESSAGES
      -applicationname-.po
      -applicationname-.mo
  de
    LC_MESSAGES
      appwizard.po
      appwizard.mo
      tuxracer.mo
  es
    LC_MESSAGES
      appwizard.mo
      tuxracer.mo
    | 
   Here you see, that there are 2 languages: german (de) and spanish (es).
   They contain both the machine object files for the applications
   AppWizard and TuxRacer. The
   original translation files are not required for running the program,
   and so only the german translation file for AppWizard is here. 
   If you are on *nix, have a look at 
   /usr/share/locale/. You will find the translations
   for many programs there.
  
   A .mo translation file looks the following way:
   
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2002-04-06 21:44-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"
#: gettext_example.php:12
msgid "A string to be translated would go here"
msgstr "Ein string der übersetzt werden soll steht hier"
msgid "Really quit?"
msgstr "Wirklich beenden?"
msgid "This is a glade language test script"
msgstr "Dies ist ein Glade Sprach-test script"
  | 
   The first 15 lines are a sort of header, which can be customized
   with dates and authors.
   After the header the translation begins: msgid
   tells what shall be translated, and msgstr is
   the translation. Special chars in strings can be escaped as 
   usually with a backslash \.
  
   After translating your strings, you have to compiles the
   .po to .mo files
   which is done by using the msgfmt tool.
   On *nix, you should have it somewhere; on Windows you can get
   it with mingw32.
   Go to the LC_MESSAGES directory and just call the compiler:
   
   which will result in a messages.mo file.