template et site multi-langue: comment stocker les trades...

Mammouth du PHP | 843 Messages

26 août 2007, 10:45

Salut la compagnie :)

je cherche une methode pour faire en sorte de pouvoir traduire facilement l'integralité de mon site dans differentes langues.

mon objectif est d'afficher chaque message, info-bulles, texte de contenu... dans la bonne langue suivant une var $_SESSION['langue'].

sachant que je suis en train de definir un moteur de template perso, plusieur idée s'offre à moi:
- traduire directement les textes, liens et infobulles dans differents templates specifique à chaque langue.
- definir chaques textes, liens et infobulles commes des variables et les definirs dans differents fichier lang_fr.php specifique à la langues

Mais vue que je n'assurerai pas toujours les traductions, j'aimerai avoir l'avis de professionnel sur la methode utiliser pour definir les fichier de trades pour savoir sur quel base travail les traducteur... :-k

1°) quel methode utilisé?
2°) comment travaille t'on à ce niveau chez les professionnl du web?

merci d'avance pour vos conseils ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 1511 Messages

26 août 2007, 11:00

Personnellement j'utilise ceci pour gerer les languages.
Pour ce qui est du stockage des variables, il y a deux fichier, le fichier de langue du core, et le fichier de langue du module en cours.
L'array contenu dans les deux fichier est fusionné.
Au premier niveau, l'index du tableau est l'indicatif de language(en, fr...);
Ensuite, au second niveau, on se retrouve avec le nom de la variable en index.
Si une clef est manquante dans le langage courant, on cherche dans le langage par défaut, ce qui évite de se retrouver avec des vides et si la variable n'est pas trouvée, ca affiche une erreur.
Actuellement, cette classe n'est que php5, mais avec deux trois petites modifications, ca se retrouve compatible php4 ;)
<?php
/**
* @package  : language.lib.php
* @version  1.0
* @copyright (c)2007 momox
*/
class language {
	/**
	 * Variable contenant la langue principale
	 *
	 * @var string
	 */
	private $lang;
	/**
	 * Variable contenant la langue par defaut
	 *
	 * @var string
	 */
	private $default_lang;
	/**
	 * Variable contenant les variables de langue
	 *
	 * @var array
	 */
	private $lang_defs;
	/**
	 * Constructeur de la classe
	 *
	 * @param string $module
	 * @param string $lang
	 * @param string $default_lang
	 * @return void
	 */
	public function __construct($module, $lang, $default_lang) {
		//On vérifie que les fichiers necessaires au langage sont présents
		$files_needed = array(dirname(__FILE__).'/../language/lang.php', dirname(__FILE__).'/../modules/'.$module.'/language/lang.php');
		if(file_exists($files_needed[0])) {
			//on définit les variables spécifiant la langue
			$this->lang = $lang;
			$this->default_lang = $default_lang;
			//on inclut les fichiers de langue necessaires
			require($files_needed[0]);
			if(file_exists($files_needed[1])) {
				require($files_needed[1]);
			}
			//on fusionne les deux tableau
			if(isset($lang_core) && is_array($lang_core) && !empty($lang_core)) {
				if(isset($lang_mod) && is_array($lang_mod) && !empty($lang_mod)) {
					$this->lang_defs = array_merge_recursive($lang_core, $lang_mod);
				}
				else {
					$this->lang_defs = $lang_core;
				}
			}
			else {
				throw new Exception('$lang_core array is missing');
			}
		}
		else {
			Throw new Exception('Missing lang files in the following list: <br /> -'.implode('<br /> -', $files_needed), E_USER_ERROR);
		}
	}
	/**
	 * Verifie l'existence de la variable de langue
	 *
	 * @param string $var
	 * @return bool
	 */
	final private function lang_key_exists($var) {
		if(isset($this->lang_defs[$this->lang][$var])) {
			return true;
		}
		elseif(isset($this->lang_defs[$this->default_lang][$var])) {
			return true;
		}
		else {
			return false;
		}
	}
	/**
	 * Retourne la variable de langue spécifiée
	 *
	 * @param string $var
	 * @return string
	 */
	final private function lang_get_key($var) {
		if(isset($this->lang_defs[$this->lang][$var])) {
			return $this->lang_defs[$this->lang][$var];
		}
		elseif(isset($this->lang_defs[$this->default_lang][$var])) {
			return $this->lang_defs[$this->default_lang][$var];
		}
		else {
			throw new Exception('Missing lang key for '.$var);
		}
	}
	/**
	 * Parse un texte avec la variable de langage spécifiée
	 *
	 * @param string $var
	 * @param string $args,...
	 * @return string
	 */
	final public function parse_lang_var($var) {
		$args = func_get_args();
		//on enleve $var du tableau pour ne garder que les arguments
		array_shift($args);
		//on vérifie l'existence de la variable de langue
		if($this->lang_key_exists($var)) {
			//on récupere la variable de langue
			$lang_var = $this->lang_get_key($var);
			if(!empty($args)) {
				$exp = '$string = sprintf($lang_var, \''.implode("', '", $args).'\');';
				eval($exp);
			}
			else {
				$string = $lang_var;
			}
			return $string;
		}
		else {
			throw new Exception('Missing lang key for '.$var);
		}
	}
}
?>
lang_core.php
<?php
/**
* @package  : lang.php
* @version  1.0
* @copyright (c)2007 momox
* @author Geekimo : [email protected]
*/
$lang_core = array();

//Francais
$lang = 'fr';

$lang_core[$lang]['guest'] = 'Invité';
$lang_core[$lang]['member'] = 'Membre';
$lang_core[$lang]['modo'] = 'Modérateur';
$lang_core[$lang]['admin'] = 'Administrateur';
$lang_core[$lang]['yes'] = 'Oui';
$lang_core[$lang]['no'] = 'Non';
$lang_core[$lang]['none'] = 'Aucun';
$lang_core[$lang]['other'] = 'Autre';

//English
$lang = 'en';

$lang_core[$lang]['guest'] = 'Guest';
$lang_core[$lang]['member'] = 'Member';
$lang_core[$lang]['modo'] = 'Moderator';
$lang_core[$lang]['admin'] = 'Administrator';
$lang_core[$lang]['yes'] = 'Yes';
$lang_core[$lang]['no'] = 'No';
$lang_core[$lang]['none'] = 'None';
$lang_core[$lang]['other'] = 'Other';
?>
Fichier lang_mod.php
<?php
/**
* @package  : lang.php
* @version  1.0
* @copyright (c)2007momox
* @author Geekimo : [email protected]
*/
$lang_mod = array();
//Francais
$lang = 'fr';
$lang_mod[$lang]['cat_move'] = 'D&eacute;placer une catégorie';
$lang_mod[$lang]['cat_destination'] = 'Catégorie de destination';
$lang_mod[$lang]['missing_cat_destination'] = 'Veuillez indiquer la catégorie de destination';
$lang_mod[$lang]['cat_root'] = 'Racine';
$lang_mod[$lang]['doc_move'] = 'Déplacer le document';
$lang_mod[$lang]['confirm_delete_category'] = 'Voulez vous supprimer la categorie %s ?';
//English
$lang = 'en';
$lang_mod[$lang]['cat_move'] = 'Move a category';
$lang_mod[$lang]['cat_destination'] = 'Catégorie de destination';
$lang_mod[$lang]['missing_cat_destination'] = 'Please indicate destination\'s category';
$lang_mod[$lang]['cat_root'] = 'Root';
$lang_mod[$lang]['doc_move'] = 'Move the document';
$lang_mod[$lang]['confirm_delete_category'] = 'Do you really want to delete %s category ?';
?>
Voila, je poste ces codes a titre d'exemple ;)
Modifié en dernier par momox le 15 juin 2008, 21:54, modifié 1 fois.

Mammouth du PHP | 843 Messages

26 août 2007, 13:00

Merci MOMOX :)

je ne pense pas utiliser ta class mais je vais faire de même ou presque pour ce qui est des tableau :-k

par contre, ne serai il pas plus judicieux de faire comme suit:
<?php
$lang_core = array();

//Francais
$lang = 'fr';

$lang_core[$lang]['guest'] = htmlentities('Invité',ENT_QUOTES,'ISO-8859-15');
// ...

//English
$lang = 'en';

$lang_core[$lang]['guest'] = htmlentities('Guest',ENT_QUOTES,'ISO-correspondant');
// ...
cela t'evite de taper tes trades avec des caractère spéciaux au format html et sans pour autant avoir à gerer ça coté template non plus :roll:

qu'en pense tu ?

EDIT: peut être aussi plus propre et lisible en passant en boucles les resultats du tableau via une fonction ou autre...

Mais j'ai du mal à concevoir cette boucle qui pour chaque enregistrement du tableau, va effecuer le htmlentities() avec le bon charset :-k

si quelqu'un à une idée...
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 1511 Messages

26 août 2007, 13:14

Tous les fichiers sont encodés ISO-8859-1 donc de ce coté la il ne devrait pas y avoir de problème non?

Mammouth du PHP | 843 Messages

26 août 2007, 14:55

apres une bonne heure de reflection et different test, je pense qu'il faut donc avoir les catactère spéciaux directement inscrit en code html dans ton fichier lang car la plupart des editeur de texte ne reconnaisse pas les caractere via copier/coller.

la methode que j'ai essayer pour arriver a mes fin est un copier/coller dans word et enregistrer le fichier au format html. puis editer le code source de la page html pour recuperer ce texte au format
html afin de le coller dans ton fichier de lang....

donc pour ce faciliter la vie, la fonction htmlentities est aussi tres bien car tu doit dans tout les cas avoir coté html les caractere au format html...

donc je reste sur mon opignon :)

par contre, comment puis je faire un foreach pour reconvertir chaque valeur de chaque entrer du tableau via htmlentities() ?

merci d'avance pour votre aide :)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non: