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.
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.
$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;
Section 16.5 discusses message catalogs; Section 7.11 for information on finding the methods and properties of an object.
Copyright © 2003 O'Reilly & Associates. All rights reserved.