<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>La Case de l&#039;Oncle Tom &#187; i18n</title>
	<atom:link href="http://case.oncle-tom.net/tag/i18n/feed/" rel="self" type="application/rss+xml" />
	<link>http://case.oncle-tom.net</link>
	<description>DÃ©veloppement Web, bonnes pratiques et performances</description>
	<lastBuildDate>Sun, 25 Dec 2011 19:33:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="search"
           href="http://case.oncle-tom.net/opensearch"
           type="application/opensearchdescription+xml"
           title="Content Search" />		<item>
		<title>WordPress en tant que dÃ©pendance SVN</title>
		<link>http://case.oncle-tom.net/2008/wordpress-svn-external/</link>
		<comments>http://case.oncle-tom.net/2008/wordpress-svn-external/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 06:00:59 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[bonne pratique]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[codex]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[wordpress mu]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1237</guid>
		<description><![CDATA[Mettre Ã  jour WordPress Ã©tait pÃ©nible jusqu&#8217;Ã  l&#8217;arrivÃ©e de la version 2.7. On bÃ©nÃ©ficie dÃ©sormais de la mise Ã  jour automatique : un clic, Ã§a tÃ©lÃ©charge et Ã§a dÃ©ploie. Il existe cependant une mÃ©thode alternative reposant sur Subversion (SVN). C&#8217;est la mÃ©thode idÃ©ale pour tout dÃ©veloppeur WordPress ou gestionnaire de blogs. C&#8217;est celle que j&#8217;emploie [...]]]></description>
			<content:encoded><![CDATA[<p>Mettre Ã  jour WordPress Ã©tait pÃ©nible jusqu&#8217;Ã  l&#8217;arrivÃ©e de la version 2.7. On bÃ©nÃ©ficie dÃ©sormais de la mise Ã  jour automatique : un clic, Ã§a tÃ©lÃ©charge et Ã§a dÃ©ploie.</p>
<p><img class="aligncenter size-full wp-image-912" title="Logo WordPress" src="http://case.oncle-tom.net/images/2008/05/wordpress-logo.png" alt="" width="273" height="66" /></p>
<p>Il existe cependant une <strong>mÃ©thode alternative reposant sur Subversion</strong> (<acronym title="Subversion">SVN</acronym>). C&#8217;est la mÃ©thode idÃ©ale pour tout dÃ©veloppeur WordPress ou gestionnaire de blogs. C&#8217;est celle que j&#8217;emploie depuis la version 2.6 grÃ¢ce notamment Ã  la constante WP_CONTENT.</p>
<p>Explications et application concrÃ¨te.</p>
<p><span id="more-1237"></span></p>
<p>Avant toute chose, sachez que <strong>ce tutorial est optimisÃ© pour les personnes qui versionnent entiÃ¨rement leur projet</strong>. Il n&#8217;est pas question ici d&#8217;avoir une arborescence libre et de procÃ©der Ã  des <em>checkout</em> un peu partout. C&#8217;est possible mais pas du plus grand intÃ©rÃªt.</p>
<p>L&#8217;avantage Ã©vident ici est de pouvoir dÃ©ployer son blog n&#8217;importe oÃ¹ en un rien de temps.</p>
<h3>Structure des fichiers</h3>
<p>Installer WordPress en tant que dÃ©pendance <acronym title="Subversion">SVN</acronym> revient Ã  mÃ©langer 2 techniques :</p>
<ul>
<li><a href="http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory">Installer WordPress dans son propre rÃ©pertoire<br />
</a></li>
<li><a href="http://codex.wordpress.org/Installing_WordPress_With_Clean_Subversion_Repositories">Installer WordPress proprement depuis <acronym title="Subversion">SVN</acronym></a></li>
</ul>
<p>Je suis pÃ©nible donc je n&#8217;ai pas spÃ©cialement envie de modifier un fichier <em>core</em> ou autre chose que <em>wp-config.php</em>. Tout le contraire de ce qu&#8217;indique la premiÃ¨re mÃ©thode.</p>
<p>La seconde explication m&#8217;a toutefois posÃ© lÃ©gÃ¨rement problÃ¨me puisqu&#8217;un peu brutale et posant soucis chez OVH.</p>
<img class="size-full wp-image-1254" title="Arborescence fichier avec WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-basic-filetree.png" alt="Arborescence fichier avec WordPress SVN" width="329" height="298" />
<p>Celles et ceux qui voient la capture d&#8217;Ã©cran ci-dessus peuvent constater que <em>tout WordPress</em> a Ã©tÃ© dÃ©placÃ© dans un sous-rÃ©pertoire <em>wordpress</em> au mÃªme niveau que wp-content.<br />
On ne garde Ã  la racine que le fichier <em>.htaccess</em> et <em>wp-config.php</em>.</p>
<p>Sur le rÃ©pertoire racine, j&#8217;ai appliquÃ© ces propriÃ©tÃ©s pour WordPress 2.7 :</p>
<ul>
<li><kbd>svn:ignore</kbd> :<kbd><br />
</kbd></p>
<pre><code class="svn">wp-config.php</code></pre>
</li>
<li><kbd>svn:externals</kbd> :<kbd><br />
</kbd></p>
<pre><code class="svn">wordpress http://svn.automattic.com/wordpress/branches/2.7</code></pre>
</li>
</ul>
<p>Je ne versionne volontairement pas le fichier wp-config.php car c&#8217;est le seul fichier susceptible de changer d&#8217;une instance Ã  une autre. Je le rÃ©cupÃ¨re depuis wordpress/wp-config-sample.php et je le personnalise selon mes besoins.<br />
Et puis versionner des mots de passe &#8230; qui y tient ?</p>
<h3>Configuration</h3>
<p>AprÃ¨s cette restructuration, on aura toutefois besoin de configurer 2-3 bricoles. Vraiment rien de mÃ©chant promis.</p>
<h4>Le .htaccess</h4>
<p>Voici ma configuration. Elle peut Ãªtre aisÃ©ment dÃ©portÃ©e dans votre dÃ©claration de <em>Virtual Host</em> pour des raisons de performance. Sur un serveur mutualisÃ© vous n&#8217;avez en gÃ©nÃ©ral pas accÃ¨s Ã  ce dernier type de configuration.</p>
<pre><code>&lt;IfModule mod_rewrite.c&gt;
Options -Multiviews -Indexes +FollowSymlinks
RewriteEngine On
RewriteBase /
# Moving to dependency
RewriteRule ^(index.php|wp-[a-z0-9-]+\.php|xmlrpc.php)?$ wordpress/$1 [L]
RewriteRule ^(wp-admin|wp-includes)/(.*)$ wordpress/$1/$2 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . wordpress/index.php [L]
&lt;/IfModule&gt;
# BEGIN WordPress
# END WordPress</code></pre>
<p>Ce fichier est trÃ¨s inspirÃ© de la <a href="http://codex.wordpress.org/Installing_WordPress_With_Clean_Subversion_Repositories">configuration <acronym title="Subversion">SVN</acronym> proposÃ©e sur le Codex WordPress</a>. Seulement voilÃ , cette renvoie tout sur <em>index.php</em> &#8230; et omet ainsi tous les accÃ¨s aux fichiers situÃ©s Ã  la racine, avec entre autre :</p>
<ul>
<li>wp-cron.php</li>
<li>wp-link-opml.php</li>
<li>wp-trackback.php</li>
<li>xmlrpc.php</li>
</ul>
<p>Je vous fais grÃ¢ce des contrÃ´leurs de flux (Atom, <acronym title="Really Simple Syndication">RSS</acronym> &amp; cie) et des appels en directs Ã  <em>index.php</em> effectuÃ©s par certains plugins.</p>
<p>Donc non on ne peut pas vraiment se passer de ces fichiers. D&#8217;oÃ¹ ces 2 rÃ¨gles :</p>
<ul>
<li>
<pre><code>RewriteRule ^(index.php|wp-[a-z0-9-]+\.php|xmlrpc.php)?$ wordpress/$1 [L]
</code></pre>
<p>On capte tous les fichiers <acronym title="Pre-Hypertext Processing">PHP</acronym> (les contrÃ´leurs) originellement situÃ©s Ã  la racine de WordPress.</li>
<li>
<pre><code>RewriteRule ^(wp-admin|wp-includes)/(.*)$ wordpress/$1/$2 [QSA,L]</code></pre>
<p>Et lÃ  c&#8217;est pour le confort de conserver les adresses initiales &#8230; mais aussi pour Ã©viter de modifier un bout de paramÃ©trage dans l&#8217;admin. Le jour oÃ¹ vous dÃ©cidez de rebasculer Ã  l&#8217;ancien systÃ¨me, Ã§a se fera sans douleur <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<p>Enfin, pourquoi avoir poussÃ© les commentaires WordPress vers le bas ? Tout simplement pour <strong>Ã©viter que nos rÃ¨gles personnalisÃ©es soient Ã©crasÃ©es par WordPress</strong> lors d&#8217;une mise Ã  jour des permaliens. Nos rÃ¨gles primeront toujours ainsi.</p>
<h4>Le fichier wp-config.php</h4>
<p>Dans le fichier <em>wp-config.php</em>, nous n&#8217;allons rien modifier. Nous allons juste ajouter forcer 2 paramÃ¨tres. Ils indiqueront Ã  WordPress oÃ¹ se trouve le vÃ©ritable rÃ©pertoire <em>wp-content</em> (renommable mais je ne jouerai pas avec).</p>
<img class="size-full wp-image-1262" title="wp-config.php modifiÃ© pour WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-wpconfig.png" alt="wp-config.php modifiÃ© pour WordPress SVN" width="600" height="266" />
<h4>Le blog</h4>
<p>Bon j&#8217;ai menti un peu toute Ã  l&#8217;heure en indiquant qu&#8217;on ne toucherait qu&#8217;Ã  <em>wp-config.php</em>. Cependant la modification est on ne peut plus mineure et ne concerne que l&#8217;upload de medias.</p>
<p>En effet si on ne touche pas Ã  l&#8217;emplacement des fichiers envoyÃ©s, WordPress considÃ¨re qu&#8217;ils sont uploadÃ©s dans wordpress/wp-content/uploads. C&#8217;est fort gÃªnant mais heureusement, en prÃ©fixant le chemin par ../ ou en tapant un chemin absolu tout rentrera dans l&#8217;ordre.</p>
<img class="size-full wp-image-1261" title="Correction de chemin pour WordPress SVN" src="http://case.oncle-tom.net/images/2008/12/wordpress-svn-file-uploads-fix.png" alt="Correction de chemin pour WordPress SVN" width="600" height="74" />
<p>Ã€ noter qu&#8217;il s&#8217;agit du <strong>seul paramÃ©trage hors d&#8217;un fichier</strong>. Si j&#8217;avais pu m&#8217;en passer je l&#8217;aurais fait.</p>
<h3>DÃ©pendance <acronym title="Subversion">SVN</acronym> pour la traduction</h3>
<p>C&#8217;est en tombant sur un autre <a href="http://sunfox.org/blog/2007/05/28/installation-svn-de-wordpress-et-de-ses-plugins/">article traitant de svn:externals pour WordPress</a> que j&#8217;ai Ã©tÃ© interpelÃ© sur la prise en charge des langues via <acronym title="Subversion">SVN</acronym> Ã©galement.<br />
Le systÃ¨me n&#8217;est pas parfait puisqu&#8217;on ne peut gÃ©rer qu&#8217;une seule langue par ce biais lÃ . Ã‡a ne conviendra donc pas aux blogs multilingues.</p>
<img class="size-full wp-image-1260" title="DÃ©pendance SVN pour les traductions WordPress" src="http://case.oncle-tom.net/images/2008/12/wordpress-i18n-svn-external.png" alt="DÃ©pendance SVN pour les traductions WordPress" width="550" height="104" />
<p>La technique consiste Ã  transformer <code>wp-content/languages</code> en <kbd>svn:externals</kbd>.<br />
Ã‡a donnerait ceci pour la version franÃ§aise de WordPress 2.7, au niveau du <kbd>svn:externals</kbd> du rÃ©pertoire <code>wp-content</code> :</p>
<pre><code class="svn">languages http://svn.automattic.com/wordpress-<acronym title="internationalisation">i18n</acronym>/fr_FR/branches/2.7/messages/</code></pre>
<p><strong>Simple et efficace</strong> mais Ã§a reste encore de la bricole.</p>
<h3>Cas particulier : plugins et <acronym title="internationalisation">i18n</acronym></h3>
<p>Je vous expose le problÃ¨me mais malheureusement vous ne pourrez pas y faire grand chose. Par contre ami dÃ©veloppeurs, pour rendre votre code de plugin 100% portable, merci de prendre note <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Le chargement des traductions s&#8217;effectue Ã  l&#8217;aide de la fonction load_plugin_textdomain(). Elle prenait seulement 2 paramÃ¨tres jusqu&#8217;Ã  l&#8217;arrivÃ©e de WordPress 2.6. Ã‡a n&#8217;a pas Ã©tÃ© criÃ© sur les toits mais elle prend dÃ©sormais 3 &#8230; et c&#8217;est du 3Ã¨me argument qu&#8217;il faut utiliser dÃ©sormais :</p>
<ol>
<li><code class="php">$domain</code> : l&#8217;espace de nom des traduction (inchangÃ©)</li>
<li><code class="php">$abs_rel_path</code> : chemin relatif par rapport Ã  l&#8217;emplacement de WordPress (dÃ©prÃ©ciÃ©, on y mettait <code>PLUGINDIR.'/'.dirname(plugin_basename(__FILE__))</code> en gÃ©nÃ©ral)</li>
<li><code class="php">$plugin_rel_path</code> :Â  chemin relatif par rapport Ã  l&#8217;emplacement des plugins (c&#8217;est qui nous intÃ©resse ; <code>dirname(plugin_basename(__FILE__))</code> nous suffira dÃ©sormais)</li>
</ol>
<p>Vous trouverez un <a href="http://codex.wordpress.org/Writing_a_Plugin#Internationalizing_Your_Plugin">exemple sur le Codex, du cÃ´tÃ© de l&#8217;internationalisation des plugins</a>.<br />
Un exemple de code pÃ©renne :</p>
<pre><code class="php">load_plugin_textdomain('votreplugin', dirname(plugin_basename(__FILE__)), dirname(plugin_basename(__FILE__)));</code></pre>
<p>Et si jamais vous utilisez votre plugin en lien symbolique Ã§a ne fonctionnera pas &#8230; mais on s&#8217;Ã©loigne du sujet <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Et pour WordPress Mu ?</h3>
<p>Je ne m&#8217;attarderai pas dessus mais les manipulations sont sensiblement les mÃªmes. Je n&#8217;ai pas encore eu l&#8217;occasion d&#8217;essayer mais j&#8217;ose imaginer qu&#8217;il n&#8217;y a pas tant de diffÃ©rences que Ã§a <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Conclusion</h3>
<p>Le jour oÃ¹ vous souhaitez migrer vers une autre version majeure de WordPress, c&#8217;est simple :<strong> il suffit de changer les externals vers le tag adÃ©quat</strong>.</p>
<p>Pourquoi ne pas utiliser le <em>trunk</em> directement me demanderez-vous ? Le trunk de WordPress est plutÃ´t instable puisque c&#8217;est lÃ  que se construit la prochaine version de maniÃ¨re systÃ©matique. L&#8217;utilisation des <strong>branches permet de bÃ©nÃ©ficier des correctifs</strong> sans avoir Ã  modifier le moindre external.<br />
Si vous avez un grand besoin de stabilitÃ©, alors utilisez les <em>tags</em> qui sont en principe figÃ©s.</p>
<p>On remarquera aussi que malgrÃ© son Ã¢ge, <strong>WordPress commence Ã  peine Ã  proposer des solutions d&#8217;industrialisation</strong>.<br />
Les liens symboliques sont en effet trÃ¨s mal gÃ©rÃ©s. Tentez d&#8217;utiliser un seul rÃ©pertoire source pour plusieurs blogs avec des liens symboliques et tout s&#8217;effondre.</p>
<p>La preuve en est aussi avec le <strong>manque de ressources disponibles sur le Web</strong> et traitant ce sujet. Ã‡a m&#8217;Ã©tonnerait d&#8217;Ãªtre le premier Ã  vouloir dÃ©ployer du WordPress via <acronym title="Subversion">SVN</acronym>.<br />
Les choses s&#8217;amÃ©liorent mais pour le cÃ´tÃ© <cite>code is poetry</cite>, on en est encore loin.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/wordpress-svn-external/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Plugin WordPress Amazon Widgets Shortcodes</title>
		<link>http://case.oncle-tom.net/2008/plugin-wordpress-amazon-widgets-shortcodes/</link>
		<comments>http://case.oncle-tom.net/2008/plugin-wordpress-amazon-widgets-shortcodes/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 05:00:44 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[logiciels libres]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[shortcodes]]></category>
		<category><![CDATA[tinymce]]></category>
		<category><![CDATA[widgets]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/?p=1123</guid>
		<description><![CDATA[J&#8217;ai publiÃ© il y a quelques jours la version 1.2 du plugin Amazon Widgets Shortcodes. Cette version suit plusieurs autres publications plus intimistes, Ã  des fins de tests grandeur nature. Ce fÃ»t en tous cas suffisant pour commencer Ã  attirer l&#8217;attention de traducteurs. ConcrÃ¨tement, ce plugin facilite la monÃ©tisation des blogs WordPress en Ã©vitant de [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1140" title="Amazon Associates" src="http://case.oncle-tom.net/images/2008/09/amazon-associates.gif" alt="" width="222" height="36" /></p>
<p>J&#8217;ai publiÃ© il y a quelques jours la version 1.2 du plugin <a href="http://wordpress.org/extend/plugins/amazon-widgets-shortcodes/">Amazon Widgets Shortcodes</a>. Cette version suit plusieurs autres publications plus intimistes, Ã  des fins de tests grandeur nature. Ce fÃ»t en tous cas suffisant pour commencer Ã  attirer l&#8217;attention de traducteurs.</p>
<p>ConcrÃ¨tement, ce plugin <strong>facilite la monÃ©tisation des blogs WordPress</strong> en Ã©vitant de copier du <acronym title="HyperText Markup Language">HTML</acronym> fourni par Amazon. Les widgets Amazon s&#8217;intÃ¨grent du coup par le biais de petits raccourcis textuels, les <a href="http://codex.wordpress.org/Shortcode_API">shortcodes</a>.</p>
<p>PrÃ©sentation et explications sur la conception du plugin.</p>
<p><span id="more-1123"></span></p>
<h3>Widgets Amazon</h3>
<p>Amazon fournit des widgets au travers de son <a href="http://partenaires.amazon.fr">programme Partenaires</a> (Ã©galement nommÃ© <em>Associates</em> dans le reste du monde). Ces widgets permettent d&#8217;intÃ©grer des fonctionnalitÃ©s sympathiques sur son propre site ou blog Ã  partir d&#8217;un code <acronym title="HyperText Markup Language">HTML</acronym> gÃ©nÃ©rÃ© par leur interface.</p>
<p>La liste des widgets et des fonctionnalitÃ©s est assez importante :</p>
<ul>
<li>lien produit (avec ou sans image)</li>
<li>widget carrousel (prÃ©sentation de produits dans un carrousel d&#8217;images)</li>
<li>widget slideshow (prÃ©sentation de produits sur une bande dÃ©roulante)</li>
<li>widget envies cadeaux</li>
<li>liens textuels</li>
<li>liens aperÃ§u produit</li>
<li>liens contextuels</li>
<li>etc.</li>
</ul>
<p>Les widgets se crÃ©ent en ligne et au final, leur code <acronym title="HyperText Markup Language">HTML</acronym> nous est gentiement proposÃ©.</p>
<p><strong>Premier constat</strong> : le code fourni par Amazon a beau Ãªtre fonctionnel, c&#8217;est quand mÃªme un sacrÃ© bazar. Pour peu que l&#8217;on bascule de l&#8217;Ã©diteur Visuel Ã  l&#8217;Ã©diteur <acronym title="HyperText Markup Language">HTML</acronym> de WordPress, le code est nettoyÃ© par endroit le rendant quasi inutilisable.</p>
<p><strong>Second constat</strong>, copier ce code dans l&#8217;Ã©diteur visuel de WordPress (TinyMCE) est passablement horrible avec parfois jusqu&#8217;Ã  10 lignes de <acronym title="HyperText Markup Language">HTML</acronym> illisible.</p>
<p>Enfin, cÃ´tÃ© maintenance c&#8217;est pas gagnÃ© : si Amazon change le code <acronym title="HyperText Markup Language">HTML</acronym> des Ã©lÃ©ments sans assurer de rÃ©trocompatibilitÃ© (ce que je ne leur souhaite pas), les widgets dÃ©jÃ  insÃ©rÃ©s seraient rendus inopÃ©rants.</p>
<div id="attachment_1144" class="wp-caption aligncenter" style="width: 355px"><img class="size-full wp-image-1144" title="Arborescence du code d'Amazon Widgets Shortcodes" src="http://case.oncle-tom.net/images/2008/09/awshortcode-workspace.png" alt="Arborescence du code d'Amazon Widgets Shortcodes" width="345" height="419" /><p class="wp-caption-text">Arborescence du code d&#39;Amazon Widgets Shortcodes</p></div>
<h3>Les objectifs fixÃ©s et avouÃ©s du plugin Amazon Widgets Shortcodes</h3>
<p>Toujours dÃ©sireux d&#8217;utiliser les widgets Amazon et sentant que Ã§a pouvait Ãªtre pratique, je me suis dit que c&#8217;Ã©tait l&#8217;occasion rÃªvÃ©e de produire un plugin utile, bien conÃ§u et fiable.</p>
<p>En dÃ©veloppant ce plugin, je me devais d&#8217;atteindre ces objectifs :</p>
<ul>
<li>le rendre <strong>internationalisable</strong> (<acronym title="internationalisation">i18n</acronym>)</li>
<li>le proposer en 2 langues minimum (franÃ§ais et anglais)</li>
<li>permettre son <strong>exploitation facilement</strong> et sans se prendre la tÃªte (<acronym title="Keep it simple, stupid">KISS</acronym>)</li>
<li>fournir une <strong>documentation</strong> d&#8217;utilisation appropriÃ©e</li>
<li>rendre l&#8217;<strong>Ã©volution du code aussi souple que possible</strong></li>
</ul>
<h3>StratÃ©gie de dÃ©veloppement</h3>
<p>Maintenant que j&#8217;avais les idÃ©es, il fallait les mettre en place. Voici comment j&#8217;avais envisagÃ© les Ã©tapes du dÃ©veloppement :</p>
<ol>
<li>support d&#8217;1 seul widget Amazon</li>
<li>augmentation du nombre de widgets Amazon supportÃ©s</li>
<li>stabilisation de l&#8217;<acronym title="Application Programming Interface">API</acronym> et internationalisation</li>
<li>configuration intÃ©grale depuis l&#8217;admin WordPress</li>
<li>intÃ©gration des widgets depuis l&#8217;Ã©diteur <acronym title="HyperText Markup Language">HTML</acronym> WordPress (TinyMCE)</li>
<li>intÃ©gration du copier/coller de code <acronym title="HyperText Markup Language">HTML</acronym> Amazon</li>
<li>support intÃ©gral des widgets</li>
<li>amÃ©liorations pratiques et ergonomiques</li>
<li>utilisation en tant que widgets dans les thÃ¨mes WordPress</li>
<li>gestion intÃ©grÃ©e des widgets (Amazon ne fournissant aucune <acronym title="Application Programming Interface">API</acronym> Ã  ce niveau)</li>
</ol>
<p>Cette progression permet de crÃ©er petit Ã  petit l&#8217;application, de la rendre modulaire et extensible. L&#8217;ajout et le support de nouveaux widgets ne doit pas remettre en cause l&#8217;architecture du plugin.</p>
<div id="attachment_1143" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-1143" title="Code JavaScript d'Amazon Widgets Shortcodes" src="http://case.oncle-tom.net/images/2008/09/awshortcode-javascript-abstraction.png" alt="Code JavaScript d'Amazon Widgets Shortcodes" width="500" height="405" /><p class="wp-caption-text">Code JavaScript d&#39;Amazon Widgets Shortcodes</p></div>
<h3>Ce Ã  quoi il faut penser en dÃ©veloppant un plugin</h3>
<p>DÃ©velopper un plugin c&#8217;est bien. Il faut cependant toujours avoir en tÃªte qu&#8217;il ne sera pas installÃ© que sur son propre blog. Ã‡a doit Ãªtre le <em>leitmotiv</em> qui accompagne toute nouvelle idÃ©e afin de prÃ©voir les installations et mises Ã  jour.</p>
<p>Voici <strong>5 points clÃ©s pour dÃ©velopper un bon plugin</strong> :</p>
<ol>
<li>penser <strong>utilisateur</strong> avant tout (c&#8217;est lui qui doit savoir l&#8217;utiliser, pas ses dÃ©veloppeurs)</li>
<li>penser que le dÃ©veloppement pourra se faire en <strong>Ã©quipe</strong> (clartÃ© du code, documentation)</li>
<li>penser que le plugin pourra Ãªtre utilisÃ© dans <strong>plusieurs langues</strong> (<acronym title="internationalisation">i18n</acronym>)</li>
<li>penser aux <strong>scÃ©narios de mise Ã  jour</strong> (base de donnÃ©es, tests fonctionnels/unitaires)</li>
<li>penser que ce plugin n&#8217;est pas le seul sur le blog (optimisation, nommage)</li>
</ol>
<h3>IntÃ©gration d&#8217;un widget Amazon par copier/coller</h3>
<p>C&#8217;est le serpent qui se mord la queue diraient certains.<br />
Et pourtant, c&#8217;est la meilleure fonctionnalitÃ© qu&#8217;on puisse apporter. Tout le monde n&#8217;Ã©tant pas technicien, les utilisateurs lambda apprÃ©cieront de pouvoir simplement se dÃ©barrasser de leur code <acronym title="HyperText Markup Language">HTML</acronym> Amazon pour le convertir sur leur blog.</p>
<p>Simple comme bonjour !</p>
<div style="text-align:center"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/BigIblty910" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/BigIblty910"></embed></object></div>
<h3>Conclusion</h3>
<p><strong>Le dÃ©veloppement d&#8217;un plugin WordPress est relativement aisÃ©</strong>. Certaines parties de la documentation sont quelque peu obscures, notamment celle qui touche l&#8217;Ã©diteur <acronym title="HyperText Markup Language">HTML</acronym> et son internationalisation. Il m&#8217;a fallu m&#8217;inspirer d&#8217;autres plugins mais aussi comprendre que WordPress 2.5 mettait en cache la configuration de TinyMCE dans un fichier.</p>
<p>L&#8217;autre partie ardue fÃ»t le plugin TinyMCE : la documentation est toujours partagÃ©e entre la version 2 et la version 3 et lÃ  encore, la meilleure documentation reste le code source d&#8217;origine. Je saluerai au passage le gros effort de lisibilitÃ© que leur Ã©quipe a apportÃ©. On en prendrait presque du plaisir Ã  le lire <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Quoiqu&#8217;il en soit, le plugin WordPress <a href="http://wordpress.org/extend/plugins/amazon-widgets-shortcodes/">Amazon Widgets Shortcodes</a> est bel et bien <strong>prÃªt Ã  Ãªtre utilisÃ©</strong> par le grand public. Le minimum vital est lÃ . Le confort aussi.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2008/plugin-wordpress-amazon-widgets-shortcodes/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>ENES : bilinguisme et gÃ©nÃ©ration RSS</title>
		<link>http://case.oncle-tom.net/2005/enes-bilinguisme-et-generation-rss/</link>
		<comments>http://case.oncle-tom.net/2005/enes-bilinguisme-et-generation-rss/#comments</comments>
		<pubDate>Thu, 22 Sep 2005 09:36:35 +0000</pubDate>
		<dc:creator>Oncle Tom</dc:creator>
				<category><![CDATA[DÃ©veloppement Web]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Emu Nova]]></category>
		<category><![CDATA[enes]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[rss]]></category>
		<guid isPermaLink="false">http://case.oncle-tom.net/2005/09/22/enes-bilinguisme-et-generation-rss/</guid>
		<description><![CDATA[<p style="text-align:center;"><img src="/images/Emu-Nova/ENES/enes2-index-fr.png" alt="ENES : Emu Nova Entertainment System" /></p> <p>Dans le billet <a href="http://case.oncle-tom.net/2005/08/02/enes-open-source/">ENES : Open Source ?</a> j'expliquais les bases du renouveau du projet. Renouveau important car aux yeux du "public", et mÃªme aux notres, on en reste sur une impression de stagnation. Pendant que <em>jeandubois</em> s'occupe de la partie dÃ©veloppement et matÃ©riel, je refonds le site Web. BientÃ´t Ã  mi-parcours et Ã  moins d'un mois de son relancement, que retenir ?</p>]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"><img src="http://case.oncle-tom.net/images/Emu-Nova/ENES/enes2-index-fr.png" alt="ENES : Emu Nova Entertainment System" /></p>
<p>Dans le billet <a href="http://case.oncle-tom.net/2005/08/02/enes-open-source/">ENES : Open Source ?</a> j&#8217;expliquais les bases du renouveau du projet. Renouveau important car aux yeux du &laquo;&nbsp;public&nbsp;&raquo;, et mÃªme aux notres, on en reste sur une impression de stagnation. Pendant que <em>jeandubois</em> s&#8217;occupe de la partie dÃ©veloppement et matÃ©riel, je refonds le site Web. BientÃ´t Ã  mi-parcours et Ã  moins d&#8217;un mois de son relancement, que retenir ?</p>
<p><span id="more-72"></span></p>
<p>Petit rappel pour celles et ceux qui ont eu la flemme de suivre le lien ci-dessus : <strong>ENES</strong> est initialement un projet de conservation de jeux NES, ceux qui ne l&#8217;Ã©taient pas encore. On Ã©largit notre vocation dÃ©sormais en proposant une plateforme matÃ©rielle d&#8217;extraction de donnÃ©es (de cartouches de jeu) ainsi que les logiciels nÃ©cessaire Ã  l&#8217;extraction. En clair, avec un peu de connaissances, on peut aussi bien dumper de la Super NES comme de la Neo Geo (en thÃ©orie).</p>
<p>Le nouveau site d&#8217;ENES sera bien plus axÃ© communication : de notre cÃ´tÃ© il sera plus facile de rÃ©diger des brÃ¨ves et d&#8217;en gÃ©nÃ©rer des exports <acronym title="Really Simple Syndication">RSS</acronym> (format de fichier adaptÃ© Ã  l&#8217;actualitÃ© car il peut Ãªtre &laquo;&nbsp;interprÃ©tÃ©&nbsp;&raquo; par de nombreux navigateurs, des lecteurs de news et mÃªme des sites Web.<br />
L&#8217;avantage pour les visiteurs et autres personnes intÃ©ressÃ©es par le projet c&#8217;est que l&#8217;actualitÃ© du groupe ira directement Ã  eux : pas besoin de passer n-fois sur le site pour repÃ©rer des mises Ã  jour; une actualisation du fil <acronym title="Really Simple Syndication">RSS</acronym> suffit pour lister les derniÃ¨res entrÃ©es. Comble du bonheur, ces fils sont disponibles en franÃ§ais et en anglais.</p>
<h3>Bilinguisme</h3>
<p>Oui tiens d&#8217;ailleurs, dans mon dernier billet sur ENES je parlais d&#8217;utiliser un blog pour l&#8217;actualitÃ©. Ben en fait non pour la simple et bonne raison qu&#8217;apparemment, avoir un mÃªme article en 2 langues diffÃ©rentes c&#8217;est impossible. Soit les blogs sont monolingues soit ils faut Ã©crire 2 articles (1 pour chaque langue) dans 2 catÃ©gories (1 catÃ©gorie = 1 langue). Sans parler du cÃ´tÃ© usine Ã  gaz et nullement intuitif. Bref une fois de plus j&#8217;ai optÃ© pour la solution maison en reprenant les principaux principes du premier site d&#8217;ENES.<br />
Physiquement, ENES n&#8217;a qu&#8217;un seul site mais dans la pratique, il y en a 2 : le site franÃ§ais et anglais. La langue principale du navigateur est automatiquement dÃ©tectÃ©e; dans le cas contraire, la langue par dÃ©faut est choisie (l&#8217;anglais). Le visiteur (ou moteur de recherche) est donc gentiement guidÃ© vers le site en question avec bien entendu la possibilitÃ© de basculer Ã  tout moment d&#8217;une langue Ã  l&#8217;autre.</p>
<h3>ActualitÃ©</h3>
<p>Quand on poste un billet d&#8217;information, on le rÃ©dige Ã  la fois en anglais et en franÃ§ais. Les titres peuvent Ãªtre totalement diffÃ©rents : Ã§a ne pose pas de problÃ¨mes pour les adresses naturelles. En effet les adresses sont dites &laquo;&nbsp;naturelles&nbsp;&raquo; et canoniques : leur arborescence a un cheminement logique, comme si vous aviez des dossiers, sous-dossiers, sous-sous-dossiers etc.<br />
<ins>Exemple</ins> : <em>http://monsite/news/2005/09/22/titre-de-la-news.htm</em>.<br />
En lisant l&#8217;adresse, on devine que l&#8217;on se trouve dans la rubrique d&#8217;actualitÃ© du site, au cours de l&#8217;annÃ©e 2005, dans son mois de septembre du jour 22 et pour une brÃ¨ve intitulÃ©e &laquo;&nbsp;Titre de la news&nbsp;&raquo;. Ca c&#8217;est une adresse naturelle.<br />
Canonique parce que si on supprime &laquo;&nbsp;titre-de-la-news.htm&nbsp;&raquo;, on tombera sur toutes les brÃ¨ves du 22 septembre 2005. Si on poursuit le raisonnement, en supprimant en plus le chiffre 22, on aura toutes les brÃ¨ves du mois de septembre 2005. Clair, net et prÃ©cis.</p>
<p>Tellement clair que peu de systÃ¨mes fonctionnent comme Ã§a, encore moins en gÃ©rant 2 langues. LÃ  oui : l&#8217;adresse anglaise aura le titre anglais tandis que l&#8217;adresse franÃ§aise le titre franÃ§ais. Difficile de faire mieux et plus clair. Encore une fois, il aurait Ã©tÃ© impossible d&#8217;avoir Ã§a sur un systÃ¨me de blogs prÃ©conÃ§u.</p>
<p style="text-align:center;"><img src="http://case.oncle-tom.net/images/Emu-Nova/ENES/enes2-index-en.png" alt="ENES : Emu Nova Entertainment System" /><br />La mÃªme page, en anglais ce coup-ci</p>
<h3>Fils <acronym title="Really Simple Syndication">RSS</acronym></h3>
<p>Une fois qu&#8217;une brÃ¨ve est ajoutÃ©e ou Ã©ditÃ©e, vu qu&#8217;il n&#8217;y a pas non plus 36 000 actualitÃ©s par jour, le mieux est de gÃ©nÃ©rer directement Ã  la suite le fil <acronym title="Really Simple Syndication">RSS</acronym>. Ou plutÃ´t LES fils <acronym title="Really Simple Syndication">RSS</acronym>, anglais et franÃ§ais. C&#8217;est pas bien compliquÃ©, suffit de lire la documentation, gÃ©nÃ©rer un fichier texte et &#8230; et quoi d&#8217;ailleurs ? La meilleure solution est-elle de gÃ©nÃ©rer dynamiquement un fichier Ã  chaque appel (donc refaire n-fois la mÃªme routine alors que le contenu n&#8217;a pas changÃ©) ou bien gÃ©nÃ©rer une fois pour toute un fichier &laquo;&nbsp;statique&nbsp;&raquo; ?<br />
Je suis plutÃ´t un partisan de l&#8217;Ã©conomie (on appelle Ã§a parfois la &laquo;&nbsp;flemme&nbsp;&raquo;) : c&#8217;est Ã  dire produire le mÃªme rÃ©sultat avec le mimimum d&#8217;effort. Donc en principe, pour moi, je prÃ©fÃ¨re gÃ©nÃ©rer un fichier Ã  chaque news Ã©ditÃ©e puis l&#8217;enregistrer en dur comme un fichier classique. Seulement voilÃ , sur l&#8217;hÃ©bergement fourni par notre hÃ©bergeur de projet, on ne peut pas crÃ©er de fichier comme Ã§a. Verdict : tout dynamique ?</p>
<p>Ouaip ben non : on va faire comme prÃ©vu sauf qu&#8217;au lieu de gÃ©nÃ©rer le rÃ©sultat dans un fichier, on va le stocker &#8230; dans la base de donnÃ©es. A premiÃ¨re vue c&#8217;est dÃ©bile (car on solicite aussi la base de donnÃ©es) mais c&#8217;est la meilleure alternative : la requÃªte est simple (une ligne Ã  chercher contre plusieurs dans le cas du tout dynamique), quasiment aucun traitement Ã  effectuer (requÃªte <acronym title="Structured Query Language">SQL</acronym> + affichage au lieu d&#8217;une requÃªte &laquo;&nbsp;moyenne&nbsp;&raquo;, l&#8217;assemblage puis l&#8217;affichage). C&#8217;est donc plus rapide que du tout dynamique, un poil plus lent que la version statique (lire un fichier c&#8217;est toujours plus rapide qu&#8217;accÃ©der Ã  une base de donnÃ©es).</p>
<hr />
<p>MÃªme si c&#8217;Ã©tait un peu technique, j&#8217;explique au moins la logique de fonctionnement : le tout dynamique est dÃ©bile car il ne sert Ã  rien de gÃ©nÃ©rer n-fois un contenu strictement inchangÃ© : Ã§a bouffe des ressources (RAM, processeur) pour pas grand chose. Ca fait juste trÃ¨s style mais c&#8217;est lÃ  le seul intÃ©rÃªt (sauf quand il est impossible d&#8217;agrÃ©ger le contenu et que lÃ , le fichier est effectivement dynamique).<br />
La prochaine Ã©tape sera la nouvelle liste de dumps avec un moteur de recherche intÃ©grÃ© afin de rechercher en 2 clics si un jeu en notre possession a bel et bien Ã©tÃ© sauvegardÃ©.</p>
<hr />
<p><strong>Petite note</strong> : j&#8217;ai pris un peu de retard dans la rÃ©daction de mes billets, j&#8217;ai 3 films Ã  commenter (La moustache, Collision et la dÃ©chirure), la fin de mes vacances et c&#8217;est dÃ©jÃ  pas mal <img src='http://case.oncle-tom.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  En attendant j&#8217;vais un peu me reposer pardi.</p>]]></content:encoded>
			<wfw:commentRss>http://case.oncle-tom.net/2005/enes-bilinguisme-et-generation-rss/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

