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