![]() |
[PHP] Taalmodules; opzet en efficientie
Ik ben voor mijn CMS bezig om taalmodules te introduceren. Ik vraag me af hoe dat het beste kan. Ik had de volgende twee mogelijkheden in gedachte:
Plan 1: arrays Ik maak een .php file met allemaal arrays erin, waarbij elke array een taalmodule is, zoals: $lang['nl'][1] = 'Dit is de Nederlandse tekst voor item 1'; $lang['nl'][2] = 'Dit is de Nederlandse tekst voor item 2'; $lang['nl'][3] = 'Dit is de Nederlandse tekst voor item 3'; $lang['en'][1] = 'This is the English text for item 1'; $lang['en'][2] = 'This is the English text for item 2'; $lang['en'][3] = 'This is the English text for item 3'; Ik gebruik dan ipv hardcoded engelse tekst: $lang['nl'][26]. Elk nummer is dan gereserveerd voor een bepaalde tekst ergens gebruikt in mijn scripts. Plan 2: functies Ik maak een functie, die vervolgens de juiste tekst retourneert. Het voordeel hiervan zou zijn dat ik geen array heb met ALLE tekst, ook al gebruik ik maar b.v. 10 zinnen, alle 3000 zinnen (ik noem maar wat) moet hij dan wel inladen, wat wellicht veel geheugen kost. Mijn vraag: wat lijkt jullie het meest efficient, en hebben jullie nog andere tips om taalmodules te implementeren? Het gaat dus om het design hiervan, ik wil vooraf de juiste keuzes maken. ;) |
$lang['text'] = "dit is een text";
$lang['blub'] = "dit is een vis"; En dan met aparte taalbestanden werken (1 taal = bestand). Dan heb je ook geen shitload aan vars die je niet gebruikt omdat het een andere taal is (gezien dit erg hard kan oplopen). Of als osCommerce het doet: 1 globale taal bestand per taal. Met een directory waar voor ieder bestand weer een apart taalbestand is. www.domein.tld/fiets.php roept dan taalbestand /languages/nl/fiets.php aan oid. |
Mijn CMS zit iets anders in elkaar. ;)
Er staan b.v. helemaal geen bestanden in de documentroot. :cool: Wat betreft $lang['blub'], dan ga je toch weer namen verzinnen en dat moet je allemaal bijhouden, of dat makkelijker is dan nummers? Ik dacht zelf overigens aan $lang[<modulenaam>][1], dus per module/plugin/corefunctie/pagina heb je een array. De grote vraag is of een shitload aan vars dus niet voor een hoge overhead zorgt, ook al beperk je je tot 1 taal per file. Is het niet efficienter om een functie te gebruiken die somehow alleen de text teruggeeft die nodig is? Zit zelf nog wat te brainstormen hierover. :) |
Citaat:
En hoe moet het dan met met cross-modulaire verwijzingen; neem aan dat je niet meerdere elementen wil reserveren voor hetzelfde woord. Wat wij doen is een combinatie van nummers en modulenamen; waarbij we 1 generieke modulenaam hebben. Oftewel IF10001, IF10002, IM10001, PM10001, etc. Daarnaast hebben we de ranges verdeeld, waarbij bv. alles tussen 10000 en 30000 informatie is, 30000-40000 warning's en 40000 en daarboven errors. Om het extra duidelijk te maken, plaatsen wij er ook nog een W of een E achter, als 't om een warning of error gaat. Citaat:
[edit] Daarbij wel dus dat de array gevuld word dmv. een taal specifieke file (bv. een .csv file; lekker makkelijk icm. Excel) . Taal hardcoderen in de code zelf zie ik niet als een optie.[/edit] .. Het grootste probleem wat wij hebben met het localizeren, is layout technische zaken. In een taal zijn zinnen soms een stuk langer dan in andere talen. Met PHP heb je daar waarschijnlijk minder last van. |
Ik heb er totaal geen verstand van, maar ik zou een database maken met de talen of je zou ook de vertaling kunnen doen bij de invoer en dus de pagina's in alle talen op de server zetten en met een landId de juiste pagina's opvragen.
Met een database zou ik het zo doen: Per pagina de id's van de gebruikte woorden opslaan in een tabel. Vervolgens met 1 query alle elementen ophalen die gelijk de juiste variabelenaam krijgen conform de pagina. Een php bestaat dan uit: $De . $tafel . $is . $rood . "." of $1 . $2 . $3 . $4 . "." Bovenstaande is te generen is op basis van de ingevoerde tekst "De tafel is rood", aanemende dat de nederlanse database is gevuld. |
Het is moeilijk om er wat zinnig over te zeggen wanneer ik niet de werking van je CMS weet ;)
Maak een tabelletje (taal, code, tekst) en haal bij iedere request de gewenste tekst op. Doe dit wel in één keer (minder queries naar de database); je moet aan het begin van het script dus weten welke teksten je nodig hebt (of zet dit ook in een tabel...). Genereer vervolgens de pagina en bewaar deze op schijf (hoef je niet iedere keer de pagina op te bouwen; alleen wanneer de data veranderd is). Zoals je allicht weet is het mogelijk (bij een goede browser iig) een Accept-Language in te stellen. Deze kun je dus ook uitlezen. Bijvoorbeeld: GET /computers Accept-Language: nl, en;q=0.8 -- nl heeft de voorkeur. Genereer de /computers pagina in het nederlands en bewaar deze bijv. als /cached/computers.nl De volgende keer dat iemand /computers opvraagd (en als voorkeurstaal nl heeft ingesteld), controleer je of deze in /cached staat en de data (in de database oid) niet is veranderd. Zo ja, dan het ge-cachede bestand terug geven, anders generen (en opslaan). |
De beste manier is met behulp van gettext.
|
gettext kende ik niet, maar ziet er goed uit.
Wat ik altijd doe is het volgende: de taal ophalen vanuit accept-language (als dat niet geset is kan de gebruiker zelf kiezen of is er een default-taal), zodra de taal bepaald is bestand openen (of includen) en alle inhoudt (is bij mij meestal vrij weinig) opslaan in een sessie, zo heb je alle text altijd bij de hand. Hiermee is nog steeds het probleem van de keuze tussen namen of nummers voor je probleem niet opgelost. Ik gebruik zelf altijd namen, omdat je van nummers totaal niet weet wat ze doen. Dus als ik het volgende heb: PHP-code:
Het gebruik van woorden ipv cijfers heeft wel als nadeel dat namen vaak inconsequnt zijn, maar ach :) |
Citaat:
Citaat:
Citaat:
Citaat:
Citaat:
|
Citaat:
Citaat:
Citaat:
Citaat:
|
Citaat:
Het ging erom dat ieder bestand een eigen file heeft... Citaat:
En als je het per array doet en alsnog samen in 1 file die die in moet laden, bij een kleine website isdat niet erg maar als de website enigzins uitgebreid wordt dan kan dit oplopen tot vele 100en kb's. Citaat:
Al ik he topic doorlees lijkt mijn methode nog steeds de meest effectieve. Ik laat die van Manu even erbuiten omdat ik hier zelf ook nog niet serieus naar heb gekeken en dus niet kan beoordelen. |
De manier die ik heb aangegeven is DE geaccepteerde standaardmanier om het te doen. Lijkt me veel netter dan je eigen homegrown ding. Meer info (maar jullie hadden ook zelf even kunnen Googlen, php.net is natuurlijk niet de enige resource):
http://www.onlamp.com/pub/a/php/2002/06/13/php.html http://ruistech.com/gettext/howto.php http://www.uberdose.com/php/php-and-gettext-for-i18n/ |
Citaat:
Citaat:
Citaat:
Citaat:
|
Oh, en het gebruiken van namen of nummers; ik ben een voorstander van nummers. Namen voor een tiental woorden wil nog wel werken; maar voor honderden (duizenden) dan wil je dat echt niet doen. In het begin is het nog makkelijk namen te verzinnen, maar later zal 't een zooitje worden. Je onthoud het sowieso niet en moet het alsnog/sowieso bijhouden in een lijst. Het voordeel van nummers is dat je groepen kan maken die je makkelijk kan uitbreiden. Of nog makkelijker, een combinatie .. nummers met prefixes en/of suffixes.
|
Wat ze volgens mij in Subversion doen (ik meen dat dat ook iets gettext-achtigs gebruikt, maar weet het niet zeker) is de Engelse variant als key gebruiken voor alle andere varianten. Dat is op zich best handig; je hoeft geen nieuwe naam te bedenken, maar gebruikt gewoon de tekst zelf in een bepaalde taal.
|
Citaat:
|
Citaat:
|
Citaat:
Kun je je vraag dan iets verduidelijken? |
Alle tijden zijn GMT +1. Het is nu 09:33. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.