sql >> Database teknologi >  >> RDS >> Mysql

Hvordan man kører eller indlæser .po/.mo-filer til lokalisering i php

Først og fremmest skal du informere PHP om, hvilken lokalitet og hvilket domæne du bruger.

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

I dette tilfælde har jeg en dansk oversættelse og en fil kaldet mycatalog.mo (og .po). Disse filer placeres (fra din rod) her:locale/da_DK/LC_MESSAGES/mycatalog.mo/po

For at vise din oversættelse skal du gøre dette:

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

_(); er et alias af gettext(); Det smarte ved gettexts er, at hvis der ikke er nogen oversættelse, vil du ikke have en grim sprogkode som "MSG_HELLO_WORLD" i din brugergrænseflade, men i stedet et bedre alternativ:Simpelthen den almindelige engelske tekst.

I messages.po-filen skal du have alle beskeder (der skelnes mellem store og små bogstaver og også med hensyn til brugte kommaer, prikker, koloner osv.) på denne formular:

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

Når du har tilføjet denne til din .po-fil, åbner du denne fil i poedit, trykker på "Gem", og den genererer en .mo-fil. Denne fil uploades til den samme mappe som .po-filen (typisk noget som \locale\da_DK\LC_MESSAGES\ fra scriptroden)

For at oversætte dynamisk/variabelt indhold kan du blandt andet bruge sprintf på denne måde:

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

I dette tilfælde vil %s forekomme i .po-filen; Når du har den oversatte streng (som indeholder %s), vil sprintf sørge for at erstatte %s med det variable indhold. HVIS variablen også skal oversættes, kan du gøre dette:

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

Så behøver du ikke en hel sætning for hver farve, men du får stadig farverne oversat.

Det er vigtigt at bemærke, at første gang en .mo køres på serveren cachelagres den - og der er ingen måde at fjerne denne fil fra cachen uden at genstarte (Apache eller lignende burde være nok i sig selv). Det betyder, at eventuelle ændringer, du foretager i .mo efter første gang, den bruges, ikke vil være effektive. Der er en række hacks til at omgå dette, men ærligt talt er de for det meste ikke særlig smukke (de inkluderer kopiering af .mo, tilføje tiden() bag den og derefter importere og cache den igen). Dette sidste afsnit er kun vigtigt, hvis du ikke skal oversætte det hele på én gang, men i bidder.

Hvis du vil oprette dit eget oversættelsesværktøj på et tidspunkt, hjælper dette værktøj dig med at konvertere .po til .mo ved hjælp af PHP:

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



  1. SQL Server Linked Server Eksempel forespørgsel

  2. REGEXP_COUNT() Funktion i Oracle

  3. Hvad er forskellene mellem backtick og enkelt citat? Kan jeg bruge IF-sætning i en forespørgsel som ovenfor?

  4. 3 metoder til at forbinde MDF-fil til SQL Server