Salut tous le monde
J'ai réussis à traduire un document que j'ai appeler "International" dans la racine de mon site web. J'ai faite des tests et tous fonctionne à merveille. Quand je veux traduire d'autre pages de mon site web qui son à l'extérieurs du document "International" j'ai des problèmes. Il faut que j'importe un fichier php que j'ai nomé "Localization.php" dans un autre fichier et que je modifie dans le code source.

<?php echo _("Le texte à traduire"); ?>

Le problème je ne veux pas être obliger de copier chaque document de mon site web la librairie "gettext". Il faut que je crée des catalogues. pour chaque documents qui contient une page "index.php"

L'exemple suivant va vous illustrer ce que je veux en venir par chaque document :
exemple.com/homenews/index.php

Le résultat que le viseur veux changer la langue.
exemple.com/homenews/index.php?lang=en_US

5 réponses


SHADAR
Réponse acceptée

Salut pour ma part j'utilise cette petite classe :

<?php 
Class Core_Lang
{
    // Langue par le code ISO 639 (défaut : français)
    private $_langue = 'fr';

    // Dossier contenant les langues
    private $_dirLangue = 'Lang';

    // Objet SimpleXML
    private $_simpleXML = null;

    private static $_instance = null;

    //--------------------------------------------------------------------------------------
    public static function getInstance()
    {
        if (is_null(self::$_instance))
        {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    //--------------------------------------------------------------------------------------
    //Récupère la langue via le navigateur, sinon charge celle par défaut ou si une langue 
        //est spécifiée, on charge celle ci. Permet aussi de spécifier le dossier où ce trouvent 
        //les langues
    public function __construct($langue = false) {

        //$this->_dirLangue = LANGAGES_PATH;

        if($langue) {
            $this->_langue = strtolower($langue);
        }
        else {
            if($lang = strtolower(substr($_SERVER'HTTP_ACCEPT_LANGUAGE'], 0, 2))) {
                $this->_langue = $lang;
            }
            else {
                $this->_langue = 'fr';
            }
        }

            // Chargement du fichier langue
            $this->loadXmlFile('Lang');

    }

    //--------------------------------------------------------------------------------------
    /* Charge le fichier XML */
    private function loadXmlFile($fichier) {
        if(file_exists($this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.xml')) 
        {
            $this->_simpleXML = simplexml_load_file($this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.xml');
        }
        /*else 
        {
            throw new Exception('Fichier XML ('.$this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.xml) innexistant ! Merci de vérifier que celui ci existe.');
        }*/
    }

    //--------------------------------------------------------------------------------------
    /* Charge le message à afficher */
    public function GetText($texte) {
        $resultat = $this->_simpleXML->xpath($texte);

        foreach($resultat as $noeud) {
            return $noeud;
        }
    }

// ______________________________________________________________________________________________
}
?>

Ensuite faut juste que faire un dossier /Lang/ plus 1 sous dossier par langue que tu veux gerer et creer un petit fichier xml nommé "lang.xml"
ex pour le francais ca te fera /Lang/fr/lang.xml
pour l'anglais ca te fera /Lang/en/lang.xml
ect....

ex du fichier lang.xml

<?xml version="1.0" encoding="utf-8"?>
<langue>
    <msg_test>Bonjour le monde</msg_test>
</langue>

et dans ton code php pour recuperer la variable "msg_test" il suffit de faire

<?php 
    Localizator = new Core_Lang(); 
   //ou par exemple si tu veux forcer l'anglais Localizator = new Core_Lang('en');
    echo (Localizator->GetText('msg_test')); 
?>

voila en esperant que ca te sera utile
A+

MrGuillou
Réponse acceptée

Pour ma par j'utilise un bout de code du cms NukedKlan

Donc une funtion translate que tu mets dans ton modèle

function translate($file_lang)
{
    if (is_file($file_lang))
    {
        ob_start();
        print eval(" include ('$file_lang'); ");
        $lang_define = ob_get_contents();
        $lang_define = htmlentities($lang_define, ENT_NOQUOTES);
        $lang_define = eregi_replace("<", "<", $lang_define);
        $lang_define = eregi_replace(">", ">", $lang_define);
        ob_end_clean();
        return $lang_define;
    }
}

L'appel de la fonction que tu mets dans le fichier que tu veux traduire avec le chemin du fichier lang

translate('/lang/' . $core'lang'] . '.lang.php');

Un petit test

echo '' . _MONTEXT . '';
// autre exemple
echo '' . _CITY . ' : <input type="text" name="city">';

Et ton fichier lang

define("_MONTEXT","Mon texte en français");
define("_CITY","Ville");
SHADAR
Réponse acceptée

Ta fonction translate avec ob_start (j'y avais jamais pensé) vient de me donner une idée pour traduire les textes de mes bases de données

+1 jbou43 :)

bourdais6
Réponse acceptée

Rien en faites.

lakamark
Auteur
Réponse acceptée

Merci beaucoup de vos conseilles j'ai déjà trouver une solution, mais la classe que "SHADAR" m'a fait parvenir est très intéressante. Je vais l'exploiter prochainement dans mon site web.