Niklas Laxström

Doing stuff with language and translation.

Author Archives: Niklas Laxström

About Niklas Laxström

Doing stuff with language and translation.

WebWorld 2011 – wrap-up

Unfortunately my time machine is broken, so instead of telling what cool features are coming you have to bear with summary of what I did during the WebWorld sprint.

As you know UserBase Wiki uses the Translate extension to translate the wiki content. I can now cross off a common feature request from my todo list: moving and deleting translated pages. Since each language has its own page and the system uses even more pages behind the scenes, the normal move and delete actions of MediaWiki were insufficient. With some hackish code I was able to hijack those actions and replace them with my own. It is now possible to move or delete a page with all of its translations with few clicks. You can also choose to delete only one translation, which is useful if the translator accidentally used a wrong language.

For those who are addicted to stats, Special:LanguageStats now has a row which states the overall translation coverage. The number can be off a small amount for a reason unknown to me. I have to investigate why and fixit, since statistics never lie :)

And there is one more nicety regarding Special:MyLanguage, which takes care of redirecting users to their preferred language translation of a page, assuming such a translation exists. If the given page does not exist at all, the link using Special:MyLanguage is now red just like normal links to non-existing pages are.

The sprint itself was  productive. There were problems that needed to be solved, and I think we all did a good job tackling the many issues. We also managed to create some new problems: Ingo needs to learn how to not have toys stuck in inconvenient high places :) And I like the logo very much :)

Webworld 2011 – MediaWiki and UserBase

Greetings to the Planet KDE readers, where this should be my first blog post. My nickname on the net is Nikerabbit. I’ve been developing MediaWiki for many years, and I’m the author of the Translate extension. The Translate extension is used at translatewiki.net which is a wiki site and community that does open source software translation. Translate extension can also be used to translate wikipages, which is the way it is used on userbase.kde.org.

That is also the reason why I am now here at the KDE WebWorld sprint. I have updated the Translate extension on UserBase and fixed a number of bugs in it. Mostly minor things that can confuse normal users – they are no longer automatically directed to pages that are of no use to them. And UserBase now has its own translation memory. It’s the same kind we use in translatewiki.net: a very simple one provided by the translate toolkit. Currently those two are independent of each other, but maybe in the future we can find a way to use each others translations.

While working on UserBase issues here, I realized some problems in MediaWiki. First of all the Translate extension is supposed to be compatible with two MediaWiki versions: the latest stable version (1.16, used on UseBase) and the latest development version (1.19alpha, used on translatewiki.net). I am not going to talk about why there are two unreleased versions and third one being in development. Anyway, a lot of development has happened between those versions, including major new features and big rewrites. I’m spending a considerable time keeping Translate extension compatible with 1.16 when developing new features for it. It also makes the code more complex and doubles the testing required. It is not made easier by the fact that not all changes are documented in appropriate places. For example there is no mentions in hooks.txt that the parameters for SkinSubPageSubtitle hook have been changed at some point.

Another thing is that MediaWiki has so many ways to tweak it, most of them undocumented and not easily discoverable. For example all the messages in MediaWiki: namespace, some of which may even be empty by default. There is no way you can find a suitable message unless you already know that such message exists and how it is called. The same applies to configuration variables. They are at least documented in DefaultSettings.php and some also in mediawiki.org, but again it is hard to find some specific thing that could help you (if it even occurs to you that such thing might exist).

This means that people can’t really find out everything you can do with MediaWiki and they either end up not doing some things at all or creating something new from scratch.

Luonnon helmassa

Kaksi kissaa maleksii pihalla. Aurinko kuumottaa ihoa. Vaihdan istuinpaikkaani pöydän toiselle puolelle, jota varjostaa suurehko puu. Seurassani istuu ihmisiä Saksasta, Briteistä, Transkasta, Ruotsista ja Hollannista. Keskelle pihaa on rakennettu pienoisrautatie, jossa tosin ei ole junaa. Takanani seisoo metrin korkuinen hymyilevä pingviini. Pihaa reunustaa kaksi vanhahkoa rakennusta ja läjä puita. Silloin tällön linnunlaulun peittää alleen jonkin matkan päässä menevä juna. Samalla suunnalla on myös joki. Joen nimi on Ruhr. Istun Linuxhotellin pihalla Essenissä. Meneillään on KDE:n verkkotiimin WebWorld2011 -tapahtuma. Tavoitteena on kehittää ja ratkoa KDE:n verkkosivujen ongelmia laidasta laitaan. Oma roolini on auttaa MediaWikin kanssa sekä korjata ongelmia kirjoittamastani laajennoksesta, joka mahdollistaa wikisivujen kääntämisen muille kielille.

Eilen oli barbeque-ilta. Paikallisissa kaupoissa ei näemmä ole mitään muuta kuin porsasta – ei kalaa tai nautaa. Lihaa ja hedelmiä grillattiin riippuvalla grillillä, joka toimi yllättävän hyvin yhdeksän nörtin käytössä. Juomia saa ilmaiseksi hotellin juomakaapista – täytyy tosin mainita, että hiilihappokammoiselle tarjonta on kovin vähäistä. Tänään ruuaksi oli pitsaa, joiden hinnat olivat halvimmillaan käsittämättömät kaksi ja puoli euroa. Syy pitsaruokaan ole muuten se, ettei kukaan muistanut eilen käydä kaupassa!

Hotelli on varsin hulppea – löytyy niin kuntosalia kuin saunaakin. Joissaikin huoneissa on keittiö. Pihalle on piilotettu kaiuttimia sinne tänne, joista voi soittaa musiikkia sisäänkäynnin lähellä olevasta hallintapaneelista. Ovissa on elektroniset lukot, joista kuuluu kovaääninen pärinä, kun niihin heilauttaa avainta. Taidonnäytteinä on saksalaisesta insinööritaidosta on pistorasia, jonka ollessa käytössä ovi ei mahdu avautumaan tai sulkeutumaan. Lisäksi valokatkaisimet ovat aina vessan ulkopuolella. Omassa huoneessani on kaksi sänkyä ja niitä kookkaampi sohva. Huoneessa on tietysti telkka ja hyvinvarustettu kylpyhuone ammesuihkulla. Kesti hiukkasen aikaa löytää miten itse suihkun saa päälle, sen verran erilaisia liikkuvia namskoja ja vilkkuvia valoja ammeessa oli.

Vaikea päättää onko tämä enemmän lomaa vai työtä, sen verran rentouttavaa täällä on. Toisaalta pieni yhdeksen hengen kokoonpanomme on saanut jo kahden päivän aikana paljon aikaan ja se jatkuu vielä sunnuntaihin.

Vaikea kuvitella, että Suomessa olisi samankaltainen pelkästään Linuxiin ja avoimeen koodiin erikoistunut hotelli.

translatewiki.net celebrates – so do I

Oh boy time flies. Translatewiki.net turns six years next Saturday. This is the first time we celebrate its birthday. How did it happen?

It was 2005, my last year at upper secondary school when I set up a MediaWiki for myself to do some school work. I was 17, and in the fall of the same year I started studying at a university. Can you imagine how awkward it was to attend university under age of majority (18 years in Finland)? Anyway, I think the wiki was originally called Nukawiki, then Betawiki and finally translatewiki.net. The wiki has gone through many updates. It probably started with Mediawiki 1.4 which boasts in release notes that User interface language can be changed by the user. It’s also gone through many computers starting from my laptop and gradually to more powerful, more dedicated servers.

Already before the summer of 2006, when I started my obligatory military service which lasted six months, I was using the wiki to translate MediaWiki into Finnish and fix i18n problems. In 2006 we started inviting other translators to join. In February 2007 I started translating FreeCol into Finnish and soon they moved all translation related activities into our wiki. One of the initial translators was Siebrand, who has had enormous influence on the direction the project has taken since he joined.

In other words translatewiki.net was a small hobby project for an entirely different purpose, then I used it to scratch a personal itch, and nowadays it is a thriving community with thousands of members. We are already huge in many metrics, we are still growing and there doesn’t seem to be any boundaries for our size. I just cannot imagine how many people the work of translatewiki.net has impacted. For me this means an opportunity, but more importantly a challenge. How do we improve our service while scaling up? How can we provide better tools for translators, for ourselves and for projects that use us? We have been successful thus far, because we have been very efficient – it is almost scary how few people (albeit very dedicated) can keep everything running smoothly.

Translatewiki.net has had and still does have huge impact to my life. It is just not because it is a huge time sink for me. It is a manifestation of the many skills I’ve learned during my life. It feels wrong to say that it is my hobby, because sometimes it feels that studying is the hobby here. Nevertheless my master thesis is nearing completion. I already have a job in mind and I can’t say that translatewiki.net didn’t affect that.

I’m sincerely grateful to each and everyone who has helped translatewiki.net to become what it is today.

Translatewiki.net is happy

Many of the issues that have been annoying us all in translatewiki.net have been fixed lately. To show my appreciation on behalf of translatewiki.net I’d like to highlight these fixes.

Issue one: saving messages in talk pages fails. If you just pressed “Save” once, you got an error message about broken session data. The reply was saved only if you clicked “Save” a second time. I don’t know how many messages we lost due to this. I lost a couple because after replying to a thread, I went to do some other things. Many of my replies were delayed, because I didn’t notice immediately that the save failed. What was worse, usually one would have to scroll down the page to even see the error message! I’m very happy that it is fixed now. Many thanks to Andrew Garrett!

Issue two: portions of changes were not shown at all when viewing differences between two versions. Not as annoying as the first item, this was still nasty and confusing us. I submitted a test case for this bug in wikidiff2 extension and fortunately Tim Starling was able to reproduce it. Soon after he committed a fix. Thanks Tim!

Issue three: message groups for projects which store all translations into single file (like Pywikipediabot) were stuck in “has changes” status. This bug only annoyed the project leaders of translatewiki.net. After some encouragement Robert Leverington came up with a fix and found a serious bug in code which determines if there has been any changes into the messages. The fix affects all message groups. To Robert: good catch and big thanks.

Issue four: Microsoft® Translator, one of the translation services we use to suggest translations for our translators next to Google Translate, Apertium and our own tmserver, is often incorrectly identified to be down. Brian Wolff and Sam Reed have helped to investigate the issue, but it is not yet fully fixed.

Finally many thanks to those who help us to keep translatewiki.net running from day to day, you are many. A special thanks goes out to netcup.de – Webhosting, vServer, Servermanagement who has provided us with their flagship product “vCloud 8000”, which allows us to serve our pages faster than ever before. We need lots of help with challenges that range from coding to writing and design. Don’t hesitate to ask us how you could help us!

Translation engines: black boxes

One would hope that using machine translation system would be as easy as giving text and pair of languages in and getting something out. But at least here in translatewiki.net things are pretty complex under the hood.

First of all these translation engines are external systems which are based on huge corpora of translated texts and statistical methods. Translations are queried trough HTTP requests. The Translate extension implements an algorithm which keeps tracks of failures and disables the whole service for some period. Failures can be error messages, time outs or even failures to establish a connection. For example on translatewiki.net recently moved to a new server which has a bit unstable DNS resolution which needs to be fixed.

Disabling serves multiple purposes. First of all if the service is temporarily down, we don’t waste our nor their time trying. Secondly, if we hit some kind of rate limit (we shouldn’t) we can back off for a while.

Then there is a issue with the contents–the engines like to mungle mangle mingle all things they don’t understand. In interface translation with many special characters and expressions this is annoying. I just recently made some improvements here based on a suggestion from Jeroen De Dauw. The most common special syntaxes are now armored against changes. This includes variables like $1, %s or %foo% and some other things. Line breaks disappear too, but that was already worked around earlier.

Chatty bots and minimizing disruptions in continuous integration

Those who use IRC are probably familiar with bots. Esstentially bot is a client which is a not human. This time I’m talking about specific kind of bots, let’s call them reporting bots. Their purpose is to alert the channel about recent happenings in (near) real time. Open source project channel usually at least have a bot that reports every new commit and bug report filed.

Also the translatewiki.net channel #mediawiki-i18n has reporting bots. We have one CIA bot reporting any i18n related commit to any of our supported projects. I have to mention that the ability to have own ruleset for picking and formatting commits is just awesome. There is also another bot, rakkaus (“love” in Finnish).

Its purpose is to report issues with the site. To accomplish this we pipe the output of error_log, which contains PHP warnings, database errors and MediaWiki exceptions, to the bot. It worked mostly fine, except that bot would flood everyone when the log was growing fast. Few days ago it went too far. We had a database error (a deadlock), which was reported by the bot… including the database query… which happened to contain few hundred kilobytes of serialized and compressed data–in other words binary garbage. Guess how happy we are were when we save channel full of that??

Okay, something had to be done. And so I did. I wrote a short PHP script which:

  • Reads new data every 10 second
  • Takes the last line, truncates it to suitable length and forwards only the snippet and notifies how many lines were skipped in the log

And now everything is nice again :) The script is not yet in SVN, but I will commit it later.

By the way, this bot is half of the reason why we might complain to you in few minutes after you committed code which breaks something in MediaWiki. Fortunately MediaWiki has taken steps to prevent committing code which doesn’t even compile, so we can skip some of the useless mistakes caused by carelessness.

Because we care about the users using translatewiki.net, we want to minimize any disruptions. The measures we have taken are:

  • Even though we update code often, we can rollback easily. With small updates it is easy to identify the cause and chances are it is fixed very fast too.
  • I personally am doing code review, trying to spot most issues before they reach us.

Yhteenveto Hack-A-Tonista

Ensimmäinen Hack-A-Ton oli 22.–24. lokakuuta 2010 Washington D.C:ssä. Hack-A-Ton on Wikimedia Foundation järjestämä tapahtuma, joka on suunnattu kaikille MediaWikistä kiinnostuneille kehittäjille. Hack-A-Tonien painopiste on enemmän koodaamisessa kuin esitelmissä ja keskustelussa, mutta jälkimmäisiäkin kyllä oli tällä kertaa. Tämä postaus on lähinnä kommentoiva kertomus matkasta, ja varsinaisesta tapahtumasta voi lukea Wikimedia Techblogin raporteissa ensimmäisen ja toisen päivän osalta.

Lähdin matkaan torstaina ja ensimmäinen lento nousi maasta joskus kahden aikoihin. Lentoyhtiöinä toimivat tällä kertaa Lufthansa ja United Airlines mennen tullen. Välipysähdystä ja vaihtoa varten koukattiin Frankfurt am Mainin kentälle. Siellä on outo käytäntö, että lennoille on aluksi määritelty vain siiven kirjain (A, B, C…), mutta ei varsinaista porttia. Ja yksi siipi ei tosiaankaan vastaa yhtä kerralla läpi kuljettavaa tilaa, vaan se voi esim. olla useassa eri kerroksessa, tai puolet siitä voi olla passintarkastuksen takana ja puolet ei. Varsinkin paluumatkalla jouduin odottelemaan yli tunnin, ennen kuin infotaulut rupesivat näyttämään lähtöporttia.

Kummallisuuksista huolimatta selvisin määränpäähäni Dullesin kansainväliselle kentälle ongelmitta ja ajallaan. Pääsimme johonkin terminaalin siipeen, josta yllättäen meidät kuljetettiin lentokenttä”bussilla” pääterminaaliin. Tämä bussi on noin neliönmuotoinen kaksikerroksinen koppero, jossa kuljettaja istuu jommassa kummassa päässä keskellä omassa kopperossaan. Varsin mielenkiintoinen kuljetusväline.

Tämän jälkeen olikin CBP, jossa sain jonottaa varmaan puolitoista tuntia, koska koko pariin koneen matkustajia oli aluksi vastaanottamassa vain kolme virkailijaa, joista yksi henkilökunnalle, yksi Yhdysvaltain kansalaisille ja yksi meille muille. Lopulta virkailijoita tuli enemmän ja jonoi alkoi edetä siedettävää tahtia. Itse tarkastus meni nopeasti ilman kysymyksiä, ja sormenjäljetkin oli otettu jo viime kerralla kun kävin San Franciscossa. Toisessa tarkastuspisteessa kyllä ihmettelivät ja kyselivät, miksei minulla ollut muita matkatavaroita kuin reppu.

Lopulta pääsin odottelemaan Metrobussia 5A, jolla pääsisin keskustaan kuudella dollarilla. Kello oli jo noin yksitoista kun pääsin perille L’Enfant Plazalle. Matkan aikana huomasi, että teitä valaistaan paljon vähemmän kuin täällä kotisuomessa. Alkuperäinen tarkoitus oli kävellä puistojen läpi vajaa viisi kilometria luoteeseen hotellille, mutta paikallisten opastamana päädyin kuitenkin metroon, joka lähti mukavasti bussin päätepysäkin läheltä. Pyysin metrovalvojalta apua lippuautomaatin käytössä, ja vajaalla kahdella dollarilla ostin lipun jolla pääsin Foggy-Bottom GWU (George Washington University) -asemalle sinistä linjaa pitkin. Omaa metroani odotellessa näin kuinka liikemieheltä varastettiin ilmeisesti minikannettava kädestä varkaan juostessa toiseen suuntaan menevän metron sulkeutuvien ovien läpi.

Metrosta poistuttuani harhailin pienen kiertolenkin kautta Melrose Place -hotelliin samalla katsellen pimeitä GWU-yliopiston rakennuksia, jotka jatkuivat monen korttelin ajan. Hain avainkortin vastaanotolta ja huoneen ovelleni päästyäni kuulin jo ennen oven avausta kovaäänistä kuorsausta. Sisällä oli translatewiki.netiä ylläpitävä hollantilainen ystäväni Siebrand, joka heräsi metelöintiini. Päätimme lähtiä etsimään myöhäistä ruokaa, kuten olimme aiemmin sopineet. Ainoa avoin paikka oli kebab-tyylinen mesta, josta tilasimme curry kanaa, papuja ja riisiä, joita oli valmiina ruokatiskillä. Syötyämme palasimme hotellille ja menimme suoraan nukkumaan – tosin omat yöuneni jäivät vähäisiksi aikaeron ja kuorsauksen takia.

Seuraavana aamuna haukkasimme kaikilta puolin tavallista hotelliaamupalaa hotellin ravintolassa. Sen jälkeen pikavisiitti paikallisella Starbucksissa tarkastmassa sähköpostit yms. ilmaisen langattoman verkon kautta. Sen jälkeen kävelimme Georgetownin MacStoreen, jossa ystäväni teki ostoksia. Kaikki näytti täysin erilaiselta päivänvalossa (eiliseen yöhön verraten), ja lukuisat viheralueet ja kasvit loivat tunnelmaa. Ostosten jälkeen Chad tuli meitä vastaan hotellille, mistä kävelimmeki takaisin MacStoren ohi hänen autolleen. Ajelimme ympäri kaupunkia katsellen nähtävyyksiä autosta, kunnes päädyimme syömään lounasta Skientologien kirkon vieressä. Lähettyvillä oli paljon suurlähetystöjä ja kuulemma maailman pisimmät rullaportaat Dupont Circlen metroasemalle, jotka kävimme tietysti kokeilemassa. Olivathan ne hieman pidemmät kuin kampin rullaportaat. Kävimme poimimassa Samin Dullesin kentältä pienen ajelun jälkeen, ja menimme kaikki varsinaiselle tapahtumapaikalle Embassy Suites -hotelliin. Se oli kolmion muotoinen ontto, mutta katettu. Käytävät kiersivät hotellin sisäseinää. Hain taas avainkortit ja varasin sängyn omasta huoneestani; uudelle huonetoverilleni jäi avattava sohva.

Varsinainen tapahtumapaikka oli noin 10m · 10m huone, jossa oli kuusi suurta pyöreää pöytää. Kunhan jatkojohdot oli haettu läheisesti kaupasta (hotelli olisi halunnut vuokrata niitä hintaan 15 dollaria /kpl/päivä), tapahtuma oli valmis alkamaan. Tälle päivälle ei ollu vielä varsinaista ohjelmaa, mutta kävimme illalla autoilla yhdessä syömässä ravintolassa. Itse söin blackened catfishiä, mitä se sitten onkaan suomeksi. Seuraavana aamuna (lauantai) tutustuimme hotellin aamupalaan, joka olikin jo aivan toista luokkaa kuin edellisessä hotellissa. Tarjolla oli perusjuttujen lisäksi munakasta, joka kokattiin tilauksen muokaan yhdeksällä vapaavalintaisella lisukkeella jonossa odotellessa – ja oli se kyllä hyvääkin.

Siirryimme vähitellen tapahtumahuoneeseen, jossa oli aina virvoitusjuomia ja pientä naposteltavaa sekä hotellin että vieraiden puolesta: Sam oli tuonut kassillisen suklaata ja muita makeisia Englannista. Pian saimme t-paidat, joista löytyy ryhmäkuva yllä linkitetyssä blogissa. Päivän aikana oli muutama esitys ja tutustuin osaan paikalla olevista ihmisistä, joista osan olin nähnyt jo San Franciscossa. Illalla lähdimme Hummer-limusiinillä taas kohti keskustaa syömään paikallisen Wikimedia-alajärjestön ihmisten kanssa, joilla oli kanssa ollut tapaaminen. Limusiinissä oli todella tunnelmaa, sillä musiikki pauhasi kovalla, valot vilkkuivat ja kuumakin alkoi tulla. Kun kaksi kolmannesta matkasta oli taitettu, joku äkkäsi kysyä kuskilta saako ilmastointia päälle. Ja saihan sen: kontrollit olivat auton takana, ja takimmaisena istuvat eivät olleet huomanneet niitä, vaan nauttivat iloisesti raikkaasta ilmasta, joka tuli takana olevien ovien avatuista ikkunoista. Ravintolassa haukkasin jonkilaista pastaa, ja hyvää oli sekin.

Osa meistä lähti ruuan jälkeen katsomaan nähtävyyksiä kävellen, ja osa palasi suoraan takaisin hotelliin. Oli jälleen jo pimeä, ja muutaman ryhmän hajoamisen jälkeen löysimme toisemme Washington-monumentin juurelta. Sitä ennen näimme pienen vilauksen valkoista taloa puiden takaa, mutta osa alueesta oli suljettu joten emme päässeet lähemmäksi. Kun jatkoimme matkaa Washington-monumentilta, taivaalla pörräsi helikopteri, jonka valokeila löysi hetkellisesti meidätkin. Hetkeä myöhemmin matalalla yllämme lensi kolme helikopteria kohti valkoista taloa – tiedä vaikka itse presidentti olisi ollut yhdessä niistä.

Pysähdyimme joen rannalle ihastelemaan Toisella rannalla olevaa Jeffersonin muistomerkkiä, jonka jälkeen jatkoimme kohti World War II -muistomerkkiä, jossa taas kadotimme osan ryhmästä, joka kyllä odotteli aivan muistomerkin ulkopuolella heidät löytäessämme. Kävelimme pitkin heijastavaa allasta kohti Lincolnin muistomerkkiä, jossa pysähdyimme hetkeksi ennen kuin jatkoimme Vietnamin veteraanien muistomerkin läpi kohti Foggy-Bottomin metroasemaa, josta jatkoimme West Fall Churcin asemalle, josta hotellin sukkulataksi poimi meidät.

Sunnuntaina ohjelma jatkui noin kello neljään, jonka jälkeen suurin osa ihmisistä oli jo lähtenyt. Pakkasimme loputkin ja ihmettelimme check-iniä lennoilleni, joista toiseen en saanut istumapaikkaa. Yksi tapahtuman järjestäjistä soitteli ja varmisti, että saan paikan kunhan olen tarpeeksi ajoissa tiskillä. Lähdin Samin kanssa taksilla puoli kahdeksalta kohti lentokenttää, jossa sain automaailta uuden lipun, jossa siinäkään ei ollut paikkaa. Turvatarkastuksen jälkeen tiemme erkanivat eri terminaaleihin, ja minäkin sain istumapaikallisen lipun oman lentoni lähtöportilta.

Matka kotiin oli jälleen pitkä, mutta yllätyksekseni sain epämääräisen ajan unta: nukahdin joskus ruuan jälkeen ja heräsin kun tarjoilivat välipalaa. Kokemuksena United on kyllä suuri pettymys, eikä pelkästään istumapaikkajutun takia. Lisäksi lentokoneiden sisutus oli suorastaan masentava, sen lattiassa irtonainen pala jota potkin pitkin poikin epähuomiossa, turvaohjeita piti selata jostain paperiläpyskästä, ja lämpötila vaihtelu suuresti lennon aikana, ja usein oli kylmä vaikka olisikin laittanut jaetun huovan päälle. Kuva pienissä näyttöruuduissa etummaisen istuimen selkänojassa oli vääristynyttä, jos toimi ollenkaan, ja stuertit ja lentoemännätkin vaikuttivat kylmemmiltä ja etäisemmiltä kuin KLM:n lennoilla, joilla muuten on myös parempi ruoka. Kotiin pääsin maantai-iltana ja yölento tuntuu olleen hyvä ratkaisu unirytmin kannalta. Kaiken kaikkiaan reissu oli tosi antoisa ja kaupunkiakin ehti nähdä vähän, vaikka siellä tietysti olisi vaikka kuinka paljon tekemistä museoista alkaen. Vähän oli jo puhetta tulevistakin tapahtumista ja matkoista, mutta niistä sitten myöhemmin…

The Translate extension for MediaWiki has documentation

The Translate extension for MediaWiki is no longer just a hack for translatewiki.net. Actually it hasn’t been that for a long time anymore, but recently other projects have started using it. That means lots of things, like supporting stable releases of MediaWiki, instead of just development versions.

Today’s topic is documentation. I have been amending our existing documentation with Siebrand. Previously there was only some documentation how to install the Translate extension. Now we have sections for the page translation feature, the configuration of the extension, message group configuration and command line scripts. All these have been collected into our documentation index page along with links to other resources. One of those other resources is code documentation generated with Doyxgen. That should really help anyone who is interested in developing for the Translate extension – yes, we are looking for help!

Naturally documentation is a moving target and it will be improved continuously, like the code itself. While we have documentation for developers and those who want to install and configure the Translate extension, we are still lacking great user documentation in many areas. Even though the saying goes that good software does not need separate documentation, that does not mean we shouldn’t have any. It is important to show everyone what can be done with the Translate extension and to get them either interested or have them use the software (more) efficiently as an end user.

GSoC wrap-up – Translate extension

GSoC is almost over now. Lots of cool things have happened, but unfortunately you may not be aware of it, because I have neglected to blog about it.  That is definitely a regression compared to last year and something to keep in mind in the future. I managed to do almost all tasks from the project plan with priority higher than 4, with some rough edges there and here. Next I will pick some highlights from the completed tasks.

Improved usability

This year there were many usability related issues to improve the translation work flow. The improvements done by Wikimedia Usability project nicely complements my work for the benefit our less technically oriented audience. Most important improvement is probably the buzzword compatible ajax-editing. No more do translators need to open new browser tab for each message they want to edit, but instead they get floating dialog inside the current page (implemented using jQuery dialog). This means they never need to leave the list of messages any more, but it stays always in the background. It also makes easier to do quick edits to message documentation or other languages, because you just get a new dialog, and once you finished editing it, you are back in the previous message.

Ajax edit interface

Ajax edit interface

Other features to include user preference to choose additional languages to show when translating. The feature itself is not new, but now users can customise the list of languages.

Languages can be selected from the dropdown and using the button or typing in the language codes directly.

Languages can be selected from the dropdown and using the button or typing in the language codes directly.

To date we not really taken advantage of achievements in language technology. Now we have taken the first steps towards it by implementing a simple translation memory. It is a very simple setup, where we use tmserver from Translate Toolkit and fill it from time to time with existing translations from translatewiki.net. Tmserver uses well known Levenshtein algorithm to give suggestions. It isn’t very good, nor anything compared to state of the art systems, but the suggestions have already been useful, as told us by the translators itself. There is many ways to improve the suggestions from better algorithms to using larger set of translations as source data and preprocessing the source data (text alignment, case and punctuation normalisation). I’m looking forward to them.

Other changes

There were many improvements to the lesser used features. Special features (magic names, special page alias, namespaces) can now be exported using a script. No more time wasted in copy-pasting. In addition it is now possible to localise magic words for extensions. It is up to translation teams to decide, whether they want to do this understandably controversial thing.

In message checks there were at times false positives which caused confusion among translators. Now there is flexible system to suppress those warnings.

Gettext-style plurals are now supported better, but no one of our Gettext projects is currently using those yet. Related, there is now a special page to import offline translations. We can now give trusted translators or users the permission to import offline translations, delegating them away from server admins. It supports download-from-url, files uploaded to the wiki and local file uploads.

The offline importer actually uses the same engine that I developed for another feature: web based message group management. It is now possible for project admins to import external changes, fuzzy other changes if necessary using their browser. It is much easier than doing those steps manually on the command line, but there is still some practical problems to solve. One major piece still missing is integration with version control systems, so command line access is still needed to do svn up or similar for other systems. It is somewhat related to the other problem, which is limited execution time for web requests. It is currently wise enough to check after every action if we are near the limit, and stop further processing and give the user ability to continue from that point. We can’t increase the execution time limitlessly, but there might be hope for example by doing multiple requests with ajax to spare the user from clicking continue button many times.

The future

There is always something to be done or something that can be improved. I will target on improving the new web interface and group management, which is still quite immature. Ajax-editing works, but is still missing the cool-factor without proper polishing. And like that isn’t enough, Siebrand has collected wish list for me. I will try my best to fulfil each request with my time which is limited especially now that study year starts again.

It will be interesting to see where we are next year. We are not alone any more and while other platforms are developing I want to keep translatewiki.net special – to give a face to internationalisation and localisation instead of being just a dumping ground for translations.