Software vertalen met GNU gettext¶
GNU gettext is een van de meest breed gebruikte programma’s voor het internationaliseren van vrije software. Het verschaft een eenvoudige maar flexibele manier om de software te vertalen. Het heeft geweldige ondersteuning voor meervouden, het kan meer context toevoegen aan de vertaalde tekenreeks en er zijn een heleboel programma’s omheen gebouwd. Natuurlijk wortd het goed ondersteund in Weblate (bekijk de GNU gettext PO (Portable Object) beschrijving voor de bestandsindeling).
Notitie
Als u van plan bent het te gebruiken in gesloten software, raadpleeg dan eerst de licentie, het zou niet geschikt voor u kunnen zijn.
GNU gettext kan worden gebruikt vanuit een variëteit aan talen (C, Python, PHP, Ruby, JavaScript en nog veel meer) en gewoonlijk hebben de framewerken voor de gebruikersinterface er al enige ondersteuning voor. Het standaard gebruik is door de functieaanroep gettext(), waarvoor vaak het alias _() wordt gebruikt om de code eenvoudiger en gemakkelijker te lezen te maken.
Aanvullend verschaft het de aanroep pgettext() om aanvullende context te verschaffen aan vertalers en ngettext() dat typen meervoudsvormen kan afhandelen, zoals gedefinieerd voor de doeltaal.
Als ene breed gebruikt programma, heeft het veel wrappers die het gebruik ervan echt eenvoudig maken, in plaats van het handmatig activeren van gettext, hieronder beschreven, zou u er misschien een van willen proberen, bijvoorbeeld intltool.
Overzicht werkstroom¶
De GNU gettext gebruikt verscheidene bestanden om het vertalen te beheren:
PACKAGE.pot
bevat tekenreeksen die zijn uitgenomen uit uw broncode, gewoonlijk met xgettext of enige wrappers op hoog niveau, zoals intltool.LANGUAGE.po
bevat tekenreeksen met een vertaling naar ene enkele taal. Het moet worden bijgewerkt met msgmerge als het bestandPACKAGE.pot
eenmaal is bijgewerkt. U kunt nieuwe taalbestanden maken met msginit of binnen Weblate.LANGUAGE.mo
bevat binaire weergaven vanLANGUAGE.po
en wordt gebruikt tijdens runtime van de toepassing. Gewoonlijk wordt het niet betrokken bij versiebeheer, maar gegenereerd bij het compileren met msgfmt. In het geval u het in versiebeheer wilt hebben, kunt u het in Weblate genereren met de add-on MO-bestanden genereren.
In het algemeen ziet de werkwijze van GNU gettext er als volgt uit:
Zie ook
Voorbeeldprogramma¶
Het eenvoudige programma in C met gettext zou er als volgt uit kunnen zien:
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int count = 1;
setlocale(LC_ALL, "");
bindtextdomain("hello", "/usr/share/locale");
textdomain("hello");
printf(
ngettext(
"Orangutan has %d banana.\n",
"Orangutan has %d bananas.\n",
count
),
count
);
printf("%s\n", gettext("Thank you for using Weblate."));
exit(0);
}
Vertaalbare tekenreeksen uitnemen¶
Als u eenmaal de code hebt verkregen met aanroepen van gettext, kunt u xgettext gebruiken om er eenheden uit te nemen en die op te slaan in een bestand .pot:
$ xgettext main.c -o po/hello.pot
Notitie
Er bestaan alternatieve programma’s om tekenreeksen uit de code uit te nemen, bijvoorbeeld pybabel.
Dat creëert een sjabloonbestand dat u kunt gebruiken om te beginnen met nieuwe vertalingen (met msginit) of bestaande bijwerken na een wijziging in de code (u zou daar msgmerge voor gebruiken). Het resulterende bestand is eenvoudigweg een gestructureerd tekstbestand:
# 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: 2015-10-23 11:02+0200\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"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: main.c:14
#, c-format
msgid "Orangutan has %d banana.\n"
msgid_plural "Orangutan has %d bananas.\n"
msgstr[0] ""
msgstr[1] ""
#: main.c:20
msgid "Thank you for using Weblate."
msgstr ""
Elke regel msgid
definieert een te vertalen tekenreeks, de speciale lege tekenreeks in het begin is de kop van het bestand dat metadata over de vertaling bevat.
Nieuwe vertaling beginnen¶
Met het sjabloon op zijn plaats, kunnen we beginnen met onze eerste vertaling:
$ msginit -i po/hello.pot -l cs --no-translator -o po/cs.po
Created cs.po.
Het zojuist gemaakte bestand cs.po
heeft al enige informatie ingevuld in zich. Meest belangrijk is om de juiste definitie voor de meervoudsvormen voor de gekozen taal te krijgen en u kunt zien dat het aantal meervouden is gewijzigd overeenkomstig daarmee:
# Czech translations for PACKAGE package.
# Copyright (C) 2015 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Automatically generated, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-10-23 11:02+0200\n"
"PO-Revision-Date: 2015-10-23 11:02+0200\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: main.c:14
#, c-format
msgid "Orangutan has %d banana.\n"
msgid_plural "Orangutan has %d bananas.\n"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: main.c:20
msgid "Thank you for using Weblate."
msgstr ""
Dit bestand is gecompileerd in een geoptimaliseerde binaire vorm, het bestand .mo, gebruikt door de functies van GNU gettext tijdens uitvoering.
Tekenreeksen bijwerken¶
Als u eenmaal meer tekenreeksen toevoegt, of enige tekenreeksen in uw programma wijzigt, moet u xgettext opnieuw uitvoeren, wat het sjabloonbestand opnieuw genereert:
$ xgettext main.c -o po/hello.pot
Dan kunt u de individuele vertaalbestanden bijwerken om overeen te komen met de nieuw gemaakte sjablonen (dit is inclusief het opnieuw ordenen van de tekenreeksen om overeen te komen met het nieuwe sjabloon):
$ msgmerge --previous --update po/cs.po po/hello.pot
Importeren in Weblate¶
Voor het importeren van een dergelijke vertaling in Weblate is alles wat u hoeft te doen, is het definiëren van de volgende velden bij het maken van het onderdeel (bekijk Configuratie onderdeel voor gedetailleerde beschrijving van de velden):
Veld |
Waarde |
---|---|
Broncode-opslagruimte |
URL van de opslagruimte van het VCS met uw project |
Bestandsmasker |
|
Sjabloon voor nieuwe vertalingen |
|
Bestandsformaat |
Kies gettext PO-bestand |
Nieuwe taal |
Kies Maak nieuw taalbestand |
En dat is alles, u bent nu klaar om te beginnen met het vertalen van uw software!
Zie ook
U kunt een voorbeeld van gettext met vele talen vinden in het Weblate Hello project op GitHub: <https://github.com/WeblateOrg/hello>.