Symfony 1.4 : distance_of_time_in_words en français

Ayant dû utiliser récemment le helper Symfony 1.4 distance_of_time_in_words sur un projet francophone, j’ai eu quelques difficultés à le mettre en français. Et pour cause : il semblerait que le fichier de traduction ne soit pas présent par défaut. Voici donc une solution pour remédier à cela.
Présentation de distance_of_time_in_words
La fonction distance_of_time_in_words est disponible dans le helper Date. Il permet de traduire une durée depuis une certaine date en une phrase à la Twitter, du type « il y a moins de 30 secondes » ou encore « il y a une heure ».
Son prototype est le suivant :
function distance_of_time_in_words( $from_time, $to_time = null, $include_seconds = false)
Il prend donc trois arguments :
- $from_time : timestamp UNIX (un nombre de secondes donc). Date de l’événement,
- $to_time : timestamp UNIX. Date de référence depuis laquelle compter la durée. Par défaut, ce sera la date actuelle.
- $include_seconds : permet d’augmenter la granularité de la phrase aux secondes. Par défaut, on n’indiquera pas les secondes. La première phrase serait donc moins d’une minute.
Un petit exemple d’utilisation :
<?php
use_helper('Date');
// Current date minus fifty minutes
$time = time() - 50 * 60;
echo 'Il y a '.distance_of_time_in_words($time).'.';
?>
Cela nous écrira donc :
Il y a about 1 hour.
Pour tous ceux que le franglais horripile, voyons immédiatement comment traduire ce retour.
distance_of_time_in_words en français ?
Tout d’abord, activons (si ce n’est déjà fait) l’internationalisation dans notre projet. Dans le fichier config/settings.yml :
.all:
.settings:
i18n: on
default_culture: fr
Seulement, cette étape ne suffit pas. En effet, même si à l’intérieur du helper, l’internationalisation semble bien prise en compte, il manque le fichier de traduction. Pour ce faire, il vous suffit de le télécharger : traduction de distance_of_time_in_words en français. Il s’agit simplement d’un fichier XML d’internationalisation des plus classiques.
Voici le fichier, tronqué, afin de ne pas polluer inutilement l’affichage.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
<xliff version="1.0">
<file source-language="EN" target-language="fr" datatype="plaintext" original="messages" date="2011-09-29T11:14:32Z" product-name="messages">
<header/>
<body>
<trans-unit id="1">
<source>less than 5 seconds</source>
<target>moins de 5 secondes</target>
</trans-unit>
<trans-unit id="2">
<source>less than 10 seconds</source>
<target>moins de 10 secondes</target>
</trans-unit>
</body>
</file>
</xliff>
Il vous suffit de mettre à jour ou créer le fichier app/frontend/i18n/messages.xml avec ce contenu. Bien entendu, le lecteur avisé aura compris que frontend doit être remplacé par l’application de votre projet utilisant le helper distance_of_time_in_words.
Si jamais vous avez déjà un fichier messages.xml et que vous ne désirez pas mettre à jour les ID à la main, il vous suffit de créer temporairement un template dans lequel vous insérerez :
<?php __('less than 5 seconds') ?>
<?php __('less than 10 seconds') ?>
<?php __('less than 20 seconds') ?>
<?php __('half a minute') ?>
<?php __('less than a minute') ?>
<?php __('1 minute') ?>
<?php __('%minutes% minutes') ?>
<?php __('about 1 hour') ?>
<?php __('about %hours% hours') ?>
<?php __('1 day') ?>
<?php __('%days% days') ?>
<?php __('about 1 month') ?>
<?php __('%months% months') ?>
<?php __('about 1 year') ?>
<?php __('over %years% years') ?>
Il vous suffit ensuite de rechercher les nouvelles chaînes à traduire avec la tâche Symfony :
php symfony i18n:extract
Et à mettre à jour vous-même les traductions dans votre fichier.
Et voilà, vous devriez avoir votre helper distance_of_time_in_words en français à présent. :)
Comments
Trackbacks
There are no trackbacks on this entry.
Merci pour cet article qui me sauve la vie!