Skip to content

Symfony 1.4 : distance_of_time_in_words en français

octobre 1, 2011 - Symfony

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

  1. Benjamin octobre 27, 2011

    Merci pour cet article qui me sauve la vie!

Trackbacks

There are no trackbacks on this entry.

Add a Comment

Required

Required

Optional