MediaWiki  master
ApiQueryAllMessages.php
Go to the documentation of this file.
1 <?php
24 
31 
32  public function __construct( ApiQuery $query, $moduleName ) {
33  parent::__construct( $query, $moduleName, 'am' );
34  }
35 
36  public function execute() {
37  $params = $this->extractRequestParams();
38 
39  if ( is_null( $params['lang'] ) ) {
40  $langObj = $this->getLanguage();
41  } elseif ( !Language::isValidCode( $params['lang'] ) ) {
42  $this->dieWithError(
43  [ 'apierror-invalidlang', $this->encodeParamName( 'lang' ) ], 'invalidlang'
44  );
45  } else {
46  $langObj = Language::factory( $params['lang'] );
47  }
48 
49  if ( $params['enableparser'] ) {
50  if ( !is_null( $params['title'] ) ) {
51  $title = Title::newFromText( $params['title'] );
52  if ( !$title || $title->isExternal() ) {
53  $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
54  }
55  } else {
56  $title = Title::newFromText( 'API' );
57  }
58  }
59 
60  $prop = array_flip( (array)$params['prop'] );
61 
62  // Determine which messages should we print
63  if ( in_array( '*', $params['messages'] ) ) {
64  $message_names = Language::getMessageKeysFor( $langObj->getCode() );
65  if ( $params['includelocal'] ) {
66  $message_names = array_unique( array_merge(
67  $message_names,
68  // Pass in the content language code so we get local messages that have a
69  // MediaWiki:msgkey page. We might theoretically miss messages that have no
70  // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
71  // just a stupid case.
72  MessageCache::singleton()->getAllMessageKeys( $this->getConfig()->get( 'LanguageCode' ) )
73  ) );
74  }
75  sort( $message_names );
76  $messages_target = $message_names;
77  } else {
78  $messages_target = $params['messages'];
79  }
80 
81  // Filter messages that have the specified prefix
82  // Because we sorted the message array earlier, they will appear in a clump:
83  if ( isset( $params['prefix'] ) ) {
84  $skip = false;
85  $messages_filtered = [];
86  foreach ( $messages_target as $message ) {
87  // === 0: must be at beginning of string (position 0)
88  if ( strpos( $message, $params['prefix'] ) === 0 ) {
89  if ( !$skip ) {
90  $skip = true;
91  }
92  $messages_filtered[] = $message;
93  } elseif ( $skip ) {
94  break;
95  }
96  }
97  $messages_target = $messages_filtered;
98  }
99 
100  // Filter messages that contain specified string
101  if ( isset( $params['filter'] ) ) {
102  $messages_filtered = [];
103  foreach ( $messages_target as $message ) {
104  // !== is used because filter can be at the beginning of the string
105  if ( strpos( $message, $params['filter'] ) !== false ) {
106  $messages_filtered[] = $message;
107  }
108  }
109  $messages_target = $messages_filtered;
110  }
111 
112  // Whether we have any sort of message customisation filtering
113  $customiseFilterEnabled = $params['customised'] !== 'all';
114  if ( $customiseFilterEnabled ) {
115  $customisedMessages = AllMessagesTablePager::getCustomisedStatuses(
116  array_map(
117  [ $langObj, 'ucfirst' ],
118  $messages_target
119  ),
120  $langObj->getCode(),
121  !$langObj->equals( MediaWikiServices::getInstance()->getContentLanguage() )
122  );
123 
124  $customised = $params['customised'] === 'modified';
125  }
126 
127  // Get all requested messages and print the result
128  $skip = !is_null( $params['from'] );
129  $useto = !is_null( $params['to'] );
130  $result = $this->getResult();
131  foreach ( $messages_target as $message ) {
132  // Skip all messages up to $params['from']
133  if ( $skip && $message === $params['from'] ) {
134  $skip = false;
135  }
136 
137  if ( $useto && $message > $params['to'] ) {
138  break;
139  }
140 
141  if ( !$skip ) {
142  $a = [
143  'name' => $message,
144  'normalizedname' => MessageCache::normalizeKey( $message ),
145  ];
146 
147  $args = [];
148  if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) {
149  $args = $params['args'];
150  }
151 
152  if ( $customiseFilterEnabled ) {
153  $messageIsCustomised = isset( $customisedMessages['pages'][$langObj->ucfirst( $message )] );
154  if ( $customised === $messageIsCustomised ) {
155  if ( $customised ) {
156  $a['customised'] = true;
157  }
158  } else {
159  continue;
160  }
161  }
162 
163  $msg = wfMessage( $message, $args )->inLanguage( $langObj );
164 
165  if ( !$msg->exists() ) {
166  $a['missing'] = true;
167  } else {
168  // Check if the parser is enabled:
169  if ( $params['enableparser'] ) {
170  $msgString = $msg->title( $title )->text();
171  } else {
172  $msgString = $msg->plain();
173  }
174  if ( !$params['nocontent'] ) {
175  ApiResult::setContentValue( $a, 'content', $msgString );
176  }
177  if ( isset( $prop['default'] ) ) {
178  $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
179  if ( !$default->exists() ) {
180  $a['defaultmissing'] = true;
181  } elseif ( $default->plain() != $msgString ) {
182  $a['default'] = $default->plain();
183  }
184  }
185  }
186  $fit = $result->addValue( [ 'query', $this->getModuleName() ], null, $a );
187  if ( !$fit ) {
188  $this->setContinueEnumParameter( 'from', $message );
189  break;
190  }
191  }
192  }
193  $result->addIndexedTagName( [ 'query', $this->getModuleName() ], 'message' );
194  }
195 
196  public function getCacheMode( $params ) {
197  if ( is_null( $params['lang'] ) ) {
198  // Language not specified, will be fetched from preferences
199  return 'anon-public-user-private';
200  } elseif ( $params['enableparser'] ) {
201  // User-specific parser options will be used
202  return 'anon-public-user-private';
203  } else {
204  // OK to cache
205  return 'public';
206  }
207  }
208 
209  public function getAllowedParams() {
210  return [
211  'messages' => [
212  ApiBase::PARAM_DFLT => '*',
213  ApiBase::PARAM_ISMULTI => true,
214  ],
215  'prop' => [
216  ApiBase::PARAM_ISMULTI => true,
218  'default'
219  ]
220  ],
221  'enableparser' => false,
222  'nocontent' => false,
223  'includelocal' => false,
224  'args' => [
225  ApiBase::PARAM_ISMULTI => true,
227  ],
228  'filter' => [],
229  'customised' => [
230  ApiBase::PARAM_DFLT => 'all',
232  'all',
233  'modified',
234  'unmodified'
235  ]
236  ],
237  'lang' => null,
238  'from' => null,
239  'to' => null,
240  'title' => null,
241  'prefix' => null,
242  ];
243  }
244 
245  protected function getExamplesMessages() {
246  return [
247  'action=query&meta=allmessages&amprefix=ipb-'
248  => 'apihelp-query+allmessages-example-ipb',
249  'action=query&meta=allmessages&ammessages=august|mainpage&amlang=de'
250  => 'apihelp-query+allmessages-example-de',
251  ];
252  }
253 
254  public function getHelpUrls() {
255  return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allmessages';
256  }
257 }
const PARAM_TYPE
(string|string[]) Either an array of allowed value strings, or a string type as described below...
Definition: ApiBase.php:94
wfEscapeWikiText( $text)
Escapes the given text so that it may be output using addWikiText() without any linking, formatting, etc.
getResult()
Get the result object.
Definition: ApiBase.php:640
const PARAM_DFLT
(null|boolean|integer|string) Default value of the parameter.
Definition: ApiBase.php:55
This is a base class for all Query modules.
dieWithError( $msg, $code=null, $data=null, $httpCode=null)
Abort execution with an error.
Definition: ApiBase.php:2005
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user...
Definition: ApiBase.php:761
__construct(ApiQuery $query, $moduleName)
static setContentValue(array &$arr, $name, $value, $flags=0)
Add an output value to the array by name and mark as META_CONTENT.
Definition: ApiResult.php:478
static getCustomisedStatuses( $messageNames, $langcode='en', $foreign=false)
Determine which of the MediaWiki and MediaWiki_talk namespace pages exist.
static normalizeKey( $key)
Normalize message key input.
if( $line===false) $args
Definition: cdb.php:64
static getMessageKeysFor( $code)
Get all message keys for a given language.
Definition: Language.php:4438
A query action to return messages from site message cache.
getModuleName()
Get the name of the module being executed by this instance.
Definition: ApiBase.php:520
static factory( $code)
Get a cached or new language object for a given language code.
Definition: Language.php:212
This is the main query class.
Definition: ApiQuery.php:37
encodeParamName( $paramName)
This method mangles parameter name based on the prefix supplied to the constructor.
Definition: ApiBase.php:739
const PARAM_ISMULTI
(boolean) Accept multiple pipe-separated values for this parameter (e.g.
Definition: ApiBase.php:58
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
static isValidCode( $code)
Returns true if a language code string is of a valid form, whether or not it exists.
Definition: Language.php:379
const PARAM_ALLOW_DUPLICATES
(boolean) Allow the same value to be set more than once when PARAM_ISMULTI is true?
Definition: ApiBase.php:109
static singleton()
Get the singleton instance of this class.
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:319
setContinueEnumParameter( $paramName, $paramValue)
Set a query-continue value.