62 $this->doLinks = isset(
$options[
'links'] );
63 $this->includeExif = !isset(
$options[
'noexif'] );
64 $this->checkAll = isset(
$options[
'all'] );
67 $this->linksPrefix =
$options[
'prefix'];
70 if ( isset(
$options[
'wikilang'] ) ) {
71 $this->wikiCode =
$options[
'wikilang'];
74 if ( isset(
$options[
'whitelist'] ) ) {
75 $this->checks = explode(
',',
$options[
'whitelist'] );
76 } elseif ( isset(
$options[
'blacklist'] ) ) {
77 $this->checks = array_diff(
79 explode(
',',
$options[
'blacklist'] )
81 } elseif ( isset(
$options[
'easy'] ) ) {
88 $this->
output = $options[
'output'];
91 $this->L =
new Languages( $this->includeExif );
100 'untranslated',
'duplicate',
'obsolete',
'variables',
'empty',
'plural',
101 'whitespace',
'xhtml',
'chars',
'links',
'unbalanced',
'namespace',
102 'projecttalk',
'magic',
'magic-old',
'magic-over',
'magic-case',
103 'special',
'special-old',
113 'namespace',
'projecttalk',
'magic',
'magic-old',
'magic-over',
114 'magic-case',
'special',
'special-old',
124 'duplicate',
'obsolete',
'empty',
'whitespace',
'xhtml',
'chars',
'magic-old',
125 'magic-over',
'magic-case',
'special-old',
135 'untranslated' =>
'getUntranslatedMessages',
136 'duplicate' =>
'getDuplicateMessages',
137 'obsolete' =>
'getObsoleteMessages',
138 'variables' =>
'getMessagesWithMismatchVariables',
139 'plural' =>
'getMessagesWithoutPlural',
140 'empty' =>
'getEmptyMessages',
141 'whitespace' =>
'getMessagesWithWhitespace',
142 'xhtml' =>
'getNonXHTMLMessages',
143 'chars' =>
'getMessagesWithWrongChars',
144 'links' =>
'getMessagesWithDubiousLinks',
145 'unbalanced' =>
'getMessagesWithUnbalanced',
146 'namespace' =>
'getUntranslatedNamespaces',
147 'projecttalk' =>
'getProblematicProjectTalks',
148 'magic' =>
'getUntranslatedMagicWords',
149 'magic-old' =>
'getObsoleteMagicWords',
150 'magic-over' =>
'getOverridingMagicWords',
151 'magic-case' =>
'getCaseMismatchMagicWords',
152 'special' =>
'getUntraslatedSpecialPages',
153 'special-old' =>
'getObsoleteSpecialPages',
165 'namespace' => [
'getNamespaceNames',
'en' ],
166 'projecttalk' =>
null,
167 'magic' => [
'getMagicWords',
'en' ],
168 'magic-old' => [
'getMagicWords', null ],
169 'magic-over' => [
'getMagicWords', null ],
170 'magic-case' => [
'getMagicWords', null ],
171 'special' => [
'getSpecialPageAliases',
'en' ],
172 'special-old' => [
'getSpecialPageAliases', null ],
182 'untranslated' =>
'$1 message(s) of $2 are not translated to $3, but exist in en:',
183 'duplicate' =>
'$1 message(s) of $2 are translated the same in en and $3:',
185 '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:',
186 'variables' =>
'$1 message(s) of $2 in $3 don\'t match the variables used in en:',
187 'plural' =>
'$1 message(s) of $2 in $3 don\'t use {{plural}} while en uses:',
188 'empty' =>
'$1 message(s) of $2 in $3 are empty or -:',
189 'whitespace' =>
'$1 message(s) of $2 in $3 have trailing whitespace:',
190 'xhtml' =>
'$1 message(s) of $2 in $3 contain illegal XHTML:',
192 '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:',
193 'links' =>
'$1 message(s) of $2 in $3 have problematic link(s):',
194 'unbalanced' =>
'$1 message(s) of $2 in $3 have unbalanced {[]}:',
195 'namespace' =>
'$1 namespace name(s) of $2 are not translated to $3, but exist in en:',
197 '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:',
198 'magic' =>
'$1 magic word(s) of $2 are not translated to $3, but exist in en:',
199 'magic-old' =>
'$1 magic word(s) of $2 do not exist in en, but exist in $3:',
200 'magic-over' =>
'$1 magic word(s) of $2 in $3 do not contain the original en word(s):',
202 '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:',
203 'special' =>
'$1 special page alias(es) of $2 are not translated to $3, but exist in en:',
204 'special-old' =>
'$1 special page alias(es) of $2 do not exist in en, but exist in $3:',
219 --all: Check all customized languages.
220 --level: Show the following display level (
default: 2):
221 * 0: Skip the checks (useful
for checking syntax).
224 * 2: Show only the
headers and the message keys, without the message
229 --prefix: prefix to add to
links.
230 --wikilang: For the
links, what is the content
language of the wiki to
233 translate),
if you know what they are currently not translated and want
234 to focus on other problems (
default off).
235 --whitelist: Do only the following checks (
form:
code,
code).
236 --blacklist: Do not
do the following checks (
form:
code,
code).
237 --easy: Do only the easy checks, which can be treated by non-speakers of
240Check codes (ideally, all of them should result 0; all the checks are executed
242 * untranslated: Messages which are required to translate, but are not
244 * duplicate: Messages which translation equal to fallback.
245 * obsolete: Messages which are untranslatable or
do not exist, but are
247 * variables: Messages without variables which should be
used, or with
248 variables which should not be used.
249 * empty: Empty messages and messages that contain only -.
250 * whitespace: Messages which have trailing whitespace.
251 * xhtml: Messages which are not well-formed XHTML (checks only few common
253 * chars: Messages with hidden characters.
255 * unbalanced: Messages which contains unequal numbers of opening {[ and
257 *
namespace: Namespace names that
were not translated.
258 * projecttalk: Namespace names and aliases where the
project talk does not
260 * magic: Magic words that
were not translated.
261 * magic-old: Magic words which
do not exist.
262 * magic-over: Magic words that
override the original English word.
263 * magic-
case: Magic words whose translation changes the
case-sensitivity of
264 the original English word.
265 * special: Special page names that
were not translated.
266 * special-old: Special page names which
do not exist.
276 if ( $this->level > 0 ) {
277 switch ( $this->
output ) {
285 throw new MWException(
"Invalid output type $this->output" );
294 $ignoredCodes = [
'en',
'enRTL' ];
298 if ( $this->checkAll ) {
299 foreach ( $this->L->getLanguages() as $language ) {
300 if ( !in_array( $language, $ignoredCodes ) ) {
301 $this->results[$language] = $this->
checkLanguage( $language );
305 if ( in_array( $this->code, $ignoredCodes ) ) {
306 throw new MWException(
"Cannot check code $this->code." );
315 foreach (
$messages as $key => $details ) {
317 unset( $this->results[
$code][$check][$key] );
329 static $blacklist =
null;
331 if ( $blacklist !==
null ) {
341 Hooks::run(
'LocalisationChecksBlacklist', [ &$blacklist ] );
357 foreach ( $blacklist as $item ) {
358 if ( isset( $item[
'check'] ) && $check !== $item[
'check'] ) {
362 if ( isset( $item[
'code'] ) && !in_array(
$code, $item[
'code'] ) ) {
366 if ( isset( $item[
'message'] ) &&
367 ( $message ===
false || !in_array( $message, $item[
'message'] ) )
387 if ( $this->level === 0 ) {
388 $this->L->getMessages(
$code );
394 foreach ( $this->checks as $check ) {
400 $callback = [
$this->L, $checkFunctions[$check] ];
401 if ( !is_callable( $callback ) ) {
417 if ( $this->doLinks ) {
418 $displayKey = ucfirst( $key );
419 if (
$code == $this->wikiCode ) {
420 return "[[{$this->linksPrefix}MediaWiki:$displayKey|$key]]";
422 return "[[{$this->linksPrefix}MediaWiki:$displayKey/$code|$key]]";
434 $translated = $this->L->getMessages(
$code );
435 $translated = count( $translated[
'translated'] );
439 if ( $check ==
'untranslated' ) {
440 $translatable = $this->L->getGeneralMessages();
441 $total = count( $translatable[
'translatable'] );
444 $totalCount = $totalCount[$check];
445 $callback = [
$this->L, $totalCount[0] ];
446 $callCode = $totalCount[1] ? $totalCount[1] :
$code;
447 $total = count( call_user_func( $callback, $callCode ) );
449 $total = $translated;
451 $search = [
'$1',
'$2',
'$3' ];
452 $replace = [ $count, $total,
$code ];
454 echo
"\n" . str_replace( $search, $replace, $descriptions[$check] ) .
"\n";
455 if ( $this->level == 1 ) {
456 echo
"[messages are hidden]\n";
462 if ( $this->level == 2 || empty(
$value ) ) {
465 echo
"* $key: '$value'\n";
479 $rows[] =
'! Language !! Code !! Total !! ' .
482 $detailTextForLang =
"==$code==\n";
485 $detailTextForLangChecks = [];
493 $messageDetails = [];
494 foreach (
$messages as $key => $details ) {
496 $messageDetails[] = $displayKey;
498 $detailTextForLangChecks[] =
"=== $code-$check ===\n* " . implode(
', ', $messageDetails );
499 $numbers[] =
"'''[[#$code-$check|$count]]'''";
505 if ( count( $detailTextForLangChecks ) ) {
506 $detailText .= $detailTextForLang . implode(
"\n", $detailTextForLangChecks ) .
"\n";
510 # Don't list languages without problems
513 $language = Language::fetchLanguageName(
$code );
514 $rows[] =
"| $language || $code || $problems || " . implode(
' || ', $numbers );
517 $tableRows = implode(
"\n|-\n",
$rows );
522'''Check results are
for:
''' <code>$version</code>
525{|
class=
"sortable wikitable" border=
"2" cellpadding=
"4" cellspacing=
"0" style=
"background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear: both;"
540 foreach ( $this->results as
$results ) {
579 $this->doLinks = isset(
$options[
'links'] );
581 if ( isset(
$options[
'wikilang'] ) ) {
582 $this->wikiCode =
$options[
'wikilang'];
585 if ( isset(
$options[
'whitelist'] ) ) {
586 $this->checks = explode(
',',
$options[
'whitelist'] );
587 } elseif ( isset(
$options[
'blacklist'] ) ) {
588 $this->checks = array_diff(
590 explode(
',',
$options[
'blacklist'] )
592 } elseif ( isset(
$options[
'easy'] ) ) {
598 if ( isset(
$options[
'output'] ) ) {
599 $this->
output = $options[
'output'];
602 # Some additional checks not enabled by default
603 if ( isset(
$options[
'duplicate'] ) ) {
604 $this->checks[] =
'duplicate';
607 $this->extensions = [];
608 $extensions =
new PremadeMediawikiExtensionGroups();
610 if ( $extension ==
'all' ) {
611 foreach ( MessageGroups::singleton()->getGroups() as $group ) {
612 if ( strpos( $group->getId(),
'ext-' ) === 0 && !$group->isMeta() ) {
616 } elseif ( $extension ==
'wikimedia' ) {
617 $wikimedia = MessageGroups::getGroup(
'ext-0-wikimedia' );
618 foreach ( $wikimedia->wmfextensions() as $extension ) {
619 $group = MessageGroups::getGroup( $extension );
622 } elseif ( $extension ==
'flaggedrevs' ) {
623 foreach ( MessageGroups::singleton()->getGroups() as $group ) {
624 if ( strpos( $group->getId(),
'ext-flaggedrevs-' ) === 0 && !$group->isMeta() ) {
631 $group = MessageGroups::getGroup(
'ext-' . $extension );
634 $this->extensions[] = $extension;
636 print "No such extension $extension.\n";
648 'untranslated',
'duplicate',
'obsolete',
'variables',
'empty',
'plural',
649 'whitespace',
'xhtml',
'chars',
'links',
'unbalanced',
667 'duplicate',
'obsolete',
'empty',
'whitespace',
'xhtml',
'chars',
678all of them. Command
line settings are in
form --parameter[=value], except
for
681 *
First parameter (mandatory): Extension
name, multiple extension
names
682 (separated by commas),
"all" for all the
extensions,
"wikimedia" for
683 extensions used by Wikimedia or
"flaggedrevs" for all FLaggedRevs
687 * level: Show the following display level (
default: 2).
689 * wikilang: For the
links, what is the content
language of the wiki to
691 * whitelist: Do only the following checks (
form:
code,
code).
693 * easy: Do only the easy checks, which can be treated by non-speakers of
696Check codes (ideally, all of them should result 0; all the checks are executed
698 * untranslated: Messages which are required to translate, but are not
700 * duplicate: Messages which translation equal to fallback.
701 * obsolete: Messages which are untranslatable, but translated.
702 * variables: Messages without variables which should be
used, or with
703 variables which should not be used.
704 * empty: Empty messages.
705 * whitespace: Messages which have trailing whitespace.
706 * xhtml: Messages which are not well-formed XHTML (checks only few common
708 * chars: Messages with hidden characters.
710 * unbalanced: Messages which contains unequal numbers of opening {[ and
713Display levels (
default: 2):
714 * 0: Skip the checks (useful
for checking syntax).
715 * 1: Show only the stub
headers and number of wrong
messages, without list
717 * 2: Show only the
headers and the message keys, without the message
738 foreach ( $this->extensions as $extension ) {
739 $this->L = $extension;
741 $this->results[
$code] = parent::checkLanguage(
$code );
744 echo $extension->name() .
":\n";
746 if ( $this->level > 0 ) {
747 switch ( $this->
output ) {
755 throw new MWException(
"Invalid output type $this->output" );
770 'code' => [
'az',
'bo',
'cdo',
'dz',
'id',
'fa',
'gan',
'gan-hans',
771 'gan-hant',
'gn',
'hak',
'hu',
'ja',
'jv',
'ka',
'kk-arab',
772 'kk-cyrl',
'kk-latn',
'km',
'kn',
'ko',
'lzh',
'mn',
'ms',
773 'my',
'sah',
'sq',
'tet',
'th',
'to',
'tr',
'vi',
'wuu',
'xmf',
774 'yo',
'yue',
'zh',
'zh-classical',
'zh-cn',
'zh-hans',
775 'zh-hant',
'zh-hk',
'zh-sg',
'zh-tw',
'zh-yue'
Apache License January AND DISTRIBUTION Definitions License shall mean the terms and conditions for and distribution as defined by Sections through of this document Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License Legal Entity shall mean the union of the acting entity and all other entities that control are controlled by or are under common control with that entity For the purposes of this definition control direct or to cause the direction or management of such whether by contract or including but not limited to software source documentation and configuration files Object form shall mean any form resulting from mechanical transformation or translation of a Source including but not limited to compiled object generated and conversions to other media types Work shall mean the work of whether in Source or Object made available under the as indicated by a copyright notice that is included in or attached to the whether in Source or Object that is based or other modifications as a an original work of authorship For the purposes of this Derivative Works shall not include works that remain separable or merely the Work and Derivative Works thereof Contribution shall mean any work of including the original version of the Work and any modifications or additions to that Work or Derivative Works that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner For the purposes of this submitted means any form of or written communication sent to the Licensor or its including but not limited to communication on electronic mailing source code control and issue tracking systems that are managed or on behalf the Licensor for the purpose of discussing and improving the but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as Not a Contribution Contributor shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work Grant of Copyright License Subject to the terms and conditions of this each Contributor hereby grants to You a non no royalty irrevocable copyright license to prepare Derivative Works publicly publicly perform
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two distribute and or modify the software for each author s protection and we want to make certain that everyone understands that there is no warranty for this free software If the software is modified by someone else and passed we want its recipients to know that what they have is not the so that any problems introduced by others will not reflect on the original authors reputations any free program is threatened constantly by software patents We wish to avoid the danger that redistributors of a free program will individually obtain patent in effect making the program proprietary To prevent we have made it clear that any patent must be licensed for everyone s free use or not licensed at all The precise terms and conditions for distribution and modification follow GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR DISTRIBUTION AND MODIFICATION This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License The refers to any such program or and a work based on the Program means either the Program or any derivative work under copyright a work containing the Program or a portion of either verbatim or with modifications and or translated into another language(Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying
$wgLanguageCode
Site language code.
defaultChecks()
Get the default checks.
checkLanguage( $code)
Check a language and show the results.
execute()
Execute the script.
__construct(array $options, $extension)
nonMessageChecks()
Get the checks which check other things than messages.
easyChecks()
Get the checks that can easily be treated by non-speakers of the language.
doChecks()
Execute the checks.
isCheckBlacklisted( $check, $code, $message)
Verify whether a check is blacklisted.
defaultChecks()
Get the default checks.
getDescriptions()
Get all check descriptions.
nonMessageChecks()
Get the checks which check other things than messages.
checkLanguage( $code)
Check a language.
execute()
Execute the script.
getTotalCount()
Get total count for each check non-messages check.
formatKey( $key, $code)
Format a message key.
outputText()
Output the checks results as plain text.
getCheckBlacklist()
Get the check blacklist.
easyChecks()
Get the checks that can easily be treated by non-speakers of the language.
getChecks()
Get all checks.
__construct(array $options)
isEmpty()
Check if there are any results for the checks, in any language.
outputWiki()
Output the checks results as wiki text.
Class to extract and validate Exif data from jpeg (and possibly tiff) files.
Internationalisation code.
static getVersion( $flags='', $lang=null)
Return a string of the MediaWiki version with Git revision if available.
The ContentHandler facility adds support for arbitrary content types on wiki pages
The ContentHandler facility adds support for arbitrary content types on wiki instead of relying on wikitext for everything It was introduced in MediaWiki Each kind of and so on Built in content types as usual *javascript user provided javascript code *json simple implementation for use by extensions
I won t presume to tell you how to I m just describing the methods I chose to use for myself If you do choose to follow these it will probably be easier for you to collaborate with others on the but if you want to contribute without by all means do which work well I also use K &R brace matching style I know that s a religious issue for so if you want to use a style that puts opening braces on the next line
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at etc Handles the details of getting and saving to the user table of the and dealing with sessions and cookies OutputPage Encapsulates the entire HTML page that will be sent in response to any server request It is used by calling its functions to add in any and then calling output() to send it all. It could be easily changed to send incrementally if that becomes useful
I won t presume to tell you how to I m just describing the methods I chose to use for myself If you do choose to follow these it will probably be easier for you to collaborate with others on the project
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at name
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at etc Handles the details of getting and saving to the user table of the and dealing with sessions and cookies OutputPage Encapsulates the entire HTML page that will be sent in response to any server request It is used by calling its functions to add headers
do that in ParserLimitReportFormat instead use this to modify the parameters of the image all existing parser cache entries will be invalid To avoid you ll need to handle that somehow(e.g. with the RejectParserCacheValue hook) because MediaWiki won 't do it for you. & $defaults also a ContextSource after deleting those rows but within the same transaction $rows
This code would result in ircNotify being run twice when an article is and once for brion Hooks can return three possible values
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped & $options
null means default in associative array form
null for the local wiki Added in
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped broken
and how to run hooks for an and one after Each event has a preferably in CamelCase For ArticleDelete hook A clump of code and data that should be run when an event happens This can be either a function and a chunk of or an object and a method hook function The function part of a third party developers and local administrators to define code that will be run at certain points in the mainline code
you don t have to do a grep find to see where the $wgReverseTitle variable is used
in this case you re responsible for computing and outputting the entire conflict i the difference between revisions and your text headers and sections and Diff or overridable Default is either copyrightwarning or copyrightwarning2 overridable Default is editpage tos summary such as anonymity and the real check
Returning false makes less sense for events where the action is complete
We ve cleaned up the code here by removing clumps of infrequently used code and moving them off somewhere else It s much easier for someone working with this code to see what s _really_ going and make changes or fix bugs In we can take all the code that deals with the little used title reversing we can concentrate it all in an extension file
passed in as a query string parameter to the various URLs constructed here(i.e. $prevlink) $ldel you ll need to handle error messages
globals will be eliminated from MediaWiki replaced by an application object which would be passed to constructors Whether that would be an convenient solution remains to be but certainly PHP makes such object oriented programming models easier than they were in previous versions For the time being MediaWiki programmers will have to work in an environment with some global context At the time of globals were initialised on startup by MediaWiki of these were configuration settings
This document describes the XML format used to represent information about external sites known to a MediaWiki installation This information about external sites is used to allow inter wiki links
in the order they appear.
skin txt MediaWiki includes four core it has been set as the default in MediaWiki since the replacing Monobook it had been the default skin since before being replaced by Vector largely rewritten in while keeping its appearance Several legacy skins were removed in the as the burden of supporting them became too heavy to bear Those were