2010-11-07 14 views
1

Il est courant sur de nombreuses plates-formes, au lieu de chaînes intégrer directement dans le code, faire une table de table de ressources ou d'une chaîne, qui répertorie tous les messages, et ont la le code les référence. Cela facilite la traduction de l'application ou permet à un non-développeur de modifier le libellé du message.PHP: l'aide d'une table de chaîne/ressource pour changer la marque et i18n

Quelle est la méthode recommandée pour cela en PHP? Existe-t-il de bonnes solutions standard simples ou est-ce votre propre rôle? Une table simple est facile - mon souci est que les fichiers PHP que j'ai utilisent PHP, HTML et JavaScript ensemble, et il n'est pas toujours facile de savoir où vous êtes ...

Répondre

0

Les dictionnaires i18n/l10n sont de simples tableaux associatifs (paires clé-valeur) et peut être accompli en utilisant du code PHP régulier, des fichiers .ini ou des tables de base de données (même NoSQL). Si les dictionnaires ne sont pas si grands, votre meilleur pari serait les fichiers PHP. Si la base de l'utilisateur est non-codeurs, considérez les fichiers .ini. Si vous prévoyez que les phrases du dictionnaire augmentent au fil du temps (et pourraient ne pas tenir dans la mémoire PHP disponible), l'option DB est le meilleur choix. Faites votre choix.

0

Je l'ai fait dans le passé avec un simple fichier PHP complet définir des() chaînes d.

(english.php)

<?php 
define ('MSG_OK_LOGIN', 'You have successfully logged in. Welcome back'); 
define ('MSG_ERR_LOGIN', 'Unable to log you in. ') 
define ('MSG_ERR_LOGIN_USERNAME', MSG_ERR_LOGIN . 'Please register before attempting to log in'); 
define ('MSG_ERR_LOGIN_PASSWORD', MSG_ERR_LOGIN . 'Please check that you have typed your password correctly, and that your caps lock key is off. '); 
// ... 
?> 

Puis dans votre page de connexion,

<?php 
require ('path/to/your/config.php'); // A configuration for the software. Assume it contains a define ('CFG_LANG', 'english'); line in it somewhere 
require ('path/to/language/files/' . CFG_LANG . '.php'); 
// ... 
?> 
+0

On dirait que Gordon a un ventilateur, http: // stackoverflow.com/users/208809/gordon – RobertPitt

3

personnellement, je ne voudrais pas utiliser de définir ce, comme indiqué par Gordon mais je ferais quelque chose comme ceci:

class Language 
{ 
    var $language; 
    var $storage = array(); 

    public function __construct($language) 
    { 
     $this->language = $language; 
     $this->load(); 
    } 

    private function load() 
    { 
     $location = '/path/to/' . $this->language . '.php'; 

     if(file_exists($location)) 
     { 
      require_once $location; 
      if(isset($lang)) 
      { 
       $this->storage = (object)$lang; 
       unset($lang); 
      } 
     } 
    } 

    public function __get($root) 
    { 
     return isset($this->storage[$root]) ? $this->storage[$root] : null; 
    } 
} 

donc ce qui précède serait un objet de langage très basique, et le fichier de langue serait ressembler à ceci:

/path/to/english.php

$lang = array(
    'user' => array(
     'welcome' => 'Welcome %s', 
     'logout' => 'Logout', 
    ) 
    /*...*/ 
); 

Vous devriez avoir plusieurs fichiers pour divers endroits, mais vous devez modifier votre classe de sorte que si une clé n'existe pas dans German alors il devrait par défaut local anglais qui est le principal

Ainsi, l'usage serait comme si.

$lang = 'english'; //logic behind this to detect the browser or user data. 

$Language = new Language($lang); 

echo sprintf($Language->user->welcome,"RobertPitt"); // Welcome RobertPitt 
+0

J'ai essayé d'utiliser ceci et je ne peux pas sembler ca en utilisant la syntaxe "$ Language-> user-> welcome". Je viens d'obtenir ce message d'erreur: "Erreur fatale: Impossible d'utiliser l'objet de type stdClass comme tableau dans /var/www/html/workspace/srclistv2/Resource.php sur la ligne 34" (J'ai appelé ma classe Resource, pas la langue). – Twistar

+0

êtes-vous sûr n'est pas: '$ this-> stockage -> $ root' à la place' $ this-> stockage [$ root] '? ... après tout, c'est un objet ... – HellBaby