3 * Handle messages in the language files.
6 * @subpackage Maintenance
10 private $mList = array();
11 private $mMessages = array();
12 private $mIgnoredMessages = array(
20 'exif-software-value',
26 'markaspatrolledlink',
27 'metadata-fields', // Objection, contains help
30 'number_of_watching_users_RCview',
35 'shareddescriptionfollows',
47 * Load the list of languages: all the Messages*.php
48 * files in the languages directory.
50 function __construct() {
52 $dir = opendir("$IP/languages");
53 while ( $file = readdir( $dir ) ) {
54 if ( preg_match( "/Messages([^.]*?)\.php$/", $file, $matches ) ) {
55 $this->mList[] = $matches[1];
62 * Get the language list.
64 * @return the language list
66 public function getList() {
71 * Load the messages for a specific langauge from the messages file.
73 * @param $code The langauge code.
75 private function loadMessages( $code ) {
76 if ( !isset( $this->mMessages[$code] ) ) {
78 $filename = Language::getFileName( "$IP/languages/Messages", $code, '.php' );
79 if ( file_exists( $filename ) ) {
81 if ( isset( $messages ) ) {
82 $this->mMessages[$code] = $messages;
84 $this->mMessages[$code] = array();
87 $this->mMessages[$code] = array();
93 * Get all the messages for a specific langauge, without the fallback
96 * @param $code The langauge code.
98 * @return The messages in this language.
100 public function getMessagesFor( $code ) {
101 $this->loadMessages( $code );
102 return $this->mMessages[$code];
106 * Get all the messages of all the languages.
108 public function getAllMessages() {
109 foreach ( $this->mList as $code ) {
110 $this->getMessages( $code );
115 * Get the untranslated messages for a specific language.
117 * @param $code The langauge code.
119 * @return The untranslated messages for this language.
121 public function getUntranslatedMessages( $code ) {
122 $this->loadMessages( 'en' );
123 $this->loadMessages( $code );
124 $untranslatedMessages = array();
125 foreach ( $this->mMessages['en'] as $key => $value ) {
126 if ( !isset( $this->mMessages[$code][$key] ) && !in_array( $key, $this->mIgnoredMessages ) ) {
127 $untranslatedMessages[$key] = $value;
130 return $untranslatedMessages;
134 * Get the duplicate messages for a specific language.
136 * @param $code The langauge code.
138 * @return The duplicate messages for this language.
140 public function getDuplicateMessages( $code ) {
141 $this->loadMessages( 'en' );
142 $this->loadMessages( $code );
143 $duplicateMessages = array();
144 foreach ( $this->mMessages[$code] as $key => $value ) {
145 if ( @$this->mMessages['en'][$key] == $value ) {
146 $duplicateMessages[$key] = $value;
149 return $duplicateMessages;
153 * Get the obsolete messages for a specific language.
155 * @param $code The langauge code.
157 * @return The obsolete messages for this language.
159 public function getObsoleteMessages( $code ) {
160 $this->loadMessages( 'en' );
161 $this->loadMessages( $code );
162 $obsoleteMessages = array();
163 foreach ( $this->mMessages[$code] as $key => $value ) {
164 if ( !isset( $this->mMessages['en'][$key] ) ) {
165 $obsoleteMessages[$key] = $value;
168 return $obsoleteMessages;
172 * Get the messages which do not use some variables.
174 * @param $code The langauge code.
176 * @return The messages which do not use some variables in this language.
178 public function getMessagesWithoutVariables( $code ) {
179 $this->loadMessages( 'en' );
180 $this->loadMessages( $code );
181 $variables = array( '\$1', '\$2', '\$3', '\$4', '\$5', '\$6', '\$7', '\$8', '\$9' );
182 $messagesWithoutVariables = array();
183 foreach ( $this->mMessages[$code] as $key => $value ) {
184 if ( isset( $this->mMessages['en'][$key] ) ) {
186 foreach ( $variables as $var ) {
187 if ( preg_match( "/$var/sU", $this->mMessages['en'][$key] ) &&
188 !preg_match( "/$var/sU", $value ) ) {
189 $missing[] = str_replace( '\$', '$', $var );
192 if ( count( $missing ) > 0 ) {
193 $messagesWithoutVariables[$key] = implode( ', ', $missing );
197 return $messagesWithoutVariables;
201 * Get the empty messages.
203 * @param $code The langauge code.
205 * @return The empty messages for this language.
207 public function getEmptyMessages( $code ) {
208 $this->loadMessages( 'en' );
209 $this->loadMessages( $code );
210 $emptyMessages = array();
211 foreach ( $this->mMessages[$code] as $key => $value ) {
212 if ( isset( $this->mMessages['en'][$key] ) &&
213 ( $this->mMessages[$code][$key] === '' || $this->mMessages[$code][$key] === '-' ) ) {
214 $emptyMessages[$key] = $value;
217 return $emptyMessages;
221 * Get the messages with trailing whitespace.
223 * @param $code The langauge code.
225 * @return The messages with trailing whitespace in this language.
227 public function getMessagesWithWhitespace( $code ) {
228 $this->loadMessages( 'en' );
229 $this->loadMessages( $code );
230 $messagesWithWhitespace = array();
231 foreach ( $this->mMessages[$code] as $key => $value ) {
232 if ( isset( $this->mMessages['en'][$key] ) && $this->mMessages['en'][$key] !== '' &&
233 $value !== rtrim( $value ) ) {
234 $messagesWithWhitespace[$key] = $value;
237 return $messagesWithWhitespace;
241 * Get the non-XHTML messages.
243 * @param $code The langauge code.
245 * @return The non-XHTML messages for this language.
247 public function getNonXHTMLMessages( $code ) {
248 $this->loadMessages( 'en' );
249 $this->loadMessages( $code );
250 $wrongPhrases = array(
256 $wrongPhrases = '~(' . implode( '|', $wrongPhrases ) . ')~sDu';
257 $nonXHTMLMessages = array();
258 foreach ( $this->mMessages[$code] as $key => $value ) {
259 if ( isset( $this->mMessages['en'][$key] ) && preg_match( $wrongPhrases, $value ) ) {
260 $nonXHTMLMessages[$key] = $value;
263 return $nonXHTMLMessages;
267 * Output a messages list.
269 * @param $messages The messages list.
270 * @param $text The text to show before the list (optional).
271 * @param $hideMessages Hide the real messages if specified.
273 public function outputMessagesList( $messages, $text = '', $hideMessages = false ) {
274 if ( count( $messages ) > 0 ) {
278 if ( $hideMessages ) {
279 echo "[messages are hidden]\n";
281 foreach ( $messages as $key => $value ) {
282 echo "* '$key': $value\n";