16.10.1 Problem
16.10.2 Solution
Two techniques
simplify the management of your localization resources. The first is making a
new language's object, for example Canadian English, extend from a similar
existing language, such as American English. You only have to change the words
and phrases in the new object that differ from the original language.
The second technique: to track what phrases still need to be
translated in new languages, put stubs in the new language object that have the
same value as in your base language. By finding which values are the same in the
base language and the new language, you can then generate a list of words and
phrases to translate.
16.10.3 Discussion
The catalog-compare.php program shown in Example 16-2 prints out messages that are the
same in two catalogs, as well as messages that are missing from one catalog but
present in another.
Example 16-2. catalog-compare.php
$base = 'pc_MC_'.$_SERVER['argv'][1];
$other = 'pc_MC_'.$_SERVER['argv'][2];
require 'pc_MC_Base.php';
require "$base.php";
require "$other.php";
$base_obj = new $base;
$other_obj = new $other;
/* Check for messages in the other class that
* are the same as the base class or are in
* the base class but missing from the other class */
foreach ($base_obj->messages as $k => $v) {
if (isset($other_obj->messages[$k])) {
if ($v == $other_obj->messages[$k]) {
print "SAME: $k\n";
}
} else {
print "MISSING: $k\n";
}
}
/* Check for messages in the other class but missing
* from the base class */
foreach ($other_obj->messages as $k => $v) {
if (! isset($base_obj->messages[$k])) {
print "MISSING (BASE): $k\n";
}
}
To use this program, put each message catalog object in a file
with the same name as the object (e.g., the pc_MC_en_US class should be
in a file named pc_MC_en_US.php, and the
pc_MC_es_US class should be in a file named pc_MC_es_US.php). You then call the program with the
two locale names as arguments on the command line:
% php catalog-compare.php en_US es_US
In a web context, it can be useful to use a different locale
and message catalog on a per-request basis. The locale to use may come from the
browser (in an Accept-Language header), or it may be explicitly set by the server
(different virtual hosts may be set up to display the same content in different
languages). If the same code needs to select a message catalog on a per-request
basis, the message catalog class can be instantiated like this:
$classname = "pc_MC_$locale.php"; require 'pc_MC_Base.php'; require $classname.'.php'; $MC = new $classname;