Automatizált fordításfigyelés

Teszt jelleggel beüzemeltem a honlapomon egy automatizált fordítás figyelési „rendszert”. Az ötletet az adta, hogy a hivatalos fordítási szerverünkön nem csak olyan modulok szerepelnek, melyet én is használok, így azok újabb kiadásairól nem értesülök az Update modul segítségével. Pedig azokat a fordításokat is frissen kéne tartani. Gyakran csak pár szöveg módosul egy frissítésben, még gyakrabban annyi se, de mégsem kerül frissítésre a fordításunk. Egyszerűen azért, mert nem figyeli semmi, hogy új verzió született belőle.

A Localization Server drupal.org modulját elvetettem, ez sajnos nem jó a számomra. Én olyan megoldás szerettem volna megvalósítani, hogy egyértelműen lássam a „friss tartalmat”, vagyis milyen új kiadások vannak, mivel kell foglalkozni, stb. Ez azért fontos, hogy tudjam, pontosan mit kell majd a hivatalos fordítási oldalra továbbítani.

Fontos szempont továbbá, hogy az itt üzemelő Localization Server-ről, valamint a hivatalos fordítási felületünkről pontosan ugyanazt a fordítást lássuk viszont. Illetve annyiban tér el a kettő, hogy itt egy kezelt projekt valamennyi kiadása letöltésre, és feldolgozásra kerül. Ehhez tudni kell, hogy egy 100%-os fordítottságot elért modult „visszaportolni” a korábbi verziókra gyakran csak a pillanatok műve, vagy eleve 100%-os lesz az is, magától.

Az egyelőre nulla hibakezeléssel, ámde lényegre törően programozott, teszt jelleggel üzemelő megoldás néhány közzétett (Localization Server, FeedAPI, CCK, Views, stb.), valamint egy saját „modul” segítségével működik. A saját modul azért van idézőjelben, mert tulajdonképpen nem egy igazi modul. Egy FeedAPI Itemfilter van benne megvalósítva, valamint a lényegi műveletek végzésére a hook_cron()-ból hívott fügvények szerepelnek benne.

No, de lássuk, hogyan működik a „rendszer” (jelenleg). A fordítás menüpont a helyi Localization Server kezdőlapjára visz böngészés céljából, az export funkció pedig természetesen itt is elérhető. Még egyszer hangsúlyozom, fordítás tekintetében bitre ugyanazt kapod innen is, mint a hivatalos fordítói oldalról. Két menüpont van még, a kezelt projektek, és a kiadások. Ezek azt hiszem további magyarázatra nem is szorulnak, az utóbbit lehet szűrni projektre és állapotra.

Belsőleg minden egyes projekt egy külön erre a célra fenntartott projekt tartalomtípusú hírcsatorna. A hírcsatorna webcímét kell neki megadni, és a gyorsbeküldő blokkal új tartalomként beküldeni. Ez jelenleg nem publikus, lévén jelen cikk írásakor közel 300 kiadásnyi lemaradásban van a rendszer a múltat tekintve. Később valószínűleg be lehet küldeni egyéb figyelendő projekteket is. Beküldés után a projekt megjelenik a fordítás/projektek menüpontban Releases for modulnév címmel. Eddig semmi különös, ám ez elindítja az időzített feladatok láncreakcióját.

A saját modul első időzített feladata, hogy kiválaszt véletlenszerűen egy beküldött projektet, (ha van olyan, amelynek címe Releases for-al kezdődik, vagyis új, akkor csak azok közül választ) letölti a drupal.org-ról a projekt információs oldalát, kiszedi a lényegi tartalmat belőle, átalakítja a relatív hivatkozásokat abszolútra, majd összehasonlítja a kapott eredményt a projekt aktuális törzsével (ami kezdetben üres). Ha a kettő eltér egymástól, vagyis módosult valami a drupal.org-on, akkor felülírja itt is a projekt törzsét. A Releases for előtagot is eltávolítja a címből.

A FeedAPI idővel le fogja tölteni a hírcsatorna elemeit kiadás tartalomtípusként. Ezek megjelennek a fordítás/kiadások menüpontban, ám állapotuk ekkor még üres lesz. Ennek magyarázata, hogy az állapot egy CCK mező, és a FeedAPI ezeket nem írja. Mint fent már volt róla szó, a saját modul megvalósít egy FeedAPI Itemfilter-t is, melynek segítségével a -dev és -HEAD verziók nem kerülnek be a rendszerbe.

A saját modul első dolga, hogy az ilyen üres állapotú, Drupal 4-es modulokat Elavult állapotra állítása. Lényegében ezeket már előbb, a szűrőben is ki lehetne vágni, de valamiért így alakult. Jelenleg elfér, de előbb-utóbb nagy valószínűséggel már az átvételkor ki lesznek csapkodva ezek is, mint a –dev és –HEAD verziók.

A következő feladat, hogy az üres (vagyis frissen bekerült, és nem Drupal 4-es) állapotot, Új kiadásra módosítsa.

A következő időzített művelet az, hogy az Új kiadás állapotú elemekből véletlenszerűen kiválaszt egyet, és letölti azt az ftp.drupal.org-ról a Localization Server által figyelt, webről nem elérhető alkönyvtárba. Ha egy speciális változó, mint modulnév be van állítva a Devel ablakból a variable_set() segítségével, akkor amíg annak a projektnek van le nem töltött kiadása, addig csak azokat töltögeti lefelé véletlenszerűen. Ez arra jó, hogy megkerülve a véletlenszerűséget, csak „egy projektre (modulra) gyúrjon”. Ha már minden szükséges kiadást leszedett az adott projektből, akkor a változó törlésével visszaáll a minden projektből véletlenszerűen választó módra. A letöltött modulok ekkor Letöltve állapotba kerülnek.

Kis idő elteltével a Localization Server kiszúrja az új modult a webről nem elérhető alkönyvtárban, és feldolgozza. Itt 2 sor erejéig meg kellett hekkelni az Localization Server modult, hogy minden egyes kiadás feldolgozásánál amolyan hook-szerűen hívja meg a saját modulban lévő függvényt, amely Feldolgozva állapotba helyezi az adott kiadást.

A következő időzített művelet az, hogy a Feldolgozva állapotú kiadások tar.gz állománya törlésre kerül a webről nem elérhető alkönyvtárból. Ekkor Átnézendő állapotba kerül az adott kiadás.

Egy újabb függvény véletlenszerűen kiválaszt egy ilyen Átnézendő állapotú kiadást (itt is működik, hogy ha van az a beállított változó, akkor csak abból a projektből választ véletlenszerűen), és megfelelően felparaméterezve, belsőleg meghívja a Localization Server export műveletét, amely a /tmp alkönyvtárba készíti az exportot. Ha az export azt a hibát adja vissza, hogy nincs egyetlen exportálandó szöveg sem, akkor ez egy Localization Server feldolgozási hiba a beolvasáskor, és visszaállítja a kiadást Új kiadás állapotba az ismételt letöltés érdekében. Ha van export állomány, akkor két állapotot vehet fel a kiadás: Fordított vagy Hiányos. Értelemszerűen, ha nincs az exportban egyetlen fordítatlan szöveg sem, akkor Fordított lesz az állapota, ellenkező esetben Hiányos. Evvel az időzített műveletek lényegében be is fejeződtek. Természetesen van mód arra (bár egyelőre csak Devel ablakból), hogy egy adott projektben, egy import után minden Hiányos állapotú kiadás ismételten Átnézendő legyen.

Még egyetlen állapot van hátra, ez pedig a Kész. Akkor kap egy kiadás Kész jelzőt, ha legalább egyszer kézzel ki lett exportálva, valamint a tartalma tökéletesen megegyezik a hivatalos fordítási szerveren elérhető verzióval. Magyarán a Fordított és a Kész között csak annyi a különbség, hogy a Fordított állapotig önállóan, emberi beavatkozás nélkül, az éjszaka közepén is eljuthat egy projekt új kiadása, míg a Kész már embert, és némi ellenőrzést is látott.

Hát egyelőre ennyi.