1 votes

Comment ajouter un support multi-langue à mon application web à travers les fichiers PHP, JS et Template ?

Je suis en train de créer un site web qui doit prendre en charge différentes traductions. J'ai des chaînes de caractères en PHP, JavaScript et des fichiers Smarty Template qui doivent être traduits.

Je veux utiliser quelque chose comme la méthode PHP gettext() et avoir un seul fichier de langue pour chaque locale.

C'est facile lorsque les chaînes traduisibles se trouvent dans les fichiers PHP, mais j'ai aussi du texte dans les modèles Smarty et les fichiers JavaScript qui doivent également être traduits.

Je veux vraiment un seul fichier qui contienne toutes les chaînes de caractères traduisibles.


Mise à jour :

J'aimerais utiliser gettext() mais le vrai problème que j'ai est qu'il ne fonctionne qu'avec PHP et pas avec JavaScript car JavaScript est côté client.

2voto

Manos Dilaverakis Points 4035

Vous pouvez stocker vos chaînes de caractères dans des fichiers CSV comme suit :

"Welcome","Welcome"
"Total Price","Total Price"

Faites un fichier pour chaque langue. La première valeur est la clé que vous utiliserez pour récupérer la chaîne de caractères et la seconde la traduction. Vous pouvez ensuite construire une classe avec des fonctions qui chargent le fichier approprié, stockent les variables dans un tableau et traduisent le texte à la demande. Par exemple :

protected function loadTranslation($locale) {
    $this->_data=array();
    $localeFilePath="locale/" . $locale . "/whatever.csv";
    if(file_exists($localeFilePath)){
        $localeFileHandle = fopen($localeFilePath, "r");
        while (($line = fgetcsv($localeFileHandle, 1000)) !== FALSE) {
            $this->_data[$line[0]]=$line[1];
        }
        fclose($localeFileHandle);
    }
    return $this;
}

pour le chargement des valeurs et

   public function __($label) {
        $output=$this->_data[$label];
        if(empty($output)) $output=$label;
        return $output;
    }

pour la traduction. Vous pouvez alors, par exemple, utiliser ce qui suit pour obtenir la chaîne appropriée :

echo $this->__('Total Price')

L'avantage d'utiliser des CSV est que vous n'avez pas besoin de vous occuper de la base de données et, bien sûr, ils peuvent être modifiés via Excel, ce qui sera très pratique lorsque vous devrez demander à un bourdon de la saisie de données de faire une traduction.

De plus, vous pouvez écrire un petit script pour trouver les chaînes utilisées par la fonction __() dans votre code et ensuite écrire les chaînes appropriées dans les fichiers CSV afin de ne pas perdre votre temps à ajouter des chaînes à chaque fichier CSV pour chaque chaîne utilisée dans votre code.

Comme pour les modèles Smarty et les fichiers Javascript, vous devrez également prendre vos chaînes traduites de PHP. Les valeurs Smarty proviennent de PHP, donc utilisez votre traducteur avant d'assigner une valeur à Smarty. Quant au javascript, il devra être créé dynamiquement par PHP afin que vous puissiez placer les chaînes traduites aux endroits appropriés.

1voto

AlexanderMP Points 6147

Toutes les applications web que j'ai construites supportent 3 langues, et sont conçues pour en supporter davantage. Je stocke tous les textes dans la base de données, et je les appelle des constantes.

create table constants (
id integer not null,
fk_constant_group integer not null 
)

create table constants_group (
id integer not null,
name varchar(32)
)

create table languages (
id integer not null,
name varchar(32),
accronym varchar(3),
/*other fields if necessary*/
)

create table constants_value (
id integer not null,
fk_constant integer,
fk_language integer,
value text
)

La constante group est utilisée pour les regrouper par module/page. Si vous voulez afficher une page, vous aurez besoin de toutes les constantes, donc vous utilisez une seule requête pour obtenir toutes les données dans la langue nécessaire pour une page. Un index sur le nom du groupe serait approprié. En PHP, j'ai écrit quelque chose comme ceci :

public static function SetNames()
    {
        $info=debug_backtrace(true);
        $result=self::GetNames($info);
        Factory::getSmarty()->assign("names",$result);
        return $result;
    }

public static function GetNames($info=false) /*$info is the debug_backtrace result*/
    {
        if(!$info)
            $info=debug_backtrace(true);
        $class=$info[1]['class']; /*It's the page name basically*/
        if(isset(self::$m_names[$class]))
            return self::$m_names[$class]; /*Using a static member for caching*/
        global $application;
        $langId=$application->langId;
        $constants=AppFac::getAdo()->GetAll("SELECT 
    X.name as constant_name, 
    XV.value as constant_value 
FROM 
    constants X 
LEFT JOIN constants_values XV ON XV.fk_constant=X.id 
LEFT JOIN constants_groups XG ON X.fk_constant_group=XG.id
WHERE
    XG.name=?
    AND XV.fk_language=?",array($class,$langId)); /*Parametrized query*/
        $result=array();
        foreach($constants as $constant) /*Make constants easily accessible*/
            $result[$constant['constant_name']]=$constant['constant_value'];
        self::$m_names[$class]=$result;
        return $result;
    }

Dans le module PHP, avant de récupérer ou d'afficher le modèle, appelez la fonction SetNames() qui déterminera automatiquement le nom de la classe à partir de laquelle vous appelez, et utilisera ce nom pour trouver le groupe de constantes et remplir les constantes dans la langue définie dans la session. Après cela, utilisez les constantes du modèle comme ceci {$names.label_name} Par exemple, si vous cherchez label_name constantes pour votre page.

Cette façon est bonne parce que : 1. Vous pouvez ajouter plusieurs langues directement à partir de l'interface Web que vous créez pour votre application. 2. Vous pouvez facilement organiser vos textes lorsqu'ils sont stockés dans la base de données. 3. Vous pouvez facilement ajouter et modifier des textes à partir de l'interface que vous avez créée pour votre application.

Si vous cherchez à traduire des pages entières plutôt que des constantes, vous pouvez utiliser les ressources Smarty, où vous incluez simplement une ressource dans le modèle, et en PHP vous définissez comment gérer cette ressource. http://www.smarty.net/manual/en/template.resources.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X