Archief - PHP: multi-talen website opzetten

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Bengie

Legacy Member
Heeft er iemand een idee of een site met info over hoe je in PHP een "multi-lingual" site kan maken.

nu heb ik twee directories op mijn site gemaakt en dus eigenlijk alles twee keer gemaakt: 1x in t Nederlands en 1x in 't Engels (in html)
op de home page kan je dan klikken op een Engels of een NL-vlagje met dus de verwijzing naar http://www.mijnsite.be/dutch/index.html of http://www.mijnsite.be/eng/index.html

Ik ga de site opnieuw schrijven in PHP ipv HTML en ook volledig volgens de w3c normen voor CSS en XHTML en dus voor ik verder ga coden zou ik willen weten hoe ik dat kan doen voor ik overbodig werk ga doen.

grtz

orez

Legacy Member
met XML gaan werken :)

dan bepaalde "tags" binnen XML definenen, die tags oproepen en de waarde van die tags laten parsen op je pagina. (zo werkt vBB hier bv ook )

Bengie

Legacy Member
ge hebt toevallig ook ni een link met meer info hoe ik dat kan doen ? :$

Ik ben nog al ne snelle leerder dus eens ik op weg ben kan ik wel mijn plan trekken

WHiSPy

Legacy Member
Het algemene buzzword rond hetgeen gij wilt is internationalization of i18n. Vooral met die afkorting gaat ge veel websites vinden die het concept bespreken en hoe anderen het geïmplementeerd hebben. De manier waarop het in java gedaan wordt is bv: filename_NL.properties en die wordt dan ingeladen als ge brower teruggeeft dat jouw taal in 't Nederlands staat. :)

Tyfius

Legacy Member
www.my.tld/index.php/nl/pagename/subpagecontent/...
Zo ziet bij mij een url er uit. In de index.php bepaal ik dan al de argumenten die erop volgen en volgens een vast verloop.
1 = taal (nl in dit geval)
2 = paginaid of paginanaam -> opzoeken in de database, where languageid = id van nl uit de tabel languages
3 = subpagecontent
4...
bvb index.php/nl/guestbook/view/page=10/itemsperpage=20/...

Ik gebruik ook wat XML voor een aantal "always needed variables", zoals de titel van de site, het copyright statement, ... dingen die op elke pagina staan, verschillen van taal tot taal en onnodig in een databank dienen te staan. Het uitlezen van een XML bestand gaat namelijk ook zeer sneller dan het verbinden met een databank en het uitvoeren van queries.

Mulle

Legacy Member
Overal waar tekst staan in de code vervang ik door de volgende functie: "language('form_naam', MODULE, LANG)". Als je meer uitleg wilt, dan post ik die wel. Is gewoon een voorbeeldje hoe ik het doe.


Dit is de code:
PHP:
<?php
$LangModule = NULL;
$LangType = NULL;
$LangText = NULL;
$LangSet = false;

function language($Text, $Module, $Lang){
	Global $LangText, $LangXml;
	
	$RootXml = "lang/".$Lang.".xml";
	
	if(!isset($LangXml['root']) && file_exists($RootXml)){
		$LangText = languageXml($RootXml);	
		$LangXml['root'] = true;
	}
	elseif(!file_exists($RootXml))
		trigger_error("Cannot find root XML language file: ".$Lang, E_USER_WARNING);	
	
	if($Module <> "root"){
		$ModuleXml = MODULE_DIR."/".$Module."/lang/".$Lang.".xml";
		
		if(!isset($LangXml[$Module]) && file_exists($ModuleXml)){
			$LangText = languageXml($ModuleXml);		
			$LangXml[$Module] = true;
		}
		elseif(!file_exists($ModuleXml))
			trigger_error("Cannot find module XML language file: ".$Lang, E_USER_WARNING);
	}

	if(isset($LangText[$Module."_".$Text]))
		return $LangText[$Module."_".$Text];
	else
		trigger_error("Cannot find language text: ".$Text, E_USER_NOTICE);
}	
 
function languageXml($Lang){
	global $LangTextP;
	
	$parser = xml_parser_create('ISO-8859-1');
	xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
	xml_set_element_handler($parser, 'startElement', 'endElement');
	xml_set_character_data_handler($parser, 'characterData');
	xml_parse($parser, file_get_contents($Lang));
	xml_parser_free($parser);
	
	return $LangTextP;
}
 
function startElement($parser, $elementname, $attrs){
	global $LangModule, $LangType, $LangText, $LangSet;

	$Type = array(
		"nav" => "nav",
		"temp" => "temp",
		"form" => "form",
		"log" => "log",
		"w" => "w",
		"txt" => "txt",
		"email" => "email",
		"error" => "error"	
	);


	if($elementname == "language" && isset($attrs['module']))
		$LangModule = $attrs['module'];
	elseif(in_array($elementname, $Type))
		$LangType = $elementname;		
	else{
		$LangText = $elementname;
		$LangSet = true;
	}
}
 
function endElement($parser, $elementname){
	global $LangModule, $LangType, $LangText, $LangSet;
	
	if(empty($LangText)){
		echo "error element ". $elementname;
	}
	
}
 
function characterData($parser, $characters){
	global $LangModule, $LangType, $LangText, $LangTextP, $LangSet;
	
	if($LangSet && !empty($LangModule) && !empty($LangType) && !empty($LangText)){
		$LangTextP[$LangModule."_".$LangType."_".$LangText] = $characters;
		$LangSet = false;
	}
}
?>

Dit is een voorbeeld van een XML file:
HTML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<language module="root">
	<nav>
		<controle_paneel>Controle paneel</controle_paneel>
	</nav>
	<form>
		<reageer>Plaats reactie</reageer>
		<verplichtevelden>Verplichte velden</verplichtevelden>
		<bewerk>Bewerk reactie</bewerk>
	</form>
	<temp>
		<banner>Advertentie</banner>
		<hoofdnavigatie>Hoofdnavigatie</hoofdnavigatie>
		<nietactief>Niet actief</nietactief>
		<gebannen>Gebanned</gebannen>
		<lid>Lid</lid>
		<beheerder>Beheerder</beheerder>
		<medewerker>Medewerker</medewerker>
		<sitebericht>CK</sitebericht>
		<berichten>Berichten</berichten>
		<datum>Datum</datum>
		<gepostop>Gepost op</gepostop>
		<doorsturen>Doorsturen</doorsturen>
		<reply>Reply</reply>
		<quote>Quote</quote>
		<bewerken>Bewerken</bewerken>
		<verwijderen>Verwijderen</verwijderen>
		<bijlage>Bijlage</bijlage>
		<reageer>Reageren</reageer>
		<reacties>Reacties</reacties>
		<geenreacties>Er zijn nog geen reacties geplaatst.</geenreacties>
		<navigatie></navigatie>
		<pagina>pagina</pagina>
		<paginas>pagina's</paginas>
	</temp>
	<w>
		<online>Online</online>
		<offline>Offline</offline>
	</w>
</language>

killgore

Legacy Member
ik zou een template-systeem zoeken met ingebouwde lang-support dan.

edit: fyi: xml is hier gewoon een opslagmedium, niet de methode, mensen blijken dat nogal eens te vergeten als ze over het wonderbaarlijke xml praten :ironic:.

orez

Legacy Member
killgore zei:
ik zou een template-systeem zoeken met ingebouwde lang-support dan.

edit: fyi: xml is hier gewoon een opslagmedium, niet de methode, mensen blijken dat nogal eens te vergeten als ze over het wonderbaarlijke xml praten :ironic:.

ja maar wel het beste opslagmedium in dit geval :p

WHiSPy

Legacy Member
orez zei:
ja maar wel het beste opslagmedium in dit geval :p

Niet noodzakelijk. In java gebruiken ze bv properties-files die 'n key-value waarde hebben. Dus het zou als volgt gaan:

control_panel=Controle paneel
reageer=Plaats reactie

etc etc

Bij 'n xml-file kan je forever beginnen klooien als je 'n grote site hebt en je hebt 'n foutje gemaakt. :)

servi

Legacy Member
orez zei:
ja maar wel het beste opslagmedium in dit geval :p


waarom ? vertalingen zijn bij mijn weten nog steeds niet genest maar plat. Een platte tekststructuur ( zoals een properties-file) lijkt me dan ook veel logischer dan hiervoor XML te gebruiken.

dJeez

Legacy Member
WHiSPy zei:
Niet noodzakelijk. In java gebruiken ze bv properties-files die 'n key-value waarde hebben.
Het PHP (nu ja Unix based) equivalent daarvan zijn de gettext functies. Op basis van je source creëert die een bestand dat je vervolgens kan gebruiken om vertalingen te maken. Het leesbare formaat dient echter wel eerst omgezet te worden naar een binair formaat alvorens het gebruikt kan worden in scripts.

Er zijn verschillende tutorials te vinden over hoe dat in z'n werk gaat, voor een snelle introductie kan je het volgende artikel doornemen : http://www.onlamp.com/pub/a/php/2002/06/13/php.html

Bengie

Legacy Member
bedankt gasten voor de uitgebreide uitleg en de vele opties...

ik zal als ik uiteindelijk de vertalingen ga toepassen jullie nog laten weten welke oplossing ik heb gebruikt.

in ieder geval bedankt voor de behulpzaamheid en de uitstekende service
:applause:
grtz
b.

KoenDK

Legacy Member
ik ben niet echt mee hoor

gaat dit artikel
http://www.onlamp.com/pub/a/php/2002/06/13/php.html
over het vertalen van uw content?

ik bezit reeds over de correcte vertalingen van alle teksten en wil deze in een site steken

die vertalingen van strings , en dus de content, die zijn toch nooit 100% correct?


kan er iemand een URL geven waarin staat uitgelegd hoe je een 3talige website opzet,
wanneer je reeds bezit over alle artikels?

cfr.


http://www.website.be/nl/article19.php
http://www.website.be/fr/article34.php
http://www.website.be/en/article45.php

en dus

wanneer de gebruiker op
http://www.website.be/en/article45.php
zit
en klikt op nl
dat die dan wordt geredirect naar
http://www.website.be/nl/article19.php


:s :s :s :s

dJeez

Legacy Member
KoenDK zei:
ik ben niet echt mee hoor

gaat dit artikel
http://www.onlamp.com/pub/a/php/2002/06/13/php.html
over het vertalen van uw content?
Het gaat over internationalisatie (i18n) van websites op een gestandaardiseerde manier via gettext. Je gebruikt dat uiteraard NIET voor de inhoud (artikels) van je website, maar wel voor labels, foutmeldingen, vaste meldingen, ... die vertaald dienen te worden.

De imho makkelijkste manier om multi-taal te werken voor de inhoud is elk artikel een unieke ID geven, en daarnaast per gewenste taalversie een record bij te houden (dus een samengestelde sleutel : artikel ID + taal ID). Op die manier volstaat het om simpelweg de (virtuele) taalfolder te wijzigen om te wisselen tussen de taalversies.

vb. /nl/artikels/1 -> /fr/artikels/1 -> /en/artikels/1 -> /ru/artikels/1

Via mod_rewrite kan je die URLs herschrijven naar iets van de vorm : /artikels.php?lng=taalID&nr=artikelID

-fusi0n-

Legacy Member
ik vind nergens hoe je in je html/php bestand je dan de juiste taal opvraagt vanuit het XML bestand?

Ik vind hier eigenlijk bizar weinig informatie over (multilingual website xml, oid)
Misschien iemand een goeie referentie?

Ik begrijp dat je de verschillende talen in een XML bestand schrijft met bepaalde tags, maar hoe toon je die dan op je pagina zelf?

Ook staat er in het voorbeeld van Mulle telkens 1 woord, kan je ook hele artikels binnen zo'n tag opslaan? En werkt bijvoorbeeld <br /> binnen die tag?

Graag meer info

orez

Legacy Member
-fusi0n- zei:
ik vind nergens hoe je in je html/php bestand je dan de juiste taal opvraagt vanuit het XML bestand?

Ik vind hier eigenlijk bizar weinig informatie over (multilingual website xml, oid)
Misschien iemand een goeie referentie?

Ik begrijp dat je de verschillende talen in een XML bestand schrijft met bepaalde tags, maar hoe toon je die dan op je pagina zelf?

Ook staat er in het voorbeeld van Mulle telkens 1 woord, kan je ook hele artikels binnen zo'n tag opslaan? En werkt bijvoorbeeld <br /> binnen die tag?

Graag meer info

tuurlijk kunt ge daar meerdere lijnen tekst laten opslaan, maar zo nuttig is dat niet, die single words, das vooral om uw menu op te bouwen, en taal kiezen, ofwel via keuzeknoppen, ofwel headers van uw browser ophalen, uw browser staat meestal in een taal opgesteld.. EN/NL/FR/ ...

Voor grotere berichten zoals nieuwsberichten gebruik je imo nog altijd beter een database :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan