Beste mede-PHP proggers,

Ik ben bezig mijn internetsite opnieuw op te zetten en ik wil dat de interface meerdere talen gaat ondersteunen. Ik had bedacht dat afhankelijk van de taal instelling een include geladen wordt met taal strings. Het ziet er zo uit ongeveer:

-Taalbestand-

<?php

$GENERAL_YES = 1000;

function GetString( $item ) {
   if ($item==1000) { return "Yes"; }
}
?>


-Internetsite zelf-

<?php

// code bla bla......

function ViewForum() {
   echo GetString( $GENERAL_YES )."<br>\n";
}
?>


Deze code werkt dus niet, mits ik globals gebruik. Eigenlijk wil ik dat niet omdat de code dan zo groot en omslachtig wordt.

Iemand een suggestie hoe dit beter kan, dus zonder een global in de internetsite zelf te defineren? (Andere suggesties zijn ook welkom natuurlijk)
Je zou ook gewoon een php bestand aan kunnen maken in de trend van:

language_nl.php
language_en.php

en in die bestanden zet je dan:

$general_yes = 'ja';

en

$general_yes = 'yes';

etc...

En als de gebruiker een taal kiest je en je deze laat onthouden door bijvoorbeeld met een cookie te zetten en deze in de pagina op te vragen wat zijn keuze is laat je een switch lopen op de betreffende cookie

switch($_COOKFIE['taal'])
{
case 'nl':
include "language_nl.php";
break;

case 'en':
include "language_en.php";
break;
}

Het talen bestand voor een site van me (deze werkt met 2 talen, nederland en engels):

<?php
if(isset($_SESSION['taal']) && $_SESSION['taal'] == 'en')
{
$taal = 1;
}
elseif(isset($_SESSION['taal']) && $_SESSION['taal'] == 'nl')
{
$taal = 0;
}
elseif(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && ereg('nl', $_SERVER['HTTP_ACCEPT_LANGUAGE']) == true)
{
$taal = 0;
}
else
{
$taal = 1;
}

$t['pagina'] = array('Pagina', 'Page');
$t['voorkant'] = array('Voorkant', 'Front');
$t['achterkant'] = array('Achterkant', 'Back');
$t['boekje'] = array('boekje', 'booklet');
$t['persing'] = array('persing', 'pressing');
//de bedoeling lijkt me duidelijk

foreach($t as $key => $value)
{
$t[$key] = $value[$taal];
}

$taal = ($taal == 0) ? 'nl' : 'en';

//nu kun je ook doen ($taal == nl) ? 'Een text in het nederlands' : 'A text in English';
?>
Bedankt voor de reactie. Ik gebruik alleen integers vanwege het beperkte geheugen op de server, plus het is iets sneller. Ik gebruik de gebruiker zijn gegevens (statitieken) op de instelling mee op te slaan om problemen met lokale cookies te voorkomen. (ze kunnen geblocked zijn vandaar, plus de instelling vergaat niet)

Ik vroeg alleen hoe ik de variabele zoals $general_yes kan gebruiken in functies zonder in de functie aan te geven dat ik een global gebruik. ik wil dus dat de variabele zoals $general_yes standaard global staan ivm dat ik dit moet opgeven.

Nog een voorbeeld in de main: (dit werkt niet en dit moet gaan werken)

<?php

// code bla bla......

function ViewForum() {
   echo GetString( $GENERAL_YES )."<br>\n";
}
?> 


Nog een voorbeeld in de main: (dit werkt wel, maar wil ik niet)

<?php

// code bla bla......

function ViewForum() {
   global $GENERAL_YES;
   echo GetString( $GENERAL_YES )."<br>\n";
}
?> 
Als je het niet via cookie's wilt doen kun je indien de gebruiker een account heeft natuurlijk ook deze instelling in de database op slaan of gebruik maken van de http data die ook aangeeft welke taal keuze de browser heeft.

Maar goed, ik merk het al... je wilt alleen integers gebruiken vanwege het beperkte geheugen op de server? Dit komt nogal komisch over als ik zo vrij
mag zijn (doe dat toch al) maar draait je server op een 386 processor met 32mb geheugen of iets in die trend?




@Danny:
Ik heb je verbeter suggestie verworpen, aangezien ik hetzelfde reeds eerder aandroeg (cookie). Mij vraag rest dus hoe ik globals kan vermijden?

Ps Integers zijn kleiner (in benodigde bits) en bij veel traffic wordt het geheugen van de server dus minder belast, hetgeen wat de snelheid ten goede komt. Maar dat weet je vast wel van assembler of C.

[edit]
Negatieve opmerking verwijderd.
[/edit]
Persoonlijk zou ik de hele zooi in een database zetten en vervolgens met Smarty (template-engine) aan de slag gaan. Smarty heeft ingebouwde ondersteuning voor meertalige websites, dat werkt uitstekend. Alle vaste onderdelen zet je in een taalbestand, de dynamische teksten sla je op in de database.

Op deze manier krijg je een goed te onderhouden website waar nooit een stuk tekst ontbreekt omdat je toevallig wat vergeten bent te vertalen. Smarty valt dan gewoon terug op de default-waarde (uit de default taal).

Ps. Lijkt mij niet zo handig om hier personen aan te vallen op hun reacties, niet zo netjes. Niet meer doen doen dus.
@pqFank:
Bedankt voor je reactie. Ik maak gebruik van een Excel werkblad met VBA om de PHP language bestanden te generen. Op zich is Smarty wel een goed alternatief, maar ik probeer de database aanvragen binnen de perken te houden om zo de verwerkings snelheid hoog te houden, maar wellicht staat hier wel wat in wat ik kan gebruiken, zal hem vanavond eens goed bestuderen.
De database-aanvragen kun je beperken door gebruik te maken van stored procedures. Daar heb je bv. PostgreSQL of MySQL 5.x voor nodig.

Verder kan een database echt wel enige duizenden calls per minuut verwerken, geen probleem. Een site als Tweakers gebruikt (of gebruikte) mysql 3 en 4 en verwerkte miljoenen gebruikers per dag. Geen enkel probleem, een database is gemaakt voor grote hoeveelheden werk.

Reageren