简体   繁体   中英

PHP Gettext - No translation

I am trying to use the PHP gettext extension in order to translate some strings. All functions appear to return the correct values but calling gettext() / _() returns the original string only. The PO/MO files seem correct and I believe I have set the directories up correctly. I am running WAMP Server with PHP 5.3.10 on Windows (also tried running 5.3.4 and 5.3.8 because I have the installations).

Firstly, see /new2/www/index.php :

$locale = 'esn'; # returns Spanish_Spain.1252 in var dump

putenv("LC_ALL={$locale}"); // Returns TRUE
setlocale(LC_ALL, $locale); // Returns 'Spanish_Spain.1252'

$domain = 'messages';
bindtextdomain($domain, './locale'); // Returns C:\wamp\www\new2\www\locale
bind_textdomain_codeset($domain, 'UTF-8'); // Returns UTF-8
textdomain($domain); // Returns'messages'

print gettext("In the dashboard"); // Prints the original text, not the translation.
exit;

I have created the following file structure:

www/new2/www/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo

I have also tried replacing Spanish_Spain.1252 with: es_ES , esn , esp , Spanish , and Spanish_Spain .

The PO file used to generate the MO is like so (only the relevant entry given):

#: C:\wamp\www\new2/www/index.php:76
msgid "In the dashboard"
msgstr "TRANSLATED es_ES DASHBOARD"

This was generated using PoEdit. I have restarted Apache after adding any new .MO file. Also note that I was previously using Zend_Translate with Gettext and it was translating correctly. I wish to rely on the native gettext extension, though, in part because I am attempting to create a lightweight framework of my own.

Any help would be appreciated.

Edit : Amended directory structure. Note - will be able to try recent answers within 24hrs.

I set this up on my XAMPP instance and figure it out.

  • Flat out setlocale does not work on Windows, so what it returns is irrelevant.
  • For Windows you set the locale using the standard language/country codes (in this case es_ES is Spanish as spoken in Spain)
  • Under your locale directory create es_ES/LC_MESSAGES/. This where your messages.mo file lives.

     $locale = 'es_ES'; putenv("LC_ALL={$locale}"); // Returns TRUE $domain = 'messages'; bindtextdomain($domain, './locale'); bind_textdomain_codeset($domain, 'UTF-8'); textdomain($domain); // Returns'messages' print gettext("In the dashboard"); exit; 

I am not sure if this made a different, but I did two things when creating the po file. In poEdit under File -> Preferences I changed the Line ending format to Windows. And after I created the initial po with poEdit I opened the file in Notepad++ and switched the encoding type to UTF-8 as poEdit did not do this.

I hope this at least points you in the right direction.

References

PHP Localization Tutorial on Windows

Country Codes

Language Codes

Your code mentions this as the return value from bindtextdomain :

C:\wamp\www\new2\www\locale

With the setlocale of Spanish_Spain.1252 and textdomain of messages , calls to gettext will look in this path:

C:\wamp\www\new2\www\locale\Spanish_Spain.1252\LC_MESSAGES\messages.mo

But you created the file structure of:

www/new2/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo
         ^^
         www/ missing here

Edit

Okay, so that didn't help. I've created a test script on Windows and using POEdit like you:

$locale = "Dutch_Netherlands.1252";
putenv("LC_ALL=$locale"); // 'true'
setlocale(LC_ALL, $locale); // 'Dutch_Netherlands.1252'
bindtextdomain("messages", "./locale"); // 'D:\work\so\l10n\locale'
textdomain("messages"); // 'messages'

echo _("Hello world"); // 'Hallo wereld'

My folder structure is like this:

D:\work\so\l10n\
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po
    \test.php

Hope it helps, although it looks almost identical to yours. A few things I found online:

  • It's important to set the character set in .po file
  • Spaces inside the localization file might have a UTF8 alternative, so be wary of key lookups failing. Probably the best thing to test first is keys without spaces at all.

A suggestion: you may need the full locale for the .mo file. This is probably Spanish_Spain.UTF8 or esn_esn.UTF8 or esn_esp.UTF8 (not 1252, as you change the code base).

To track what directory it's looking for, you can install Process monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645). It spews out bucket loads on info, but you should be able to find out which file/directory is being looked for.

(My other thought is to check file permissions - but if you already had something similar in Zend_Translate, then probably not the cause, but worth checking anyway).

Sorry if not good - but might give you a clue.

Look here . It works for me on windows and on linux also. The last values in the array works for windows. List of languages names can be found here . My catalogs are in

./locales/en/LC_MESSAGES/domain.mo
         /cs/LC_MESSAGES/domain.mo

我从未尝试过在Windows上使用gettext,但每次我在linux系统上遇到gettext问题时,原因都是没有安装合适的语言包。

Problem can be also that when you change your *.po and *.mo files, you have to restart the Apache Server . This can be problem, so you can use workaround - always rename these files to some new name and they will be reloaded.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM