Jeg har i en årrække vedligeholdt sites med flersproget indhold. Det har ledt til en del problemer og tilhørende løsninger, men findes der andre alternativer?
For en del år siden byggede jeg mit første website der skulle været “let” at vedligeholde. Én af parametrene var at jeg ikke skulle ind i en CMS-skabelon for at ændre sætninger og ordlyd i statisk indhold. Sidenhen har denne egenskab udviklet sig og er blevet til mit “system” til at skabe og vedligeholde sprog-uafhængige websites i flere forskellige kontekster.
De fleste websites jeg har arbejdet med er opbygget omkring en HTML-template der bliver populeret af to ting:
- Brugergenereret indhold (skal ikke oversættes)
- Systemgenereret indhold (skal kunne oversættes)
At arbejde med en HTML-template som fundament og lade systemet HTML-siden med både brugergenereret indhold og systemgenereret indhold baseret på tags i HTML-templaten.
“Systemet” er basalt set ikke er et system, men mere en grundtanke eller et design mønster, som jeg har rafineret og finjusteret baseret på behov og erfaringer gjort gennem årene. Rent evolutionært har det været gennem følgende livscyklus:
- Kodedrevet: Sprog og indhold til systemgenereret indhold var indlejret, direkte i kodefilen. Dette gav hurtig udførsel af koden, men var vanskelig at vedligeholde over tid.
- Databasedrevet: Sprog og indhold til systemgenereret indhold var gemt i tabeller i en databasen. Dette gav hurtig og let ændring af sprog samt let vedligehold af flere sprog-varianter. En ulempe var dog at systemet skulle lave mange opslag i databasen per sidevisning hvilket gav dårlig performance.
- Fildrevet: Sprog og indhold til systemgenerert indhold var gemt i sprogfiler sammen med kildekoden. Dette gav, igen, hurtig udførsel af kode og forholdsvis let ændring af sprog samt forholdsvis let vedligehold af flere sprog-varianter.
Fælles for alle løsninger er at de fungerer til en vis grænse. Det kræver stor omhu at vedligeholde sprogfilerne og ikke lade sig friste af at indlejre front-end funktionalitet, f.eks. er HTML-tags til layout acceptabel, mens Javascript er big no-go på grund af fare for at systemerne vil “drifte” fra hinanden.
I det mange af mine systemer er lavet i PHP vil jeg eksemplificere via PHP:
Kodedrevet:
<?
function do_something_nice()
{
if (evaluate_something())
{
return “Din evaluering <strong>korrekt</strong>”;
}
else
{
return “Din evaluering: <strong>ikke korrekt</strong>”;
}
}
?>
Generelt for database- og fildrevet:
<?
function do_something_nice()
{
if (evaluate_something())
{
return term(‘evalutate_false’);
}
else
{
return term(‘evaluate_true’);
}
}
?>
Databasedrevet definition af “term”:
<?
function term($t)
{
$lang = get_current_country();
return $g_db->fetch_single_field(“SELECT term FROM terms WHERE token='{$}’ AND language='{$lang}'”);
}
?>
Fildrevet definition af “term”:
<?
$terms = array(
‘evaluate_true’ => array(‘DK’=>’Din evaluering: <strong>korrekt</strong>’, ‘EN’=>’Your evaluation: <strong>true</strong>’),
‘evaluate_false’ => array(‘DK’=>’Din evaluering: <strong>ikke korrekt</strong>’, ‘EN’=>’Your evaluation: <strong>false</strong>’)
);
function term($t)
{
$lang = get_current_country();
return $terms[$t][$lang];
}
?>
Variant af fildrevet definition af “term”:
<?
$lang = get_current_country();
require_once “terms.{$lang}.php”;
function term($t)
{
return $terms[$t];
}
?>
Personligt synes jeg ikke nogen af mine løsninger er specielt brugervenlige og elegante, men hver i sær har de deres styrker. Den sidste variant af fildrevet er den der performer best, omvendt er det også den som er sværest at vedligeholde (af de to).
Hvad er jeres erfaringer – og hvad gør I? Det behøver ikke nødvendigvis at være sprogspecifikt, da jeg er på jagt efter designmønstre frem for kodeudvekskling.