Förbereda ditt projekt
In the instructions below we will assume that you will not be using gettext directly, but intltool, which was written specifically for GNOME. intltool uses gettext(), which extracts strings from source code, but intltool can also combine strings from other files, for example from desktop menu details, and GUI resource files such as Glade files, into standard gettext .pot/.po files.
Vi antar också att du använder autotools (automake och autoconf) för att bygga ditt projekt (även om autotools inte rekommenderas för nya program), och att du använder https://gitlab.gnome.org/GNOME/gnome-common/blob/master/autogen.sh eller en liknande autogen.sh-fil som bland annat tar hand om viss intltool-initiering.
Om du använder meson (rekommenderas), se kapitlet Lokalisering i handboken för Meson. Du kan sedan hoppa över detta avsnitt.
Ett alternativ till autogen.sh från gnome-common kan se ut så här:
#! /bin/sh -e
test -n "$srcdir" || srcdir=`dirname "$0"`
test -n "$srcdir" || srcdir=.
autoreconf --force --install --verbose --warnings=all "$srcdir"
echo "Running intltoolize --copy --force --automake"
intltoolize --copy --force --automake
test -n "$NOCONFIGURE" || "$srcdir/configure" "$@"
Create a sub-directory named po in your project's root directory. This directory will eventually contain all of your translations. Within it, create a file named LINGUAS and a file named POTFILES.in. It is common practice to also create a ChangeLog file in the po directory so that translators can keep track of translation changes.
LINGUAS innehåller en alfabetiskt sorterad lista med koder som identifierar språken som ditt program översatts till (kommentarsrader startar med # och ignoreras). Varje språkkod som listas i LINGUAS-filen måste ha en motsvarande .po-fil. Så om ditt program har tyska och japanska översättningar så skulle din LINGUAS-fil se ut så här:
# keep this file sorted alphabetically, one language code per line
de
ja
(Dessutom skulle du ha filerna de.po och ja.po i din po-katalog som innehåller de tyska respektive japanska översättningarna.)
POTFILES.in är en lista över sökvägar till alla filer som innehåller strängar som markerats för översättning, med start i projektets rotkatalog. Så om ditt projekts källkod fanns i en underkatalog med namnet src, och du hade två filer som innehöll strängar som ska översättas, så skulle din POTFILES.in-fil kunna se ut så här:
src/main.cc
src/other.cc
If you are using gettext directly, you can only mark strings for translation if they are in source code file. However, if you use intltool, you can mark strings for translation in a variety of other file formats, including Glade UI files, xml, .desktop files and several more. So, if you have designed some of the application UI in Glade then also add your .glade files to the list in POTFILES.in.
Nu då det finns en plats att lägga dina översättningar behöver du initiera intltool och gettext. Lägg till följande kod till din configure.ac och ersätt ”programnamn” med namnet på ditt program:
IT_PROG_INTLTOOL([0.35.0])
GETTEXT_PACKAGE=programname
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
[The domain to use with gettext])
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.17])
PROGRAMNAME_LOCALEDIR=[${datadir}/locale]
AC_SUBST(PROGRAMNAME_LOCALEDIR)
Denna variabel PROGRAMNAME_LOCALEDIR kommer användas senare i Makefile.am-filen för att definiera ett makro som kommer användas när du initierar gettext i din källkod.
AM_GLIB_GNU_GETTEXT har varit ett alternativ till AM_GNU_GETTEXT och AM_GNU_GETTEXT_VERSION, men AM_GLIB_GNU_GETTEXT är nu föråldrat, och ska inte användas i ny kod.
I Makefile.am på toppnivån:
-
Lägg till po till variabeln SUBDIRS. Utan detta kommer dina översättningar inte byggas och installeras när du bygger programmet
-
Definiera INTLTOOL_FILES som:
INTLTOOL_FILES = intltool-extract.in \ intltool-merge.in \ intltool-update.in
-
Add INTLTOOL_FILES to the EXTRA_DIST list of files. This ensures that when you do a make dist, these files will be included in the source tarball.
-
Uppdatera din DISTCLEANFILES:
DISTCLEANFILES = ... intltool-extract \ intltool-merge \ intltool-update \ po/.intltool-merge-cache
-
Beroende på typerna av filer som innehåller översättbara strängar lägger du till kod som
desktopdir = $(datadir)/applications desktop_in_files = programname.desktop.in desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@
In your src/Makefile.am, update your AM_CPPFLAGS to add the following preprocessor macro definition:
AM_CPPFLAGS = ... -DPROGRAMNAME_LOCALEDIR=\"${PROGRAMNAME_LOCALEDIR}\"
Detta makro kommer användas när du initierar gettext i din källkod.