2009-09-28 8 views
1

Je suis en train de faire de l'internationalisation avec gettext en PHP. Je me demandais s'il y avait des bonnes méthodes pour cet exemple:Bonne méthode pour faire du texte avec des liens dans gettext?

By using this website, you accept the <a href="<?php print($dir); ?>/tos/">Terms of Use</a>. 

Pour en_US, cette phrase suivraient un tel format. Cependant, dans une autre langue, le lien "Conditions d'utilisation" pourrait être au début de la phrase. Y a-t-il une manière élégante de faire ceci? Merci pour votre temps.

Répondre

0

Voici comment je le ferais. La phrase à traduire serait

By using this website, you accept the <a>Terms of Use</a>. 

Puis je remplacerais le lien après que la phrase soit localisée, par ex.

$str = _('By using this website, you accept the <a>Terms of Use</a>.'); 
$str = preg_replace('#<a>(.*?)</a>#', '<a href="' . $dir . '/tos/">$1</a>', $str); 

Bien sûr, vous pouvez remplacer <a> et </a> avec tout ce qui fait sens pour vous et vos traducteurs. Venez y penser, puisque vous devez échapper à votre sortie pour empêcher les traducteurs de déconner avec votre code HTML (intentionnellement ou non), je serais probablement aller avec quelque chose comme

$str = htmlspecialchars(_('By using this website, you accept the [tos_link]Terms of Use[/tos_link].')); 
$str = preg_replace('#\\[tos_link\\](.*?)\\[/tos_link\\]#', '<a href="' . $dir . '/tos/">$1</a>', $str); 
+1

Une regex intelligente, mais ... vous avez maintenant deux problèmes. http://www.codinghorror.com/blog/archives/001016.html –

+0

J'ai lu l'article ... quels sont les deux problèmes? : p – axsuul

+0

j'ai appliqué ceci et cela a fonctionné très bien! merci – axsuul

1

Pour l'internationalisation simple, je vais tout simplement créer un tableau par langue, inclure le fichier approprié, et accéder à ce tableau plutôt que de faire ce que vous faites.

fr.php:

$text = array(
    'footer' => 'By using this website, you accept the <a href="' . $dir . '/tos/">Terms of Use</a>.', 
    'welcome' => 'Welcome to our website!' 
); 

index.php:

$langdir = '/path/to/languages'; 
$lang = ($_GET['lang']) ? $langdir . '/' . $_GET['lang'] . '.php' : $langdir . '/en.php'; 
if(dirname($lang) != $langdir || !require_once($lang)) 
    exit('Language does not exist'); 

echo '<p class="footer">' . $text['footer'] . '</p>'; 

L'appel dirname() est essentiel; Dans le cas contraire, les utilisateurs n'auront pas accès à un fichier php sur votre système de fichiers.

+0

Fait quelques mises à jour de sécurité/bulletproofness. –

+0

La personne qui a posé cette question utilise déjà gettext, il ne cherche pas à passer à un autre système, en particulier un système inférieur. Il y a de nombreuses failles dans l'utilisation de gros fichiers PHP remplis de traductions et de problèmes de sécurité en permettant aux traducteurs d'éditer des fichiers PHP. Entre autres, les chaînes malformées peuvent terminer votre script ou plus spécifiquement dans le cas de traductions contenant des variables, votre système nécessite que toutes les variables possibles soient connues avant d'inclure le fichier. gettext est une méthode éprouvée, pas besoin de réinventer une roue hexagonale. –