MediaWiki master
ApiQueryLanguageinfo.php
Go to the documentation of this file.
1<?php
26use Wikimedia\Timestamp\ConvertibleTimestamp;
27
34
44 private const MAX_EXECUTE_SECONDS = 3;
45
46 private LanguageFactory $languageFactory;
47 private LanguageNameUtils $languageNameUtils;
48 private LanguageFallback $languageFallback;
49 private LanguageConverterFactory $languageConverterFactory;
50
59 public function __construct(
60 ApiQuery $queryModule,
61 $moduleName,
62 LanguageFactory $languageFactory,
63 LanguageNameUtils $languageNameUtils,
64 LanguageFallback $languageFallback,
65 LanguageConverterFactory $languageConverterFactory
66 ) {
67 parent::__construct( $queryModule, $moduleName, 'li' );
68 $this->languageFactory = $languageFactory;
69 $this->languageNameUtils = $languageNameUtils;
70 $this->languageFallback = $languageFallback;
71 $this->languageConverterFactory = $languageConverterFactory;
72 }
73
74 public function execute() {
75 // ConvertibleTimestamp::time() used so we can fake the current time in tests
76 $endTime = ConvertibleTimestamp::time() + self::MAX_EXECUTE_SECONDS;
77
78 $props = array_fill_keys( $this->getParameter( 'prop' ), true );
79 $includeCode = isset( $props['code'] );
80 $includeBcp47 = isset( $props['bcp47'] );
81 $includeDir = isset( $props['dir'] );
82 $includeAutonym = isset( $props['autonym'] );
83 $includeName = isset( $props['name'] );
84 $includeVariantnames = isset( $props['variantnames'] );
85 $includeFallbacks = isset( $props['fallbacks'] );
86 $includeVariants = isset( $props['variants'] );
87
88 $targetLanguageCode = $this->getLanguage()->getCode();
89 $include = LanguageNameUtils::ALL;
90
91 $availableLanguageCodes = array_keys( $this->languageNameUtils->getLanguageNames(
92 // MediaWiki and extensions may return different sets of language codes
93 // when asked for language names in different languages;
94 // asking for English language names is most likely to give us the full set,
95 // even though we may not need those at all
96 'en',
97 $include
98 ) );
99 $selectedLanguageCodes = $this->getParameter( 'code' );
100 if ( $selectedLanguageCodes === [ '*' ] ) {
101 $languageCodes = $availableLanguageCodes;
102 } else {
103 $languageCodes = array_values( array_intersect(
104 $availableLanguageCodes,
105 $selectedLanguageCodes
106 ) );
107 $unrecognizedCodes = array_values( array_diff(
108 $selectedLanguageCodes,
109 $availableLanguageCodes
110 ) );
111 if ( $unrecognizedCodes !== [] ) {
112 $this->addWarning( [
113 'apiwarn-unrecognizedvalues',
114 $this->encodeParamName( 'code' ),
115 Message::listParam( $unrecognizedCodes, 'comma' ),
116 count( $unrecognizedCodes ),
117 ] );
118 }
119 }
120 // order of $languageCodes is guaranteed by LanguageNameUtils::getLanguageNames()
121 // and preserved by array_values() + array_intersect()
122
123 $continue = $this->getParameter( 'continue' ) ?? reset( $languageCodes );
124
125 $result = $this->getResult();
126 $rootPath = [
127 $this->getQuery()->getModuleName(),
128 $this->getModuleName(),
129 ];
130 $result->addArrayType( $rootPath, 'assoc' );
131
132 foreach ( $languageCodes as $languageCode ) {
133 if ( $languageCode < $continue ) {
134 continue;
135 }
136
137 $now = ConvertibleTimestamp::time();
138 if ( $now >= $endTime ) {
139 $this->setContinueEnumParameter( 'continue', $languageCode );
140 break;
141 }
142
143 $info = [];
144 ApiResult::setArrayType( $info, 'assoc' );
145
146 if ( $includeCode ) {
147 $info['code'] = $languageCode;
148 }
149
150 if ( $includeBcp47 ) {
151 $bcp47 = LanguageCode::bcp47( $languageCode );
152 $info['bcp47'] = $bcp47;
153 }
154
155 if ( $includeDir ) {
156 $dir = $this->languageFactory->getLanguage( $languageCode )->getDir();
157 $info['dir'] = $dir;
158 }
159
160 if ( $includeAutonym ) {
161 $autonym = $this->languageNameUtils->getLanguageName(
162 $languageCode,
163 LanguageNameUtils::AUTONYMS,
164 $include
165 );
166 $info['autonym'] = $autonym;
167 }
168
169 if ( $includeName ) {
170 $name = $this->languageNameUtils->getLanguageName(
171 $languageCode,
172 $targetLanguageCode,
173 $include
174 );
175 $info['name'] = $name;
176 }
177
178 if ( $includeFallbacks ) {
179 $fallbacks = $this->languageFallback->getAll(
180 $languageCode,
181 // allow users to distinguish between implicit and explicit 'en' fallbacks
182 LanguageFallback::STRICT
183 );
184 ApiResult::setIndexedTagName( $fallbacks, 'fb' );
185 $info['fallbacks'] = $fallbacks;
186 }
187
188 if ( $includeVariants || $includeVariantnames ) {
189 $language = $this->languageFactory->getLanguage( $languageCode );
190 $converter = $this->languageConverterFactory->getLanguageConverter( $language );
191 $variants = $converter->getVariants();
192
193 if ( $includeVariants ) {
194 $info['variants'] = $variants;
195 ApiResult::setIndexedTagName( $info['variants'], 'var' );
196 }
197 if ( $includeVariantnames ) {
198 $info['variantnames'] = [];
199 foreach ( $variants as $variantCode ) {
200 $info['variantnames'][$variantCode] = $language->getVariantname( $variantCode );
201 }
202 }
203 }
204
205 $fit = $result->addValue( $rootPath, $languageCode, $info );
206 if ( !$fit ) {
207 $this->setContinueEnumParameter( 'continue', $languageCode );
208 break;
209 }
210 }
211 }
212
213 public function getCacheMode( $params ) {
214 return 'public';
215 }
216
217 public function getAllowedParams() {
218 return [
219 'prop' => [
220 ParamValidator::PARAM_DEFAULT => 'code',
221 ParamValidator::PARAM_ISMULTI => true,
222 ParamValidator::PARAM_TYPE => [
223 'code',
224 'bcp47',
225 'dir',
226 'autonym',
227 'name',
228 'variantnames',
229 'fallbacks',
230 'variants',
231 ],
232 self::PARAM_HELP_MSG_PER_VALUE => [],
233 ],
234 'code' => [
235 ParamValidator::PARAM_DEFAULT => '*',
236 ParamValidator::PARAM_ISMULTI => true,
237 ],
238 'continue' => [
239 self::PARAM_HELP_MSG => 'api-help-param-continue',
240 ],
241 ];
242 }
243
244 protected function getExamplesMessages() {
245 $pathUrl = 'action=' . $this->getQuery()->getModuleName() .
246 '&meta=' . $this->getModuleName();
247 $pathMsg = $this->getModulePath();
248 $prefix = $this->getModulePrefix();
249
250 return [
251 "$pathUrl"
252 => "apihelp-$pathMsg-example-simple",
253 "$pathUrl&{$prefix}prop=autonym|name&uselang=de"
254 => "apihelp-$pathMsg-example-autonym-name-de",
255 "$pathUrl&{$prefix}prop=fallbacks|variants&{$prefix}code=oc"
256 => "apihelp-$pathMsg-example-fallbacks-variants-oc",
257 "$pathUrl&{$prefix}prop=bcp47|dir"
258 => "apihelp-$pathMsg-example-bcp47-dir",
259 ];
260 }
261
262}
array $params
The job parameters.
getModulePrefix()
Get parameter prefix (usually two letters or an empty string).
Definition ApiBase.php:541
getParameter( $paramName, $parseLimit=true)
Get a value for the given parameter.
Definition ApiBase.php:933
encodeParamName( $paramName)
This method mangles parameter name based on the prefix supplied to the constructor.
Definition ApiBase.php:789
getResult()
Get the result object.
Definition ApiBase.php:671
getModulePath()
Get the path to this module.
Definition ApiBase.php:611
addWarning( $msg, $code=null, $data=null)
Add a warning for this module.
Definition ApiBase.php:1451
getModuleName()
Get the name of the module being executed by this instance.
Definition ApiBase.php:532
This is a base class for all Query modules.
setContinueEnumParameter( $paramName, $paramValue)
Set a query-continue value.
getQuery()
Get the main Query module.
API module to enumerate language information.
execute()
Evaluates the parameters, performs the requested query, and sets up the result.
getExamplesMessages()
Returns usage examples for this module.
__construct(ApiQuery $queryModule, $moduleName, LanguageFactory $languageFactory, LanguageNameUtils $languageNameUtils, LanguageFallback $languageFallback, LanguageConverterFactory $languageConverterFactory)
getCacheMode( $params)
Get the cache mode for the data generated by this module.
getAllowedParams()
Returns an array of allowed parameters (parameter name) => (default value) or (parameter name) => (ar...
This is the main query class.
Definition ApiQuery.php:43
An interface for creating language converters.
Internationalisation code See https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation for more...
A service that provides utilities to do with language names and codes.
Service for formatting and validating API parameters.