A Lokalizáció hogyan című sorozatomban arról lesz szó, hogy hogyan lehet a Gnome fordításakor előforduló problémákat megoldani, amelyek jellemzően nem lefordítható sztringek formájában jelennek meg.
Első áldozataim a .desktop fájlok lesznek, mert ezeket előszeretettel felejtik el lokalizálhatóvá tenni a kedves fejlesztők. A probléma bemutatásához egy korábban már megoldott hibajelentést használok, amely nem más mint a 559636-as gnome bug a Hálózatkezelőről.
Hogyan is néznek ezek ki ezek a fájlok? A szerkezetük egyszerű, kulcs=érték párokból állnak, amelyeket egy [] közötti szekciófejléc vezet be – régen az ilyet ini fájlnak hívták, és néhol még ma is felbukkan ez a megnevezés. Alapesetben valahogy így néz ki:
[Desktop Entry]
Name=Network Configuration
Comment=Network Manager configuration
Icon=nm-device-wireless
Exec=nm-connection-editor
Terminal=false
Type=Application
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=NetworkManager
X-GNOME-Bugzilla-Component=general
Categories=GNOME;GTK;Settings;X-SuSE-ControlCenter-System;X-GNOME-NetworkSettings;
OnlyShowIn=GNOME;
Ebből minket csak a Name és Comment kulcsok érdekelnek (illetve a KDE használja a GenericName kulcsot is). Megjegyzendő, hogy egyes disztribúciók a futás közbeni fordítás érdekében bevezettek egy saját kulcsot, amely a fordítási tartományt adja meg (például: X-Ubuntu-Gettext-Domain=network-manager-applet és X-SUSE-Gettext-Domain=network-manager-applet).
A fenti példa egy nem lokalizálható fájlt ábrázol, a lokalizálhatóvá tételéhez 4 dolog kell.
- Fordításra jelölni a kulcsokat. Egy _ jelet teszünk a neve elé: _Name, _Comment lesz belőle
- Átnevezni .desktop.in-re. Jelenleg az ilyen fájlok fordítása a forráskód fordításakor történik, szemben az általános futásidejű fordítással.
- Felvétel a POTFILES.in fájlba. Meg kell adni a .desktop.in fájl teljes elérési útját, a projekt gyökerétől indulva, pl: nm-connection-editor.desktop.in.
- A Makefile.am módosítása a fordításokkal bővített .desktop fájl előállításához
A harmadik lépés után a po könyvtárban kiadható az intltool-upadate hu parancs, amely a .desktop fájlból a kinyeri a fordítható sztringeket és elhelyezi a po fájlban.
Az utolsó pont viszont hosszabb magyarázatot igényel.
A Gnome és a hozzá készült legtöbb alkalmazás a make programot használja a kód fordításához, ennek pedig a Makefile nevű fájl adja meg, hogy mit csináljon. Ez azonban igen bonyolulttá tud válni, ezt egyszerűsítendő született az autotools nevű csomag, amelyet szintén használ a Gnome. Az autotools segítségével egy néhány száz soros kis .am fájlban leírható minden lényeges tennivaló, ezt feldolgozva áll elő a Makefile. A Makefile.am fájl írja le, hogy mi történik majd a program binárissá fordításakor.
Ahhoz hogy az elkészítendő fordítások ténylegesen használhatóvá váljanak, meg kell adni néhány egyszerű utasítást, amelyek segítségével a make parancs a .po fájlokból majd átlapátolja a lefordított sztringeket a .desktop fájlunkba, illetve a make install a megfelelő könyvtárba elhelyezi telepítéskor. Ezek az utasítások a következő kaptafára húzhatók:
desktop_in_files = nm-connection-editor.desktop.in
desktopdir = $(datadir)/applications
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@
Ennek hatására előáll a .desktop fájl.
Mi történik? A desktop_in_files változóban megadjuk, hogy melyik fájlt tekintjük bemenetnek. A desktopdir változóban lesz az a könyvtár, ahova a végeredmény kerül, lásd lentebb.
A desktop_DATA egy fájlnév-helyettesítést ad meg, a desktop_in_files-ban lévő fájlnevekben a .desktop.in tagot .desktop taggá alakítjuk, az így kapott a fájlok lesznek a desktopdir-be telepítve. Ez a változó két részből áll: egy tetszőleges előtagból és a kötött _DATA utótagból, ennek – illetve ökölszabályként, az összes itt csupa nagybetűvel írt változónak – mindenképp változatlanul kell szerepelnie, illetve az előtaggal kell kezdődnie az .in fájlokat és a célkönyvtárat megadó *_in_files és *dir változóknak. Az @INTLTOOL_DESKTOP_RULE@ egy makró, amely egy jó hosszú parancsot helyettesít, ez végzi a tényleges munkát, azaz az intltool-merge program felparaméterezett futtatását.
Nem vagyunk még kész, a make számára még meg kell adni, hogy a fájlokkal ezen kívül még mit csináljon. A helyzetet bonyolítja, hogy a .desktop fájllal ezen a ponton korábban is kellett csinálni valamit, ezeket az utasításokat el kell takarítani. Az EXTRA_DIST nevű változó tartalmazza azokat a fájlokat, amelyeket változatlan formában kell felvenni a kiadandó tar csomagba – merthogy a mindenhonnan letölthető tar.gz és tar.bz fájlokat is a make gyártja.
EXTRA_DIST +=
$(dbusservice_DATA)
- nm-applet.desktop
- nm-connection-editor.desktop
+ $(autostart_DATA)
+ $(desktop_DATA)
Korábban láttuk, hogy a desktop_DATA változóba kerül a végleges .desktop fájl neve, itt tehát csak annyi történt, hogy a bedrótozott nevet lecseréljük a változóban lévőre.
Itt ki kell térni a .desktop fájlok másik, újabb felhasználási területére, amely nem más mint az automatikusan induló programok meghatározása. Az egyetlen különbség az, hogy ezeket másik könyvtárba kell telepíteni, emiatt pedig külön változóban kell tárolni:
autostart_in_files = nm-applet.desktop.in
autostartdir = $(sysconfdir)/xdg/autostart
autostart_DATA = $(autostart_in_files:.desktop.in=.desktop)
Azt is meg kell még adni, hogy mikor törölje a make a létrejött fájlokat. Ha ugyanis újra akarjuk fordítani a programunkat, de már jelen vannak a fordításkor létrejövő fájlok, a make ezeket átugorja, ami gyorsítja a kód fordítását, de ha újra akarjuk generálni az ilyen fájlokat (mert például módosítottunk a fordításán a po-ban), akkor nem kívánatos.
CLEANFILES =
$(autostart_DATA)
$(desktop_DATA)
A CLEANFILES változóba kell felvenni a desktop_DATA és autostart_DATA értékét, a változó által megadott fájlok a make clean kiadásakor törlődni fognak.
Ezután pedig kész is vagyunk, némi gyors tesztelés után (./autogen.sh, make) látnunk kell a létrejövő .desktop fájlt, amelyben már a 3. lépés után létrehozott fordítások is szerepelnek a Name/Comment[hu]= kulcsokban.
Ha ez sikerült, elővehető a “sima” diff vagy a verziókezelő diff parancsa és legyártható a fejlesztőnek küldendő patch.
