Ironiquement c'est justement dans des classes que j'ai ce problème:
En général quand je dois réaliser un site en plusieurs langues j'utilise quelque chose dans ce genre:
<?php
define('LANG','en');
//include 'Lang/'.LANG.'.php'; (ligne commentée ici pour simplifier l'exemple)
//Exemple de contenu de 'Lang/'.LANG.'.php'
$L['Exemple de texte']='Sample text';
$L['Exemple de texte 2']='Sample text 2';
$L['Exemple de texte 3']='Sample text 3';
function l($t){
global $L;return $L[$t];
}
?>
<html>
<body>
<strong><u><?=l('Exemple de texte 3')?></u></strong>
</body>
</html>
(Je sais que gettext est mieux mais jusqu'ici ma fonction qui m'est plus simple à mettre ne place à toujours fait l'affaire)
Jusqu'ici tout va à peu près bien même si parfois ça devient un peu chargé parce qu'il faut écrire ça l('...') à la place de chaque texte, de toute façon ça reste normal, si on veut plusieurs langue c'est forcement un peu plus complexe qu'une seule.
Je trouve que ça reste acceptable puisque comme avec gettext le nom de la fonction est très court _() ou l() dans mon cas.
Donc où est le problème et quel est le rapport avec ma question de depart:
Dernièrement je devais programmer une classe générique permettant ajouter un espace membre à un site. Cette classe devait donc gérer en plus des sessions aussi l'affichage de quelques formulaires (inscription, login, mot de passe oublié, ...) et ça en autant de langue qu'on veut pour être vraiment générique.
Voila donc à peu près comment j'ai fait au niveau des langues:
<?php
class Exemple{
var $L;
function Exemple($lang){
//include dirname(__FILE__).'/Lang/'.$lang.'.php'; (ligne commentée ici pour simplifier l'exemple)
//Exemple de contenu de dirname(__FILE__).'/Lang/'.$lang.'.php'
$this->L=array(
'Exemple de texte'=>'Sample text',
'Exemple de texte 2'=>'Sample text 2',
'Exemple de texte 3'=>'Sample text 3'
);
}
function test(){
return '
<strong><u>'.$this->L['Exemple de texte 3'].'</u></strong>
';
}
}
$Exmpl = new Exemple('en');
echo $Exmpl->test();
?>
C'est bon ça marche ok, mais la où déja l(...) c'était pas très joli à regarder mais encore acceptable quand une partie du code est chargée en texte à traduire, ça par contre $this->L['Exemple de texte 3'] ça devient vraiment beaucoup plus moche parce que $this->L['...'] c'est long, c'est gros à cause du $this->.
C'est la toute la raison de ma question si j'avais pu dans une fonction l(...) accèder aux propriétés d'une classe sans avoir les passer en paramétre:
Le code aurait été celui-ci:
<?php
function l($t){
parent $L;return $L[$t]; //j'utilise encore ici parent pour marquer quelquechose (ça n'existe pas je suis d'accord)
}
class Exemple{
var $L;
function Exemple($lang){
//include dirname(__FILE__).'/Lang/'.$lang.'.php'; (ligne commentée ici pour simplifier l'exemple)
//Exemple de contenu de dirname(__FILE__).'/Lang/'.$lang.'.php'
$this->L=array(
'Exemple de texte'=>'Sample text',
'Exemple de texte 2'=>'Sample text 2',
'Exemple de texte 3'=>'Sample text 3'
);
}
function test(){
return '
<strong><u>'.l('Exemple de texte 3').'</u></strong>
';
}
}
$Exmpl = new Exemple('en');
echo $Exmpl->test();
?>
ça resterait donc exactement aussi peut chargé que je le souhaite et que tout le monde pourrait le souhaiter je suppose dans ce genre de cas
J'ai pas mal recherché à l'époque si ça existait, sans résultat, je me suis dis que tout simplement ça n'existe pas et puis hier ça m'ai revenu à l'esprit donc je me suis dis que je pourrais quand même poser la question histoire d'être sûr.
Donc voila vous savez tout
(Une autre façon de faire pour y arriver est totalement la bienvenue)
Merci Beaucoup pour vos réponses