Ik weet niet of er iemand bekend is met i18n Class? Dit is een class bedoeld voor meertalige websites. Hiermee kun je op een relatief makkelijke manier bepaalde secties (b.v. contact pagina) in de website in diversen talen weergeven d.m.v. van vertaalbestanden(lang_en.ini, lang_nl.ini). Op zich werkt dit prima ik zit alleen met het format van de output:
<?php echo L::contact_naam; ?>
Waar L de prefix is gevolgd door twee maal dubbele punt, waardoor ik dit onbruikbaar is als PHP variabele als ik dit in een database zou opslaan. Mijn vraag is derhalve: Is iemand bekend met deze Class en zo ja hoe kan ik di dubbele punten omzeilen. Als ik het nu in de database zet wordt gewoon de daadwerkelijke tekst L::contact_naam"in plaats van de waarde die ik er aan heb toegekend in de ini files
Als je dan toch al in de database bezig bent, waarom houd je daar dan niet direct een vertaling bij? :/
Dit klinkt allemaal vreselijk inefficiƫnt, bedenk eens wat je allemaal aan het verzetten bent om enkel een categorienaam in taal X weer te kunnen geven...
Maar goed, je hebt je gram, dus je kunt verder naar je volgende klus?
Op zich hoeft het niet meteen in een DB, maar ik vraag me wel een beetje af waarom je je vertalingen eerst in een .ini bestand in zou voeren, en de boel dan weer door een wrapper class naar PHP files zou compileren (incl. constante check of de .ini toevallig nieuwer is dan de .php).
Zet het dan meteen in een PHP bestand en include gewoon direct het juiste bestand. Bijvoorbeeld:
pseudo code voor ophalen vertaling (je mag er ook een mooie class van maken):
$lang = $_GET['lang'] ?? 'nl'; //of net zoiets als die getUserLangs()
$langs = ['nl','en','fr']; //ondersteunde talen, waar dus een xx.php bestand voor bestaat
if(!in_array($lang,$langs)) $lang = 'nl'; //default lang
$strs = require($lang . '.php');
function str($key){ //string ophalen (met default indien niet bestaand)
global $strs;
return $strs[$key] ?? null;
}
@Thomas van den Heuvel. Ik ben niet zo enorm veel aan het verzetten hoor Thomas. Valt echt reuze mee!
Twee abstractielagen (database + (gecachede?) ini bestanden) voor iets simpels, dan is wat @Rob hierboven doet vele malen eenvoudiger en zeker meer lichtgewicht.
Ook is het stuk minder complex, wat het ook veel makkelijker maakt om te debuggen wanneer er onverhoopt iets fout zou gaan.
In plaats van een class constantL::contact_name zou je globale constanten zoals I18N_CONTACT_NAME of constanten zoals I18N\CONTACT_NAME in een eigen namespace kunnen gebruiken.
Ik gebruik zelf ook een database voor het complete translation memory (TM) plus aparte cachebestanden per taal.
@Rob Doemaarwat. Als dit principe ook zonder deze Class uitgevoerd kan worden ben ik een en al oor. Ik begrijp echter niet zo goed hoe ik dit dan implementeer. Gebruikmakend van de Class wordt deze op de volgende manier aangeroepen:
$i18n = new i18n(APP_PATH.'/lang/lang_{LANGUAGE}.ini', APP_PATH.'/langcache/', 'nl');
$i18n->init();
Met de manier zoals geformuleerd door @Adoptive Solution kan ik de Class zowel met als zonder database. Hoe zou het werken met database in jou voorbeeld opgaan?
@Ward van der Put. Een heleboel informatie, die ik vandaag eens rustig ga verwerken en doornemen. Hartelijk bedankt voor de input
@Thomas van den Heuvel. Het is niet zo zeer dat ik niet begrijp dat het een en ander beter in de database gedefinieerd kan worden want voor de rest van de site in kwestie gebeurt dat al door middel van een veld(`lang` char(2) NOT NULL) in de verschillende tafels. Het is meer dat ik wilde weten of ik deze class op een efficiƫnte manier zou kunnen gebruiken waarbij mij is opgevallen dat het voor losse fragmenten een handige class zou kunnen zijn zijn. Echter de methode van @Rob Doemaarwat spreekt me ook zeer aan
Als die i18n class alleen maar wordt gebruikt om de naam van een categorie uit een ini bestand te halen, lijkt het me dat je dat ini bestand ook kan omzetten naar een array om vanuit daar verder te gaan.
Volgens mij staat alles hierboven. Ipv uit de $_GET haal je je actieve taal gewoon uit je cookie van je vorige vraag, dus dan wordt het (en ik zou je vertaal bestanden in een aparte map zetten, dus translations/nl.php, enz):
$lang = $_COOKIE["language"] ?? 'nl';
$langs = ['nl','en','fr']; //ondersteunde talen, waar dus een xx.php bestand voor bestaat
if(!in_array($lang,$langs)) $lang = 'nl'; //default lang
$strs = require("translations/$lang.php");
function str($key){ //string ophalen (met default indien niet bestaand)
global $strs;
return $strs[$key] ?? null;
}
Met bovenstaande ergens in je algemene initialisatie code kun je dan je vertalingen ophalen via: