sql >> Databasteknik >  >> RDS >> Mysql

Hur man kör eller laddar .po/.mo-filer för lokalisering i php

Först och främst måste du informera PHP om vilken lokalitet och domän du använder.

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

I det här fallet har jag en dansk översättning och en fil som heter mycatalog.mo (och .po). Dessa filer placeras (från din rot) här:locale/da_DK/LC_MESSAGES/mycatalog.mo/po

För att visa din översättning gör du så här:

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

_(); är ett alias för gettext(); Det smarta med gettexts är att om det inte finns någon översättning kommer du inte att ha en ful språkkod som "MSG_HELLO_WORLD" i ditt användargränssnitt, utan istället ett bättre alternativ:helt enkelt den vanliga engelska texten.

I filen messages.po måste du ha alla meddelanden (skiftlägeskänsliga och även med avseende på använda kommatecken, punkter, kolon etc.) på detta formulär:

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

När du har lagt till detta i din .po-fil öppnar du den här filen i poedit, trycker på "Spara" så genereras en .mo-fil. Den här filen laddas upp till samma katalog som .po-filen (vanligtvis något som \locale\da_DK\LC_MESSAGES\ från skriptroten)

För att översätta dynamiskt/variabelt innehåll kan du använda - bland annat - sprintf, på detta sätt:

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

I det här fallet kommer %s att förekomma i .po-filen; När du har den översatta strängen (som innehåller %s), kommer sprintf att se till att ersätta %s med variabelinnehållet. OM variabeln måste översättas också, kan du göra detta:

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

Då behöver du inte en hel mening för varje färg, men du får ändå färgerna översatta.

Det är viktigt att notera att första gången en .mo körs på servern cachelagras den - och det finns inget sätt att ta bort denna fil från cachen utan att starta om (Apache eller liknande borde räcka). Detta innebär att alla ändringar du gör i .mo efter första gången den används, inte kommer att gälla. Det finns ett antal hack för att komma runt detta, men ärligt talat är de oftast inte särskilt snygga (de inkluderar att kopiera .mo, lägga till tiden() bakom den och sedan importera och cache den igen). Det här sista stycket är bara viktigt om du inte ska översätta det hela på en gång, utan i bitar.

Om du vill skapa ditt eget översättningsverktyg någon gång, hjälper det här verktyget dig att konvertera .po till .mo med PHP:

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



  1. Finns det ett MySQL-alternativ/-funktion för att spåra historik över ändringar i poster?

  2. Importera .csv-fil till ett Oracle Forms-program

  3. konvertera mysql tidsstämpel till faktiskt datum och tid?

  4. php+mysql:infoga en php-array i mysql