Ero sivun ”Gettext” versioiden välillä
(→Kääntäminen: näin varmaan parempi) |
|||
(9 välissä olevaa versiota 6 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ä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ä. | 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ä. | ||
Rivi 77: | Rivi 77: | ||
"Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||
#: ohjelma.c: | #: 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: | #: 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> | 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: | #: 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: | #: 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 | 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 | 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.