Hello,
Va falloir commencer à parler de l'internationalisation
(i18n en abrégé). Donc discuter un peu de comment on
va faire... ? Première chose, la plus importante :
traduire l'interface SPIP (avec le problème des textes
en .gif qu'il va falloir résoudre, ou non, spécifiquement).
A priori, je propose qu'il y ait un répertoire ecrire/lang
qui contienne un (plusieurs ?) include php3 centralisant
les chaînes utilisées sous forme de variables ou constantes.
A titre d'exemple :
- phpNuke utilise un fichier unique language/lang-XXX.php3
(XXX = english, french...) contenant des lignes du style :
define("_PRINTER","Format imprimable");
define("_FRIEND","Envoyer cet article à un(e) ami(e)");
define("_SEARCH","Recherche");
define("_LOGIN"," Identification ");
define("_WRITES","a écrit :");
define("_POSTEDON","Posté le");
define("_NICKNAME","Surnom/Pseudo");
define("_PASSWORD","Mot de Passe");
[...]
- phpMyAdmin fait un peu le même genre de choses mais utilise
des variables globales et non des constantes. Extrait de
french.inc.php3 :
$strAPrimaryKey = "Une clé primaire a été ajoutée sur";
$strAccessDenied = "Accès refusé";
$strAction = "Action";
$strAddNewField = "Ajouter un champ";
$strAddSearchConditions = "Critères de recherche (pour l'énoncé \"where\"):";
$strAnIndex = "Un index a été ajouté sur ";
Si on utilise des variables globales, elles seront
appelées par $GLOBALS['nom_variable']. Si on utilise
des constantes, elles sont appelées simplement par
leur nom, y compris dans les fonctions : c'est donc
peut-être plus simple et plus lisible. Par contre
le fichier inclus est moins lisible (define au lieu
d'affectations de variables).
Pour remplacer les textes par les noms de variables
correspondants : je pense que ce serait mieux d'avoir
un système d'internationalisation assisté. J'ai
commencé un machin (*) qui va chercher les chaînes d'un
fichier PHP et en extrait ce qui ressemble à du
langage naturel. Ca marche pas trop mal, y a assez peu
de déchets. Ensuite le programmeur pourrait avoir
une interface pour choisir quelle chaîne ou sous-chaîne
internationaliser, et le script ferait le boulot
d'écrire la définition dans le include et de remplacer
la chaîne par l'appel de variable/constante dans le
script original.
(*) http://rezo.net/spip-dev/devel/i18n.php3
Pour la traduction, il suffirait simplement de prendre
un fichier langue, de le recopier sous un autre nom
et de taper les chaînes. Il peut également y avoir
une interface pour le faire : recopier les chaînes
d'un fichier à l'autre, et afficher un formulaire
pour les modifier.
Enfin, pour la sélection de la langue, on peut utiliser
la configuration du navigateur : normalement la variable
$HTTP_ACCEPT_LANGUAGE en PHP. Peut-être aussi donner
la possibilité de changer le réglage automatique (avec
un cookie ?).
Pour l'internationalisation, quoiqu'il en soit de la
méthode utilisée, va falloir rationaliser certains
bouts de code. Notamment du type :
if ($articles_soustitre == "non") {
echo "<INPUT TYPE='radio' NAME='articles_soustitre' VALUE='oui' id='articles_soustitre_on'>";
echo " <label for='articles_soustitre_on'>Oui</label> ";
echo " <INPUT TYPE='radio' NAME='articles_soustitre' VALUE='non' CHECKED id='articles_soustitre_off'>";
echo " <B><label for='articles_soustitre_off'>Non</label></B> ";
}
else {
echo "<INPUT TYPE='radio' NAME='articles_soustitre' VALUE='oui' CHECKED id='articles_soustitre_on'>";
echo " <B><label for='articles_soustitre_on'>Oui</label></B> ";
echo " <INPUT TYPE='radio' NAME='articles_soustitre' VALUE='non' id='articles_soustitre_off'>";
echo " <label for='articles_soustitre_off'>Non</label> ";
}
Non seulement la même chaîne est systématiquement en
double, mais en plus cela doit rester la même chaîne :
il est illogique que la case change d'intitulé une
fois sélectionnée. Donc avant d'internationaliser,
il faut s'arranger pour que la chaîne soit en simple
exemplaire (pourquoi pas faire une fonction qui
se charge en fonction des paramètres de sélectionner
la seule case qui doive l'être ?).
Alors, qu'est-ce qu'on fait ?
a+
Antoine.