Ik ben eens aan het nadenken over hoe je het beste een meertalige website kunt maken.
Wat zou het beste zijn om een onderscheid te maken in de taal? Ik denk dat URL's of subdomeinen de beste oplossing zijn en het gebruik van $_SESSION- of $_GET-variabelen best achterwege laten voor de taalkeuze. Bijvoorbeeld:
De talen zelf, woorden en zinnen: ik heb eens voor een kameraad een osCommerce-webshop moeten uitbreiden en die was ook meertalig. Alle woorden en zinnen werden opgeslagen in verschillende mappen (per taal) in verschillende PHP-bestanden, waar ze gedefinieerd worden als constanten, in de vorm van TEXT_USERNAME, TEXT_EMAIL_ADDRESS, TEXT_ERROR_PASSWORD_TOO_SHORT, etc.
Vervolgens werden die constanten weergegeven in de HTML-code. Zo kon de taal in één klap veranderd worden door de constanten uit een andere "taalmap" te halen.
Zou je dit ook kunnen vervangen door een systeem met een database? Of is dit een beetje overkill, want het worden al gauw veel woorden en zinnen en dan krijg je na verloop van tijd wel een enorme tabel als je ze er bijvoorbeeld 3 keer in een andere taal moet in zetten. Voordeel is natuurlijk wel dat je dan een mooie interface kunt maken om de woorden/zinnen te veranderen.
Jij raad sessions of get af. Met de site waar ik nu mee bezig ben werk ik echter wel met sessions. Waarom zou je dit niet doen? Als de sessie niet bestaat maak je hem automatisch en dus er staat altijd een taal en verder zitten er geen nadelen aan sessies hiervoor gebruiken vind ik.
Alle woorden/zinnen heb ik opgeslagen in de databasae. 3 velden: id, en, nl. id is gewoon auto_increment. En in de andere velden staat gewoon de nederlandse en engelse vertalingen naast elkaar. Op de index pagina lees ik alles uit dmv een while en plaats alles in een array. Met als key het id en als value het woord/zin wat weer afhangt van de value in de sessie. En waar het nodig is lees ik gewoon de array uit als volgt: <?= $language[1] ?> En als id 1 bijvoorbeeld dit is: House - Huis. Krijg je afhankelijk van de sessie House of Huis terug, maar dat spreekt voor zich
Dit werkt perfect bij mij en als je nou duits erbij wilt dan voeg je een extra veld toe met de naam de en dan gooi je daar de duitse vertalingen neer.
Waarom geen $_GET
Lastig als je bij elke pagina een $_GET-variabele moet opgeven in de URL en slecht voor zoekmachines, omdat ze pagina's met veel $_GET-variabelen niet indexeren. Op deze manier heb je dan op elke pagina al minstens 1 $_GET-variabele.
Waarom geen $_SESSION
Slecht voor zoekmachines. Stel dat je een pagina home.php hebt, met inhoud in 3 talen, afhankelijk van een $_SESSION-variabele. Dit wordt lastiger voor zoekmachines om alle 3 de talen te indexeren. (Ik heb altijd gelezen dat sessies niet goed zijn voor zoekmachines.)
Ik denk dat beide moet kunnen:
met sessions werken, waarbij je de taal dmv PHP wijzigt. Verder kan je met (indien Apache) mod_rewrite de taal uit de url halen: http://www.domein.be/taal/... wordt www.domein.be/index.php?taal=taal&var=...
Je hebt de voordelen van sessions en een gebruiker heeft direct zijn voorkeurstaal als hij de juiste url in zijn favorieten zet.
@sweepee, dat over sessies is onzinnig want je kan het omzeilen door het volgende te doen.
Je maakt een sitemap en daar gooi je zowel de nederlandse als engelse links in. Als je daar op een link klikt maak je een cookie aan met de taal van de link. Is die cookie gelijk aan de sessie doe je niets, is die niet gelijk maak je hem de taal van de link. Zo kan je zowel nederlandse als engelse talige pagina's hebben
Nee, want dan heeft je site ook een link naar een duitse home, en een franse. De zoekmachine vindt dus 3 keer dezelfde pagina met een andere inhoud. Die ziet niet dat het een andere taal is volgens mij..
Maar is het niet een idee om met templates te werken? De meeste tekst in een website is toch statisch. Dan ben je ook minder geneigd om de tekst kort te houden.
Nee, want dan heeft je site ook een link naar een duitse home, en een franse. De zoekmachine vindt dus 3 keer dezelfde pagina met een andere inhoud. Die ziet niet dat het een andere taal is volgens mij..
waarom zouden er drie links naar die pagina bestaan?
Stel: de bezoeker komt op je website, op home.php: er is een een standaardtaal(edit: een zoekmachine die dan op je website komt, krijgt de website alleen maar in de standaardtaal en niet in drie verschillende talen!) ingesteld bv. engels, maar de bezoeker is nl, dus dan klikt hij op "nl" en de site wordt in nl weergegeven en hij krijgt een sessie toegewezen die de taal "nl" opslaat. Aan de hand van die sessie wordt op de andere pagina's en ook op home.php, de taal gekozen uit de db en zal er dus elke keer maar één taal zijn en geen 3 verschillende links naar de pagina, want zoiets:
home.php?lang=nl, home.php?lang=en, home.php?lang=du heb je dan niet nodig omdat je met sessies werkt.. (en ik denk dat jij dat bedoelde als die drie verschillende links?)
Ik zou het op volgende manier doen:
als de bezoeker op index.php komt, krijgt hij een keuze van taal, tenzij hij al eens in deze sessie een taal heeft geselecteert, dan word hij doorgestuurd naar home.php, die de taal uit de sessie haalt. Als de gebruiker nog geen taal heeft geselecteert krijgt hij de keuzes. De gebruiker word navenant zijn keuzes doorgestuurt naar de home.php pagina met een $_GET. In de home.php pagina staat in PHP en script dat controleert of de gebruiker al een sessie heeft staan en of er een $_GET aanwezig is. Is dit niet het geval, word hij doorgestuurd naar index.php voor een taal te kiezen, is dit wel het geval, dan ziet hij welke taal er in de $_GET staat, en maakt hiermee een sessie aan, het enige wat je dan moet doen om de taal te veranderen is een link maken naar home.php?lang=en ofzo en dan veranderd hij ook ineens de session. Dus een combinatie van de 2:
een GET voor de taal in te stellen/veranderen en een session voor de taal bij te houden.
En language_code in elke URL als eerste "map" laten verschijnen. Dan de hiërarchie van "mappen" vanaf daar opbouwen. Want met sessies heb je nog één (klein) nadeel: je kan nooit absolute URL's creeëren naar pagina's die meteen in de correcte taal staan (tenzij de gebruiker de website al eerder bezocht). Vervolgens de teksten als constanten definiëren (key_name) met de bijhorende waarde voor de gevraagde taal (text_value).