Gettext

Linux.fista
Siirry navigaatioon Siirry hakuun
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Gettext on GNU-projektin työkalu ohjelmien kotoistamiseen.

Gettextiä käytettäessä ohjelman käännettävät merkkijonot merkitään sen lähdekoodiin, jonka jälkeen lähdekoodista luodaan alkuperäiset tekstit sisältävä .pot-tiedosto. Tähän tiedostoon kääntäjät sitten lisäävät käännökset eri kielille. Lopulta .pot-tiedostosta luotu, käännökset sisältävä .po-tiedosto muutetaan binäärimuotoon (.mo) ja tallennetaan sopivaan hakemistoon. Tämän jälkeen ohjelma korvaa ajon aikana alkuperäiset merkkijonot käännöksillä.

Käyttö

Ohjelma käyttämään Gettextiä

Luodaan esimerkiksi C-kielinen esimerkkiohjelma ja sille käännökset. Luodaan tiedosto ohjelma.c jonka sisältö on seuraava:

#include <stdio.h>
#include <stdlib.h>
/* Gettextin tarvitsemat kirjastot */
#include <libintl.h>
#include <locale.h>

/* Gettext ei ymmärrä muuta kuin gettext()-funktiolla ympäröidyt merkkijonot
   Käytetään mieluummin lyhyempää _()-funktiota, jonka esikääntäjä sitten
   korvaa gettext()-funktiolla */
#define _(merkkijono)    gettext(merkkijono)

int main ( void )
{
  /* Alustetaan Gettext */
  char ohjelma[] = "ohjelma";
  setlocale ( LC_ALL, "" );   /* Käytetään ympäristömuuttujia */
  bindtextdomain ( ohjelma, "./kaannos" );  /* Haetaan käännökset kaannos-alihakemistosta */
  textdomain ( ohjelma );  /* Otetaan käännökset käyttöön */

  /* Varsinainen ohjelma */

  printf ( _("Hello Linux.fi\n") );

  char url[]="http://linux.fi";
  /* TRANSLATORS: Please let %s as it is */
  printf( _("Visit %s") , url);

  printf("\n");

  return EXIT_SUCCESS;
}

Ohjelmassa tulostettavat merkkijonot on korvattu _()-funktiolla, jolle annetaan parametrina alkuperäiskielellä kirjoitettu merkkijono. Tämä ohjelma voidaan kääntää normaalisti GCC:llä:

gcc ohjelma.c -o ohjelma

Ja ajaa komennolla

./ohjelma

Ohjelman tuloste on nyt normaalisti englanniksi:

$ ./ohjelma
Hello Linux.fi
Visit http://linux.fi

Luodaan .pot-tiedosto

Nyt kun ohjelma käyttää käännöksiä, on seuraavaksi luotava tiedosto, johon kääntäjät voivat lisätä käännöksiä eri kielille. Lähdekooditiedostojen merkkijonot voidaan hakea xgettext-ohjelmalla:

xgettext ohjelma.c

jonka tuloksena on messages.po-niminen tiedosto. Kuitenkin oletuksena xgettext ymmärtää vain gettext()-funktiolla merkattuja merkkijonoja, joten kerrotaan sille, että käytämme _()-funktiota. Lisäksi lähdekoodissa on lisätty kommentti kääntäjille TRANSLATORS:-tunnisteella varustettuna. Koska haluamme sisällyttää nämä kommentit luotavaan tiedostoon, kerrotaan myös tämä avainsana xgettextille:

xgettext -k_ -cTRANSLATORS: ohjelma.c -o ohjelma.pot

Huomaa, että valitsimen (esim. -c) ja parametrin (esim. TRANSLATORS:) välissä ei saa olla välilyöntiä. Jos saat virheilmoituksen, jonka mukaan tiedostossa on muita kuin ASCII-merkkejä, on lisäksi kerrottava käytetty merkistö (yleensä UTF-8):

 xgettext --from-code=utf-8 -cTRANSLATORS: -k_ ohjelma.c -o ohjelma.pot

Nyt tiedoston ohjelma.pot pitäisi näyttää tältä:

# 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: 2007-10-13 19:36+0300\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"

#: ohjelma.c:22
#, c-format
msgid "Hello Linux.fi\n"
msgstr ""

#. TRANSLATORS: Please let %s as it is
#: ohjelma.c:26
#, c-format
msgid "Visit %s"
msgstr ""

Tiedoston alussa olevat otsikkotiedot on selitetty kotoistus-artikkelissa.

Tiedostossa alkuperäiset merkkijonot on merkitty msgid-kohtiin ja käännökset on tarkoitus kirjoittaa msgstr-kohtiin. Huomaa myös kääntäjälle tarkoitettu kommentti, joka kehottaa olemaan muuttamatta %s-merkintää joka on välttämätön C-ohjelman toiminnalle.

Kääntäminen

Kun ohjelmasta on luotu .pot-tiedosto, seuraava vaihe on käännöstiedoston luonti, sekä käännösten tekeminen. Käännöstiedosto voidaan luoda käsin kopioimalla, tai käyttämällä msginit komentoa.

msginit -l fi_FI -o fi.po ohjelma.c

Lopullinen käännöstiedosto voisi näyttää tältä (tiedosto fi.po:

# Linux.fi:n esimerkkiohjelma
# Copyright (C) Linux.fi
# This file is distributed under the same license as the ohjelma package.
# Linux.fi:n koodariryhmä <foo@bar>, 2007
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: linux.fi\n"
"POT-Creation-Date: 2007-10-13 18:51+0300\n"
"PO-Revision-Date: 2007-10-13 18:52+0300\n"
"Last-Translator: Linux.fin käännösryhmä <foo@bar>\n"
"Language-Team: Finnish <fi@bar>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: ohjelma.c:22
#, c-format
msgid "Hello Linux.fi\n"
msgstr "Terve Linux.fi\n"

#. TRANSLATORS: Please let %s as it is
#: ohjelma.c:26
#, c-format
msgid "Visit %s"
msgstr "Vieraile osoitteessa %s"

Käännöksen käyttöönotto

Kun käännös on valmis, pitää se muuttaa binäärimuotoon. Tämä onnistuu msgfmt-ohjelmalla komennolla

msgfmt fi.po -o ohjelma.mo

Huomaa, että tiedostonimen pitää olla lähdekoodissa textdomain()-funktiolle annettu nimi ja tiedostopäätteen .mo.

Koska bindtextdomain()-funktiolla on käännöksen poluksi asetettu ./kaannos, on juuri luotu ohjelma.mo tallennettava sen alle sopivaan alihakemistoon joka riippuu käytetystä kielestä, ja suomen tapauksessa se on

./kaannos/fi/LC_MESSAGES/

Siirrä ohjelma.mo nyt tähän polkuun ja aja alussa käännetty ohjelma, jolloin käännösten pitäisi olla käytössä:

$ LC_ALL=fi_FI.utf8 ./ohjelma
Terve Linux.fi
Vieraile osoitteessa http://linux.fi

LC_ALL muuttuja määrittelee halutun localen. Asennetut localet näkee komennolla locale -a.

Katso myös

Aiheesta muualla