Discussie: hoe maak je een meertalige website.
Hoe zou jij het willen?
Beargumenteer je antwoord duidelijk!
Mijn voorkeur gaat uit naar de volgende oplossing:
- Eerst in een database de gekozen taal opslaan (nl, dui, en)
- Vervolgens de volgende mappen en pagina's aan te maken.
talen/
taalnl.php
taaldui.php
taalen.php
Vervolgens zou ik per bestand de volgende regels plaatsen:
taalnl.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$taalIndexWelkom = "Goeden morgen!";
/*
De naam van de variabele:
taal <- om aan te geven dat het een taal variabele is, die je dus niet op andere pagina's moet gaan benoemen.
Index <- om aan te geven op welke pagina deze variabele gebuikt wordt.
Welkom <- om aan te geven over wat voor bericht het gaat.
*/
?>
$taalIndexWelkom = "Goeden morgen!";
/*
De naam van de variabele:
taal <- om aan te geven dat het een taal variabele is, die je dus niet op andere pagina's moet gaan benoemen.
Index <- om aan te geven op welke pagina deze variabele gebuikt wordt.
Welkom <- om aan te geven over wat voor bericht het gaat.
*/
?>
taaldui.php
taalen.php
Vervolgens in je index.php het volgende te plaatsen:
Argumentatie:
Ik vind het zelf erg fijn als de taal bestanden in dezelfde map staan, wel gescheiden van de index map. Zodat het duidelijker is welke bestanden de taal bestanden zijn.
Ik vind het overzichtelijker als je per taal een apart bestand aanmaakt i.p.v. alle talen in één bestand te plaatsen.
- min punten -
- Als je een variabele in een bestand 'per ongeluk' verkeerd benoemd moet je eerst met de andere taal pagina's vergelijken wat de goede is.
- Je gebruikt nu meerdere bestanden terwijl het ook in één map kan.
en.properties
Code (php)
1
2
3
4
5
2
3
4
5
welkom.tekst=Welcome
inloggen=Login
inloggen.title=Log in here
registreren=Register
registrere.title=Register here
inloggen=Login
inloggen.title=Log in here
registreren=Register
registrere.title=Register here
zoiets
Edit: ik doe zoiets liever niet in een .php file omdat ik vind dat dit niks met php te maken heeft. Deze situatie heb je in elke programmeer taal, vandaar dat ik liever een aparte configuratie file gebruik. Precies hetzelfde voor bijvoorbeeld database settings of het opslaan van verschillende routes
Gewijzigd op 31/12/2012 11:36:07 door Moose -
Dan in antwoord op het voorstel van Tom, dat lijkt me alleen mogelijk voor een zeer kleine, statische website. Zodra je meer content gaat gebruiken dat ook nog eens van veel variabele input afhankelijk is is het niet meer te doen. Zo ga je veel te veel variabelen aanmaken en is ook je code totaal onleesbaar geworden. Denk ook nog eens aan het feit dat als je variabele input in je tekst wil hebben (bijvoorbeeld de naam van de gebruiker, een aantal, een datum etc) en het is bijna helemaal niet meer te doen. De zinsopbouw in verschillende talen is namelijk anders waardoor je niet zo makkelijk de strings kan uitwisselen.
Vervolgens gebruik ik de Symfony2 Translation component:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// ...
// haal deze eventueel ergens op, bijv. uit een sessie
define('USER_LOCALE', 'nl');
// stel de translator in
$translator = new Translator(USER_LOCALE);
$translator->setFallbackLocale('en'); // mocht de vertaling niet beschikbaar zijn in de USER_LOCALE, gebruik dan engels
$translator->addLoader('yaml_file', new YamlFileLoader()); // voeg een loader toe, je hebt beschikking tot erg veel loaders: https://github.com/symfony/Translation/tree/master/Loader
// laad resources in
$translator->addResource('yaml_file', 'path/to/translation/messages.nl.yml', 'nl');
$translator->addResource('yaml_file', 'path/to/translation/messages.en.yml', 'en');
// ...
?>
// ...
// haal deze eventueel ergens op, bijv. uit een sessie
define('USER_LOCALE', 'nl');
// stel de translator in
$translator = new Translator(USER_LOCALE);
$translator->setFallbackLocale('en'); // mocht de vertaling niet beschikbaar zijn in de USER_LOCALE, gebruik dan engels
$translator->addLoader('yaml_file', new YamlFileLoader()); // voeg een loader toe, je hebt beschikking tot erg veel loaders: https://github.com/symfony/Translation/tree/master/Loader
// laad resources in
$translator->addResource('yaml_file', 'path/to/translation/messages.nl.yml', 'nl');
$translator->addResource('yaml_file', 'path/to/translation/messages.en.yml', 'en');
// ...
?>
Code (php)
1
2
3
4
5
6
2
3
4
5
6
# path/to/translation/messages.nl.yml
index:
greet:
guest: Welkom
user: Hallo %name%!
# ...
index:
greet:
guest: Welkom
user: Hallo %name%!
# ...
Code (php)
En deze heeft nog veel meer opties, zoals omgaan met telwoorden.
Ik doe het altijd via de database. De eindgebruiker kan dan zelf (middels een module) de vertalingen beheren.
zou je daar eens een voorbeeld van kunnen geven hoe je met die database werkt, is dat dan niet onhandig om de code aan te passen?
Ik werk op basis van een view helper die de codes replaced met de values uit de database.
Dat van die database (hoe ziet die er uit)
en hoe werk je er dan mee stel je moet de tekst "welkom op deze site" in het Nederlands en het engels hebben, hoe ziet je database er dan uit en hoe ziet je code er dan uit?
sorry vindt het wel eens interessant.
PHP knipper, als ik 2 grote CMS systemen neem die deze problemen oplossen (Joomla! en Symfony CMF), dan lossen die het allebei op door de artikelen volledig in 2 talen te maken. Je hebt dus artikel A die in het nederlands is en vervolgens heb je artikel B voor het engels. Hoe dit precies in hun database eruitziet weet ik niet.
Gewijzigd op 31/12/2012 14:20:35 door Wouter J
[paginanaam]
string=tekst
bijv:
[login]
password="Wachtwoord"
sla het ini bestandje op onder nl/NL/nl-NL.ini
bij gebruik van de functie translate("login", "password") wordt in de sessie de taal opgehaald die ingesteld is door de browser of door de gebruiker en de bijbehorende translation.ini. sla die op in $_GLOBALS["cache"]["translation"]["nl-NL"] en je hoeft die niet steeds in te laden...
Toevoeging op 31/12/2012 15:07:07:
Henze Berkheij op 31/12/2012 15:05:49:
Ik heb het in een eerder draadje al genoemd. wat ik doe is gebuik maken van parse_ini. die leest ini files uit. werkt veel sneller dan met een database en een format is al grotendeels aanwezig.
[paginanaam]
string=tekst
bijv:
[login]
password="Wachtwoord"
sla het ini bestandje op onder nl/NL/nl-NL.ini
bij gebruik van de functie translate("login", "password") wordt in de sessie de taal opgehaald die ingesteld is door de browser of door de gebruiker en de bijbehorende translation.ini. sla die op in $_GLOBALS["cache"]["translation"]["nl-NL"] en je hoeft die niet steeds in te laden...
[paginanaam]
string=tekst
bijv:
[login]
password="Wachtwoord"
sla het ini bestandje op onder nl/NL/nl-NL.ini
bij gebruik van de functie translate("login", "password") wordt in de sessie de taal opgehaald die ingesteld is door de browser of door de gebruiker en de bijbehorende translation.ini. sla die op in $_GLOBALS["cache"]["translation"]["nl-NL"] en je hoeft die niet steeds in te laden...
Voordeel is namelijk dat alles via disk sowieso sneller verloopt dan via database.