2010-03-30 8 views
2

Jusqu'à présent, j'ai maintenu une table « dictionnaire » dans ma base de données, par exemple:Comment dois-je transmettre le texte traduit à mon objet dans mon application multilingue?

+-----------+---------------------------------------+-----------------------------------------------+--------+ 
| phrase | en         | fr           | etc... | 
+-----------+---------------------------------------+-----------------------------------------------+--------+ 
| generated | Generated in %1$01.2f seconds at %2$s | Créée en %1$01.2f secondes à %2$s aujourd'hui | ... | 
| submit | Submit...        | Envoyer...         | ... | 
+-----------+---------------------------------------+-----------------------------------------------+--------+ 

Je vais ensuite sélectionner toutes les lignes de la base de données pour la colonne qui correspond à la locale qui nous intéresse (ou lire le cache d'un fichier pour accélérer la recherche db) et vider le dictionnaire dans un tableau appelé $lng.

Alors, je vais avoir des objets d'aide HTML comme celui-ci, à mon avis:

$html->input(array('type' => 'submit', 'value' => $lng['submit'], etc...)); 
... 
$html->div(array('value' => sprintf($lng['generated'], $generated, date('H:i')), etc...)); 

Les traductions peuvent apparaître au format PDF, XLS et réponses AJAX aussi.

Le problème avec mon approche est si loin que j'ai maintenant des charges de global $lng; dans toutes les classes où il y a une fonction qui recrache le code de l'interface utilisateur ..

Comment les autres gens de la traduction dans l'objet? Est-ce un scénario où les globals ne sont pas vraiment mauvais? Serait-ce folie de créer une classe avec des accesseurs quand les termes du dictionnaire sont tous statiques?

Addendum

Comme je l'ai une classe HTML, une classe PDF, une classe JSON, etc, qui ont tous le dictionnaire comme une dépendance, est-ce une situation dans laquelle je pourrais utiliser l'injection de dépendance dans un Lng classe pour le rendre plus facile à tester différentes traductions?

Répondre

2

En tant que solution rapide et simple il suffit de faire lng une fonction:

$html->input(array('type' => 'submit', 'value' => lng('submit'), etc...)); 

Une autre pensée: si vous utilisez des aides html, pourquoi ne les rend pas au courant de i18n, de sorte que vous pouvez simplement passer un ID de chaîne, comme

$html->input(array('type' => 'submit', 'value' => '@submit', etc...)); 

et en entrée() fonction remplace '@xxx' avec 'lng (xxx)'

également gettext pourrait être une option.

+0

Beaucoup plus bénéfique que d'utiliser 'global'. –

+0

Si 'lng' devient une fonction globale, alors il doit sûrement chercher la base de données à chaque requête, ou référencer un tableau ** global ** depuis un autre endroit ... Comment' lng() 'serait-il implémenté sinon? – boatingcow

+0

@boatingcow - si un global est connu et référencé dans une seule fonction, je ne vois rien de mal à cela, mais j'utiliserais une variable statique dans ce but. – user187291