[PHP] Multilanguage website?

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Ik wil bij een Nederlandse website de mogelijkheid geven een engelse versie weer te geven. Hoe doe ik dit het handigste? Huidige opbouw:

Mainpage met lay, die een pagina include met php.

Bijvoorbeeld "informatie.php" die wordt geinclude, als ik opgeef index.php?page=informatie

Nu had ik het volgende idee:
Ik maak 2 bestanden met informatie, informatie.en.php en informatie.nl.php.
Dan laat ik een gebruiker een taal kiezen, en zet dat vast in de sessie. Als er dan een pagina wordt geinclude, dan wordt automatisch het juiste achtervoegsel erbij gezet, en ziet de gebruiker de juiste taal.

Is dit een goede manier? Ik wil het graag met php doen, en onafhankelijk zijn van gekkigheid met bijvoorbeeld Apache. Het automatisch bepalen hoeft voorlopig niet.

thx :*)

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
ik zou gettext gebruiken.

Acties:
  • 0 Henk 'm!

  • semicolon
  • Registratie: Mei 2004
  • Niet online
Een andere directorie met daarin een, met dezelfde bestandsnaam, php bestand met daarin define's of hoe je het ook wilt afhandelen.
voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
<?
# Website file
$languageFile = basename(__FILE__);
$useLanguage = "nl";
# of in jou geval $languageFile = $_GET['page']; ofzo, ik zou
# natuurlijk wel checks uitvoeren of het bestand bestaat enzo :)
require './languages/' . strtolower($useLanguage) . '/' .  $languageFile;
echo lblWelcome;
?>

PHP:
1
2
3
4
<?
# Language file
define('lblWelcome', 'Welkom bij blablabla');
?>


Dit is een niet getest voorbeeld natuurlijk, maar zo zou je het toch kunnen afhandelen bijvoorbeeld :)
Weet niet of dit ook de beste manier is, maar overzichtelijk is het wel. (vind ik dan ;))

edit:

Wat je zelf noemt kán opzicht ook wel, maar als je alles in 1 dir zet is het zoiezo onoverzichtelijk, ik vind het zoiezo niet 'mooi' zelf om alles via 1 pagina te regelen, maar dat is weer een persoonlijke mening ;)

[ Voor 68% gewijzigd door semicolon op 28-07-2004 19:37 ]

:D/-<


Acties:
  • 0 Henk 'm!

  • FailFr8er
  • Registratie: Juli 2001
  • Laatst online: 20-09 14:25
Heeft apache niet de mogelijkheid om op basis van de language instellingen van de browser andere content aan te bieden?

Acties:
  • 0 Henk 'm!

  • Spruit_elf
  • Registratie: Februari 2001
  • Laatst online: 10-08 01:09

Spruit_elf

Intentionally left blank

^^ dacht het wel, kijk maar eens hoe ze dat ment de manual doen die erbij een clean install op staat, daar kiest ie uit verschillende paginas

nog ene idee als je alle content nu in een xml file zet en met xsl daar een php pagina van maakt oid
dan kan je alle taalgevoelige dingen in die xml file kwijt en de dingen die dat niet zijn in de xsl file

Those who danced were thought to be quite insane by those who could not hear the music.


Acties:
  • 0 Henk 'm!

  • semicolon
  • Registratie: Mei 2004
  • Niet online
Mensen, ik quote de TS even :)
Ik wil het graag met php doen, en onafhankelijk zijn van gekkigheid met bijvoorbeeld Apache. Het automatisch bepalen hoeft voorlopig niet.
Dus die oplossingen werden niet gevraagt, daarom had ik een andere oplossing voor hem gepost :)

:D/-<


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
gettext is overigens niet altijd aanwezig in PHP, dus dat zou al afvallen als de TS echt onafhankelijkheid wil. Met templates werken is misschien een optie :)

Acties:
  • 0 Henk 'm!

  • semicolon
  • Registratie: Mei 2004
  • Niet online
MisterData schreef op 28 juli 2004 @ 19:43:
gettext is overigens niet altijd aanwezig in PHP, dus dat zou al afvallen als de TS echt onafhankelijkheid wil. Met templates werken is misschien een optie :)
Templates is meer bedoeld voor de lay-out dan voor de taal, persoonlijk vind ik template's ook beter dan index.php?page=bla om de layout te beheren.

[edit]
Al is dit wel afhankelijk van het type site, soms is een snellere laadtijd van belang, en dan is een template systeem niet altijd de oplossing :)

Ik denk dat ik me vanaf nu niet meer met deze discussie bemoei omdat de TS zelf nog niet heeft gereageert en ik niet voor hem kan beantwoorden, ik leid alles maar af van de startpost ;)

[ Voor 34% gewijzigd door semicolon op 28-07-2004 19:53 ]

:D/-<


Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
Wat ik zelf heb gedaan is een directory met vertalings bestanden maken.

Een bestand zou er zo kunnen uit zien:
PHP:
1
2
3
4
5
6
7
// English.php
define("_WELCOME","Welcome on our website");
define("_MAIL","Click to send us mail");

//Nederlands .php
define("_WELCOME","Welkom op onze wensite");
define("_MAIL","Klik hier om ons te mailen");


Afhanklelijk van de browser include je het juiste bestand.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
//Juiste taal pakken
if($_SERVER['HTTP_ACCEPT_LANGUAGE'] == 'NL')
      require_once("lang/Nederlands.php");
else if([ ... ])


//Pagina output
echo "<H3>" . _WELCOME . "</H3>\n";

  [ .... ]

echo "<A HREF=\"mailto:mail@dom.ext\"> . _MAIL . "</A>\n";


De code moet natuurlijk een stuk uit gebreider, mocht je de HTTP_ACCEPT_LANGUAGE header niet kunnen herkennen dan moet bv. standaard de engelse tekst geladen worden. Een gebruiker moet ook zelf de taal kunnen kiezen, die kan je bv opslaan in een cookie.
.
Uiteraard zou je gewoon variabelen of arrays kunnen gebruiken. Ik vind defines in dit geval makkelijker omdat ze meteen globaal beschikbaar zijn, en je geen gekloot krijgt omdat je ergens mischien een variabel overschrijft.

[ Voor 22% gewijzigd door Suepahfly op 28-07-2004 22:23 ]


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Nu online

pietje63

RTFM

Wat ik nog mis (of overheen lees) in de replies is waarom het niet op zijn manier te doen, wat op zich erg makkelijk lijkt. De reden is dat als je de code/layout op een pagina aanpast je het dan meteen 2x moet doen. Verder is het toevoegen van extra talen meer werk.

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

  • DeadMetal
  • Registratie: Mei 2002
  • Laatst online: 15:00
Ik ben hier ook mee bezig voor m'n website, waar ik een engelse vertaling voor wil opzetten.

Ik werk met templates, door middel van een header en footer file. Een pagina wordt opgebouwd door aan het begin de header file te includen, vervolgens de inhoud van de pagina en daarna de footer te includen.

Ik ga het op de volgende manier op: in de header file wordt er gecheckt of de bezoekers zich op de .com of de .nl site bevind (beide domeinen zijn gekoppeld aan 1 hostingpakket) en wordt de variabele $taal aangemaakt. En in de pagina zelf wordt dan index-$taal.php geinclude, oftewel index-nl.php voor mensen op het NL domein en index-com.php voor mensen op het COM domein. En tenslotte wordt de footer file geinclude.

Acties:
  • 0 Henk 'm!

Verwijderd

Dan heb je dus twee verschillende sourcefiles voor de twee verschillende talen. En als je in ééntje een bug ontdekt, moet je die in de andere ook veranderen. En wee o wee als je dat niet doet/vergeet, of als er inconsistenties ontstaan. Een taal toevoegen is altijd meer werk, maar als je het op die manier doet wordt het ook nog eens onbeheersbaar werk.

Een include-file waarin de teksten gedefiniëerd worden lijkt mij ook het netst.


Overigens zou ik de teksten in variabelen stoppen, niet constanten, dan kun je ze automatisch laten uitbreiden in strings.

PHP:
1
2
3
4
5
  // lang/nl.php
  $lng["hello"] = "Welkom op deze site!";

  // lang/en.php
  $lng["hello"] = "Howdy y'all!";


PHP:
1
2
3
4
5
  // index.php
  $language = /* ... */ ? "en" : "nl";
  include_once "lang/$language.php";

  echo "<head>$lng[hello]</head>";


(Of, voor de taalnazi's, echo "<head>$lng['hello']</head>")

In elk geval ga je jezelf hier typwerk en ergernis mee besparen :)

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou het gewoon met dezelfde file doen, dus informatie.php en deze aanroepen als informatie.php&lan=nl of informatie.php&lan=uk

Die variabele kan je pakken in informatie.php en aan de hand van die varaiabele kan je informatie gaan tonen op het scherm.

Acties:
  • 0 Henk 'm!

  • IcE_364
  • Registratie: Februari 2002
  • Laatst online: 20-09 12:07
stekkel schreef op 28 juli 2004 @ 18:39:
ik zou gettext gebruiken.
Volgens mij leest iedereen hier overheen, maar gettextis gewoon een gigantisch handige manier om snel pagina's (of software) in meerdere talen aan te bieden. :)

Acties:
  • 0 Henk 'm!

  • DeadMetal
  • Registratie: Mei 2002
  • Laatst online: 15:00
Verwijderd schreef op 29 juli 2004 @ 10:47:
Dan heb je dus twee verschillende sourcefiles voor de twee verschillende talen. En als je in ééntje een bug ontdekt, moet je die in de andere ook veranderen. En wee o wee als je dat niet doet/vergeet, of als er inconsistenties ontstaan. Een taal toevoegen is altijd meer werk, maar als je het op die manier doet wordt het ook nog eens onbeheersbaar werk.

Een include-file waarin de teksten gedefiniëerd worden lijkt mij ook het netst.
Mijn pagina's bestaan voornamelijk alleen uit (veel) tekst en plaatjes, meer niet (ja en de header en footer die alles eromheen bouwen maar daar gaat het nu niet om). Bugs zullen er dus niet inzitten, alleen bijvoorbeeld spelfouten, maar die treden maar in 1 file op. In mijn geval werkt die manier dus het makkelijkst en zou het juist helemaal niet werken om met variabelen te werken. (teksten van honderden woorden in een variabele proppen is voor een auteur niet prettig te editen). Voor kleine dingetjes wel.

Maar in sommige gevallen kan het inderdaad absoluut handiger zijn om met variabelen te werken. Dat geldt vooral voor de header en footer file, daar kan je het beste met een variabele werken en je moet natuurlijk geen 2 aparte header en footer files gaan maken.

Maar voor de hoofdgedeelte van de site (tussen header en footer in), is het een prima methode.

Acties:
  • 0 Henk 'm!

Verwijderd

Ten eerste zorgen dat je content afzonderlijk van je document (site) structuur staat. En of je dat doet met XML, includes of een andere techniek doet er niet toe.

En dan met een sessie bepalen welke language er getoond moet worden. Zo kun je bijvoorbeeld, als je met includes werkt, een mapje in je ROOT maken met de naam /nl en een mapje met de naam /en. Aan de hand van de SESSIE (als het niet bepaald is laat je een standaard language zien) include je dan je content uit de bepaalde map.

De technieken die je gebruikt maken imo niet uit.
Het gaat erom dat je je content en je opmaak los van elkaar bewaard en bepaald.

Acties:
  • 0 Henk 'm!

  • Rostvertol-Mil
  • Registratie: Januari 2002
  • Nu online
Ik raad je aan om toch het eens te proberen met templates. php kan dit best zelf, je hebt niet persé een 3rd party templating engine nodig (ookal bied die veel meer functies).
Mijn voorstel:

index.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//eventueel automatisch taal bepalen, anders iets als $_GET["lang"] gebruiken.
switch ($_SERVER['HTTP_ACCEPT_LANGUAGE']') {
    case "en":
        $taal = "en";
        break;
    //etc
    default:
        $taal = "nl";
        break;
}
require("index.lang" . $taal . ".php");
require("index.tpl.php");
?>

index.langnl.php
PHP:
1
2
3
4
<?php
$lang["titel"] = "Index Pagina!";
$lang["ondertitel"] = "de index.";
?>

index.tpl.php
PHP:
1
2
3
4
5
6
7
8
9
<html>
<head>
<title><?= $lang["titel"] ?>
</head>
<body>
<h1><?= $lang["titel"] ?></h1>
<h2><?= $lang["ondertitel"] ?><h2>
</body>
</html>

dot.blaat


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Sorry voor mijn erg late antwoord!

Ik wil nu een begin gaan maken aan de website. Onafhankelijk van Apache.

Veel vertaling wordt niet door mijzelf maar door users verzorgt, dus het moet niet te ingewikkeld worden voor ze, of mij teveel werk gaan kosten het toe te voegen.

Ik vermoed dat het werken met variabelen het handigste is. Het nadeel is echter dat als ik de layout van een nederlandse pagina verander, de bijvoorbeeld Franse pagina meteen niet meer klopt.

Mocht iemand nog prachtige ideen hebben, dan hoor ik het graag.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

pierre-oord schreef op 14 augustus 2004 @ 20:32:
Sorry voor mijn erg late antwoord!

Ik wil nu een begin gaan maken aan de website. Onafhankelijk van Apache.

Veel vertaling wordt niet door mijzelf maar door users verzorgt, dus het moet niet te ingewikkeld worden voor ze, of mij teveel werk gaan kosten het toe te voegen.

Ik vermoed dat het werken met variabelen het handigste is. Het nadeel is echter dat als ik de layout van een nederlandse pagina verander, de bijvoorbeeld Franse pagina meteen niet meer klopt.

Mocht iemand nog prachtige ideen hebben, dan hoor ik het graag.
Zoals in de post boven je al gezegd wordt: aparte PHP files maken waar alle zinnen en woorden in een speciaal array komen. Vervolgens op je site die woorden, onafhankelijk van de gebruikte taal weergeven door de variabelenaam van dat array en de juiste index te gebruiken. Dan maakt het verder ook geen klote uit als je de layout verandert, want die verandert dan voor alle talen tegelijk! Kijk eens naar het concept dat onder andere phpBB gebruikt. Dat is denk ik het makkelijkste systeem.
Rostvertol-Mil schreef op 29 juli 2004 @ 22:27:
Ik raad je aan om toch het eens te proberen met templates. php kan dit best zelf, je hebt niet persé een 3rd party templating engine nodig (ookal bied die veel meer functies).
Op dat punt ben ik het niet zo met je eens. Hoe kan een template, geschreven in PHP, nou méér functionaliteit hebben dan PHP zelf? ;) PHP zelf is sowieso sneller.

[ Voor 17% gewijzigd door NMe op 14-08-2004 21:04 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Nog een keer dan: http://nl.php.net/manual/en/ref.gettext.php

Werkt onder windows en linux en is een php extensie, dus niet afhankelijk van apache.

En ik blijf er bij dat gettext DE oplossing is voor multilanguage websites. Een project waar ik zelf in zit is inmiddels in 42 talen verkrijgbaar en dat allemaal met behulp van gettext. De programmeurs hebben verder helemaal niks van doen met die vertalingen en hoeven alleen maar de strings als volgt op te nemen: _("This is an english text") en de vertalers doen de rest.

Acties:
  • 0 Henk 'm!

  • Dutchmega
  • Registratie: September 2001
  • Niet online
Gettext, vertaalt die zelf? Je moet neem ik aan zelf vertalingensbestanden aanmaken ofzo?>

Acties:
  • 0 Henk 'm!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-08 12:31
pierre-oord schreef op 14 augustus 2004 @ 20:32:
Mocht iemand nog prachtige ideen hebben, dan hoor ik het graag.
Het prachtige idee is al heel vaak genoemd, maar laat ik het nog maar een keer herhalen: gettext. Source strings staan gewoon in je template en worden automatisch geextract naar een Portable Object, er zijn speciale tools waar vertalers hun vertalingen mee kunnen genereren zonder dat ze in aanraking komen met je source, en uiteindelijk compileer je het geheel terug voor de benodigde snelheid.

Vergeet alleen niet om meteen vanaf het begin een slimme charset te kiezen (UTF-8) zodat alle talen die je wil hebben oo vertaald kunnen worden.

Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 19-09 12:09
naast gettext is een handige, en best eenvoudige manier, om de taal in een array te zetten. Een gebruiker kiest een tal en ahv de taal wordt een language-file ge-include. In deze file staan voor de tekst de goede vertaling. Bv:

PHP:
1
2
3
$lang = array(
           'welcome' => 'Welkom',
           'name' => 'naam');


uitlezen:
PHP:
1
echo $lang['welcome'];


zo kan het ook. Uiteraard zul je dus wel per taal een file moeten hebben maar dit geldt voor gettext ook. Het lijkt ook wel erg op elkaar, alleen vind ik deze manier sneller/eenvoudiger werken :)

Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
TheRebell schreef op 15 augustus 2004 @ 12:13:
naast gettext is een handige, en best eenvoudige manier, om de taal in een array te zetten. Een gebruiker kiest een tal en ahv de taal wordt een language-file ge-include. In deze file staan voor de tekst de goede vertaling. Bv:

PHP:
1
2
3
$lang = array(
           'welcome' => 'Welkom',
           'name' => 'naam');


uitlezen:
PHP:
1
echo $lang['welcome'];


zo kan het ook. Uiteraard zul je dus wel per taal een file moeten hebben maar dit geldt voor gettext ook. Het lijkt ook wel erg op elkaar, alleen vind ik deze manier sneller/eenvoudiger werken :)
Op deze manier (iets anders, met $lang['blaat'] eigenlijk meer typwerk maja) heb ik het al gedaan voor een bestel pagina. Voor deze pagina is dat geen probleem, deze is erg statisch. Die gettext is ook een mooie tegenhanger hiervan idd, en als veel ook nog automatisch kan is dat nog handiger.

Nu kom ik alleen op een praktijk voorbeeldje:
Ik maak een pagina met een leuke layout. Plots ben ik van mening dat er iets in de tekst niet duidelijk staat, en och, daar mist en enter. Meteen voeg ik een nieuw item toe, met een leuke afbeelding ernaast.

En toen de vertaalde pagina's. Aangezien slecht Frans kan bijvoorbeeld, kan ik niet even zo'n pagina snel aanpassen. Nu staat er midden in die pagina plots een afbeelding, waarvan niemand begrijpt waar die bij hoort.

Och, dan zet ik die afbeelding toch gewoon even in de language template? Eum ja, en die andere afbeelding ook, en die, en die, en ..
En plots had ik een standaard file zoals ik nu heb, die gewoon geinclude wordt.

Een ander voordeel vind ik toch wel dat ik een standaard include file gemakkelijk kan openen in Dreamweaver. Zo zie ik de layout, inclusief tekstopmaak in Verdana, hoe de plaatjes uitkomen, of de tabel iets groter of kleiner moet..

Voor zover ik weet kan dreamweaver geen content includen in de design view?

Wat wel handig is aan de array manier, als je je pagina inhoud niet te sterk verschillend maakt, is dat je nieuwe items kunt toevoegen, die dan in bijvoorbeeld het Nederlands worden weergegeven.

Dan include je eerst de nederlandse, goed werkende array, om daarna de oudere engelse te includen, waarin nog enkele variabelen missen, die wel in de Nederlandse staan. Alleen krijg je dan misschien wel een grote vertaalsoep.

Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 19-09 12:09
een probleem wat je inderdaad hebt is al eje zelf pagina's kunt toevoegen welke in verschillende talen zijn. Je zou dan bv bij engels & frans twee textarea's kunnen weergeven waarna je dus twee keer de tekst ingeeft, voor engels 1 en voor frans 1.

Met de gettext manier zul je ook hetzelfde hebben, je moet nu eenmaal altijd die vertaling geven, dat is nu eenmaal niet anders. Helaas is er niet een of ander fancy-techniek welke teksten vanzelf vertaald, dat zou een hoop problemen oplossen :)

Als je op een pagina geen verhaling hebt dan zou je, zoals je zelf al zegt, de andere vertaling (bv engels) kunnen weergeven. Dan wordt het iets uitgebreider maar hier zou je een mooie functie voor kunnen maken die dat allemaal voor jou doet.

Ik vraag me af of gettext nu echt zoveel sneller/handiger is... :?

DW heeft een design-view

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Wanneer er geen vertaling is met gettext dan wordt de opgegeven niet vertaalde string weergegeven, dus _("Deze string").

Acties:
  • 0 Henk 'm!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-08 12:31
TheRebell schreef op 15 augustus 2004 @ 12:37:
[
Als je op een pagina geen verhaling hebt dan zou je, zoals je zelf al zegt, de andere vertaling (bv engels) kunnen weergeven.
Met gettext wordt automatisch de originele string weergegeven. Dus dan heb je midden in een Nederlandse text plotseling een Engelse zin staan.
Ik vraag me af of gettext nu echt zoveel sneller/handiger is... :?
Ja.

Je hebt tools om de vertalingen niet in de vorm van een brakke PHP array die een vertaler geheid verneukt naar de vertaler te sturen, maar in mooie grafische cross-platform applicaties.
Je hebt tools om je strings automatisch te extracten uit je templates.
Je kan allerlei soorten meta-informatie bijhouden bij je strings, zoals of er functie-calls bij zitten, template names en regelnummers. Zie bijvoorbeeld dit Portable Object (van pgAdmin3).
Je vertalingen worden bijgehouden in Portable Objects, dus je kan vertalingen makkelijk mixen en mengen tussen programmeertalen en applicaties.
Je kan dubbele strings etc. automatisch laten sorteren en filteren wat de totale hoeveelheid strings vermindert.
Pagina: 1