8791 sujets

Développement web côté serveur, CMS

Bonjour à vous !

Ce n'est pas évident d'expliquer mon problème alors je vous mets d'abord le code.
<?php
// Traduit les chaines de caracteres
function _($indice) {
	// Declaration du tableau associatif (couple cle/valeur)
	$arrayLang = array(
		'Ceci est un $value.' => 'This is a $value.'
	);

	// Verification que l'indice soit present dans le tableau
	if(isset($arrayLang[$indice]))
		return $arrayLang[$indice];
	// Sinon on retourne directement "l'indice"
	else
		return $indice;
}

$value = 'test';

$msg = _('Ceci est un $value.');

echo $msg;
?>

Ce que je voudrais, c'est que la variable $value soit interprétée au moment de l'affichage car au moment de l'appel de la fonction, il faut que ma chaîne soit statique sinon on ne retrouvera pas l'indice dans le tableau...

J'espère que vous avez compris ce que j'essaye de faire ! Merci d'avance pour vos idées Smiley cligne
Bonjour.

À mon avis il te faut plutôt mettre une entrée de tableau pour chaque valeur de $value. Sauf si $value est une chaîne qui ne doit pas être traduite et dans ce cas il suffit de la sortir de la chaîne que tu envoies à la fonction.
Bon, pour l'instant j'utilise un artifice qui, j'en suis sûr, peut être amélioré !
<?php
// Traduit les chaines de caracteres
function _($indice) {
	// Declaration du tableau associatif (couple cle/valeur)
	$arrayLang = array(
		'Ceci est un $1.' => 'This is a $1.'
	);

	// Verification que l'indice soit present dans le tableau
	if(isset($arrayLang[$indice]))
		return $arrayLang[$indice];
	// Sinon on retourne directement "l'indice"
	else
		return $indice;
}

$value = 'test';

$msg = _('Ceci est un $1.');

echo str_replace('$1', $value, $msg);
?>
Changaco> Merci pour ta réponse, mais parfois j'ai plus d'une variable dans ma chaîne et je peux également avoir des constantes...

Du coup, l'idée de mettre des entrées dans la fonction tombe à l'eau... Cependant, je vais tout de même creuser cette possibilité.

Ensuite, mes variables et constantes ne doivent pas être traduites. Comment faire pour les sortir de la chaîne ?

Edit. Mes variables ne se trouvent pas forcément en fin de chaîne, c'était juste un exemple...
Modifié par Alphonse (05 Aug 2008 - 11:28)
Alphonse a écrit :
Ensuite, mes variables et constantes ne doivent pas être traduites. Comment faire pour les sortir de la chaîne ?
Tout simplement comme ça ?
$msg = _('Ceci est un ').$value.'.';

Ce qui ne doit pas être traduit ne doit pas passer par la fonction de traduction c'est aussi simple que ça. Smiley smile
Modifié par Changaco (05 Aug 2008 - 11:54)
Oui, j'ai compris ce que tu as voulu dire un peu plus tard, j'ai édité mon message précédent dans lequel je dis que mes variables ne se trouvent pas forcément en fin de chaîne.

Exemple :
<?php
echo $var1.' résultats trouvés (de '.$var2.' à '.$var3.')'; // ex. 1875 résultats trouvés (de 750 à 825)
?>
Alphonse a écrit :
Oui, j'ai compris ce que tu as voulu dire un peu plus tard, j'ai édité mon message précédent dans lequel je dis que mes variables ne se trouvent pas forcément en fin de chaîne.

Exemple :
<?php
echo $var1.' résultats trouvés (de '.$var2.' à '.$var3.')'; // ex. 1875 résultats trouvés (de 750 à 825)
?>
Je viens de comprendre ce que tu veux dire. En fait il faut découper tes phrases, ça fait plus d'entrées dans le tableau mais c'est plus simple.
Par exemple comme ça :
<?php
echo $var1._(' résultats trouvés (de ').$var2._(' à ').$var3.')'; // ex. 1875 résultats trouvés (de 750 à 825)
?>


Sinon si tu ne veux pas faire comme ça il y a possibilité de faire ce que tu cherches. Je pourrai te donner des idées si tu veux mais là je dois y aller.
a écrit :
Sinon si tu ne veux pas faire comme ça il y a possibilité de faire ce que tu cherches. Je pourrai te donner des idées si tu veux mais là je dois y aller.
Ca m'intéresse de faire autrement ! Ce sera pour quand tu reviens...
Alphonse a écrit :
Ça m'intéresse de faire autrement ! Ce sera pour quand tu reviens...
On peut envisagé un nombre variable d'arguments pour la fonction :
echo _('début du texte ', $uneVariable, 'un autre bout de texte', $uneAutreVar, 'la fin du texte');

On utilisera alors la fonction PHP "func_get_args()" et une boucle pour parcourir le résultat.
Il y a cependant une limitation c'est qu'il faut fixer le type du premier argument.

Ou alors on peut aussi faire la même chose avec deux tableaux :
echo _(array('début du texte ', 'un autre bout de texte', 'la fin du texte'), array($uneVariable, $uneAutreVariable));

Ça simplifie la fonction mais ça complique sont utilisation.

Voila ce à quoi je pense pour le moment. Smiley smile
Mmmh... C'est intéressant mais je ne suis pas convaincu car il y a moyen de résoudre ce problème en une seule ligne de code grâce à la fonction eval() (quoi que ça peut ne pas fonctionner comme je veux à cause des constantes)... Pour l'instant, je fais toujours un bête str_replace() mais j'en suis pas convaincu non plus !

Bref, je continue à réfléchir et te remercie déjà de porter un intérêt à ma demande ! Smiley smile
Alphonse a écrit :
Mmmh... C'est intéressant mais je ne suis pas convaincu car il y a moyen de résoudre ce problème en une seule ligne de code grâce à la fonction eval() (quoi que ça peut ne pas fonctionner comme je veux à cause des constantes)... Pour l'instant, je fais toujours un bête str_replace() mais j'en suis pas convaincu non plus !

Bref, je continue à réfléchir et te remercie déjà de porter un intérêt à ma demande ! Smiley smile
La première solution que j'ai proposée est pourtant plutôt simple et élégante qu'est-ce qui te gêne ?
En tout cas de rien ça me fait plaisir.