summaryrefslogtreecommitdiff
path: root/maintenance/InitialiseMessages.inc
blob: 189fbd2518f29c4ed986bf0e6698e0be19bc00a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<?php
/**
 * Script to initialise the MediaWiki namespace
 *
 * This script is included from update.php and install.php. Do not run it
 * by itself.
 *
 * @deprecated
 * @package MediaWiki
 * @subpackage Maintenance
 */

/** */
function initialiseMessages( $overwrite = false, $messageArray = false ) {
	global $wgContLang, $wgContLanguageCode;
	global $wgContLangClass, $wgAllMessagesEn;
	global $wgDisableLangConversion;
	global $wgForceUIMsgAsContentMsg;
	global $wgLanguageNames;
	global $IP;

	# overwrite language conversion	option so that all variants
	# of the messages are initialised
	$wgDisableLangConversion = false;

	if ( $messageArray ) {
		$sortedArray = $messageArray;
	} else {
		$sortedArray = $wgAllMessagesEn;
	}

	ksort( $sortedArray );
	$messages=array();

	$variants = $wgContLang->getVariants();
	if(!in_array($wgContLanguageCode, $variants))
		$variants[]=$wgContLanguageCode;

	foreach ($variants as $v) {
		$langclass = 'Language'. str_replace( '-', '_', ucfirst( $v ) );
		if( !class_exists($langclass) ) {
			wfDie( "class $langclass not defined. perhaps you need to include the file $langclass.php in $wgContLangClass.php?" );
		}
		$lang = new $langclass;

		if($v==$wgContLanguageCode)
			$suffix='';
		else
			$suffix="/$v";
		foreach ($sortedArray as $key => $msg) {
			$messages[$key.$suffix] = $lang->getMessage($key);
		}
	}

	require_once('languages/Names.php');

    /*
	  initialize all messages in $wgForceUIMsgAsContentMsg for all
	  languages in Names.php
    */
	if( is_array( $wgForceUIMsgAsContentMsg ) ) {
		foreach( $wgForceUIMsgAsContentMsg as $uikey ) {
			foreach( $wgLanguageNames as $code => $name) {
				if( $code == $wgContLanguageCode )
					continue;
				$msg = $wgContLang->getMessage( $uikey );
				if( $msg )
					$messages[$uikey. '/' . $code] = $msg;
			}
		}
	}
	initialiseMessagesReal( $overwrite, $messages );
}

/** */
function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
	global $wgContLang, $wgScript, $wgServer, $wgAllMessagesEn;
	global $wgOut, $wgArticle, $wgUser;
	global $wgMessageCache, $wgMemc, $wgDBname, $wgUseMemCached;

	# Initialise $wgOut and $wgUser for a command line script
	$wgOut->disable();

	$wgUser = new User;
	$wgUser->setLoaded( true ); # Don't load from DB
	$wgUser->setName( 'MediaWiki default' );

	# Don't try to draw messages from the database we're initialising
	$wgMessageCache->disable();
	$wgMessageCache->disableTransform();

	$fname = 'initialiseMessages';
	$ns = NS_MEDIAWIKI;
	# cur_user_text responsible for the modifications
	# Don't change it unless you're prepared to update the DBs accordingly, otherwise the
	# default messages won't be overwritte
	$username = 'MediaWiki default';


	print "Initialising \"MediaWiki\" namespace...\n";


	$dbr =& wfGetDB( DB_SLAVE );
	$dbw =& wfGetDB( DB_MASTER );
	$page = $dbr->tableName( 'page' );
	$revision = $dbr->tableName( 'revision' );

	$timestamp = wfTimestampNow();

	#$sql = "SELECT cur_title,cur_is_new,cur_user_text FROM $cur WHERE cur_namespace=$ns AND cur_title IN(";
	# Get keys from $wgAllMessagesEn, which is more complete than the local language
	$first = true;
	if ( $messageArray ) {
		$sortedArray = $messageArray;
	} else {
		$sortedArray = $wgAllMessagesEn;
	}

	ksort( $sortedArray );

	# SELECT all existing messages
	# Can't afford to be locking all rows for update, this script can take quite a long time to complete
	$rows = array();
	$nitems = count($sortedArray);
	$maxitems = $dbr->maxListLen();
	$pos = 0;
	if ($maxitems)
		$chunks = array_chunk($sortedArray, $maxitems);
	else
		$chunks = array($sortedArray);

	foreach ($chunks as $chunk) {
		$first = true;
		$sql = "SELECT page_title,page_is_new,rev_user_text FROM $page, $revision WHERE
			page_namespace=$ns AND rev_page=page_id AND page_title IN(";

		foreach ( $chunk as $key => $enMsg ) {
			if ( $key == '' ) {
				continue; // Skip odd members
			}
			if ( $first ) {
				$first = false;
			} else {
				$sql .= ',';
			}
			$titleObj = Title::newFromText( $wgContLang->ucfirst( $key ) );
			$enctitle = $dbr->strencode($titleObj->getDBkey());
			$sql .= "'$enctitle'";
		}

		$sql .= ')';
		$res = $dbr->query( $sql );
		while ($row = $dbr->fetchObject($res))
			$rows[] = $row;
	}

	# Read the results into an array
	# Decide whether or not each one needs to be overwritten
	$existingTitles = array();
	foreach ($rows as $row) {
		if ( $row->rev_user_text != $username  && $row->rev_user_text != 'Template namespace initialisation script' ) {
			$existingTitles[$row->page_title] = 'keep';
		} else {
			$existingTitles[$row->page_title] = 'chuck';
		}
	}

	# Insert queries are done in one multi-row insert
	# Here's the start of it:
	$arr = array();
	$talk = $wgContLang->getNsText( NS_TALK );
	$mwtalk = $wgContLang->getNsText( NS_MEDIAWIKI_TALK );

	# Merge these into a single transaction for speed
	$dbw->begin();

	# Process each message
	foreach ( $sortedArray as $key => $enMsg ) {
		if ( $key == '' ) {
			continue; // Skip odd members
		}
		# Get message text
		if ( $messageArray ) {
			$message = $enMsg;
		} else {
			$message = wfMsgNoDBForContent( $key );
		}
		$titleObj = Title::newFromText( $wgContLang->ucfirst( $key ), NS_MEDIAWIKI );
		$title = $titleObj->getDBkey();

		# Update messages which already exist
		if ( array_key_exists( $title, $existingTitles ) ) {
			if ( $existingTitles[$title] == 'chuck' || $overwrite) {
				# Don't bother writing a new revision if we're the same
				# as the current text!
				$revision = Revision::newFromTitle( $titleObj );
				if( is_null( $revision ) || $revision->getText() != $message ) {
					$article = new Article( $titleObj );
					$article->quickEdit( $message );
				}
			}
		} else {
			$article = new Article( $titleObj );
			$newid = $article->insertOn( $dbw );
			# FIXME: set restrictions
			$revision = new Revision( array(
				'page'      => $newid,
				'text'      => $message,
				'user'      => 0,
				'user_text' => $username,
				'comment'   => '',
				) );
			$revid = $revision->insertOn( $dbw );
			$article->updateRevisionOn( $dbw, $revision );
		}
	}
	$dbw->commit();

	# Clear the relevant memcached key
	print 'Clearing message cache...';
	$wgMessageCache->clear();
	print "Done.\n";
}

/** */
function loadLanguageFile( $filename ) {
	$contents = file_get_contents( $filename );
	# Remove header line
	$p = strpos( $contents, "\n" ) + 1;
	$contents = substr( $contents, $p );
	# Unserialize
	return unserialize( $contents );
}

/** */
function doUpdates() {
	global $wgDeferredUpdateList;
	foreach ( $wgDeferredUpdateList as $up ) { $up->doUpdate(); }
}
?>