[spip-dev] personnalisation des fichiers de langue

Bonjour,

Afin de ne pas toucher aux fichiers de langues 'officiels', j'ai retenu l'idée de je-ne-sais-plus-qui qui proposait ceci :

faire appel à la fonction _T('module:truc') ou module est un tableau à part dans un fichier à part...

pour cela, j'ai légèrement modifié la fonction *traduire_chaine* définie dans le fichier ecrire/inc_lang.php3 (voir le fichier joint)

en gros, je créé un sous-répertoire *mod* dans ecrire/
s'il contient un fichier spip_module.php3, contenant lui-même un tableau construit sur le même modèle que les tableaux de langues, mais dont le nom est 'module', l'appel _T('module:truc') me renverra la valeur de l'entrée 'truc' du module...

Est-ce que ça vous intéresse ?

James aka Kliké

spip_mod.php3 (525 Bytes)

@ klike@firstream.net <klike@firstream.net> :

en gros, je créé un sous-répertoire *mod* dans ecrire/
s'il contient un fichier spip_module.php3, contenant lui-même un tableau
construit sur le même modèle que les tableaux de langues, mais dont le nom
est 'module', l'appel _T('module:truc') me renverra la valeur de l'entrée
'truc' du module...

Oui, un truc comme ça

<?php

//
// Traduire une chaine internationalisee
//
function traduire_chaine($code, $args) {
  global $spip_lang;
  $var = "i18n_$spip_lang";
  if (!$GLOBALS[$var]) charger_langue($spip_lang);
  if (ereg('^(.+):(.+)$', $code, $regs)) {
    $var = $regs[1];
    $code = $regs[2];
    include_ecrire("mod/spip_$var.php3");
  }
  $text = $GLOBALS[$var][$code];

  if (!is_array($args)) return $text;

  while (list($name, $value) = each($args))
    $text = str_replace ("@$name@", $value, $text);
  return $text;
}

?>

Euh, non, là ça va pas ; Le fichier de langue du module toto doit s'appeler
toto_xx.php3, pas spip_xx.php3 ; sinon on risque d'effacer spip_xx.php3 ;
et, par ailleurs, ça permettra de script de traduction de ranger ses
fichiers au bon endroit sans se mélanger les pinceaux.

-- Fil

Fil wrote:

@ klike@firstream.net <klike@firstream.net> :

en gros, je créé un sous-répertoire *mod* dans ecrire/
s'il contient un fichier spip_module.php3, contenant lui-même un tableau construit sur le même modèle que les tableaux de langues, mais dont le nom est 'module', l'appel _T('module:truc') me renverra la valeur de l'entrée 'truc' du module...

Oui, un truc comme ça

<?php

//
// Traduire une chaine internationalisee
//
function traduire_chaine($code, $args) {
global $spip_lang;
$var = "i18n_$spip_lang";
if (!$GLOBALS[$var]) charger_langue($spip_lang);
if (ereg('^(.+):(.+)$', $code, $regs)) {
  $var = $regs[1];
  $code = $regs[2];
  include_ecrire("mod/spip_$var.php3");
}
$text = $GLOBALS[$var][$code];

if (!is_array($args)) return $text;

while (list($name, $value) = each($args))
  $text = str_replace ("@$name@", $value, $text);
return $text;
}

?>

Euh, non, là ça va pas ; Le fichier de langue du module toto doit s'appeler
toto_xx.php3, pas spip_xx.php3 ; sinon on risque d'effacer spip_xx.php3 ;
et, par ailleurs, ça permettra de script de traduction de ranger ses
fichiers au bon endroit sans se mélanger les pinceaux.

En fait, il s'appelle spip_toto.php3 et ne se trouve pas dans lang mais dans mod... je pensais que ça suffirait

Mais bon,
au lieu de include_ecrire("mod/spip_$var.php3");
on ecrit include_ecrire("mod/$var_$spip_lang.php3");
et là, ça passe ?

-- Fil

James

- Bon je résume, pour voir si j'ai bien compris... ;+)

Si je fais :

>><?php
>>
>>//
>>// Traduire une chaine internationalisee
>>//
>>function traduire_chaine($code, $args) {
>> global $spip_lang;
>> $var = "i18n_$spip_lang";
>> if (!$GLOBALS[$var]) charger_langue($spip_lang);
>> if (ereg('^(.+):(.+)$', $code, $regs)) {
>> $var = $regs[1];
>> $code = $regs[2];
>> include_ecrire("mod/$var_$spip_lang.php3");

C'est là que j'ai un prob : si j'ai plusieurs modules.. ex : sondage,
explorateur ...

Faut que je colle :

include_ecrire("sondage/$var_$spip_lang.php3"); et

include_ecrire("explorateur/$var_$spip_lang.php3");

??

Ou bien alors çà, ca marche pour tous les cas :

include_ecrire("$var/$var_$spip_lang.php3");

??

A moins de mettre tout çà dans /ecrire/lang ...

include_ecrire("lang/$var_$spip_lang.php3");

?? J'ai bon là ?

>> }
>> $text = $GLOBALS[$var][$code];
>>
>> if (!is_array($args)) return $text;
>>
>> while (list($name, $value) = each($args))
>> $text = str_replace ("@$name@", $value, $text);
>> return $text;
>>}
>>
>>?>

Et après, il ne reste plus qu'à appeler la chaine :
_T('nomdumodule:nomdelachaine') ???

Vous avez le droit de taper si j'ai rien compris...

--neoram

Hello,

Ci-joint un nouveau paquet de fonctions.
Elles s'ajoutent, ou remplacent des fonctions, dans ecrire/inc_lang.php3

charger_langue et traduire_chaine permettent de tenir compte de la notation 'module:entree' et dans le cas d'un appel à un fichier de langue 'modulaire', si l'entrée n'existe pas, il tente d'en trouver une dans le fichier 'officiel'

les fonctions cherche_module et cherche_module_hierarchie (complètement inspirée du mode de recherche du fichier squelette) permettent de traiter un cas particulier :

Pour personaliser les noms des champs d'un article dans la partie privée en fonction du numéro de rubrique, il suffiet de créer un fichier

art(quelque_chose)_xx.php3

où xx est la langue,
quelquechose pouvant être vide, egal à -x ou =x ou x est un n° de rubrique sachant que le fonctionnement de ces fichiers est le même que les squelettes numérotés

Avec ces fonctions, dans ecrire/article_edit.php3, par exemple, on rajoute la ligne suivante :

$module = cherche_module($id_rubrique) (dès lors qu'on A un $id_rubrique

et pour l'afichage, au lieu de _T('texte_sur_titre') on met :

_T($module.'texte_sur_titre')

à discuter :wink:

James

spip_mod.txt (1.69 KB)

Soir'

Ci-joint un nouveau paquet de fonctions.
Elles s'ajoutent, ou remplacent des fonctions, dans ecrire/inc_lang.php3

charger_langue et traduire_chaine permettent de tenir compte de la

notation

'module:entree' et dans le cas d'un appel à un fichier de langue
'modulaire', si l'entrée n'existe pas, il tente d'en trouver une dans le
fichier 'officiel'

J'ai mis çà en place sur l'explorateur de fichier ( un module ... ). Ca
marche pour la partie explorateur_fr.php3, mais les chaines par défaut de
Spip (en particulier le menu ...)

Mon fichier explorateur_fr.php3 ne contient QUE les chaines relatives à son
utilisation.

Ben là que dalle, rien ...

Une idée, cher ami ?

--neoram

En tout cas, très bonne idée.

>>Ci-joint un nouveau paquet de fonctions.
>>Elles s'ajoutent, ou remplacent des fonctions, dans ecrire/inc_lang.php3
>>
>>charger_langue et traduire_chaine permettent de tenir compte de la
>
> notation
>
>>'module:entree' et dans le cas d'un appel à un fichier de langue
>>'modulaire', si l'entrée n'existe pas, il tente d'en trouver une dans le
>>fichier 'officiel'
>
>
> J'ai mis çà en place sur l'explorateur de fichier ( un module ... ). Ca
> marche pour la partie explorateur_fr.php3, mais les chaines par défaut

de

> Spip (en particulier le menu ...)
>
> Mon fichier explorateur_fr.php3 ne contient QUE les chaines relatives à

son

> utilisation.
>
> Ben là que dalle, rien ...
>
> Une idée, cher ami ?
Ce soir non... je regarde demain matin :wink:
Je me doute qu'il y a bug dans la gestion du par défaut ... :frowning:

OK mais en tout cas, le concept m'a l'air d'être bon. Fil ?

--neoram

Bonjour,

Ci-joint un nouveau paquet de fonctions.
Elles s'ajoutent, ou remplacent des fonctions, dans ecrire/inc_lang.php3

charger_langue et traduire_chaine permettent de tenir compte de la

notation

'module:entree'

Ca marche nickel.

et dans le cas d'un appel à un fichier de langue
'modulaire', si l'entrée n'existe pas, il tente d'en trouver une dans le
fichier 'officiel'

C marche nickel aussi. ;+))

J'ai testé sur l'explorateur de fichiers, en créant explorateur_fr.php3, en
renommant les chaine de caractères, tout fonctionne nickel. Je prépare les
dernières fonctionnalités et je livre. ;+)

les fonctions cherche_module et cherche_module_hierarchie (complètement
inspirée du mode de recherche du fichier squelette) permettent de traiter

un

cas particulier :

Pour personaliser les noms des champs d'un article dans la partie privée

en

fonction du numéro de rubrique, il suffiet de créer un fichier

art(quelque_chose)_xx.php3

où xx est la langue,
quelquechose pouvant être vide, egal à -x ou =x ou x est un n° de rubrique
sachant que le fonctionnement de ces fichiers est le même que les

squelettes

numérotés

Pour ma part, j'ai donc créé un fichier : ecrire/lang/art=3_fr.php3 qui
contient

<?php

// This is a SPIP language file -- Ceci est un fichier langue de SPIP

$GLOBALS['i18n_fr'] = array(

'titre_cadre_interieur_rubrique' => '&Agrave; l\'int&eacute;rieur de la
rubrique tutute',

);

?>

Avec ces fonctions, dans ecrire/article_edit.php3, par exemple, on rajoute
la ligne suivante :

$module = cherche_module($id_rubrique) (dès lors qu'on A un $id_rubrique

Oui, il faut positionner les lignes :

//
//Chargement du module de langue ( Modification par James Aka Klike -
klike@firstream.net )
//
$module = cherche_module($id_rubrique);

juste après le bloc de lignes commençant par

//
// Creation de l'objet article
//

Sinon, on ne récupère pas l'id_rubrique ;+))

et pour l'afichage, au lieu de _T('texte_sur_titre') on met :

_T($module.'texte_sur_titre')

Ca marche nickel...

Mais si la chaine 'texte_sur_titre' n'existe pas dans art=3_fr.php3 (dans
mon exemple), il ne rebascule pas vers spip_fr.php3 , par contre.

--neoram

neoram wrote:

Bonjour,

Ci-joint un nouveau paquet de fonctions.
Elles s'ajoutent, ou remplacent des fonctions, dans ecrire/inc_lang.php3

charger_langue et traduire_chaine permettent de tenir compte de la

notation

'module:entree'

Ca marche nickel.

et dans le cas d'un appel à un fichier de langue
'modulaire', si l'entrée n'existe pas, il tente d'en trouver une dans le
fichier 'officiel'

C marche nickel aussi. ;+))

J'ai testé sur l'explorateur de fichiers, en créant explorateur_fr.php3, en
renommant les chaine de caractères, tout fonctionne nickel. Je prépare les
dernières fonctionnalités et je livre. ;+)

les fonctions cherche_module et cherche_module_hierarchie (complètement
inspirée du mode de recherche du fichier squelette) permettent de traiter

un

cas particulier :

Pour personaliser les noms des champs d'un article dans la partie privée

en

fonction du numéro de rubrique, il suffiet de créer un fichier

art(quelque_chose)_xx.php3

où xx est la langue,
quelquechose pouvant être vide, egal à -x ou =x ou x est un n° de rubrique
sachant que le fonctionnement de ces fichiers est le même que les

squelettes

numérotés

Pour ma part, j'ai donc créé un fichier : ecrire/lang/art=3_fr.php3 qui
contient

<?php

// This is a SPIP language file -- Ceci est un fichier langue de SPIP

$GLOBALS['i18n_fr'] = array(

$GLOBALS['art=3_fr'] = array (

'titre_cadre_interieur_rubrique' => '&Agrave; l\'int&eacute;rieur de la
rubrique tutute',

);

?>

Avec ces fonctions, dans ecrire/article_edit.php3, par exemple, on rajoute
la ligne suivante :

$module = cherche_module($id_rubrique) (dès lors qu'on A un $id_rubrique

Oui, il faut positionner les lignes :

//
//Chargement du module de langue ( Modification par James Aka Klike -
klike@firstream.net )
//
$module = cherche_module($id_rubrique);

juste après le bloc de lignes commençant par

//
// Creation de l'objet article
//

Sinon, on ne récupère pas l'id_rubrique ;+))

et pour l'afichage, au lieu de _T('texte_sur_titre') on met :

_T($module.'texte_sur_titre')

Ca marche nickel...

Mais si la chaine 'texte_sur_titre' n'existe pas dans art=3_fr.php3 (dans
mon exemple), il ne rebascule pas vers spip_fr.php3 , par contre.

Avec la modif dans le nom du tableau ci-dessus, tu n'écraseras pas le tableau de variables 'officielles'...

C'est la p'tite contrainte de ce truc, mais ce n'est peut-être qu'une question d'habitude...

Du coup, on en fait quoi de ça ? Une contrib ou ça rentre dans la CVS ?

--neoram

James

Salut,

>>et pour l'afichage, au lieu de _T('texte_sur_titre') on met :
>>
>>_T($module.'texte_sur_titre')
>
>
> Ca marche nickel...
>
> Mais si la chaine 'texte_sur_titre' n'existe pas dans art=3_fr.php3

(dans

> mon exemple), il ne rebascule pas vers spip_fr.php3 , par contre.
Avec la modif dans le nom du tableau ci-dessus, tu n'écraseras pas le
tableau de variables 'officielles'...

C'est la p'tite contrainte de ce truc, mais ce n'est peut-être qu'une
question d'habitude...

Du coup, on en fait quoi de ça ? Une contrib ou ça rentre dans la CVS ?

Ben, je sais pas ... Fais un article dans Spip_contrib, dans un premier
temps. :wink:

--neoram

> >>_T($module.'texte_sur_titre')
> Du coup, on en fait quoi de ça ? Une contrib ou ça rentre dans la CVS ?

On va l'intégrer, je pense, dès qu'on trouvera le temps de tester/valider le
truc. A priori ce qui me chagrine c'est que le nom de la variable globale
utilisée n'est pas normalisé, et risque de venir "taper" d'autres variables
internes de spip -- mais c'est un détail, et je n'ai rien testé...

-- Fil

Fil wrote:

_T($module.'texte_sur_titre')

Du coup, on en fait quoi de ça ? Une contrib ou ça rentre dans la CVS ?

On va l'intégrer,

Ah ! je vais mettre le début de contrib en sommeil alors :)...
je pense, dès qu'on trouvera le temps de tester/valider le

truc. A priori ce qui me chagrine c'est que le nom de la variable globale
utilisée n'est pas normalisé, et risque de venir "taper" d'autres variables
internes de spip -- mais c'est un détail, et je n'ai rien testé...

Qu'est-ce 'normalisé' veut dire ? Que dois-je faire pour que cela le soit ? Imposer le nom du tableau ? dans ce cas, on a 'droit' qu'à un seul fichier de personnalisation...

à moins qu'on puisse faire un truc du genre :

$GLOBALS['i18n_xx'] = (
   'truc' => 'bidule',
   'titre' => 'Nom du film'
);

??

Dans ce cas, est-ce que 'titre' est bien surchargé ?

D'autre part, je pensais aussi à l'éventualité de faire une exception avec un 'module' qui ne serait pas appelé nommément :

Si le webmestre ne souhaite pas toucher au code pour simplement remplacer quelques textes, lui permettre de remplir un fichier 'perso_xx.php3' (ou perso seraitavec des entrées... euh... standard ?

si le fichier perso_xx.php3 existe et qu'il contient une entrée 'standard', c'est celle-ci qui s'affiche au lieu de celle contenue dans spip_xx.php3

Dès lors, l'emploi de la notation explicite _T('module:entree') ne servirait que dans le cas d'ajouts de développeur...

-- Fil

James