vendredi 4 décembre 2009

Une seule traduction vous manque, et tout est cassé

Problème

Comme expliqué précédemment, je passe une bonne partie de mon temps de travail à développer Okawix, un navigateur en mode non connecté. Le logiciel est codé avec le Framework Mozilla, donc avec XUL/Javascript, et utilise aussi le système de traduction du Framework, enfin... les systèmes : des DTD pour la partie XUL et des fichiers properties pour Javascript.
Ces deux systèmes ont l'avantage d'être cohérents (genre, des DTD pour du XML, c'est la sauce, quoi), mais à l'usage présentent rapidement un inconvénient : toutes les chaînes doivent être traduites. Si une traduction manque dans un .properties, une exception sera levée à l'exécution ; bon là, c'est pas si grave, une exception ça peut encore se gérer. Si une traduction manque dans une DTD, les fichiers XUL utilisant cette traduction ne peuvent plus être affiché ; hu... là, ça peut faire mal.
J'ai donc pris rapidement l'habitude de traduire toutes les nouvelles chaînes en anglais et en français, les deux seules langues proposées par Okawix... avant. En effet, les traductions d'Okawix sont dorénavant gérées par le projet translatewiki.net (TWN), ce qui veut dire plein de traductions, dont certaines ne sont pas complètes ; ce qui veut aussi dire mise à jour de notre SVN automatiquement depuis TWN. De plus, Okawix créé automatiquement une liste des langues disponibles ; et pour finir, une fois une langue incomplète choisie il devient difficile de relancer le logiciel sans manipuler à la main la configuration du logiciel. Ouch...
Il fallait donc trouver une solution et après avoir demandé en vain à Google, j'en suis arrivé à la conclusion qu'il fallait que je trouve cette solution tout seul :)

Solution

L'idée est d'avoir une traduction "par défaut", qui est toujours complète et qu'on va utiliser pour combler les manques dans les autres traductions ; dans Okawix, la traduction par défaut est l'anglais.
On commence par déclarer un "content provider" pour la traduction par défaut dans le manifest de l'application, dans le cas d'Okawix, ça donne :
content defaultlocale locale/en-US/interfacewiki/
qui déclare donc un "content provider" nommé "defaultlocale" et qui pointe vers la traduction anglaise (au passage, promis, un de ces jours, je vire tous ces "interfacewiki" qui trainent un peu partout dans Okawix).
Pour la partie DTD, il faut alors charger la DTD de la traduction par défaut en dernier, dans Okawix ça ressemble à ça :
<!DOCTYPE window [
<!--ENTITY % wikiDTD SYSTEM "chrome://interfacewiki/locale/okawix.dtd"-->
<!--ENTITY % defaultDTD SYSTEM "chrome://defaultlocale/content/okawix.dtd"-->
%wikiDTD;
%defaultDTD;
]>
L'idée est que une entité ne peut déclarée qu'une seule fois, celles qui sont déclarées dans la traduction en cours sont chargées en premier et celles de la traduction par défaut ne font que "combler les trous".

On applique le même principe, ou presque, pour les fichiers properties :
<stringbundleset id="wk-strings-set">
<stringbundle src="chrome://interfacewiki/locale/okawix.properties"/>
<stringbundle src="chrome://defaultlocale/content/okawix.properties"/>
</stringbundleset>
On charge d'abord la traduction en cours, puis on "comble les trous", tout pareil, quoi... sauf que dans le cas du javascript, tout n'est pas terminé : il nous faut une fonction pour récupérer la traduction dans le stringbundleset. Ce qui donne a peu près ça :
my_translate_function = function( aBundleset, aString ) {
for( var i = 0 ; i < aBundleset.childNodes.length ; i++ ) {
var bundle = aBundleset.childNodes[ i ];
try {
return bundle.getString( aString );
}
catch( someerror ) {
}
}
return aString;
}
La fonction parcourt l'ensemble des stringbundle et appelle leur fonction getString, si la traduction existe elle est renvoyée, sinon une exception est levée, on l'attrape et on continue. Si la traduction n'existe nul part, on renvoie la chaîne d'origine.

Voila... je ne sais pas exactement ce que les puristes penseront de ce genre de méthode, mais au moins avec ça Okawix est capable de survivre à des traductions partielles :)

vendredi 27 novembre 2009

Ein verrücktes Wochenende

Two weeks ago, I made up my mind about publishing a new post on every Friday, but... I just failed at doing so last week :) but there's some good reason: I have been busy with two events : the openZIM developers meeting and my mother's 70 birthday.
My journey began on Friday morning at 10:30 when my boss and I took train to Paris, then from Paris to Basel and finally from Basel to Schopfeim where we reach our goal around 19:00. We spent the evening and part of the night eating spätzle and drinking Weißbier while chatting in English, French and German. Well, I didn't talked so much in German as my skills in this domain are limited to "Danke", finding exact spelling of words on Wikipedia and using Google to translate a blog post title.
On Saturday morning, we joined the openZIM work-group up to 11:30 when it was time for us to head back to France. I got home at 20:00 when the second part of my week end began.
De retour chez moi donc, le temps de me rafraichir, de passer une tenue adéquate et de faire la route, j'arrive chez mes parents à 20:45 où je passe la soirée à bien manger (enfin, pas tant que ça, les voyages ça ouvre pas forcément l'appétit) et à bien boire (calva FTW !) ; je pouvais me permettre, je dormais sur place.
Enfin voila, pour résumer c'était un week-end bien rempli, j'ai pas eu le temps de faire un billet :p

dimanche 15 novembre 2009

Télé Miksha

Le Métal n'est pas un style musical connu pour son humour délirant. Peut être que les appels à la destruction de l'univers par Satan, Chtulhu ou encore Pazuzu donnent une impression austère ; impression sûrement amplifiée par les noms rafraîchissants dont s'affublent certains spécimens tels que Necrophagist, Monstrosity, Vomitory, j'en passe et des meilleurs.

Pourtant, quelques groupes ont fait du décalage et de l'humour leur fond de commerce, comme Primus, Bumblefoot ou encore, dans un style complètement différent, Gronibard. Il arrive aussi plus rarement que des groupes « sérieux » se mettent à péter les fusibles. Par exemple, je suis tombé la dessus :



j'ai trouvé ça très bon ; surtout que pour avoir passé quelques soirées nuits à regarder des chaînes de télé-achat, je dois avouer que la parodie est plutôt bien réalisée (surtout l'épisode du lit).

Bon, à coté de ça, je ne suis pas sur d'être fan de la musique de Miksha ; mais bon, devant un tel effort je pense que je vais au moins tenter d'écouter :)

vendredi 13 novembre 2009

Twelve-step playlist

J'ai toujours détesté les compilations, les Best Of et dans une certaine mesure les albums Live aussi. Dans mon esprit, un album est un ensemble de chansons formant un tout cohérent ; vouloir les séparer pour les mélanger à d'autres morceaux n'a en fait qu'un seul sens : fournir du pré-maché à ceux ne voulant pas s'investir dans la découverte d'un style musical ou d'un groupe et répondre à la question "quel morceau écouter ?".

Bien entendu, j'avais exactement le même point de vue concernant les playlist ; et puis, en écoutant le dernier Dream Theater et plus particulièrement The Shattered Fortress, je me suis dit qu'en fait, les playlist pouvaient peut être avoir une utilité.

The Shattered Fortress est le dernier morceau d'une suite de cinq titres apparaissant sur les cinq derniers albums de Dream Theater. Le thème de la suite est la dépendance à l'alcool du batteur Mike Portnoy et les morceaux sont découpés en douze mouvements, chacun représentant l'une des étapes du programme des Alcooliques Anonymes. Vous pouvez trouver plus de détails sur la Twelve-step suite sur Wikipédia (en anglais, je vous déconseille l'article français...).

Du coup, je me disais que ça serait cool de pouvoir écouter les morceaux les uns à la suite des autres et... c'est exactement à ça que sert une playlist. Plus qu'à vérifier que Jiwa fournit bien tous les titres nécessaires. Oui. Bon ok, c'est parti !

La fameuse playlist est accessible ici : http://www.jiwa.fr/#playlist/469535 ; je viens de l'écouter, elle est plutôt cool... bon certes, il faut aimer les morceaux de plus de dix minutes et la musique pour les musiciens :)

Maintenant il ne me reste plus qu'à trouver d'autres utilisations amusantes des playlists.

vendredi 6 novembre 2009

Deezer c'est la meezer, jiwa voir ailleurs

Il fut un temps ou, pour pouvoir écouter de la musique, il fallait acheter des disques ; l'avènement d'Internet a changé la donne avec l'ouverture de plusieurs sites permettant d'écouter gratuitement de la musique, soit des albums entiers, soit des radios thématiques ou encore des « smart radio » qui sont plus ou moins sensées se régler sur les goûts de l'utilisateur.

Je suis venu à utiliser ce genre de services à cause de mon iPod : je cherchais une application pour écouter une « radio » Metal, de préférence des choses que je connaissais pas et si possible des choses que j'aurais bien aimé. À l'époque, j'ai testé les applications de Deezer puis de Last.fm et le second atomise clairement le premier, tant au niveau de l'adaptation aux goûts de l'utilisateur que de la variété des morceaux. J'ai alors connu une période de bonheur éphémère jusqu'au jour ou Last.fm a décidé qu'il faudrait maintenant payer... retour à Deezer.

Un des seuls (le seul, peut être) avantages de Deezer sur Last.fm est qu'il permet d'écouter des albums entier en utilisant l'interface Web. J'ai alors commencé une autre utilisation de ce type de site : écouter des albums sur mon ordinateur grâce à l'application flash (urk). S'en est suivi une deuxième période de stabilité ; j'utilisais de temps en temps les radios de Deezer malgré leurs défauts : les « smart radio » me ramènent invariablement aux mêmes groupes, même morceaux, entrecoupé de morceaux de publicité n'ayant rien à voir avec la choucroute ; les web radios diffusent toujours les mêmes morceaux avec une sélection... heu... disons qu'il faudrait leur expliquer que non, Alice Cooper ne fait pas de Metal ; mais au moins, j'ai accès aux albums complets sur le site... ou pas.

Il semblerait que les albums aient tendances à « disparaître » sur Deezer, sans prévenir en plus ; la sélection d'albums que j'avais commencé à construire existe toujours, mais certains ne pointent plus vers rien... super... Je me suis alors tourné vers un troisième service : Jiwa, qui comme Deezer, fournit l'accès aux albums complets. Le catalogue semble aussi plus fournit (au moins, en ce qui concerne le Metal) et, pour l'instant, les albums ont l'air de rester fidèles à leur poste dans ma sélection :) Par contre, au niveau radio, c'est le désert total : pas d'application iPod et si les radios de Deezer sont mauvaises, celles de Jiwa sont pathétiques ; les deux seules radios Metal sont "Hardcore / Metal" qui ne diffuse en fait que du Hardcore, aucun intêret donc, et Metal Symphonique, qui semble dédié aux groupes inconnus de Power Metal chanté par des nanas. Je passe.

Donc voila, en ce moment j'utilise Jiwa pour écouter des albums sur mon ordi et j'en suis assez content ; je continue d'utiliser les radios de Deezer pour l'iPod, faute de mieux. Peut être qu'un jour, je serais assez riche pour dépenser les 3 euros / mois d'abonnement à Last.fm :)

mercredi 21 octobre 2009

Grosse Fatigue

Les lecteurs attentifs l'auront noté : ce blog, après l'effervescence des débuts, est retombé dans une léthargie profonde ; mais ce n'est que la partie visible de l'iceberg. Depuis un mois environ, j'ai eu une phase à vide, ou je n'avais plus aucun courage pour maintenir quoi que ce soit ; ce qui s'est plus ou moins ressenti sur mes projets personnels. Mais bon, je ne m'excuserais pas plus longtemps pour le manque de billets, je ne voudrais pas passer pour l'homme le plus ennuyeux du monde ;)

Récemment, j'ai repris une activité timide, notamment sur DeSmuME et Yabause (enfin, sur mini18n, en fait), mais surtout sur respire (ma bibliothèque de manipulation de fichiers resources) qui devrait bientôt être assez développée pour réécrire le fichier resource de Yabause à l'identique. Et oui ! Incroyable ! Elle sera capable de faire rien, ce qu'on appelle un point fixe en mathématiques :) Mais heu... bon... ensuite, je pourrais ajouter des trucs super intéressants dedans :p

Pour finir, un peu de musique avec un truc sur lequel je bloque depuis un moment déja : L'hymne à la joie de The CNK ; c'est très très bon et en plus, c'est français, unbelibubble, non ?

lundi 21 septembre 2009

Trad' en trois actes

ACTE I : innocence

Il y a quelques temps, suite à une idée de Romanito, je m'étais lancé dans l'écriture d'une extension MediaWiki pour gérer des traductions. Le principe était simple, les chaînes à traduire et les traductions étaient stockées dans des pages wiki, l'extension ne fournissant qu'une manière simplifiée d'éditer les pages. Les traductions pouvaient ensuite être récupérée par un script Python pour être incluse dans le logiciel à traduire. Le système était simpl(ist)e, fonctionnel et je l'ai d'ailleurs mis en production et testé sur le wiki de Yabause.

Cette partie de l'histoire s'achève là, ou presque... je me suis ensuite rendu compte que pour pouvoir traduire le port Windows de Yabause, il me faudrait des outils qui n'existaient pas encore et je me suis alors lancé dans leur développement. Et je n'ai pas fini.

ACTE II : révélation

Une bonne partie de mon temps de travail est consacrée au développement d'Okawix, un navigateur hors-ligne pour les contenus de Wikipédia. Un des points fort du logiciel est qu'il permet de récupérer facilement le contenu de tous les wikis géré par la fondation (oui, même Wikipédia en normand, dé diou). Pour faire bonne mesure, il fallait pouvoir proposer aux utilisateurs une traduction de l'interface dans un maximum de langues.

Tout ceci nous a amené à découvrir un projet absolument fabuleux: translatewiki.net (TWN). En gros, l'idée est la même : amener des gens à traduire en passant par une extension de MediaWiki ; par contre, le projet est beaucoup plus avancé : l'extension est stable, gère plusieurs projets, plusieurs formats de fichier et les contributeurs sont nombreux.

Après avoir fourni un patch pour le support des DTD, Okawix est venu s'ajouter à la liste des projets gérés par TWN. Et la, je dois dire que j'ai été impressioné par la vitesse à laquelle le logiciel a été traduit dans des langues plus ou moins exotiques. De plus, TWN est configuré pour accéder directement à notre dépôt : en lecture, pour récupérer les nouvelles chaînes à traduire, et en écriture, pour nous envoyer les traductions. Un vrai bonheur.

ACTE III : tentation

Avec d'un coté un mini-projet que je suis seul à (ne pas) maintenir et de l'autre un projet maintenu, actif, en évolution et qui a réuni autour de lui une communauté de traducteurs, je pense que le choix va être rapidement fait :)

Bien sur, tout n'est pas encore prêt à fonctionner et le ne le sera pas demain : il faut déja postuler sur TWN et être accepté ; mais même avant cela, il faut terminer la bibliothèque Respire pour que le port Windows soit complétement traductible, écrire un patch pour TWN pour gérer le fichiers de traduction de mini18n et surement d'autres détails à régler.

Bref... encore pas mal de choses à faire en perspective, mais l'idée d'avoir un système de traduction fonctionnant de manière autonome est séduisante, très séduisante et mérite surement le détour.

samedi 19 septembre 2009

Headbang like a Pirate!

Ohé, matelos!

Aujourd'hui c'est la journée internationale du parler pirate et à cette occasion, je vous propose de vous mettre au True Scottish Pirate Metal, à savoir Alestorm!



Bonne écoute et si vous en voulez plus, vous pouvez aller faire un tour sur deezer

vendredi 18 septembre 2009

Quand Yabause rencontre Haiku

Il y a quelques jours (le 14 septembre, pour être précis) le projet Haiku sortait une version alpha de son système d'exploitation. Il m'était arrivé de tester cet OS par le passé, mais sans jamais réussir à en faire grand chose, cette version alpha semblait le bon moment de refaire un essai ; hop, c'est parti, j'installe le truc dans Qemu.

Ma première impression est qu'ils ont du demander à Biff de passer du polish et deux couches plutot qu'une, il se dégage du truc une impression de finition assez agréable. Une fois l'impression passée, je me suis demandé ce que je pourrais tester... bon ok, je lance le navigateur, je poste un truc sur identi.ca, ok ok, ça fonctionne. C'est bien tout ça, mais est ce qu'on peut vraiment utiliser ce truc ? genre développer ? ah mais oui... essayons de compiler Yabause ! :)

Et la, deuxième surprise, tout se passe à merveille, tout ce dont j'ai besoin pour compiler est installé par défaut : subversion, les autotools, gcc, etc. Pire encore, la compilation passe du premier coup et génère le moteur d'émulation ; bon bien sur, il n'y a pas d'interface pour tester et il manque deux, trois bricoles comme le son, par exemple. Mais OpenGL est bien detecté et toute la partie graphique devrait donc être fonctionnelle.

Au final, j'arrive à deux conclusions : le système de compilation de Yabause est assez intelligent pour se débrouiller sur un système inconnu ; comme quoi, les autotools c'est pas si mal. D'un autre coté, Haiku est assez avancé pour pouvoir compiler un Yabause fonctionnel et je pense que quelqu'un de courageux pourrait créer facilement un port Haiku de Yabause.

Messieurs les courageux, c'est donc à vous de jouer ! :p (au passage, si vous avez un copain courageux qui s'ennuie, j'ai une version Mac qui prend la poussière...)

mercredi 16 septembre 2009

Sous-culture

Suite à mon précédent billet, jugé trop hermétique par certains d'entre vous, j'ai décidé de changer un peu de sujet et de vous parler de ce que je lis et écoute en ce moment. Ok, ça ne vous intéresse surement pas, mais c'est pas grave ; de nos jours tout le monde raconte sa vie dans un blog, ou dans facebook, ou twitter, alors je m'y met aussi. :)

Coté lecture, j'arrive à la fin du premier cycle de l'assassin royal et j'aime toujours beaucoup.
Petit rappel pour ceux qui n'ont pas suivi et qui n'ont pas non plus envie de lire l'article Wikipédia : le cycle de l'assassin royal est le nom français d'une série de trois trilogies écrites par Robin Hobb : The Farseer Trilogy, The Liveship Traders, et The Tawny Man. En français, c'est le bazar, la première et la dernière trilogie sont réunies en tant que cycle de l'assassin royal et celle du milieu devient les aventuries de la mer. Ouch...
Comme souvent, je n'ai pas fait les choses dans l'ordre et j'avais commencé par lire les aventuriers de la mer et contrairement à beaucoup de monde, je crois que je continue de préférer ce cycle à celui de Fitz et de ses copains. Reste que si vous aimez un tant soit peu le medfan, ça risque fortement de vous plaire.

Pour ce qui est de la musique, mon dernier gros coup de cœur a été pour le deuxième album de Cynic (au passage, vous remarquerez que je suis l'auteur de la première version de l'article, bon... ya eu deux ou trois informations d'ajouté depuis, mais l'esprit reste là) : Traced in Air. Ma première impression sur l'album a été assez mauvaise et il m'a fallu quelques écoutes avant de « rentrer dedans », maintenant que j'y suis, j'y reste et je ne saurais que vous conseiller de tenter l'aventure. Ma chanson préférée sur l'album est Adam's Murmur ; vous pouvez l'écouter, elle et les autres, sur deezer.
Je me suis aussi étonné à apprécier le dernier album d'Opeth : Watershed. Avec un peu de concentration, il est même possible de l'écouter en entier sans s'endormir. Vous pouvez aussi l'écouter sur deezer ; pour les décideurs pressés, je conseillerais Porcelain Heart, mais bon l'album a l'avantage d'être assez varié dans le styles des compositions ; fait assez rare en Metal pour être noté.
Dans un style qui n'a absolument rien à voir, on nous a récemment offert un album de Rodrigo y Gabriella, deux ex-guitaristes de Metal reconvertis dans le flamenco. Alors, bien sur, il faut être prêt à écouter un album joué intégralement à la guitare séche, mais une fois franchi ce cap c'est très bon. En plus, ils reprennent Orion de Metallica qui est surement parmi mes titres favoris du groupe. Pour le coup, deezer n'a pas l'album en stock, mais j'imagine que vous pouvez vous faire une idée en écoutant d'autres trucs de Rodrigo y Gabriella.

Au début, je comptais vous parler un peu de Folk Metal aussi, mais bon... on verra ça plus tard.

lundi 14 septembre 2009

Début de la fin

Après avoir longtemps attendu que ma partie développeur arrive à pondre un moteur de blog assez fonctionnel pour pouvoir poster un billet, ma partie utilisateur en a eu marre et a créé un compte sur blogger ; au final, tout le monde est content, je peux poster facilement des trucs et j'ai du temps pour coder d'autres trucs.

"Quels autres trucs ?" me diraient vous... hé bien, principalement respire, qui devrait au final être une bibliothèque pour gérer des fichiers resources windows. L'idée au final étant de coupler respire et mini18n pour permettre de traduire les interfaces des différents ports de Yabause (et surement de DeSmuME aussi) en n'ayant à maintenir qu'une seule traduction par langue ; et non pas, une traduction pour la version Gtk+, une pour la version Windows, etc.

Au début, je comptais gérer ça avec un simple grep, mais dans un fichier resource les tailles des éléments sont en dur, il faut donc redimenssioner les éléments que l'on vient de traduire, et ceux qui les contiennent aussi, hu... donc voila, je me suis lancé dans un compilateur de fichiers resources et histoire de rendre le sport intéressant, je suis parti from scratch, en C pur, mode guerrier assoifé de sang.

De la à ce que mon coté utilisateur s'impatiente et demande un truc vite fait avec lex et yacc...