Gettext

Extension

Il y a deux types de fichiers:

Pour compiler un fichier .po en .mo:

/usr/bin/msgfmt -v -o fr-FR.mo fr-FR.po

Traduction simple


Multi-ligne

Les chaînes de caractère d’un fichier .po doivent respecter la syntaxte C d’une chaîne de caractères.
Chaque ligne doit commencer et finir par un guillemet.

msgid ""
"Here is an example of how one might continue a very long string\n"
"for the common case the string represents multi-line output.\n"

Pluralisation

Comment ça marche

Pour gérer la pluralisation d’une chaîne de caractère, il faut

  1. Définir l’entête Plural-Forms dans le fichier .po.
    Elle ressemble à ça:

    Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
    

    nplurals précise combien de formes de pluriel existe pour cette langue.
    La chaîne de caractère qui suit est une expression utilisant la syntaxe C. Les espaces sont autorisés, mais les retours à la ligne non. Cette expression sera evaluée à chaque fois qu’une fonction de traduction pluralisée est appelée (ngettext, dngettext ou dcngettext). La valeur numérique passée à ces fonctions est substituée à la variable n dans l’expression.

    Exemples

    • français: Plural-Forms: nplurals=2; plural=n > 1;
      Utiliser entrée 0 pour 0 et 1, utiliser entrée 1 sinon (= utiliser le singulier pour 0)

    • anglais: Plural-Forms: nplurals=2; plural=n != 1;
      Utiliser entrée 0 pour 1, utiliser entrée 1 sinon (= utiliser le pluriel pour 0)

    • letton: Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);
      Utiliser entrée 0 si (n % 10 == 1 && n % 100 != 11), utiliser entrée 2 pour 0, utiliser entrée 1 sinon

    Liste d’expressions plurielles pour la plupart des langues.

  2. Définir les différentes entrées msgstr
    Définir chaque entrée pour chaque forme plurielle avec une nouvelle entrée msgstr.

    Exemples

    • français

      msgid "%count% day"
      msgid_plural "%count% days"
      msgstr[0] "%count% jour"
      msgstr[1] "%count% jours"
      
    • croate

      msgid "%count% Comment"
      msgid_plural "%count% Comments"
      msgstr[0] "%count% Komentarz"
      msgstr[1] "%count% Komentarze"
      msgstr[2] "%count% Komentarzy"
      
  3. Pourquoi msgid_plural existe
    Un msgid n’est pas une “clé”, c’est une phrase réelle qui est utilisée si aucune traduction appropriée n’est trouvée.
    Donc quand, dans votre code, vous demandez la traduction suivante:

    ngettext("One file removed", "%count% files removed", $file_count);
    

    Ces deux chaînes de caractères seront utilisées

    • pour extraire les messages du code source
    • comme chaîne par défaut lorsqu’aucune traduction n’existe
    • comme guide pour les traducteurs du fichiers .po, pour montrer comment ils sont définis dans le programme source.

Placeholders

On a utiliser des placeholders dans les exemples précédents (%count%).
Les placeholders ne sont pas gérés par le système de localisation, on doit utiliser des fonctions PHP pour les remplacer.

printf

Il est courant d’utiliser printf/sprintf:

$str = sprintf(gettext('Your color is %s.'), $color) ;
$str = sprintf(ngettext("%d day", "%d days", $n), number_format($n)) ;

Pour la liste complète des spécificateurs, voir la doc de sprintf.
C’est généralement une bonne idée d’ordonner les arguments s’il y a plus d’un placeholder:

printf(
   ngettext('The %2$s contains %1$d monkey', 'The %2$s contains %1$d monkeys', $num),
   number_format($num), $location
);

Avec Twig, on n’utilise pas de Placeholders qui dépendent de la position mais du nom:
%variable_name% plutôt qu’un spécificateur tel que %d — en utilisant str_replace.

str_replace

$str = str_replace(gettext('Your color is %color%.'), ['%color%'], [$color]) ;
$str = str_replace(
  ngettext("%count% day", "%count% days", $n),
  ['%count%'],
  [number_format($n)]
);

Contexte

Le contexte sert à désambiguïser des messages utilisant la même chaîne non traduite.


Commentaires

On peut ajouter des commentaires dans le fichier .po, devant la ligne msgid, en commençant la ligne par ##. Le format est le suivant:

white-space
#  translator-comments
#. extracted-comments
#: reference…
#, flag…
#| msgid previous-untranslated-string
msgid untranslated-string
msgstr translated-string

Par exemple, pour ajouter une référence vers le fichier d’où a été extraite la traduction:

#: lib/error.c:116
msgid "Unknown system error"
msgstr "Error desconegut del sistema"