Ero sivun ”Gettext” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
 
(15 välissä olevaa versiota 7 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
'''Gettext''' on [[GNU]]-projektin työkalu ohjelmien [[kotoistus|kotoistamiseen]].  
'''Gettext''' on [[GNU]]-projektin työkalu ohjelmien [[kotoistus|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ä <tt>.pot</tt>-tiedosto. Tähän tiedostoon kääntäjät sitten lisäävät käännökset eri kielille. Lopulta käännökset sisältävä <tt>.po</tt>-tiedosto muutetaan binäärimuotoon ja tallennetaan sopivaan hakemistoon, jonka jälkeen ohjelma korvaa ajonaikana alkuperäiset merkkijonot käännöksillä.
Gettextiä käytettäessä ohjelman käännettävät merkkijonot merkitään sen [[lähdekoodi]]in, jonka jälkeen lähdekoodista luodaan alkuperäiset tekstit sisältävä <tt>.pot</tt>-tiedosto. Tähän tiedostoon kääntäjät sitten lisäävät käännökset eri kielille. Lopulta <tt>.pot</tt>-tiedostosta luotu, käännökset sisältävä <tt>.po</tt>-tiedosto muutetaan binäärimuotoon (<tt>.mo</tt>) ja tallennetaan sopivaan hakemistoon. Tämän jälkeen ohjelma korvaa ajon aikana alkuperäiset merkkijonot käännöksillä.


== Käyttö ==
== Käyttö ==


=== Ohjelma käyttämään Gettextiä ===
=== Ohjelma käyttämään Gettextiä ===
Luodaan esimerkiksi [[C]]-kielinen esimerkkiohjelma ja sille käännökset. Luodaat tiedosto <tt>ohjelma.c</tt> jonka sisältö on seuraava:
Luodaan esimerkiksi [[C]]-kielinen esimerkkiohjelma ja sille käännökset. Luodaan tiedosto <tt>ohjelma.c</tt> jonka sisältö on seuraava:
<pre>
<pre>
#include <stdio.h>
#include <stdio.h>
Rivi 55: Rivi 55:
jonka tuloksena on <tt>messages.po</tt>-niminen tiedosto. Kuitenkin oletuksena <tt>xgettext</tt> ymmärtää vain <tt>gettext()</tt>-funktiolla merkattuja merkkijonoja, joten kerrotaan sille, että käytämme <tt>_()</tt>-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 <tt>xgettextille</tt>:
jonka tuloksena on <tt>messages.po</tt>-niminen tiedosto. Kuitenkin oletuksena <tt>xgettext</tt> ymmärtää vain <tt>gettext()</tt>-funktiolla merkattuja merkkijonoja, joten kerrotaan sille, että käytämme <tt>_()</tt>-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 <tt>xgettextille</tt>:
  xgettext -k_ -cTRANSLATORS: ohjelma.c -o ohjelma.pot
  xgettext -k_ -cTRANSLATORS: ohjelma.c -o ohjelma.pot
Huomaa, että [[valitsin|valitsimen]] (esim. <tt>-c</tt>)ja parametrin (esim. <tt>TRANSLATORS:</tt>) 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]]):
Huomaa, että [[valitsin|valitsimen]] (esim. <tt>-c</tt>) ja parametrin (esim. <tt>TRANSLATORS:</tt>) 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 ohjelmat.pot
   xgettext --from-code=utf-8 -cTRANSLATORS: -k_ ohjelma.c -o ohjelma.pot
Nyt tiedoston <tt>ohjelma.pot</tt> pitäisi näyttää tältä:
Nyt tiedoston <tt>ohjelma.pot</tt> pitäisi näyttää tältä:
<pre>
<pre>
Rivi 77: Rivi 77:
"Content-Transfer-Encoding: 8bit\n"
"Content-Transfer-Encoding: 8bit\n"


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


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


=== Kääntäminen ===
=== Kääntäminen ===
Kun ohjelmasta on luotu <tt>.pot</tt>-tiedosto, seuraava vaihe on [[kotoistus|käännösten tekeminen]]. Lopullinen käännöstiedosto voisi näyttää tältä (tiedosto <tt>fi.po</tt>:
Kun ohjelmasta on luotu <tt>.pot</tt>-tiedosto, seuraava vaihe on käännöstiedoston luonti, sekä [[kotoistus|käännösten tekeminen]]. Käännöstiedosto voidaan luoda käsin kopioimalla, tai käyttämällä <tt>msginit</tt> komentoa.
msginit -l fi_FI -o fi.po ohjelma.c
Lopullinen käännöstiedosto voisi näyttää tältä (tiedosto <tt>fi.po</tt>:
<pre>
<pre>
# Linux.fi:n esimerkkiohjelma
# Linux.fi:n esimerkkiohjelma
Rivi 113: Rivi 115:
"Content-Transfer-Encoding: 8bit\n"
"Content-Transfer-Encoding: 8bit\n"


#: ohjelma.c:14
#: ohjelma.c:22
#, c-format
#, c-format
msgid "Hello Linux.fi\n"
msgid "Hello Linux.fi\n"
Rivi 119: Rivi 121:


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


=== Käännöksen käyttöönotto ===
=== Käännöksen käyttöönotto ===
Kun käännös on valmis, se pitää muuttaa binäärimuotoon. Tämä onnistuu <tt>msgfmt</tt>-ohjelmalla komennolla
Kun käännös on valmis, pitää se muuttaa binäärimuotoon. Tämä onnistuu <tt>msgfmt</tt>-ohjelmalla komennolla
  msgfmt fi.po -o ohjelma.mo
  msgfmt fi.po -o ohjelma.mo
Huomaa, että tiedostonimen pitää olla lähdekoodissa <tt>textdomain()</tt>-funktiolle annettu nimi ja tiedostopäätteen <tt>.mo</tt>.
Huomaa, että tiedostonimen pitää olla lähdekoodissa <tt>textdomain()</tt>-funktiolle annettu nimi ja tiedostopäätteen <tt>.mo</tt>.


Koska <tt>bindtextdomain()</tt>-funktiolla on käännöksen poluksi asetettu <tt>./kaannos</tt>, on juuri luoto <tt>ohjelma.mo</tt> tallennettava sen alle sopivaan alihakemistoon joka riippuu käytetystä kielestä, ja suomen tapauksessa se on
Koska <tt>bindtextdomain()</tt>-funktiolla on käännöksen poluksi asetettu <tt>./kaannos</tt>, on juuri luotu <tt>ohjelma.mo</tt> tallennettava sen alle sopivaan alihakemistoon joka riippuu käytetystä kielestä, ja suomen tapauksessa se on
  ./kaannos/fi/LC_MESSAGES/
  ./kaannos/fi/LC_MESSAGES/
[[Mv|Siirrä]] <tt>ohjelma.mo</tt> nyt tähän polkuun ja aja alussa käännetty ohjelma, jolloin käännösten pitäisi olla käytössä:
[[Mv|Siirrä]] <tt>ohjelma.mo</tt> nyt tähän polkuun ja aja alussa käännetty ohjelma, jolloin käännösten pitäisi olla käytössä:
  $ ./ohjelma
  $ LC_ALL=fi_FI.utf8 ./ohjelma
  Terve Linux.fi
  Terve Linux.fi
  Vieraile osoitteessa http://linux.fi
  Vieraile osoitteessa http://linux.fi
 
<tt>LC_ALL</tt> muuttuja määrittelee halutun localen. Asennetut localet näkee komennolla <tt>locale -a</tt>.


== Katso myös ==
== Katso myös ==
*[[Kotoistus]]
*[[Kotoistus]]
*[[Poedit]], Graafinen '''.po'''-tiedostojen kääntäjä
==Aiheesta muualla==
*[http://www.sourcerally.net/regin/49-How-to-get-PHP-and-gettext-working-%28ubuntu,-debian%29 How to get PHP and gettext working ubuntu or debian]
[[Luokka:Kehitystyökalut]]
[[Luokka:Kehitystyökalut]]

Nykyinen versio 15. lokakuuta 2015 kello 14.56

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]