Sprog i Smarty
I forlængelse at mit forrige indlæg vil jeg komme med nogle idéer til hvordan man kan tilføje sprogsupport i Smarty.
Det jeg gerne vil ende med er en løsning hvor jeg i mine templates kan skrive noget lignende:
1 | <h1>{translate}Welcome to my site{/translate}</h1> |
Men også
1 | <title>{$title|translate}</title> |
Jeg vil også kunne angive sproget direkte, fx:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <html> <head> <title>{$title|translate:"fr"}</title> </head> <body> <h1>{translate lang="fr"}Welcome to my site{/translate}</h1> </body> </html> |
Jeg vil aldrig kalde Smarty direkte, men altid via min egen klasse som extend’er Smarty. Det gør det bl.a. nemmere at sætte diverse indstillinger op. I min egen klasse vil jeg, for at understøtte sprog, tilføje en block og en modifier. Det gør jeg på følgende måde:
1 2 3 4 5 6 7 8 | class mbnSmarty extends Smarty { public function __construct() { $this->register_modifier('translate', 'smarty_m_translate'); $this->register_block('translate', 'smarty_b_translate'); } } |
Bagefter skal jeg skrive de to funktioner hhv. smarty_b_translate og smarty_m_translate.
1 2 3 4 5 6 7 8 9 10 11 12 13 | function smarty_b_translate($args, $str, &$smarty, &$repeat) { if (!$repeat) { $text = new Text(); $text->setText($content); return $text->translate($args['lang'] ? $args['lang'] : LANG); } } function smarty_m_translate($str, $lang = LANG) { $text = new Text(); $text->setText($str); return $text->translate($lang); } |
Jeg har i mine eksempler gået ud fra, at der er defineret en LANG-konstant på følgende måde:
1 | define("LANG", "da"); |
Jeg bruger også en Text-klasse, som I selv må lave :)
Sprogstyring via mod_rewrite
En lille idé til hvordan man kan styre sprog via Apaches mod_rewrite.
Normalt definerer jeg en konstant ved navn URL der indeholder den absolutte adresse til forsiden af mit website. Fx:
1 | define("URL", "http://www.example.com"); |
Hver gang jeg skal linke i HTML/Smarty eller sende videre via PHP bruger jeg konstanten.
Nu vil jeg tilføje sprog som et ekstra “lag” på mine adresser, så jeg fremover kalder example.com/en/about.php for den engelske udgave, og example.com/fr/about.php for den fanske udgave af about.php; men jeg vil ikke have to versioner af about.php liggende.
Derfor laver jeg en lille rewrite-regl der omskriver førnævnte adresser til example.com/about.php?lang=en og example.com/about.php?lang=fr.
Reglen kan ses herunder. Bemærk at jeg kun checker på to a-z og ikke på de tilladte sprog. Det burde man måske gøre.
1 2 | RewriteEngine On RewriteRule ^([a-z]{2})/(.*)$ $2?lang=$1 [QSA] |
Jeg tilføjer QSA som betyder query string append, hvilket gør at eventuelle andre parametre til siden stadig kommer med.
Næste trin bliver at lave noget PHP der behandler ovenstående. Jeg vil typisk sætte min URL-konstant på i en header-fil der bliver inkluderet på alle sider. Før jeg definerer min konstant, laver jeg et check på $_GET['lang'] for at se om den er på listen over tilladte sprog. Er den det liver den tilføjet til konstanten, og på den måde vil alle mine linke indeholde sprogangivelsen.
1 2 3 4 5 6 7 8 9 | $valid_languages = array("en", "de", "fr", "da"); if (in_array($_GET['lang'], $valid_languages)) { define("URL", "http://www.example.com/".$_GET['lang']); } else { define("URL", "http://www.example.com"); } |
Det kan måske være meget smart at have to konstanter til URL’en. Én med sprog, og en uden, da det ikke er alle steder man vil angive sprog – fx billeder, stylesheets og javascript m.m.

Jeg hedder Morten, og jeg har udviklet webapplikationer siden slutningen af 90'erne.