sql >> Database >  >> RDS >> Mysql

.po/.mo-bestanden uitvoeren of laden voor lokalisatie in php

Allereerst moet je PHP laten weten welke locale en domein je gebruikt.

putenv("LANG=da_DK"); 
setlocale('LC_ALL', "da_DK"); 
bindtextdomain("mycatalog", "./locale/");  
textdomain("mycatalog");

In dit geval heb ik een Deense vertaling en een bestand met de naam mycatalog.mo (en .po). Deze bestanden worden hier (van uw root) geplaatst:locale/da_DK/LC_MESSAGES/mycatalog.mo/po

Om uw vertaling te tonen, doet u dit:

echo _("Hello world");   // Which would become "Hej verden"

_(); is een alias van gettext(); Het slimme van gettexts is dat als er geen vertaling is, je geen lelijke taalcode zoals "MSG_HELLO_WORLD" in je gebruikersinterface hebt, maar in plaats daarvan een beter alternatief:gewoon de gewone Engelse tekst.

In het bestand messages.po moeten alle berichten (hoofdlettergevoelig en ook met betrekking tot gebruikte komma's, punten, dubbele punten, enz.) op dit formulier staan:

msgid "Hello world!"
msgstr "Hej verden!"

Wanneer je dit aan je .po-bestand hebt toegevoegd, open je dit bestand in poedit, klik je op "Opslaan" en het genereert een .mo-bestand. Dit bestand wordt geüpload naar dezelfde map als het .po-bestand (meestal zoiets als \locale\da_DK\LC_MESSAGES\ van de scriptroot)

Om dynamische/variabele inhoud te vertalen kun je onder andere sprintf gebruiken, op deze manier:

echo sprintf(_("My name is %s"), $name);

In dit geval zal de %s voorkomen in het .po-bestand; Als je de vertaalde string hebt (die de %s bevat), zal sprintf ervoor zorgen dat de %s wordt vervangen door de variabele inhoud. ALS de variabele ook moet worden vertaald, kunt u dit doen:

echo sprintf(_("The color of my house is %s"), _($color));

Dan heb je niet voor elke kleur een hele zin nodig, maar krijg je toch de kleuren vertaald.

Het is belangrijk op te merken dat de eerste keer dat een .mo op de server wordt uitgevoerd, deze in de cache wordt opgeslagen - en er is geen manier om dit bestand uit de cache te verwijderen zonder opnieuw te starten (Apache of iets dergelijks zou op zich voldoende moeten zijn). Dit betekent dat alle wijzigingen die u aanbrengt in de .mo na de eerste keer dat deze wordt gebruikt, niet effectief zullen zijn. Er zijn een aantal hacks om dit te omzeilen, maar eerlijk gezegd zijn ze meestal niet erg mooi (ze omvatten het kopiëren van de .mo, het toevoegen van de tijd() erachter en het vervolgens importeren en opnieuw cachen). Deze laatste alinea is alleen van belang als je niet alles in één keer, maar in brokken gaat vertalen.

Als je ooit je eigen vertaaltool wilt maken, helpt deze tool je om .po naar .mo te converteren met PHP:

http://www.josscrowcroft.com/2011/code/php-mo-convert-gettext-po-file-to-binary-mo-file-php/



  1. ALTER TABLE om een ​​samengestelde primaire sleutel toe te voegen

  2. Hoe een CSV-bestand in de MySQL-tabel te importeren

  3. Mogelijk om SQL te gebruiken om op datum te sorteren, maar nuldatums achteraan de resultatenset te plaatsen?

  4. DISTINCT ON in django