Gettext

Linux.fista
Versio hetkellä 15. lokakuuta 2015 kello 14.56 – tehnyt Raspi (keskustelu | muokkaukset) (→‎Katso myös)
(ero) ← Vanhempi versio | Nykyinen versio (ero) | Uudempi versio → (ero)
Siirry navigaatioon Siirry hakuun

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ö[muokkaa]

Ohjelma käyttämään Gettextiä[muokkaa]

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[muokkaa]

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[muokkaa]

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[muokkaa]

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[muokkaa]

Aiheesta muualla[muokkaa]