2010-08-17 13 views
3

Je crée un site qui sera traduit en x langues.Affectation de la chaîne Gettext au membre de la classe

Toutes les chaînes doivent être localisées.

Il m'arrive de devoir afficher un nom de langue, un nom de pays ou d'autres informations qui ont été extraites d'une base de données. Les données traitées de cette manière seront rarement modifiées - comme ci-dessus je parle des noms de langue, des pays, etc.

Dans cet exemple, j'utilise le tableau qui contient les langues dans lesquelles l'interface utilisateur du site a été traduit. Pour permettre la traduction des noms (utilisé pour le texte du titre lorsque le drapeau/lien « changer la langue » est plané), j'ai un tableau comme *:

Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English")); 

Je les utilise pour obtenir la chaîne de nom pertinent pour une donnée la langue.

Actuellement, je suis sur un tableau global:

$global_langNames = Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English")); 

Utilisation:

global $global_langNames; 

echo $global_langNames[$code]; // $code = 'zh_CN' 

sortie (locale = en_GB):

Chinois simplifié

Ou tput (locale = zh_CN):

简体 中文

Je préférerais déclarer (et d'autres) des tableaux constants en tant que membres privés de la classe, mais il semble PHP ne veut pas:

class constants_lang{ 

private static $langNames = Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English")); 

static function getLangName($code){ 
    return self::$langNames($code); 
} 

} 

Résultats dans:

Parse error: syntax error, unexpected '(', expecting ')' in /site/http/includes/classes/constants/lang.php on line 20 

Dois-je pendre ma tête basse et aller ba ck au tableau global, ou y a-t-il une autre meilleure façon pour moi d'avoir un tableau 'constant' à utiliser de cette manière?

* Les clés du tableau sont à partir de la table de base de données des codes linguistiques de stockage et si nous avons une traduction de l'interface utilisateur:

code  ui translation 
zh_CN  1 
en_GB  1 
zh_TW  0 
     .... 

Solution

class constants{ 

    private $langNamesFromCode; 

    function __construct() 
    { 
      $this->langNamesFromCode = $this->initLangNamesFromCode(); 
    } 

    /* INIT */ 

    private static function initLangNamesFromCode() 
    { 
      return Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English")); 
    } 

    /* GETTERS */ 

    public static function getLangNameFromCode($code) 
    { 
      if(self::isStatic()){ 
       $langNamesFromCode = self::initLangNamesFromCode(); 
       return $langNamesFromCode[$code]; 
      } 
      else{ 
       return $this->langNamesFromCode[$code]; 
      } 
    } 

    /* UTILITY */ 

    private static function isStatic() 
    { 
      return !(isset($this) && get_class($this) == __CLASS__); 
    } 
} 
+0

Voir [cette question] [1] pour une alternative. YMMV. [1]: http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables – johndodo

Répondre

2

Oui, vous ne pouvez utiliser (plus) littéraux dans les initialisations de variables.

Le travail autour est quelque chose comme:

class A { 
    private $var; 
    public function init() { 
     $this->var = func(); 
    } 
} 
A::init(); 
+0

Would fait ce préférable d'utiliser un tableau global? –

+0

@Mich je dirais oui. – Artefacto

+0

Mis à jour ma question avec la solution tirée de votre réponse. Merci. –

0

Vous fonctions catifs d'utilisation dans les déclarations de membres. Si vous avez besoin de le faire, déplacez-le vers le constructeur ou une fonction statique.