Question

Everywhere on SO when it comes to making a multi language app in PHP everyone say that gettext is the best way to do it. I am just wanting to know why?

Like what makes this method below, less efficient then using gettext?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo's available would show here
?>
Was it helpful?

Solution

A good thing with gettext is that it is kind of a de-facto standard : it is used by lots of applications, in many languages -- which means many people work with it.

Another good thing (maybe a consequence, or a cause, or both, actually) is that several tools, like Poedit for instance, exist to edit gettext files : you don't have to go through some PHP (or whatever) source-code. And this is very important :

  • it means non-technical people can edit gettext localisation files
    • maybe this doesn't seem important to you now,
    • but if you are working on a big open-source application, it'll become important if it is successful and many people need it in their own language.
  • it means they don't risk to break the application (think "parse error" because of a mismatch in quotes, for instance ;-) )

OTHER TIPS

There are a few drawbacks in your "implementation".

  • Unlike gettext it's implemented in php. ;-)
  • It keeps the whole translation in memory no matter if you use it or not
  • Which is worse, it instantiates the whole array of data whenever you need one line (it does take a while and quite some memory in PHP)
  • It's unable to handle plural forms for many languages
  • The code, using this translation is hardly readable
  • The code, using this translation has no embedded fallback to use in case of absent translation.

Basically, your implementation is widely used in many projects who are dying to claim their internationalization support and highly innovative invention of the wheel, but don't care a bit about the result and do not know the good from the bad.

It's the same answer that for all the questions looking like :

What is better with [hightly proved and vastly used solution] than with [my hacky cocky noob implementation]?

  • It's been here for a long time, an believe it or not, if experienced dev worked on it, used it and praised it, it's probably for a reason.
  • It's a standard, and so even if your solution would be better, the price to pay for breaking it may not be worth it.
  • It can do 1000 more than your implementation because it's developed with a global scope in mind whereas your idea only aims to solve your problem.

I am not criticizing, we all did that, trying to convince ourself that we are smarties and others are overkill programmers. That's part of the way to learn. I actually continuously do that, reinventing the wheel or showing off with my friends / colleagues about some KISS code I hacked. With time, you just end up doing it less and less, and I suppose you stop doing it the day when you would actually deserve to do it :-)

The advantage of gettext, compared to other solutions like yours, Java string tables or Windows resources, is that it makes the source code more readable.

Compare this:

printf(_("No photo available (error %d)."), err);

with this:

printf(i18n(NO_PHOTO), err);
// or some variant of the same thing

In the first case, you can see the message right there in the code and you know exactly what it does. In the latter case, you only see a symbolic constant and have to look up the exact text and format specifiers.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top