php gettext directory structure on different environments

gettext, internationalization, php, php-gettext

Solution

If you're running your code on Linux, `gettext` works only with locales already installed on the OS. This means that if you set the locale to `en_GB` then if the only installed locale is `en_GB.utf8` or `en_US`, then you don't get the translations.

Try this on both of your environments and compare the results:

locale -a

It gives you a list of all the installed locales:

en_US
en_US.ISO8859-1
en_US.ISO8859-15
en_US.US-ASCII
en_GB
en_GB.utf8
de_DE

de_DE.utf8
C
POSIX

Now you need to make sure that both of the environments have the same locales installed; If you need `en_US.utf8`, `en_AU`, and `en_AU.utf8`, you can create the missing locales based on an existing one (read `localedef` manpages to know the details):

sudo localedef -c -i en_US -f UTF-8 en_US.utf8
sudo localedef -c -i en_GB -f UTF-8 en_AU
sudo localedef -c -i en_GB -f UTF-8 en_AU.utf8

Also, what follows is the common best practice for using `gettext` on PHP:

<?php

    // Set language to German
    putenv('LC_ALL=de_DE.utf8');
    setlocale(LC_ALL, 'de_DE.utf8');

    // Specify location of translation tables
    bindtextdomain("myPHPApp", "./locale");

    // Choose domain
    textdomain("myPHPApp");

    // Translation is looking for in ./locale/de_DE.utf8/LC_MESSAGES/myPHPApp.mo now

    // Print a test message
    echo gettext("Welcome to My PHP Application");

    // Or use the alias _() for gettext()
    echo _("Have a nice day");

?>

Although you can simply drop the encoding and just `de_DE`, but it's a good practice to have the character set in the locale as in some specific cases you might need to support content in non-Unicode character sets. See below

<?php

  // Set language to German written in Latin-1
  putenv('LC_ALL=de_DE.ISO8859-1');
  setlocale(LC_ALL, 'de_DE.ISO8859-1');

?>

Problem

I'm using `gettext` for internationalization for my php files. I have two servers; a sandbox server and a release server. in sandbox server a directory like `locale/LC_MESSAGES/en` does not work and I should use `locale/LC_MESSAGES/en_GB` instead. But with "en_GB" it doesn't work on my production server and "en" works fine. for some languages like Portuguese I have pt_PT and pt_BR (Brazilian Portuguese). So I prefer to use the "A_B" structure. I have no idea how `gettext` detects these folders. Is there a standard way to use the same folder structure?

Original source