3 * Copyright (C) 2007 Ashar Voultoiz <hashar@altern.org>
6 * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
8 * http://www.mediawiki.org
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 * http://www.gnu.org/copyleft/gpl.html
25 * @addtogroup Maintenance
29 # Lacking documentation. Examples:
30 # php checkExtensions.php /opt/mw/extensions/CentralAuth/CentralAuth.i18n.php wgCentralAuthMessages
31 # php checkExtensions.php --extdir /opt/mw/extensions/
33 # BUGS: cant guess registered extensions :)
34 # TODO: let users set parameters to configure checklanguage.inc
36 // Filename for the extension i18n files database:
37 define( 'EXT_I18N_DB', 'i18n.db' );
39 $optionsWithArgs = array( 'extdir', 'lang' );
41 require_once( dirname(__FILE__
).'/../commandLine.inc' );
42 require_once( 'languages.inc' );
43 require_once( 'checkLanguage.inc' );
46 class extensionLanguages
extends languages
{
47 private $mExt18nFilename, $mExtArrayName ;
50 function __construct( $ext18nFilename, $extArrayName ) {
51 $this->mExt18nFilename
= $ext18nFilename;
52 $this->mExtArrayName
= $extArrayName;
54 $this->mIgnoredMessages
= array();
55 $this->mOptionalMessages
= array();
57 if ( file_exists( $this->mExt18nFilename
) ) {
58 require_once( $this->mExt18nFilename
);
61 if( isset( $
{$this->mExtArrayName
} ) ) {
62 // File provided in the db file
63 $foundarray = $
{$this->mExtArrayName
};
66 /* For extensions included elsewhere. For some reason other extensions
67 * break with the global statement, so recheck here.
69 global $
{$this->mExtArrayName
};
70 if( is_array( $
{$this->mExtArrayName
} ) ) {
71 $foundarray = $
{$this->mExtArrayName
};
74 /* we might have been given a function name, test it too */
75 if( function_exists( $this->mExtArrayName
) ) {
77 $funcName = $this->mExtArrayName
;
78 $foundarray = $funcName();
82 // Provided array could not be found we try to guess it.
84 # Using the extension path ($m[1]) and filename ($m[2]):
86 preg_match( '%.*/(.*)/(.*).i18n\.php%', $this->mExt18nFilename
, $m);
87 $arPathCandidate = 'wg' . $m[1].'Messages';
88 $arFileCandidate = 'wg' . $m[2].'Messages';
89 $funcCandidate = "ef{$m[2]}Messages";
92 if( isset($
$arPathCandidate) && is_array( $
$arPathCandidate ) ) {
93 print "warning> messages from guessed path array \$$arPathCandidate.\n";
94 $foundarray = $
$arPathCandidate;
95 } elseif( isset($
$arFileCandidate) && is_array( $
$arFileCandidate ) ) {
96 print "warning> messages from guessed file array \$$arFileCandidate.\n";
97 $foundarray = $
$arFileCandidate;
98 } elseif( function_exists( $funcCandidate ) ) {
99 print "warning> messages build from guessed function {$funcCandidate}().\n";
100 $foundarray = $funcCandidate();
104 # We are unlucky, return empty stuff
106 print "ERROR> failed to guess an array to use.\n";
107 $this->mExtArray
= null;
108 $this->mLanguages
= null;
113 $this->mExtArray
= $foundarray ;
114 $this->mLanguages
= array_keys( $this->mExtArray
);
116 wfDie( "File $this->mExt18nFilename not found\n" );
120 protected function loadRawMessages( $code ) {
121 if ( isset( $this->mRawMessages
[$code] ) ) {
124 if( isset( $this->mExtArray
[$code] ) ) {
125 $this->mRawMessages
[$code] = $this->mExtArray
[$code] ;
127 $this->mRawMessages
[$code] = array();
131 public function getLanguages() {
132 return $this->mLanguages
;
137 * @param $filename Filename containing the extension i18n
138 * @param $arrayname The name of the array in the filename
139 * @param $filter Optional, restrict check to a given language code (default; null)
141 function checkExtensionLanguage( $filename, $arrayname, $filter = null ) {
142 $extLanguages = new extensionLanguages($filename, $arrayname);
144 $langs = $extLanguages->getLanguages();
146 print "ERROR> \$$arrayname array does not exist.\n";
152 $nErrors +
= checkLanguage( $extLanguages, $filter );
154 print "Will check ". count($langs) . " languages : " . implode(' ', $langs) .".\n";
155 foreach( $langs as $lang ) {
156 if( $lang == 'en' ) {
157 #print "Skipped english language\n";
161 $nErrors +
= checkLanguage( $extLanguages, $lang );
169 * Read the db file, parse it, start the check.
171 function checkExtensionRepository( $extdir, $db ) {
172 $fh = fopen( $extdir. '/' . $db, 'r' );
175 while( $line = fgets( $fh ) ) {
179 if( preg_match( '/^#/', $line ) ) {
183 // Load data from i18n database
184 $data = split( ' ', chop($line) );
185 $i18n_file = @$data[0];
186 $arrayname = @$data[1];
188 print "------------------------------------------------------\n";
189 print "Checking $i18n_file (\$$arrayname).\n";
192 if( !file_exists( $extdir . '/' . $i18n_file ) ) {
193 print "ERROR> $i18n_file not found ($db:$line_number).\n";
196 # if( $arrayname == '' ) {
197 # print "warning> no array name for $i18n_file ($db:$line_number).\n";
200 $i18n_file = $extdir . '/' . $i18n_file ;
203 $nErrors = checkExtensionLanguage( $i18n_file, $arrayname, $myLang );
205 print "\nFound $nErrors error for this extension.\n";
207 print "\nFound $nErrors errors for this extension.\n";
221 php checkExtensions.php <filename> <arrayname>
222 php checkExtensions.php --extdir <extension repository>
225 --lang <language code> : only check the given language.
232 // Play with options and arguments
233 $myLang = isset($options['lang']) ?
$options['lang'] : null;
235 if( isset( $options['extdir'] ) ) {
236 $extdb = $options['extdir'] . '/' . EXT_I18N_DB
;
238 if( file_exists( $extdb ) ) {
239 checkExtensionRepository( $options['extdir'], EXT_I18N_DB
);
241 print "$extdb does not exist\n";
246 if ( isset( $argv[0] ) ) {
248 if (file_exists( $argv[0] ) ) {
249 $filename = $argv[0];
251 print "Unable to open file '{$argv[0]}'\n";
255 if ( isset( $argv[1] ) ) {
256 $arrayname = $argv[1];
258 print "You must give an array name to be checked\n";
263 checkExtensionLanguage( $filename, $arrayname, $myLang );