"module": false,
"mw": false,
"$": false,
- "mediaWiki": false,
- "jQuery": false,
"OO": false
},
"rules": {
<ruleset name="MediaWiki">
<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
<exclude name="Generic.ControlStructures.InlineControlStructure" />
- <exclude name="MediaWiki.Commenting.FunctionAnnotations.UnrecognizedAnnotation" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingReturn" />
<exclude name="MediaWiki.Commenting.FunctionComment.ExtraParamComment" />
<exclude name="MediaWiki.Commenting.FunctionComment.WrongStyle" />
- <exclude name="MediaWiki.Commenting.PhpunitAnnotations.NotClassTrait" />
<exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentStart" />
<exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentEnd" />
<exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
'help', 'help-message', 'help-messages' instead.
* (T197179) HTMLFormField::getNotices() is now deprecated.
* The jquery.localize module is now deprecated. Use jquery.i18n instead.
+* The SecondaryDataUpdates hook was deprecated in favor of RevisionDataUpdates,
+ or overriding ContentHandler::getSecondaryDataUpdates (T194038).
+* The WikiPageDeletionUpdates hook was deprecated in favor of
+ PageDeletionDataUpdates, or overriding ContentHandler::getDeletionDataUpdates
+ (T194038).
+* Content::getSecondaryDataUpdates has been deprecated in favor of
+ ContentHandler::getSecondaryDataUpdates() for overriding by extensions
+ (T194038).
+ Application logic should call WikiPage::doSecondaryDataUpdates() (T194037).
+* Content::getDeletionUpdates has been deprecated in favor of
+ ContentHandler::getDeletionUpdates() for overriding by extensions (T194038).
+ Application logic should call WikiPage::doSecondaryDataUpdates() (T194037).
=== Other changes in 1.32 ===
* (T198811) The following tables have had their UNIQUE indexes turned into
'MediaWiki\\ProcOpenError' => __DIR__ . '/includes/exception/ProcOpenError.php',
'MediaWiki\\Revision\\RenderedRevision' => __DIR__ . '/includes/Revision/RenderedRevision.php',
'MediaWiki\\Revision\\RevisionRenderer' => __DIR__ . '/includes/Revision/RevisionRenderer.php',
+ 'MediaWiki\\Revision\\SlotRenderingProvider' => __DIR__ . '/includes/Revision/SlotRenderingProvider.php',
'MediaWiki\\Search\\ParserOutputSearchDataExtractor' => __DIR__ . '/includes/search/ParserOutputSearchDataExtractor.php',
'MediaWiki\\ShellDisabledError' => __DIR__ . '/includes/exception/ShellDisabledError.php',
'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
"jakub-onderka/php-parallel-lint": "0.9.2",
"jetbrains/phpstorm-stubs": "dev-master#38ff1a581b297f7901e961b8c923862ea80c3b96",
"justinrainbow/json-schema": "~5.2",
- "mediawiki/mediawiki-codesniffer": "21.0.0",
+ "mediawiki/mediawiki-codesniffer": "22.0.0",
"monolog/monolog": "~1.22.1",
"nikic/php-parser": "3.1.3",
"seld/jsonlint": "1.7.1",
(Used to be called $baseRevId.)
$undidRevId: the rev ID (or 0) this edit undid
+'PageDeletionDataUpdates': Called when constructing a list of DeferrableUpdate to be
+executed when a page is deleted.
+$title The Title of the page being deleted.
+$revision A RevisionRecord representing the page's current revision at the time of deletion.
+&$updates A list of DeferrableUpdate that can be manipulated by the hook handler.
+
'PageHistoryBeforeList': When a history page list is about to be constructed.
&$article: the article that the history is loading for
$context: RequestContext object
added to any module.
&$ResourceLoader: object
+'RevisionDataUpdates': Called when constructing a list of DeferrableUpdate to be
+executed to record secondary data about a revision.
+$title The Title of the page the revision belongs to
+$renderedRevision a RenderedRevision object representing the new revision and providing access
+ to the RevisionRecord as well as ParserOutput of that revision.
+&$updates A list of DeferrableUpdate that can be manipulated by the hook handler.
+
'RevisionRecordInserted': Called after a revision is inserted into the database.
$revisionRecord: the RevisionRecord that has just been inserted.
Note that lists should be in the format name => object and the names in both
lists should be distinct.
-'SecondaryDataUpdates': Allows modification of the list of DataUpdates to
-perform when page content is modified. Currently called by
-AbstractContent::getSecondaryDataUpdates.
+'SecondaryDataUpdates': DEPRECATED! Use RevisionDataUpdates or override
+ContentHandler::getSecondaryDataUpdates instead.
+Allows modification of the list of DataUpdates to perform when page content is modified.
$title: Title of the page that is being edited.
$oldContent: Content object representing the page's content before the edit.
$recursive: bool indicating whether DataUpdates should trigger recursive
&$opts: Options to use for the query
&$join: Join conditions
-'WikiPageDeletionUpdates': manipulate the list of DeferrableUpdates to be
-applied when a page is deleted. Called in WikiPage::getDeletionUpdates(). Note
-that updates specific to a content model should be provided by the respective
-Content's getDeletionUpdates() method.
+'WikiPageDeletionUpdates': DEPRECATED! Use PageDeletionDataUpdates or
+override ContentHandler::getDeletionDataUpdates instead.
+Manipulates the list of DeferrableUpdates to be applied when a page is deleted.
$page: the WikiPage
$content: the Content to generate updates for, or null in case the page revision
could not be loaded. The delete will succeed despite this.
'MediaWiki\\Auth\\' => __DIR__ . '/auth/',
'MediaWiki\\Edit\\' => __DIR__ . '/edit/',
'MediaWiki\\EditPage\\' => __DIR__ . '/editpage/',
- 'MediaWiki\\Linker\\' => __DIR__ .'/linker/',
- 'MediaWiki\\Preferences\\' => __DIR__ .'/preferences/',
- 'MediaWiki\\Services\\' => __DIR__ .'/services/',
- 'MediaWiki\\Session\\' => __DIR__ .'/session/',
- 'MediaWiki\\Shell\\' => __DIR__ .'/shell/',
- 'MediaWiki\\Sparql\\' => __DIR__ .'/sparql/',
- 'MediaWiki\\Storage\\' => __DIR__ .'/Storage/',
- 'MediaWiki\\Tidy\\' => __DIR__ .'/tidy/',
+ 'MediaWiki\\Linker\\' => __DIR__ . '/linker/',
+ 'MediaWiki\\Preferences\\' => __DIR__ . '/preferences/',
+ 'MediaWiki\\Services\\' => __DIR__ . '/services/',
+ 'MediaWiki\\Session\\' => __DIR__ . '/session/',
+ 'MediaWiki\\Shell\\' => __DIR__ . '/shell/',
+ 'MediaWiki\\Sparql\\' => __DIR__ . '/sparql/',
+ 'MediaWiki\\Storage\\' => __DIR__ . '/Storage/',
+ 'MediaWiki\\Tidy\\' => __DIR__ . '/tidy/',
];
}
}
*
* @since 1.32
*/
-$wgOOUIPreferences = false;
+$wgOOUIPreferences = true;
/**
* Whether to label the store-to-database-and-show-to-others button in the editor
'Maintenance script', // Maintenance scripts which perform editing, image import script
'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
- 'Unknown user', // Used in WikiImporter when importing revisions with no author
+ 'Unknown user', // Used in WikiImporter and RevisionStore for revisions with no author
'msg:double-redirect-fixer', // Automatic double redirect fix
'msg:usermessage-editor', // Default user for leaving user messages
'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
// is if an extension hook aborted from inside ArticleSave.
// Render the status object into $this->hookError
// FIXME this sucks, we should just use the Status object throughout
- $this->hookError = '<div class="error">' ."\n" . $status->getWikiText() .
+ $this->hookError = '<div class="error">' . "\n" . $status->getWikiText() .
'</div>';
return true;
}
*
* @since 1.32
*/
-class RenderedRevision {
+class RenderedRevision implements SlotRenderingProvider {
/**
* @var Title
--- /dev/null
+<?php
+/**
+ * Created by PhpStorm.
+ * User: daki
+ * Date: 05.09.18
+ * Time: 16:08
+ */
+namespace MediaWiki\Revision;
+
+use MediaWiki\Storage\SuppressedDataException;
+use ParserOutput;
+
+/**
+ * A lazy provider of ParserOutput objects for a revision's individual slots.
+ *
+ * @since 1.32
+ */
+interface SlotRenderingProvider {
+
+ /**
+ * @param string $role
+ * @param array $hints Hints given as an associative array. Known keys:
+ * - 'generate-html' => bool: Whether the caller is interested in output HTML (as opposed
+ * to just meta-data). Default is to generate HTML.
+ *
+ * @throws SuppressedDataException if the content is not accessible for the audience
+ * specified in the constructor.
+ * @return ParserOutput
+ */
+ public function getSlotParserOutput( $role, array $hints = [] );
+
+}
use Content;
use ContentHandler;
use DataUpdate;
+use DeferrableUpdate;
use DeferredUpdates;
use Hooks;
use IDBAccessObject;
use InvalidArgumentException;
use JobQueueGroup;
use Language;
+use LinksDeletionUpdate;
use LinksUpdate;
use LogicException;
use MediaWiki\Edit\PreparedEdit;
*
* Contains the following fields:
* - oldRevision (RevisionRecord|null): the revision that was current before the change
- * associated with this update. Might not be set, use getOldRevision() instead of direct
- * access.
+ * associated with this update. Might not be set, use getParentRevision().
* - oldId (int|null): the id of the above revision. 0 if there is no such revision (the change
* was about creating a new page); null if not known (that should not happen).
* - oldIsRedirect (bool|null): whether the page was a redirect before the change. Lazy-loaded,
*/
private $slotsUpdate = null;
+ /**
+ * @var RevisionRecord|null
+ */
+ private $parentRevision = null;
+
/**
* @var RevisionRecord|null
*/
}
/**
- * Returns the revision that was current before the edit. This would be null if the edit
- * created the page, or the revision's parent for a regular edit, or the revision itself
- * for a null-edit.
- * Only defined after calling grabCurrentRevision() or prepareContent() or prepareUpdate()!
+ * Returns the parent revision of the new revision wrapped by this update.
+ * If the update is a null-edit, this will return the parent of the current (and new) revision.
+ * This will return null if the revision wrapped by this update created the page.
+ * Only defined after calling prepareContent() or prepareUpdate()!
*
- * @return RevisionRecord|null the revision that was current before the edit, or null if
- * the edit created the page.
+ * @return RevisionRecord|null the parent revision of the new revision, or null if
+ * the update created the page.
*/
- private function getOldRevision() {
- $this->assertHasPageState( __METHOD__ );
+ private function getParentRevision() {
+ $this->assertPrepared( __METHOD__ );
- // If 'oldRevision' is not set, load it!
- // Useful if $this->oldPageState is initialized by prepareUpdate.
- if ( !array_key_exists( 'oldRevision', $this->pageState ) ) {
- /** @var int $oldId */
- $oldId = $this->pageState['oldId'];
- $flags = $this->useMaster() ? RevisionStore::READ_LATEST : 0;
- $this->pageState['oldRevision'] = $oldId
- ? $this->revisionStore->getRevisionById( $oldId, $flags )
- : null;
+ if ( $this->parentRevision ) {
+ return $this->parentRevision;
}
- return $this->pageState['oldRevision'];
+ if ( !$this->pageState['oldId'] ) {
+ // If there was no current revision, there is no parent revision,
+ // since the page didn't exist.
+ return null;
+ }
+
+ $oldId = $this->revision->getParentId();
+ $flags = $this->useMaster() ? RevisionStore::READ_LATEST : 0;
+ $this->parentRevision = $oldId
+ ? $this->revisionStore->getRevisionById( $oldId, $flags )
+ : null;
+
+ return $this->parentRevision;
}
/**
* @note After prepareUpdate() was called, grabCurrentRevision() will throw an exception
* to avoid confusion, since the page's current revision is then the new revision after
* the edit, which was presumably passed to prepareUpdate() as the $revision parameter.
- * Use getOldRevision() instead to access the revision that used to be current before the
- * edit.
+ * Use getParentRevision() instead to access the revision that is the parent of the
+ * new revision.
*
* @return RevisionRecord|null the page's current revision, or null if the page does not
* yet exist.
// prepareUpdate() is redundant for null-edits
$this->doTransition( 'has-revision' );
+ } else {
+ $this->parentRevision = $parentRevision;
}
}
$this->assertPrepared( __METHOD__ );
if ( !$this->slotsUpdate ) {
- $old = $this->getOldRevision();
+ $old = $this->getParentRevision();
$this->slotsUpdate = RevisionSlotsUpdate::newFromRevisionSlots(
$this->revision->getSlots(),
$old ? $old->getSlots() : null
} else {
throw new LogicException(
'Trying to re-use DerivedPageDataUpdater with revision '
- .$revision->getId()
+ . $revision->getId()
. ', but it\'s already bound to revision '
. $this->revision->getId()
);
if ( !$this->user->equals( $user ) ) {
throw new LogicException(
'The Revision provided has a mismatching actor: expected '
- .$this->user->getName()
+ . $this->user->getName()
. ', got '
. $user->getName()
);
/**
* @param bool $recursive
*
- * @return DataUpdate[]
+ * @return DeferrableUpdate[]
*/
public function getSecondaryDataUpdates( $recursive = false ) {
- // TODO: MCR: getSecondaryDataUpdates() needs a complete overhaul to avoid DataUpdates
- // from different slots overwriting each other in the database. Plan:
- // * replace direct calls to Content::getSecondaryDataUpdates() with calls to this method
- // * Construct LinksUpdate here, on the combined ParserOutput, instead of in AbstractContent
- // for each slot.
- // * Pass $slot into getSecondaryDataUpdates() - probably be introducing a new duplicate
- // version of this function in ContentHandler.
- // * The new method gets the PreparedEdit, but no $recursive flag (that's for LinksUpdate)
- // * Hack: call both the old and the new getSecondaryDataUpdates method here; Pass
- // the per-slot ParserOutput to the old method, for B/C.
- // * Hack: If there is more than one slot, filter LinksUpdate from the DataUpdates
- // returned by getSecondaryDataUpdates, and use a LinksUpdated for the combined output
- // instead.
- // * Call the SecondaryDataUpdates hook here (or kill it - its signature doesn't make sense)
-
- $content = $this->getSlots()->getContent( 'main' );
-
- // NOTE: $output is the combined output, to be shown in the default view.
+ if ( $this->isContentDeleted() ) {
+ // This shouldn't happen, since the current content is always public,
+ // and DataUpates are only needed for current content.
+ return [];
+ }
+
$output = $this->getCanonicalParserOutput();
- $updates = $content->getSecondaryDataUpdates(
- $this->getTitle(), null, $recursive, $output
+ // Construct a LinksUpdate for the combined canonical output.
+ $linksUpdate = new LinksUpdate(
+ $this->getTitle(),
+ $output,
+ $recursive
);
- return $updates;
+ $allUpdates = [ $linksUpdate ];
+
+ // NOTE: Run updates for all slots, not just the modified slots! Otherwise,
+ // info for an inherited slot may end up being removed. This is also needed
+ // to ensure that purges are effective.
+ $renderedRevision = $this->getRenderedRevision();
+ foreach ( $this->getSlots()->getSlotRoles() as $role ) {
+ $slot = $this->getRawSlot( $role );
+ $content = $slot->getContent();
+ $handler = $content->getContentHandler();
+
+ $updates = $handler->getSecondaryDataUpdates(
+ $this->getTitle(),
+ $content,
+ $role,
+ $renderedRevision
+ );
+ $allUpdates = array_merge( $allUpdates, $updates );
+
+ // TODO: remove B/C hack in 1.32!
+ // NOTE: we assume that the combined output contains all relevant meta-data for
+ // all slots!
+ $legacyUpdates = $content->getSecondaryDataUpdates(
+ $this->getTitle(),
+ null,
+ $recursive,
+ $output
+ );
+
+ // HACK: filter out redundant and incomplete LinksUpdates
+ $legacyUpdates = array_filter( $legacyUpdates, function ( $update ) {
+ return !( $update instanceof LinksUpdate );
+ } );
+
+ $allUpdates = array_merge( $allUpdates, $legacyUpdates );
+ }
+
+ // XXX: if a slot was removed by an earlier edit, but deletion updates failed to run at
+ // that time, we don't know for which slots to run deletion updates when purging a page.
+ // We'd have to examine the entire history of the page to determine that. Perhaps there
+ // could be a "try extra hard" mode for that case that would run a DB query to find all
+ // roles/models ever used on the page. On the other hand, removing slots should be quite
+ // rare, so perhaps this isn't worth the trouble.
+
+ // TODO: consolidate with similar logic in WikiPage::getDeletionUpdates()
+ $wikiPage = $this->getWikiPage();
+ $parentRevision = $this->getParentRevision();
+ foreach ( $this->getRemovedSlotRoles() as $role ) {
+ // HACK: we should get the content model of the removed slot from a SlotRoleHandler!
+ // For now, find the slot in the parent revision - if the slot was removed, it should
+ // always exist in the parent revision.
+ $parentSlot = $parentRevision->getSlot( $role, RevisionRecord::RAW );
+ $content = $parentSlot->getContent();
+ $handler = $content->getContentHandler();
+
+ $updates = $handler->getDeletionUpdates(
+ $this->getTitle(),
+ $role
+ );
+ $allUpdates = array_merge( $allUpdates, $updates );
+
+ // TODO: remove B/C hack in 1.32!
+ $legacyUpdates = $content->getDeletionUpdates( $wikiPage );
+
+ // HACK: filter out redundant and incomplete LinksDeletionUpdate
+ $legacyUpdates = array_filter( $legacyUpdates, function ( $update ) {
+ return !( $update instanceof LinksDeletionUpdate );
+ } );
+
+ $allUpdates = array_merge( $allUpdates, $legacyUpdates );
+ }
+
+ // TODO: hard deprecate SecondaryDataUpdates in favor of RevisionDataUpdates in 1.33!
+ Hooks::run(
+ 'RevisionDataUpdates',
+ [ $this->getTitle(), $renderedRevision, &$allUpdates ]
+ );
+
+ return $allUpdates;
}
/**
WikiPage::onArticleEdit( $title, $legacyRevision, $this->getTouchedSlotRoles() );
}
- $oldRevision = $this->getOldRevision();
+ $oldRevision = $this->getParentRevision();
$oldLegacyRevision = $oldRevision ? new Revision( $oldRevision ) : null;
// TODO: In the wiring, register a listener for this on the new PageEventEmitter
}
foreach ( $updates as $update ) {
- $update->setCause( $causeAction, $causeAgent );
+ if ( $update instanceof DataUpdate ) {
+ $update->setCause( $causeAction, $causeAgent );
+ }
if ( $update instanceof LinksUpdate ) {
$update->setRevision( $legacyRevision );
$update->setTriggeringUser( $triggeringUser );
$slot = $rev->getSlot( $role, RevisionRecord::RAW );
Assert::postcondition(
$slot->getContent() !== null,
- $role . ' slot must have content'
+ $role . ' slot must have content'
);
Assert::postcondition(
$slot->hasRevision(),
- $role . ' slot must have a revision associated'
+ $role . ' slot must have a revision associated'
);
}
$row->ar_actor ?? null
);
} catch ( InvalidArgumentException $ex ) {
- wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
- $user = new UserIdentityValue( 0, '', 0 );
+ wfWarn( __METHOD__ . ': ' . $title->getPrefixedDBkey() . ': ' . $ex->getMessage() );
+ $user = new UserIdentityValue( 0, 'Unknown user', 0 );
}
$db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
$row->rev_actor ?? null
);
} catch ( InvalidArgumentException $ex ) {
- wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
- $user = new UserIdentityValue( 0, '', 0 );
+ wfWarn( __METHOD__ . ': ' . $title->getPrefixedDBkey() . ': ' . $ex->getMessage() );
+ $user = new UserIdentityValue( 0, 'Unknown user', 0 );
}
$db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
if ( $nsText === false ) {
// See T165149. Awkward, but better than erroneously linking to the main namespace.
$nsText = MediaWikiServices::getInstance()->getContentLanguage()->
- getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}";
+ getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}";
}
$p .= $nsText . ':';
* @return string
*/
public function getFullRequestURL() {
- return wfGetServerUrl( PROTO_CURRENT ) . $this->getRequestURL();
+ return wfGetServerUrl( PROTO_CURRENT ) . $this->getRequestURL();
}
/**
);
$de->showDiff( '', '' );
}
- return;
}
protected function getDescription() {
if ( !is_null( $params[$param] ) ) {
$p = $this->getModulePrefix();
$this->dieWithError(
- [ 'apierror-invalidparammix-cannotusewith', $p.$param, "{$p}user" ],
+ [ 'apierror-invalidparammix-cannotusewith', $p . $param, "{$p}user" ],
'invalidparammix'
);
}
if ( !is_null( $params[$param] ) ) {
$p = $this->getModulePrefix();
$this->dieWithError(
- [ 'apierror-invalidparammix-mustusewith', $p.$param, "{$p}user" ],
+ [ 'apierror-invalidparammix-mustusewith', $p . $param, "{$p}user" ],
'invalidparammix'
);
}
}
if ( $this->params['testactions'] ) {
- $limit = $this->getMain()->canApiHighLimits() ? self::LIMIT_SML1 : self::LIMIT_SML2;
+ $limit = $this->getMain()->canApiHighLimits() ? self::LIMIT_SML2 : self::LIMIT_SML1;
if ( $this->countTestedActions >= $limit ) {
return null; // force a continuation
}
"apihelp-compare-param-fromid": "رقم الصفحة الأول للمقارنة.",
"apihelp-compare-param-fromrev": "أول مراجعة للمقارنة.",
"apihelp-compare-param-frompst": "قم بإجراء تحويل ما قبل الحفظ على <var>fromtext-{slot}</var>.",
+ "apihelp-compare-param-fromslots": "تجاوز محتوى المراجعة المحددة بواسطة <var>fromtitle</var> أو <var>fromid</var> أو <var>fromrev</var>.\n\nيحدد هذا الوسيط الفتحات المراد تعديلها، استخدم <var>fromtext-{slot}</var> و<var>fromcontentmodel-{slot}</var> و<var>fromcontentformat-{slot}</var> لتحديد محتوى لكل فتحة.",
+ "apihelp-compare-param-fromtext-{slot}": "نص الفتحة المحددة، إذا تم حذفها، تتم إزالة الفتحة من المراجعة.",
+ "apihelp-compare-param-fromsection-{slot}": "عندما يكون <var>fromtext-{slot}</var> هو محتوى قسم واحد، فهذا هو رقم القسم، سيتم دمجه في المراجعة المحددة بواسطة <var>fromtitle</var> أو <var>fromid</var> أو <var>fromrev</var> كما لو كانت لتعديل القسم.",
+ "apihelp-compare-param-fromcontentmodel-{slot}": "نموذج محتوى <var>fromtext-{slot}</var>، إذا لم يتم توفيره، فسيتم تخمينه استنادا إلى الوسائط الأخرى.",
+ "apihelp-compare-param-fromcontentformat-{slot}": "تنسيق تسلسل محتوى <var>fromtext-{slot}</var>.",
"apihelp-compare-param-fromtext": "حدد <kbd>fromslots=main</kbd> واستخدم <var>fromtext-main</var> كبديل.",
"apihelp-compare-param-fromcontentmodel": "حدد <kbd>fromslots=main</kbd> واستخدم <var>fromcontentmodel-main</var> كبديل.",
"apihelp-compare-param-fromcontentformat": "حدد <kbd>fromslots=main</kbd> واستخدم <var>fromcontentformat-main</var> كبديل.",
"apihelp-compare-param-torev": "المراجعة الثانية للمقارنة.",
"apihelp-compare-param-torelative": "استخدم مراجعة متعلقة بالمراجعة المحددة من <var>fromtitle</var> أو <var>fromid</var> أو <var>fromrev</var>، سيتم تجاهل جميع خيارات 'إلى' الأخرى.",
"apihelp-compare-param-topst": "قم بإجراء تحويل ما قبل الحفظ على <var>totext</var>.",
+ "apihelp-compare-param-toslots": "تجاوز محتوى المراجعة المحددة بواسطة <var>totitle</var> أو <var>toid</var> أو <var>torev</var>.\n\nيحدد هذا الوسيط الفتحات المراد تعديلها، استخدم <var>totext-{slot}</var> و<var>tocontentmodel-{slot}</var> و<var>tocontentformat-{slot}</var> لتحديد محتوى لكل فتحة.",
+ "apihelp-compare-param-totext-{slot}": "نص الفتحة المحددة، إذا تم حذفه، تتم إزالة الفتحة من المراجعة.",
+ "apihelp-compare-param-tosection-{slot}": "عندما يكون <var>totext-{slot}</var> هو محتوى قسم واحد، فهذا هو رقم القسم، سيتم دمجه في المراجعة المحددة بواسطة <var>totitle</var> أو <var>toid</var> أو <var>torev</var> كما لو كانت لتعديل القسم.",
+ "apihelp-compare-param-tocontentmodel-{slot}": "نموذج محتوى <var>totext-{slot}</var>، إذا لم يتم توفيره، فسيتم تخمينه استنادا إلى الوسائط الأخرى.",
+ "apihelp-compare-param-tocontentformat-{slot}": "تنسيق تسلسل محتوى <var>totext-{slot}</var>.",
"apihelp-compare-param-totext": "حدد <kbd>toslots=main</kbd> واستخدم <var>totext-main</var> كبديل.",
"apihelp-compare-param-tocontentmodel": "حدد <kbd>toslots=main</kbd> واستخدم <var>tocontentmodel-main</var> كبديل.",
"apihelp-compare-param-tocontentformat": "حدد <kbd>toslots=main</kbd> واستخدم <var>tocontentformat-main</var> كبديل.",
"apihelp-compare-paramvalue-prop-comment": "التعليق على المراجعات 'من' و'إلى'.",
"apihelp-compare-paramvalue-prop-parsedcomment": "التعليق المحلل على المراجعات 'من' و'إلى'.",
"apihelp-compare-paramvalue-prop-size": "حجم المراجعات 'من' و'إلى'.",
+ "apihelp-compare-param-slots": "إرجاع فرق فردي لهذه الفتحات، بدلا من فرق واحد مشترك لجميع فتحات.",
"apihelp-compare-example-1": "إنشاء فرق بين المراجعة 1 و2.",
"apihelp-createaccount-summary": "انشاء حساب مستخدم جديد",
"apihelp-createaccount-param-preservestate": "إذا تم عرض <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> بشكل صحيح لـ<samp>hasprimarypreservedstate</samp>، فقد تم تعليم طلبات <samp>primary-required</samp> لكي يجب حذفها، إذا عرضت قيمة غير فارغة لـ<samp>preservedusername</samp> فيجب استخدام اسم المستخدم هذا للوسيط <var>username</var>.",
"apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "يضيف بادئة الإنترويكي.",
"apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "يضيف عنوان الإنترويكي.",
"apihelp-query+iwbacklinks-param-dir": "الاتجاه للإدراج فيه.",
+ "apihelp-query+iwbacklinks-example-simple": "الحصول على الصفحات التي تصل إلى [[wikibooks:Test]].",
+ "apihelp-query+iwbacklinks-example-generator": "الحصول على معلومات عن الصفحات التي تصل إلى [[wikibooks:Test]].",
"apihelp-query+iwlinks-summary": "يعرض جميع روابط الإنترويكي من الصفحات المحددة.",
"apihelp-query+iwlinks-param-url": "ما إذا كنت تريد الحصول على المسار الكامل (لا يمكن استخدامه مع $1prop).",
"apihelp-query+iwlinks-param-prop": "الخصائص الإضافية التي يمكنك الحصول عليها لكل رابط بين اللغات:",
"apihelp-query+revisions+base-paramvalue-prop-tags": "وسوم للمراجعة.",
"apihelp-query+revisions+base-paramvalue-prop-roles": "أدرج أدوار فتحة المحتوى الموجودة في المراجعة.",
"apihelp-query+revisions+base-paramvalue-prop-parsetree": "استخدم <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> أو <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> بدلا من ذلك، شجرة تحليل XML لمحتوى المراجعة (تتطلب نموذج المحتوى <code>$1</code>).",
+ "apihelp-query+revisions+base-param-slots": "أي الفتحات المراجعة لتعيد البيانات، عندما يتم تضمين الخصائص ذات الصلة بالفتحات في <var>$1props</var>، إذا تم حذفها، فسيتم إرجاع البيانات من فتحة <kbd>main</kbd> بتنسيق متوافق مع الإصدارات السابقة.",
"apihelp-query+revisions+base-param-limit": "الحد من عدد المراجعات التي سيتم إرجاعها.",
"apihelp-query+revisions+base-param-expandtemplates": "استخدم <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> بدلا من ذلك، قم بتوسيع القوالب في محتوى المراجعة (يتطلب $1prop=content).",
"apihelp-query+revisions+base-param-generatexml": "استخدم <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> أو <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> بدلا من ذلك، قم بتوليد شجرة تحليل XML لمحتوى المراجعة (تتطلب $1prop=content).",
"apihelp-json-param-callback": "إذا تم تحديده، فسيقوم بإخراج الإخراج في استدعاء دالة معينة، للسلامة; سيتم تقييد جميع البيانات الخاصة بالمستخدم.",
"apihelp-json-param-utf8": "إذا تم تحديده، يقوم بترميز معظم (وليس كل) الأحرف غير ASCII كـUTF-8 بدلا من استبدالها بتسلسلات الهروب السداسية العشرية، افتراضي عندما لا يكون <var>formatversion</var> <kbd>1</kbd>.",
"apihelp-json-param-ascii": "إذا تم تحديده، يشفر كل غير ASCII باستخدام تسلسلات الهروب السداسية العشرية، افتراضي عندما يكون <var>formatversion</var> <kbd>1</kbd>.",
+ "apihelp-json-param-formatversion": "تنسيق الإخراج: \n;1:تنسيق متوافق مع الإصدارات السابقة (مصفوفات منطقية بتنسيق XML، ومفاتيح <samp>*</samp> لعقد المحتوى، وما إلى ذلك).\n;2:التنسيق الحديث التجريبي، التفاصيل قد تتغير!\n;الأحدث: استخدم أحدث تنسيق (حاليا <kbd>2</kbd>)، قد يتغير دون سابق إنذار.",
"apihelp-jsonfm-summary": "بيانات الإخراج بتنسيق JSON (الطباعة بـHTML).",
"apihelp-none-summary": "عدم إخراج أي شيء.",
"apihelp-php-summary": "بيانات الإخراج بتنسيق PHP المتسلسل.",
+ "apihelp-php-param-formatversion": "تنسيق الإخراج: \n;1:تنسيق متوافق مع الإصدارات السابقة (مصفوفات منطقية بتنسيق XML، ومفاتيح <samp>*</samp> لعقد المحتوى، وما إلى ذلك).\n;2:التنسيق الحديث التجريبي، التفاصيل قد تتغير!\n;الأحدث: استخدم أحدث تنسيق (حاليا <kbd>2</kbd>)، قد يتغير دون سابق إنذار.",
"apihelp-phpfm-summary": "بيانات الإخراج بتنسيق JSON (الطباعة بـHTML).",
"apihelp-rawfm-summary": "بيانات الإخراج، بما في ذلك عناصر تصحيح الأخطاء، بتنسيق JSON (الطباعة بـHTML).",
"apihelp-xml-summary": "بيانات الإخراج بتنسيق XML.",
"apierror-changeauth-norequest": "فشل في إنشاء طلب التغيير.",
"apierror-chunk-too-small": "الحد الأدنى لحجم القطعة هو $1 {{PLURAL:$1|بايت}} للقطع غير النهائية.",
"apierror-cidrtoobroad": "لا يُقبَل مدى $1 CIDR أكبر من /$2.",
+ "apierror-compare-maintextrequired": "الوسيط <var>$1text-main</var> مطلوب عندما يكون <var>$1slots</var> يحتوي على <kbd>main</kbd> (لا يمكن حذف الفتحة الرئيسية).",
"apierror-compare-no-title": "لا يمكن الحفظ المسبق للحفظ بدون عنوان; حاول تحديد <var>fromtitle</var> أو <var>totitle</var>.",
"apierror-compare-nosuchfromsection": "لا يوجد قسم $1 في المحتوى 'من'.",
"apierror-compare-nosuchtosection": "لا يوجد قسم $1 في المحتوى 'إلى'.",
+ "apierror-compare-nofromrevision": "ليس 'من' مراجعة، حدد <var>fromrev</var> أو <var>fromtitle</var> أو <var>fromid</var>.",
+ "apierror-compare-notext": "لا يمكن استخدام الوسيط <var>$1</var> بدون <var>$2</var>.",
+ "apierror-compare-notorevision": "ليس 'إلى' مراجعة، حدد <var>torev</var> أو <var>totitle</var> أو <var>toid</var>.",
"apierror-compare-relative-to-nothing": "لا توجد مراجعة 'من' لـ<var>torelative</var> لتكون نسبة.",
"apierror-contentserializationexception": "فشل تسلسل المحتوى: $1",
"apierror-contenttoobig": "يتجاوز المحتوى الذي أدخلته حد حجم المقالة البالغ $1 {{PLURAL:$1|كيلوبايت}}.",
"apierror-mimesearchdisabled": "تم تعطيل بحث MIME في وضع Miser.",
"apierror-missingcontent-pageid": "محتوى مفقود لمعرف الصفحة $1.",
"apierror-missingcontent-revid": "محتوى مفقود لمعرف المراجعة $1.",
+ "apierror-missingcontent-revid-role": "محتوى مفقود لمعرف المراجعة $1 للدور $2.",
"apierror-missingparam-at-least-one-of": "مطلوب {{PLURAL:$2|الوسيط|واحد على الأقل من الوسائط}} $1.",
"apierror-missingparam-one-of": "مطلوب {{PLURAL:$2|الوسيط|واحد على الأقل من الوسائط}} $1.",
"apierror-missingparam": "يجب تعيين الوسيط <var>$1</var>.",
"apiwarn-deprecation-login-botpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd> وقد يتوقف عن العمل دون سابق إنذار، لمتابعة تسجيل الدخول باستخدام <kbd>action=login</kbd>; راجع [[Special:BotPasswords]]، لمتابعة استخدام تسجيل الدخول إلى الحساب الرئيسي بأمان; راجع <kbd>action=clientlogin</kbd>.",
"apiwarn-deprecation-login-nobotpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd>، وقد يتوقف عن العمل دون سابق إنذار، لتسجيل الدخول بأمان; راجع <kbd>action=clientlogin</kbd>.",
"apiwarn-deprecation-login-token": "تم إيقاف عمل رمز مميز عبر <kbd>action=login</kbd> ;استخدم <kbd>action=query&meta=tokens&type=login</kbd> بدلا من ذلك.",
+ "apiwarn-deprecation-missingparam": "نظرا لعدم تحديد <var>$1</var>; تم استخدام تنسيق قديم للإخراج، تم إيقاف هذا التنسيق، وسيتم دائما استخدام التنسيق الجديد في المستقبل.",
"apiwarn-deprecation-parameter": "تم إيقاف الوسيط <var>$1</var>.",
"apiwarn-deprecation-parse-headitems": "تم إيقاف <kbd>prop=headitems</kbd> منذ ميدياويكي 1.28; استخدم <kbd>prop=headhtml</kbd> عند إنشاء مستندات HTML جديدة، أو <kbd>prop=modules|jsconfigvars</kbd> عند تحديث مستند من جانب العميل.",
"apiwarn-deprecation-purge-get": "تم إيقاف استخدام <kbd>action=purge</kbd> عبر GET; استخدم POST بدلا من ذلك.",
"apiwarn-parse-nocontentmodel": "لم يتم إعطاء <var>title</var> أو <var>contentmodel</var>، على افتراض $1.",
"apiwarn-parse-revidwithouttext": "تم استخدام <var>revid</var> بدون <var>text</var>، وتم طلب خصائص الصفحة المحللة، هل تقصد استخدام <var>oldid</var> بدلا من <var>revid</var>؟",
"apiwarn-parse-titlewithouttext": "تم استخدام <var>title</var> بدون <var>text</var>، وتم طلب خصائص الصفحة المحللة، هل تقصد استخدام <var>page</var> بدلا من <var>title</var>؟",
+ "apiwarn-redirectsandrevids": "لا يمكن استخدام دقة تحويلة مع الوسيط <var>revids</var>، أية تحويلات لنقطة <var>revids</var> لم يتم حلها.",
"apiwarn-tokennotallowed": "الإجراء \"$1\" غير مسموح به للمستخدم الحالي.",
"apiwarn-tokens-origin": "قد لا يتم الحصول على الرموز عند عدم تطبيق السياسة الأصلية.",
"apiwarn-truncatedresult": "تم اقتطاع هذه النتيجة لأنها قد تكون أكبر من حد الـ$1 بايت.",
"apihelp-compare-param-fromtitle": "比較する1つ目のページ名。",
"apihelp-compare-param-fromid": "比較する1つ目のページID。",
"apihelp-compare-param-fromrev": "比較する1つ目の版。",
- "apihelp-compare-param-frompst": "<var>fromtext</var>に保存前変換を行います。",
- "apihelp-compare-param-fromtext": "<var>fromtitle</var>, <var>fromid</var> or <var>fromrev</var> で指定された版の内容の代わりに、このテキストを使用します。",
+ "apihelp-compare-param-frompst": "<var>fromtext-{slot}</var>に保存前変換を行います。",
+ "apihelp-compare-param-fromtext": "<kbd>fromslots=main</kbd>を指定し、代わりに<var>fromtext-main</var> を使用してください。",
"apihelp-compare-param-fromcontentmodel": "<var>fromtext</var>のコンテンツモデル。指定されていない場合は、他のパラメータに基づいて推測されます。",
"apihelp-compare-param-fromsection": "'from' の内容のうち指定された節のみを使用します。",
"apihelp-compare-param-totitle": "比較する2つ目のページ名。",
"apihelp-query+revisions+base-paramvalue-prop-size": "その版の長さ (バイト) 。",
"apihelp-query+revisions+base-paramvalue-prop-comment": "その版の利用者によるコメント。",
"apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "その版の利用者による、構文解析されたコメント。",
- "apihelp-query+revisions+base-paramvalue-prop-content": "その版のテキスト。",
+ "apihelp-query+revisions+base-paramvalue-prop-content": "各リビジョンスロットの内容。",
"apihelp-query+revisions+base-paramvalue-prop-tags": "その版のタグ。",
"apihelp-query+revisions+base-param-limit": "返す版の数を制限する。",
"apihelp-query+search-summary": "全文検索を行います。",
"apihelp-options-example-complex": "重置所有偏好設定,然後再設定 <kbd>skin</kbd> 與 <kbd>nickname</kbd>。",
"apihelp-paraminfo-summary": "獲得有關 API 模組的資訊。",
"apihelp-paraminfo-param-helpformat": "說明字串的格式。",
+ "apihelp-paraminfo-param-formatmodules": "格式模組名稱清單(<var>format</var> 參數的值)。請改用 <var>$1modules</var> 。",
"apihelp-paraminfo-example-1": "顯示 <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>、<kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>、<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>、和 <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> 的資訊。",
"apihelp-paraminfo-example-2": "顯示 <kbd>[[Special:ApiHelp/query|action=query]]</kbd> 所有子模組的資訊。",
"apihelp-parse-summary": "解析內容併回傳解析器輸出。",
"apihelp-query+allimages-param-to": "要停止列舉的圖片標題。僅能與 $1sort=name 一起使用。",
"apihelp-query+allimages-param-start": "要開始列舉的時間戳記。僅能與 $1sort=timestamp 一起使用。",
"apihelp-query+allimages-param-end": "要停止列舉的時間戳記。僅能與 $1sort=timestamp 一起使用。",
+ "apihelp-query+allimages-param-prefix": "搜尋所有以此值為開頭的圖片。僅能與 $1sort=name 一起使用。",
"apihelp-query+allimages-param-minsize": "限制圖片至少要有這樣多的位元組。",
"apihelp-query+allimages-param-maxsize": "限制圖片最多只能這樣多的位元組。",
"apihelp-query+allimages-param-sha1": "圖片的 SHA1 雜湊值。覆蓋 $1sha1base36。",
"apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>開頭的使用者。",
"apihelp-query+authmanagerinfo-summary": "取得目前身分核對狀態的資訊。",
"apihelp-query+backlinks-summary": "找出連結至指定頁面的所有頁面。",
+ "apihelp-query+backlinks-param-title": "要搜尋的標題。不能與 <var>$1pageid</var> 一起使用。",
"apihelp-query+backlinks-param-pageid": "要搜尋的頁面 ID。不能與 <var>$1title</var> 一起使用。",
"apihelp-query+backlinks-param-namespace": "要列舉的命名空間。",
"apihelp-query+backlinks-param-dir": "列出時所採用的方向。",
"apihelp-query+blocks-paramvalue-prop-userid": "添加已封鎖使用者的使用者 ID。",
"apihelp-query+blocks-paramvalue-prop-by": "添加進行封鎖中的使用者之使用者名稱。",
"apihelp-query+blocks-paramvalue-prop-byid": "添加進行封鎖中的使用者之使用者 ID。",
+ "apihelp-query+blocks-paramvalue-prop-timestamp": "添加當封鎖生效的時間戳記。",
+ "apihelp-query+blocks-paramvalue-prop-expiry": "添加當封鎖到期的時間戳記。",
"apihelp-query+blocks-paramvalue-prop-reason": "添加封鎖的原因。",
"apihelp-query+blocks-example-simple": "列出封鎖。",
"apihelp-query+blocks-example-users": "列出使用者 <kbd>Alice</kbd> 與 <kbd>Bob</kbd> 的封鎖。",
"apihelp-query+categorymembers-paramvalue-prop-timestamp": "添加在頁面有被包含時的時間戳記。",
"apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
"apihelp-query+categorymembers-param-sort": "作為排序順序的屬性。",
+ "apihelp-query+categorymembers-param-start": "起始列出的時間戳記。僅能與 <kbd>$1sort=timestamp</kbd> 一起使用。",
+ "apihelp-query+categorymembers-param-end": "結束列出的時間戳記。僅能與 <kbd>$1sort=timestamp</kbd> 一起使用。",
"apihelp-query+categorymembers-param-startsortkey": "請改用 $1starthexsortkey。",
"apihelp-query+categorymembers-param-endsortkey": "請改用 $1endhexsortkey。",
"apihelp-query+categorymembers-example-simple": "取得在 <kbd>Category:Physics</kbd> 裡前 10 項的頁面。",
"apihelp-query+logevents-paramvalue-prop-userid": "添加承擔日誌事件的使用者 ID。",
"apihelp-query+logevents-paramvalue-prop-timestamp": "添加日誌事件的時間戳記。",
"apihelp-query+logevents-paramvalue-prop-comment": "添加日誌事件的註釋。",
+ "apihelp-query+logevents-paramvalue-prop-parsedcomment": "添加日誌事件的解析註釋。",
"apihelp-query+logevents-paramvalue-prop-details": "列出日誌事件的額外詳細資訊。",
"apihelp-query+logevents-paramvalue-prop-tags": "列出日誌事件的標籤。",
"apihelp-query+logevents-param-type": "篩選僅為此類型的日誌項目。",
"apihelp-query+logevents-param-tag": "僅列出以此標籤所標記的事件項目。",
"apihelp-query+logevents-param-limit": "要回傳的事件項目總數。",
"apihelp-query+logevents-example-simple": "列出近期日誌事件。",
+ "apihelp-query+pagepropnames-summary": "列出所有在 wiki 使用的頁面屬性名稱。",
"apihelp-query+pagepropnames-param-limit": "回傳的名稱數量上限。",
"apihelp-query+pagepropnames-example-simple": "取得前 10 個屬性名稱。",
"apihelp-query+pageprops-example-simple": "取得頁面 <kbd>Main Page</kbd> 與 <kbd>MediaWiki</kbd> 的屬性。",
"apihelp-query+prefixsearch-param-limit": "回傳的結果數量上限。",
"apihelp-query+prefixsearch-param-offset": "要略過的結果數量。",
"apihelp-query+prefixsearch-example-simple": "搜尋開頭為 <kbd>meaning</kbd> 的頁面標題。",
+ "apihelp-query+prefixsearch-param-profile": "搜尋要使用的配置。",
"apihelp-query+protectedtitles-param-namespace": "僅列出這些命名空間的標題。",
"apihelp-query+protectedtitles-param-level": "僅列出具有這些保護層級的標題。",
"apihelp-query+protectedtitles-param-limit": "要回傳的頁面總數。",
"apihelp-query+protectedtitles-param-prop": "要取得的屬性。",
+ "apihelp-query+protectedtitles-paramvalue-prop-user": "添加做出添加保護操作的使用者。",
+ "apihelp-query+protectedtitles-paramvalue-prop-userid": "添加做出添加保護操作的使用者 ID。",
+ "apihelp-query+protectedtitles-paramvalue-prop-comment": "添加保護的註釋。",
+ "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "添加保護的解析註釋。",
"apihelp-query+protectedtitles-paramvalue-prop-level": "添加保護層級。",
"apihelp-query+protectedtitles-example-simple": "列出已保護的標題。",
+ "apihelp-query+querypage-summary": "取得透過特殊頁面 QueryPage-based 所提供的清單。",
"apihelp-query+querypage-param-page": "特殊頁面的名稱。註:區分大小寫。",
"apihelp-query+querypage-param-limit": "回傳的結果數量。",
+ "apihelp-query+querypage-example-ancientpages": "回傳來自 [[Special:Ancientpages]] 的結果。",
"apihelp-query+random-summary": "取得隨機頁面集合",
"apihelp-query+random-param-namespace": "僅回傳在這些命名空間的頁面。",
"apihelp-query+random-param-redirect": "請改用 <kbd>$1filterredir=redirects</kbd>。",
"apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。",
"apihelp-query+recentchanges-param-tag": "僅列出以此標籤所標記的更改。",
"apihelp-query+recentchanges-param-prop": "包含的額外資訊部份:",
+ "apihelp-query+recentchanges-paramvalue-prop-comment": "添加編輯的註釋。",
+ "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
"apihelp-query+recentchanges-paramvalue-prop-flags": "添加編輯的標籤。",
"apihelp-query+recentchanges-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
"apihelp-query+recentchanges-paramvalue-prop-title": "添加編輯的頁面標題。",
"apihelp-query+revisions-example-first5-user": "取得 <kbd>Main Page</kbd> 裡由使用者 <kbd>MediaWiki default</kbd> 所做出的最早前 5 筆修訂。",
"apihelp-query+revisions+base-paramvalue-prop-ids": "修訂 ID。",
"apihelp-query+revisions+base-paramvalue-prop-flags": "修訂標籤(小修改)。",
+ "apihelp-query+revisions+base-paramvalue-prop-timestamp": "修訂的時間戳記。",
"apihelp-query+revisions+base-paramvalue-prop-user": "做出修訂的使用者。",
+ "apihelp-query+revisions+base-paramvalue-prop-userid": "修訂創建者的使用者 ID",
"apihelp-query+revisions+base-paramvalue-prop-size": "修訂的長度(位元組)。",
+ "apihelp-query+revisions+base-paramvalue-prop-sha1": "修訂的 SHA-1(base 16)。",
"apihelp-query+revisions+base-paramvalue-prop-tags": "修訂標籤。",
"apihelp-query+revisions+base-param-limit": "限制所回傳的修訂數量。",
"apihelp-query+search-summary": "執行全文搜尋。",
"apihelp-query+search-param-limit": "要回傳的頁面總數。",
"apihelp-query+search-param-interwiki": "若可用的話,在搜尋裡包含跨 wiki 結果。",
"apihelp-query+search-param-backend": "是否搜尋使用的後端,若否則為預設。",
+ "apihelp-query+search-param-sort": "設定回傳結果的排序。",
"apihelp-query+search-example-simple": "搜尋 <kbd>meaning</kbd>。",
"apihelp-query+search-example-text": "搜尋 <kbd>meaning</kbd> 的文字。",
"apihelp-query+siteinfo-summary": "回傳有關站台的一般資訊。",
"apihelp-query+siteinfo-param-prop": "要取得的資訊:",
"apihelp-query+siteinfo-paramvalue-prop-general": "全面系統資訊。",
"apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特殊頁面別名清單。",
+ "apihelp-query+siteinfo-param-showalldb": "列出所有資料庫伺服器,不是只有最延遲的那台。",
"apihelp-query+siteinfo-param-numberingroup": "列出在使用者群組裡的使用者數目。",
+ "apihelp-query+siteinfo-param-inlanguagecode": "用於本地化語言的語言代碼(盡可能)與外觀名稱。",
"apihelp-query+siteinfo-example-simple": "索取站台資訊。",
"apihelp-query+siteinfo-example-interwiki": "索取本地端跨 wiki 前綴的清單。",
"apihelp-query+siteinfo-example-replag": "檢查目前的響應延遲。",
"apihelp-query+usercontribs-paramvalue-prop-title": "添加標題與頁面的命名空間 ID。",
"apihelp-query+usercontribs-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
"apihelp-query+usercontribs-paramvalue-prop-comment": "添加編輯的註釋。",
- "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加編輯的已解析註解。",
+ "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
"apihelp-query+usercontribs-paramvalue-prop-size": "添加編輯的新大小。",
"apihelp-query+usercontribs-paramvalue-prop-flags": "添加編輯的標籤。",
"apihelp-query+usercontribs-paramvalue-prop-patrolled": "標記已巡查編輯。",
"apihelp-query+watchlist-paramvalue-prop-user": "添加有做出編輯的使用者。",
"apihelp-query+watchlist-paramvalue-prop-userid": "添加有做出編輯的使用者 ID。",
"apihelp-query+watchlist-paramvalue-prop-comment": "添加編輯的註釋。",
- "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "添加編輯的已解析註解。",
+ "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
"apihelp-query+watchlist-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
"apihelp-query+watchlist-paramvalue-prop-tags": "列出項目的標籤。",
"apihelp-query+watchlist-param-type": "要顯示的更改類型:",
"apihelp-revisiondelete-param-reason": "刪除或取消刪除的原因。",
"apihelp-revisiondelete-param-tags": "在刪除日誌裡套用到項目的標籤。",
"apihelp-rollback-summary": "撤修頁面的最後一次編輯。",
+ "apihelp-rollback-param-tags": "套用到回退的標籤。",
+ "apihelp-rollback-param-summary": "自定義編輯摘要。若為空,則使用預設摘要。",
"apihelp-rollback-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
"apihelp-setnotificationtimestamp-param-entirewatchlist": "在所有已監視頁面運作。",
+ "apihelp-setnotificationtimestamp-example-page": "重新設定用於 <kbd>Main page</kbd> 的通知狀態。",
+ "apihelp-setnotificationtimestamp-example-allpages": "重新設定在 <kbd>{{ns:user}}</kbd> 命名空間裡頁面的通知狀態。",
"apihelp-setpagelanguage-summary": "更改頁面的語言。",
+ "apihelp-setpagelanguage-extended-description-disabled": "您不被允許在此 wiki 上變更頁面的語言。\n\n請啟用 <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> 來進行此操作。",
"apihelp-setpagelanguage-param-reason": "變更的原因。",
"apihelp-setpagelanguage-example-language": "更改 <kbd>Main Page</kbd> 的語言成巴斯克語。",
"apihelp-stashedit-summary": "在分享快取裡預備編輯。",
"apihelp-unblock-param-reason": "解除封鎖的原因。",
"apihelp-unblock-param-tags": "在封鎖日誌裡更改套用到項目的標籤。",
"apihelp-unblock-example-id": "解除封銷 ID #<kbd>105</kbd>。",
+ "apihelp-undelete-summary": "恢復已刪除頁面的修訂。",
"apihelp-undelete-param-title": "要恢復的頁面標題。",
"apihelp-undelete-param-reason": "還原的原因。",
"apihelp-undelete-param-tags": "在刪除日誌裡更改套用到項目的標籤。",
"apihelp-undelete-example-page": "取消刪除頁面 <kbd>Main Page</kbd>。",
"apihelp-undelete-example-revisions": "取消刪除 <kbd>Main Page</kbd> 的兩筆修訂。",
"apihelp-unlinkaccount-summary": "移除目前使用者所連結到的第三方帳號。",
+ "apihelp-upload-summary": "上傳檔案,或取得等待上傳的狀態。",
"apihelp-upload-param-filename": "目標檔案名稱。",
"apihelp-upload-param-comment": "上傳註釋。如果 <var>$1text</var> 未指定的話,也會作為新檔案用的初始頁面文字。",
"apihelp-upload-param-text": "用於新檔案的初始頁面文字。",
"api-format-prettyprint-header-hyperlinked": "這是$1格式的HTML實現。HTML對除錯很有用,但不適合應用程式使用。\n\n指定<var>format</var>參數以更改輸出格式。要查看$1格式的非HTML實現,設置[$3 <kbd>format=$2</kbd>]。\n\n參見[[mw:API|完整文件]],或[[Special:ApiHelp/main|API幫助]]以獲取更多信息。",
"api-format-prettyprint-status": "此回應將會傳回HTTP狀態$1 $2。",
"api-login-fail-badsessionprovider": "當使用$1無法登入。",
+ "api-login-fail-sameorigin": "當未套用相同原有方針時無法登入。",
"api-pageset-param-titles": "要使用的標題清單。",
"api-pageset-param-pageids": "要使用的頁面 ID 清單。",
"api-pageset-param-revids": "要使用的修訂 ID 清單。",
"api-help-param-upload": "必須使用 multipart/form-data 以檔案上傳的方式傳送。",
"api-help-param-multi-separate": "將幾個值以 <kbd>|</kbd> 或 [[Special:ApiHelp/main#main/datatypes|alternative]] 分隔。",
"api-help-param-multi-max": "上限值為 {{PLURAL:$1|$1}} (機器人為 {{PLURAL:$2|$2}})。",
+ "api-help-param-multi-max-simple": "值的最大數量為 {{PLURAL:$1|$1}}。",
"api-help-param-multi-all": "要指定所有值,請使用<kbd>$1</kbd>。",
"api-help-param-default": "預設值:$1",
"api-help-param-default-empty": "預設值:<span class=\"apihelp-empty\">(空)</span>",
"api-help-authmanagerhelper-returnurl": "為第三方身份驗證流程傳回URL,必須為絕對值。需要此值或<var>$1continue</var>兩者之一。\n\n在接收<samp>REDIRECT</samp>回應時,一般狀況下您將打開瀏覽器或網站瀏覽功能到特定的<samp>redirecttarget</samp> URL以進行第三方身份驗證流程。當它完成時,第三方會將瀏覽器或網站瀏覽功能送至此URL。您應當提取任何來自URL的查詢或POST參數,並將之作為<var>$1continue</var>請求傳遞至此API模組。",
"api-help-authmanagerhelper-continue": "此請求是在先前的<samp>UI</samp>或<samp>REDIRECT</samp>回應之後的後續動作。必須為此值或<var>$1returnurl</var>。",
"api-help-authmanagerhelper-additional-params": "此模組允許額外參數,取決於可用的身份驗證請求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前來自此模組的回應,如果合適)以決定可用請求及其使用的欄位。",
+ "apierror-appendnotsupported": "無法附加到使用內容模組 $1 的頁面。",
"apierror-articleexists": "您所嘗試建立的條目剛剛已被創建。",
"apierror-assertbotfailed": "斷言使用者擁有的 <code>bot</code> 權限失效。",
"apierror-assertnameduserfailed": "斷言使用者「$1」出錯。",
"apierror-contentserializationexception": "內容序列化失敗:$1",
"apierror-copyuploadbadurl": "不允許從此 URL 來上傳。",
"apierror-csp-report": "處理 CSP 報告時錯誤:$1。",
+ "apierror-emptypage": "不允許建立空白的新頁面。",
"apierror-filedoesnotexist": "檔案不存在。",
"apierror-filenopath": "無法取得本地端檔案路徑。",
"apierror-filetypecannotberotated": "無法旋轉的檔案類型。",
"apierror-imageusage-badtitle": "<kbd>$1</kbd>的標題必須是檔案。",
"apierror-import-unknownerror": "未知的匯入錯誤:$1",
"apierror-invalidcategory": "您所輸入的分類名稱無效。",
+ "apierror-invalidlang": "用於參數 <var>$1</var> 的語言代碼無效。",
+ "apierror-invalidoldimage": "<var>oldimage</var> 參數含有無效格式。",
+ "apierror-invalidparammix-cannotusewith": "參數 <kbd>$1</kbd> 不能與 <kbd>$2</kbd> 一起使用。",
+ "apierror-invalidparammix-mustusewith": "<kbd>$1</kbd> 參數僅能與 <kbd>$2</kbd> 一起使用。",
"apierror-invalidparammix": "{{PLURAL:$2|參數}} $1 不能一起使用。",
"apierror-invalidsha1base36hash": "所提供的 SHA1Base36 雜湊無效。",
"apierror-invalidsha1hash": "所提供的 SHA1 雜湊無效。",
"apierror-invalidtitle": "錯誤標題「$1」。",
+ "apierror-invalidurlparam": "<var>$1urlparam</var> 的值無效(<kbd>$2=$3</kbd>)。",
"apierror-invaliduser": "無效的使用者名稱「$1」。",
"apierror-invaliduserid": "使用者 ID <var>$1</var> 無效。",
+ "apierror-maxbytes": "參數 <var>$1</var> 不能大於 $2 {{PLURAL:$2|位元組|位元組}}",
+ "apierror-maxchars": "參數 <var>$1</var> 不能多於 $2 個{{PLURAL:$2|字元|字元}}",
+ "apierror-maxlag-generic": "正等待資料庫伺服器:已延遲 $1 {{PLURAL:$1|秒|秒}}。",
+ "apierror-maxlag": "正等待$2:已延遲 $1 {{PLURAL:$1|秒|秒}}。",
"apierror-mimesearchdisabled": "MIME 搜尋在 Miser 模式裡被停用。",
"apierror-missingcontent-pageid": "遺失頁面 ID 為 $1 的內容。",
"apierror-missingcontent-revid": "遺失修訂 ID 為 $1 的內容。",
+ "apierror-missingparam-one-of": "{{PLURAL:$2|參數|參數其一}} $1 為必要。",
"apierror-missingparam": "<var>$1</var>參數必須被設定。",
"apierror-missingrev-pageid": "沒有頁面 ID 為 $1 的目前修訂。",
"apierror-missingrev-title": "沒有標題為$1的目前修訂。",
"apierror-missingtitle": "您所指定的頁面不存在。",
"apierror-missingtitle-byname": "頁面$1不存在。",
+ "apierror-moduledisabled": "模組 <kbd>$1</kbd> 已停用。",
"apierror-mustbeloggedin-changeauth": "必須登入,才能變更身分核對資取。",
"apierror-mustbeloggedin-generic": "您必須登入。",
"apierror-mustbeloggedin-linkaccounts": "您必須登入到連結帳號。",
}
# Fill in the fallback if it's not there already
- if ( is_null( $coreData['fallback'] ) ) {
- $coreData['fallback'] = $code === 'en' ? false : 'en';
- }
- if ( $coreData['fallback'] === false ) {
- $coreData['fallbackSequence'] = [];
+ if ( ( is_null( $coreData['fallback'] ) || $coreData['fallback'] === false ) && $code === 'en' ) {
+ $coreData['fallback'] = false;
+ $coreData['originalFallbackSequence'] = $coreData['fallbackSequence'] = [];
} else {
- $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+ if ( !is_null( $coreData['fallback'] ) ) {
+ $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+ } else {
+ $coreData['fallbackSequence'] = [];
+ }
$len = count( $coreData['fallbackSequence'] );
- # Ensure that the sequence ends at en
- if ( $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
+ # Before we add the 'en' fallback for messages, keep a copy of
+ # the original fallback sequence
+ $coreData['originalFallbackSequence'] = $coreData['fallbackSequence'];
+
+ # Ensure that the sequence ends at 'en' for messages
+ if ( !$len || $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
$coreData['fallbackSequence'][] = 'en';
}
}
* made to replace information about the old content with information about
* the new content.
*
- * This default implementation calls
- * $this->getParserOutput( $content, $title, null, null, false ),
- * and then calls getSecondaryDataUpdates( $title, $recursive ) on the
- * resulting ParserOutput object.
- *
- * Subclasses may implement this to determine the necessary updates more
- * efficiently, or make use of information about the old content.
+ * @deprecated since 1.32, call and override
+ * ContentHandler::getSecondaryDataUpdates instead.
*
* @note Implementations should call the SecondaryDataUpdates hook, like
* AbstractContent does.
* the current state of the database.
*
* @since 1.21
+ * @deprecated since 1.32, call and override
+ * ContentHandler::getDeletionUpdates instead.
*
- * @param WikiPage $page The deleted page
+ * @param WikiPage $page The page the content was deleted from.
* @param ParserOutput|null $parserOutput Optional parser output object
* for efficient access to meta-information about the content object.
* Provide if you have one handy.
use Wikimedia\Assert\Assert;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\SlotRenderingProvider;
use MediaWiki\Search\ParserOutputSearchDataExtractor;
/**
return $parserOutput;
}
+ /**
+ * Returns a list of DeferrableUpdate objects for recording information about the
+ * given Content in some secondary data store.
+ *
+ * Application logic should not call this method directly. Instead, it should call
+ * DerivedPageDataUpdater::getSecondaryDataUpdates().
+ *
+ * @note Implementations must not return a LinksUpdate instance. Instead, a LinksUpdate
+ * is created by the calling code in DerivedPageDataUpdater, on the combined ParserOutput
+ * of all slots, not for each slot individually. This is in contrast to the old
+ * getSecondaryDataUpdates method defined by AbstractContent, which returned a LinksUpdate.
+ *
+ * @note Implementations should not call $content->getParserOutput, they should call
+ * $slotOutput->getSlotRendering( $role, false ) instead if they need to access a ParserOutput
+ * of $content. This allows existing ParserOutput objects to be re-used, while avoiding
+ * creating a ParserOutput when none is needed.
+ *
+ * @param Title $title The title of the page to supply the updates for
+ * @param Content $content The content to generate data updates for.
+ * @param string $role The role (slot) in which the content is being used. Which updates
+ * are performed should generally not depend on the role the content has, but the
+ * DeferrableUpdates themselves may need to know the role, to track to which slot the
+ * data refers, and to avoid overwriting data of the same kind from another slot.
+ * @param SlotRenderingProvider $slotOutput A provider that can be used to gain access to
+ * a ParserOutput of $content by calling $slotOutput->getSlotParserOutput( $role, false ).
+ * @return DeferrableUpdate[] A list of DeferrableUpdate objects for putting information
+ * about this content object somewhere. The default implementation returns an empty
+ * array.
+ * @since 1.32
+ */
+ public function getSecondaryDataUpdates(
+ Title $title,
+ Content $content,
+ $role,
+ SlotRenderingProvider $slotOutput
+ ) {
+ return [];
+ }
+
+ /**
+ * Returns a list of DeferrableUpdate objects for removing information about content
+ * in some secondary data store. This is used when a page is deleted, and also when
+ * a slot is removed from a page.
+ *
+ * Application logic should not call this method directly. Instead, it should call
+ * WikiPage::getSecondaryDataUpdates().
+ *
+ * @note Implementations must not return a LinksDeletionUpdate instance. Instead, a
+ * LinksDeletionUpdate is created by the calling code in WikiPage.
+ * This is in contrast to the old getDeletionUpdates method defined by AbstractContent,
+ * which returned a LinksUpdate.
+ *
+ * @note Implementations should not rely on the page's current content, but rather the current
+ * state of the secondary data store.
+ *
+ * @param Title $title The title of the page to supply the updates for
+ * @param string $role The role (slot) in which the content is being used. Which updates
+ * are performed should generally not depend on the role the content has, but the
+ * DeferrableUpdates themselves may need to know the role, to track to which slot the
+ * data refers, and to avoid overwriting data of the same kind from another slot.
+ *
+ * @return DeferrableUpdate[] A list of DeferrableUpdate objects for putting information
+ * about this content object somewhere. The default implementation returns an empty
+ * array.
+ *
+ * @since 1.32
+ */
+ public function getDeletionUpdates( Title $title, $role ) {
+ return [];
+ }
+
}
* @param int $num
*/
public function setPerRow( $num ) {
- return;
}
}
"config-memory-raised": "'O valore 'e PHP <code>memory_limit</code> è $1, aumentato a $2.",
"config-memory-bad": "<strong>Attenziò:</strong> 'o valore 'e PHP <code>memory_limit</code> è $1.\nProbabbilmente troppo basso.\n'A installazione se putesse scassà!",
"config-apc": "[https://secure.php.net/apc APC] è installato",
+ "config-apcu": "[https://secure.php.net/apcu APCu] è installato",
"config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] è installato",
"config-no-cache-apcu": "<strong>Attenziò:</strong> [https://secure.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [https://www.iis.net/downloads/microsoft/wincache-extension WinCache] nun so' state truvate.\n'A funziona caching 'e ll'oggette non è apicciata.",
"config-mod-security": "<strong>Attenziò:</strong> 'O servitore web vuosto téne [https://modsecurity.org/ mod_security]/mod_security2 appicciato. Ce stanno tante mpustaziune commune ca 'o facessero causà prubbleme a MediaWiki e ll'ati software ca permettessero ll'utente 'e pubbrecà cuntenute.\nSi putite, stutate sta funziona. Sinò, riferite 'a [https://modsecurity.org/documentation/ documentaziona ncopp' 'o mod_security] o cuntattate 'o host vuosto pe' ve dà supporto quanno se scummogliasse cocch'errore.",
"config-no-cli-uploads-check": "<strong>Attenziò:</strong> 'a cartella predefinita p' 'e carreche (<code>$1</code>) nun è stata cuntrullata p' 'a vulnerabbelità ncopp'a l'esecuzione arbitraria 'e script pe' tramente ca se fà l'installazione 'a linea 'e commando.",
"config-brokenlibxml": "'O sistema vuosto ave na combinazione 'e verziune 'e PHP e libxml2 nguacchiata ca putesse scassà 'e date 'e MediaWiki 'n manera annascunnusa e pure l'ati apprecaziune p' 'o web.\nAgghiurnate a libxml2 2.7.3 o cchiù muderno ([https://bugs.php.net/bug.php?id=45996 'o bug studiato d' 'o lato PHP]).\nInstallaziona spezzata.",
"config-suhosin-max-value-length": "Suhosin è installato e miette lemmeto 'o parametro GET <code>length</code> a $1 byte.\n'O componente MediaWiki ResourceLoader funzionarrà aggirann'a stu lemmeto, ma luvanno prestaziune.\nSi pussibile, avit'a mpustà <code>suhosin.get.max_value_length</code> a 1024 o cchiù auto 'n <code>php.ini</code>, e mpustà <code>$wgResourceLoaderMaxQueryLength</code> a 'o stesso valore 'n <code>LocalSettings.php</code>.",
+ "config-using-32bit": "<strong>Attenziò:</strong> 'o sistema vuosto pare c'ausasse nummere sane 'e 32-bit. Chest' [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit è scunzigliat].",
"config-db-type": "Tipo 'e database:",
"config-db-host": "Host d' 'o database:",
"config-db-host-help": "Si 'o server database vuosto stà mpizzato dint' 'a nu server differente, miette 'o nomme d' 'o host o l'indirizzo IP sujo.\n\nSi state ausanno nu servizio spartuto web hosting, 'aggenzia 'e hosting v'avess'a dà 'o nomme buono 'e nomme host dint' 'a documentaziona suoja.\n\nSi state installanno chisto dint'a nu server Windows cu MySQL, ausanno \"localhost\" può darse ca nun funziona p' 'o nomme server. Si chisto nun funziona, mettite \"127.0.0.1\" p' 'o ndirizzo locale vuosto.\n\nSi state ausanno PostgreSQL, lassate abbacante stu campo pe' v'accucchià cu nu socket Unix.",
"config-type-mysql": "MariaDB, MySQL o compatibbele",
"config-type-mssql": "Microsoft SQL Server",
"config-support-info": "MediaWiki supporta 'e sisteme 'e database ccà abbascio:\n\n$1\n\nSi nfra chiste ccà nun vedite 'o sistema 'e database ca vulite ausà, allora avite liegge 'e instruziune ccà ncoppa pe' ne dà supporto.",
- "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MySQL cumpatibbele. ([https://secure.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])",
- "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è nu sistema canusciuto 'e database open source ca fosse n'alternativa a MySQL. Putess'avé cocch'errore p'arricettà, e nun è cunzigliato 'e ll'ausà dint'a n'ambiente 'e produziona. ([https://secure.php.net/manual/en/pgsql.installation.php Comme s'avess'a cumpilà PHP cu suppuorto PostgreSQL])",
- "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] è nu sistema 'e database leggero, ca fosse assaje buono suppurtato. ([http://www.php.net/manual/en/pdo.installation.php Comme cumpilà PHP cu suppuorto SQLite], aùsa PDO)",
- "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] è nu database 'e na fraveca commerciale. ([http://www.php.net/manual/en/oci8.installation.php Comme cumpilà PHP cu suppuorto OCI8])",
+ "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MariaDB cumpatibbele. ([https://secure.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])",
+ "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è nu sistema canusciuto 'e database open source ca fosse n'alternativa a MySQL.\n([https://secure.php.net/manual/en/pgsql.installation.php Comme s'avess'a cumpilà PHP cu suppuorto PostgreSQL])",
+ "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] è nu sistema 'e database leggero, ca fosse assaje buono suppurtato.\n([https://secure.php.net/manual/en/pdo.installation.php Comme cumpilà PHP cu suppuorto SQLite], aùsa PDO)",
+ "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] è nu database 'e na fraveca commerciale. ([https://secure.php.net/manual/en/oci8.installation.php Comme cumpilà PHP cu suppuorto OCI8])",
"config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] è nu database 'e na fraveca commerciale p' 'o Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Comme cumpilà PHP cu suppuorto SQLSRV])",
- "config-header-mysql": "Mpustaziune MySQL",
+ "config-header-mysql": "Mpustaziune MariaDB/MySQL",
"config-header-postgres": "Mpustaziune PostgreSQL",
"config-header-sqlite": "Mpustaziune SQLite",
"config-header-oracle": "Mpustaziune Oracle",
"config-db-web-create": "Crìa 'o cunto si nun esiste ancora",
"config-db-web-no-create-privs": "'O cunto ausato pe' ne fà l'installazione nun tene diritte necessarie pe' ne putè crià n'atu cunto.\n'O cunto zegnàto ccà adda esistere già.",
"config-mysql-engine": "Mutore d'astipo:",
- "config-mysql-innodb": "InnoDB",
+ "config-mysql-innodb": "InnoDB (fosse 'o cunzigliato)",
"config-mysql-myisam": "MyISAM",
"config-mysql-myisam-dep": "<strong>Attenziò:</strong> avite scigliuto MyISAM comm' 'o mutore 'archiviaziona MySQL, ca nun è raccummannato pe' l'ausà cu MediaWiki, pecché:\n* supporta debolmente 'a concorrenza p' 'o blocco d' 'a tabbella\n* è cchiù inchine 'a corruzione 'e l'ati mutore\n* 'o codece 'e base 'e MediaWiki nun gestisce sempe MyISAM comme l'avess'a gistiunà\n\nSi ll'installazione vosta MySQL suppuorta InnoDB, è autamente raccummandato ca si scigliesse a 'o posto suo.\nSi 'a installazione MySQL nun suppurtasse InnoDB, forse è 'o mumento 'e ll'agghiurnà.",
"config-mysql-only-myisam-dep": "<strong>Attenziò:</strong> MyISAM è l'uneco mutore p'astipà date ca se trova mo' a disposizione p' 'o MySQL dint'a sta macchina, e nun fosse raccumandato 'e s'ausà cu MediaWiki, pecché:\n* suppurtasse minimamente concorrenza pe' bbìa 'e bluccà tabbelle\n* è cchiù facile ca jesse a se scassà cchiù 'e l'ati mutore\n* 'o codece MediaWiki nun maniasse sempe MyISAM comme l'avesse 'e manià\n\nL'installazione MySQL nun suppurtasse InnoDB, può darse ca chist'è 'o mumento pe' ve ll'agghiurnà.",
"config-subscribe": "Mettiteve dint' 'a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list 'e ll'annunciazione 'e verziune d' 'o software rilassate].",
"config-subscribe-help": "Chest'è na mailing list a basso traffeco ca se dedicasse a se ffà annunzie 'e verziune nove, piglianno pure mpurtante nutarelle ca riguardassero 'a sicurezza.\nFosse cunzigliato 'e se nzegnà e s'agghiurnà l'installazione 'e MediaWiki quanno na verziona nova fosse pubbreca.",
"config-subscribe-noemail": "Vuje avite tentato 'e ve trasì dint' 'a mailing list addedecata a se fà annunzie ncopp' 'e verziune nove senza ve dà n'indirizzo email.\nNzertanno n'indirizzo email se vulite affettuà l'iscrizione dint'a mailing list.",
+ "config-pingback": "Sparte 'e date 'e st'installazione ch' 'e sviluppature 'e MediaWiki.",
+ "config-pingback-help": "Si vuje sciglite st'opzione, MediaWiki cuntattasse spisso https://www.mediawiki.org ch' 'e date 'e base e st'istanza MediaWiki. Dint' 'a sta categoria 'e date, tràseno, p'esempie, 'o tipo 'e sistema, 'a virziona 'e PHP e database 'e backend scigliuto. 'A Wikimedia Foundation spartisse sti date ch' 'e sviluppature Mediawiki p' 'a puté aiutà a guidà 'e fatiche 'e sviluppo future. P' 'o sistema d' 'o vuosto 'e date se mannan'accussì:\n<pre>$1</pre>",
"config-almost-done": "Avite quase fernuto!\nMo' putite zumpà 'a parta r' 'a configurazione e sempricemente installà 'a wiki.",
"config-optional-continue": "Spiate cchiù dimanne.",
"config-optional-skip": "Me so' scucciato già, installa surtanto 'o wiki.",
"config-cache-options": "Mpustaziune p' 'a cache d'oggette:",
"config-cache-help": "'O caching 'uggette s'ausa pe' puté migliurà 'a velocità 'e MediaWiki a fforza 'e ffà caching d' 'e date cchiù spisso ausàte.\nE Mezze a gruosse site se songo ncuraggiate a ll'appiccià chiste, e site piccerilli vedarranno migliuramente pure.",
"config-cache-none": "Nisciuna memorizzazione n cache (nisciuna funziunalità è luvata, ma 'a velocità se putesse ffà a meno dint' 'e wiki cchiù gruosse)",
- "config-cache-accel": "Mettere 'n cache oggette PHP (APC, XCache o WinCache)",
+ "config-cache-accel": "Mettere 'n cache oggette PHP (APC, APCu o WinCache)",
"config-cache-memcached": "Aúsa 'o Memcached (richiede cchiù mpustaziune 'installazione e configuraziona)",
"config-memcached-servers": "Server memcached:",
"config-memcached-help": "Elenco 'e ll'indirizzi IP p' 'e putè ausà p' 'o Memcached.\nS'avess'a specificà uno pe' riga e scrivere 'a porta 'e trasuta. P'esempio:\n 127.0.0.1:11211\n 192.168.1.25:1234",
"config-install-subscribe-fail": "Nun se pò sottoscrivere mediawiki-announce: $1",
"config-install-subscribe-notpossible": "cURL nun è installato e <code>allow_url_fopen</code> nun è disponibbele.",
"config-install-mainpage": "Crianno 'a paggena prencepale ch' 'e cuntenute predefinite",
+ "config-install-mainpage-exists": "'A paggena principale esiste già, è zumpata",
"config-install-extension-tables": "Crianno tabelle pe' estenziune appicciate",
"config-install-mainpage-failed": "Nun se pò nzertà 'a paggena prencepale: $1",
- "config-install-done": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki apposto.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto e 'o nzertà dint' 'a cartella bbase d' 'o wiki vuosto ('a stessa addò fosse prisente l' index.php). 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' 'o cullegamento 'e seguito:\n\n$3\n\n<strong>Nota:</strong> si ascite mò 'a ll'installazione senza manco scarrecà 'o file 'e configurazione che s'è criato, po chesto nun sarrà cchiù dispunibbele.\n\nQuanno fosse tutto fernuto allora <strong>[$2 trasite dint' 'o wiki vuosto]</strong>.",
+ "config-install-done": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto e 'o nzertà dint' 'a cartella bbase d' 'o wiki vuosto ('a stessa addò fosse prisente l' index.php). 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' 'o cullegamento 'e seguito:\n\n$3\n\n<strong>Nota:</strong> si ascite mò 'a ll'installazione senza manco scarrecà 'o file 'e configurazione che s'è criato, po chesto nun sarrà cchiù dispunibbele.\n\nQuanno fosse tutto fernuto allora <strong>[$2 trasite dint' 'o wiki vuosto]</strong>.",
+ "config-install-done-path": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto, e l'avit'azzeccà dint' 'o <code>$4</code>. 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' 'o cullegamento 'e seguito:\n\n$3\n\n<strong>Nota:</strong> si ascite mò 'a ll'installazione senza manco scarrecà 'o file 'e configurazione che s'è criato, po chesto nun sarrà cchiù dispunibbele.\n\nQuanno fosse tutto fernuto allora <strong>[$2 trasite dint' 'o wiki vuosto]</strong>.",
+ "config-install-success": "Avite installato MediaWiki apposto. Mo' putite vedé ncopp'a <$1$2> 'o wiki vuosto.\nSi avite cocche dubbio, vedite 'e trasí dint' 'a l'elenco 'e quistione FAQ:\n<https://www.mediawiki.org/wiki/Manual:FAQ> o vedite 'e cuntattà cocche forum 'e suppuorto dint' 'a chilla paggena.",
"config-download-localsettings": "Scarreca <code>LocalSettings.php</code>",
"config-help": "ajùto",
"config-help-tooltip": "cliccà pe' 'o spannere",
"config-nofile": "'O file \"$1\" nun se trova. Forse è stato scancellato?",
"config-extension-link": "'O sapevate ch' 'o wiki vuosto suppurtasse 'e [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensiune]?\n\nPutite navigà nfra chiste [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensiune pe' categurìa].",
- "mainpagetext": "<strong>MediaWiki è stato nstallato.</strong>",
- "mainpagedocfooter": "Iate a cunzultà [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] pe' n'avé nfurmaziune ncopp' 'o modo aùso d' 'o software wiki.\n\n== P'accummincià ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenco 'e mpustaziune pe' sta configuraziona]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ 'e Mediawiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenco 'e nutizie 'e Mediawiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione 'e MediaWiki p' 'a lengua vuosta]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Mparate a cumbattere 'o spammo dint' 'a wiki d' 'a vosta]"
+ "config-skins-screenshots": "$1 (screenshots: $2)",
+ "config-extensions-requires": "$1 (vuless' 'o $2)",
+ "config-screenshot": "screenshot",
+ "mainpagetext": "<strong>MediaWiki è stato installato.</strong>",
+ "mainpagedocfooter": "Iate a cunzultà [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] pe' n'avé nfurmaziune ncopp' 'o modo aùso d' 'o software wiki.\n\n== P'accummincià ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenco 'e mpustaziune pe' sta configuraziona]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ 'e Mediawiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenco 'e nutizie 'e Mediawiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione 'e MediaWiki p' 'a lengua vuosta]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Mparate a cumbattere 'o spammo dint' 'a wiki d' 'a vosta]"
}
if ( $flags & self::QOS_ATOMIC ) {
$dbw->endAtomic( $method );
}
-
- return;
}
/**
unset( $req['query']['oldid'] );
}
} elseif ( $reqType === 'transform' ) {
- $req['url'] .= 'transform/'. $parts[3] . '/to/' . $parts[5];
+ $req['url'] .= 'transform/' . $parts[3] . '/to/' . $parts[5];
// the title
if ( isset( $parts[6] ) ) {
$req['url'] .= '/' . $parts[6];
// Make a regex out of the source data to match it to an array of color
// spaces in a case-insensitive way
- $colorSpaceRegex = '/'.preg_quote( $data[0], '/' ).'/i';
+ $colorSpaceRegex = '/' . preg_quote( $data[0], '/' ) . '/i';
if ( empty( preg_grep( $colorSpaceRegex, $colorSpaces ) ) ) {
// We can't establish that this file matches the color space, don't process it
return false;
}
- $profileRegex = '/'.preg_quote( $data[1], '/' ).'/i';
+ $profileRegex = '/' . preg_quote( $data[1], '/' ) . '/i';
if ( empty( preg_grep( $profileRegex, $oldProfileStrings ) ) ) {
// We can't establish that this file has the expected ICC profile, don't process it
return false;
if ( $this->mRevision !== null ) {
// Revision title doesn't match the page title given?
if ( $this->mPage->getId() != $this->mRevision->getPage() ) {
- $function = get_class( $this->mPage ). '::newFromID';
+ $function = get_class( $this->mPage ) . '::newFromID';
$this->mPage = $function( $this->mRevision->getPage() );
}
}
// Note that the ArticleViewHeader hook is allowed to set $outputDone to a
// ParserOutput instance.
$pOutput = ( $outputDone instanceof ParserOutput )
+ // phpcs:ignore MediaWiki.Usage.NestedInlineTernary.UnparenthesizedTernary -- FIXME T203805
? $outputDone // object fetched by hook
: $this->mParserOutput ?: null; // ParserOutput or null, avoid false
/**
* Lightweight method to get the parser output for a page, checking the parser cache
- * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
+ * and so on. Doesn't consider most of the stuff that Article::view() is forced to
* consider, so it's not appropriate to use there.
*
* @since 1.16 (r52326) for LiquidThreads
* Call to WikiPage function for backwards compatibility.
* @see WikiPage::doDeleteUpdates
*/
- public function doDeleteUpdates( $id, Content $content = null ) {
- return $this->mPage->doDeleteUpdates( $id, $content );
+ public function doDeleteUpdates(
+ $id,
+ Content $content = null,
+ $revision = null,
+ User $user = null
+ ) {
+ $this->mPage->doDeleteUpdates( $id, $content, $revision, $user );
}
/**
} else {
$row .=
'<td dir="' . MediaWikiServices::getInstance()->getContentLanguage()->getDir() .
- '">' . Linker::formatComment( $description, $this->title ) . '</td>';
+ '">' . Linker::formatComment( $description, $this->title ) . '</td>';
}
$rowClass = null;
use MediaWiki\Storage\RevisionRecord;
use MediaWiki\Storage\RevisionSlotsUpdate;
use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
use Wikimedia\Assert\Assert;
use Wikimedia\Rdbms\FakeResultWrapper;
use Wikimedia\Rdbms\IDatabase;
* Do some database updates after deletion
*
* @param int $id The page_id value of the page being deleted
- * @param Content|null $content Optional page content to be used when determining
+ * @param Content|null $content Page content to be used when determining
* the required updates. This may be needed because $this->getContent()
* may already return null when the page proper was deleted.
- * @param Revision|null $revision The latest page revision
+ * @param RevisionRecord|Revision|null $revision The current page revision at the time of
+ * deletion, used when determining the required updates. This may be needed because
+ * $this->getRevision() may already return null when the page proper was deleted.
* @param User|null $user The user that caused the deletion
*/
public function doDeleteUpdates(
$id, Content $content = null, Revision $revision = null, User $user = null
) {
+ if ( $id !== $this->getId() ) {
+ throw new InvalidArgumentException( 'Mismatching page ID' );
+ }
+
try {
$countable = $this->isCountable();
} catch ( Exception $ex ) {
) );
// Delete pagelinks, update secondary indexes, etc
- $updates = $this->getDeletionUpdates( $content );
+ $updates = $this->getDeletionUpdates(
+ $revision ? $revision->getRevisionRecord() : $content
+ );
foreach ( $updates as $update ) {
DeferredUpdates::addUpdate( $update );
}
* updates should remove any information about this page from secondary data
* stores such as links tables.
*
- * @param Content|null $content Optional Content object for determining the
- * necessary updates.
+ * @param RevisionRecord|Content|null $rev The revision being deleted. Also accepts a Content
+ * object for backwards compatibility.
* @return DeferrableUpdate[]
*/
- public function getDeletionUpdates( Content $content = null ) {
- if ( !$content ) {
- // load content object, which may be used to determine the necessary updates.
- // XXX: the content may not be needed to determine the updates.
+ public function getDeletionUpdates( $rev = null ) {
+ if ( !$rev ) {
+ wfDeprecated( __METHOD__ . ' without a RevisionRecord', '1.32' );
+
try {
- $content = $this->getContent( Revision::RAW );
+ $rev = $this->getRevisionRecord();
} catch ( Exception $ex ) {
// If we can't load the content, something is wrong. Perhaps that's why
// the user is trying to delete the page, so let's not fail in that case.
// Note that doDeleteArticleReal() will already have logged an issue with
// loading the content.
+ wfDebug( __METHOD__ . ' failed to load current revision of page ' . $this->getId() );
}
}
- if ( !$content ) {
- $updates = [];
+ if ( !$rev ) {
+ $slotContent = [];
+ } elseif ( $rev instanceof Content ) {
+ wfDeprecated( __METHOD__ . ' with a Content object instead of a RevisionRecord', '1.32' );
+
+ $slotContent = [ 'main' => $rev ];
} else {
- $updates = $content->getDeletionUpdates( $this );
+ $slotContent = array_map( function ( SlotRecord $slot ) {
+ return $slot->getContent( Revision::RAW );
+ }, $rev->getSlots()->getSlots() );
}
- Hooks::run( 'WikiPageDeletionUpdates', [ $this, $content, &$updates ] );
- return $updates;
+ $allUpdates = [ new LinksDeletionUpdate( $this ) ];
+
+ // NOTE: once Content::getDeletionUpdates() is removed, we only need to content
+ // model here, not the content object!
+ // TODO: consolidate with similar logic in DerivedPageDataUpdater::getSecondaryDataUpdates()
+ /** @var Content $content */
+ foreach ( $slotContent as $role => $content ) {
+ $handler = $content->getContentHandler();
+
+ $updates = $handler->getDeletionUpdates(
+ $this->getTitle(),
+ $role
+ );
+ $allUpdates = array_merge( $allUpdates, $updates );
+
+ // TODO: remove B/C hack in 1.32!
+ $legacyUpdates = $content->getDeletionUpdates( $this );
+
+ // HACK: filter out redundant and incomplete LinksDeletionUpdate
+ $legacyUpdates = array_filter( $legacyUpdates, function ( $update ) {
+ return !( $update instanceof LinksDeletionUpdate );
+ } );
+
+ $allUpdates = array_merge( $allUpdates, $legacyUpdates );
+ }
+
+ Hooks::run( 'PageDeletionDataUpdates', [ $this->getTitle(), $rev, &$allUpdates ] );
+
+ // TODO: hard deprecate old hook in 1.33
+ Hooks::run( 'WikiPageDeletionUpdates', [ $this, $content, &$allUpdates ] );
+ return $allUpdates;
}
/**
} elseif ( is_array( $contextNode ) ) {
// Node descriptor array
if ( count( $contextNode ) !== 2 ) {
- throw new MWException( __METHOD__.
+ throw new MWException( __METHOD__ .
': found an array where a node descriptor should be' );
}
list( $contextName, $contextChildren ) = $contextNode;
$class = self::class;
}
} else {
- throw new MWException( __METHOD__.': invalid node descriptor' );
+ throw new MWException( __METHOD__ . ': invalid node descriptor' );
}
return new $class( $store, $index );
}
public function __construct( array $store, $index ) {
$descriptor = $store[$index];
if ( $descriptor[PPNode_Hash_Tree::NAME][0] !== '@' ) {
- throw new MWException( __METHOD__.': invalid name in attribute descriptor' );
+ throw new MWException( __METHOD__ . ': invalid name in attribute descriptor' );
}
$this->name = substr( $descriptor[PPNode_Hash_Tree::NAME], 1 );
$this->value = $descriptor[PPNode_Hash_Tree::CHILDREN][0];
}
} else {
if ( $states ) {
- // Keep default escaping of slashes (e.g. "</script>") for ResourceLoaderClientHtml.
- $this->errors[] = 'Problematic modules: ' . json_encode( $states, JSON_PRETTY_PRINT );
+ $this->errors[] = 'Problematic modules: '
+ . self::encodeJsonForScript( $states );
}
}
if ( self::inDebugMode() ) {
$scripts = new XmlJsCode( "function ( $, jQuery, require, module ) {\n{$scripts->value}\n}" );
} else {
- $scripts = new XmlJsCode( 'function($,jQuery,require,module){'. $scripts->value . '}' );
+ $scripts = new XmlJsCode( 'function($,jQuery,require,module){' . $scripts->value . '}' );
}
} elseif ( !is_string( $scripts ) && !is_array( $scripts ) ) {
throw new MWException( 'Invalid scripts error. Array of URLs or string of code expected.' );
return $out;
}
+ /**
+ * Wrapper around json_encode that avoids needless escapes,
+ * and pretty-prints in debug mode.
+ *
+ * @internal
+ * @since 1.32
+ * @param bool|string|array $data
+ * @return string JSON
+ */
+ public static function encodeJsonForScript( $data ) {
+ // Keep output as small as possible by disabling needless escape modes
+ // that PHP uses by default.
+ // However, while most module scripts are only served on HTTP responses
+ // for JavaScript, some modules can also be embedded in the HTML as inline
+ // scripts. This, and the fact that we sometimes need to export strings
+ // containing user-generated content and labels that may genuinely contain
+ // a sequences like "</script>", we need to encode either '/' or '<'.
+ // By default PHP escapes '/'. Let's escape '<' instead which is less common
+ // and allows URLs to mostly remain readable.
+ $jsonFlags = JSON_UNESCAPED_SLASHES |
+ JSON_UNESCAPED_UNICODE |
+ JSON_HEX_TAG |
+ JSON_HEX_AMP;
+ if ( self::inDebugMode() ) {
+ $jsonFlags |= JSON_PRETTY_PRINT;
+ }
+ return json_encode( $data, $jsonFlags );
+ }
+
/**
* Returns a JS call to mw.loader.state, which sets the state of one
* ore more modules to a given value. Has two calling conventions:
);
}
- /**
- * Returns JS code which calls the script given by $script. The script will
- * be called with local variables name, version, dependencies and group,
- * which will have values corresponding to $name, $version, $dependencies
- * and $group as supplied.
- *
- * @param string $name Module name
- * @param string $version Module version hash
- * @param array $dependencies List of module names on which this module depends
- * @param string $group Group which the module is in.
- * @param string $source Source of the module, or 'local' if not foreign.
- * @param string $script JavaScript code
- * @return string JavaScript code
- */
- public static function makeCustomLoaderScript( $name, $version, $dependencies,
- $group, $source, $script
- ) {
- $script = str_replace( "\n", "\n\t", trim( $script ) );
- return Xml::encodeJsCall(
- "( function ( name, version, dependencies, group, source ) {\n\t$script\n} )",
- [ $name, $version, $dependencies, $group, $source ],
- self::inDebugMode()
- );
- }
-
private static function isEmptyObject( stdClass $obj ) {
foreach ( $obj as $key => $value ) {
return false;
/**
* Returns JS code which calls mw.loader.register with the given
- * parameters. Has three calling conventions:
- *
- * - ResourceLoader::makeLoaderRegisterScript( $name, $version,
- * $dependencies, $group, $source, $skip
- * ):
- * Register a single module.
+ * parameter.
*
- * - ResourceLoader::makeLoaderRegisterScript( [ $name1, $name2 ] ):
- * Register modules with the given names.
+ * @par Example
+ * @code
*
- * - ResourceLoader::makeLoaderRegisterScript( [
+ * ResourceLoader::makeLoaderRegisterScript( [
* [ $name1, $version1, $dependencies1, $group1, $source1, $skip1 ],
* [ $name2, $version2, $dependencies1, $group2, $source2, $skip2 ],
* ...
* ] ):
- * Registers modules with the given names and parameters.
+ * @endcode
*
- * @param string $name Module name
- * @param string|null $version Module version hash
- * @param array|null $dependencies List of module names on which this module depends
- * @param string|null $group Group which the module is in
- * @param string|null $source Source of the module, or 'local' if not foreign
- * @param string|null $skip Script body of the skip function
+ * @internal
+ * @since 1.32
+ * @param array $modules Array of module registration arrays, each containing
+ * - string: module name
+ * - string: module version
+ * - array|null: List of dependencies (optional)
+ * - string|null: Module group (optional)
+ * - string|null: Name of foreign module source, or 'local' (optional)
+ * - string|null: Script body of a skip function (optional)
* @return string JavaScript code
*/
- public static function makeLoaderRegisterScript( $name, $version = null,
- $dependencies = null, $group = null, $source = null, $skip = null
- ) {
- if ( is_array( $name ) ) {
+ public static function makeLoaderRegisterScript( array $modules ) {
+ // Optimisation: Transform dependency names into indexes when possible
+ // to produce smaller output. They are expanded by mw.loader.register on
+ // the other end using resolveIndexedDependencies().
+ $index = [];
+ foreach ( $modules as $i => &$module ) {
// Build module name index
- $index = [];
- foreach ( $name as $i => &$module ) {
- $index[$module[0]] = $i;
- }
-
- // Transform dependency names into indexes when possible, they will be resolved by
- // mw.loader.register on the other end
- foreach ( $name as &$module ) {
- if ( isset( $module[2] ) ) {
- foreach ( $module[2] as &$dependency ) {
- if ( isset( $index[$dependency] ) ) {
- $dependency = $index[$dependency];
- }
+ $index[$module[0]] = $i;
+ }
+ foreach ( $modules as &$module ) {
+ if ( isset( $module[2] ) ) {
+ foreach ( $module[2] as &$dependency ) {
+ if ( isset( $index[$dependency] ) ) {
+ // Replace module name in dependency list with index
+ $dependency = $index[$dependency];
}
}
}
+ }
- array_walk( $name, [ 'self', 'trimArray' ] );
+ array_walk( $modules, [ 'self', 'trimArray' ] );
- return Xml::encodeJsCall(
- 'mw.loader.register',
- [ $name ],
- self::inDebugMode()
- );
- } else {
- $registration = [ $name, $version, $dependencies, $group, $source, $skip ];
- self::trimArray( $registration );
- return Xml::encodeJsCall(
- 'mw.loader.register',
- $registration,
- self::inDebugMode()
- );
- }
+ return Xml::encodeJsCall(
+ 'mw.loader.register',
+ [ $modules ],
+ self::inDebugMode()
+ );
}
/**
public static function makeInlineCodeWithModule( $modules, $script ) {
// Adds an array to lazy-created RLQ
return '(window.RLQ=window.RLQ||[]).push(['
- . json_encode( $modules ) . ','
+ . self::encodeJsonForScript( $modules ) . ','
. 'function(){' . trim( $script ) . '}'
. ']);';
}
// Inline RLQ: Load general modules
if ( $data['general'] ) {
$chunks[] = ResourceLoader::makeInlineScript(
- Xml::encodeJsCall( 'mw.loader.load', [ $data['general'] ] ),
+ 'RLPAGEMODULES='
+ . ResourceLoader::encodeJsonForScript( $data['general'] )
+ . ';'
+ . 'mw.loader.load(RLPAGEMODULES);',
$nonce
);
}
if ( isset( $desc['lang'][$contextLang] ) ) {
return $this->basePath . '/' . $desc['lang'][$contextLang];
}
- $fallbacks = Language::getFallbacksFor( $contextLang );
+ $fallbacks = Language::getFallbacksFor( $contextLang, Language::STRICT_FALLBACKS );
foreach ( $fallbacks as $lang ) {
- // Images will fallback to 'default' instead of 'en', except for 'en-*' variants
- if (
- ( $lang !== 'en' || substr( $contextLang, 0, 3 ) === 'en-' ) &&
- isset( $desc['lang'][$lang] )
- ) {
+ if ( isset( $desc['lang'][$lang] ) ) {
return $this->basePath . '/' . $desc['lang'][$lang];
}
}
}
// Because PHP can't have floats as array keys
- uksort( $logosPerDppx, function ( $a , $b ) {
+ uksort( $logosPerDppx, function ( $a, $b ) {
$a = floatval( $a );
$b = floatval( $b );
// Sort from smallest to largest (e.g. 1x, 1.5x, 2x)
$mwLoaderCode .= file_get_contents( "$IP/resources/src/startup/profiler.js" );
}
- // Keep output as small as possible by disabling needless escapes that PHP uses by default.
- // This is not HTML output, only used in a JS response.
- $jsonFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
- if ( ResourceLoader::inDebugMode() ) {
- $jsonFlags |= JSON_PRETTY_PRINT;
- }
-
// Perform replacements for mediawiki.js
$mwLoaderPairs = [
- '$VARS.baseModules' => json_encode( $this->getBaseModules(), $jsonFlags ),
+ '$VARS.baseModules' => ResourceLoader::encodeJsonForScript( $this->getBaseModules() ),
];
$profilerStubs = [
'$CODE.profileExecuteStart();' => 'mw.loader.profiler.onExecuteStart( module );',
// Perform string replacements for startup.js
$pairs = [
- '$VARS.wgLegacyJavaScriptGlobals' => json_encode(
- $this->getConfig()->get( 'LegacyJavaScriptGlobals' ),
- $jsonFlags
+ '$VARS.wgLegacyJavaScriptGlobals' => ResourceLoader::encodeJsonForScript(
+ $this->getConfig()->get( 'LegacyJavaScriptGlobals' )
),
- '$VARS.configuration' => json_encode(
- $this->getConfigSettings( $context ),
- $jsonFlags
+ '$VARS.configuration' => ResourceLoader::encodeJsonForScript(
+ $this->getConfigSettings( $context )
),
// Raw JavaScript code (not JSON)
'$CODE.registrations();' => trim( $this->getModuleRegistrations( $context ) ),
if ( !$signupendMsg->isDisabled() ) {
$usingHTTPS = $this->getRequest()->getProtocol() === 'https';
$signupendText = ( $usingHTTPS && !$signupendHttpsMsg->isBlank() )
- ? $signupendHttpsMsg ->parse() : $signupendMsg->parse();
+ ? $signupendHttpsMsg->parse() : $signupendMsg->parse();
$fieldDefinitions['signupend'] = [
'type' => 'info',
'raw' => true,
public function getRedirect( $par ) {
$file = $par ?: $this->getRequest()->getText( 'file' );
+ $redirect = null;
if ( $file ) {
- $argument = "file/$file";
- } else {
- $argument = 'file';
+ $redirect = SpecialPage::getSafeTitleFor( 'Redirect', "file/$file" );
}
- return SpecialPage::getSafeTitleFor( 'Redirect', $argument );
+ if ( $redirect === null ) {
+ // The user input is empty or an invalid title,
+ // redirect to form of Special:Redirect with the invalid value prefilled
+ $this->mAddedRedirectParams['wpvalue'] = $file;
+ $redirect = SpecialPage::getSafeTitleFor( 'Redirect', 'file' );
+ }
+ return $redirect;
}
protected function getGroupName() {
/**
* Handle Special:Redirect/user/xxxx (by redirecting to User:YYYY)
*
- * @return string|null Url to redirect to, or null if $mValue is invalid.
+ * @return Status A good status contains the url to redirect to
*/
function dispatchUser() {
if ( !ctype_digit( $this->mValue ) ) {
- return null;
+ // Message: redirect-not-numeric
+ return Status::newFatal( $this->getMessagePrefix() . '-not-numeric' );
}
$user = User::newFromId( (int)$this->mValue );
$username = $user->getName(); // load User as side-effect
if ( $user->isAnon() ) {
- return null;
+ // Message: redirect-not-exists
+ return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
}
$userpage = Title::makeTitle( NS_USER, $username );
- return $userpage->getFullURL( '', false, PROTO_CURRENT );
+ return Status::newGood( $userpage->getFullURL( '', false, PROTO_CURRENT ) );
}
/**
* Handle Special:Redirect/file/xxxx
*
- * @return string|null Url to redirect to, or null if $mValue is not found.
+ * @return Status A good status contains the url to redirect to
*/
function dispatchFile() {
- $title = Title::makeTitleSafe( NS_FILE, $this->mValue );
-
- if ( !$title instanceof Title ) {
- return null;
+ try {
+ $title = Title::newFromTextThrow( $this->mValue, NS_FILE );
+ if ( $title && !$title->inNamespace( NS_FILE ) ) {
+ // If the given value contains a namespace enforce file namespace
+ $title = Title::newFromTextThrow( Title::makeName( NS_FILE, $this->mValue ) );
+ }
+ } catch ( MalformedTitleException $e ) {
+ return Status::newFatal( $e->getMessageObject() );
}
$file = wfFindFile( $title );
if ( !$file || !$file->exists() ) {
- return null;
+ // Message: redirect-not-exists
+ return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
}
// Default behavior: Use the direct link to the file.
$url = $file->getUrl();
}
}
- return $url;
+ return Status::newGood( $url );
}
/**
* Handle Special:Redirect/revision/xxx
* (by redirecting to index.php?oldid=xxx)
*
- * @return string|null Url to redirect to, or null if $mValue is invalid.
+ * @return Status A good status contains the url to redirect to
*/
function dispatchRevision() {
$oldid = $this->mValue;
if ( !ctype_digit( $oldid ) ) {
- return null;
+ // Message: redirect-not-numeric
+ return Status::newFatal( $this->getMessagePrefix() . '-not-numeric' );
}
$oldid = (int)$oldid;
if ( $oldid === 0 ) {
- return null;
+ // Message: redirect-not-exists
+ return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
}
- return wfAppendQuery( wfScript( 'index' ), [
+ return Status::newGood( wfAppendQuery( wfScript( 'index' ), [
'oldid' => $oldid
- ] );
+ ] ) );
}
/**
* Handle Special:Redirect/page/xxx (by redirecting to index.php?curid=xxx)
*
- * @return string|null Url to redirect to, or null if $mValue is invalid.
+ * @return Status A good status contains the url to redirect to
*/
function dispatchPage() {
$curid = $this->mValue;
if ( !ctype_digit( $curid ) ) {
- return null;
+ // Message: redirect-not-numeric
+ return Status::newFatal( $this->getMessagePrefix() . '-not-numeric' );
}
$curid = (int)$curid;
if ( $curid === 0 ) {
- return null;
+ // Message: redirect-not-exists
+ return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
}
- return wfAppendQuery( wfScript( 'index' ), [
+ return Status::newGood( wfAppendQuery( wfScript( 'index' ), [
'curid' => $curid
- ] );
+ ] ) );
}
/**
* (by redirecting to index.php?title=Special:Log&logid=xxx)
*
* @since 1.27
- * @return string|null Url to redirect to, or null if $mValue is invalid.
+ * @return Status A good status contains the url to redirect to
*/
function dispatchLog() {
$logid = $this->mValue;
if ( !ctype_digit( $logid ) ) {
- return null;
+ // Message: redirect-not-numeric
+ return Status::newFatal( $this->getMessagePrefix() . '-not-numeric' );
}
$logid = (int)$logid;
if ( $logid === 0 ) {
- return null;
+ // Message: redirect-not-exists
+ return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
}
$query = [ 'title' => 'Special:Log', 'logid' => $logid ];
- return wfAppendQuery( wfScript( 'index' ), $query );
+ return Status::newGood( wfAppendQuery( wfScript( 'index' ), $query ) );
}
/**
* or do nothing (if $mValue wasn't set) allowing the form to be
* displayed.
*
- * @return bool True if a redirect was successfully handled.
+ * @return Status|bool True if a redirect was successfully handled.
*/
function dispatch() {
// the various namespaces supported by Special:Redirect
switch ( $this->mType ) {
case 'user':
- $url = $this->dispatchUser();
+ $status = $this->dispatchUser();
break;
case 'file':
- $url = $this->dispatchFile();
+ $status = $this->dispatchFile();
break;
case 'revision':
- $url = $this->dispatchRevision();
+ $status = $this->dispatchRevision();
break;
case 'page':
- $url = $this->dispatchPage();
+ $status = $this->dispatchPage();
break;
case 'logid':
- $url = $this->dispatchLog();
+ $status = $this->dispatchLog();
break;
default:
- $url = null;
+ $status = null;
break;
}
- if ( $url ) {
- $this->getOutput()->redirect( $url );
+ if ( $status && $status->isGood() ) {
+ $this->getOutput()->redirect( $status->getValue() );
return true;
}
if ( !is_null( $this->mValue ) ) {
$this->getOutput()->setStatusCode( 404 );
- // Message: redirect-not-exists
- $msg = $this->getMessagePrefix() . '-not-exists';
- return Status::newFatal( $msg );
+ return $status;
}
return false;
'div',
[
'class' =>
- 'oo-ui-widget oo-ui-widget-enabled oo-ui-optionWidget '.
+ 'oo-ui-widget oo-ui-widget-enabled oo-ui-optionWidget ' .
'oo-ui-tabOptionWidget oo-ui-labelElement' .
( $i === 0 ? ' oo-ui-optionWidget-selected' : '' )
],
[ 'class' => 'oo-ui-layout oo-ui-panelLayout oo-ui-indexLayout-tabPanel' ],
Html::rawElement(
'div',
- [ 'class' => 'oo-ui-widget oo-ui-widget-enabled oo-ui-selectWidget '.
+ [ 'class' => 'oo-ui-widget oo-ui-widget-enabled oo-ui-selectWidget ' .
'oo-ui-selectWidget-depressed oo-ui-tabSelectWidget' ],
implode( $fakeTabs )
)
// Should these be merged into the title char list?
$unicodeBlacklist = '/[' .
'\x{0080}-\x{009f}' . # iso-8859-1 control chars
- '\x{00a0}' . # non-breaking space
+ '\x{00a0}' . # non-breaking space
'\x{2000}-\x{200f}' . # various whitespace
'\x{2028}-\x{202f}' . # breaks and control chars
- '\x{3000}' . # ideographic space
+ '\x{3000}' . # ideographic space
'\x{e000}-\x{f8ff}' . # private use
']/u';
if ( preg_match( $unicodeBlacklist, $name ) ) {
array $targetsWithVisitThresholds,
$minimumWatchers = null
) {
+ if ( $targetsWithVisitThresholds === [] ) {
+ // No titles requested => no results returned
+ return [];
+ }
+
$dbr = $this->getConnectionRef( DB_REPLICA );
$conds = $this->getVisitingWatchersCondition( $dbr, $targetsWithVisitThresholds );
static public $mLangObjCache = [];
+ /**
+ * Return a fallback chain for messages in getFallbacksFor
+ * @since 1.32
+ */
+ const MESSAGES_FALLBACKS = 0;
+
+ /**
+ * Return a strict fallback chain in getFallbacksFor
+ * @since 1.32
+ */
+ const STRICT_FALLBACKS = 1;
+
static public $mWeekdayMsgs = [
'sunday', 'monday', 'tuesday', 'wednesday', 'thursday',
'friday', 'saturday'
*
* @since 1.19
* @param string $code Language code
- * @return array Non-empty array, ending in "en"
+ * @param int $mode Fallback mode, either MESSAGES_FALLBACKS (which always falls back to 'en'),
+ * or STRICT_FALLBACKS (whic honly falls back to 'en' when explicitly defined)
+ * @throws MWException
+ * @return array List of language codes
*/
- public static function getFallbacksFor( $code ) {
+ public static function getFallbacksFor( $code, $mode = self::MESSAGES_FALLBACKS ) {
if ( $code === 'en' || !self::isValidBuiltInCode( $code ) ) {
return [];
}
- // For unknown languages, fallbackSequence returns an empty array,
- // hardcode fallback to 'en' in that case.
- return self::getLocalisationCache()->getItem( $code, 'fallbackSequence' ) ?: [ 'en' ];
+ switch ( $mode ) {
+ case self::MESSAGES_FALLBACKS:
+ // For unknown languages, fallbackSequence returns an empty array,
+ // hardcode fallback to 'en' in that case as English messages are
+ // always defined.
+ return self::getLocalisationCache()->getItem( $code, 'fallbackSequence' ) ?: [ 'en' ];
+ case self::STRICT_FALLBACKS:
+ // Use this mode when you don't want to fallback to English unless
+ // explicitly defined, for example when you have language-variant icons
+ // and an international language-independent fallback.
+ return self::getLocalisationCache()->getItem( $code, 'originalFallbackSequence' );
+ default:
+ throw new MWException( "Invalid fallback mode \"$mode\"" );
+ }
}
/**
$text = preg_replace( $pat, $rep, $text );
}
return $text;
- break;
case 'kk-latn':
case 'kk-tr':
foreach ( $this->mCyrl2Latn as $pat => $rep ) {
$text = preg_replace( $pat, $rep, $text );
}
return $text;
- break;
case 'kk-cyrl':
case 'kk-kz':
foreach ( $this->mLatn2Cyrl as $pat => $rep ) {
$text = preg_replace( $pat, $rep, $text );
}
return $text;
- break;
default:
return $text;
}
# load C2L and L2C bidirectional affix mappings
$this->addMappings( $this->prefixMapping,
- $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/'.self::WB, '/u' );
+ $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/' . self::WB, '/u' );
$this->addMappings( $this->suffixMapping,
- $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/', self::WB.'/u' );
+ $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/', self::WB . '/u' );
# tack on one-way mappings to the ends of the prefix and suffix patterns
$this->Cyrl2LatnPatterns += $this->Cyrl2LatnRegexes;
'му([иэИЭ])' => 'mü$1',
# originally L2C, here swapped
- 'роль$1' => 'rol([^ü]|'.self::WB.')',
- 'усть$1' => 'üst([^ü]|'.self::WB.')',
+ 'роль$1' => 'rol([^ü]|' . self::WB . ')',
+ 'усть$1' => 'üst([^ü]|' . self::WB . ')',
# more prefixes
'ком-кок' => 'köm-kök',
// TODO: refactor upper/lower/first capital whole words without
// regexes into simpler list
- '/'.self::WB.'КъЮШ'.self::WB.'/u' => 'QYŞ',
- '/'.self::WB.'ЮШ'.self::WB.'/u' => 'YŞ',
-
- '/'.self::WB.'кок'.self::WB.'/u' => 'kök',
- '/'.self::WB.'Кок'.self::WB.'/u' => 'Kök',
- '/'.self::WB.'КОК'.self::WB.'/u' => 'KÖK',
- '/'.self::WB.'ком-кок'.self::WB.'/u' => 'köm-kök',
- '/'.self::WB.'Ком-кок'.self::WB.'/u' => 'Köm-kök',
- '/'.self::WB.'КОМ-КОК'.self::WB.'/u' => 'KÖM-KÖK',
-
- '/'.self::WB.'коп'.self::WB.'/u' => 'köp',
- '/'.self::WB.'Коп'.self::WB.'/u' => 'Köp',
- '/'.self::WB.'КОП'.self::WB.'/u' => 'KÖP',
-
- '/'.self::WB.'курк'.self::WB.'/u' => 'kürk',
- '/'.self::WB.'Курк'.self::WB.'/u' => 'Kürk',
- '/'.self::WB.'КУРК'.self::WB.'/u' => 'KÜRK',
-
- '/'.self::WB.'ог'.self::WB.'/u' => 'ög',
- '/'.self::WB.'Ог'.self::WB.'/u' => 'Ög',
- '/'.self::WB.'ОГ'.self::WB.'/u' => 'ÖG',
-
- '/'.self::WB.'юрип'.self::WB.'/u' => 'yürip',
- '/'.self::WB.'Юрип'.self::WB.'/u' => 'Yürip',
- '/'.self::WB.'ЮРИП'.self::WB.'/u' => 'YÜRİP',
-
- '/'.self::WB.'юз'.self::WB.'/u' => 'yüz',
- '/'.self::WB.'Юз'.self::WB.'/u' => 'Yüz',
- '/'.self::WB.'ЮЗ'.self::WB.'/u' => 'YÜZ',
-
- '/'.self::WB.'юк'.self::WB.'/u' => 'yük',
- '/'.self::WB.'Юк'.self::WB.'/u' => 'Yük',
- '/'.self::WB.'ЮК'.self::WB.'/u' => 'YÜK',
-
- '/'.self::WB.'буюп'.self::WB.'/u' => 'büyüp',
- '/'.self::WB.'Буюп'.self::WB.'/u' => 'Büyüp',
- '/'.self::WB.'БУЮП'.self::WB.'/u' => 'BÜYÜP',
-
- '/'.self::WB.'буюк'.self::WB.'/u' => 'büyük',
- '/'.self::WB.'Буюк'.self::WB.'/u' => 'Büyük',
- '/'.self::WB.'БУЮК'.self::WB.'/u' => 'BÜYÜK',
-
- '/'.self::WB.'джонк'.self::WB.'/u' => 'cönk',
- '/'.self::WB.'Джонк'.self::WB.'/u' => 'Cönk',
- '/'.self::WB.'ДЖОНК'.self::WB.'/u' => 'CÖNK',
- '/'.self::WB.'джонкю'.self::WB.'/u' => 'cönkü',
- '/'.self::WB.'Джонкю'.self::WB.'/u' => 'Cönkü',
- '/'.self::WB.'ДЖОНКЮ'.self::WB.'/u' => 'CÖNKÜ',
-
- '/'.self::WB.'куркчи/u' => 'kürkçi',
- '/'.self::WB.'Куркчи/u' => 'Kürkçi',
- '/'.self::WB.'КУРКЧИ/u' => 'KÜRKÇI',
-
- '/'.self::WB.'устке'.self::WB.'/u' => 'üstke',
- '/'.self::WB.'Устке'.self::WB.'/u' => 'Üstke',
- '/'.self::WB.'УСТКЕ'.self::WB.'/u' => 'ÜSTKE',
- '/'.self::WB.'устте'.self::WB.'/u' => 'üstte',
- '/'.self::WB.'Устте'.self::WB.'/u' => 'Üstte',
- '/'.self::WB.'УСТТЕ'.self::WB.'/u' => 'ÜSTTE',
- '/'.self::WB.'усттен'.self::WB.'/u' => 'üstten',
- '/'.self::WB.'Усттен'.self::WB.'/u' => 'Üstten',
- '/'.self::WB.'УСТТЕН'.self::WB.'/u' => 'ÜSTTEN',
+ '/' . self::WB . 'КъЮШ' . self::WB . '/u' => 'QYŞ',
+ '/' . self::WB . 'ЮШ' . self::WB . '/u' => 'YŞ',
+
+ '/' . self::WB . 'кок' . self::WB . '/u' => 'kök',
+ '/' . self::WB . 'Кок' . self::WB . '/u' => 'Kök',
+ '/' . self::WB . 'КОК' . self::WB . '/u' => 'KÖK',
+ '/' . self::WB . 'ком-кок' . self::WB . '/u' => 'köm-kök',
+ '/' . self::WB . 'Ком-кок' . self::WB . '/u' => 'Köm-kök',
+ '/' . self::WB . 'КОМ-КОК' . self::WB . '/u' => 'KÖM-KÖK',
+
+ '/' . self::WB . 'коп' . self::WB . '/u' => 'köp',
+ '/' . self::WB . 'Коп' . self::WB . '/u' => 'Köp',
+ '/' . self::WB . 'КОП' . self::WB . '/u' => 'KÖP',
+
+ '/' . self::WB . 'курк' . self::WB . '/u' => 'kürk',
+ '/' . self::WB . 'Курк' . self::WB . '/u' => 'Kürk',
+ '/' . self::WB . 'КУРК' . self::WB . '/u' => 'KÜRK',
+
+ '/' . self::WB . 'ог' . self::WB . '/u' => 'ög',
+ '/' . self::WB . 'Ог' . self::WB . '/u' => 'Ög',
+ '/' . self::WB . 'ОГ' . self::WB . '/u' => 'ÖG',
+
+ '/' . self::WB . 'юрип' . self::WB . '/u' => 'yürip',
+ '/' . self::WB . 'Юрип' . self::WB . '/u' => 'Yürip',
+ '/' . self::WB . 'ЮРИП' . self::WB . '/u' => 'YÜRİP',
+
+ '/' . self::WB . 'юз' . self::WB . '/u' => 'yüz',
+ '/' . self::WB . 'Юз' . self::WB . '/u' => 'Yüz',
+ '/' . self::WB . 'ЮЗ' . self::WB . '/u' => 'YÜZ',
+
+ '/' . self::WB . 'юк' . self::WB . '/u' => 'yük',
+ '/' . self::WB . 'Юк' . self::WB . '/u' => 'Yük',
+ '/' . self::WB . 'ЮК' . self::WB . '/u' => 'YÜK',
+
+ '/' . self::WB . 'буюп' . self::WB . '/u' => 'büyüp',
+ '/' . self::WB . 'Буюп' . self::WB . '/u' => 'Büyüp',
+ '/' . self::WB . 'БУЮП' . self::WB . '/u' => 'BÜYÜP',
+
+ '/' . self::WB . 'буюк' . self::WB . '/u' => 'büyük',
+ '/' . self::WB . 'Буюк' . self::WB . '/u' => 'Büyük',
+ '/' . self::WB . 'БУЮК' . self::WB . '/u' => 'BÜYÜK',
+
+ '/' . self::WB . 'джонк' . self::WB . '/u' => 'cönk',
+ '/' . self::WB . 'Джонк' . self::WB . '/u' => 'Cönk',
+ '/' . self::WB . 'ДЖОНК' . self::WB . '/u' => 'CÖNK',
+ '/' . self::WB . 'джонкю' . self::WB . '/u' => 'cönkü',
+ '/' . self::WB . 'Джонкю' . self::WB . '/u' => 'Cönkü',
+ '/' . self::WB . 'ДЖОНКЮ' . self::WB . '/u' => 'CÖNKÜ',
+
+ '/' . self::WB . 'куркчи/u' => 'kürkçi',
+ '/' . self::WB . 'Куркчи/u' => 'Kürkçi',
+ '/' . self::WB . 'КУРКЧИ/u' => 'KÜRKÇI',
+
+ '/' . self::WB . 'устке' . self::WB . '/u' => 'üstke',
+ '/' . self::WB . 'Устке' . self::WB . '/u' => 'Üstke',
+ '/' . self::WB . 'УСТКЕ' . self::WB . '/u' => 'ÜSTKE',
+ '/' . self::WB . 'устте' . self::WB . '/u' => 'üstte',
+ '/' . self::WB . 'Устте' . self::WB . '/u' => 'Üstte',
+ '/' . self::WB . 'УСТТЕ' . self::WB . '/u' => 'ÜSTTE',
+ '/' . self::WB . 'усттен' . self::WB . '/u' => 'üstten',
+ '/' . self::WB . 'Усттен' . self::WB . '/u' => 'Üstten',
+ '/' . self::WB . 'УСТТЕН' . self::WB . '/u' => 'ÜSTTEN',
# отдельно стоящие Ё и Я
# stand-alone Ё and Я
- '/'.self::WB.'Я'.self::WB.'/u' => 'Ya',
- '/'.self::WB.'Ё'.self::WB.'/u' => 'Yo',
+ '/' . self::WB . 'Я' . self::WB . '/u' => 'Ya',
+ '/' . self::WB . 'Ё' . self::WB . '/u' => 'Yo',
############################
# относятся к началу слова #
# word prefixes #
############################
- '/'.self::WB.'КъЮШн/u' => 'QYŞn',
- '/'.self::WB.'ЮШн/u' => 'YŞn',
+ '/' . self::WB . 'КъЮШн/u' => 'QYŞn',
+ '/' . self::WB . 'ЮШн/u' => 'YŞn',
# need to convert digraphs (гъ, къ, нъ, дж) now to match patterns
'/гъ/u' => 'ğ',
'/Д[жЖ]/u' => 'C',
# о => ö
- '/'.self::WB.'(['.Crh::C_M_CONS.'])о(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u'
- => '$1ö$2$3$4',
- '/'.self::WB.'о(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ö$1$2$3',
- '/'.self::WB.'(['.Crh::C_M_CONS.'])О(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u'
- => '$1Ö$2$3$4',
- '/'.self::WB.'О(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2$3',
-
- '/'.self::WB.'(['.Crh::C_M_CONS.'])о(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ö$2$3',
- '/'.self::WB.'о(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ö$1$2',
- '/'.self::WB.'(['.Crh::C_M_CONS.'])О(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ö$2$3',
- '/'.self::WB.'О(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2',
+ '/' . self::WB . '([' . Crh::C_M_CONS . '])о([' . Crh::C_CONS . '])([' . Crh::C_CONS .
+ '])([еиэюьü])/u' => '$1ö$2$3$4',
+ '/' . self::WB . 'о([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ö$1$2$3',
+ '/' . self::WB . '([' . Crh::C_M_CONS . '])О([' . Crh::C_CONS . '])([' . Crh::C_CONS .
+ '])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ö$2$3$4',
+ '/' . self::WB . 'О([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u'
+ => 'Ö$1$2$3',
+
+ '/' . self::WB . '([' . Crh::C_M_CONS . '])о([' . Crh::C_CONS . '])([еиэюьü])/u' => '$1ö$2$3',
+ '/' . self::WB . 'о([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ö$1$2',
+ '/' . self::WB . '([' . Crh::C_M_CONS . '])О([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u'
+ => '$1Ö$2$3',
+ '/' . self::WB . 'О([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2',
# ё => yö
- '/'.self::WB.'ё(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([ьеюü])/u' => 'yö$1$2$3',
- '/'.self::WB.'Ё(['.Crh::C_CONS_LC.'])(['.Crh::C_CONS_LC.'])([ьеюü])/u' => 'Yö$1$2$3',
- '/'.self::WB.'Ё(['.Crh::C_CONS_UC.'])(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => 'YÖ$1$2$3',
- '/'.self::WB.'ё(['.Crh::C_CONS.'])([ьеюü])/u' => 'yö$1$2',
- '/'.self::WB.'Ё(['.Crh::C_CONS_LC.'])([ьеюü])/u' => 'Yö$1$2',
- '/'.self::WB.'Ё(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => 'YÖ$1$2',
+ '/' . self::WB . 'ё([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([ьеюü])/u' => 'yö$1$2$3',
+ '/' . self::WB . 'Ё([' . Crh::C_CONS_LC . '])([' . Crh::C_CONS_LC . '])([ьеюü])/u' => 'Yö$1$2$3',
+ '/' . self::WB . 'Ё([' . Crh::C_CONS_UC . '])([' . Crh::C_CONS_UC . '])([ЬЕЮÜ])/u' => 'YÖ$1$2$3',
+ '/' . self::WB . 'ё([' . Crh::C_CONS . '])([ьеюü])/u' => 'yö$1$2',
+ '/' . self::WB . 'Ё([' . Crh::C_CONS_LC . '])([ьеюü])/u' => 'Yö$1$2',
+ '/' . self::WB . 'Ё([' . Crh::C_CONS_UC . '])([ЬЕЮÜ])/u' => 'YÖ$1$2',
# у => ü, ую => üyü
- '/'.self::WB.'(['.Crh::C_M_CONS.'])у(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u'
- => '$1ü$2$3$4',
- '/'.self::WB.'у(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ü$1$2$3',
- '/'.self::WB.'ую(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'üyü$1$2$3',
- '/'.self::WB.'(['.Crh::C_M_CONS.'])У(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u'
- => '$1Ü$2$3$4',
- '/'.self::WB.'У(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2$3',
- '/'.self::WB.'Ую(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'Üyü$1$2$3',
- '/'.self::WB.'УЮ(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ÜYÜ$1$2$3',
-
- '/'.self::WB.'(['.Crh::C_M_CONS.'])у(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ü$2$3',
- '/'.self::WB.'у(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ü$1$2',
- '/'.self::WB.'ую(['.Crh::C_CONS.'])([еиэюьü])/u' => 'üyü$1$2',
- '/'.self::WB.'(['.Crh::C_M_CONS.'])У(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ü$2$3',
- '/'.self::WB.'У(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2',
- '/'.self::WB.'Ую(['.Crh::C_CONS.'])([еиэюьü])/u' => 'Üyü$1$2',
- '/'.self::WB.'УЮ(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ÜYÜ$1$2',
+ '/' . self::WB . '([' . Crh::C_M_CONS . '])у([' . Crh::C_CONS . '])([' . Crh::C_CONS .
+ '])([еиэюьü])/u' => '$1ü$2$3$4',
+ '/' . self::WB . 'у([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ü$1$2$3',
+ '/' . self::WB . 'ую([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'üyü$1$2$3',
+ '/' . self::WB . '([' . Crh::C_M_CONS . '])У([' . Crh::C_CONS . '])([' . Crh::C_CONS .
+ '])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ü$2$3$4',
+ '/' . self::WB . 'У([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u'
+ => 'Ü$1$2$3',
+ '/' . self::WB . 'Ую([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'Üyü$1$2$3',
+ '/' . self::WB . 'УЮ([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ÜYÜ$1$2$3',
+
+ '/' . self::WB . '([' . Crh::C_M_CONS . '])у([' . Crh::C_CONS . '])([еиэюьü])/u' => '$1ü$2$3',
+ '/' . self::WB . 'у([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ü$1$2',
+ '/' . self::WB . 'ую([' . Crh::C_CONS . '])([еиэюьü])/u' => 'üyü$1$2',
+ '/' . self::WB . '([' . Crh::C_M_CONS . '])У([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u'
+ => '$1Ü$2$3',
+ '/' . self::WB . 'У([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2',
+ '/' . self::WB . 'Ую([' . Crh::C_CONS . '])([еиэюьü])/u' => 'Üyü$1$2',
+ '/' . self::WB . 'УЮ([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ÜYÜ$1$2',
# ю => yü
- '/'.self::WB.'([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([ьеюü])/u'
+ '/' . self::WB . '([аыоуеиёюАЫОУЕИЁЮ]?)ю([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([ьеюü])/u'
=> '$1yü$2$3$4',
- '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_LC.'])(['.Crh::C_CONS_LC.'])([ьеюü])/u'
+ '/' . self::WB . '([АЫОУЕИЁЮ]?)Ю([' . Crh::C_CONS_LC . '])([' . Crh::C_CONS_LC . '])([ьеюü])/u'
=> '$1Yü$2$3$4',
- '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_UC.'])(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u'
+ '/' . self::WB . '([АЫОУЕИЁЮ]?)Ю([' . Crh::C_CONS_UC . '])([' . Crh::C_CONS_UC . '])([ЬЕЮÜ])/u'
=> '$1YÜ$2$3$4',
- '/'.self::WB.'([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.Crh::C_CONS.'])([ьеюü])/u' => '$1yü$2$3',
- '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_LC.'])([ьеюü])/u' => '$1Yü$2$3',
- '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => '$1YÜ$2$3',
+ '/' . self::WB . '([аыоуеиёюАЫОУЕИЁЮ]?)ю([' . Crh::C_CONS . '])([ьеюü])/u' => '$1yü$2$3',
+ '/' . self::WB . '([АЫОУЕИЁЮ]?)Ю([' . Crh::C_CONS_LC . '])([ьеюü])/u' => '$1Yü$2$3',
+ '/' . self::WB . '([АЫОУЕИЁЮ]?)Ю([' . Crh::C_CONS_UC . '])([ЬЕЮÜ])/u' => '$1YÜ$2$3',
# e => ye, я => ya
- '/'.self::WB.'е/u' => 'ye',
- '/'.self::WB.'Е(['.Crh::C_LC.'cğñqöü])/u' => 'Ye$1',
- '/'.self::WB.'Е(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YE$1',
- '/'.self::WB.'я/u' => 'ya',
- '/'.self::WB.'Я(['.Crh::C_LC.'cğñqöü])/u' => 'Ya$1',
- '/'.self::WB.'Я(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YA$1',
+ '/' . self::WB . 'е/u' => 'ye',
+ '/' . self::WB . 'Е([' . Crh::C_LC . 'cğñqöü])/u' => 'Ye$1',
+ '/' . self::WB . 'Е([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'YE$1',
+ '/' . self::WB . 'я/u' => 'ya',
+ '/' . self::WB . 'Я([' . Crh::C_LC . 'cğñqöü])/u' => 'Ya$1',
+ '/' . self::WB . 'Я([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'YA$1',
'/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])е/u' => '$1ye',
- '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.Crh::C_LC.'cğñqöü])/u' => '$1Ye$2',
- '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.Crh::C_UC.'CĞÑQÖÜ])/u' => '$1YE$2',
+ '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е([' . Crh::C_LC . 'cğñqöü])/u' => '$1Ye$2',
+ '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => '$1YE$2',
'/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])я/u' => '$1ya',
- '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я(['.Crh::C_LC.'cğñqöü])/u' => '$1Ya$2',
- '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я(['.Crh::C_UC.'CĞÑQÖÜ])/u' => '$1YA$2',
+ '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я([' . Crh::C_LC . 'cğñqöü])/u' => '$1Ya$2',
+ '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => '$1YA$2',
###############################
# не зависят от места в слове #
# Ö, Ü 1-й заход: ё, ю после согласных > ö, ü
# Ö, Ü 1st instance: ё, ю after consonants > ö, ü
- '/(['.Crh::C_CONS.'])ю/u' => '$1ü',
- '/(['.Crh::C_CONS.'])Ю/u' => '$1Ü',
- '/(['.Crh::C_CONS.'])ё/u' => '$1ö',
- '/(['.Crh::C_CONS.'])Ё/u' => '$1Ö',
+ '/([' . Crh::C_CONS . '])ю/u' => '$1ü',
+ '/([' . Crh::C_CONS . '])Ю/u' => '$1Ü',
+ '/([' . Crh::C_CONS . '])ё/u' => '$1ö',
+ '/([' . Crh::C_CONS . '])Ё/u' => '$1Ö',
# остальные вхождения о, у, ё, ю
# other occurences of о, у, ё, ю
- '/Ё(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YO$1',
- '/Ю(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YU$1',
+ '/Ё([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'YO$1',
+ '/Ю([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'YU$1',
# Ц & Щ
- '/Ц(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'TS$1',
- '/Щ(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'ŞÇ$1',
+ '/Ц([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'TS$1',
+ '/Щ([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'ŞÇ$1',
];
$this->Latn2CyrlRegexes = [
// TODO: refactor upper/lower/first capital whole words without
// regexes into simpler list
- '/'.self::WB.'an'.self::WB.'/u' => 'ань',
- '/'.self::WB.'An'.self::WB.'/u' => 'Ань',
- '/'.self::WB.'AN'.self::WB.'/u' => 'АНЬ',
- '/'.self::WB.'ange'.self::WB.'/u' => 'аньге',
- '/'.self::WB.'Ange'.self::WB.'/u' => 'Аньге',
- '/'.self::WB.'ANGE'.self::WB.'/u' => 'АНЬГЕ',
- '/'.self::WB.'ande'.self::WB.'/u' => 'аньде',
- '/'.self::WB.'Ande'.self::WB.'/u' => 'Аньде',
- '/'.self::WB.'ANDE'.self::WB.'/u' => 'АНЬДЕ',
- '/'.self::WB.'anki'.self::WB.'/u' => 'аньки',
- '/'.self::WB.'Anki'.self::WB.'/u' => 'Аньки',
- '/'.self::WB.'ANKİ'.self::WB.'/u' => 'АНЬКИ',
- '/'.self::WB.'deral'.self::WB.'/u' => 'деръал',
- '/'.self::WB.'Deral'.self::WB.'/u' => 'Деръал',
- '/'.self::WB.'DERAL'.self::WB.'/u' => 'ДЕРЪАЛ',
- '/'.self::WB.'kör'.self::WB.'/u' => 'кёр',
- '/'.self::WB.'Kör'.self::WB.'/u' => 'Кёр',
- '/'.self::WB.'KÖR'.self::WB.'/u' => 'КЁР',
- '/'.self::WB.'mer'.self::WB.'/u' => 'мэр',
- '/'.self::WB.'Mer'.self::WB.'/u' => 'Мэр',
- '/'.self::WB.'MER'.self::WB.'/u' => 'МЭР',
-
- '/'.self::WB.'cönk/u' => 'джонк',
- '/'.self::WB.'Cönk/u' => 'Джонк',
- '/'.self::WB.'CÖNK/u' => 'ДЖОНК',
+ '/' . self::WB . 'an' . self::WB . '/u' => 'ань',
+ '/' . self::WB . 'An' . self::WB . '/u' => 'Ань',
+ '/' . self::WB . 'AN' . self::WB . '/u' => 'АНЬ',
+ '/' . self::WB . 'ange' . self::WB . '/u' => 'аньге',
+ '/' . self::WB . 'Ange' . self::WB . '/u' => 'Аньге',
+ '/' . self::WB . 'ANGE' . self::WB . '/u' => 'АНЬГЕ',
+ '/' . self::WB . 'ande' . self::WB . '/u' => 'аньде',
+ '/' . self::WB . 'Ande' . self::WB . '/u' => 'Аньде',
+ '/' . self::WB . 'ANDE' . self::WB . '/u' => 'АНЬДЕ',
+ '/' . self::WB . 'anki' . self::WB . '/u' => 'аньки',
+ '/' . self::WB . 'Anki' . self::WB . '/u' => 'Аньки',
+ '/' . self::WB . 'ANKİ' . self::WB . '/u' => 'АНЬКИ',
+ '/' . self::WB . 'deral' . self::WB . '/u' => 'деръал',
+ '/' . self::WB . 'Deral' . self::WB . '/u' => 'Деръал',
+ '/' . self::WB . 'DERAL' . self::WB . '/u' => 'ДЕРЪАЛ',
+ '/' . self::WB . 'kör' . self::WB . '/u' => 'кёр',
+ '/' . self::WB . 'Kör' . self::WB . '/u' => 'Кёр',
+ '/' . self::WB . 'KÖR' . self::WB . '/u' => 'КЁР',
+ '/' . self::WB . 'mer' . self::WB . '/u' => 'мэр',
+ '/' . self::WB . 'Mer' . self::WB . '/u' => 'Мэр',
+ '/' . self::WB . 'MER' . self::WB . '/u' => 'МЭР',
+
+ '/' . self::WB . 'cönk/u' => 'джонк',
+ '/' . self::WB . 'Cönk/u' => 'Джонк',
+ '/' . self::WB . 'CÖNK/u' => 'ДЖОНК',
# (y)etsin -> етсин/этсин
# note that target starts with CYRILLIC е/Е!
# буква Ё - первый заход
# расставляем Ь после согласных
- '/'.self::WB.'([yY])ö(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1ö$2ь$3',
- '/'.self::WB.'([yY])Ö(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1Ö$2Ь$3',
- '/'.self::WB.'AQŞ([^AEI]|'.self::WB.')/u' => 'АКъШ$1',
+ '/' . self::WB . '([yY])ö([' . Crh::L_N_CONS . '])([aAuU' . Crh::L_CONS . ']|' . self::WB . ')/u'
+ => '$1ö$2ь$3',
+ '/' . self::WB . '([yY])Ö([' . Crh::L_N_CONS . '])([aAuU' . Crh::L_CONS . ']|' . self::WB . ')/u'
+ => '$1Ö$2Ь$3',
+ '/' . self::WB . 'AQŞ([^AEI]|' . self::WB . ')/u' => 'АКъШ$1',
# буква Ю - первый заход
# расставляем Ь после согласных
- '/'.self::WB.'([yY])ü(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1ü$2ь$3',
- '/'.self::WB.'([yY])Ü(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1Ü$2Ь$3',
-
- '/'.self::WB.'([bcgkpşBCGKPŞ])ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
- => '$1ö$2ь$3',
- '/'.self::WB.'([bcgkpşBCGKPŞ])Ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
- => '$1Ö$2Ь$3',
- '/'.self::WB.'([bcgkpşBCGKPŞ])Ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
- => '$1Ö$2Ь$3',
- '/'.self::WB.'([bcgkpşBCGKPŞ])ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+ '/' . self::WB . '([yY])ü([' . Crh::L_N_CONS . '])([aAuU' . Crh::L_CONS . ']|' . self::WB . ')/u'
=> '$1ü$2ь$3',
- '/'.self::WB.'([bcgkpşBCGKPŞ])Ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
- => '$1Ü$2Ь$3',
- '/'.self::WB.'([bcgkpşBCGKPŞ])Ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+ '/' . self::WB . '([yY])Ü([' . Crh::L_N_CONS . '])([aAuU' . Crh::L_CONS . ']|' . self::WB . ')/u'
=> '$1Ü$2Ь$3',
+ '/' . self::WB . '([bcgkpşBCGKPŞ])ö([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+ self::WB . ')/u' => '$1ö$2ь$3',
+ '/' . self::WB . '([bcgkpşBCGKPŞ])Ö([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+ self::WB . ')/u' => '$1Ö$2Ь$3',
+ '/' . self::WB . '([bcgkpşBCGKPŞ])Ö([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+ self::WB . ')/u' => '$1Ö$2Ь$3',
+ '/' . self::WB . '([bcgkpşBCGKPŞ])ü([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+ self::WB . ')/u' => '$1ü$2ь$3',
+ '/' . self::WB . '([bcgkpşBCGKPŞ])Ü([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+ self::WB . ')/u' => '$1Ü$2Ь$3',
+ '/' . self::WB . '([bcgkpşBCGKPŞ])Ü([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+ self::WB . ')/u' => '$1Ü$2Ь$3',
+
# ö и ü в начале слова
# случаи, когда нужен Ь
- '/'.self::WB.'ö(['.Crh::L_N_CONS.'pP])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'ö$1ь$2',
- '/'.self::WB.'Ö(['.Crh::L_N_CONS_LC.'p])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ö$1ь$2',
- '/'.self::WB.'Ö(['.Crh::L_N_CONS_UC.'P])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ö$1Ь$2',
- '/'.self::WB.'ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'ü$1ь$2',
- '/'.self::WB.'Ü(['.Crh::L_N_CONS_LC.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ü$1ь$2',
- '/'.self::WB.'Ü(['.Crh::L_N_CONS_UC.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ü$1Ь$2',
-
- '/ts'.self::WB.'/u' => 'ц',
- '/şç'.self::WB.'/u' => 'щ',
- '/Ş[çÇ]'.self::WB.'/u' => 'Щ',
- '/T[sS]'.self::WB.'/u' => 'Ц',
+ '/' . self::WB . 'ö([' . Crh::L_N_CONS . 'pP])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+ => 'ö$1ь$2',
+ '/' . self::WB . 'Ö([' . Crh::L_N_CONS_LC . 'p])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+ => 'Ö$1ь$2',
+ '/' . self::WB . 'Ö([' . Crh::L_N_CONS_UC . 'P])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+ => 'Ö$1Ь$2',
+ '/' . self::WB . 'ü([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+ => 'ü$1ь$2',
+ '/' . self::WB . 'Ü([' . Crh::L_N_CONS_LC . '])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+ => 'Ü$1ь$2',
+ '/' . self::WB . 'Ü([' . Crh::L_N_CONS_UC . '])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+ => 'Ü$1Ь$2',
+
+ '/ts' . self::WB . '/u' => 'ц',
+ '/şç' . self::WB . '/u' => 'щ',
+ '/Ş[çÇ]' . self::WB . '/u' => 'Щ',
+ '/T[sS]' . self::WB . '/u' => 'Ц',
# Ь после Л
# add Ь after Л
- '/(['.Crh::L_F.'])l(['.Crh::L_CONS_LC.']|'.self::WB.')/u' => '$1ль$2',
- '/(['.Crh::L_F_UC.'])L(['.Crh::L_CONS.']|'.self::WB.')/u' => '$1ЛЬ$2',
+ '/([' . Crh::L_F . '])l([' . Crh::L_CONS_LC . ']|' . self::WB . ')/u' => '$1ль$2',
+ '/([' . Crh::L_F_UC . '])L([' . Crh::L_CONS . ']|' . self::WB . ')/u' => '$1ЛЬ$2',
# относятся к началу слова
- '/'.self::WB.'ts/u' => 'ц',
- '/'.self::WB.'T[sS]/u' => 'Ц',
+ '/' . self::WB . 'ts/u' => 'ц',
+ '/' . self::WB . 'T[sS]/u' => 'Ц',
- '/'.self::WB.'şç/u' => 'щ',
- '/'.self::WB.'Ş[çÇ]/u' => 'Щ',
+ '/' . self::WB . 'şç/u' => 'щ',
+ '/' . self::WB . 'Ş[çÇ]/u' => 'Щ',
# Э
- '/('.self::WB.'|['.Crh::L_VOW.'аеэяАЕЭЯ])e/u' => '$1э',
- '/('.self::WB.'|['.Crh::L_VOW_UC.'АЕЭЯ])E/u' => '$1Э',
+ '/(' . self::WB . '|[' . Crh::L_VOW . 'аеэяАЕЭЯ])e/u' => '$1э',
+ '/(' . self::WB . '|[' . Crh::L_VOW_UC . 'АЕЭЯ])E/u' => '$1Э',
- '/'.self::WB.'(['.Crh::L_M_CONS.'])ö/u' => '$1о',
- '/'.self::WB.'(['.Crh::L_M_CONS.'])Ö/u' => '$1О',
- '/'.self::WB.'(['.Crh::L_M_CONS.'])ü/u' => '$1у',
- '/'.self::WB.'(['.Crh::L_M_CONS.'])Ü/u' => '$1У',
+ '/' . self::WB . '([' . Crh::L_M_CONS . '])ö/u' => '$1о',
+ '/' . self::WB . '([' . Crh::L_M_CONS . '])Ö/u' => '$1О',
+ '/' . self::WB . '([' . Crh::L_M_CONS . '])ü/u' => '$1у',
+ '/' . self::WB . '([' . Crh::L_M_CONS . '])Ü/u' => '$1У',
- '/'.self::WB.'ö/u' => 'о',
- '/'.self::WB.'Ö/u' => 'О',
- '/'.self::WB.'ü/u' => 'у',
- '/'.self::WB.'Ü/u' => 'У',
+ '/' . self::WB . 'ö/u' => 'о',
+ '/' . self::WB . 'Ö/u' => 'О',
+ '/' . self::WB . 'ü/u' => 'у',
+ '/' . self::WB . 'Ü/u' => 'У',
# некоторые исключения
# some exceptions
'/T[sS][iİ]([^zZñÑ])/u' => 'ЦИ$1',
'/ts([ou])/u' => 'ц$1',
'/T[sS]([oOuU])/u' => 'Ц$1',
- '/ts(['.Crh::L_CONS.'])/u' => 'ц$1',
- '/T[sS](['.Crh::L_CONS.'])/u' => 'Ц$1',
- '/(['.Crh::L_CONS.'])ts/u' => '$1ц',
- '/(['.Crh::L_CONS.'])T[sS]/u' => '$1Ц',
+ '/ts([' . Crh::L_CONS . '])/u' => 'ц$1',
+ '/T[sS]([' . Crh::L_CONS . '])/u' => 'Ц$1',
+ '/([' . Crh::L_CONS . '])ts/u' => '$1ц',
+ '/([' . Crh::L_CONS . '])T[sS]/u' => '$1Ц',
'/tsиал/u' => 'циал',
'/TSИАЛ/u' => 'ЦИАЛ',
'/[ьЬ]([iİ])/u' => '$1',
# ya & ye
- '/(['.Crh::L_CONS.'])ya/u' => '$1ья',
- '/(['.Crh::L_CONS.'])Y[aA]/u' => '$1ЬЯ',
- '/(['.Crh::L_CONS.'])ye/u' => '$1ье',
- '/(['.Crh::L_CONS.'])Y[eE]/u' => '$1ЬЕ',
+ '/([' . Crh::L_CONS . '])ya/u' => '$1ья',
+ '/([' . Crh::L_CONS . '])Y[aA]/u' => '$1ЬЯ',
+ '/([' . Crh::L_CONS . '])ye/u' => '$1ье',
+ '/([' . Crh::L_CONS . '])Y[eE]/u' => '$1ЬЕ',
# расставляем Ь перед Ё
# place Ь in front of Ё
- '/(['.Crh::L_CONS.'])y[oö]/u' => '$1ьё',
- '/(['.Crh::L_CONS.'])Y[oOöÖ]/u' => '$1ЬЁ',
+ '/([' . Crh::L_CONS . '])y[oö]/u' => '$1ьё',
+ '/([' . Crh::L_CONS . '])Y[oOöÖ]/u' => '$1ЬЁ',
# оставшиеся вхождения yo и yö
# remaining occurrences of yo and yö
'/y[oö]/u' => 'ё',
# расставляем Ь перед Ю
# place Ь in front of Ю
- '/(['.Crh::L_CONS.'])y[uü]/u' => '$1ью',
- '/(['.Crh::L_CONS.'])Y[uUüÜ]/u' => '$1ЬЮ',
+ '/([' . Crh::L_CONS . '])y[uü]/u' => '$1ью',
+ '/([' . Crh::L_CONS . '])Y[uUüÜ]/u' => '$1ЬЮ',
# оставшиеся вхождения yu и yü
# remaining occurrences of yu and yü
'/y[uü]/u' => 'ю',
'/[ьЬ]([aA])/u' => '$1',
# дж
- '/C(['.Crh::L_UC.Crh::C_UC.'АЕЁЙОУЭЮЯ])/u' => 'ДЖ$1',
- '/(['.Crh::L_UC.Crh::C_UC.'АЕЁЙОУЭЮЯ])C/u' => '$1ДЖ',
+ '/C([' . Crh::L_UC . Crh::C_UC . 'АЕЁЙОУЭЮЯ])/u' => 'ДЖ$1',
+ '/([' . Crh::L_UC . Crh::C_UC . 'АЕЁЙОУЭЮЯ])C/u' => '$1ДЖ',
# гъ, къ, нъ
- '/Ğ(['.Crh::L_UC.Crh::C_UC.'])/u' => 'ГЪ$1',
- '/(['.Crh::L_UC.Crh::C_UC.'Ъ])Ğ/u' => '$1ГЪ',
+ '/Ğ([' . Crh::L_UC . Crh::C_UC . '])/u' => 'ГЪ$1',
+ '/([' . Crh::L_UC . Crh::C_UC . 'Ъ])Ğ/u' => '$1ГЪ',
- '/Q(['.Crh::L_UC.Crh::C_UC.'])/u' => 'КЪ$1',
- '/(['.Crh::L_UC.Crh::C_UC.'Ъ])Q/u' => '$1КЪ',
+ '/Q([' . Crh::L_UC . Crh::C_UC . '])/u' => 'КЪ$1',
+ '/([' . Crh::L_UC . Crh::C_UC . 'Ъ])Q/u' => '$1КЪ',
- '/Ñ(['.Crh::L_UC.Crh::C_UC.'])/u' => 'НЪ$1',
- '/(['.Crh::L_UC.Crh::C_UC.'Ъ])Ñ/u' => '$1НЪ',
+ '/Ñ([' . Crh::L_UC . Crh::C_UC . '])/u' => 'НЪ$1',
+ '/([' . Crh::L_UC . Crh::C_UC . 'Ъ])Ñ/u' => '$1НЪ',
];
}
"سامي الرحيلي",
"Azouz.anis",
"Elbasyouny",
- "Omar Ghrida"
+ "Omar Ghrida",
+ "AHmed Khaled"
]
},
"tog-underline": "سطر تحت الوصلات:",
"redirect-file": "اسم ملف",
"redirect-logid": "معرف السجل",
"redirect-not-exists": "المطلوب غير موجود",
+ "redirect-not-numeric": "قيمة غير رقمية",
"fileduplicatesearch": "بحث عن ملفات مكررة",
"fileduplicatesearch-summary": "ابحث عن الملفات المكررة بناء على قيم الهاش.",
"fileduplicatesearch-filename": "اسم الملف:",
"customcssprotected": "Nun tienes permisu pa editar esta páxina CSS porque contien preferencies personales d'otru usuariu.",
"customjsonprotected": "Nun tienes permisu pa editar esta páxina JSON porque contien preferencies personales d'otru usuariu.",
"customjsprotected": "Nun tienes permisu pa editar esta páxina de JavaScript porque contien preferencies personales d'otru usuariu.",
- "sitecssprotected": "Nun tienes permisu pa editar esta páxina de CSS porque puede afeutar a tolos visitantes",
- "sitejsonprotected": "Nun tienes permisu pa editar esta páxina en JSON porque puede afeutar a tolos visitantes",
- "sitejsprotected": "Nun tienes permisu para editar esta páxina de JavaScript porque puede afeutar a tolos visitantes",
+ "sitecssprotected": "Nun tienes permisu pa editar esta páxina de CSS porque puede afeutar a tolos visitantes.",
+ "sitejsonprotected": "Nun tienes permisu pa editar esta páxina en JSON porque puede afeutar a tolos visitantes.",
+ "sitejsprotected": "Nun tienes permisu para editar esta páxina de JavaScript porque puede afeutar a tolos visitantes.",
"mycustomcssprotected": "Nun tien permisu pa editar esta páxina CSS.",
"mycustomjsonprotected": "Nun tien permisu pa editar esta páxina JSON.",
"mycustomjsprotected": "Nun tien permisu pa editar esta páxina JavaScript.",
"redirect-file": "Nome del ficheru",
"redirect-logid": "ID del rexistru",
"redirect-not-exists": "Nun s'alcontró'l valor",
+ "redirect-not-numeric": "El valor nun ye un númberu",
"fileduplicatesearch": "Buscar archivos duplicaos",
"fileduplicatesearch-summary": "Busca archivos duplicaos basándose nos sos valores fragmentarios.",
"fileduplicatesearch-filename": "Nome del ficheru:",
"edit-error-long": "Errores:\n\n$1",
"revid": "revisión $1",
"pageid": "ID de páxina $1",
- "interfaceadmin-info": "$1\n\nLos permisos pa editar los ficheros CSS, JS y JSON globales del sitiu fueron apocayá dixebraos del permisu <code>editinterface</code>. Si nun entiendes por qué recibes esti error, por favor llei [[mw:MediaWiki_1.32/interface-admin]].",
+ "interfaceadmin-info": "$1\n\nLos permisos pa editar los ficheros CSS, JS y JSON globales del sitiu dixebráronse apocayá del permisu <code>editinterface</code>. Si nun entiendes por qué recibes esti error, llei [[mw:MediaWiki_1.32/interface-admin]].",
"rawhtml-notallowed": "Les etiquetes <html> nun pueden usase fuera de les páxines normales.",
"gotointerwiki": "Dexando {{SITENAME}}",
"gotointerwiki-invalid": "El títulu especificáu nun ye válidu.",
"backend-fail-internal": "Узьнікла невядомая памылка на сэрвэры сховішча «$1».",
"backend-fail-contenttype": "Немагчыма вызначыць тып зьместу файлу, які павінен быць захаваны ў «$1».",
"backend-fail-batchsize": "Cховішча атрымала блёк з $1 {{PLURAL:$1|файлавай апэрацыі|файлавых апэрацыяў|файлавых апэрацыяў}}; абмежаваньне складае $2 {{PLURAL:$2|апэрацыю|апэрацыі|апэрацыяў}}.",
- "backend-fail-usable": "Ð\9dе аÑ\82Ñ\80Ñ\8bмалаÑ\81Ñ\8f пÑ\80аÑ\87Ñ\8bÑ\82аÑ\86Ñ\8c Ñ\86Ñ\96 запÑ\96Ñ\81аÑ\86Ñ\8c Ñ\84айл «$1» з-за недаÑ\81Ñ\82аÑ\87Ñ\8b пÑ\80авоÑ\9e Ñ\86Ñ\96 адÑ\81Ñ\83Ñ\82наÑ\81Ñ\8cÑ\86Ñ\96 дÑ\8bÑ\80Ñ\8dкÑ\82оÑ\80Ñ\8bÑ\8fў або кантэйнэраў.",
+ "backend-fail-usable": "Ð\9dе аÑ\82Ñ\80Ñ\8bмалаÑ\81Ñ\8f пÑ\80аÑ\87Ñ\8bÑ\82аÑ\86Ñ\8c Ñ\86Ñ\96 запÑ\96Ñ\81аÑ\86Ñ\8c Ñ\84айл «$1» пÑ\80азÑ\8c недаÑ\85оп пÑ\80авоÑ\9e Ñ\86Ñ\96 адÑ\81Ñ\83Ñ\82наÑ\81Ñ\8cÑ\86Ñ\96 каÑ\82алÑ\91гаў або кантэйнэраў.",
"filejournal-fail-dbconnect": "Не атрымалася злучыцца з базай зьвестак журнала для сховішча «$1».",
"filejournal-fail-dbquery": "Не атрымалася абнавіць базу зьвестак журнала для сховішча «$1».",
"lockmanager-notlocked": "Немагчыма разблякаваць «$1», які не заблякаваны.",
"redirect-file": "Назва файлу",
"redirect-logid": "ID журнала",
"redirect-not-exists": "Значэньне ня знойдзена",
+ "redirect-not-numeric": "Значэньне ня лікавае",
"fileduplicatesearch": "Пошук дублікатаў файлаў",
"fileduplicatesearch-summary": "Пошук аднолькавых файлаў на падставе іх хэшаў.",
"fileduplicatesearch-filename": "Назва файла:",
"brokenredirects-edit": "редактиране",
"brokenredirects-delete": "изтриване",
"withoutinterwiki": "Страници без междуезикови препратки",
- "withoutinterwiki-summary": "Следните страници не препращат към версии на други езици:",
+ "withoutinterwiki-summary": "Следните страници не са свързани с версии на други езици:",
"withoutinterwiki-legend": "Представка",
"withoutinterwiki-submit": "Показване",
"fewestrevisions": "Страници с най-малко редакции",
"listusers-noresult": "Няма намерени потребители.",
"listusers-blocked": "(блокиран)",
"activeusers": "Списък на активните потребители",
- "activeusers-intro": "Това е Ñ\81пиÑ\81Ñ\8aк на поÑ\82Ñ\80ебиÑ\82елиÑ\82е, коиÑ\82о Ñ\81а демонÑ\81Ñ\82Ñ\80иÑ\80али някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
+ "activeusers-intro": "Това е Ñ\81пиÑ\81Ñ\8aк на поÑ\82Ñ\80ебиÑ\82елиÑ\82е, коиÑ\82о Ñ\81а имали някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
"activeusers-count": "$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}",
"activeusers-from": "Показване на потребителите, започвайки от:",
"activeusers-groups": "Показване на потребителите, принадлежащи към групи:",
"emailuser-title-target": "Писмо до {{GENDER:$1|потребителя}}",
"emailuser-title-notarget": "Изпращане на е-писмо на потребител",
"emailpagetext": "Можете да използвате формуляра по-долу, за да изпратите електронно писмо на {{GENDER:$1|този потребител}}.\nАдресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори директно.",
- "defemailsubject": "Писмо от потребител $1 в {{SITENAME}}",
+ "defemailsubject": "Писмо от потребител „$1“ в {{SITENAME}}",
"usermaildisabled": "Потребителят не е разрешил да получава електронна поща",
"usermaildisabledtext": "Не можете да изпращате електронна поща на други потребители от това уики",
"noemailtitle": "Няма електронна поща",
"noemailtext": "Този потребител не е посочил валиден адрес за електронна поща.",
"nowikiemailtext": "Този потребител е избрал да не получава електронна поща от други потребители.",
- "emailnotarget": "Несъществуващ или невалиден получател на е-писмото.",
+ "emailnotarget": "Несъществуващо или невалидно потребителско име за получател.",
"emailtarget": "Въвежда се получателят на е-писмото",
"emailusername": "Потребителско име:",
"emailusernamesubmit": "Изпращане",
"emailmessage": "Съобщение:",
"emailsend": "Изпращане",
"emailccme": "Изпращане на копие на писмото до автора.",
- "emailccsubject": "Ð\9aопие на пиÑ\81моÑ\82о ви до $1: $2",
+ "emailccsubject": "Ð\9aопие на пиÑ\81моÑ\82о Ð\92и до $1: $2",
"emailsent": "Писмото е изпратено",
"emailsenttext": "Писмото Ви беше изпратено.",
"emailuserfooter": "Това писмо беше изпратено от $1 на {{GENDER:$2|$2}} чрез функцията „{{int:emailuser}}“ на {{SITENAME}}. Ако отговорите на писмото, вашето писмо ще бъде изпратено директно на {{GENDER:$1|първоначалния подател}}, показвайки адреса на ел. Ви поща на получателя.",
"protectexpiry": "Изтича на:",
"protect_expiry_invalid": "Невалиден срок на изтичане.",
"protect_expiry_old": "Срокът на изтичане е минал.",
- "protect-unchain-permissions": "Ð\9fозволÑ\8fване на по-наÑ\82аÑ\82Ñ\8aÑ\88ни възможности за защита",
+ "protect-unchain-permissions": "Ð\9fозволÑ\8fване на допÑ\8aлниÑ\82елни възможности за защита",
"protect-text": "Тук можете да прегледате и промените нивото на защита на страницата <strong>$1</strong>.",
"protect-locked-blocked": "Не можете да променяте нивата на защита на страниците, докато сте блокиран(а).\nТекущите настройки за страницата <strong>$1</strong> са:",
"protect-locked-dblock": "Нивата на защита на страниците не могат да бъдат променяни, защото базата от данни е заключена.\nЕто текущите настройки за страницата <strong>$1</strong>:",
- "protect-locked-access": "Нямате правото да променяте нивата на защита на страниците. Ето текущите настройки за страницата „'''$1'''“:",
+ "protect-locked-access": "Нямате правото да променяте нивата на защита на страниците. Ето текущите настройки за страницата <strong>$1</strong>:",
"protect-cascadeon": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита.\nМожете да промените нивото на защита на страницата, но това няма да повлияе върху каскадната защита.",
"protect-default": "Позволяване за всички потребители",
"protect-fallback": "Позволяване само за потребители с права на „$1“",
"viewdeletedpage": "Преглед на изтрити страници",
"undeletepagetext": "{{PLURAL:$1|Следната страница беше изтрита, но все още се намира в архива и може да бъде възстановена|Следните $1 страници бяха изтрити, но все още се намират в архива и могат да бъдат възстановени}}. Архивът може да се почиства от време на време.",
"undelete-fieldset-title": "Възстановяване на версии",
- "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска '''''{{int:undeletebtn}}'''''.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска '''''{{int:undeletebtn}}'''''.",
+ "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска <strong><em>{{int:undeletebtn}}</em></strong>.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска <strong><em>{{int:undeletebtn}}</em></strong>.",
"undeleterevisions": "$1 {{PLURAL:$1|версия беше изтрита|версии бяха изтрити}}",
"undeletehistory": "Ако възстановите страницата, всички версии ще бъдат върнати в историята.\nАко след изтриването е създадена страница със същото име, възстановените версии ще се появят като по-ранна история, а текущата версия на страницата няма да бъде заменена автоматично. Също така обърнете внимание, че ограниченията, приложени върху версиите, ще се загубят след възстановяването.",
"undeleterevdel": "Възстановяването няма да бъде изпълнено, ако би довело до частично изтриване на актуалната версия. В такъв случай актуалната версия не трябва да бъде избирана или пък състоянието ѝ трябва да бъде променено на нормална (нескрита) версия. Версиите на файлове, които нямате право да преглеждате, няма да бъдат възстановени.",
"undeletehistorynoadmin": "Тази страница е била изтрита. В резюмето отдолу е посочена причината за това, заедно с информация за потребителите, редактирали страницата преди изтриването ѝ. Конкретното съдържание на изтритите версии е достъпно само за администратори.",
"undelete-revision": "Изтрита версия на $1 (към $4, в $5) от $3:",
- "undeleterevision-missing": "Неправилна или липсваща версия. Може да сте последвали грешна препратка или указаната версия да е била възстановена или премахната от архива",
+ "undeleterevision-missing": "Неправилна или липсваща версия.\nМоже да сте последвали грешна препратка или указаната версия да е била възстановена или премахната от архива.",
"undelete-nodiff": "Не е открита предишна редакция.",
"undeletebtn": "Възстановяване",
"undeletelink": "преглед/възстановяване",
"undeleteinvert": "Обръщане на избора",
"undeletecomment": "Причина:",
"cannotundelete": "Една или повече операции по възстановяване се провалиха:\n$1",
- "undeletedpage": "'''Страницата „$1“ беше възстановена.'''\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
+ "undeletedpage": "<strong>Страницата $1 беше възстановена</strong>\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
"undelete-header": "Прегледайте [[Special:Log/delete|дневника на изтриванията]] за текущо изтритите страници.",
"undelete-search-title": "Търсене на изтрити страници",
"undelete-search-box": "Търсене на изтрити страници",
"undelete-filename-mismatch": "Не е възможно възстановяването на файловата версия с времева отметка $1: несъответствие в името на файла",
"undelete-bad-store-key": "Не е възможно възстановяването на файловата версия с времева отметка $1: файлът е липсвал преди изтриването.",
"undelete-cleanup-error": "Грешка при изтриване на неизползвания архивен файл „$1“.",
- "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.",
+ "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни.\nВероятно вече е възстановен.",
"undelete-error": "Грешка при възстановяване на страницата",
"undelete-error-short": "Грешка при възстановяването на изтрития файл: $1",
"undelete-error-long": "Възникнаха грешки при възстановяването на изтрития файл:\n\n$1",
"year": "От година (и по-рано):",
"date": "От дата (и по-рано):",
"sp-contributions-newbies": "Показване само на приносите на нови потребители",
- "sp-contributions-newbies-sub": "на нови поÑ\82Ñ\80ебиÑ\82ели",
+ "sp-contributions-newbies-sub": "Ð\97а нови Ñ\81меÑ\82ки",
"sp-contributions-newbies-title": "Потребителски приноси за нови сметки",
"sp-contributions-blocklog": "дневник на блокиранията",
"sp-contributions-deleted": "изтрити приноси на {{GENDER:$1|потребител}}",
"blockipsuccesssub": "Блокирането беше успешно",
"blockipsuccesstext": "Потребител [[Special:Contributions/$1|$1]] беше блокиран(а).<br />\nМожете да прегледате пълния [[Special:BlockList|списък на блокираните потребители]].",
"ipb-blockingself": "На път сте да блокирате себе си! Наистина ли желаете да извършите това действие?",
- "ipb-confirmhideuser": "На път сте да блокирате потребител, който е \"скрит потребител\". Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
+ "ipb-confirmhideuser": "На път сте да блокирате потребител, който е „скрит потребител“. Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
"ipb-edit-dropdown": "Редактиране на причините за блокиране",
"ipb-unblock-addr": "Отблокиране на $1",
"ipb-unblock": "Отблокиране на потребителско име или IP-адрес",
"autoblocklist-empty": "Списъкът на автоматичните блокирания е празен.",
"ipblocklist": "Блокирани потребители",
"ipblocklist-legend": "Търсене на блокиран потребител",
- "blocklist-userblocks": "СкÑ\80иване на блокиÑ\80ани потребителски сметки",
+ "blocklist-userblocks": "СкÑ\80иване блокиÑ\80анеÑ\82о на потребителски сметки",
"blocklist-tempblocks": "Скриване на временни блокирания",
- "blocklist-addressblocks": "Скриване на отделни блокирани IP адреси",
+ "blocklist-addressblocks": "Скриване на отделни блокирания на IP адреси",
"blocklist-rangeblocks": "Скриване на блокиранията по IP диапазон",
"blocklist-timestamp": "Дата и час",
"blocklist-target": "Цел",
"customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
"customjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এই পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
"customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
- "sitecssprotected": "আপনার এই CSS পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
- "sitejsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
- "sitejsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
+ "sitecssprotected": "আপনার এই CSS পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে।",
+ "sitejsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে।",
+ "sitejsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে।",
"mycustomcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।",
"mycustomjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই।",
"mycustomjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই।",
"confirm-unwatch-top": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?",
"confirm-rollback-button": "ঠিক আছে",
"confirm-rollback-top": "এই পাতায় করা সম্পাদনাগুলি প্রত্যাবর্তন করবেন?",
+ "mcrundofailed": "পূর্বাবস্থায় ফেরা ব্যর্থ হয়েছে",
"quotation-marks": "\"$1\"",
"imgmultipageprev": "← পূর্ববর্তী পাতা",
"imgmultipagenext": "পরবর্তী পাতা →",
"currentrev": "最新版本",
"currentrev-asof": "$1 muōi-muōi siŏh-huôi biĕng-cĭk",
"revisionasof": "$1 gì bēng-buōng",
+ "revision-info": "Găk $1 iù {{GENDER:$6|$2}} có̤ gì biĕng-cĭk $7",
"previousrevision": "← Gá-gô gì bēng-buōng",
"nextrevision": "加新其版本→",
"currentrevisionlink": "最新版本",
"yourrealname": "真實姓名:",
"yourlanguage": "語言:",
"yournick": "新其簽名:",
+ "badsig": "Nguòng-sṳ̄ chiĕng-miàng ô dâng.\nGái káng-lâ HTML biēu-chiĕng.",
"email": "電批",
"prefs-help-email": "電子郵件地址是愛寫就寫其,但是如果汝𣍐記密碼咯,密碼重置其時候需要茲。",
"prefs-help-email-others": "汝也會使選擇讓其他其用戶通過汝其用戶頁面或者討論頁面懸頂其鏈接,使電子郵件來聯繫汝。其他其用戶聯繫汝其辰候,汝其電子郵件地址𣍐顯示出來。",
"boteditletter": "^",
"rc-change-size-new": "Siŭ-gāi ī-hâiu biéng có̤ $1 cê-ciék",
"rc-enhanced-hide": "囥起細節",
+ "rc-old-title": "Kī-tàu hô̤ lā̤ „$1“",
"recentchangeslinked": "相關其改變",
"recentchangeslinked-feed": "相關其改變",
"recentchangeslinked-toolbox": "Sŏng-guăng gì gāi-biéng",
"unwatch": "伓使監視",
"unwatchthispage": "停止監視",
"watchlist-details": "Nṳ̄ gì găng-sê-dăng {{PLURAL:$1|ô $1 gó|dŭ liāng ô $1 gó}} hiĕk-miêng (bău-guák tō̤-lâung-hiĕk).",
+ "wlheader-enotif": "Ī-gĭng kŭi kó̤ diêng-piĕ tŭng-dĭ.",
+ "wlheader-showupdated": "Ṳ̀-guō ô diê-siŏh-hiĕk, găk nṳ̄ muōi-muōi siŏh-huòi káng guó cī-hâiu, bô ké̤ṳk nè̤ng gāi kó̤, hī-siŏh-hiĕk gì biĕu-dà̤ cêu-sê <strong>cū-tā̤</strong>.",
"wlshowlast": "顯示最$1點鐘$2日",
"watchlist-options": "監視單選項",
"watching": "監視...",
"deletecomment": "原因:",
"rollback": "再修改轉去",
"rollbacklink": "duōng",
+ "rollbacklinkcount": "Huòi-tó̤i $1 huòi biĕng-cĭk",
"rollbackfailed": "轉𣍐去",
"cantrollback": "𣍐使恢復修改;最後其貢獻者是茲蜀頁其唯一其作者。",
"alreadyrolled": "𣍐使回滾最後蜀回[[User:$2|$2]] ([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])其[[:$1]]編輯;\n有其他儂已經編輯過了或者茲蜀頁已經乞回滾過了。\n\n最後蜀回茲蜀頁其修改是[[User:$3|$3]] ([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])改其。",
"tooltip-feed-atom": "Cī-siŏh-hiĕk gì Atom lài-nguòng",
"tooltip-t-contributions": "{{GENDER:$1|茲蜀隻用戶}}其貢獻單單",
"tooltip-t-emailuser": "向{{GENDER:$1|茲蜀隻用戶}}寄電批",
+ "tooltip-t-info": "Cī-siŏh-hiĕk gì gó-sâ̤ séng-sék",
"tooltip-t-upload": "Siông-diòng ùng-giông",
"tooltip-t-specialpages": "Cuòng-buô dĕk-sṳ̀-hiĕk dăng-dăng",
"tooltip-t-print": "Cī-hiĕk â̤ páh-éng gì bēng-buōng",
"watchlisttools-view": "看相關改變",
"watchlisttools-edit": "看共修改監視單",
"watchlisttools-raw": "修改原始監視單",
+ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|tō̤-lâung]])",
"redirect": "Áng ùng-giông, ê̤ṳng-hô, hiĕk-miêng siŭ-gāi, nĭk-cé ID kó̤ tṳ̀ng-dêng-hióng",
"redirect-submit": "Kó̤",
"redirect-lookup": "Sìng-tō̤:",
"redirect-file": "Jméno souboru",
"redirect-logid": "ID protokolovacího záznamu",
"redirect-not-exists": "Hodnota nenalezena",
+ "redirect-not-numeric": "Hodnota není číslo",
"fileduplicatesearch": "Hledání duplicitních souborů",
"fileduplicatesearch-summary": "Hledání duplicitních souborů podle jejich hašů.",
"fileduplicatesearch-filename": "Jméno souboru:",
"group-autoconfirmed": "Registrerede brugere",
"group-bot": "Robotter",
"group-sysop": "Administratorer",
+ "group-interface-admin": "Grænsesnitadministratorer",
"group-bureaucrat": "Bureaukrater",
"group-suppress": "Undertrykkere",
"group-all": "(alle)",
"recentchanges-page-added-to-category": "[[:$1]] tilføjet til kategori",
"recentchanges-page-added-to-category-bundled": "[[:$1]] tilføjet til kategorien, [[Special:WhatLinksHere/$1|denne side er inkluderet i andre sider]]",
"recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori",
+ "autochange-username": "Automatisk MediaWiki-ændring",
"upload": "Læg en fil op",
"uploadbtn": "Læg en fil op",
"reuploaddesc": "Tilbage til formularen til at lægge filer op.",
"uploadstash-bad-path-invalid": "Stien er ugyldig.",
"uploadstash-bad-path-unknown-type": "Ukendt type »$1«.",
"uploadstash-file-not-found-no-object": "Kunne ikke oprette lokalt filobjekt for miniaturebillede.",
+ "uploadstash-file-too-large": "Kan ikke behandle en fil der er større end $1 bytes.",
"uploadstash-not-logged-in": "Ingen bruger er logget ind, filer skal tilhøre brugere.",
"uploadstash-wrong-owner": "Filen ($1) tilhører ikke den nuværende bruger.",
"uploadstash-no-such-key": "Ingen sådan nøgle ($1), kan ikke fjerne.",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
"limitreport-expansiondepth": "Største udvidelsesdybde",
"limitreport-expensivefunctioncount": "Antal dyre parserfunktioner",
+ "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
"expandtemplates": "Udfold skabeloner",
"expand_templates_intro": "Denne specialside tager en tekst og udfolder alle benyttede skabeloner rekursivt.\nDen udfolder også understøttede parserfunktioner så som\n<code><nowiki>{{</nowiki>#language:…}}</code> og variabler så som \n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>\nFaktisk udfolder den stort set alt i dobbelte tuborgklammer.",
"expand_templates_title": "Sammenhængstitel, for {{FULLPAGENAME}} osv.:",
"log-action-filter-move": "Flyttetype:",
"log-action-filter-patrol": "Patruljeringstype:",
"log-action-filter-protect": "Beskyttelsestype:",
+ "log-action-filter-rights": "Type af rettighedændring:",
"log-action-filter-all": "Alle",
"log-action-filter-block-block": "Blokering",
"log-action-filter-block-reblock": "Ændring af blokering",
"authform-notoken": "Mangler nøgle",
"authform-wrongtoken": "Forkert nøgle",
"specialpage-securitylevel-not-allowed-title": "Ikke tilladt",
+ "authpage-cannot-login": "Kunne ikke starte login.",
"cannotauth-not-allowed-title": "Adgang nægtet",
"cannotauth-not-allowed": "Du har ikke tilladelse til at bruge denne side",
"removecredentials": "Fjern akkreditiver",
"redirect-file": "Datei",
"redirect-logid": "Logbucheintrag",
"redirect-not-exists": "Der Wert wurde nicht gefunden",
+ "redirect-not-numeric": "Der Wert ist nicht numerisch",
"fileduplicatesearch": "Dateiduplikatsuche",
"fileduplicatesearch-summary": "Suche nach Dateiduplikaten auf Basis ihres Hashwertes.",
"fileduplicatesearch-filename": "Dateiname:",
"redirect-file": "Filename",
"redirect-logid": "Log ID",
"redirect-not-exists": "Value not found",
+ "redirect-not-numeric": "Value not numeric",
"fileduplicatesearch": "Search for duplicate files",
"fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
"fileduplicatesearch-filename": "Filename:",
"redirect-file": "Tiedostonimi",
"redirect-logid": "Lokin tunnistenumero",
"redirect-not-exists": "Arvoa ei löytynyt",
+ "redirect-not-numeric": "Arvo ei numeerinen",
"fileduplicatesearch": "Kaksoiskappaleiden haku",
"fileduplicatesearch-summary": "Etsii tiedoston kaksoiskappaleita hajautusarvon perusteella.",
"fileduplicatesearch-filename": "Tiedostonimi",
"edit-error-long": "Virheet:\n\n$1",
"revid": "versio $1",
"pageid": "sivun tunnistenumero $1",
+ "interfaceadmin-info": "$1\n\nSivustonlaajuisten CSS/JS/JSON-tiedostojen muokkaamisoikeus erotettiin äskettäin <code>editinterface</code>-oikeudesta. Jos et ymmärrä, miksi saat tämän virheen, katso [[mw:MediaWiki_1.32/interface-admin]].",
"rawhtml-notallowed": "<html> komentoa ei voida käyttää normaalien sivujen ulkopuolella.",
"gotointerwiki": "Lähdössä {{GRAMMAR:elative|{{SITENAME}}}}",
"gotointerwiki-invalid": "Annettu otsikko on virheellinen.",
"redirect-file": "Nom du fichier",
"redirect-logid": "ID de journal",
"redirect-not-exists": "Valeur non trouvée",
+ "redirect-not-numeric": "Valeur non numérique",
"fileduplicatesearch": "Recherche de doublons",
"fileduplicatesearch-summary": "Recherche des copies de fichiers identiques d'après leur empreinte de hachage.",
"fileduplicatesearch-filename": "Nom du fichier :",
"tog-numberheadings": "Niméroté otomatikman tit di sèksyon",
"tog-showtoolbar": "Afiché bar di zouti di édisyon",
"tog-editondblclick": "Modifyé paj-ya ké roun doub-klik",
- "tog-editsectiononrightclick": "Aktivé modifikasyon-an dé sèksyon pa roun klik drèt asou tit di sèksyon",
+ "tog-editsectiononrightclick": "Agtivé modifikasyon-an dé sègsyon pa roun klik drèt asou tit-ya di sègsyon",
"tog-watchcreations": "Ajouté à mo lis di swivi paj-ya ki mo kréyé é fiché-ya ki mo ka enpòrté",
"tog-watchdefault": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka modifyé",
"tog-watchmoves": "Ajouté paj-ya ké fiché-ya ki mo ka déplasé annan mo lis di swivi",
"tog-watchlisthideliu": "Maské modifikasyon-yan ki fè pa dé itilizatò annan lis di swivi",
"tog-watchlistreloadautomatically": "Roucharjé otomatikman lis di swivi-a lò lòpsyon di filtraj sa modifyé (JavaScript réki)",
"tog-watchlistunwatchlinks": "Ajouté dé markèr dirèk ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) pou paj-ya swivi ké dé chanjman (JavaScript sa nésésèr pou itilizé fonksyonalité-a)",
- "tog-watchlisthideanons": "Maské modifikasyon-yan di itilizatò anonim annan lis di swivi",
+ "tog-watchlisthideanons": "Maské modifikasyon-yan di itilizatò annonnim annan lis di swivi-a",
"tog-watchlisthidepatrolled": "Maské modifikasyon-yan ki rouli annan lis di swivi",
"tog-watchlisthidecategorization": "Maské katégorizasyon dé paj",
"tog-ccmeonemails": "• Voyé mo roun kopi dé kouryé ki mo ka voyé pou ròt itilizatò",
"viewdeleted_short": "Wè {{PLURAL:$1|roun modifikasyon souprimé|$1 modifikasyon souprimé}}",
"protect": "Protéjé",
"protect_change": "modifyé",
- "unprotect": "Chanjé protèksyon-an",
+ "unprotect": "Chanjé protègsyon-an",
"newpage": "Nouvèl paj",
"talkpagelinktext": "diskisyon",
"specialpage": "Paj èspésyal",
"viewhelppage": "Wè paj di lèd",
"categorypage": "Wè paj di katégori",
"viewtalkpage": "Wè paj di diskisyon",
- "otherlanguages": "Annan rounòt langaj",
+ "otherlanguages": "Annan ròt lanng",
"redirectedfrom": "(Roudirijé dipi $1)",
"redirectpagesub": "Paj di roudirègsyon",
"redirectto": "Roudirijé bò'd :",
"readonly": "Baz di data vérouyé",
"enterlockreason": "Endiké rézon-an di vérouyaj ensi ki roun èstimasyon di so douré",
"readonlytext": "Ajou ké mizajou di baz di data sa atchwèlman bloké, probabman pou pèrmèt mentnans di baz-a, aprè sa, tout bagaj ké rantré annan lòrd.\n\nAdministratò sistenm-an ki vérouyé baz di data fourni èsplikasyon-an ki ka swiv :<br /> $1",
- "missing-article": "Baz-a di data pa trouvé tègs-a di roun paj ki li té divèt trouvé, ki entitilé « $1 » $2.\n\nJénéralman, sala ka sirvini an swivan roun lyannaj bò'd roun dif ki périmen oben bò'd listorik-a di roun paj ki souprimen.\n\nSi a pa sa ki la, zòt pitèt trouvé roun annonmanli annan progranm-an.\nSouplé, signalé li à roun [[Special:ListUsers/sysop|administratò]] é pa bliyé di endiké li URL-a di paj-a.",
+ "missing-article": "Baz-a di data pa trouvé tègs-a di roun paj ki li té divèt trouvé, ki entitilé « $1 » $2.\n\nJénéralman, sala ka sirvini an swivan roun lyannaj bò'd roun dif ki périmen oben bò'd listorik-a di roun paj ki siprimen.\n\nSi a pa sa ki la, zòt pitèt trouvé roun annonmanli annan progranm-an.\nSouplé, signalé li à roun [[Special:ListUsers/sysop|administratò]] é pa bliyé di endiké li URL-a di paj-a.",
"missingarticle-rev": "(niméro di vèrsyon : $1)",
"missingarticle-diff": "(diff : $1, $2)",
"readonly_lag": "Baz-a di data té otonmatikman vérouyé pannan ki sèrvò-ya ségondèr ka réyaligné yé kò asou sèrvò prensipal-a",
"protectedinterface": "Sa paj ka fourni tègs di lentèrfas pou lojisyèl-a asou sa wiki é sa protéjé pou évité abi-ya.\nPou ajouté oben modifyé dé anmòrfwézaj asou tout wiki, souplé, itilizé [https://translatewiki.net/ translatewiki.net], projè-a di réjyonnalizasyon di MediaWiki.",
"editinginterface": "<strong>Panga :</strong> zòt ka modifiyé oun paj ki itilizé pou kréyé tègs-a di lentèrfas-a di lojisyèl.\nChanjman-yan asou sa paj ké répèrkité yé kò asou laparans-a di lentèrfas itilizatò-a pou ròt itilizatò-ya di sa wiki.",
"translateinterface": "Pou ajouté oben modifyé dé anmòrfwézaj pou tout wiki, souplé, itilizé [https://translatewiki.net/ translatewiki.net], projè-a di lokalizasyon lengwistik di MediaWiki.",
- "cascadeprotected": "Sa paj protéjé kont modifikasyon-yan pas li sa transkliz pa {{PLURAL:$1|paj-a ki ka swiv, ki té protéjé|paj-ya ki ka swiv, ki té protéjé}} ké lòpsyon « protèksyon an kaskad » aktivé :\n$2",
+ "cascadeprotected": "Sa paj protéjé kont modifikasyon-yan pas li sa transkliz pa {{PLURAL:$1|paj-a ki ka swiv, ki té protéjé|paj-ya ki ka swiv, ki té protéjé}} ké lòpsyon « protègsyon an kaskad » agtivé :\n$2",
"namespaceprotected": "Zòt pa gen pèrmisyon-an di modifyé paj-ya di lèspas di non « <strong>$1</strong> ».",
"customcssprotected": "Zòt pa gen pèrmisyon-an di modifyé sa féy di stil CSS, pas li ka kontni paramèt pèrsonèl di rounòt itilizatò.",
"customjsonprotected": "Zòt pa gen drwè di modifyé sa paj JSON pas li ka kontni paramèt pèrsonèl di rounòt itilizatò.",
"cannotloginnow-title": "Enposib di konnègté so kò atchwèlman",
"cannotloginnow-text": "Konnègsyon-an pa posib an itilizan $1.",
"cannotcreateaccount-title": "Kréyasyon di kont enposib",
- "cannotcreateaccount-text": "Kréyasyon-an dirèk di kont itilizatò pa aktivé asou sa wiki.",
+ "cannotcreateaccount-text": "Kréyasyon-an dirèk di kont itilizatò pa fika agtivé asou sa wiki.",
"yourdomainname": "Zòt domenn :",
"password-change-forbidden": "Zòt pa pouvé modifyé mo di pas asou sa wiki.",
"externaldberror": "Swé roun lérò prodjwi so kò asou baz-a di data d'otantifikasyon, swé zòt pa otorizé à mété à jou zòt kont ègstèrn.",
"createaccounterror": "Enposib di kréyé kont-a : $1",
"nocookiesnew": "Kont itilizatò-a kréyé, mé zòt pa konnègté.\n{{SITENAME}} ka itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò ké menm non é menm modipas.",
"nocookieslogin": "{{SITENAME}} itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò.",
- "nocookiesfornew": "Kont itilizatò pa té kréyé, pas nou pa té pouvé idantifyé so lorijin.\nVérifyé ki zòt aktivé témwen-yan (''cookies''), roucharjé paj-a é éséyé òkò.",
+ "nocookiesfornew": "Kont itilizatò-a pa té fika kréyé, pas nou pa té pouvé idantifyé so lorijin.\nVérifyé ki zòt agtivé témwen-yan (''cookies''), roucharjé paj-a é éséyé òkò.",
"nocookiesforlogin": "{{int:nocookieslogin}}",
"createacct-loginerror": "Kont-a byen té kréyé mé zòt pa pouvé konnègté zòt kò otonmatikman.\nSouplé, [[Special:UserLogin|konnègté zòt kò manniyèlman]].",
"noname": "Zòt pa sézi roun non d'itilizatò valid.",
"botpasswords-label-delete": "Souprimé",
"botpasswords-label-resetpassword": "Réyinisyalizé mo di pas",
"botpasswords-label-grants": "Drwè aplikab :",
- "botpasswords-help-grants": "Otorizasyon-yan ka pèrmèt di aksédé o drwè ki déja akòrdé à zòt kont itilizatò. Aktivé roun otorizasyon isi ka fourni laksè à pyès drwè ki zòt kont itilizatò pa gen dayò. Wè [[Special:ListGrants|tablo dé otorizasyon]] pou plis d’enfòrmasyon.",
+ "botpasswords-help-grants": "Lotorizasyon-yan ka pèrmèt di agsédé o drwè ki déja akòrdé à zòt kont itilizatò. Agtivé roun lotorizasyon isi ka fourni lagsè à pyès drwè ki zòt kont itilizatò péké ganyen dayò. Wè [[Special:ListGrants|tablo dé lotorizasyon]] pou plis di lenfòrmasyon.",
"botpasswords-label-grants-column": "Akòrdé",
"botpasswords-bad-appid": "Non-an di robo « $1 » pa valid.",
"botpasswords-insert-failed": "Échèk di ajou-a di non di robo « $1 ». Ès i té ja ajouté ?",
"permissionserrors": "Éròr di pèrmisyon",
"permissionserrorstext-withaction": "Zòt pa pouvé $2, pou {{PLURAL:$1|rézon swivant}} :",
"recreate-moveddeleted-warn": "<strong>Panga : zòt ka roukréyé oun paj ki té présédaman souprimé.</strong>\n\nAsouré-zòt ki li sa pertinan di pourswiv modifikasyon-yan asou sa paj.\nJournal dé souprésyon é dé déplasman pou sa paj sa afiché anba à tit di enfòrmasyon :",
- "moveddeleted-notice": "Sa paj té souprimé. \nJournal dé souprésyon, dé protèksyon é dé déplasman di paj-a sa afiché anba pou référans.",
+ "moveddeleted-notice": "Sa paj té siprimen. \nJournal-ya dé siprésyon, dé protègsyon é dé déplasman pou paj-a sa afiché anba pou référans.",
"content-model-wikitext": "wikitèks",
"undo-failure": "Sa modifikasyon pa pouvé défèt : sala ké antré an konfli ké modifikasyon entèrmédjèr-ya.",
"viewpagelogs": "Wè opérasyon-yan asou sa paj",
"currentrevisionlink": "Wè vèrsyon atchwèl-a",
"cur": "atch",
"last": "dif",
- "histlegend": "Sélèksyon di diff : koché bouton radjo-ya dé vèrsyon à konparé é apiyé asou antré oben asou bouton-an ki anba.<br />\nLéjann : <strong>({{int:cur}})</strong> = diférans ké dannyé vèrsyon-an, <strong>({{int:last}})</strong> = diférans ké vèrsyon présédant-a, <strong>{{int:minoreditletter}}</strong> = modifikasyon minò.",
+ "histlegend": "Sélègsyon di diff : koché bouton radjo-ya dé vèrsyon à konparé é apiyé asou antré oben asou bouton-an ki anba.<br />\nLéjann : <strong>({{int:cur}})</strong> = diférans ké dannyé vèrsyon-an, <strong>({{int:last}})</strong> = diférans ké vèrsyon présédan-an, <strong>{{int:minoreditletter}}</strong> = modifikasyon minò.",
"history-fieldset-title": "Sasé dé révizyon",
"histfirst": "Pli ansyenn",
"histlast": "Pli résan-yan",
"rcshowhideliu": "$1 itilizatò anréjistré",
"rcshowhideliu-show": "Afiché",
"rcshowhideliu-hide": "Maské",
- "rcshowhideanons": "$1 itilizatò anonim-ya",
+ "rcshowhideanons": "$1 itilizatò annonnim-yan",
"rcshowhideanons-show": "Afiché",
"rcshowhideanons-hide": "Maské",
"rcshowhidepatr": "$1 modifikasyon sirvéyé",
"dellogpage": "Journal dé souprésyon",
"rollbacklink": "révoké",
"rollbacklinkcount": "révoké $1 {{PLURAL:$1|modifikasyon}}",
- "protectlogpage": "Journal dé protèksyon",
+ "protectlogpage": "Journal dé protègsyon",
"protectedarticle": "protéjé « [[$1]] »",
- "modifiedarticleprotection": "modifyé nivo di protèksyon di « [[$1]] »",
+ "modifiedarticleprotection": "modifyé nivo-a di protègsyon di « [[$1]] »",
"protect-default": "Otorizé tout itilizatò-ya",
"restriction-edit": "Modifyé",
"restriction-move": "Rounonmen",
"namespace": "Lèspas di non",
- "invert": "Envèrsé sélèksyon-an",
+ "invert": "Envèrsé sélègsyon-an",
"tooltip-invert": "Koché sa kaz pou kaché modifikasyon-yan dé paj annan lèspas di non sélèksyoné (ké lèspas di non asosyé si koché)",
"namespace_association": "Lèspas di non asosyé",
"tooltip-namespace_association": "Koché sa kaz pou enkli égalman lèspas di non di diskisyon oben di sijè, ki asosyé à lèspas di non ki sélèksyoné",
"pageinfo-title": "Enfòrmasyon pou « $1 »",
"pageinfo-header-basic": "Enfòrmasyon di baz",
"pageinfo-header-edits": "Listorik dé modifikasyon",
- "pageinfo-header-restrictions": "Protèksyon di paj-a",
+ "pageinfo-header-restrictions": "Protègsyon di paj-a",
"pageinfo-header-properties": "Propriyété di paj-a",
"pageinfo-display-title": "Tit afiché",
"pageinfo-default-sort": "Klé di tri pa défo",
"pageinfo-length": "Tay di paj-a (an ògtè)",
"pageinfo-article-id": "Niméro di paj-a",
- "pageinfo-language": "Langaj di kontni di paj-a",
+ "pageinfo-language": "Lanng di kontni di paj-a",
"pageinfo-content-model": "Modèl di kontni di paj-a",
"pageinfo-robot-policy": "Endèksasyon pa robo",
"pageinfo-robot-index": "Otorizé",
"exif-exposureprogram-1": "Manniyèl",
"namespacesall": "tout",
"monthsall": "tout",
+ "confirm-purge-title": "Prijé sa paj",
"imgmultipagenext": "paj swivant →",
"imgmultigo": "Aksédé !",
"imgmultigoto": "Alé koté paj $1",
"customcssprotected": "Non ten os permisos necesarios para modificar esta páxina de CSS, dado que contén a configuración persoal doutro usuario.",
"customjsonprotected": "Non ten os permisos necesarios para modificar esta páxina JSON xa que contén a configuración persoal doutro usuario.",
"customjsprotected": "Non ten os permisos necesarios para modificar esta páxina de JavaScript, dado que contén a configuración persoal doutro usuario.",
- "sitecssprotected": "Non ten permiso para editar esta páxina CSS xa que pode afectar a tódolos visitantes",
- "sitejsonprotected": "Non ten permiso para editar esta páxina JSON xa que pode afectar a tódolos visitantes",
- "sitejsprotected": "Non ten permiso para editar esta páxina JavaScript xa que pode afectar a tódolos visitantes",
+ "sitecssprotected": "Non ten permiso para editar esta páxina CSS xa que isto pode afectar a tódolos visitantes.",
+ "sitejsonprotected": "Non ten permiso para editar esta páxina JSON xa que isto pode afectar a tódolos visitantes.",
+ "sitejsprotected": "Non ten permiso para editar esta páxina JavaScript xa que isto pode afectar a tódolos visitantes.",
"mycustomcssprotected": "Non ten os permisos necesarios para editar esta páxina de CSS.",
"mycustomjsonprotected": "Non ten permisos para editar esta páxina JSON.",
"mycustomjsprotected": "Non ten os permisos necesarios para editar esta páxina de JavaScript.",
"redirect-file": "Nome de ficheiro",
"redirect-logid": "Identificador de rexistro",
"redirect-not-exists": "Non se atopou o valor",
+ "redirect-not-numeric": "Valor non numérico",
"fileduplicatesearch": "Procurar ficheiros duplicados",
"fileduplicatesearch-summary": "Procurar ficheiros duplicados a partir do valor de <i>hash</i> (un mecanismo de comprobación).",
"fileduplicatesearch-filename": "Nome do ficheiro:",
"edit-error-long": "Erros:\n\n$1",
"revid": "revisión $1",
"pageid": "identificador de páxina $1",
- "interfaceadmin-info": "$1\n\nOs permisos para editar os ficheiros CSS/JS/JSON separáronse recentemente do dereito <code>editinterface</code>. Se non comprende porqué está vendo este erro, vexa [[mw:MediaWiki_1.32/interface-admin]].",
+ "interfaceadmin-info": "$1\n\nOs permisos para editar os ficheiros CSS/JS/JSON globais separáronse recentemente do dereito <code>editinterface</code>. Se non comprende porqué está vendo este erro, vexa [[mw:MediaWiki_1.32/interface-admin]].",
"rawhtml-notallowed": "As marcas <html> non poden usarse fóra das páxinas normais.",
"gotointerwiki": "Deixando {{SITENAME}}",
"gotointerwiki-invalid": "O título especificado non é válido.",
"token_suffix_mismatch": "'''Dyyni Bearbeitig isch zruckgwise wore, wel Dyy Browser Zeiche im Bearbeite-Token verstimmlet het.\nS Spichere cha dr Inhalt vu dr Syte hii mache. Des git s e mänkmol, wänn eber e anonyme Proxy-Dienscht brucht, wu Fähler macht.'''",
"edit_form_incomplete": "'''Dr Inhalt vum Bearbeitigsformular isch nit vollständig zum Server chuu. Bitte prief Dyy Bearbeitigen uf Vollständigkeit un versuech s nomol.'''",
"editing": "Bearbeite vo «$1»",
- "creating": "Am Aalege vu „$1“",
+ "creating": "„$1“ aalege",
"editingsection": "Bearbeite vo «$1» (Absatz)",
"editingcomment": "Bearbeite vu $1 (Neje Abschnitt)",
"editconflict": "Bearbeitigs-Konflikt: «$1»",
"redirect-file": "שם קובץ",
"redirect-logid": "מזהה יומן",
"redirect-not-exists": "הערך לא נמצא",
+ "redirect-not-numeric": "הערך אינו מספרי",
"fileduplicatesearch": "חיפוש קבצים כפולים",
"fileduplicatesearch-summary": "חיפוש קבצים כפולים על בסיס ערכי הגיבוב שלהם.",
"fileduplicatesearch-filename": "קובץ:",
"filehist-comment": "Megjegyzés",
"imagelinks": "Fájlhasználat",
"linkstoimage": "Az alábbi {{PLURAL:$1|lap használja|lapok használják}} ezt a fájlt:",
- "linkstoimage-more": "Több mint $1 oldal használja ezt a fájlt.\nA következő lista csak az {{PLURAL:$1|első lapot mutatja, ami használja a képet|első $1 lapot mutatja, amelyek használják a képet}}.\nA teljes lista [[Special:WhatLinksHere/$2|ezen a lapon]] található meg.",
+ "linkstoimage-more": "Több mint $1 oldal használja ezt a fájlt.\nA következő lista csak a fájlt használó {{PLURAL:$1|első|első $1}} lapot mutatja.\nA teljes lista [[Special:WhatLinksHere/$2|ezen a lapon]] található meg.",
"nolinkstoimage": "Ezt a fájlt nem használja egyetlen lap sem.",
"morelinkstoimage": "[[Special:WhatLinksHere/$1|További hivatkozások]] megtekintése",
"linkstoimage-redirect": "$1 (fájlátirányítás) $2",
"confirm-rollback-top": "Visszavonod a változtatásokat?",
"confirm-mcrundo-title": "Egy változtatás visszavonva",
"mcrundofailed": "A visszavonás nem sikerült",
+ "mcrundo-missingparam": "Kötelező paraméterek hiányoznak a kérésből.",
"ellipsis": "…",
"quotation-marks": "„$1”",
"imgmultipageprev": "← előző oldal",
"edit-error-long": "Hibák:\n\n$1",
"revid": "$1 változat",
"pageid": "$1 lapazonosító",
+ "interfaceadmin-info": "$1\n\nA CSS/JS/JSON lapok szerkesztéséhez szükséges jogosultság a közelmúltban elválasztásra került a <code>editinterface</code> jogtól. Amennyiben nem érted, miért látod ezt az üzenetet, [[mw:MediaWiki_1.32/interface-admin|itt tudhatsz meg többet]].",
"rawhtml-notallowed": "<html> címkék nem használhatók normál lapokon kívül.",
"gotointerwiki": "{{SITENAME}} elhagyása",
"gotointerwiki-invalid": "A megadott cím érvénytelen.",
"tooltip-feed-atom": "Այս էջի Ատոմ սնուցումը",
"tooltip-t-contributions": "Դիտել {{GENDER:$1|այս մասնակցի}} ներդրումների ցանկը",
"tooltip-t-emailuser": "Ուղարկել էլ․ նամակ {{GENDER:$1|այս մասնակցին}}",
+ "tooltip-t-info": "Վիճակագրական տվյալներ էջի մասին",
"tooltip-t-upload": "Բեռնել ֆայլեր",
"tooltip-t-specialpages": "Բոլոր սպասարկող էջերի ցանկը",
"tooltip-t-print": "Այս էջի տպելու տարբերակ",
"customcssprotected": "Vu ne es permisita redaktar ita CSS pagino nam ol kontenas personal ajustaji di altra uzero.",
"customjsonprotected": "Vu ne havas permiso por redaktar ica pagino JSON pro ke ol kontenas personal ajustaji di altra uzero.",
"customjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino nam ol kontenas personal ajustaji di altra uzero.",
+ "sitecssprotected": "Vu ne havas permiso pri redaktar ica pagino CSS pro ol povus afektor omna viziteri.",
+ "sitejsonprotected": "Vu ne povas redaktar ica JSON (JavaScript Object Notation), pro ol povas afektar omna viziteri.",
"sitejsprotected": "Vu ne povas redaktar ica JavaScript, pro ol povas afektar omna viziteri.",
"mycustomcssprotected": "Vu ne es permisita redaktar ita CSS pagino.",
"mycustomjsonprotected": "Vu ne es permisita redaktar ita pagino JSON.",
"botpasswords-label-delete": "Efacar",
"botpasswords-label-resetpassword": "Sendez nova pasovorto per e-posto",
"botpasswords-label-grants": "Uzebla grantaji:",
+ "botpasswords-help-grants": "Permisas aceso al yuri quin vua uzero-konto ja havas. Permisar ulo hike furnisos nula altra aceso por altra yuri quin vua konto altramaniere ne havus. Videz la [[Special:ListGrants|tabelo pri permisi]] por plusa informi.",
"botpasswords-label-grants-column": "Permisita",
"botpasswords-bad-appid": "La nomo \"$1\" por la bot-programo esas nevalida.",
"botpasswords-insert-failed": "L'adjunto di nova nomo \"$1\" por la 'bot' faliis. Ka ol ja adjuntesis?",
+ "botpasswords-update-failed": "Ne povis rinomizar la 'bot' nomizita \"$1\". Kad ol efacesis?",
"botpasswords-created-title": "Kreita pasovorto por la 'bot'",
"botpasswords-created-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.",
"botpasswords-updated-title": "La pasovorto dil 'bot' aktualigesis",
"botpasswords-updated-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.",
"botpasswords-deleted-title": "La pasovorto por la 'bot' efacesis",
+ "botpasswords-deleted-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.",
+ "botpasswords-not-exist": "L'uzero \"$1\" ne havas pasovorto nomizita \"$2\" por lua 'bot'.",
+ "botpasswords-needs-reset": "La pasovorto por la 'bot' nomizita \"$1\" dal {{GENDER:$2|uzero}} \"$2\" mustas rikreesar.",
"resetpass_forbidden": "La pasovorti ne povas chanjesar",
"resetpass_forbidden-reason": "Pasovorti ne povas chanjesar: $1",
"resetpass-no-info": "Vu mustas enirar la konto por acesar ita pagino direte.",
"passwordreset": "Sendez nova pasovorto per e-posto",
"passwordreset-text-one": "Garnisez ica formulario por recevar provizora pasovorto per vua e-posto.",
"passwordreset-text-many": "{{PLURAL:$1|Skribez en un ek la texto-buxi por recevar tempala pasovorto per e-posto.}}",
+ "passwordreset-emaildisabled": "La funcioni di e-posto (e-mail) blokusesis en ica Wiki.",
"passwordreset-username": "Uzantonomo:",
"passwordreset-domain": "Interreto-domeno:",
"passwordreset-email": "E-postal adreso:",
"passwordreset-emailtitle": "Detali pri la konto en {{SITENAME}}",
"passwordreset-emailtext-ip": "Ulu (probable vu, de la IP-adresO $1) demandis la remplaso di la pasovorto por {{SITENAME}} ($4). La sequanta {{PLURAL:$3|konto|konti}} esas asociita kun ta adreso di e-posto:\n\n$2\n\nIca tempala {{PLURAL:$3| pasovorto|pasovorti}} perdos la valideso pos {{PLURAL:$5|un dio|$5 dii}}.\nTu mustas facar 'log in' e selektar nova pasovorto nemediate. Se altra persono facis ica demando, o se vu rimemoris l'antea pasovorto e ne pluse bezonas modifikor ol, vu povas ignorar ica mesajo e durar l'uzo dil antea pasovorto.",
+ "passwordreset-emailtext-user": "Ulu (posible vu, de la IP-adreso $1) demandis la remplaso di la pasovorto por {{SITENAME}} ($4). La sequanta {{PLURAL:$3|konto|konti}} esas asociita kun ta adreso di e-posto:\n\n$2\n\nIca tempala {{PLURAL:$3| pasovorto|pasovorti}} perdos la valideso pos {{PLURAL:$5|un dio|$5 dii}}.\nTu mustas facar 'log in' e selektar nova pasovorto nemediate. Se altra persono facis ica demando, o se vu rimemoris l'antea pasovorto e ne pluse bezonas modifikor ol, vu povas ignorar ica mesajo e durar l'uzo dil antea pasovorto.",
"passwordreset-emailelement": "Uzantonomo:\n$1\n\nProvizora pasovorto:\n$2",
"passwordreset-emailsentemail": "Se ica e-posto esas asociita kun vua konto, do la nova pasovorto sendesos a vu per e-posto.",
+ "passwordreset-emailsentusername": "Se ica e-posto esas asociita kun vua konto, do la nova pasovorto sendesos a vu per e-posto.",
"passwordreset-nocaller": "Ula demandero mustas furnisesar",
"passwordreset-nosuchcaller": "La demandero ne existas: $1",
"passwordreset-invalidemail": "Ne-valida e-posto-adreso",
"noarticletext-nopermission": "Til nun ne existas texto en ica pagino.\nVu povas [[Special:Search/{{PAGENAME}}|serchar ica titulo]] en altra pagini, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchar en la relata registri], o [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktar ica pagino]</span>, tamen vu ne havas permiso por krear ica pagino.",
"userpage-userdoesnotexist": "Uzeronomo \"$1\" ne registragesis.\nVoluntez konfirmar se vu volas krear/redaktar ica pagino.",
"userpage-userdoesnotexist-view": "L'uzeronomo \"$1\" ne enrejistresis.",
+ "blocked-notice-logextract": "Ica uzero nun esas blokusita.\nLa lasta protokolo pri blokuso esas videbla adinfre, por refero:",
"clearyourcache": "<strong>Atencez:</strong> Pos registragar, vu probable mustas renovigar la tempala-magazino di vua navigilo por vidar la chanji.\n* <strong>Firefox / Safari:</strong>Tenez <em>Shift</em> kliktante <em>Reload</em>, o presez sive <em>Ctrl-F5</em> sive <em>Ctrl-R</em> (<em>⌘-R</em> ye Mac);\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> en komputeri Mac)\n* <strong>Internet Explorer:</strong> Tenez <em>Ctrl</em> kliktante <em>Refresh</em>, o presez <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Irez a <em>Menu → Settings</em> (<em>Opera → Preferences</em> ye komputeri Mac) e pose a <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+ "usercssyoucanpreview": "<strong>Sugestajo:</strong> Uzez la butono \"{{int:showpreview}}\" por probar vua nova stilo CSS ante konservar ol.",
+ "userjsonyoucanpreview": "<strong>Sugestajo:</strong> Uzes la butono \"{{int:showpreview}}\" por provar vua nova JSON ante konservar ol.",
+ "userjsyoucanpreview": "<strong>Sugestajo:</strong> Uzes la butono \"{{int:showpreview}}\" por probar vua JavaScript ante konservar ol.",
"usercsspreview": "'''Memorez ke vu nur previdas vua uzero-CSS.'''\n'''Ol ne registragesis ankore!'''",
+ "userjsonpreview": "<strong>Memorez ke vu nur previdas vua JSON (JavaScript Object Notation). Ol ankore ne konservesis!</strong>",
"userjspreview": "'''Memorez ke vu nur previdas vua JavaScript di uzero. Ol ne registragesis ankore!'''",
+ "sitecsspreview": "<strong>Memorez ke vu nur previdas vua uzero-CSS. Ol ankore ne konservesis!</strong>",
"updated": "(Aktualigita)",
"note": "'''Noto:'''",
"previewnote": "<strong>Atencez ke ico esas nur prevido.</strong> Ol ne registragesis ankore!",
"autosumm-blank": "Pagino vakuigesis",
"autosumm-replace": "Kontenajo remplasigesis kun '$1'",
"autoredircomment": "Ridirektas a [[$1]]",
+ "autosumm-changed-redirect-target": "Chanjis la ridirektilo de [[$1]] a [[$2]]",
"autosumm-new": "Pagino kreesis kun '$1'",
"autosumm-newblank": "Kreita vakua pagino",
"watchlistedit-normal-title": "Modifikez surveyo-listo",
"redirect-file": "Nome del file",
"redirect-logid": "ID registro",
"redirect-not-exists": "Valore non trovato",
+ "redirect-not-numeric": "Valore non numerico",
"fileduplicatesearch": "Ricerca dei file duplicati",
"fileduplicatesearch-summary": "Ricerca di eventuali duplicati del file in base al valore di ''hash''.",
"fileduplicatesearch-filename": "Nome del file:",
"Yusuke1109",
"Afaz",
"Oxbqskeptzwizkgdcxakhnrb",
- "Suyama"
+ "Suyama",
+ "고솜"
]
},
"tog-underline": "リンクの下線:",
"apisandbox-dynamic-parameters-add-label": "引数の追加",
"apisandbox-dynamic-parameters-add-placeholder": "引数名",
"apisandbox-dynamic-error-exists": "引数名 \"$1\" は既に存在しています。",
+ "apisandbox-templated-parameter-reason": "この[[Special:ApiHelp/main#main/templatedparams|テンプレートパラメータ]]は、$2の{{PLURAL:$1|値}}に基づいて提供されます。",
"apisandbox-deprecated-parameters": "廃止予定の引数",
"apisandbox-fetch-token": "トークンを自動入力します",
"apisandbox-add-multi": "追加",
"redirect-file": "ファイル名",
"redirect-logid": "記録 ID",
"redirect-not-exists": "値が見つかりません",
+ "redirect-not-numeric": "値が数字ではありません",
"fileduplicatesearch": "重複ファイルの検索",
"fileduplicatesearch-summary": "重複ファイルをハッシュ値に基づいて検索します。",
"fileduplicatesearch-filename": "ファイル名:",
"limitreport-expensivefunctioncount-value": "$1/$2",
"limitreport-unstrip-depth": "\"unstrip\" を再帰的に実行する回数",
"limitreport-unstrip-depth-value": "$1/$2",
+ "limitreport-unstrip-size": "展開後読み込み量を解除する",
"limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|バイト}}",
"expandtemplates": "テンプレートを展開",
"expand_templates_intro": "この特別ページは、入力したウィキテキストに含まれるすべてのテンプレートを再帰的に展開します。\n<code><nowiki>{{</nowiki>#language:…}}</code> のようなパーサー関数や、\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> のような変数も展開します。\nつまり、二重中括弧で囲まれたものほぼすべてを展開します。",
"undelete-cantedit": "このページを編集する許可がないため復元できません。",
"undelete-cantcreate": "同名のページが存在せず、このページを作成する許可がないため復元できません。",
"pagedata-title": "ページ・データ",
+ "pagedata-text": "このページは、ページへのデータインターフェースを提供します。サブページの構文を使用して、URLにページタイトルを入力してください。\n* コンテンツのネゴシエーションは、クライアントのAcceptヘッダーに基づいて適用されます。つまり、ページデータはクライアントが優先する形式で提供されます。",
"pagedata-not-acceptable": "該当する形式が見つかりません。対応している MIME タイプ: $1",
"pagedata-bad-title": "「$1」は無効なページ名です。",
"unregistered-user-config": "セキュリティ上の理由から、JavaScript、CSSおよびJSONの利用者サブページは、登録されていない利用者に対しては読み込みできません。",
"passwordpolicies-policy-passwordcannotmatchusername": "パスワードは利用者名と同じにすることはできません",
"passwordpolicies-policy-passwordcannotmatchblacklist": "パスワードは、特にブラックリストに載っているものと一致するものは設定できません",
"passwordpolicies-policy-maximalpasswordlength": "パスワードは$1{{PLURAL:$1|文字}}以下でなければなりません",
- "passwordpolicies-policy-passwordcannotbepopular": "パスワードは{{PLURAL:$1|一般的なものにすることはできません|一般的な$1個のパスワードのリストと一致するものにすることはできません}}"
+ "passwordpolicies-policy-passwordcannotbepopular": "パスワードは{{PLURAL:$1|一般的なものにすることはできません|一般的な$1個のパスワードのリストと一致するものにすることはできません}}",
+ "easydeflate-invaliddeflate": "提供されたコンテンツが適切に圧縮されていません"
}
"tog-watchmoves": "Wuwuh kaca lan barkas lih-lihanku menyang pawawanganku",
"tog-watchdeletion": "Wuwuh kaca lan barkas busakanku menyang pawawanganku",
"tog-watchuploads": "Wuwuh barkas anyar unggahanku menyang pawawanganku",
- "tog-watchrollback": "Wuwuh kaca sing takpulihaké menyang pawawanganku",
+ "tog-watchrollback": "Wuwuh kaca kang dakpulihaké menyang pawawanganku",
"tog-minordefault": "Tengeri kabèh besutan minangka besutan cilik sacara baku",
"tog-previewontop": "Deleng pratuduh sadurungé mbesut kothak",
"tog-previewonfirst": "Delelng pratuduh nalika mbesut pisanan",
"tog-watchlisthidecategorization": "Dhelikaké kategorisasi kaca",
"tog-ccmeonemails": "Kirimi aku turunan layang-èl sing takkirim menyang wong liya",
"tog-diffonly": "Aja tuduhaké isiné kaca sangisoré bédané besutan",
- "tog-showhiddencats": "Tuduhaké kategori sing didhelikaké",
+ "tog-showhiddencats": "Tuduhaké kategori kang ndhelik",
"tog-norollbackdiff": "Aja tuduhaké béda sawisé ngayahi bebalèn",
"tog-useeditwarning": "Élingaké kula yèn ninggal kaca besutan sadurungé nyimpen",
"tog-prefershttps": "Tansah nganggo sambungan sing aman nalika mlebu log",
"index-category": "Kaca kaindhèks",
"noindex-category": "Kaca ora kaindhèks",
"broken-file-category": "Kaca mawa pranala barkas rusak",
+ "categoryviewer-pagedlinks": "($1) ($2)",
+ "category-header-numerals": "$1–$2",
"about": "Bab",
"article": "Kaca isi",
"newwindow": "(buka mawa jendhéla anyar)",
"versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
"versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
"ok": "Oké",
+ "pagetitle": "$1 - {{SITENAME}}",
+ "pagetitle-view-mainpage": "{{SITENAME}}",
+ "backlinksubtitle": "← $1",
"retrievedfrom": "Dijupuk saka \"$1\"",
"youhavenewmessages": "{{PLURAL:$3|Panjenengan duwé}} $1 ($2).",
"youhavenewmessagesfromusers": "{{PLURAL:$4|Panjenengan duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
"site-atom-feed": "Lebon atom $1",
"page-rss-feed": "\"$1\" ''RSS Feed''",
"page-atom-feed": "Pakan atom \"$1\"",
+ "feed-atom": "Atom",
"red-link-title": "$1 (kaca ora ana)",
"sort-descending": "Urutaké medhun",
"sort-ascending": "Urutaké munggah",
"readonly": "Umpak data kagembok",
"enterlockreason": "Isi alesan ngreksa, kalebu rencana kapan pareksané bakal dibukak",
"readonlytext": "Juru administrasi sistem sing ngunci iku medhar mangkéné: $1",
- "missing-article": "Basis data ora bisa nemokaké tèks kaca sing kuduné ana, yaiku \"$1\" $2.\nBab iki bisasané disebabaké déning pranala daluwarsa menyang revisi sadurungé kaca sing wis dibusak.\nYèn dudu iki panyebabé, panjenengan manawa bisa nemokaké kasalahan (''bug'') jroning piranti alus (''software''). Mangga dilapuraké bab iki menyang [[Special:ListUsers/sysop|administrator]], kanthi nyebutaké alamat URL sing dituju",
+ "missing-article": "Basish dhatahé ora bisa nemokaké tulisan ing siji kaca kang kuduné ana, ya iku \"$1\" $2.\n\nMasalah iki sok ana amarga panjenengan ngeklik pranala sajarah kang lawas ing kaca kang wis kabusek.\n\nManawa ora amarga iku, panjenengan bokmanawa nemu ama ing piranti alusé.\nSumangga lapuraké ama mau menyang [[Special:ListUsers/sysop|pangurus]], kanthi nulisaké URL-é.",
"missingarticle-rev": "(owahan#: $1)",
"missingarticle-diff": "(Béda: $1, $2)",
"readonly_lag": "Database wis dikunci mawa otomatis sawetara database sékundhèr lagi nglakoni sinkronisasi mawa database utama",
"delete-hook-aborted": "Pambusakan dibatalaké déning ''hook''.\nOra ana alesané.",
"no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
"badtitle": "Sesirah ala",
- "badtitletext": "Sesirahing kaca sing disuwun ora trep, kosong, utawa salah nggayut menyang sesirah antarabasa utawa antarawiki.\nMungkin tulisané ngandhut pralambang cacah siji utawa luwih sing ora kena dianggo tumraping sesirah.",
- "title-invalid-empty": "Sesirah kaca sing dikarepaké kosong utawa mung ngemu jenengé mandala-aran.",
- "title-invalid-utf8": "Sesirah kaca sing dikarepaké ngemu reroncèn UTF-8 sing ora sah.",
- "title-invalid-interwiki": "Sesirah kaca sing dikarepaké ngemu pranala interwiki sing ora bisa dicakaké dadi sesirah",
+ "badtitletext": "Sesirah kaca kang panjenengan suwun ora trep, kosong, utawa salah nggayut menyang sesirah antarabasa utawa antarawiki.\nTulisané bokmanawa ngemu karakter kang ora kena kaanggo ing sesirah.",
+ "title-invalid-empty": "Sesirah kaca kang panjenengan karsakaké kosong utawa mung ngemu jenengé mandala aran.",
+ "title-invalid-utf8": "Sesirah kaca kang panjenengan karsakaké ngemu reroncèn UTF-8 kang ora trep.",
+ "title-invalid-interwiki": "Sesirah kaca kang panjenengan karsakaké ngemu pranala interwiki kang ora bisa katrapaké ing sesirah.",
"title-invalid-talk-namespace": "Sesirah kaca kang dikarepaké ngener ing kaca parembugan kang ora ana.",
- "title-invalid-characters": "Sesirah kaca sing dikarepaké ngemu karakter sing ora sah: \"$1\".",
+ "title-invalid-characters": "Sesirah kaca kang panjenengan karsakaké ngemu karakter kang ora trep: \"$1\".",
"title-invalid-relative": "Sesirah ngemu alamat rélatif. Sesirah kaca relatif (./, ../) iku ora sah amarga ora bisa ditekani lumantar pangluru.",
- "title-invalid-magic-tilde": "Sesirah kaca sing dikarepaké ngemu reroncèn tilda (<nowiki>~~~</nowiki>) sing ora sah.",
- "title-invalid-too-long": "Sesirah kaca sing dikarepaké kedawan. Kuduné ora munjuli $1 bèt sarana kodhé UTF-8.",
- "title-invalid-leading-colon": "Sesirah kaca sing dikarepaké ngemu titik loro sing ora sah ing ngarepé.",
+ "title-invalid-magic-tilde": "Sesirah kaca kang panjenengan karsakaké ngemu reroncèn tildhe (<nowiki>~~~</nowiki>) kang ora trep.",
+ "title-invalid-too-long": "Sesirah kaca kang panjenengan karsakaké kedawan. Sesirahé ora kena munjuli {{PLURAL:$1|bèt|bèt}} ing pangodhe UTF-8.",
+ "title-invalid-leading-colon": "Sesirah kaca kang panjenengan karsakaké ngemu titik loro kang ora trep ing arepé.",
"perfcached": "Dhata ing ngisor iki kasimpen ing telih lan mungkin durung dianyari. Paling akèh ana {{PLURAL:$1|sakasil|$1 kasil}} ing telih iku.",
"perfcachedts": "Dhata ing ngisor iki kasimpen ing telih, lan pungkasan dianyari $1. Paling akèh ana {{PLURAL:$4|sakasil|$4 kasil}} ing telih iku.",
"querypage-no-updates": "Update saka kaca iki lagi dipatèni. Data sing ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.",
"viewsourcetext": "Panjenengan bisa ndeleng lan nurun sumberé kaca iki.",
"viewyourtext": "Panjenengan bisa ndeleng lan nurun sumberé <strong>besutané panjenengan</strong> menyang kaca iki.",
"protectedinterface": "Kaca iki isiné tèks antarmuka sing dienggo software lan wis dikunci kanggo menghindari kasalahan.",
- "editinginterface": "<strong>Pélik:</strong> Panjenengan lagi mbesut kaca sing kanggo ngisèni tèks mukantarané piranti alus.\nOwahan tumrap kaca iki bakal mrabawani cakriké mukantarané panganggo liya ing wiki iki.",
+ "editinginterface": "<strong>Pepéling:</strong> Panjenengan lagi mbesut kaca kang ngemu tulisan kanggo mukantarané piranti alus.\nNgowahi kaca iki bakal mrabawani cakrik mukantarané panganggo liya ing wiki iki.",
"translateinterface": "Saperlu nambah utawa ngowah pertalan tumrap kabèh wiki, mangga anggoa [https://translatewiki.net/ translatewiki.net] minangka proyèk panglokaling MediaWiki.",
"cascadeprotected": "Kaca iki wis direksa saka besutan amarga katransklusi ing {{PLURAL:$1|kaca, sing|kaca-kaca, sing}} kareksa mawa pilihan \"runut\" murub:\n$2",
"namespaceprotected": "Panjenengan ora duwé idin kanggo mbesut kaca ing mandala aran <strong>$1</strong>.",
"createacct-benefit-heading": "{{SITENAME}} digawé déning wong-wong kaya panjenengan.",
"createacct-benefit-body1": "{{PLURAL:$1|besutan}}",
"createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
- "createacct-benefit-body3": "{{PLURAL:$1|sing nyumbang}} mentas waé",
+ "createacct-benefit-body3": "{{PLURAL:$1|kang nyumbang}} mentas waé",
"badretype": "Tembung wadi sing panjenengan isèkaké ora gathuk.",
"usernameinprogress": "Panggawéning akun tumrap jeneng panganggo iki tembé lumaku.\nEntèni sadhéla.",
"userexists": "Jeneng panganggo sing dilebokaké lagi dianggo.\nMangga pilih jeneng liya.",
"botpasswords-existing": "Tembung wadiné bot sing cumepak",
"botpasswords-createnew": "Gawé anyar tembung wadiné bot",
"botpasswords-editexisting": "Besut tembung wadiné bot sing anyar",
+ "botpasswords-label-needsreset": "(tembung wadi kudu panjenengan ambali setèl)",
"botpasswords-label-appid": "Jeneng bot:",
"botpasswords-label-create": "Gawé",
"botpasswords-label-update": "Anyari",
"savechanges": "Simpen owahan",
"publishpage": "Babar kaca",
"publishchanges": "Babar owahan",
+ "savearticle-start": "Simpen kaca...",
+ "savechanges-start": "Simpen owahan...",
+ "publishpage-start": "Babar kaca...",
"publishchanges-start": "Babar owahan...",
"preview": "Pratuduh",
"showpreview": "Deleng pratuduh",
"missingsummary": "<strong>Pangéling-éling:</strong> Panjenengan ora ngisèni ringkesané besutan.\nManawa panjenengan mencèt \"$1\" manèh, besutané panjengan bakal kasimpen tanpa katerangan.",
"selfredirect": "<strong>Pepéling:</strong> Panjenengan ngalih kaca iki menyang kaca iki dhéwé.\nPanjenengan mungkin salah wènèh paraning alihan utawa salah mbesut kaca.\nYèn panjenengan ngeklik \"$1\" manèh, kaca alihan bakal digawé.",
"missingcommenttext": "Mangga awèh tanggepan.",
- "missingcommentheader": "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.\nYèn Sampéyan klik \"$1\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
+ "missingcommentheader": "<strong>Pangéling-éling:</strong> Panjenengan durung mènèhi subyèk tumrap tanggapan iki.\nManawa panjenengan ngeklik \"$1\" manèh, besutané panjenengan bakal kasimpen tanpa subyèk.",
"summary-preview": "Pratuduh ringkesan besutan:",
"subject-preview": "Pratuduh jejer:",
"previewerrortext": "Ana masalah nalika njajal mratuduhaké owahané panjenengan.",
"semiprotectedpagewarning": "<strong>Cathetan:</strong> Kaca iki pinuju direksa, mula mung panganggo sing kadhaftar sing bisa mbesut.\nÈntri log pungkasan cumepak ana ing ngisor kanggo rujukan:",
"cascadeprotectedwarning": "<strong>Pènget:</strong> Kaca iki wis direksa saéngga mung panganggo kanthi hak pangurus waé sing bisa mbesut amarga kaca iki katranklusi ing {{PLURAL:$1|kaca|kaca-kaca}} sing kareksa runut ngisor iki:",
"titleprotectedwarning": "'''Pènget: Kaca iki wis dikunci saéngga perlu [[Special:ListGroupRights|hak mligi]] kanggo gawéné.'''\nEntri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
- "templatesused": "{{PLURAL:$1|Cithakan}} sing dienggo ing kaca iki:",
- "templatesusedpreview": "{{PLURAL:$1|Cithakan}} sing dienggo ing pratuduh iki:",
- "templatesusedsection": "{{PLURAL:$1|Cithakan}} sing dienggo ding bagian iki:",
+ "templatesused": "{{PLURAL:$1|Cithakan}} kang kaanggo ing kaca iki:",
+ "templatesusedpreview": "{{PLURAL:$1|Cithakan}} kang kaanggo ing pratuduh iki:",
+ "templatesusedsection": "{{PLURAL:$1|Cithakan}} kang kaanggo ing pérangan iki:",
"template-protected": "(kareksa)",
"template-semiprotected": "(semu kareksa)",
"hiddencategories": "Kaca iki anggotaning {{PLURAL:$1|1 kategori wadi|$1 kategori wadi}}:",
"edittools": "<!-- Tèks ing ngisor iki bakal ditudhuhaké ing ngisoring isènan suntingan lan pangemotan.-->",
+ "edittools-upload": "-",
"nocreatetext": "{{SITENAME}} matesi bisané panjenengan nggawé kaca anyar.\nPanjenengan bisa bali lan mbesut kaca sing ana, utawa [[Special:UserLogin|mlebu log utawa nggawé akun]].",
"nocreate-loggedin": "Panjenengan ora kagungan idin kanggo nggawé kaca anyar.",
"sectioneditnotsupported-title": "Panyuntingan bagéyan ora kasengkuyungan",
"content-model-text": "tulisan barès",
"content-model-javascript": "JavaScript",
"content-model-css": "CSS",
+ "content-model-json": "JSON",
"expensive-parserfunction-warning": "Pènget: Kaca iki ngandhut kakèhan panggunan fungsi ''parser'' sing larang.\n\nSajatiné kuduné duwé kurang saka {{PLURAL:$2|panggilan|panggilan}}, saiki ana {{PLURAL:$1|$1 panggilan|$1 panggilan}}.",
"expensive-parserfunction-category": "Kaca-kaca mawa panggunan fungsi ''parser'' sing kakèhan",
"post-expand-template-inclusion-warning": "Pènget: Cithakan klebu ukurané kegedhèn.\nSawetara cithakan bakal dilirwakaké.",
- "post-expand-template-inclusion-category": "Kaca-kaca kanthi cithakan klebu ukuran sing ngluwihi wates",
+ "post-expand-template-inclusion-category": "Kaca mawa ukuran cithakan kang munjuli wates",
"post-expand-template-argument-warning": "Pènget: Kaca iki ngandhut saora-orané siji argumen cithakan kanthi ukuran èkspansi sing kegedhèn. Argumèn-argumèn kasebut wis dilirwakaké.",
- "post-expand-template-argument-category": "Kaca-kaca kanthi argumèn cithakan sing dilirwakaké",
+ "post-expand-template-argument-category": "Kaca mawa argumèn cithakan kang kabusek",
"parser-template-loop-warning": "Ana ''loop'' cithakan: [[$1]]",
"parser-template-recursion-depth-warning": "Wates ''recursion depth'' cithakan wis ngliwati ($1)",
"language-converter-depth-warning": "Wates jeroné pangganti basa wis kapunjulen ($1)",
"revisiondelete": "Busak/wurung busak révisi",
"revdelete-nooldid-title": "Révisi tujuan ora trep",
"revdelete-nooldid-text": "Panjenengan durung mènèhi target revisi kanggo nglakoni fungsi iki.",
- "revdelete-no-file": "Barkas sing dipéngini ora ana.",
+ "revdelete-no-file": "Barkas kang panjenengan karsakaké ora ana.",
"revdelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi sing wis kabusak saka berkas \"<nowiki>$1</nowiki>\" ing $2, jam $3?",
"revdelete-show-file-submit": "Iya",
"logdelete-selected": "{{PLURAL:$1|Log kapilih|Log kapilih}} kanggo:",
"difference-title-multipage": "Béda antarané kaca \"$1\" lan \"$2\"",
"difference-multipage": "(Prabédhan antar kaca)",
"lineno": "Larik $1:",
- "compareselectedversions": "Bandhingaké révisi sing kapilih",
+ "compareselectedversions": "Bandhingaké révisi kang panjenengan pilih",
"showhideselectedversions": "Tampilaké/dhelikaké révisi kapilih",
"editundo": "wurung",
"diff-empty": "(Ora ana béda)",
"diff-multi-manyusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|panganggo|panganggo}} $2 ora katuduhaké)",
"difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
"searchresults": "Kasiling golèk",
+ "search-filter-title-prefix-reset": "Golèk kabèh kaca",
"searchresults-title": "Kasiling golèk \"$1\"",
"titlematches": "Sesirah kaca cocog",
"textmatches": "Tèks artikel sing cocog",
"search-section": "(pérangan $1)",
"search-category": "(kategori $1)",
"search-file-match": "(cocog karo isi barkas)",
- "search-suggest": "Apa sing panjenengan karepaké iki: $1",
+ "search-suggest": "Apa kang panjenengan karsakaké iki: $1",
"search-rewritten": "Tuduhaké kasilé $1, nanging golèkaké $2.",
"search-interwiki-caption": "Kasil saka proyèk-proyèk sababon",
"search-interwiki-default": "Wohing panggolèk $1:",
"prefs-editwatchlist-clear": "Resiki pawawanganing sampéyan",
"prefs-watchlist-days": "Cacahé dina sing dituduhaké ing dhaftar pangawasan:",
"prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dina|dina}}",
- "prefs-watchlist-edits": "Cacahé suntingan maksimum sing dituduhaké ing dhaftar pangawasan sing luwih jangkep:",
+ "prefs-watchlist-edits": "Cacah maksimum owahan kang kapacak ing pawawangan:",
"prefs-watchlist-edits-max": "Gunggung maksimum: 1000",
"prefs-watchlist-token": "Tokening pawawangan:",
"prefs-misc": "Liya-liya",
"youremail": "Layang-èl:",
"username": "{{GENDER:$1|Jeneng panganggo}}:",
"prefs-memberingroups": "{{GENDER:$2|Anggota}} saka {{PLURAL:$1|golongan}}:",
+ "prefs-memberingroups-type": "$1",
"group-membership-link-with-expiry": "$1 (tekan $2)",
"prefs-registration": "Wektu régistrasi:",
+ "prefs-registration-date-time": "$1",
"yourrealname": "Jeneng asli:",
"yourlanguage": "Basa sing dianggo:",
"yourvariant": "Werna basa isi:",
"saveusergroups": "Simpen golongan {{GENDER:$1|panganggo}}",
"userrights-groupsmember": "Anggota saka:",
"userrights-groupsmember-auto": "Anggota implisit saka:",
+ "userrights-groupsmember-type": "$1",
"userrights-groups-help": "Panjenengan bisa ngowahi grup-grup sing ana panganggoné iki.\n* Kothak sing dicenthang tegesé panganggo iki ana sajroné grup iku.\n* Kothak sing ora dicenthang tegesé panganggo iku ora ana ing grup iku.\n* Tandha bintang * tegesé panjenengan ora bisa ngilangi grup iku yèn wis tau nambah, utawa sawalikané.",
"userrights-reason": "Alesan:",
"userrights-no-interwiki": "Panjenengan ora ana hak kanggo ngowahi hak panganggo ing wiki liyané.",
"userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
"userrights-changeable-col": "Grup sing bisa panjenengan owahi",
"userrights-unchangeable-col": "Grup sing ora bisa diowahi panjenengan",
+ "userrights-irreversible-marker": "$1*",
+ "userrights-no-shorten-expiry-marker": "$1#",
"userrights-expiry-current": "Kadaluwarsa $1",
"userrights-expiry-none": "Ora kadaluwarsa",
"userrights-expiry": "Kadaluwarsa:",
"right-deleterevision": "Busak lan wurung busak owahan tinamtuné kaca",
"right-deletedhistory": "Ndeleng sajarah èntri-èntri kabusak, tanpa bisa ndeleng apa sing dibusak",
"right-deletedtext": "Deleng tèks sing dibusak lan owah-owahan antarané révisi sing dibusak",
- "right-browsearchive": "Golèk kaca-kaca sing wis dibusak",
+ "right-browsearchive": "Golèk kaca kang wis kabusek",
"right-undelete": "Wurung busak kaca",
"right-suppressrevision": "Deleng, dhelikaké, lan wurung dhelikaké owahan tinamtu kaca-kacané panganggo sembarang",
"right-viewsuppressed": "Deleng owahan sing didhelikaké saka panganggo sembarang",
"right-hideuser": "Blokir jeneng panganggo, lan delikna saka umum",
"right-ipblock-exempt": "Bypass pamblokiran IP, pamblokiran otomatis lan pamblokiran rangkéan",
"right-unblockself": "Bukak blokirané dhéwéké",
- "right-protect": "Owahi tataran rereksan lan besut kaca sing direksa-runtun",
- "right-editprotected": "Besut kaca sing direksa kanthi \"{{int:protect-level-sysop}}\"",
- "right-editsemiprotected": "Owah kaca-kaca sing direksa dadi \"{{int:protect-level-autoconfirmed}}\"",
+ "right-protect": "Owahi tataran rereksan lan besut kaca kang direksa-runtun",
+ "right-editprotected": "Besut kaca kang kareksa \"{{int:protect-level-sysop}}\"",
+ "right-editsemiprotected": "Owah kaca kang kareksa \"{{int:protect-level-autoconfirmed}}\"",
"right-editcontentmodel": "Besut modhèl kontèn kaca",
"right-editinterface": "Besut antarmuka panganggo",
"right-editusercss": "Besut barkas-barkas CSS panganggo liya",
"right-patrol": "Tandhani besutané wong liya yèn wis kapriksa",
"right-autopatrol": "Gawé supaya suntingan-suntingan ditandhani minangka wis dipatroli",
"right-patrolmarks": "Ndeleng tandha-tandha patroli owah-owahan anyar",
- "right-unwatchedpages": "Tuduhna daftar kaca-kaca sing ora diawasi",
+ "right-unwatchedpages": "Deleng pratélan kaca kang ora ingawasan",
"right-mergehistory": "Gabung sajarah kaca",
"right-userrights": "Besut kabèh hak panganggo",
"right-userrights-interwiki": "Besut hak-haking panganggo asal wiki jaba",
"grant-editmycssjs": "Besut CSS/JavaScript panganggomu",
"grant-editmyoptions": "Besut préferènsi panganggomu",
"grant-editmywatchlist": "Besut pawawangané panjenengan",
- "grant-editpage": "Besut kaca sing ana",
- "grant-editprotected": "Besut kaca sing direksa",
+ "grant-editpage": "Besut kaca kang ana",
+ "grant-editprotected": "Besut kaca kang kareksa",
"grant-highvolume": "Besutan gedhi",
"grant-oversight": "Dhelikaké panganggo dalah révisiné",
"grant-patrol": "Awasi owahané kaca",
"grant-uploadeditmovefile": "Unggah, ganti, lan lih barkas",
"grant-uploadfile": "Unggah barkas anyar",
"grant-basic": "Hak pokok",
- "grant-viewdeleted": "Deleng barkas lan kaca sing dibusak",
+ "grant-viewdeleted": "Deleng barkas lan kaca kang kabusek",
"grant-viewmywatchlist": "Deleng pawawangané panjenengan",
"grant-viewrestrictedlogs": "Deleng isian log sing winates",
"newuserlogpage": "Log panganggo anyar",
"action-deletelogentry": "busak isian log",
"action-deletedhistory": "deleng sajarah sing dibusak sawijiné kaca",
"action-deletedtext": "deleng tèks révisi sing dibusak",
- "action-browsearchive": "nggolèki kaca-kaca sing wis dibusak",
+ "action-browsearchive": "golèk kaca kang wis kabusek",
"action-undelete": "wurung busak kaca",
"action-suppressrevision": "tinjo lan balèkaké révisi sing didhelikaké",
"action-suppressionlog": "deleng log priangga iki",
"action-importupload": "impor kaca iki saka pamunggahan berkas",
"action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
"action-autopatrol": "nandhani besutané panjenengan dhéwé yèn wis kapriksa",
- "action-unwatchedpages": "deleng pratélan kaca sing ingawasan",
+ "action-unwatchedpages": "deleng pratélan kaca kang ingawasan",
"action-mergehistory": "nggabungaké sajarah kaca iki",
"action-userrights": "besut kabèh hak panganggo",
"action-userrights-interwiki": "besut hak aksès panganggo ing wiki liyané",
"action-deletechangetags": "busak tag saka sasana dhata",
"action-purge": "buwang kaca iki",
"nchanges": "$1 {{PLURAL:$1|pangowahan|owah-owahan}}",
+ "ntimes": "$1×",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|saka keri dhewe mrene}}",
"enhancedrc-history": "sajarah",
"recentchanges": "Owahan-owahan anyar",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga delengen [[Special:NewPages|pratélané kaca-kaca anyar]])",
"recentchanges-legend-plusminus": "(''±123'')",
"recentchanges-submit": "Tuduhaké",
+ "rcfilters-tag-remove": "Busek '$1'",
"rcfilters-legend-heading": "<strong>Pratélané cekakan:</strong>",
"rcfilters-other-review-tools": "Piranti pamriksa liyané",
"rcfilters-group-results-by-page": "Golongaké kasilé miturut kacané",
"rcfilters-activefilters": "Saringan murub",
+ "rcfilters-activefilters-hide": "Dhelikaké",
+ "rcfilters-activefilters-show": "Tuduhaké",
"rcfilters-advancedfilters": "Saringan lanjutan",
"rcfilters-limit-title": "Kasil kang arep dituduhaké",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|owahan|owahan}}, $2",
+ "rcfilters-date-popup-title": "Dawané wektu kang arep panjenengan golèki",
"rcfilters-days-title": "Dina-dina sing mentas waé",
"rcfilters-hours-title": "Jam-jam sing mentas waé",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|dina|dina}}",
+ "rcfilters-days-show-hours": "$1 {{PLURAL:$1|jam|jam}}",
+ "rcfilters-highlighted-filters-list": "Kasuwur: $1",
"rcfilters-quickfilters": "Saringan sumimpen",
"rcfilters-quickfilters-placeholder-title": "Durung ana saringan kang kasimpen",
"rcfilters-quickfilters-placeholder-description": "Saperlu nyimpen setèlaning saringan lan nganggo setèlan iku manèh ing tembé, kliken ikon markah buku ing babagan Saringan Murub ing ngisor.",
"rcfilters-savedqueries-unsetdefault": "Wutung ndadèkaké baku",
"rcfilters-savedqueries-remove": "Busak",
"rcfilters-savedqueries-new-name-label": "Jeneng",
+ "rcfilters-savedqueries-new-name-placeholder": "Wedharaké ancasé saringané",
"rcfilters-savedqueries-apply-label": "Gawé saringan",
+ "rcfilters-savedqueries-apply-and-setdefault-label": "Gawé saringan baku",
"rcfilters-savedqueries-cancel-label": "Wurung",
"rcfilters-savedqueries-add-new-title": "Simpen setèlané saringan sing saiki",
+ "rcfilters-savedqueries-already-saved": "Saringan iki wis kasimpen. Ganti setèlané panjenengan saperlu nggawé Saringan Kasimpen kang anyar.",
"rcfilters-restore-default-filters": "Pulihaké saringan gawan",
"rcfilters-clear-all-filters": "Resiki kabèh saringan",
+ "rcfilters-show-new-changes": "Deleng owah-owahan anyar dhéwé",
"rcfilters-search-placeholder": "Owah-owahan saringan (anggo menu utawa golèk jeneng saringan)",
"rcfilters-invalid-filter": "Saringan ora sah",
"rcfilters-empty-filter": "Ora ana saringan sing aktif. Kabèh sumbangan katuduhaké.",
"rcfilters-filter-editsbyself-description": "Pisumbangé panjenengan dhéwé.",
"rcfilters-filter-editsbyother-label": "Owah-owahané liyan",
"rcfilters-filter-editsbyother-description": "Kabèh owahan kajaba duwèké panjenengan.",
- "rcfilters-filtergroup-userExpLevel": "Tataran pangalaman (mung kanggo panganggo kadhaftar)",
+ "rcfilters-filtergroup-userExpLevel": "Pandhaftaran lan pangalaman pangguna",
"rcfilters-filter-user-experience-level-registered-label": "Kadhaftar",
- "rcfilters-filter-user-experience-level-registered-description": "Pambesut sing mlebu log.",
+ "rcfilters-filter-user-experience-level-registered-description": "Pambesut kang mlebu log.",
"rcfilters-filter-user-experience-level-unregistered-label": "Ora kadhaftar",
- "rcfilters-filter-user-experience-level-unregistered-description": "Pambesut sing ora mlebu log.",
+ "rcfilters-filter-user-experience-level-unregistered-description": "Pambesut kang ora mlebu log.",
"rcfilters-filter-user-experience-level-newcomer-label": "Wong neneka anyar",
- "rcfilters-filter-user-experience-level-newcomer-description": "Kurang saka 10 besutan lan 4 dina kagiyatan.",
+ "rcfilters-filter-user-experience-level-newcomer-description": "Pambesut kadhartar mawa besutan kurang saka 10 utawa aktif kurang saka 4 dina.",
"rcfilters-filter-user-experience-level-learner-label": "Wong sinau",
"rcfilters-filter-user-experience-level-learner-description": "Luwih akèh pangalamané tinimbang \"Wong neneka anyar\" nanging durung ngèmperi \"Panganggo kawakan\".",
"rcfilters-filter-user-experience-level-experienced-label": "Panganggo kawakan",
"rcfilters-filter-minor-description": "Besutan sing ditandhani pangriptané minangka besutan cilik.",
"rcfilters-filter-major-label": "Besutan ora cilik",
"rcfilters-filter-major-description": "Besutan sing ora ditandhani minangka besutan cilik.",
- "rcfilters-filtergroup-watchlist": "Kaca sing ana ing pawawangan",
+ "rcfilters-filtergroup-watchlist": "Kaca ing pawawangan",
"rcfilters-filter-watchlist-watched-label": "Ana ing Pawawangan",
"rcfilters-filter-watchlist-watched-description": "Owahané kaca-kaca ing Pawawangané panjenengan.",
"rcfilters-filter-watchlist-watchednew-label": "Owah-owahané Pawawangan anyar",
"uploaderror": "Kaluputan pangunggahan berkas",
"upload-recreate-warning": "'''Pèngetan: Berkas mawa jeneng kuwi wis dibusak utawa disingkiraké.'''\n\nLog pambusakan lan panyingkiran saka kaca iki sumadhiya nèng kéné:",
"uploadtext": "Anggonen formulir ngisor iki saperlu ngunggah barkas.\nKanggo ndeleng utawa nggolèki barkas sing wis diunggah sadurungé, panjenengan menyanga [[Special:FileList|pratélan barkas unggahan]]. Barkas unggahan ulang uga kacathet ing [[Special:Log/upload|log unggah]], déné barkas busakan ing [[Special:Log/delete|log busak]].\n\nKanggo muwuhi barkas ing kaca, anggonen pranala kanthi formulir ing ngisor iki, pilih salah siji:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> saperlu nganggo barkasé kanthi vèrsi sing wutuh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> saperlu nganggo barkasé kanthi amba 200 piksel déné ana ing njeron kothak lan kapacak ing sisih kiwané kaca mawa \"alt text\" minangka katerangané\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> saperlu nggayutaké langsung barkasé tanpa mitontonaké barkasé dhéwé",
- "upload-permitted": "{{PLURAL:$2|Jinis}} barkas sing diidinaké: $1.",
- "upload-preferred": "{{PLURAL:$2|Jinis}} barkas sing diprayogakaké: $1.",
- "upload-prohibited": "{{PLURAL:$2|Jinis}} barkas sing dilarang: $1.",
+ "upload-permitted": "{{PLURAL:$2|Jinis}} barkas kang kaolèhaké: $1.",
+ "upload-preferred": "{{PLURAL:$2|Jinis}} barkas kang kaprayogakaké: $1.",
+ "upload-prohibited": "{{PLURAL:$2|Jinis}} barkas kang kalarang: $1.",
"uploadlogpage": "Log unggah",
"uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan berkas sing anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri berkas-berkas anyar]] kanggo pratélan visual.",
"filename": "Jeneng barkas",
"filetype-unwanted-type": "'''\".$1\"''' klebu jenis berkas sing ora diidinaké.\nLuwih becik {{PLURAL:$3|jinis berkas|Jinis-jinis berkas}} $2.",
"filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|dudu jinis barkas sing diidinaké}}.\n{{PLURAL:$3|Jinis barkas}} sing diidinaké $2.",
"filetype-missing": "Berkas ini ora duwé ekstènsi (contoné \".jpg\").",
- "empty-file": "Barkas sing panjenengan kirim kosong.",
- "file-too-large": "Barkas sing panjenengan kirim kagedhèn.",
+ "empty-file": "Barkas kang panjenengan lebokaké kosong.",
+ "file-too-large": "Barkas kang panjenengan lebokaké kagedhèn.",
"filename-tooshort": "Jeneng barkas kecendhèken.",
"filetype-banned": "Barkas jinis iki dilarang.",
"verification-error": "Barkas iki ora lulus vèrifikasi.",
"lockmanager-fail-svr-acquire": "Ora bisa ngentokaké gembok nèng sasana $1.",
"lockmanager-fail-svr-release": "Ora bisa nguculaké gembok neng sasana $1.",
"zip-file-open-error": "Ana masalah nalika mbukak barkas kanggo pamriksan ZIP.",
- "zip-wrong-format": "Barkas sing diisèkaké dudu barkas ZIP.",
+ "zip-wrong-format": "Barkas kang panjenengan lebokaké dudu barkas ZIP.",
"zip-bad": "Berkas rusak utawa berkas ZIP sing ora bisa diwaca.\nKuwi ora bisa kapriksa kanthi patut kanggo kamanan.",
"zip-unsupported": "Berkasé kuwi berkas ZIP sing nganggo piranti ZIP sing ora kasengkuyung déning MediaWiki.\nKuwi ora bisa kapriksa kanthi patut kanggo kamanan.",
"uploadstash": "Unggah pandhelikan",
"licenses-edit": "Besut pilihan lisènsi",
"license-nopreview": "(Pratuduh ora ana)",
"upload_source_url": "(barkas sing panjenengan pilih saka URL sing trep tur bisa diaksès umum)",
- "upload_source_file": "(barkas sing panjenengan pilih saka komputeré panjenengan)",
+ "upload_source_file": "(barkas kang panjenengan pilih saka komputer)",
"listfiles-delete": "busak",
"listfiles-summary": "Kaca mirunggan iki nuduhaké kabèh barkas sing kaunggah.",
"listfiles_search_for": "Golèk jeneng gambar:",
"mimesearch-summary": "Kaca iki nyedyaké fasilitas nyaring berkas miturut tipe MIME-né. Lebokna: contenttype/subtype, contoné <code>image/jpeg</code>.",
"mimetype": "Tipe MIME:",
"download": "undhuh",
- "unwatchedpages": "Kaca sing ora diawasi",
+ "unwatchedpages": "Kaca kang ora ingawasan",
"listredirects": "Daftar pengalihan",
- "unusedtemplates": "Cithakan sing ora kanggo",
+ "unusedtemplates": "Cithakan kang ora kanggo",
"unusedtemplatestext": "Kaca iki ngamot kabèh kaca ing bilik jeneng {{ns:template}} sing ora dianggo ing kaca ngendi waé.\nPriksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.",
"unusedtemplateswlh": "pranala liya-liyané",
"randompage": "Kaca sembarang",
"randompage-nopages": "Ora ana kaca ing {{PLURAL:$2||}}bilik jeneng iki:$1.",
"randomincategory": "Sembarang kaca ing kategori",
- "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori sing apik.",
+ "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori kang trep.",
"randomincategory-nopages": "Ora ana kaca ing kategori [[:Category:$1|$1]].",
"randomincategory-category": "Kategori:",
"randomincategory-legend": "Sembarang kaca ing kategori",
"statistics-users-active-desc": "Panganggo sing ngayahi aktivitas jroning {{PLURAL:$1|dia|$1 dina}} pungkasan",
"pageswithprop": "Kaca mawa properti kaca",
"pageswithprop-legend": "Kaca mawa properti kaca",
- "pageswithprop-text": "Kaca iki mratélakaké kaca-kaca sing nganggo properti kaca mirunggan.",
+ "pageswithprop-text": "Kaca iki ngemu pratélan kaca kang nganggo properti kaca kang mirunggan.",
"pageswithprop-prop": "Arané ubarampé:",
"pageswithprop-submit": "Nuju",
"pageswithprop-prophidden-long": "nilai properti teks dawa didhelikake ($1 kilobita)",
"pageswithprop-prophidden-binary": "nilai properti biner didhelikake ($1 kilobita)",
- "doubleredirects": "Alihan sing dhobel",
- "doubleredirectstext": "Kaca iki ngandhut daftar kaca sing ngalih ing kaca pangalihan liyané.\nSaben baris ngandhut pranala menyang pangalihan kapisan lan kapindho, sarta tujuan saka pangalihan kapindho, sing biasané kaca tujuan sing \"sajatiné\", yakuwi pangalihan kapisan kuduné dialihaké menyang kaca tujuan iku.\nJeneng sing wis <del>dicorèk</del> tegesé wis rampung didandani.",
+ "doubleredirects": "Alihan kang dhobel",
+ "doubleredirectstext": "Kaca iki ngemu pratélan kaca kang ngener kaca alihan liyané.\nSaben larik ngemu pranala menyang kaca alihan kapisan lan kapindho, sarta jujuganing kaca alihan kapindho, kang adaté minagka kaca jujugan kang \"sajatiné\", ya iku kaca kang kuduné dadi jujugané kaca alihan kapisan.\nÈntri kang <del>kacorèk</del> tegesé wis kadandani.",
"double-redirect-fixed-move": "[[$1]] wis kapindhahaké, saiki dadi kaca peralihan menyang [[$2]]",
"double-redirect-fixed-maintenance": "Otomatis ndandani lih-lihan dhobel saka [[$1]] nyang [[$2]] nalika ana opèn-opènan.",
"double-redirect-fixer": "Révisi pangalihan",
- "brokenredirects": "Alihan sing rusak",
- "brokenredirectstext": "Pengalihan ing ngisor iki tumuju menyang kaca sing ora ana:",
+ "brokenredirects": "Alihan kang rusak",
+ "brokenredirectstext": "Kaca alihan ing isor iki ngener kaca kang ora ana:",
"brokenredirects-edit": "besut",
"brokenredirects-delete": "busak",
- "withoutinterwiki": "Kaca sing tanpa pranala basa",
+ "withoutinterwiki": "Kaca kang tanpa pranala basa",
"withoutinterwiki-summary": "Kaca-kaca ing ngisor iki ora nggayut nyang vèrsi basa liyané.",
"withoutinterwiki-legend": "Préfiks",
"withoutinterwiki-submit": "Tuduhna",
"nimagelinks": "Kanggo nèng {{PLURAL:$1|kaca|kaca}}",
"ntransclusions": "kanggo nèng $1 {{PLURAL:$1|kaca|kaca}}",
"specialpage-empty": "Ora ana sing perlu dilaporaké.",
- "lonelypages": "Kaca sing lola",
+ "lonelypages": "Kaca kang lola",
"lonelypagestext": "Kaca-kaca ing ngisor iki ora ana sing nyambung menyang kaca liyané ing {{SITENAME}}.",
- "uncategorizedpages": "Kaca sing tanpa kategori",
- "uncategorizedcategories": "Kategori sing tanpa kategori",
- "uncategorizedimages": "Barkas sing tanpa kategori",
- "uncategorizedtemplates": "Cithakan sing durung diwèhi kategori",
- "unusedcategories": "Kategori sing ora kanggo",
- "unusedimages": "Barkas sing ora kanggo",
- "wantedcategories": "Kategori sing dipéngini",
- "wantedpages": "Kaca sing dipéngini",
+ "uncategorizedpages": "Kaca kang tanpa kategori",
+ "uncategorizedcategories": "Kategori kang tanpa kategori",
+ "uncategorizedimages": "Barkas kang tanpa kategori",
+ "uncategorizedtemplates": "Cithakan kang durung kawènèhan kategori",
+ "unusedcategories": "Kategori kang ora kanggo",
+ "unusedimages": "Barkas kang ora kanggo",
+ "wantedcategories": "Kategori kang kapéngini",
+ "wantedpages": "Kaca kang kapéngini",
"wantedpages-badtitle": "Sesirah ora sah ing omboyakan kasil: $1",
- "wantedfiles": "Barkas sing dipéngini",
- "wantedfiletext-cat": "Berkas iki dianggo nanging ora ana. Berkas saka panyimpenan asing mungkin kadaptar tinimbang ana kasunyatan. Saben ''positip salah'' bakal <del>diorèk</del>. Lan, kaca sing nyartakaké berkas sing ora ana bakal kadaptar nèng [[:$1]].",
+ "wantedfiles": "Barkas kang kapéngini",
+ "wantedfiletext-cat": "Barkas iki kaanggo, nanging ora ana. Barkas saka panyimpenan manca bokamanawa kacathet, sanajan ora ana. Saben ayahan kang salah, sanajan saka niyat kang becik, bakal <del>kacorèk</del>. Kaca kang ngemu barkas kang ora ana bakal kacathet ing [[:$1]].",
"wantedfiletext-nocat": "Berkas iki dianggo nanging ora ana. Berkas saka panyimpenan asing mungkin kadaptar tinimbang ana kasunyatan. Saben ''positip salah'' bakal <del>diorèk</del>.",
- "wantedtemplates": "Cithakan sing dipéngini",
- "mostlinked": "Kaca sing kerep dhéwé dituju",
- "mostlinkedcategories": "Kategori sing kerep dhéwé dienggo",
+ "wantedtemplates": "Cithakan kang kapéngini",
+ "mostlinked": "Kaca kang akèh kajujug",
+ "mostlinkedcategories": "Kategori kang kerep dhéwé kajujug",
"mostlinkedtemplates": "Kaca paling akèh transklusi",
- "mostcategories": "Kaca sing kategoriné akèh dhéwé",
+ "mostcategories": "Kaca kang kategoriné akèh dhéwé",
"mostimages": "Barkas akèh dhéwé dienggo pranala",
"mostinterwikis": "Kaca mawa interwiki paling akèh",
"mostrevisions": "Kaca mawa pangowahan sing akèh dhéwé",
"prefixindex-namespace": "Kabèh kaca mawa ater-ater (bilik jeneng $1)",
"prefixindex-submit": "Tuduhaké",
"prefixindex-strip": "Busak ater-ater saka pratélan",
- "shortpages": "Kaca sing cekak",
- "longpages": "Kaca sing dawa",
- "deadendpages": "Kaca sing buntu",
+ "shortpages": "Kaca kang cendhak",
+ "longpages": "Kaca kang dawa",
+ "deadendpages": "Kaca kang buntu",
"deadendpagestext": "Kaca-kaca ing ngisor iki ora nggayut nyang kaca liya ing {{SITENAME}}.",
- "protectedpages": "Kaca sing direksa",
+ "protectedpages": "Kaca kang kareksa",
"protectedpages-indef": "Namung rereksan tanpa watesan wektu",
"protectedpages-cascade": "Amung kaca rineksan kang runtut",
"protectedpages-noredirect": "Dhelikna alihan",
"newpages": "Kaca anyar",
"newpages-submit": "Tuduhaké",
"newpages-username": "Jeneng panganggo:",
- "ancientpages": "Kaca sing lawas dhéwé",
+ "ancientpages": "Kaca kang lawas dhéwé",
"move": "Lih",
"movethispage": "Lih kaca iki",
"unusedimagestext": "Berkas-berkas sing kapacak iki ana nanging ora dienggo ing kaca apa waé.\nTulung digatèkaké yèn situs wèb liyané mbok-menawa bisa nyambung ing sawijining berkas sacara langsung mawa URL langsung, lan berkas-berkas kaya mengkéné iku mbok-menawa ana ing daftar iki senadyan ora dienggo aktif manèh.",
- "unusedcategoriestext": "Kategori iki ana senadyan ora ana artikel utawa kategori liyané sing nganggo.",
+ "unusedcategoriestext": "Kaca kategori iki ana sanajan ora ana artikel utawa kategori liyané kang nganggo.",
"notargettitle": "Ora ana sasaran",
"notargettext": "Panjenengan ora nemtokaké kaca utawa panganggo tujuan fungsi iki.",
"nopagetitle": "Kaca tujuan ora ditemokaké",
- "nopagetext": "Kaca sing panjenengan tuju ora ditemokaké.",
+ "nopagetext": "Kaca jujugan kang panjenengan karsakaké ora ana.",
"pager-newer-n": "{{PLURAL:$1|1 luwih anyar|$1 luwih anyar}}",
"pager-older-n": "{{PLURAL:$1|1 luwih lawas|$1 luwih lawas}}",
"suppress": "Dhelikaké",
"apisandbox-dynamic-error-exists": "Paramèter aran \"$1\" wis ana.",
"apisandbox-deprecated-parameters": "Paramèter lawas",
"apisandbox-fetch-token": "Isi otomatis tokené",
+ "apisandbox-add-multi": "Wuwuh",
"apisandbox-submit-invalid-fields-title": "Sawenèh babagan ora trep",
"apisandbox-submit-invalid-fields-message": "Jajal dandanana babagan sing ditandhani lan jajalen manèh.",
"apisandbox-results": "Kasil",
"apisandbox-results-error": "Ana masalah nalika ngamot wangsulan kanggo panyuwuné API: $1.",
"apisandbox-request-selectformat-label": "Tuduhaké dhata suwunan minangka:",
"apisandbox-request-url-label": "URL dikarepaké:",
+ "apisandbox-request-format-json-label": "JSON",
"apisandbox-request-json-label": "Nyuwun JSON:",
"apisandbox-request-time": "Suwéné panyuwunan: {{PLURAL:$1|$1 ms}}",
"apisandbox-results-fixtoken": "Dandanana tokené lan balènana numpuk",
"apisandbox-multivalue-all-values": "$1 (Kabèh aji)",
"booksources": "Sumber buku",
"booksources-search-legend": "Golèk sumber buku",
+ "booksources-isbn": "ISBN:",
"booksources-search": "Golèk",
"booksources-text": "Ing ngisor iki kapacak daftar pranala menyang situs liyané sing ngadol buku anyar lan bekas, lan mbok-menawa uga ndarbèni informasi sabanjuré ngenani buku-buku sing lagi panjenengan golèki:",
"booksources-invalid-isbn": "ISBN sing diwènèhaké katonané ora trep; priksanen bokmanawa ana masalah nalika nurun sumber asli.",
- "magiclink-tracking-rfc": "Kaca sing nganggo pranala ajaib RFC",
+ "magiclink-tracking-rfc": "Kaca kang nganggo pranala RFC",
"magiclink-tracking-rfc-desc": "Kaca iki nganggo pranala ajaib RFC. Delengen [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ngenani carané boyongan.",
- "magiclink-tracking-pmid": "Kaca sing nganggo pranala ajaib PMID",
- "magiclink-tracking-isbn": "Kaca sing nganggo pranala ajaib ISBN",
+ "magiclink-tracking-pmid": "Kaca kang nganggo pranala PMID",
+ "magiclink-tracking-isbn": "Kaca kang nganggo pranala ISBN",
"specialloguserlabel": "Panampil:",
"speciallogtitlelabel": "Paran (sesirah utawa {{ns:user}}:jeneng panganggo):",
"log": "Log",
"logeventslist-submit": "Tuduhaké",
+ "logeventslist-tag-log": "Log tenger",
"all-logs-page": "Kabèh log umum",
- "alllogstext": "Pitontonan gabungan log-log sing ana ing {{SITENAME}}.\nPanjenengan bisa nyiyutaké sesawangané kanthi milih sawijining jinis log, jeneng panganggo (sènsitif-case), utawa kaca sing gegayutan (uga sènsitif-case).",
+ "alllogstext": "Pitontonan gabungan log-log ing {{SITENAME}}.\nPanjenengan bisa nyiyutaké sesawangané kanthi milih siji jinis log, jeneng panganggo (sènsitif kapitalisasi), utawa kaca kang kaprabawan (uga sènsitif kapitalisasi).",
"logempty": "Ora tinemu wiji kang cocog ing log",
"log-title-wildcard": "Golèk sesirah sing diwiwiti tulisan iki",
"showhideselectedlogentries": "Owah pakatonané èntri log sing dipilih",
"allpages": "Kabèh kaca",
"nextpage": "Kaca sabanjuré ($1)",
"prevpage": "Kaca sadurungé ($1)",
- "allpagesfrom": "Pitontonaké kaca sing diwiwiti:",
+ "allpagesfrom": "Pitontonaké kaca kang kawiwitan:",
"allpagesto": "Tampilaké kaca dipungkasi ing:",
"allarticles": "Kabèh kaca",
"allinnamespace": "Kabèh kaca (mandala aran $1)",
"categories": "Kategori",
"categories-submit": "Tuduhaké",
"categoriespagetext": "{{PLURAL:$1|kategori ing ngisor iki ngandhut|kategori ing ngisor iki ngandhut}} kaca utawa media.\n[[Special:UnusedCategories|Kategori sing ora dianggo]] ora ditampilaké ing kéné.\nDeleng uga [[Special:WantedCategories|kategori sing diperlokaké]].",
- "categoriesfrom": "Tuduhaké kategori-kategori sing diwiwiti:",
+ "categoriesfrom": "Tuduhaké kategori kang kawiwitan:",
"deletedcontributions": "Pisumbanging panganggo sing dibusak",
"deletedcontributions-title": "Pisumbanging panganggo sing dibusak",
"sp-deletedcontributions-contribs": "pasumbang",
"listgrants": "Idin",
"listgrants-grant": "Idin",
"listgrants-rights": "Hak",
+ "listgrants-grant-display": "$1 <code>($2)</code>",
"trackingcategories": "Kategori panglacak",
"trackingcategories-msg": "Kategori panglacak",
"trackingcategories-name": "Jeneng layang",
+ "trackingcategories-nodesc": "Ora ana wedharané.",
+ "trackingcategories-disabled": "Kategori ora kaurubaké",
"mailnologin": "Ora ana alamat kirim",
"mailnologintext": "Panjenengan kudu [[Special:UserLogin|mlebu log]] lan duwé alamat layang-èl sing trep ing [[Special:Preferences|pilalané]] panjenengan kanggo nglayangi panganggo liyané.",
"emailuser": "Kirimi panganggo iki layang-èl",
"emailuserfooter": "Layang-e iki dikirimaké déning $1 marang $2 migunakaké fungsi \"Layangpanganggo\" ing {{SITENAME}}.",
"usermessage-summary": "Tinggalaké layang sistem.",
"usermessage-editor": "Pawartaning layang sistem",
+ "usermessage-template": "MediaWiki:UserMessage",
"watchlist": "Pawawangan",
"mywatchlist": "Pawawangan",
"watchlistfor2": "Kanggo $1 $2",
"notvisiblerev": "Révisi wis dibusak",
"watchlist-details": "{{PLURAL:$1|Kaca cacah $1|Kaca cacah $1}} ana ing Pawawangané panjenengan (kalebu kaca-kaca parembugan).",
"wlheader-enotif": "Wara-wara layang-èl diurubaké.",
- "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
+ "wlheader-showupdated": "Kaca kang wis owah kawit wektu pungkasan panjenengan priksa katuduhaké mawa <strong>hurup kandel</strong>.",
"wlnote": "Ing ngisor iki {{PLURAL:$1|owahan pungkasan|<strong>$1</strong> owahan pungkasan}} ing dalem {{PLURAL:$2|jam|<strong>$2</strong> jam}} pungkasan, rikala $3, $4.",
"wlshowlast": "Tuduhaké $1 jam $2 dina pungkasan",
"watchlist-hide": "Dhelikaké",
"watching": "Ngawasi...",
"unwatching": "Ngilangi pangawasan...",
"watcherrortext": "Ana masalah nalika ngganti setèlan pawawangané panjenengan tumrap \"$1\".",
- "enotif_reset": "Tandhanana kabèh kaca sing wis ditiliki",
+ "enotif_reset": "Tandhani kabèh kaca kang wis daktiliki",
"enotif_impersonal_salutation": "Panganggo {{SITENAME}}",
"enotif_subject_deleted": "Halaman $1 di {{SITENAME}} telah dihapus oleh {{gender:$2|$2}}",
"enotif_subject_created": "Halaman $1 di {{SITENAME}} telah dibuat oleh {{gender:$2|$2}}",
"enotif_lastdiff": "Saperlu ndeleng owahan iki, tilikana $1",
"enotif_anon_editor": "panganggo anonim $1",
"enotif_body": "Sing minulya $WATCHINGUSERNAME,\n\nKaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED ing $PAGEEDITDATE déning $PAGEEDITOR, mangga mirsani $PAGETITLE_URL kanggo vèrsi pungkasan.\n\n$NEWPAGE\n\nSajarah suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungana panyunting:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKita ora bakal ngandhani manèh yèn diowahi manèh, kejaba panjenengan wis mirsani kaca iku. Panjenengan uga bisa mbusak tandha notifikasi kanggo kabèh kaca pangawasan ing daftar pangawasan panjenengan.\n\n Sistém notifikasi {{SITENAME}}\n\n--\nKanggo ngowahi préferènsi ing daftar pangawasan panjenengan, mangga mirsani\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUmpan balik lan pitulung sabanjuré:\n$HELPPAGE",
+ "enotif_minoredit": "Iki besutan cilik",
"created": "kadamel",
"changed": "kaubah",
"deletepage": "Busak kaca",
"dellogpage": "Log busak",
"dellogpagetext": "Ing ngisor iki kapacak log pambusakan kaca sing anyar dhéwé.",
"deletionlog": "log busak",
+ "log-name-create": "Log panggawéning kaca",
+ "log-description-create": "Ing isor iki pratélan kaca kang mentas kagawé.",
+ "logentry-create-create": "$1 {{GENDER:$2|nggawé}} kaca $3",
"reverted": "Dibalèkaké ing revisi sadurungé",
"deletecomment": "Alesan:",
"deleteotherreason": "Alesan liya utawa tambahan:",
"delete-toobig": "Kaca iki darbé sajarah besutan sing dawa, punjul $1 {{PLURAL:$1|owahan}}.\nMbusak kaca sing kaya mangkono wis ora diidinaké kanggo njagani supaya ora ana sing rusak ing {{SITENAME}}.",
"delete-warning-toobig": "Kaca iki duwé sajarah besut sing dawa, punjul $1 {{PLURAL:$1|révisi}}.\nMbusak kaca iki bisa ngrusak lakuné basis dhata ing {{SITENAME}};\nkudu diayahi kanthi ngati-ati.",
"deleteprotected": "Panjenengan ora bisa mbusak kaca iki amarga direksa.",
- "deleting-backlinks-warning": "'''Awas:''' Kaca liyane mungkin ana sing nautake ing kaca sing arep sampeyan busak.",
+ "deleting-backlinks-warning": "<strong>Pepéling:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Ana kaca liya]] kang nggayut utawa tranklud marang kaca kang arep panjenengan busek.",
"rollback": "Pulihaké besutan",
"rollbacklink": "balèkaké",
"rollbacklinkcount": "balèkaké $1 {{PLURAL:$1|besutan|besutan}}",
"thumbnail_dest_directory": "Ora bisa nggawé dirèktori tujuan",
"thumbnail_image-type": "Tipe gambar ora didhukung",
"thumbnail_gd-library": "Konfigurasi pustaka GD ora pepak: fungsi $1 ilang",
- "thumbnail_image-missing": "Barkas sing kayané ilang: $1",
+ "thumbnail_image-missing": "Barkasé kayané ora ana: $1",
"import": "Impor kaca",
"importinterwiki": "Impor saka wiki liya",
"import-interwiki-text": "Pilih sawijining wiki lan irah-irahan kaca sing arep diimpor.\nTanggal révisi lan jeneng panyunting bakal dilestarèkaké.\nKabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]].",
"tooltip-pt-mytalk": "Kaca parembugané {{GENDER:|panjenengan}}",
"tooltip-pt-anontalk": "Parembug ing besutan-besutan saka alamat IP iki",
"tooltip-pt-preferences": "Pilalané {{GENDER:|panjenengan}}",
- "tooltip-pt-watchlist": "Pratélaning kaca sing panjenengan awasi owah-owahané",
+ "tooltip-pt-watchlist": "Pratélan kaca kang panjenengan awasi owah-owahané",
"tooltip-pt-mycontris": "Pratélaning pisumbangé {{GENDER:|panjenengan}}",
"tooltip-pt-anoncontribs": "Pratélan besutané alamat IP iki",
"tooltip-pt-login": "Panjenengan prayogané mlebu log, sanajan ora kudu",
"pageinfo-robot-policy": "Diindhèks déning robot",
"pageinfo-robot-index": "Éntuk",
"pageinfo-robot-noindex": "Ora éntuk",
- "pageinfo-watchers": "Cacahing sing ngawasi kaca",
+ "pageinfo-watchers": "Cacahé kang ngawasi kaca",
"pageinfo-visiting-watchers": "Cacahé pandeleng kaca sing nekani besutan anyar",
"pageinfo-few-watchers": "{{PLURAL:$1|Kang ndeleng|Kang ndeleng}} kurang saka $1",
- "pageinfo-redirects-name": "Cacahing alihan menyang kaca iki",
+ "pageinfo-redirects-name": "Cacahé alihan menyang kaca iki",
"pageinfo-subpages-name": "Cacahing anak kaca saka kaca iki",
"pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|alihan|alihan}}; $3 {{PLURAL:$3|non-alihan|non-alihan}})",
"pageinfo-firstuser": "Kang nggawé kaca",
"pageinfo-edits": "Gunggunging besutan",
"pageinfo-authors": "Gunggung kang nganggit",
"pageinfo-recent-edits": "Cacahé besutan saiki (ing dalem $1 pungkasan)",
- "pageinfo-recent-authors": "Cacahing sing nganggit dinané iki",
+ "pageinfo-recent-authors": "Cacahé kang nulis sawatara wektu iki",
"pageinfo-magic-words": "{{PLURAL:$1|Tembung|Tembung}} mujarab ($1)",
"pageinfo-hidden-categories": "{{PLURAL:$1|Kategori}} ndhelik ($1)",
"pageinfo-templates": "{{PLURAL:$1|Cithakan|Cithakan}} transklusi ($1)",
"Rul1902"
]
},
+ "underline-always": "ကိုဲၜၠင်",
+ "underline-never": "ၮင်းဖိုင့်အေႋ",
+ "editfont-serif": "ခေါဟ်ထိင်ႋပါ့ဖောင့်",
"sunday": "အ်ုတုက်",
"monday": "အ်ုစန်",
"tuesday": "အ်ုညာႋ",
"oct": "လာထါင့်ခုက်ဖေါဟ်",
"nov": "လာထါင့်ခုက်ဖါဍောဟ်",
"dec": "လာထင်းကၠံင်",
+ "january-date": "ထါင့်ခုက်ဖေါဟ် $1",
+ "february-date": "ထါင့်ခုက်ဖါဍောဟ် $1",
+ "march-date": "လါသိုင့် $1",
+ "april-date": "လါတါ $1",
+ "may-date": "လါယါ့ $1",
+ "june-date": "လါနုဲး $1",
+ "july-date": "လါၰိုဝ် $1",
+ "august-date": "လါခုဂ် $1",
+ "september-date": "ဆီ့မူႋ $1",
+ "october-date": "က္တုဂ်ဝဝ်ႋ $1",
+ "november-date": "လါၮင့် $1",
+ "december-date": "လါလိင် $1",
+ "period-am": "ကေၯဝ်",
+ "period-pm": "ကေၯး",
"pagecategories": "{{PLURAL:$1|အ်ုဆုဂ်တုဂ်|အ်ုဆုဂ်တုဂ်သယ်}}",
"category_header": "အ်ုဆုဂ် \"$1\" ခဝ့် လိက်မေံလ်ုဖး",
"subcategories": "ကဏ္ဍကါင်ဖါသယ်",
"about": "အ်ုကျံင်",
"newwindow": "(ဝင်းဒိုးသင့်လ်ုၮါင်းဝယ် မ်ုပုဂ်ထုင်း)",
"cancel": "မာလှ်ေအေး",
+ "moredotdotdot": "ၰိုဲမေံၜၠာ်...",
+ "morenotlisted": "စ်ုရင့်ယိုဝ် ဍုဂ်ပါင်အေ့ယာႋ။",
+ "mypage": "လက်မေံသး",
"mytalk": "ဆ်ုခၠါန်ကင်ကာ",
+ "anontalk": "ဆ်ုခၠါင်ကင်ကာ",
"navigation": "ပ်ုယုံ့",
"and": " လ်ု",
+ "faq": "ဆ်ုအင်းစာအးသယ်လ်ုဖး",
+ "actions": "ဆ်ုသုဂ်ကၠယ်လ်ုဖး",
"namespaces": "အ်ုမၠိင်ထိုဝ်",
"variants": "အးမိင်အးစိင်လုက်ဆိင့်",
"navigation-heading": "ၮဲဖၠေမီနူး",
+ "errorpagetitle": "ဆ်ုမး",
"returnto": "$1 အိုဝ် မ်ုက္ဍာထါင်။",
"tagline": "{{SITENAME}} ခဝ့်",
"help": "မာၜိုင်မာဆိုင်",
"search": "အင်းၰူ့",
"searchbutton": "အင်းၰူ့",
+ "go": "လေဝ်",
"searcharticle": "လေဝ်",
"history": "ဃွှာန့်မေင်ႋစိင်",
"history_short": "မေင်ႋစိင်",
+ "history_small": "မေင်ႋစိင်",
+ "updatedmarker": "လေဝ်ယောဝ်ႋဝေ့အ်ုလါင်ခါင့်ခါ့ အင်းတင်ထဝေ့",
"printableversion": "လေဝ်",
"permalink": "ဆ်ုသုဂ်ကၠယ်သီ့",
+ "print": "ထုဂ်ထင်းလိက်",
"view": "မ်ုယောဝ်ႋ",
"view-foreign": "မ်ုယောဝ်ႋ $1 ဝယ်",
"edit": "အင်ႋတင်ႋ",
+ "edit-local": "အှ်လင်ကၠယ် ဆ်ုတုဂ်ကၠယ် မ်ုအင်းတင်လင်",
"create": "ပ္တုံထံင်း",
"create-local": "အှ်လင်ကၠယ် ဆ်ုတုဂ်ကၠယ် မ်ုဆူ့ဍုဂ်လင်",
"delete": "ထုဂ်ဆိင့်",
+ "undelete_short": "{{PLURAL:$1|ဆ်ုအင်းတင်လ်ုၮါင်း|ဆ်ုအင်းတင် $1 ၮါင်းၮှ်}}အိုဝ် လ်ုထုက်ဆိင့်လိုင်ၜး",
+ "viewdeleted_short": "{{PLURAL:$1|ထုဂ်ဆိင့်ခၞိက်ဆ်ုအင်းတင်လ်ုၮါင်း|ထုဂ်ဆိင့်ခၞိက် ဆ်ုအင်းတင် $1 ၮါင်း}}ၮှ် မ်ုယောဝ်ႋ",
+ "protect": "ခ်ုဝုင်ႋလာႋ",
+ "protect_change": "မ်ုအင်းလယ်",
+ "unprotect": "ဝီးၜါ်ထ မ်ုအင်းလယ်",
"newpage": "လိက်မေံသင့်",
"talkpagelinktext": "ဆ်ုခၠါင်ကင်ကာ",
+ "specialpage": "လိက်မေံခေါဟ်",
"personaltools": "ဟ်ုဆ်ုမာ ဆ်ုဖၠင့်",
"talk": "လဝ်ထာင်ကင်ကာ",
"views": "ဟ်ုဍးအ်ုလာၯင်သယ်အး",
"toolbox": "ခြီခြာ့သယ်",
+ "tool-link-userrights": "{{GENDER:$1|ၮင့်ဆါႋ}}ကုံလွာဲသယ်လ်ုဖး မ်ုအင်းလယ်",
+ "tool-link-userrights-readonly": "{{GENDER:$1|ၮင့်ဆါႋ}}ကုံလွာဲသယ်လ်ုဖး မ်ုယောဝ်ႋ",
+ "tool-link-emailuser": "ယိုဝ်{{GENDER:$1|ၮင့်ဆါႋ}}ၮှ် မ်ုသုံ့အီမေံႋ",
+ "imagepage": "မ်ုယောဝ်ႋဖိုင့်လိက်မေံ",
+ "mediawikipage": "မ်ုယောဝ်ႋလိက်မေံဖိုဟ်",
+ "templatepage": "တာင်ႋပ်ုလိတ်သယ် မ်ုယောဝ်ႋ",
+ "viewhelppage": "မ်ုယောဝ်ႋဖိုင့်လိက်မေံ",
+ "categorypage": "အ်ုဆုဂ်တုဂ်လိက်မေံသယ် မ်ုယောဝ်ႋ",
+ "viewtalkpage": "မ်ုယောဝ်ႋ လဝ်ခၠါင်ဆ်ုခၠါင်",
"otherlanguages": "လိက်ဆ်ုခၠါင် အ်ုၯာၯံင်သယ်",
"redirectedfrom": "($1 ခဝ့် ပ်ုယုံ့ထာ့)",
"redirectpagesub": "ထါင်ၮဲအ်ုထိုဝ် လိက်မေံၜၠါ်",
"redirectto": "က္ဍာထိုဝ်ၜုဂ် -",
"lastmodifiedat": "လိက်မေံယိုဝ် $1၊ $2 အ်ုခါ့ ဆ်ုအင်ႋတင်ႋထာ့ဝေ့လှ်။",
+ "viewcount": "လိက်မေံယိုဝ် {{PLURAL:$1|လ်ုၜၠင်|$1 ၜၠင်}} အွးလင်ထ။",
+ "protectedpage": "လိက်မေံဆ်ုဝီးၜါ်",
"jumpto": "မ်ုၯယ့်ထါင်ယိုဝ်",
"jumptonavigation": "ပ်ုယုံ့",
"jumptosearch": "အင်းၯူ့",
"disclaimers": "တင်ဆ်ုခၠါင်",
"disclaimerpage": "Project:ကိုဝ်မိင်ကိုဝ်စိင် ၜးတ်ုဒှ်",
"edithelp": "အင်ႋတင်ႋ ဆ်ုမာၜိုင်",
- "mainpage": "á\80\9cá\80á\80\80á\80ºá\80\99á\80±á\80¶á\80\9aá\80¬á\80·",
+ "mainpage": "á\80\9cá\80á\80\80á\80ºá\80\99á\80±á\80¶á\81\9cá\81 á\80«á\80ºá\80\81á\80±á\80«á\80\9fá\80º",
"mainpage-description": "လက်မေံယာ့",
"portal": "အ်ုထိုဝ်အ်ုမေံလင်ႋ",
"portal-url": "Project:အ်ုထိုဝ်အ်ုမေံလင်ႋ",
"redirect-file": "파일 이름",
"redirect-logid": "기록 ID",
"redirect-not-exists": "값을 찾을 수 없습니다",
+ "redirect-not-numeric": "값이 숫자가 아닙니다",
"fileduplicatesearch": "중복된 파일 검색",
"fileduplicatesearch-summary": "파일 해시값을 이용해 중복 파일을 검색합니다.",
"fileduplicatesearch-filename": "파일 이름:",
"protectedtitles-submit": "Rodyti pavadinimus",
"listusers": "Naudotojų sąrašas",
"listusers-editsonly": "Rodyti tik keitimus atlikusius naudotojus",
+ "listusers-temporarygroupsonly": "Rodyti tik laikinųjų vartotojų grupių naudotojus",
"listusers-creationsort": "Rodyti pagal paskyros sukūrimo datą",
"listusers-desc": "Išdėstyti abėcėline tvarka",
"usereditcount": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}",
"mypreferencesprotected": "Jums nav tiesību rediģēt savus iestatījumus.",
"ns-specialprotected": "Nevar izmainīt īpašās lapas.",
"titleprotected": "Šī lapa ir aizsargāta pret izveidošanu. To aizsargāja [[User:$1|$1]].\nNorādītais iemesls bija <em>$2</em>.",
+ "invalidtitle": "Nekorekts nosaukums",
"invalidtitle-knownnamespace": "Nederīgs nosaukums ar vārdtelpu \"$2\" un tekstu \"$3\"",
"invalidtitle-unknownnamespace": "Nederīgs nosaukums ar nezināmu vārdtelpas numuru \"$1\" un tekstu \"$2\"",
"exception-nologin": "Neesat pieslēdzies",
"grouppage-bureaucrat": "{{ns:project}}:Birokrāti",
"grouppage-suppress": "{{ns:project}}:Cenzētāji",
"right-read": "Lasīt lapas",
- "right-edit": "Izmainīt lapas",
+ "right-edit": "Labot lapas",
"right-createpage": "Izveidot lapas (kuras nav diskusiju lapas)",
"right-createtalk": "Izveidot diskusiju lapas",
"right-createaccount": "Izveidot jaunus dalībnieka kontus",
"rcfilters-other-review-tools": "Citi pārskatīšanas rīki",
"rcfilters-group-results-by-page": "Grupēt rezultātus pēc lapas",
"rcfilters-activefilters": "Aktīvie filtri",
+ "rcfilters-activefilters-hide": "Paslēpt",
+ "rcfilters-activefilters-show": "Parādīt",
"rcfilters-advancedfilters": "Paplašinātie filtri",
"rcfilters-limit-title": "Rādāmie rezultāti",
"rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}, $2",
"rcfilters-savedqueries-rename": "Pārsaukt",
"rcfilters-savedqueries-setdefault": "Uzstādīt kā noklusēto",
"rcfilters-savedqueries-unsetdefault": "Noņemt kā noklusēto",
- "rcfilters-savedqueries-remove": "Noņemt",
+ "rcfilters-savedqueries-remove": "Dzēst",
"rcfilters-savedqueries-new-name-label": "Nosaukums",
"rcfilters-savedqueries-new-name-placeholder": "Apraksti filtra būtību",
"rcfilters-savedqueries-apply-label": "Izveidot filtru",
"rcfilters-watchlist-edit-watchlist-button": "Labot manu uzraugāmo lapu sarakstu",
"rcfilters-watchlist-showupdated": "Izmaiņas lapās, kuras nav apmeklētas kopš izmaiņu veikšanas, ir <strong>trekninātā rakstā</strong>.",
"rcfilters-preference-label": "Paslēpt uzlaboto pēdējo izmaiņu versiju",
+ "rcfilters-target-page-placeholder": "Ievadi lapas nosaukumu (vai kategoriju)",
"rcnotefrom": "Zemāk {{PLURAL:$5|redzamas izmaiņas|redzama izmaiņa|redzamas izmaiņas}} kopš <strong>$3, $4</strong> (parādītas ne vairāk kā <strong>$1</strong>).",
"rclistfromreset": "Atiestatīt datuma izvēli",
"rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
"filehist-filesize": "Faila izmērs",
"filehist-comment": "Komentārs",
"imagelinks": "Faila lietojums",
- "linkstoimage": "{{PLURAL:$1|Šajās $1 lapās ir saites|Šajā lapā ir saite|Šajās $1 lapās ir saites}} uz šo failu:",
+ "linkstoimage": "Šo failu izmanto {{PLURAL:$1|šajās $1 lapās|šajā $1 lapā|šajās $1 lapās}}:",
"linkstoimage-more": "Uz šo failu ir saites vairāk nekā $1 {{PLURAL:$1|lapās|lapā|lapās}}.\nŠajā sarakstā ir tikai {{PLURAL:$1|pirmās $1 saistītās lapas|pirmā $1 saistītā lapa|pirmās $1 saistītās lapas}} uz šo failu.\nPieejams arī [[Special:WhatLinksHere/$2|pilns saraksts]].",
- "nolinkstoimage": "Nevienā lapā nav norāžu uz šo attēlu.",
+ "nolinkstoimage": "Šo failu neizmanto nevienā lapā.",
"morelinkstoimage": "Skatīt [[Special:WhatLinksHere/$1|vairāk saites]] uz šo failu.",
"linkstoimage-redirect": "$1 (faila pāradresācija) $2",
"duplicatesoffile": "{{PLURAL:$1|1=Šis fails ir šī faila dublikāts|Šie $1 faili ir šī faila dublikāti|Šis $1 fails ir šī faila dublikāts|Šie $1 faili ir šī faila dublikāti}} ([[Special:FileDuplicateSearch/$2|vairāk informācijas]]):",
"expandtemplates": "Izvērst veidnes",
"expand_templates_output": "Rezultāts",
"expand_templates_ok": "Labi",
+ "expand_templates_remove_comments": "Noņemt komentārus",
"expand_templates_remove_nowiki": "Cenzēt <nowiki> iezīmes rezultātā",
"expand_templates_preview": "Pirmskats",
"pagelanguage": "Mainīt lapas valodu",
"grouppage-interface-admin": "{{ns:project}}:Администратори на посредникот",
"grouppage-bureaucrat": "{{ns:project}}:Бирократи",
"grouppage-suppress": "{{ns:project}}:Притајување",
- "right-read": "Читање страници",
+ "right-read": "Читање на страници",
"right-edit": "Уредување на страници",
"right-createpage": "Создавање на страници (кои не се разговорни страници)",
"right-createtalk": "Создавање на разговорни страници",
"right-createaccount": "Создавање на нови кориснички сметки",
"right-autocreateaccount": "Автоматска најава со надворешна корисничка сметка",
"right-minoredit": "Означување на уредувањата како ситни",
- "right-move": "Преместување страници",
+ "right-move": "Преместување на страници",
"right-move-subpages": "Преместување на страници со нивните потстраници",
"right-move-rootuserpages": "Преместување на основни кориснички страници",
"right-move-categorypages": "Преместување на категориски страници",
"right-purge": "Бришење од опслужувачки меѓусклад на страницата без барање потврда за тоа",
"right-autoconfirmed": "Без ограничувања на стапки за IP-адреса",
"right-bot": "Третиран како автоматски процес",
- "right-nominornewtalk": "Ситните уредувања да не поттикнуваат потсетник за нова порака",
+ "right-nominornewtalk": "СиÑ\82ниÑ\82е Ñ\83Ñ\80едÑ\83ваÑ\9aа на Ñ\80азговоÑ\80ни Ñ\81Ñ\82Ñ\80аниÑ\86и да не поÑ\82Ñ\82икнÑ\83вааÑ\82 поÑ\82Ñ\81еÑ\82ник за нова поÑ\80ака",
"right-apihighlimits": "Користење на помалку ограничени барања од извршникот",
"right-writeapi": "Можност за запишување во извршникот",
"right-delete": "Бришење страници",
"grant-basic": "Основни права",
"grant-viewdeleted": "Преглед на избришани податотеки и страници",
"grant-viewmywatchlist": "Преглед на вашите набљудувања",
- "grant-viewrestrictedlogs": "Погл. ограничени дневнички ставки",
+ "grant-viewrestrictedlogs": "Преглед на ограничени дневнички ставки",
"newuserlogpage": "Дневник на регистрирања на корисници",
"newuserlogpagetext": "Ова е дневник на регистрирани корисници.",
"rightslog": "Дневник на корисничките права",
"redirect-file": "Име на податотека",
"redirect-logid": "Назнака на дневникот",
"redirect-not-exists": "Вредноста не е најдена",
+ "redirect-not-numeric": "Вредноста не е бројчена",
"fileduplicatesearch": "Барање на дуплирани податотеки",
"fileduplicatesearch-summary": "Пребарување на дуплирани податотеки по тарабни вредности.",
"fileduplicatesearch-filename": "Податотека:",
"@metadata": {
"authors": [
"Dr Lotus Black",
- "Htawmonzel"
+ "Htawmonzel",
+ "Aue Nai"
]
},
"tog-underline": "လေန် မတာပၞောန်သၟဝ်",
"tog-hideminor": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဟွံဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်",
"tog-hidepatrolled": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဇၞော်ဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်",
"tog-hidecategorization": "ပၞုက် အရာမဖျေဟ်ကဏ္ဍ ကုမုက်လိက်",
+ "tog-showhiddencats": "ထ္ၜးကဆံၚ်မပၞုက်လဝ်",
+ "tog-prefershttps": "လၟိုန်သုၚ်စောဲကေတ် လာၚ်မမၞုံဂီုကၠီု အခိၚ်မလုပ်လံက်အေန်",
+ "underline-always": "လၟိုန်အခါ",
+ "underline-never": "မွဲလှေ်ဟွံမွဲ",
"sunday": "တ္ၚဲအဒိုက်",
"monday": "တ္ၚဲစန်",
"tuesday": "တ္ၚဲအၚာ",
"oct": "အံက်",
"nov": "နဝ်",
"dec": "ဒဳ",
+ "january-date": "ဇန်နဝါရဳ $1",
+ "february-date": "ဖေဖဝ်ရဳ$1",
+ "march-date": "မာတ် $1\nဒါန်ပေၚ်အာ ၁၀ တုဲ ညတအ်ပလံၚ်နၚ်\nသွက်အခေါၚ်ချူဒါန်ပ္ဍဲမုက်လိက်ဂှ်\nတၚ်ဂုဏ်ရ။",
+ "april-date": "ဨပရဳ $1",
+ "may-date": "မေ $1",
+ "june-date": "ဂျေန် $1",
+ "july-date": "ဂျူလာၚ် $1",
+ "august-date": "သြဂုတ် $1",
+ "september-date": "$1သေပ်တေမ်ပါ",
+ "october-date": "အံက်တိုဘာ $1",
+ "november-date": "နိုဝေန်ဘာ$1",
+ "december-date": "ဒဳဇြေန်ဗာ$1",
+ "period-am": "နူဂယး",
+ "period-pm": "သဝ်တ္ၚဲ",
"pagecategories": "{{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}}",
"category_header": "မုက်လိက်ဂမၠိုင် ပ္ဍဲ ကဏ္ဍ \"$1\"",
"subcategories": "ကဏ္ဍလစှ်ေဂမၠိုင်",
"category-media-header": "မဳဒဳယာ စပ်ကဵု ကဏ္ဍ \"$1\"",
"category-empty": "<em>ကဏ္ဍဏအ် ပြဟ်ဟ်ဏအ် ဟွံမဲ ကု မုက်လိက် ဟွံသေင်မ္ဂး ပရူမွဲမွဲဏီရ</em>",
"hidden-categories": "{{PLURAL:$1|ကဏ္ဍ မပၞုက်|ကဏ္ဍ မပၞုက်ဂမၠိုင်}}",
+ "hidden-category-category": "ကဆံၚ် မပၞုက်လဝ်",
"category-subcat-count": "{{PLURAL:$2|ကဏ္ဍဏအ်ဂှ် ကဏ္ဍလစှ်ေ နွံဆ အတိုင်ဗွဲသၟဝ်ဝွံရ၊၊|ကဏ္ဍဏအ် နွံဆအတိုင် ဗွဲသၟဝ်ဝွံရ၊၊ {{PLURAL:$1|ကဏ္ဍလစှ်ေ|$1 ကဏ္ဍလစှ်ေဂမၠိုင်}}, ပၞောဝ်ကဵု $2 သီုဖအိုတ်}}",
+ "category-subcat-count-limited": "ကဆံၚ်(အဇာ)ဝွံ နွံအတိုၚ်ဗွဲသၟဝ် {{PLURAL:$1|ကဆံၚ်ပါ်|$1ကဆံၚ်ပါ်ဂမၠိုၚ်}}",
"category-article-count": "{{PLURAL:$2|ကဏ္ဍဏအ် နွံဆၜိုတ် အတိုင်ဗွဲသၟဝ်ဏအ်ရ.| ဗွဲသၟဝ်ဏအ်ဂှ် {{PLURAL:$1| ဒှ်လၟိဟ် မုက်လိက်| ဒှ်လၟိဟ် မုက်လိက်ဂမၠိုင် $1 }} စပ် ကုကဏ္ဍဏအ်ရ၊၊ သီုဖအိုတ် နွံ $2}}",
+ "category-article-count-limited": "အတိုၚ်ဗွဲသၟဝ်{{PLURAL:$1|မုက်ဂှ်|$1 မုက်တအ်}} ပ္ဍဲကဆံၚ်မလၟုဟ်.",
"category-file-count": "{{PLURAL:$2|ကဏ္ဍဏအ် နွံဆၜိုတ် ဝှာင်|အတိုင် ဗွဲသၟဝ်ဏအ်ရ {{PLURAL:$1|ဝှာင် ဂှ်|$1 ဝှာင်တအ် ဂှ်}} ပ္ဍဲကဏ္ဍဏအ် သီုဖအိုတ် နွံ $2 ၊၊}}",
+ "category-file-count-limited": "အတိုၚ်ဗွဲသၟဝ်{{PLURAL:$1|ဝှာၚ်|$1 ဝှာၚ်ဂမၠိုၚ်}} ပ္ဍဲကဆံၚ်မလၟုဟ်.",
"listingcontinuesabbrev": "ဆက်",
+ "index-category": "မုက်လိက်မစၞောန်လဝ်",
"noindex-category": "မုက်လိက် မသက္ကုလိက်",
"broken-file-category": "မုက်လိက် နကဵုလေန် ဝှာင်မလီုလာ်ဂမၠိုင်",
"about": "ပရူ",
+ "article": "မုက်လိက် မာတိကာဂမၠိုင်",
"newwindow": "(ပံက် ပ္ဍဲ မုက်ဗတင် တၟိ)",
"cancel": "တးပဲါ",
+ "moredotdotdot": "ထပ်...",
+ "morenotlisted": "စရၚ်ဏအ်ဒဒှ်ဍိုက်ပေၚ်မံၚ်ယျ",
+ "mypage": "မုက်လိက်",
"mytalk": "ဓရီုကျာ",
+ "anontalk": "ဓရီုကျာ",
"navigation": "သ္ၚိအင်",
"and": "  ကေုာံ",
+ "faq": "FAQ",
+ "actions": "ကၠောန်",
"namespaces": "ဒၞာဲယၟု",
"variants": "မူတၞဟ်",
"navigation-heading": "သ္ၚိအင် မေန်နူ",
+ "errorpagetitle": "ဗၠေတ်",
"returnto": "ကလေင်အာ ဇရေင် $1",
"tagline": "နူ {{SITENAME}}",
"help": "ရီု",
"search": "ဂၠာဲ",
"searchbutton": "ဂၠာဲ",
+ "go": "အာ",
"searcharticle": "အာ",
"history": "ဝှာင် လၟေင်အပြံင်အလှာဲ",
"history_short": "အရာမဗှ်လဝ်တုဲ",
+ "history_small": "လၟေင်မပြံင်လှာဲလဝ်",
"printableversion": "မူလိက် မပြေန်ပ္တိတ်ဂွံ",
"permalink": "ဌာန်ဒတန်လေန် လၟိုန်",
+ "print": "ပတိတ်",
"view": "ဗဗဵု",
"view-foreign": "ဗဵု ပ္ဍဲ $1",
"edit": "ပလေဝ်ဒါန်",
+ "edit-local": "စုတ် ပရူပရာဒေသ",
"create": "ခၞံကၠောန်",
"create-local": "စုတ် ပရူပရာဒေသ",
"delete": "ပလီု",
+ "protect": "စဵုဒၞာ",
+ "protect_change": "ပြံင်လှာဲ",
+ "unprotect": "ပရေင်စဵုဒၞာ မုက်လိက်",
"newpage": "မုက်လိက် တၟိ",
"talkpagelinktext": "ဓရီုကျာ",
+ "specialpage": "မုက်လိက် တၟေင်",
"personaltools": "ကြိယာ သွက်ပူဂဵု",
"talk": "သဳကၠဳ",
"views": "ထ္ၜး",
"toolbox": "ကြိယာ",
+ "tool-link-userrights": "ပြံၚ်{{GENDER:$1|ညးလွပ်}} ဂကောံဂမၠိုၚ်",
+ "tool-link-userrights-readonly": "ရံၚ်{{GENDER:$1|ညးလွပ်}} ဂကောံဂမၠိုၚ်",
+ "tool-link-emailuser": "ပလံၚ်လိက်ဣဏံ{{GENDER:$1|ညးလွပ်}}",
+ "imagepage": "ဗဵု မုက်လိက် ဝှာင်",
+ "mediawikipage": "ဗဵု မုက်လိက် ဓရီုကျာ",
+ "templatepage": "ဗဵု မုက်လိက် တာန်ပလုက်",
+ "viewhelppage": "ဗဵု မုက်လိက် ရီုဗၚ်",
+ "categorypage": "ဗဵု မုက်လိက်ကဏ္ဍ",
+ "viewtalkpage": "ဗဵု မသဳကၠဳ",
"otherlanguages": "နကဵု အရေဝ်ဘာသာ တၞဟ်",
"redirectedfrom": "(ကလေင်ထ္ၜး နူ $1)",
"redirectpagesub": "မုက်လိက် ကလေင်ပညုင်",
"redirectto": "ကလေင်စၞောန်ပညုင်လဝ် နူကဵု-",
"lastmodifiedat": "မုက်လိက်ဏအ် လက္ကရဴအိုတ် ပလေဝ်ဒါန်လဝ် ပ္ဍဲ $1 ပ္ဍဲ $2",
+ "viewcount": "မုက်လိက်ဏအ်ဂှ် ဒ:ဒုၚ်လုပ်လဝ်တုဲ{{PLURAL:$1|မွဲအလန်|$1 ဂၠိုၚ်ကဵုအလန်}}",
+ "protectedpage": "မုက်လိက် စဵုဒၞဲါလဝ်",
"jumpto": "ဒံင် လုပ်",
"jumptonavigation": "သ္ၚိအင်",
"jumptosearch": "ဂၠာဲ",
+ "pool-timeout": "အခိၚ်အိုတ်အာယျ မၚ်မံၚ်သွက်ဂွံလုပ်",
+ "pool-errorunknown": "ဟွံတီ ဗီုလဵုဗၠေတ်",
+ "pool-servererror": "ပရေၚ်ကမၠောန်မအောန်ကဵုဆိုက်ဗ္ဒက်ဂှ် ဟွံသၟဟ်အစောန် ($1)",
+ "poolcounter-usage-error": "သုၚ်စောဲ ဗၠေတ်:$1",
"aboutsite": "ပရူ {{SITENAME}}",
"aboutpage": "Project:ပရူ",
"copyright": "လိက်ဂှ် မံက် ပ္ဍဲ $1 ယဝ်ရတင်ယောင်ယာ မွဲမွဲ ဟွံမွဲမ္ဂး၊၊",
"disclaimers": "ဒဒှ်မဟွံဆက်စပ်",
"disclaimerpage": "Project:ဒဒှ်မဟွံဆက်စပ် နာနာ",
"edithelp": "အရီုအဗင် ပ္ဍဲအရာမပလေဝ်ဒါန်",
+ "helppage-top-gethelp": "ရီု",
"mainpage": "မုက်လိက်တမ်",
"mainpage-description": "မုက်လိက်တမ်",
+ "policy-url": "Project:မူဝါဒ",
"portal": "ပါင်မုက် ဂကောံ",
"portal-url": "Project:ပါင်မုက် ဂကောံ",
"privacy": "ပဝ်လသဳ မဆေင်ကဵု အခေါင်အရာပူဂဵု",
"privacypage": "Project:ပဝ်လသဳ အခေါင်ပူဂဵု",
+ "badaccess": "တင်သၠးအခေါင် ဗၠေတ်",
+ "badaccess-group0": "ညးလွဟ် ဟွံကလိဂွံအခေါၚ်သွက်ဂွံပသောၚ်သ္အး ကမၠောန်ညးလွဟ်မအာတ်လဝ်အခေါၚ်ဂှ်",
+ "ok": "ခိုဟ်",
"retrievedfrom": "ကလေင်သီကေတ်လဝ် နူ \"$1\"",
"youhavenewmessages": "{{PLURAL:$3|မၞး ကလိဂွံ}} $1 ($2).",
"youhavenewmessagesfromusers": "{{PLURAL:$4|မၞး ကလိဂွံ}} $1 နူ {{PLURAL:$3| မဒှ် ညးလွပ်တၞဟ်မွဲ|$3 ညးလွပ်ဂမၠိုင်}} ($2).",
"viewsourcelink": "ထ္ၜး တမ်ရိုဟ်",
"editsectionhint": "ဒၞာဲ မပလေဝ်ဒါန် - $1",
"toc": "မာတိကာ",
+ "showtoc": "ထ္ၜး",
+ "hidetoc": "ဗဒန်",
+ "collapsible-collapse": "ဒေါမ်",
+ "collapsible-expand": "သၠဲ",
+ "confirmable-confirm": "ဒှ်{{GENDER:$1|ညးလွပ်}} ချိုတ်ပၠိုတ်ဟာ",
+ "confirmable-yes": "ယွံ",
+ "confirmable-no": "ဟအှ်ေ",
+ "thisisdeleted": "ဗဵု ဟွံသေၚ် ကလၚ်စွံ $1 ဟာ",
+ "viewdeleted": "ဗဵု $1 ဟာ",
"site-atom-feed": "$1 ဒၞာဲ ဗလးပတိတ်",
"page-atom-feed": "\"$1\" ဒၞာဲ ဗလးပတိတ်",
"red-link-title": "$1(မုက်လဝ်ဏအ် ဟွံပြာကတ်)",
"mainpage-nstab": "မုက်လိက်တမ်",
"nosuchspecialpage": "မုက်လိက် တၟေင် ညံင်ရဴဏအ် ဟွံမဲ",
"nospecialpagetext": "<strong>မၞး အာတ်မိက်လဝ် မုက်လိက်တၟေင် မဟွံမဲမွဲရ၊၊</strong>\n\nစရင် မုက်လိက်တၟေင် မနွံတအ်ဂှ် ဂွံဆဵုကေတ် ပ္ဍဲ [[Special:SpecialPages|{{int:specialpages}}]].",
+ "error": "ဗၠေတ်",
+ "databaseerror-function": "ကမၠောန်: $1",
+ "databaseerror-error": "ဗၠေတ်: $1",
"badtitle": "က္ဍိုပ်လိက် ဟွံခိုဟ်",
"badtitletext": "မုက်လိက် မအာတ်မိက်လဝ်ဂှ် ဟွံသၟဟ်အစောမ်၊ သၠာတ်သၠးဒၟံင် ဟွံသေင်မ္ဂး ဆက်စၠောအ်လေန်လဝ် ကုအရေဝ်ဘာသာနာနာ ဟွံသေင်မ္ဂး က္ဍိုပ်လိက် အပ္ဍဲအကြာဝဳကဳ ဟွံဒးရ၊၊\nဟိုတ်နူ စကာလဝ် မလိက် နဒဒှ်က္ဍိုပ်လိက်ဟွံဂွံ ပါလုပ်ဒၟံင် မွဲမ ဟွံသေင်မ္ဂး မဂၠိုင် ကုမ လေဝ် ဒှ်မာန်ရ၊၊",
"viewsource": "ထ္ၜး တမ်ရိုဟ်",
"viewsource-title": "ဗဵု တမ်ရိုဟ် သွက် $1",
"viewsourcetext": "မၞး ဗဵု ကေုာံ စၠောအ်ကပ်ပဳကေတ် တမ်ရိုဟ် မုက်လိက်ဏအ် ဂွံရ၊၊",
+ "exception-nologin": "ဟွံ လုပ်လံက်အေန်လဝ်",
+ "welcomeuser": "ဒုၚ်တၠုၚ်,$1",
+ "welcomecreation-msg": "အကံက်မၞးခၞံကၠောန်တုဲယျ.\nမၞးပြံၚ်ကေတ်ဒြပ်မၞး{{SITENAME}}[[Special:စိတ်လုပ်စ|စိုတ်လုပ်စဂမၠိုၚ်]]ယဝ်မၞးနွံပၟိက်မ္ဂး.",
+ "yourname": "ယၟုညးလွပ်:",
"userlogin-yourname": "ယၟုညးလွပ်",
"userlogin-yourname-ph": "စုတ် ယၟုညးလွပ်",
+ "createacct-another-username-ph": "စုတ် ယၟုညးလွပ်",
+ "yourpassword": "မအက္ခရ်ဓလုက်",
"userlogin-yourpassword": "မလိက်ပၞုက်",
"userlogin-yourpassword-ph": "စုတ် မလိက်ပၞုက် မၞးညိ",
"createacct-yourpassword-ph": "စုတ် မလိက်ပၞုက် မွဲညိ",
+ "yourpasswordagain": "ကလေၚ်တက် မအက္ခရ်ဓလုက်:",
"createacct-yourpasswordagain": "ပဒတန် မလိက်ပၞုက်ညိ",
"createacct-yourpasswordagain-ph": "စုတ် မလိက်ပၞုက် မွဲဝါပၠန်ညိ",
"userlogin-remembermypassword": "လုပ်လံက်အေန်လဝ် အဲညိ၊၊",
+ "userlogin-signwithsecure": "သုၚ်စောဲလာၚ်ဆက်စၠောံမနွံကဵုဂီုကၠီုညိ",
+ "cannotlogin-title": "လုပ်လံက်အေန်ဟွံဂွံ",
+ "cannotlogin-text": "လုပ် လံက်အေန်ဂှ် ဒှ်ဟွံမာန်.",
+ "cannotloginnow-title": "လၟုဟ် လုပ်ဇၟိက်ဟွံဂွံ",
+ "cannotloginnow-text": "အဃောသုၚ်စောဲဒၟံၚ်$1ဂှ် လုပ်ဇၟိက်လံက်အေန် ဟွံဂွံ.",
+ "cannotcreateaccount-title": "ခၞံဗဒှ် အကံက် ဟွံဂွံ",
+ "cannotcreateaccount-text": "ခၞံကၠောန်အံက်တၟိဂှ် ဂွံဟွံမာန်ပ္ဍဲဝဳကဳဏအ်.",
+ "yourdomainname": "ဒိုမိန်မၞး :",
+ "password-change-forbidden": "မၞးလှာဲကေတ်မအက္ခရ်ပၞုက်ဂမၠိုၚ်ဟွံဂွံလ္တူဝဳကဳဏအ်.",
"login": "လုပ်လံက်အေန်",
+ "login-security": "သ္ပဒတန်လက်သဏ်ဇကုညိ",
+ "nav-login-createaccount": "လုပ်ဇၟိက်/ခၞံကၠောန် အကံက်",
+ "logout": "တိတ်",
+ "userlogout": "တိတ်",
+ "notloggedin": "ဟွံ လုပ်လံက်အေန်လဝ်",
"userlogin-noaccount": "ဟွံကလိဂွံ အကံက်ဏီ?",
"userlogin-joinproject": "လုပ်ပံင်တောဲ {{SITENAME}}",
"createaccount": "ခၞံကၠောန် အကံက်",
"userlogin-resetpassword-link": "ဝိုတ်စ မလိက်ပၞုက် မၞးဟာ?",
"userlogin-helplink2": "အရီုအဗင် သွက်ဂွံ လုပ်လံက်အေန်",
+ "userlogin-loggedin": "မၞးလုပ်မံၚ်လံက်အေန်တုဲဒၟံၚ်ညံၚ်{{GENDER:$1|$1}}\nသုၚ်စောဲကေတ်ဗီုပြၚ်သၟတ်သ္ဂောံလုပ်လံက်ပ္ဍဲညံၚ်ညးလွဟ်တၞဟ်.",
+ "userlogin-reauth": "မၞးထေက်ကဵုလံက်အေန်မွဲဝါပၠန်သွက်ဂွံသ္ပဒတန်ဒဒှ်ရမၞးဂှ် {{GENDER:$1|$1}}",
+ "userlogin-createanother": "ခၞံကၠောန် အကံက်တၞဟ်",
+ "createacct-emailrequired": "ဌာန်အဳမေလ်တအ်",
"createacct-emailoptional": "ဌာန်ဒၟံင် အဳမေဝ် (သ္ဒးစုတ်ဟေင်)",
"createacct-email-ph": "စုတ် ဌာန်ဒၟံင် အဳမေဝ် မၞးညိ",
+ "createacct-another-email-ph": "စုတ် ဌာန်ဒၟံင် အဳမေဝ်",
+ "createaccountmail": "သုၚ်စောဲကေတ်မအက္ခရ်ပၞုက်ဆဆဵုမွဲ တုဲ ပလံၚ်ဏာဍေံသွက်ဌာန်ဒတန်အဳမေလ်မစေအ်ဗိုတ်",
+ "createaccountmail-help": "သုၚ်စောဲကေတ်မာန် သ္ဂောံခၞံကၠောန်အကံက်သွက်ပူဂိုလ်တၞဟ် သီုဟွံမွဲကဵု အက္ခရ်ပၞုက်မကတ်လ္ၚတ်ဒၟံၚ်",
+ "createacct-realname": "ယၟု ဍာံ (optional)",
+ "createacct-reason": "ဟိုတ်",
+ "createacct-reason-ph": "မုဟိုတ်မၞးဂွံခၞံကၠောန်အကံက်တၞဟ်ခြာရော",
"createacct-submit": "ခၞံကၠောန် အကံက် မၞးညိ",
+ "createacct-another-submit": "ခၞံကၠောန် အကံက်",
"createacct-benefit-heading": "{{SITENAME}} ဂှ် ကၠောန်လဝ် နကဵု မၞိဟ် ညံင်ရဴမၞးကီုရ၊၊",
"createacct-benefit-body1": "{{PLURAL:$1|တင်ပလေဝ်ဒါန်|တင်ပလေဝ်ဒါန်ဂမၠိုင်}}",
"createacct-benefit-body2": "{{PLURAL:$1|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}",
"createacct-benefit-body3": "ခြာဟွံလအ် {{PLURAL:$1|ညးမခၞံကၠောန်|ညးမခၞံကၠောန်ဂမၠိုင်}}",
+ "loginsuccesstitle": "လံက်အေန်တုဲ",
+ "loginsuccess": "<strong>လၟုဟ်မၞးဂှ်လံက်အေန်လဝ်ပ္ဍဲသွက်{{SITNAME}}ညံၚ်\"$1\" .</strong>",
+ "accountcreated": "ခၞံကၠောန်အကံက်တုဲ",
+ "accountcreatedtext": "အကံက်ညးလွပ်သွက် [[{{ns:ညးလွပ်}}:$1|$1]],([[{{ns:ဓရီုကျာ ညးလွပ်}}:$1|ဓရီုကျာ]]) ခၞံကၠောန်တုဲယျ.",
+ "createaccount-title": "ခၞံကၠောန်အကံက်သွက်{{SITENAME}}",
+ "createaccount-text": "ညးမမိက်ကဵုမွဲခၞံကၠောန်လဝ်အကံက်သွက်အီမေလ်မၞး ပ္ဍဲ {{SITENAME}} ($4) မၞုံလဝ်ယၟု \"$2\", နကဵုအက္ခရ်ပၞုက်\"$3\".\nမၞးထေက်ကဵုလံက်အေန်တုဲ လှာဲထောံမအက္ခရ်ပၞုက်မၞ: လၟုဟ်ညိ.\nမၞးမထေက်ကဵုပမဇ္ဇျဟ်လိက်ဏံရ,ယဝ်အကံက်မခၞံကၠောန်လဝ်မဆောတ်ယောၚ်မ္ဂး.\n\nYou may ignore this message, if this account was created in error.",
+ "login-throttled": "မၞးကၠောန်သ္ပဂစာန်လံက်အေန်တုဲကၠုၚ်ဂှ် အတန်ဗွဲမဂၠိုၚ်ရ.\nသ္ပဂုဏ်တုဲမၚ်$1 ကိုပ်ကၠာနူဟွံဂစာန်မွဲအတန်ပၠန်.",
"loginlanguagelabel": "အရေဝ်ဘာသာ- $1",
"pt-login": "လုပ်လံက်အေန်",
"pt-login-button": "လုပ်လံက်အေန်",
+ "pt-login-continue-button": "ဆက် လုပ်လံက်အေန်",
"pt-createaccount": "ခၞံကၠောန် အကံက်",
"pt-userlogout": "တိတ်",
+ "changepassword": "လှာဲအက္ခရ်ပၞုက်",
+ "resetpass_announce": "သ္ဂောံတုဲဒှ် လုပ်လံက်အေန်, မၞးထေက်ဒဆိၚ်ကေတ် မအက္ခရ်ဗၞုက်တၟိ.",
+ "resetpass_header": "လှာဲမက္ခရ်ပၞုက်အကံက်",
+ "oldpassword": "မက္ခရ်ပၞုက်တြေံ:",
+ "newpassword": "မလိက်ပၞုက် တၟိ",
+ "retypenew": "ကလေၚ်တက် မအက္ခရ်ဓလုက်:",
+ "resetpass_submit": "ချိၚ်မလိက်ပၞုက် တုဲ လုပ်ဇၟိက်",
+ "changepassword-success": "မအက္ခရ်ပၞုက်မၞးဂှ် ပြံၚ်အာတုဲယျ!",
+ "changepassword-throttled": "မၞးကၠောန်သ္ပဂစာန်လံက်အေန်တုဲကၠုၚ်ဂှ် အတန်ဗွဲမဂၠိုၚ်ရ.\nသ္ပဂုဏ်တုဲမၚ်$1 ကိုပ်ကၠာနူဟွံဂစာန်မွဲအတန်ပၠန်.",
+ "botpasswords": "Bot အက္ခရ်ပၞုက်",
+ "botpasswords-disabled": "Bot မက္ခရ်ပၞုက်တအ်ဂှ် ဂွံဟွံမာန်.",
+ "botpasswords-label-appid": "ယၟု Bot:",
+ "botpasswords-label-create": "ခၞံကၠောန်",
+ "botpasswords-label-update": "ပခိုဟ်လဟဵု",
+ "botpasswords-label-cancel": "တးပဲါ",
+ "botpasswords-label-delete": "ဇိုတ်",
+ "botpasswords-label-resetpassword": "ကလေင်စုတ် မလိက်ပၞုက်",
+ "botpasswords-label-grants": "ဂရမ်မကလိဂွံမာန်:",
+ "botpasswords-bad-appid": "ယၟု bot \"$1\" ဂှ်ဟွံကိတ်ညဳ.",
+ "resetpass-submit-cancel": "တးပဲါ",
"passwordreset": "ကလေင်စုတ် မလိက်ပၞုက်",
+ "passwordreset-username": "ယၟုညးလွပ်:",
+ "passwordreset-email": "ဌာန်အဳမေလ်တအ်",
+ "passwordreset-emailtitle": "ခၞံကၠောန်အကံက်သွက်{{SITENAME}}",
"bold_sample": "မလိက် တီု",
"bold_tip": "မလိက် တီု",
"italic_sample": "မလိက်ဓစေင်",
"sig_tip": "စၟတ်တဲ မၞး နကဵု တဆိပ်အခိင်",
"hr_tip": "လာင် ဗွဲလနေင်",
"summary": "သကေမ်",
+ "subject": "ပရူပရာ\nဒါန်ပေၚ်အာ ၁၀၀၀ တုဲညးပလံၚ်နၚ် အခေါၚ်ခၞံမုက်လိက်ဏအ်။\nတၚ်ဂုဏ်ရ။",
"minoredit": "ဣဏအ်ဂှ် ဒှ်အရာ မပလေဝ်ဒါန် ညိည",
"watchthis": "မင်မဲ မုက်လိက်ဏအ်",
"savearticle": "ဂိုင်သိပ် မုက်လိက်",
+ "savechanges": "သီဂိုၚ်မပြံၚ်လှာဲတအ်",
+ "publishpage": "မုက်လိက်တက်တြး",
+ "publishchanges": "ပတိတ်တြး ပြံင်လှာဲအာ",
+ "savearticle-start": "ဂိုင်သိပ် မုက်လိက်",
+ "savechanges-start": "သီဂိုၚ်မပြံၚ်လှာဲတအ်",
+ "publishpage-start": "ပတိတ်တြး မုက်လိက်...",
+ "publishchanges-start": "ပတိတ်တြး ပြံင်လှာဲအာ",
"preview": "နမူနာ",
"showpreview": "ထ္ၜး နမူနာ",
"showdiff": "ထ္ၜး အရာမပြံင်လှာဲ",
"anoneditwarning": "<strong>သတိ</strong> မၞး ဟွံဂွံ လုပ်လံက်အေန်လဝ်ရ၊၊ IP address မၞး မံက်ဒၟံင်ရောင် ယဝ်ရ မၞးကၠောန်သ္ပ ပရေင်ပလေဝ်ပလေတ်မွဲမွဲမ္ဂး၊၊ ယဝ်ရ <strong>[$1 လုပ်လံက်အေန်]</strong> ဟွံသေင်မ္ဂး <strong>[$2 ခၞံကၠောန် အကံက်မွဲ]</strong>မ္ဂး၊ ပရေင်ပလေဝ်ဒါန်မၞး တြးပတိတ် နကဵု ယၟုသုင်စောဲ မၞးရောင်၊၊",
+ "blockedtitle": "ညးလွပ်ဂှ်ကၟာတ်အာယျ",
"blockedtext": "<strong>ယၟုညးလွပ် ဟွံသေင်မ္ဂး ဌာန်ဒၟံင်အာင်ဒဳမၞး ဒးဒုင်ကၟာတ်စဵုဒၞာလဝ်</strong>\n\nပွမကၟာတ်စဵုဒၞာဂှ် ကၠောန်လဝ် နကဵု $1.\nဟိုတ်မဂွံကၟာတ်စဵုဒၞာဂှ် <em>$2</em>.\n\n* အခိင်မစကၟာတ်စဵုဒၞာ- $8\n* အခိင်မကၟာတ်စဵုဒၞာအိုတ်- $6\n* မရန်တၟအ် blockee- $7\n\nမၞး ဆက်ကဵု $1 ဟွံသေင်မ္ဂး ညးတၞဟ်သအာင် [[{{MediaWiki:Grouppage-sysop}}|administrator]] ယဝ်ရ မိက်ဂွံ ပတိုန်ဂလာန် စပ်ကဵု မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ်ဂွံရ၊၊\nမၞး စကာ အဳမေလ် \"{{int:emailuser}}\" ဟွံဂွံရ၊၊ ဆဂး ယဝ်ရ ဌာန်ဒၟံင်အဳမေလ်ဂှ် ဒှ်အရာတၟေင် ပ္ဍဲ [[Special:Preferences|account preferences]] မၞး ကေုာံ မၞးဟွံဒးဒုင် ကၟာတ်စဵုဒၞာလဝ် နကဵုအဳမေဝ်ဂှ်မ္ဂး ဂွံမာန်ရ၊၊\nIP address မၞး လၟုဟ်ဂှ် ဒှ် $3, တုဲ ID မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ် ဒှ် #$5 ရ၊၊ \nယဝ်ရ မၞးမိက်ဂွံ သၟာန်မ္ဂး တင်ဂၞင် ဗွဲလတူတအ် သီုဖအိုတ်ဂှ် ဗၟံက်ထ္ၜးကဵုညိ၊၊",
+ "autoblockedtext": "<strong>ယၟုညးလွပ် ဟွံသေင်မ္ဂး ဌာန်ဒၟံင်အာင်ဒဳမၞး ဒးဒုင်ကၟာတ်စဵုဒၞာလဝ်</strong>\n\nပွမကၟာတ်စဵုဒၞာဂှ် ကၠောန်လဝ် နကဵု $1.\nဟိုတ်မဂွံကၟာတ်စဵုဒၞာဂှ် <em>$2</em>.\n\n* အခိင်မစကၟာတ်စဵုဒၞာ- $8\n* အခိင်မကၟာတ်စဵုဒၞာအိုတ်- $6\n* မရန်တၟအ် blockee- $7\n\nမၞး ဆက်ကဵု $1 ဟွံသေင်မ္ဂး ညးတၞဟ်သအာင် [[{{MediaWiki:Grouppage-sysop}}|administrator]] ယဝ်ရ မိက်ဂွံ ပတိုန်ဂလာန် စပ်ကဵု မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ်ဂွံရ၊၊\nမၞး စကာ အဳမေလ် \"{{int:emailuser}}\" ဟွံဂွံရ၊၊ ဆဂး ယဝ်ရ ဌာန်ဒၟံင်အဳမေလ်ဂှ် ဒှ်အရာတၟေင် ပ္ဍဲ [[Special:Preferences|account preferences]] မၞး ကေုာံ မၞးဟွံဒးဒုင် ကၟာတ်စဵုဒၞာလဝ် နကဵုအဳမေဝ်ဂှ်မ္ဂး ဂွံမာန်ရ၊၊\nIP address မၞး လၟုဟ်ဂှ် ဒှ် $3, တုဲ ID မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ် ဒှ် #$5 ရ၊၊ \nယဝ်ရ မၞးမိက်ဂွံ သၟာန်မ္ဂး တင်ဂၞင် ဗွဲလတူတအ် သီုဖအိုတ်ဂှ် ဗၟံက်ထ္ၜးကဵုညိ၊၊",
+ "whitelistedittext": "သ္ပဂုဏ်တုဲ$1 သ္ဂောံဒါန်မုက်လိက်တအ်.",
+ "confirmedittext": "မၞးထေက်ကဵုဒးသ္ပဒတန်ကဵု ဌာန်ဒတန်အဳမေလ်မၞးကိုပ်ကၠာနူဟွံဒါန်မုက်တအ်.\nသ္ပဂုဏ်တုဲ ချိၚ်ကေုာံဒတန် ဌာန်ဒတန်အဳမေလ်မၞး နူမၞး[[Special:ပၟိက်ဂၞပ်စိုတ်| ပၟိက်ဂၞပ်စိုတ်ညးလွပ်]].",
+ "loginreqtitle": "နွံပၟိက်ကဵု လံက်အေန်",
"loginreqlink": "လုပ်လံက်အေန်",
+ "loginreqpagetext": " သ္ပဂုဏ်တုဲ $1 သ္ဂောံဗဵုမုက်လိက်တၞဟ်တအ်.",
+ "accmailtitle": "ပြံၚ်ဏာ မအက္ခရ်ဗၞုက်",
"newarticletext": "မၞး စိုပ်အာ ဇရေင် မုက်လိက်လေန် မဟွံဂွံကၠောန်လဝ်ဏီရ၊၊\nသွက်ဂွံ ခၞံကၠောန် မုက်လိက်ဏအ်ဂှ် ပ္ဍဲခံက်အင် ဗွဲသၟဝ်ဏအ်ဂှ် စတက်စုတ် မလိက်ညိ\n(မိက်ဂွံ ဆက်တီ ပရူဏအ်မ္ဂး ဆက်ကျောဝ် ပ္ဍဲ[$1မုက်လိက်အရီုအဗင်]ညိ)။ ဟိုတ်နူဗၠေတ်တုဲ မၞး စိုပ်ကၠုင် ပ္ဍဲဒၞာဲဏအ်မ္ဂး ဍဵု <strong>back</strong> တုဲ ကလေင်အာ ဒၞာဲတြေံညိ၊၊",
"anontalkpagetext": "----\n<em>မုက်လိက်ဏအ်ဂှ် ဒှ်ဒၞာဲ သွက်မၞိဟ် မဟွံဗမံက်ယၟု၊ မၞိဟ်ဟွံဂွံကၠောန်လဝ် အကံက်တအ်ဏီ ဂွံပတိုန်လညာတ် ပါ်ပဲါရ၊၊</em>\nဟိုတ်ဂှ်ရ ပိုယ်ဒးစကာ မဂၞန် IP address သွက်ဂွံ တီညးတအ်ရ၊၊ IP address ဗီုဏအ်မွဲမွဲဂှ် ပါ်ပရအ်ဂွံ ညးလွပ် ဗွဲမဂၠိုင်ရ၊၊ ယဝ်ရ မၞးဂှ် ဒှ်ညးလွပ် မဟွံဗမံက်ယၟုမွဲ စှ်ေစိုတ် တင်ဂလာန်တအ်ဏအ်ဂှ် ဒှ်ဟွံထေက်မ္ဂး ပဂုန်တုဲ [[Special:CreateAccount|ခၞံကၠောန် အကံက်မွဲ]] ဟွံသေင်မ္ဂး [[Special:UserLogin|လုပ်လံက်အေန်]] သွက်ဂွံ ဝေင်ပဲါ ညးလွပ် မဟွံဗမံက်ယၟုတအ်တၞဟ်တအ်ရ၊၊",
"noarticletext": "ပ္ဍဲမုက်လိက်ဏအ် လိက်ဟွံမွဲဏီရ၊၊\nမၞး ဂၠာဲကေတ် [[Special:Search/{{PAGENAME}}|search for this page title]] ပ္ဍဲမုက်လိက်တၞဟ်မ္ဂး ကလိဂွံမာန်ရောင်၊၊\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nဟွံသေင်မ္ဂး [{{fullurl:{{FULLPAGENAME}}|action=edit}} ခၞံကၠောန် လိက်မုက်ဏအ်ညိ၊၊]</span>.",
"subject-preview": "विषयाची झलक:",
"previewerrortext": "आपल्या बदलांची झलक बघण्याचे प्रयत्नादरम्यान त्रुटी उद्भवली.",
"blockedtitle": "हा सदस्य प्रतिबंधित आहे",
- "blockedtext": "'''तुमचे सदस्यनाव अथवा IP पत्ता ब्लॉक केलेला आहे.'''\n\nहा ब्लॉक $1 यांनी केलेला आहे.\nयासाठी ''$2'' हे कारण दिलेले आहे.\n\n* ब्लॉकची सुरूवात: $8\n* ब्लॉकचा शेवट: $6\n* कुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही ह्या ब्लॉक संदर्भातील चर्चेसाठी $1 अथवा [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकांशी]] संपर्क करू शकता.\nतुम्ही जोवर वैध ई-मेल पत्ता आपल्या [[Special:Preferences|'माझ्या पसंती']] पानावर देत नाही तोवर तुम्ही ’सदस्याला ई-मेल पाठवा’ हा दुवा वापरू शकत नाही. तसेच असे करण्यापासून आपल्याला ब्लॉक केलेले नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे.\nकृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
+ "blockedtext": "<strong>तुमचे सदस्यनाव अथवा IP पत्ता ब्लॉक केलेला आहे.<strong>\n\nहा ब्लॉक $1 यांनी केलेला आहे.\nयासाठी </em>$2</em> हे कारण दिलेले आहे.\n\n* ब्लॉकची सुरूवात: $8\n* ब्लॉकचा शेवट: $6\n* कुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही ह्या ब्लॉक संदर्भातील चर्चेसाठी $1 अथवा [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकांशी]] संपर्क करू शकता.\nतुम्ही जोवर वैध ई-मेल पत्ता आपल्या [[Special:Preferences|'माझ्या पसंती']] पानावर देत नाही तोवर तुम्ही ’सदस्याला ई-मेल पाठवा’ हा दुवा वापरू शकत नाही. तसेच असे करण्यापासून आपल्याला ब्लॉक केलेले नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे.\nकृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
"autoblockedtext": "तुमचा आंतरजालीय अंकपत्ता आपोआप स्थगित केला आहे कारण तो इतर अशा सदस्याने वापरला, ज्याला $1ने प्रतिबंधित केले.\nआणि दिलेले कारण खालील प्रमाणे आहे\n:''$2''\nब्लॉकची सुरूवात: $8\nब्लॉकचा शेवट: $6\nकुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही $1शी संपर्क करू शकता किंवा इतर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकां पैकी]] एकाशी स्थगनाबद्दल चर्चा करू शकता.\n\n[[Special:Preferences|सदस्य पसंतीत]]त शाबीत विपत्र पत्ता नमूद असल्या शिवाय आणि तुम्हाला तो वापरण्या पासून प्रतिबंधित केले असल्यास तुम्ही \"या सदस्यास विपत्र पाठवा\" सुविधा वापरू शकणार नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे. \nतुमचा स्थगन क्र $5 आहे. कृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
"blockednoreason": "कारण दिलेले नाही",
"whitelistedittext": "लेखांचे संपादन करण्यासाठी आधी $1 करा.",
"accmailtext": "[[User talk:$1|$1]] यांसाठी अनियतक्रमाने निर्मित केलेला परवलीचा शब्द $2 यांना पाठवण्यात आला आहे.\n\nया नवीन खात्यासाठीचा परवलीचा शब्द,सनोंद-प्रवेश घेतल्यावर [[Special:ChangePassword|परवलीचा शब्द बदला]] येथे बदलता येईल.",
"newarticle": "(नवीन लेख)",
"newarticletext": "आपण सध्या अस्तित्त्वात नसलेल्या पानाच्या दुव्याचा मागोवा घेत आला आहात.\nहे पान नव्याने तयार करण्यासाठी खालील पेटीत टंकन करणे सुरु करा(अधिक माहितीसाठी [$1 साहाय्य पान] बघा).\n\nजर आपण येथे चुकून आला असाल तर ब्राउझरच्या <strong>परत</strong>(बॅक) कळीवर टिचकी द्या.",
- "anontalkpagetext": "<em>हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत.</em> \nत्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. \nजर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:CreateAccount| खाते तयार करा]] किंवा [[Special:CreateAccount|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.",
+ "anontalkpagetext": "<em>हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत.</em> \nत्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. \nजर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:CreateAccount| खाते तयार करा]] किंवा [[Special:CreateAccount|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.",
"noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}}तयार करू शकता]</span>.",
"noarticletext-nopermission": "सध्या या लेखात काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये [[Special:Search/{{PAGENAME}}| या मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
"missing-revision": "\"{{FULLPAGENAME}}\" या लेखाचे #$1 हे संस्करण अस्तित्वात नाही.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे असे होते.याबाबत विस्तृत माहिती [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी]येथे बघता येईल.",
"recentchangeslinked-feed": "या पृष्ठासंबंधीचे बदल",
"recentchangeslinked-toolbox": "या पृष्ठासंबंधीचे बदल",
"recentchangeslinked-title": "\"$1\" च्या संदर्भातील बदल",
- "recentchangeslinked-summary": "हे पृष्ठ एखाद्या विशिष्ट पानाशी, (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी), जोडलेल्या पानांवरील बदल दर्शविते.\nआपल्या [[Special:Watchlist|निरीक्षणसूचीत]] ही पाने <strong>ठळक</strong> दिसतील.",
+ "recentchangeslinked-summary": "हे पृष्ठ एखाद्या विशिष्ट पानाशी, (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी), जोडलेल्या पानांवरील बदल दर्शविते.एखाद्या वर्गातील पाने पाहाण्यासाठी तो वर्ग लिहा\nआपल्या [[Special:Watchlist|निरीक्षणसूचीत]] ही पाने <strong>ठळक</strong> दिसतील.",
"recentchangeslinked-page": "पृष्ठ नाव:",
"recentchangeslinked-to": "याऐवजी दिलेल्या पानाला जोडलेल्या पानांवरील बदल दाखवा",
"recentchanges-page-added-to-category": "[[:$1]] हे पान या वर्गास जोडले",
"imagelinks": "संचिका वापर",
"linkstoimage": "खालील {{PLURAL:$1|पान चित्राशी जोडले आहे|$1 पाने चित्रांशी जोडली आहेत}}:",
"linkstoimage-more": "या संचिके ला $1 {{PLURAL:$1|पान जोडले|पाने जोडली}} आहेत.\nखालील यादी या संचिके ला जोडलेल्या {{PLURAL:$1|पहिल्या पानाचा दुवा |पहिल्या $1 पानांचे दुवे }}दर्शविते.\n[[Special:WhatLinksHere/$2|संपुर्ण यादी]] उपलब्ध आहे.",
- "nolinkstoimage": "या चित्राशी जोडलेली पृष्ठे नाही आहेत.",
+ "nolinkstoimage": "या चित्राशी जोडलेली पृष्ठे नाहीत.",
"morelinkstoimage": "या संचिकेचे [[Special:WhatLinksHere/$1|अधिक दुवे]] पहा.",
"linkstoimage-redirect": "$1 (संचिका पुनर्निर्देशन) $2",
"duplicatesoffile": "खालील संचिका या दिलेल्या {{PLURAL:$1|संचिकेची प्रत आहे|$1 संचिकांच्या प्रती आहेत}}. [[Special:FileDuplicateSearch/$2|अधिक माहिती]]",
"next": "နောက်ထပ်",
"last": "ယခုမတိုင်မီ",
"page_first": "ပထမဆုံး",
- "page_last": "á\80¡á\80\94á\80±á\80¬á\80\80á\80ºá\80\86á\80¯á\80¶á\80¸",
+ "page_last": "နောက်ဆုံး",
"histlegend": "တည်းဖြတ်မူများကို နှိုင်းယှဉ်ရန် radio boxes လေးများကို မှတ်သားပြီးနောက် Enter ရိုက်ချပါ သို့ အောက်ခြေမှ ခလုတ်ကို နှိပ်ပါ။<br />\nLegend: <strong>({{int:cur}})</strong> = နောက်ဆုံးမူနှင့် ကွဲပြားချက် <strong>({{int:last}})</strong> = ယင်းရှေ့မူနှင့် ကွဲပြားချက်, <strong>{{int:minoreditletter}}</strong> = အရေးမကြီးသော ပြုပြင်မှု.",
"history-fieldset-title": "ယခင်မူများ ရှာဖွေရန်",
"history-show-deleted": "ဖျက်ထားသော မူများသာ",
"booksources": "မှီငြမ်း စာအုပ်များ",
"booksources-search-legend": "စာအုပ်ရင်းမြစ်များကို ရှာရန်",
"booksources-search": "ရှာဖွေရန်",
+ "booksources-text": "အောက်ပါတို့သည် အသုံးပြုပြီးသားနှင့် စာအုပ်သစ်များကို ရောင်းချသော အခြားဆိုဒ်လင့်ခ်များစာရင်းဖြစ်သည်၊ သင်ရှာဖွေနေသော စာအုပ်များနှင့်ပတ်သက်သည့် အခြားသတင်းအချက်အလက်လည်း ရှိနိုင်ပါသည်:",
+ "booksources-invalid-isbn": "ပေးထားသော ISBN မှာ ဆီလျော်သည့်ပုံစံ မရှိပါ၊ မူလရင်းမြစ်မှ ကော်ပီကူးခြင်းအမှားများအတွက် စစ်ဆေးကြည့်ပါ။",
"specialloguserlabel": "ဆောင်ရွက်သူ -",
"speciallogtitlelabel": "ရည်ရွယ်ရာ (ခေါင်းစဉ် သို့ {{ns:user}}:အသုံးပြုသူအတွက် အသုံးပြုအမည်):",
"log": "မှတ်တမ်းများ",
"exif-dc-contributor": "ဆောင်ရွက်ပေးထားသူများ",
"exif-dc-source": "ရင်းမြစ် မီဒီယာ",
"exif-dc-type": "မီဒီယာ အမျိုးအစား",
+ "exif-rating-rejected": "ငြင်းပယ်ခဲ့သည်",
"exif-iimcategory-ace": "အနုပညာ၊ ယဥ်ကျေးမှုနှင့် ဖြေဖျော်ရေး",
"exif-iimcategory-clj": "ရာဇဝတ်မှုနှင့် ဥပဒေ",
"exif-iimcategory-dis": "ဘေးအန္တရာယ်များနှင့် မတော်တဆမှုများ",
"authmanager-realname-label": "အမည်ရင်း",
"authmanager-realname-help": "အသုံးပြုသူ၏ အမည်ရင်း",
"authmanager-provider-temporarypassword": "ယာယီစကားဝှက်",
+ "authprovider-resetpass-skip-label": "ကျော်ရန်",
"cannotauth-not-allowed-title": "ခွင့်ပြုချက် ငြင်းပယ်လိုက်သည်",
"cannotauth-not-allowed": "သင်သည် ဤစာမျက်နှာကို အသုံးပြုခွင့်မရှိပါ",
"edit-error-short": "အမှား - $1",
"deletecomment": "Lí-iû:",
"rollback": "Kā siu-kái ká tńg khì",
"rollbacklink": "ká tńg khì",
+ "rollbacklinkcount": "Ká tńg $1 kái {{PLURAL:$1|pian-chi̍p|pian-chi̍p}}",
"rollbackfailed": "Ká bē tńg khì",
"cantrollback": "Bô-hoat-tō· kā siu-kái ká-tńg--khì; téng ūi kòng-hiàn-chiá sī chit ia̍h î-it ê chok-chiá.",
"alreadyrolled": "Bô-hoat-tō· kā [[User:$2|$2]] ([[User talk:$2|Thó-lūn]]) tùi [[:$1]] ê siu-kái ká-tńg-khì; í-keng ū lâng siu-kái a̍h-sī ká-tńg chit ia̍h. Téng 1 ūi siu-kái-chiá sī [[User:$3|$3]] ([[User talk:$3|Thó-lūn]]).",
"customcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
"customjsonprotected": "Nun v'è permesso 'a cagnà sta paggena JSON, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
"customjsprotected": "Nun v'è permesso 'a cagnà sta paggena JavaScript, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
- "sitecssprotected": "Nun téne premmesse pe' puté cagnà sta paggena CSS pecché putesse dà prubbleme a 'e vvisite",
- "sitejsonprotected": "Nun téne premmesse pe' puté cagnà sta paggena JSON pecché putesse dà prubbleme a 'e vvisite",
+ "sitecssprotected": "Nun téne premmesse pe' puté cagnà sta paggena CSS pecché putesse dà prubbleme a 'e vvisite.",
+ "sitejsonprotected": "Nun téne premmesse pe' puté cagnà sta paggena JSON pecché putesse dà prubbleme a 'e vvisite.",
+ "sitejsprotected": "Nun téne premmesse pe' puté cagnà sta paggena JavaScript pecché putesse dà prubbleme a 'e vvisite.",
"mycustomcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS.",
"mycustomjsonprotected": "Nun v'è permesso 'a cagnà sta paggena JSON.",
"mycustomjsprotected": "Nun v'è licenzia pe cagnà sta paggena JavaScript.",
"diff-multi-otherusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a {{PLURAL:$2|n'at'utente|$2 n'ati ddoj'utente}} nun è mmustata)",
"diff-multi-manyusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a cchiù 'e $2 {{PLURAL:$2|utente|utente}} nun è mmustata)",
"diff-paragraph-moved-tonew": "'O paragrafo è stato spustat. Facite clic pe' puté cagnà dint'a nova posiziona.",
+ "diff-paragraph-moved-toold": "'O paragrafo è stato spustat. Facite clic pe' puté cagnà dint' 'o posto viecchio.",
"difference-missing-revision": "{{PLURAL:$2|Na virziona|$2 verziune}} 'e sta differenza ($1) {{PLURAL:$2|nun è stata truvata|nun so' state truvate}}.\n\nChest'è succiesso quanno s'è secutato nu diff obsoleto a na paggena scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellamiente].",
"searchresults": "Risultato d''a recerca",
+ "search-filter-title-prefix": "Ascià surtanto dint' 'e paggene c' 'o titolo c'accumencia pe' \"$1\"",
+ "search-filter-title-prefix-reset": "Ascìa tutt' 'e paggene",
"searchresults-title": "Ascià risultate ppe \"$1\"",
"titlematches": "Currispunnenze d' 'o titolo d' 'e paggene",
"textmatches": "Currispunnenze d' 'o testo d' 'e paggene",
"prefs-editwatchlist-clear": "Sbacanta l'elenco 'e paggene cuntrullate",
"prefs-watchlist-days": "Nummero 'e juorne 'a mmustà dint'a l'elenco 'e cuntrollo:",
"prefs-watchlist-days-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
- "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà ch' 'e funziune avanzate:",
+ "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà dint' a l'elenco 'e paggene cuntrullate:",
"prefs-watchlist-edits-max": "Nummero massimo: 1000",
"prefs-watchlist-token": "Token 'e l'elenco 'e cuntrollo:",
+ "prefs-watchlist-managetokens": "Gestisce 'e tokén",
"prefs-misc": "Varje",
"prefs-resetpass": "Cagna 'a password",
"prefs-changeemail": "Cagna o lèva l'indirizzo e-mail",
"stub-threshold-disabled": "Stutato",
"recentchangesdays": "Nummero 'e juorne a mmustà dint'a l'urdeme cagnamiente:",
"recentchangesdays-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
- "recentchangescount": "Nummero predefinito 'e cagnamiente 'a mmustà:",
- "prefs-help-recentchangescount": "Chesto ntenne ll'urdeme cagnamiente, 'e cronologgie 'e paggena, e riggistre.",
- "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'elenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'elenco 'e cuntrollo, picciò nun 'a spartite. [[Special:ResetTokens|Cliccate ccà se tenite necessità d' 'a rimpizzà]].",
+ "recentchangescount": "Nummero predefinito 'e cagnamiente 'a mmustà dint' 'e paggene 'e cagnamiente 'e mo, cronologgie e riggistre:",
+ "prefs-help-recentchangescount": "Nummero massimo: 1000",
+ "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'elenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'elenco vuost' 'e cuntrollo, picciò nun 'a spartite.\nSi ve serve, [[Special:ResetTokens|facite clic ccà p' 'a rimpizzà]].",
+ "prefs-help-tokenmanagement": "Putite vedé e mpustà n'ata vota 'a chiave segreta pe' l'utenza d' 'a vosta pe' ve puté fà trasì dint' 'o feed web 'e paggene cuntrullate 'a vuje. Chi canuscesse sta chiave putesse leggere 'e paggene cuntrullate vuoste, picciò, tenit' 'a mente e nun 'a spartí.",
"savedprefs": "'E preferenze songo state sarvate.",
"savedrights": "'E dritte 'e gruppe 'utente {{GENDER:$1|$1}} sto state sarvate.",
"timezonelegend": "Fuso orario:",
"timezoneregion-indian": "Oceano Indiano",
"timezoneregion-pacific": "Oceano Pacifeco",
"allowemail": "Abbìa 'a ricezione 'e mmasciate mannate 'a l'ati utente",
+ "email-allow-new-users-label": "Abbìa 'a ricezione 'e mmasciate 'a l'ati utente nuove nuove",
+ "email-blacklist-label": "Nun permettere chist' utente 'e me mannà masciate:",
"prefs-searchoptions": "Ascìa",
"prefs-namespaces": "Namespace",
"default": "predefinito",
"prefs-files": "File",
"prefs-custom-css": "CSS personalizzato",
+ "prefs-custom-json": "JSON personalizzato",
"prefs-custom-js": "JavaScript personalizzato",
- "prefs-common-config": "CSS/JavaScript spartuto pe' tutt' 'e skin:",
+ "prefs-common-config": "CSS/JSON/JavaScript spartuto pe' tutt' 'e skin:",
"prefs-reset-intro": "Putisse ausà sta paggena pe' rimpizzà 'e preferenze proprie comme chille predefinite d' 'o sito.\nL'operazione nun se può annullà.",
"prefs-emailconfirm-label": "Cunferma 'e ll'e-mail:",
"youremail": "E-mail:",
"prefs-dateformat": "Furmato data",
"prefs-timeoffset": "Ore 'e differenza",
"prefs-advancedediting": "Opziune generale",
+ "prefs-developertools": "Strumiente p' 'e sviluppature",
"prefs-editor": "Editore",
"prefs-preview": "Anteprimma",
"prefs-advancedrc": "Opziune avanzate",
+ "prefs-opt-out": "Stuta miglioramente",
"prefs-advancedrendering": "Opziune avanzate",
"prefs-advancedsearchoptions": "Opziune avanzate",
"prefs-advancedwatchlist": "Opziune avanzate",
"group-autoconfirmed": "Utente autocunfermate",
"group-bot": "Bot",
"group-sysop": "Ammenistrature",
+ "group-interface-admin": "Ammenistrature 'e ll'interfaccia",
"group-bureaucrat": "Burocrate",
"group-suppress": "Soppressure",
"group-all": "(tutte)",
"group-autoconfirmed-member": "{{GENDER:$1|utente autocunfermato|utente autocunfermata|utente autocunfermato/a}}",
"group-bot-member": "{{GENDER:$1|bot}}",
"group-sysop-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}}",
+ "group-interface-admin-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}} 'e ll'interfaccia",
"group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
"group-suppress-member": "{{GENDER:$1|suppressure|supprimitrice}}",
"grouppage-user": "{{ns:project}}:Utente",
"grouppage-autoconfirmed": "{{ns:project}}:Utente autocunfermate",
"grouppage-bot": "{{ns:project}}:Bot",
"grouppage-sysop": "{{ns:project}}:Ammenistrature",
+ "grouppage-interface-admin": "{{ns:project}}:Ammenistrature 'e ll'interfaccia",
"grouppage-bureaucrat": "{{ns:project}}:Burocrate",
"grouppage-suppress": "{{ns:project}}:Suppressure",
"right-read": "Liegge paggene",
"right-editcontentmodel": "Cagna 'o modello 'e cuntenute 'e na paggena",
"right-editinterface": "Modifeca 'a nterfaccia utente",
"right-editusercss": "Cagna 'e file CSS 'e l'at'utente",
+ "right-edituserjson": "Cagna 'e file JSON 'e l'at'utente",
"right-edituserjs": "Cagna 'e file JS e l'at'utente",
+ "right-editsitecss": "Cagna 'e CSS p' 'o sito sano",
+ "right-editsitejson": "Cagna 'e JSON p' 'o sito sano",
+ "right-editsitejs": "Cagna 'e JavaScript p' 'o sito sano",
"right-editmyusercss": "Cagna 'e proprie file CSS",
+ "right-editmyuserjson": "Cagna 'e proprie file JSON",
"right-editmyuserjs": "Cagna 'e proprie file JavaScript",
"right-viewmywatchlist": "Vide l'elenco 'e cuntrollo proprio",
"right-editmywatchlist": "Cagna l'elenco 'e cuntrollo proprio. Vedete ca cocch'azione putesse jògnere ancora paggene senza stu deritto.",
"grant-createaccount": "Crìa cunte",
"grant-createeditmovepage": "Créa, cagna e móve paggene",
"grant-delete": "Scancella paggene, verziune, trasute 'e riggistro",
- "grant-editinterface": "Cagna 'o namespace MediaWiki e CSS/JavaScript 'e ll'utente",
- "grant-editmycssjs": "Cagna 'e CSS/JavaScript 'e ll'utenza d' 'a vosta",
+ "grant-editinterface": "Cagna 'o namespace MediaWiki 'e ll'utente/JSON p' 'o sito sano",
+ "grant-editmycssjs": "Cagna 'e CSS/JSON/JavaScript 'e ll'utenza d' 'a vosta",
"grant-editmyoptions": "Cagna 'e preferenze utente proprie",
"grant-editmywatchlist": "Cagna l'elenco 'e cuntrolo 'o tuojo",
+ "grant-editsiteconfig": "Cagna 'e CSS/JS p' 'o sito sano",
"grant-editpage": "Cagna 'e paggene esistente",
"grant-editprotected": "Cagna 'e paggine prutette",
"grant-highvolume": "Cagnamiente massive",
"action-writeapi": "usa l'API 'n scrittura",
"action-delete": "scancèlla chesta paggena",
"action-deleterevision": "scancellà 'e verziune",
+ "action-deletelogentry": "scancellà riggistro",
"action-deletedhistory": "vide 'a cronologgia scancellata 'e sta paggena",
+ "action-deletedtext": "vide 'a verziona d' 'o testo scancellato",
"action-browsearchive": "ascìa dint' 'e paggene scancellate",
"action-undelete": "arripiglia chesta paggena",
"action-suppressrevision": "rivedé e arripiglià 'e cagnamiente annascunnute",
"action-userrights-interwiki": "cagna 'e deritte 'e ll'utente int'a l'ati wiki",
"action-siteadmin": "blocca o sblocca 'o database",
"action-sendemail": "manna e-mail",
+ "action-editmyoptions": "cagna 'e preferenze proprie",
"action-editmywatchlist": "cagna l'elenco 'e cuntrolo 'o tuojo",
"action-viewmywatchlist": "vide l'elenco 'e cuntrollo proprio",
"action-viewmyprivateinfo": "vide 'e date perzunale",
"recentchanges-legend": "Opzione urdeme cagnamiénte",
"recentchanges-summary": "Ncopp'a chesta paggena song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
"recentchanges-noresult": "Nisciuno cagnamiento dint'o periodo dato ca soddisfà sti criterie.",
+ "recentchanges-timeout": "Sta ricerca è ammaturata mo. Si tu vulisse, putisse tentà n'ati parametre 'e cerca.",
+ "recentchanges-network": "Pe' bbìa 'e n'errore tecnico, nun se pò carecà nisciuno risultato. Facite agghiurnamento d' 'a paggena.",
+ "recentchanges-notargetpage": "Azzeccate ncoppa 'o nomme 'e na paggena pe' puté vedé 'e cagnamiente 'e chesta paggena.",
"recentchanges-feed-description": "Ncoppa chistu feed song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
"recentchanges-label-newpage": "Chisto cagno ha criato na paggena nova",
"recentchanges-label-minor": "Chisto è nu cagnamiénto piccerillo",
"recentchanges-legend-heading": "<strong>Liggenda:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide [[Special:NewPages|'e paggene nove]])",
"recentchanges-submit": "Faje vedé",
+ "rcfilters-tag-remove": "Léva '$1'",
+ "rcfilters-legend-heading": "<strong>Elenco abbreviaziune:</strong>",
+ "rcfilters-other-review-tools": "Ate strumiente 'e cuntrollo",
+ "rcfilters-group-results-by-page": "Arricetta risultate pe' paggena",
+ "rcfilters-activefilters": "Filtre appicciate",
+ "rcfilters-activefilters-hide": "Annascunne",
+ "rcfilters-activefilters-show": "Faje vedé",
+ "rcfilters-activefilters-hide-tooltip": "Annascunne l'area 'e filtre appicciate",
+ "rcfilters-activefilters-show-tooltip": "Fà vedé l'area 'e filtre appicciate",
+ "rcfilters-advancedfilters": "Filtre avanzate",
+ "rcfilters-limit-title": "Risultate 'a fà vedé",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}, $2",
+ "rcfilters-date-popup-title": "Periodo 'e tiempo a cercà",
+ "rcfilters-days-title": "Ùrdeme juorne",
+ "rcfilters-hours-title": "Ùrdeme ore",
+ "rcfilters-days-show-days": "$1 {{PLURAL:$1|juorno|juorne}}",
+ "rcfilters-days-show-hours": "$1 {{PLURAL:$1|ora|ore}}",
+ "rcfilters-highlighted-filters-list": "Evidenziato: $1",
+ "rcfilters-quickfilters": "Filtre riggistrate",
+ "rcfilters-quickfilters-placeholder-title": "Nisciuno filtro riggistrato",
+ "rcfilters-savedqueries-defaultlabel": "Filtre riggistrate",
+ "rcfilters-savedqueries-rename": "Renommena",
+ "rcfilters-savedqueries-setdefault": "Mpustà comme predefinito",
+ "rcfilters-savedqueries-unsetdefault": "Léva cumme predefinito",
+ "rcfilters-savedqueries-remove": "Scancèlla",
+ "rcfilters-savedqueries-new-name-label": "Nomme",
+ "rcfilters-savedqueries-apply-label": "Crea filtro",
+ "rcfilters-savedqueries-cancel-label": "Scancella",
+ "rcfilters-clear-all-filters": "Pulezza tutt' 'e filtre",
+ "rcfilters-show-new-changes": "Vide 'e cagnamiente cchiù nnove",
+ "rcfilters-invalid-filter": "Filtro invalido",
+ "rcfilters-filterlist-title": "Filtre",
+ "rcfilters-filterlist-whatsthis": "Cumme funzionano?",
+ "rcfilters-highlightbutton-title": "Evidenzia risultate",
+ "rcfilters-filterlist-noresults": "Nisciuno filtro truvato",
+ "rcfilters-filtergroup-authorship": "Autore d' 'o cuntribbuto",
+ "rcfilters-filtergroup-lastRevision": "Ùrdeme verziune",
+ "rcfilters-filter-lastrevision-label": "Verzione 'e mmo",
"rcnotefrom": "Ccà abbascio {{PLURAL:$5|è alencato 'o cagnamiento appurtato|song' alincate 'e cagnamiente appurtate}} 'a <strong>$3, $4</strong> (mmustate nfin'a <strong>$1</strong>).",
"rclistfrom": "Faje vedé 'e cagnamiénte fatte a partì 'a $3 $2",
"rcshowhideminor": "$1 'e cagnamiénte piccerille",
"redirect-file": "Filnavn",
"redirect-logid": "Logg-ID",
"redirect-not-exists": "Verdi er ikke funnet",
+ "redirect-not-numeric": "Verdien er ikke numerisk",
"fileduplicatesearch": "Søk etter duplikatfiler",
"fileduplicatesearch-summary": "Søk etter duplikatfiler basert på dets hash-verdi.",
"fileduplicatesearch-filename": "Filnavn:",
"move-page-legend": "Pagina hernoemen",
"movepagetext": "Door middel van het onderstaande formulier kunt u een pagina hernoemen.\nDe geschiedenis gaat mee naar de nieuwe pagina.\n* De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\n* Koppelingen naar de oude pagina worden niet aangepast.\n* De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.\nAls u dit niet wenst, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan <strong>alleen</strong> hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\n\n<strong>Opmerking:</strong>\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
"movepagetext-noredirectfixer": "Door middel van het onderstaande formulier kunt u een pagina en alle bijbehorende oude versies hernoemen.\nDe oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\nControleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan <strong>alleen</strong> hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\nU kunt dus een pagina die per ongeluk is hernoemd terug hernoemen en u kunt een bestaande pagina niet overschrijven. \n\n<strong>Opmerking:</strong>\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
- "movepagetalktext": "Als u het onderstaande vinkje selecteert, krijgt de bijbehorende overlegpagina automatisch een andere naam, tenzij de overlegpagina onder de nieuwe naam al bestaat.\n\nIn dit geval moet u de pagina handmatig hernoemen of samenvoegen.",
+ "movepagetalktext": "Als u deze optie inschakelt krijgt de bijbehorende overlegpagina automatisch een andere naam, tenzij de overlegpagina onder de nieuwe naam al bestaat.\n\nIn dit geval moet u de pagina handmatig hernoemen of samenvoegen.",
"moveuserpage-warning": "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
"movecategorypage-warning": "<strong>Waarschuwing:</strong> U staat op het punt een categoriepagina te hernoemen. Houdt u er rekening mee dat alleen de categoriepagina zelf hernoemd wordt; pagina's in de oude categorie worden <em>niet</em> automatisch naar de nieuwe verplaatst.",
"movenologintext": "U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.",
"redirect-file": "Bestandsnaam",
"redirect-logid": "Logboekregel-ID",
"redirect-not-exists": "Waarde niet gevonden",
+ "redirect-not-numeric": "Waarde is geen nummer",
"fileduplicatesearch": "Duplicaatbestanden zoeken",
"fileduplicatesearch-summary": "Duplicaatbestanden zoeken op basis van de hashwaarde.",
"fileduplicatesearch-filename": "Bestandsnaam:",
"version-skin-colheader-name": "ସ୍କିନ",
"version-ext-colheader-version": "ସଂସ୍କରଣ",
"version-ext-colheader-license": "ଲାଇସେନ୍ସ",
- "version-ext-colheader-description": "ବର୍ଣନା",
+ "version-ext-colheader-description": "ବରà\8dଣà\8dଣନା",
"version-ext-colheader-credits": "ଲେଖକମାନେ",
"version-license-title": "$1 ପାଇଁ ଲାଇସେନ୍ସ",
"version-license-not-found": "ଏହି ଏକ୍ସଟେନସନରେ କୌଣସି ସବିଶେଷ ସୂଚନା ନାହିଁ ।",
"note": "'''Hiwes:'''",
"previewnote": "'''Deng'g drõõ, dasses nua e Vorschau isch.'''\nDoi Ännarunge sinn noch nedd gschbaischadd worre!",
"editing": "An de Said $1 schaffe",
- "creating": "Magschd $1",
+ "creating": "$1 aaleche",
"editingsection": "$1 schaffe (Deel)",
"editingcomment": "$1 schaffe (Deel)",
"editconflict": "Schdraid ums Ännare: $1",
"right-suppressionlog": "Podgląd rejestru ukrywania",
"right-block": "Blokowanie użytkownikom możliwości edycji",
"right-blockemail": "Blokowanie użytkownikom możliwości wysyłania wiadomości",
- "right-hideuser": "Blokowanie użytkownika, niewidoczne publicznie",
+ "right-hideuser": "Blokowanie użytkownika i ukrywanie od publiczności",
"right-ipblock-exempt": "Obejście blokad, automatycznych blokad i blokad zakresów adresów IP",
"right-unblockself": "Odblokowanie samego siebie",
"right-protect": "Zmiana poziomu zabezpieczenia i edycja stron zabezpieczonych kaskadowo",
"redirect-file": "Nome do arquivo",
"redirect-logid": "ID de log",
"redirect-not-exists": "Valor não encontrado",
+ "redirect-not-numeric": "Valor não numérico",
"fileduplicatesearch": "Procurar por arquivos duplicados",
"fileduplicatesearch-summary": "Procure por arquivos duplicados tendo por base seu valor \"hash\".",
"fileduplicatesearch-filename": "Nome do arquivo:",
"redirect-file": "Nome do ficheiro",
"redirect-logid": "Identificador da entrada do registo",
"redirect-not-exists": "Valor não encontrado",
+ "redirect-not-numeric": "Valor não numérico",
"fileduplicatesearch": "Pesquisa de ficheiros duplicados",
"fileduplicatesearch-summary": "Pesquisa de ficheiros duplicados baseada no resumo criptográfico.",
"fileduplicatesearch-filename": "Nome do ficheiro:",
"redirect-file": "Description of lookup type for [[Special:Redirect]].\n{{Identical|Filename}}",
"redirect-logid": "Description of lookup type for [[Special:Redirect]].\n{{Identical|Log ID}}",
"redirect-not-exists": "Used as error message in [[Special:Redirect]]",
+ "redirect-not-numeric": "Used as error message in [[Special:Redirect]]",
"fileduplicatesearch": "Name of special page [[Special:FileDuplicateSearch]].",
"fileduplicatesearch-summary": "Summary of [[Special:FileDuplicateSearch]]",
"fileduplicatesearch-filename": "Input form of [[Special:FileDuplicateSearch]]:\n\n{{Identical|Filename}}",
"customcssprotected": "Non ge tine 'u permesse pe cangià sta pàgene de CSS, purcè tène otre configurazione personale.",
"customjsonprotected": "Non ge tine 'u permesse pe cangià sta pàgene de JSON, purcè tène otre configurazione personale.",
"customjsprotected": "Non ge tine 'u permesse pe cangià sta pàgene de Javascript, purcè tène otre configurazione personale.",
+ "sitecssprotected": "Non ge tìne le permesse pe cangià sta pàgene CSS purcé pò avè effette sus a tutte le visitature.",
+ "sitejsonprotected": "Non ge tìne le permesse pe cangià sta pàgene JSON purcé pò avè effette sus a tutte le visitature.",
+ "sitejsprotected": "Non ge tìne le permesse pe cangià sta pàgene JavaScript purcé pò avè effette sus a tutte le visitature.",
"mycustomcssprotected": "Non ge tìne le permesse pe cangià sta pàgene CSS",
+ "mycustomjsonprotected": "Non ge tìne le permesse pe cangià sta pàgene JSON.",
"mycustomjsprotected": "Non ge tìne le permesse pe cangià sta pàgene JavaScript",
"myprivateinfoprotected": "Non ge tìne le permesse pe cangià le 'mbormaziune private tune.",
"mypreferencesprotected": "Non ge tìne le permesse pe cangià le preferenze tune.",
"sort-descending": "Упорядочить по убыванию",
"sort-ascending": "Упорядочить по возрастанию",
"nstab-main": "Статья",
- "nstab-user": "Участник",
+ "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Участник|Участница}}",
"nstab-media": "Мультимедиа",
"nstab-special": "Служебная страница",
"nstab-project": "О проекте",
"redirect-file": "Название файла",
"redirect-logid": "ID журнала",
"redirect-not-exists": "Значение не найдено",
+ "redirect-not-numeric": "Значение не числовое",
"fileduplicatesearch": "Поиск одинаковых файлов",
"fileduplicatesearch-summary": "Поиск одинаковых файлов по хэш-коду.",
"fileduplicatesearch-filename": "Имя файла:",
"right-move": "Переменованя сторінок",
"right-move-subpages": "Переменованя сторінок і їх підсторінок",
"right-move-rootuserpages": "Переменованя корінёвых сторінок хоснователїв",
+ "right-move-categorypages": "Переменованя сторінок катеґорій",
"right-movefile": "Переменовати файлы",
"right-suppressredirect": "Нестворіня напрямлїня про переменоваю сторінкы",
"right-upload": "Наладовованя файлів",
"right-siteadmin": "Замыкана і одомыканя датабазы",
"right-override-export-depth": "Експорт сторінок включаючі звязаны сторінкы з глубков до 5",
"right-sendemail": "Посыланя пошты іншым хоснователям",
+ "right-applychangetags": "Придаваня [[Special:Tags|значок]] до властных змін",
"newuserlogpage": "Лоґ вытварянь хоснователїв",
"newuserlogpagetext": "Тото є список ново реґістрованых хоснователїв.",
"rightslog": "Лоґ хосновательскых прав",
"action-move": "Переменовати тоту сторінку",
"action-move-subpages": "переменованя той сторінкы зо вшыткыма єй підсторінками",
"action-move-rootuserpages": "переменовати корінёвы сторінкы хостователїв",
+ "action-move-categorypages": "переменованя сторінок катеґорій",
"action-movefile": "переменовати тот файл",
"action-upload": "наладовати тот файл",
"action-reupload": "переписати тот екзістуючій файл",
"prefs-info": "بنیادی معلومات",
"prefs-i18n": "بین الاقوامیت",
"prefs-signature": "دستخط",
- "prefs-dateformat": "تارÛ\8cØ® دÛ\8c ترتÛ\8cب",
+ "prefs-dateformat": "تریخ دی ترتیب",
"prefs-timeoffset": "وقت دی ترتیب",
"prefs-advancedediting": "عام آپشن",
"prefs-editor": "خانہ ترمیم",
"upload-form-label-usage-filename": "فائل دا ناں",
"upload-form-label-own-work": "یہ میݙا ذاتی کم ہے",
"upload-form-label-infoform-categories": "ونکیاں",
- "upload-form-label-infoform-date": "تارÛ\8cØ®",
+ "upload-form-label-infoform-date": "تریخ",
"backend-fail-delete": "مِسَل \"$1\" کوں مٹایا نی ونڄ سڳیا۔",
"license": "اجازت نامہ:",
"license-header": "اجازہ کاری",
"imgfile": "فائل",
"listfiles": "فائل لسٹ",
"listfiles_thumb": "تھمب نیل",
- "listfiles_date": "تارÛ\8cØ®",
+ "listfiles_date": "تریخ",
"listfiles_name": "ناں",
"listfiles_user": "ورتݨ والا",
"listfiles_size": "حجم",
"listfiles-latestversion-no": "کو",
"file-anchor-link": "فائل",
"filehist": "فائل دا تاریخچہ",
- "filehist-help": "Ú©Û\81Û\8cÚº خاص Ù\88Û\8cÙ\84Û\92 تÛ\92 تارÛ\8cØ® Ú©Ù\88Úº Ù\81ائÙ\84 Ú©Û\8cÙ\86Ù\98Ù\88Û\8cÚº Ù\86ظردÛ\8c Û\81ائÛ\8cØ\8c Ý\99Û\8cکھݨ Ú©Û\8cتÛ\92 اÙ\88Úº Ù\88Û\8cÙ\84Û\92 تÛ\92 Ú©Ù\84Ú© کرÙ\88Û\94",
+ "filehist-help": "کہیں خاص ویلے تے تریخ کوں فائل کین٘ویں نظردی ہائی، ݙیکھݨ کیتے اوں ویلے تے کلک کرو۔",
"filehist-deleteall": "سارے مٹاؤ",
"filehist-deleteone": "مٹاؤ",
"filehist-revert": "واپس",
"pageinfo-redirects-name": "رجوعاں دی تعداد",
"pageinfo-subpages-name": "ایں ورقے دے ذیلی ورقیاں دی تعداد",
"pageinfo-firstuser": "ورقہ ساز",
- "pageinfo-firsttime": "Ù\88رÙ\82Û\81 بݨݨ دÛ\8c تارÛ\8cØ®",
+ "pageinfo-firsttime": "ورقہ بݨݨ دی تریخ",
"pageinfo-lastuser": "چھیکڑی ترمیم کنندہ",
- "pageinfo-lasttime": "Ú\86Ú¾Û\8cÚ©Ú\91Û\8c ترÙ\85Û\8cÙ\85 دÛ\8c تارÛ\8cØ®",
+ "pageinfo-lasttime": "چھیکڑی ترمیم دی تریخ",
"pageinfo-edits": "ترامیم دی مجموعی تعداد",
"pageinfo-authors": "مختلف مصنفین دی تعداد",
"pageinfo-recent-edits": "حالیہ ترامیم دی تعداد (گزشتہ $1 وچ)",
"exif-orientation": "اورینٹیشن",
"exif-xresolution": "افقی ریزولوشن",
"exif-yresolution": "عمودی ریزولیشن",
- "exif-datetime": "Ù\81ائÙ\84 بدÙ\84ݨ دÛ\8c تارÛ\8cØ® تÛ\92 Ù\88Û\8cÙ\84ا",
+ "exif-datetime": "فائل بدلݨ دی تریخ تے ویلا",
"exif-make": "کیمرہ ساز کمپنی",
"exif-model": "کیمرے دا ماڈل",
"exif-software": "مستعمل سافٹ ویئر",
"exif-exifversion": "اکزیف ورژن",
"exif-colorspace": "رنگ فضا",
- "exif-datetimeoriginal": "Ú\88Û\8cٹا بݨاÙ\88ݨ دÛ\8c تارÛ\8cØ® تÛ\92 Ù\88Û\8cÙ\84ا",
+ "exif-datetimeoriginal": "ڈیٹا بݨاوݨ دی تریخ تے ویلا",
"exif-datetimedigitized": "ڈجیٹائزنگ دا ویلہ تے تریخ",
"exif-orientation-1": "عام",
"namespacesall": "یکے",
"redirect-file": "Ime datoteke",
"redirect-logid": "ID dnevnika",
"redirect-not-exists": "Vrednosti ni mogoče najti",
+ "redirect-not-numeric": "Vrednost ni številska",
"fileduplicatesearch": "Iskanje podvojenih datotek",
"fileduplicatesearch-summary": "Iskanje podvojenih datotek, ki temelji na podlagi njenih hashvrednosti.",
"fileduplicatesearch-filename": "Ime datoteke:",
"acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове IP адресе тренутно не могу отворити више налога.",
"emailauthenticated": "Ваша имејл-адреса је потврђена на дан $2 у $3 ч.",
"emailnotauthenticated": "Ваша имејл-адреса још није потврђена.\nНиједан имејл неће да буде послат ни у једном од следећих случајева.",
- "noemailprefs": "Наведите имејл-адресу у својим подешавањима за оспособљавање ових могућности.",
+ "noemailprefs": "Наведите имејл-адресу у подешавањима за оспособљавање ових функција.",
"emailconfirmlink": "Потврдите своју имејл-адресу",
"invalidemailaddress": "Имејл-адреса не може да буде прихваћена јер је у неважећем облику.\nУнесите исправну адресу или оставите празно поље.",
"cannotchangeemail": "Имејл-адресе налога не могу да се промене на овом викију.",
"changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
"changeemail-oldemail": "Актуелна имејл-адреса:",
"changeemail-newemail": "Нова имејл-адреса:",
- "changeemail-newemail-help": "Ово поље би требало да оставите празно ако желите да уклоните вашу имејл адресу. Нећете бити у могућности да ресетујете заборављену лозинку и нећете примати мејлове од овог викија ако је имејл адреса уклоњена.",
+ "changeemail-newemail-help": "Ово поље треба да оставите празно ако желите да уклоните своју имејл-адресу. Нећете бити у могућности да ресетујете заборављену лозинку и нећете примати имејлове са овог викија ако је имејл-адреса уклоњена.",
"changeemail-none": "(ништа)",
"changeemail-password": "Ваша лозинка за пројекат {{SITENAME}}:",
"changeemail-submit": "Промени имејл",
"subject-preview": "Преглед теме:",
"previewerrortext": "Дошло је до грешке при покушају прегледа промена.",
"blockedtitle": "Корисник је блокиран",
- "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокаду је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Блокирани: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте дискутовали о блокади.\nНе можете да користите могућност „{{int:emailuser}}” осим ако сте навели валидну имејл адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокаде #$5.\nНаведите све горње детаље при прављењу било каквих упита.",
- "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите могућност „{{int:emailuser}}“ осим ако сте навели ваљану имејл адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша тренутна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
+ "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокаду је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Блокирани: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте дискутовали о блокади.\nНе можете да користите функцију „{{int:emailuser}}” осим ако сте навели валидну имејл-адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокаде #$5.\nНаведите све горње детаље при прављењу било каквих упита.",
+ "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите функцију „{{int:emailuser}}“ осим ако сте навели важећу имејл-адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша тренутна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
"blockednoreason": "разлог није наведен",
"whitelistedittext": "$1 да бисте уређивали странице.",
"confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
"revdelete-modify-missing": "Грешка при мењању ИБ ставке $1: она не постоји у бази података.",
"revdelete-no-change": "<strong>Упозорење:</strong> ставка од $1, $2 већ поседује затражена подешавања видљивости.",
"revdelete-concurrent-change": "Грешка при мењању ставке од $1, $2: њен статус је у међувремену променио други корисник.\nПроверите дневник.",
- "revdelete-only-restricted": "Грешка при сакривању ставке од $1, $2: не можете сакрити ставке од администратора без избора других могућности видљивости.",
+ "revdelete-only-restricted": "Грешка при сакривању ставке од дана $1, $2: Не можете сакрити ставке од приказа администраторима без избора једне од других опција видљивости.",
"revdelete-reason-dropdown": "*Уобичајени разлози за брисање\n** Кршење ауторског права\n** Неприкладан коментар или лични подаци\n** Неприкладно корисничко име\n** Увредљиви подаци",
"revdelete-otherreason": "Други/додатни разлог:",
"revdelete-reasonotherlist": "Други разлог",
"prefs-skin": "Тема",
"skin-preview": "прегледај",
"datedefault": "Свеједно",
- "prefs-labs": "Ð\9fÑ\80обне могÑ\83Ñ\9bноÑ\81Ñ\82и",
+ "prefs-labs": "Ð\95кÑ\81пеÑ\80именÑ\82алне Ñ\84Ñ\83нкÑ\86иÑ\98е",
"prefs-user-pages": "Корисничке странице",
"prefs-personal": "Кориснички профил",
"prefs-rc": "Скорашње измене",
"rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|промена|промене|промена}}, $2",
"rcfilters-date-popup-title": "Временски период за претрагу",
"rcfilters-days-title": "Недавни дани",
- "rcfilters-hours-title": "СкоÑ\80аÑ\88Ñ\9aи сати",
+ "rcfilters-hours-title": "Ð\9dедавни сати",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}",
"rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}",
"rcfilters-highlighted-filters-list": "Истакнуто: $1",
"upload-form-label-infoform-categories": "Категорије",
"upload-form-label-infoform-date": "Датум",
"upload-form-label-own-work-message-generic-local": "Ја потврђујем да отпремам ову датотеку поштујући услове коришћења услуге и лиценцирање на {{SITENAME}}.",
- "upload-form-label-not-own-work-message-generic-local": "Ако нисте у могућности да отпремите ову датотеку под условима {{SITENAME}}, молимо вас да затворите овај дијалог и покушате другом методом.",
+ "upload-form-label-not-own-work-message-generic-local": "Ако нисте у могућности да отпремите ову датотеку под правилима пројекта {{SITENAME}}, затворите овај дијалог и покушате другом методом.",
"upload-form-label-not-own-work-local-generic-local": "Такође можете покушати [[Special:Upload|подразумевану страницу за отпремање]].",
"backend-fail-stream": "Не могу да емитујем датотеку $1.",
"backend-fail-backup": "Не могу да направим резерву датотеке $1.",
"zip-file-open-error": "Дошло је до грешке при отварању датотеке за проверу ZIP архиве.",
"zip-wrong-format": "Наведена датотека није формата ZIP.",
"zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
- "zip-unsupported": "Датотека је формата ZIP који користи могућности које не подржава Медијавики.\nБезбедносна провера не може да се изврши како треба.",
+ "zip-unsupported": "Датотека је формата ZIP који користи функције ZIP које Медијавики не подржава.\nНе може се правилно проверити у вези безбедности.",
"uploadstash": "Отпремање низа датотека",
"uploadstash-summary": "Ова страница пружа приступ датотекама које су отпремљене или се отпремају, али још нису објављене. Ове датотеке нису видљиве никоме, осим кориснику који их је отпремио.",
"uploadstash-clear": "Очисти сакривене датотеке",
"blockipsuccesssub": "Блокирање је успело",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана}}.<br />\nПогледајте [[Special:BlockList|списак]] за преглед блокада.",
"ipb-blockingself": "Блокираћете самог себе! Заиста то желите?",
- "ipb-confirmhideuser": "Управо ћете блокирати корисника с укљученом могућношћу „сакриј корисника“. Овим ће корисничко име бити сакривено у свим списковима и извештајима. Желите ли то да урадите?",
+ "ipb-confirmhideuser": "Управо ћете блокирати корисника са укљученом функцијом „сакриј корисника”. Овим ће корисничко име бити сакривено у свим списковима и уносима у дневнику. Заиста желите то да урадите?",
"ipb-confirmaction": "Ако сте сигурни да желите наставити означите поље „{{int:ipb-confirm}}“ на дну странице.",
"ipb-edit-dropdown": "Уреди разлоге блокирања",
"ipb-unblock-addr": "Деблокирај $1",
"tooltip-pt-anontalk": "Дискусија о уређивањима са ове IP адресе",
"tooltip-pt-preferences": "{{GENDER:|Ваша}} подешавања",
"tooltip-pt-watchlist": "Списак страница које надгледате",
- "tooltip-pt-mycontris": "СпиÑ\81ак {{GENDER:|Ð\92аших}} доприноса",
+ "tooltip-pt-mycontris": "СпиÑ\81ак {{GENDER:|ваших}} доприноса",
"tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе",
"tooltip-pt-login": "Предлажемо вам да се пријавите, иако то није обавезно",
"tooltip-pt-login-private": "Морате да се пријавите да бисте користили овај Вики",
"markedaspatrolled": "Означено као патролирано",
"markedaspatrolledtext": "Изабрана измена странице [[:$1]] означена је као патролирана.",
"rcpatroldisabled": "Патролирање скорашњих измена је онемогућено",
- "rcpatroldisabledtext": "Ð\9cогÑ\83Ñ\9bноÑ\81Ñ\82 патролирања скорашњих измена је тренутно онемогућена.",
+ "rcpatroldisabledtext": "ФÑ\83нкÑ\86иÑ\98а патролирања скорашњих измена је тренутно онемогућена.",
"markedaspatrollederror": "Не могу да означим као патролирано.",
"markedaspatrollederrortext": "Морате навести измену да бисте је означили као патролирану.",
"markedaspatrollederror-noautopatrol": "Не можете да означите своје промене као патролиране.",
"exif-pixelxdimension": "Ширина слике",
"exif-pixelydimension": "Висина слике",
"exif-usercomment": "Кориснички коментари",
- "exif-relatedsoundfile": "Ð\9fовезани звÑ\83Ñ\87ни запиÑ\81",
+ "exif-relatedsoundfile": "СÑ\80одне звÑ\83Ñ\87не даÑ\82оÑ\82еке",
"exif-datetimeoriginal": "Датум и време сликања",
"exif-datetimedigitized": "Датум и време дигитализације",
"exif-subsectime": "Део секунде у којем је сликано",
"monthsall": "све",
"confirmemail": "Потврда имејл-адресе",
"confirmemail_noemail": "Нисте поставили важећу имејл-адресу у [[Special:Preferences|корисничким подешавањима]].",
- "confirmemail_text": "{{SITENAME}} захтева да потврдите имејл адресу пре него што почнете да користите могућности имејла.\nКликните на дугме испод за слање поруке на вашу адресу.\nУ поруци ће се налазити веза са потврдним кодом;\nунесите је у прегледач да бисте потврдили да је ваша имејл адреса важећа.",
+ "confirmemail_text": "{{SITENAME}} захтева да проверите ваљаност имејл-адресе пре него што почнете да користите функцију имејла.\nАктивирајте дугме испод да бисте послали мејл за потврду на своју адресу.\nМејл ће укључивати везу са кодом;\nучитајте везу у свом прегледачу да бисте потврдили да је ваша имејл-адреса важећа.",
"confirmemail_pending": "Код за потврду вам је већ послат имејлом.\nАко сте недавно отворили налог, можда треба да сачекате неколико минута да пристигне пре него што поново затражите нови код.",
"confirmemail_send": "Пошаљи код за потврду",
"confirmemail_sent": "Потврдна порука је послата.",
- "confirmemail_oncreate": "Ð\9fоÑ\81лаÑ\82 Ñ\98е код за поÑ\82вÑ\80дÑ\83 на ваÑ\88Ñ\83 имеÑ\98л адÑ\80еÑ\81Ñ\83.\nÐ\9eваÑ\98 код ниÑ\98е поÑ\82Ñ\80ебан за пÑ\80иÑ\98авÑ\99иваÑ\9aе, али вам Ñ\82Ñ\80еба да биÑ\81Ñ\82е Ñ\83кÑ\99Ñ\83Ñ\87или могÑ\83Ñ\9bноÑ\81Ñ\82и имеÑ\98ла на викију.",
+ "confirmemail_oncreate": "Ð\9aôд за поÑ\82вÑ\80дÑ\83 Ñ\98е поÑ\81лаÑ\82 на ваÑ\88Ñ\83 имеÑ\98л-адÑ\80еÑ\81Ñ\83.\nÐ\9eваÑ\98 кôд ниÑ\98е неопÑ\85одан за пÑ\80иÑ\98авÑ\99иваÑ\9aе, али Ñ\9bеÑ\82е моÑ\80аÑ\82и да га наведеÑ\82е пÑ\80е омогÑ\83Ñ\9bаваÑ\9aа било каквиÑ\85 Ñ\84Ñ\83нкÑ\86иÑ\98а заÑ\81нованиÑ\85 на имеÑ\98лÑ\83 на викију.",
"confirmemail_sendfailed": "{{SITENAME}} не може да пошаље имејл потврду.\nПроверите да ли је имејл адреса правилно написана.\n\nГрешка: $1",
"confirmemail_invalid": "Неважећи код за потврду.\nКод је можда истекао.",
"confirmemail_needlogin": "Морате бити $1 да бисте потврдили своју имејл-адресу.",
"confirmemail_success": "Ваша имејл-адреса је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]] и уживате у викију.",
"confirmemail_loggedin": "Ваша имејл-адреса је сада потврђена.",
"confirmemail_subject": "{{SITENAME}} – потврда имејл-адресе",
- "confirmemail_body": "Неко, вероватно Ви, са IP адресе $1,\nрегистровао је налог „$2“ са овом имејл адресом на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и активирали могућности имејла на пројекту {{SITENAME}}, отворите ова у прегледачу:\n\n$3\n\nАко ви *нисте* регистровали налог, пратите ову везу\nда бисте отказали потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче у $4.",
- "confirmemail_body_changed": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали могућности имејла, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $6 у $7",
- "confirmemail_body_set": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nмогућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $4.",
+ "confirmemail_body": "Неко, вероватно Ви, са IP адресе $1,\nрегистровао је налог „$2“ са овом имејл адресом на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и активирали функцију имејла на пројекту {{SITENAME}}, отворите ова у прегледачу:\n\n$3\n\nАко ви *нисте* регистровали налог, пратите ову везу\nда бисте отказали потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче у $4.",
+ "confirmemail_body_changed": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали функцију имејла, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $6 у $7",
+ "confirmemail_body_set": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nфункцију имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $4.",
"confirmemail_invalidated": "Потврда имејл адресе је отказана",
"invalidateemail": "Отказивање потврде имејла",
"notificationemail_subject_changed": "Регистрована имејл адреса на пројекту {{SITENAME}} је промењена",
"watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
"watchlistedit-too-many": "Има превише страница за приказ овде.",
"watchlisttools-clear": "очисти списак надгледања",
- "watchlisttools-view": "погледаÑ\98 Ñ\80елеванÑ\82не промене",
+ "watchlisttools-view": "погледаÑ\98 Ñ\81Ñ\80одне промене",
"watchlisttools-edit": "погледај и уреди списак надгледања",
"watchlisttools-raw": "уреди сиров списак надгледања",
"iranian-calendar-m1": "Фарвардин",
"redirect-file": "Назив датотеке",
"redirect-logid": "ID дневника",
"redirect-not-exists": "Вредност није пронађена",
+ "redirect-not-numeric": "Вредност није нумеричка",
"fileduplicatesearch": "Претрага дупликата датотека",
"fileduplicatesearch-summary": "Претрага дуплираних датотека према хеш вредности.",
"fileduplicatesearch-filename": "Назив датотеке:",
"mediastatistics-header-unknown": "Непознато",
"mediastatistics-header-bitmap": "Битмап слике",
"mediastatistics-header-drawing": "Цртежи (векторске слике)",
- "mediastatistics-header-audio": "Звук",
+ "mediastatistics-header-audio": "Звучни снимци",
"mediastatistics-header-video": "Видеи",
"mediastatistics-header-multimedia": "Обогаћени медији",
"mediastatistics-header-office": "Канцеларија",
"authmanager-authn-not-in-progress": "Потврда идентитета није у току или је дошло до губитка података о сесији. Почните испочетка.",
"authmanager-authn-no-primary": "Не могу да проверим пружене акредитиве.",
"authmanager-authn-no-local-user": "Пружени акредитиви нису повезани ни са једним корисником на овом викију.",
- "authmanager-authn-no-local-user-link": "Пружени су важећи акредитиви, али нису повезани ни с једним корисником на овом викију. Пријавите се на неки други начин или направите нови кориснички налог, што ће вам дати могућност да повежете претходне акредитиве на нови налог.",
+ "authmanager-authn-no-local-user-link": "Пружени акредитиви су важећи, али нису повезани ни са једним корисником на овом викију. Пријавите се на неки други начин или отворите нови кориснички налог, што ће вам дати опцију да повежете претходне акредитиве на нови налог.",
"authmanager-authn-autocreate-failed": "Не могу да аутоматски направим локални налог: $1",
"authmanager-change-not-supported": "Не могу да променим пружене акредитиве јер их ништа не би користило.",
"authmanager-create-disabled": "Отварање налога је онемогућено.",
"redirect-file": "Filnamn",
"redirect-logid": "Logg-ID",
"redirect-not-exists": "Värdet hittades inte",
+ "redirect-not-numeric": "Värdet är inte numeriskt",
"fileduplicatesearch": "Sök efter dubblettfiler",
"fileduplicatesearch-summary": "Sök efter dubblettfiler baserat på filernas hash-värden.",
"fileduplicatesearch-filename": "Filnamn:",
"Rakeshonwiki",
"Kaartic",
"Fitoschido",
- "Matěj Suchánek"
+ "Matěj Suchánek",
+ "UY Scuti"
]
},
"tog-underline": "அடிக்கோடிட்டத்தை இணை:",
"group-interface-admin": "Arayüz yöneticileri",
"group-bureaucrat": "Bürokratlar",
"group-suppress": "Gözetmenler",
- "group-all": "(hepsi)",
+ "group-all": "(tümü)",
"group-user-member": "{{GENDER:$1|kullanıcı}}",
"group-autoconfirmed-member": "{{GENDER:$1|otomatik onaylanmış kullanıcı}}",
"group-bot-member": "{{GENDER:$1|bot}}",
"right-reupload": "перезаписування існуючих файлів",
"right-reupload-own": "перезаписування існуючих файлів, завантажених тим самим користувачем",
"right-reupload-shared": "підміна файлів зі спільного сховища локальними",
- "right-upload_by_url": "Ð\97авантаження файлів за URL-адресами",
+ "right-upload_by_url": "завантаження файлів за URL-адресами",
"right-purge": "очищення кешу сторінки без необхідності підтвердження",
"right-autoconfirmed": "без обмежень швидкості за IP",
"right-bot": "автоматична обробка",
"right-mergehistory": "об'єднання історій редагувань сторінок",
"right-userrights": "зміна всіх прав користувачів",
"right-userrights-interwiki": "зміна прав користувачів у інших вікі",
- "right-siteadmin": "Ð\91локування і розблокування бази даних",
+ "right-siteadmin": "блокування і розблокування бази даних",
"right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
"right-sendemail": "надсилання електронної пошти іншим користувачам",
"right-managechangetags": "створення та (де)активування [[Special:Tags|міток]]",
"redirect-file": "文件名",
"redirect-logid": "日志ID",
"redirect-not-exists": "没找到相应值",
+ "redirect-not-numeric": "输入的数值并不是数字",
"fileduplicatesearch": "搜索重复文件",
"fileduplicatesearch-summary": "根据哈希(hash)值搜索重复文件。",
"fileduplicatesearch-filename": "文件名:",
"permissionserrorstext-withaction": "由於下列{{PLURAL:$1|原因}},您沒有權限進行 $2 的動作:",
"contentmodelediterror": "您無法編輯此修訂,因為它的內容模型為<code>$1</code>,與目前使用的頁面內容模型<code>$2</code>不同。",
"recreate-moveddeleted-warn": "<strong>警告:您正重新建立先前已刪除的頁面。</strong>\n\n您應考慮是否繼續編輯此頁。\n在此提供刪除與移動日誌方便作為參考:",
- "moveddeleted-notice": "此頁面已刪除。\n下方提供此頁面的刪除、保護和移動日誌以便參考。",
+ "moveddeleted-notice": "此頁面已遭刪除。\n請參考下方關於此頁面的刪除、保護和移動日誌。",
"moveddeleted-notice-recent": "對不起,此頁面剛剛被刪除(在最近24小時內)。頁面的刪除、保護和移動日誌在下方提供以供參考。",
"log-fulllog": "檢視完整日誌",
"edit-hook-aborted": "編輯已被 Hook 中止。\n且未回應無任何說明。",
"redirect-file": "檔案名稱",
"redirect-logid": "日誌 ID",
"redirect-not-exists": "查無值",
+ "redirect-not-numeric": "值不是數字",
"fileduplicatesearch": "搜尋重複檔案",
"fileduplicatesearch-summary": "依據雜湊值 (Hash) 來搜尋重複的檔案。",
"fileduplicatesearch-filename": "檔案名稱:",
--- /dev/null
+<?php
+/** Bislama (Bislama)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
--- /dev/null
+<?php
+/** Canadian English (Canadian English)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
*
*/
+$fallback = 'en';
+
$specialPageAliases = [
'Uncategorizedcategories' => [ 'UncategorisedCategories' ],
'Uncategorizedimages' => [ 'UncategorisedFiles', 'UncategorisedImages' ],
--- /dev/null
+<?php
+/** Jamaican Creole English (Patois)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
--- /dev/null
+<?php
+/** Pitkern (Pitkern)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
--- /dev/null
+<?php
+/** Scots (Scots)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
+
+$namespaceNames = [
+ NS_MEDIA => 'Media',
+ NS_SPECIAL => 'Special',
+ NS_TALK => 'Collogue',
+ NS_USER => 'Uiser',
+ NS_USER_TALK => 'Uiser_collogue',
+ NS_PROJECT_TALK => '$1_collogue',
+ NS_FILE => 'File',
+ NS_FILE_TALK => 'File_collogue',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_collogue',
+ NS_TEMPLATE => 'Template',
+ NS_TEMPLATE_TALK => 'Template_collogue',
+ NS_HELP => 'Help',
+ NS_HELP_TALK => 'Help_collogue',
+ NS_CATEGORY => 'Category',
+ NS_CATEGORY_TALK => 'Category_collogue',
+];
protected $mSelf = "FakeMaintenanceScript";
public function execute() {
- return;
}
}
print "Median: $median ms\n";
print "Mean: $mean ms\n";
print "Maximum: $max ms\n";
- print "Memory usage: " . $contLang->formatSize( memory_get_usage( true ) ) . "\n";
+ print "Memory usage: " . $contLang->formatSize( memory_get_usage( true ) ) . "\n";
print "Peak memory usage: " .
$contLang->formatSize( memory_get_peak_usage( true ) ) . "\n";
}
}
$this->outputStatus( "\n" );
- return;
}
/**
continue;
}
if ( isset( $alreadyWritten[$line] ) ) {
- $this->output( "Password '$line' already written (line " . ( $i + 1 ) .")\n" );
+ $this->output( "Password '$line' already written (line " . ( $i + 1 ) . ")\n" );
$skipped++;
continue;
}
/* Stub function for processing additional options */
public function checkOptions() {
- return;
}
/* Stub function for giving data about what was computed */
public function conclusions() {
- return;
}
/* Core function which does whatever the maintenance script is designed to do */
$this->addDescription( 'Edit an article from the command line, text is from stdin' );
$this->addOption( 'user', 'Username', false, true, 'u' );
$this->addOption( 'summary', 'Edit summary', false, true, 's' );
+ $this->addOption( 'remove', 'Remove a slot (requires --slot).', false, false );
$this->addOption( 'minor', 'Minor edit', false, false, 'm' );
$this->addOption( 'bot', 'Bot edit', false, false, 'b' );
$this->addOption( 'autosummary', 'Enable autosummary', false, false, 'a' );
$this->addOption( 'no-rc', 'Do not show the change in recent changes', false, false, 'r' );
$this->addOption( 'nocreate', 'Don\'t create new pages', false, false );
$this->addOption( 'createonly', 'Only create new pages', false, false );
+ $this->addOption( 'slot', 'Slot role name', false, true );
$this->addArg( 'title', 'Title of article to edit' );
}
$userName = $this->getOption( 'user', false );
$summary = $this->getOption( 'summary', '' );
+ $remove = $this->hasOption( 'remove' );
$minor = $this->hasOption( 'minor' );
$bot = $this->hasOption( 'bot' );
$autoSummary = $this->hasOption( 'autosummary' );
$noRC = $this->hasOption( 'no-rc' );
+ $slot = $this->getOption( 'slot', 'main' );
if ( $userName === false ) {
$wgUser = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
$page = WikiPage::factory( $title );
- # Read the text
- $text = $this->getStdin( Maintenance::STDIN_ALL );
- $content = ContentHandler::makeContent( $text, $title );
+ if ( $remove ) {
+ if ( $slot === 'main' ) {
+ $this->fatalError( "Cannot remove main slot! Use --slot to specify." );
+ }
+
+ $content = false;
+ } else {
+ # Read the text
+ $text = $this->getStdin( Maintenance::STDIN_ALL );
+ $content = ContentHandler::makeContent( $text, $title );
+ }
# Do the edit
$this->output( "Saving... " );
- $status = $page->doEditContent( $content, $summary,
- ( $minor ? EDIT_MINOR : 0 ) |
+ $updater = $page->newPageUpdater( $wgUser );
+
+ $flags = ( $minor ? EDIT_MINOR : 0 ) |
( $bot ? EDIT_FORCE_BOT : 0 ) |
( $autoSummary ? EDIT_AUTOSUMMARY : 0 ) |
- ( $noRC ? EDIT_SUPPRESS_RC : 0 ) );
+ ( $noRC ? EDIT_SUPPRESS_RC : 0 );
+
+ if ( $content === false ) {
+ $updater->removeSlot( $slot );
+ } else {
+ $updater->setContent( $slot, $content );
+ }
+
+ $updater->saveRevision( CommentStoreComment::newUnsavedComment( $summary ), $flags );
+ $status = $updater->getStatus();
+
if ( $status->isOK() ) {
$this->output( "done\n" );
$exit = 0;
'user',
'user_name',
[
- 'user_name > ' .$dbw->addQuotes( $lastUsername ),
+ 'user_name > ' . $dbw->addQuotes( $lastUsername ),
],
__METHOD__,
[
/* global extDependencyMap */
-( function ( $ ) {
+( function () {
$( function () {
var $label, labelText;
} );
} );
} );
-}( jQuery ) );
+}() );
*
* @class jQuery.plugin.spinner
*/
-( function ( $ ) {
+( function () {
// Default options for new spinners,
// stored outside the function to share between calls.
* @mixins jQuery.plugin.spinner
*/
-}( jQuery ) );
+}() );
*
* @author Christian Bach/christian.bach@polyester.se
*/
-( function ( $, mw ) {
+( function () {
var ts,
parsers = [];
type: 'numeric'
} );
-}( jQuery, mediaWiki ) );
+}() );
// * This installation of tipsy includes several local modifications to both Javascript and CSS.
// Please be careful when upgrading.
-( function ( mw, $ ) {
+( function () {
function maybeCall(thing, ctx) {
return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
}
};
-}( mediaWiki, jQuery ) );
+}() );
*
* @class jQuery.plugin.accessKeyLabel
*/
-( function ( $, mw ) {
+( function () {
// Cached access key modifiers for used browser
var cachedAccessKeyModifiers,
* @mixins jQuery.plugin.accessKeyLabel
*/
-}( jQuery, mediaWiki ) );
+}() );
* @param {string} str
* @return {number}
*/
-mediaWiki.log.deprecate( jQuery, 'byteLength', require( 'mediawiki.String' ).byteLength,
+mw.log.deprecate( $, 'byteLength', require( 'mediawiki.String' ).byteLength,
'Use require( \'mediawiki.String\' ).byteLength instead.', '$.byteLength' );
/**
/**
* @class jQuery.plugin.checkboxShiftClick
*/
-( function ( $ ) {
+( function () {
/**
* Enable checkboxes to be checked or unchecked in a row by clicking one,
* @mixins jQuery.plugin.checkboxShiftClick
*/
-}( jQuery ) );
+}() );
*
* - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
*/
-( function ( $ ) {
+( function () {
function getColor( elem, attr ) {
var color;
};
} );
-}( jQuery ) );
+}() );
* Mostly based on other plugins and functions (linted and optimized a little).
* Sources cited inline.
*/
-( function ( $ ) {
+( function () {
/**
* @class jQuery.colorUtil
* @singleton
};
-}( jQuery ) );
+}() );
*
* @class jQuery.plugin.confirmable
*/
-( function ( $ ) {
+( function () {
var identity = function ( data ) {
return data;
};
noTitle: undefined
}
};
-}( jQuery ) );
+}() );
* This file serves to inject our localised messages into it.
*/
-( function ( mw, $ ) {
+( function () {
$.fn.confirmable.defaultOptions.i18n = {
space: mw.message( 'word-separator' ).text(),
confirm: mw.message( 'confirmable-confirm', mw.user ).text(),
yesTitle: undefined,
noTitle: undefined
};
-}( mediaWiki, jQuery ) );
+}() );
/**
* @class jQuery.plugin.getAttrs
*/
-( function ( $ ) {
+( function () {
function serializeControls( controls ) {
var i,
data = {},
$.fn.serializeObject = function () {
return serializeControls( this.serializeArray() );
};
-}( jQuery ) );
+}() );
*
* @class jQuery.plugin.hidpi
*/
-( function ( $ ) {
+( function () {
/**
* Get reported or approximate device pixel ratio.
* @mixins jQuery.plugin.hidpi
*/
-}( jQuery ) );
+}() );
* TODO: Add a function for restoring the previous text.
* TODO: Accept mappings for converting shortcuts like WP: to Wikipedia:.
*/
-( function ( $, mw ) {
+( function () {
$.highlightText = {
} );
};
-}( jQuery, mediaWiki ) );
+}() );
/**
* @class jQuery.plugin.lengthLimit
*/
-( function ( $, mw ) {
+( function () {
var
eventKeys = [
* @class jQuery
* @mixins jQuery.plugin.lengthLimit
*/
-}( jQuery, mediaWiki ) );
+}() );
/**
* @class jQuery.plugin.localize
*/
-( function ( $, mw ) {
+( function () {
/**
* Gets a localized message, using parameters from options if present.
* @mixins jQuery.plugin.localize
*/
-}( jQuery, mediaWiki ) );
+}() );
*
* @class jQuery.plugin.makeCollapsible
*/
-( function ( $, mw ) {
+( function () {
/**
* Handler for a click on a collapsible toggler.
*
* @mixins jQuery.plugin.makeCollapsible
*/
-}( jQuery, mediaWiki ) );
+}() );
/**
* JavaScript to show jump links to motor-impaired users when they are focused.
*/
-jQuery( function ( $ ) {
+$( function () {
$( '.mw-jump' ).on( 'focus blur', 'a', function ( e ) {
// Confusingly jQuery leaves e.type as focusout for delegated blur events
* input or not.
*/
-( function ( $, mw ) {
+( function () {
var hasOwn = Object.hasOwnProperty;
* @mixins jQuery.plugin.suggestions
*/
-}( jQuery, mediaWiki ) );
+}() );
/**
* @class jQuery.plugin.tabIndex
*/
-( function ( $ ) {
+( function () {
/**
* Find the lowest tabindex in use within a selection.
* @mixins jQuery.plugin.tabIndex
*/
-}( jQuery ) );
+}() );
* $textbox.textSelection( 'encapsulateSelection', { pre: '<b>', post: '</b>' } );
* // Result: Textbox contains 'This is <b>bold</b>!', with cursor before the '!'
*/
-( function ( $ ) {
+( function () {
/**
* Do things to the selection in a `<textarea>`, or a textarea-like editable element.
*
* @inheritdoc jQuery.plugin.textSelection#textSelection
*/
-}( jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* Create an object like mw.Api, but automatically handling everything required to communicate
// Expose
mw.ForeignApi = CoreForeignApi;
-}( mediaWiki, jQuery ) );
+}() );
/* global moment, Uint8Array */
-( function ( $, mw ) {
+( function () {
/**
* mw.ForeignStructuredUpload.BookletLayout encapsulates the process
this.dateWidget.setValue( '' ).setValidityFlag( true );
};
-}( jQuery, mediaWiki ) );
+}() );
-( function ( mw, $, OO ) {
+( function () {
/**
* Used to represent an upload in progress on the frontend.
*
};
mw.ForeignStructuredUpload = ForeignStructuredUpload;
-}( mediaWiki, jQuery, OO ) );
+}() );
-( function ( mw, OO, $ ) {
+( function () {
/**
* Used to represent an upload in progress on the frontend.
*
};
mw.ForeignUpload = ForeignUpload;
-}( mediaWiki, OO, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* @class mw.RegExp
*/
return str.replace( /([\\{}()|.?*+\-^$\[\]])/g, '\\$1' ); // eslint-disable-line no-useless-escape
}
};
-}( mediaWiki ) );
+}() );
* @since 1.18
*/
-( function ( mw, $ ) {
+( function () {
/**
* Parse titles into an object structure. Note that when using the constructor
* directly, passing invalid titles will result in an exception. Use #newFromText to use the
return null;
};
+ /**
+ * Check if a given namespace is a talk namespace
+ * @param {number} namespaceId Namespace ID
+ * @return {boolean} Namespace is a talk namespace
+ */
+ Title.isTalkNamespace = function ( namespaceId ) {
+ return !!( namespaceId > NS_MAIN && namespaceId % 2 );
+ };
+
/**
* Whether this title exists on the wiki.
*
* @static
* @param {string|mw.Title} title prefixed db-key name (string) or instance of Title
* @return {boolean|null} Boolean if the information is available, otherwise null
+ * @throws {Error} If title is not a string or mw.Title
*/
Title.exists = function ( title ) {
var match,
}
},
+ /**
+ * Check if the title is in a talk namespace
+ *
+ * @return {boolean} The title is in a talk namespace
+ */
+ isTalkPage: function () {
+ return Title.isTalkNamespace( this.getNamespaceId() );
+ },
+
+ /**
+ * Get the title for the associated talk page
+ *
+ * @return {mw.Title|null} The title for the associated talk page, null if not available
+ */
+ getTalkPage: function () {
+ if ( !this.canHaveTalkPage() ) {
+ return null;
+ }
+ return this.isTalkPage() ?
+ this :
+ Title.makeTitle( this.getNamespaceId() + 1, this.getMainText() );
+ },
+
+ /**
+ * Get the title for the subject page of a talk page
+ *
+ * @return {mw.Title|null} The title for the subject page of a talk page, null if not available
+ */
+ getSubjectPage: function () {
+ return this.isTalkPage() ?
+ Title.makeTitle( this.getNamespaceId() - 1, this.getMainText() ) :
+ this;
+ },
+
+ /**
+ * Check the the title can have an associated talk page
+ *
+ * @return {boolean} The title can have an associated talk page
+ */
+ canHaveTalkPage: function () {
+ return this.getNamespaceId() >= NS_MAIN;
+ },
+
/**
* Whether this title exists on the wiki.
*
// Expose
mw.Title = Title;
-}( mediaWiki, jQuery ) );
+}() );
// (It is excluded in jsduck.json.)
// ESLint suggests unquoting some object keys, which would render the file unparseable by Opera 12.
/* eslint-disable quote-props */
-( function ( mw ) {
+( function () {
var toUpperMapping = {
'ß': 'ß',
'ʼn': 'ʼn',
var mapped = toUpperMapping[ chr ];
return mapped || chr.toUpperCase();
};
-}( mediaWiki ) );
+}() );
/* global moment */
-( function ( $, mw, moment ) {
+( function () {
/**
* mw.Upload.BookletLayout encapsulates the process of uploading a file
this.filenameUsageWidget.setValue( null );
};
-}( jQuery, mediaWiki, moment ) );
+}() );
-( function ( $, mw ) {
+( function () {
/**
* mw.Upload.Dialog controls a {@link mw.Upload.BookletLayout BookletLayout}.
this.uploadBooklet.clear();
}, this );
};
-}( jQuery, mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
var UP;
/**
};
mw.Upload = Upload;
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.Uri
*/
-( function ( mw, $ ) {
+( function () {
var parser, properties;
/**
return location.href;
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:RevisionDelete
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var colonSeparator = mw.message( 'colon-separator' ).text(),
summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* Scripts for action=delete at domready
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var colonSeparator = mw.message( 'colon-separator' ).text(),
summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
reason.$input.byteLimit( summaryByteLimit, filterFn );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
var collapsibleLists, handleOne;
// Collapsible lists of categories and templates
);
}
} );
-}( mediaWiki ) );
+}() );
/*
* Javascript for module editWarning
*/
-( function ( mw, $ ) {
+( function () {
'use strict';
$( function () {
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* Scripts for action=edit at domready
*/
-( function ( mw, $ ) {
+( function () {
'use strict';
/**
} );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* Live edit preview.
*/
-( function ( mw, $ ) {
+( function () {
/**
* @ignore
$( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
} );
-}( mediaWiki, jQuery ) );
+}() );
* Scripts for pre-emptive edit preparing on action=edit
*/
-( function ( mw, $ ) {
+( function () {
if ( !mw.config.get( 'wgAjaxEditStash' ) ) {
return;
}
checkStash();
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for History action
*/
-jQuery( function ( $ ) {
+$( function () {
var $historyCompareForm = $( '#mw-history-compare' ),
$historySubmitter,
$lis = $( '#pagehistory > li' );
/*!
* Enables double-click-to-edit functionality.
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
mw.util.$content.dblclick( function ( e ) {
var $a;
}
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
*
* See also ImagePage.php#makeMetadataTable (creates the HTML)
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var $tables = $( '.mw_metadata' );
if ( !$tables.find( '.mw-metadata-collapsible, .collapsable' ).length ) {
$tables.addClass( 'collapsed' );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
'use strict';
/**
} );
}
-}( mediaWiki, jQuery ) );
+}() );
* This is loaded in the top queue, so avoid unnecessary dependencies
* like mediawiki.Title or mediawiki.Uri.
*/
-( function ( mw, $ ) {
+( function () {
var profile = $.client.profile(),
canonical = mw.config.get( 'wgInternalRedirectTargetUrl' ),
fragment = null,
} );
}
-}( mediaWiki, jQuery ) );
+}() );
* When the user right-clicks in a heading, it will open the
* edit screen.
*/
-( function ( $ ) {
+( function () {
// Trigger this when a contextmenu click on the page targets an h1-h6 element.
// This uses a delegate handler which 1) starts immediately instead of blocking
// response on dom-ready, and 2) selects and binds once instead of N times.
$edit.get( 0 ).click();
}
} );
-}( jQuery ) );
+}() );
/**
* @class mw.Api.plugin.category
*/
-( function ( mw, $ ) {
+( function () {
$.extend( mw.Api.prototype, {
/**
* @mixins mw.Api.plugin.category
*/
-}( mediaWiki, jQuery ) );
+}() );
/**
* @class mw.Api.plugin.edit
*/
-( function ( mw, $ ) {
+( function () {
$.extend( mw.Api.prototype, {
* @mixins mw.Api.plugin.edit
*/
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* @class mw.Api
];
mw.log.deprecate( mw.Api, 'warnings', mw.Api.warnings, null, 'mw.Api.warnings' );
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.Api.plugin.login
* @since 1.22
*/
-( function ( mw, $ ) {
+( function () {
'use strict';
$.extend( mw.Api.prototype, {
* @mixins mw.Api.plugin.login
*/
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.Api.plugin.messages
* @since 1.27
*/
-( function ( mw, $ ) {
+( function () {
'use strict';
$.extend( mw.Api.prototype, {
* @mixins mw.Api.plugin.messages
*/
-}( mediaWiki, jQuery ) );
+}() );
/**
* @class mw.Api.plugin.options
*/
-( function ( mw, $ ) {
+( function () {
$.extend( mw.Api.prototype, {
* @mixins mw.Api.plugin.options
*/
-}( mediaWiki, jQuery ) );
+}() );
/**
* @class mw.Api.plugin.parse
*/
-( function ( mw, $ ) {
+( function () {
$.extend( mw.Api.prototype, {
/**
* @mixins mw.Api.plugin.parse
*/
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.Api.plugin.rollback
* @since 1.28
*/
-( function ( mw, $ ) {
+( function () {
$.extend( mw.Api.prototype, {
/**
* @mixins mw.Api.plugin.rollback
*/
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.Api.plugin.upload
* @singleton
*/
-( function ( mw, $ ) {
+( function () {
var nonce = 0,
fieldsAllowed = {
stash: true,
* @class mw.Api
* @mixins mw.Api.plugin.upload
*/
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.Api.plugin.user
* @since 1.27
*/
-( function ( mw, $ ) {
+( function () {
$.extend( mw.Api.prototype, {
* @mixins mw.Api.plugin.user
*/
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.Api.plugin.watch
* @since 1.19
*/
-( function ( mw, $ ) {
+( function () {
/**
* @private
* @mixins mw.Api.plugin.watch
*/
-}( mediaWiki, jQuery ) );
+}() );
* Jeroen De Dauw <jeroendedauw at gmail dot com>
*/
-( function ( $ ) {
+( function () {
'use strict';
$( function () {
} );
-}( jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* Prevent the closing of a window with a confirm message (the onbeforeunload event seems to
* work in most browsers.)
}
};
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
'use strict';
/**
}
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
'use strict';
var debug,
debug.init();
} );
-}( mediaWiki, jQuery ) );
+}() );
* @private
* @class jQuery.plugin.footHovzer
*/
-( function ( $ ) {
+( function () {
var $hovzer, footHovzer, $spacer;
function getHovzer() {
* @mixins jQuery.plugin.footHovzer
*/
-}( jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
var CONTROL_BUCKET = 'control',
MAX_INT32_UNSIGNED = 4294967295;
}
};
-}( mediaWiki, jQuery ) );
+}() );
* @author Moriel Schottlender, 2015
* @since 1.19
*/
-( function ( mw, $ ) {
+( function () {
/**
* This is a way of getting simple feedback from users. It's useful
* for testing new features -- users can give you feedback without
return this.bugReportLink;
};
-}( mediaWiki, jQuery ) );
+}() );
* @author Mark Holmquist, 2015
* @since 1.25
*/
-( function ( mw, $, oo ) {
+( function () {
var warningConfig = mw.config.get( 'wgFileWarning' ),
warningMessages = warningConfig.messages,
warningLink = warningConfig.link,
.addClass( 'mediawiki-filewarning-info empty' ),
$footer = $( '<p>' )
.addClass( 'mediawiki-filewarning-footer empty' ),
- dialog = new oo.ui.PopupButtonWidget( {
+ dialog = new OO.ui.PopupButtonWidget( {
classes: [ 'mediawiki-filewarning-anchor' ],
label: $mimetype,
flags: [ 'warning' ],
// object at all. Sort of nasty, but it gets the job done.
dialog.getPopup().toggle = $.noop;
}
-}( mediaWiki, jQuery, OO ) );
+}() );
-( function ( mw, $ ) {
+( function () {
// FIXME: mw.htmlform.Element also sets this to empty object
mw.htmlform = {};
return this;
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
// FIXME: mw.htmlform.Checker also sets this to empty object
mw.htmlform = {};
OO.inheritClass( mw.htmlform.ActionFieldLayout, OO.ui.ActionFieldLayout );
OO.mixinClass( mw.htmlform.ActionFieldLayout, mw.htmlform.Element );
-}( mediaWiki ) );
+}() );
* HTMLForm enhancements:
* Set up autocomplete fields.
*/
-( function ( mw, $ ) {
+( function () {
mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
var $autocomplete = $root.find( '.mw-htmlform-autocomplete' );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
* HTMLForm enhancements:
* Infuse some OOUI HTMLForm fields (those which benefit from always being infused).
*/
-( function ( mw, $ ) {
+( function () {
mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
var $oouiNodes, modules, extraModules;
} );
-}( mediaWiki, jQuery ) );
+}() );
* HTMLForm enhancements:
* Show fancy tooltips for checkmatrix fields.
*/
-( function ( mw ) {
+( function () {
mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
var $matrixTooltips = $root.find( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
}
} );
-}( mediaWiki ) );
+}() );
* HTMLForm enhancements:
* Add/remove cloner clones without having to resubmit the form.
*/
-( function ( mw, $ ) {
+( function () {
var cloneCounter = 0;
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
* HTMLForm enhancements:
* Set up 'hide-if' behaviors for form fields that have them.
*/
-( function ( mw, $ ) {
+( function () {
/**
* Helper function for hide-if to find the nearby form field.
}
v = spec[ 2 ];
- if ( !( field instanceof jQuery ) ) {
+ if ( !( field instanceof $ ) ) {
// field is a OO.ui.Widget
if ( field.supports( 'isSelected' ) ) {
getVal = function () {
// It is impossible to submit a form with hidden fields failing validation, e.g. one that
// is required. However, validity is not checked for disabled fields, as these are not
// submitted with the form. So we should also disable fields when hiding them.
- if ( self instanceof jQuery ) {
+ if ( self instanceof $ ) {
// This also finds elements inside any nested fields (in case of HTMLFormFieldCloner),
// which is problematic. But it works because:
// * HTMLFormFieldCloner::createFieldsForKey() copies 'hide-if' rules to nested fields
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
$( function () {
mw.hook( 'htmlform.enhance' ).fire( $( document ) );
$root.find( '.mw-htmlform' ).removeAttr( 'novalidate' );
} );
-}( mediaWiki, jQuery ) );
+}() );
* HTMLForm enhancements:
* Convert multiselect fields from checkboxes to Chosen selector when requested.
*/
-( function ( mw, $ ) {
+( function () {
function addMulti( $oldContainer, $container ) {
var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
}
} );
-}( mediaWiki, jQuery ) );
+}() );
* HTMLForm enhancements:
* Add a dynamic max length to the reason field of SelectAndOther.
*/
-( function ( mw, $ ) {
+( function () {
// cache the separator to avoid object creation on each keypress
var colonSeparator = mw.message( 'colon-separator' ).text();
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
* HTMLForm enhancements:
* Animate the SelectOrOther fields, to only show the text field when 'other' is selected.
*/
-( function ( mw, $ ) {
+( function () {
/**
* @class jQuery.plugin.htmlform
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
/* eslint-disable no-console */
-( function ( mw, $ ) {
+( function () {
// mw.inspect is a singleton class with static methods
// that itself can also be invoked as a function (mediawiki.base/mw#inspect).
mw.log( 'mw.inspect: reports are not available in debug mode.' );
}
-}( mediaWiki, jQuery ) );
+}() );
* @author neilk@wikimedia.org
* @author mflaschen@wikimedia.org
*/
-( function ( mw, $ ) {
+( function () {
/**
* @class mw.jqueryMsg
* @singleton
if ( typeof children[ i ] !== 'object' ) {
children[ i ] = document.createTextNode( children[ i ] );
}
- if ( children[ i ] instanceof jQuery && children[ i ].hasClass( 'mediaWiki_htmlEmitter' ) ) {
+ if ( children[ i ] instanceof $ && children[ i ].hasClass( 'mediaWiki_htmlEmitter' ) ) {
children[ i ] = children[ i ].contents();
}
}
* @return {string} Textual value of input
*/
function textify( input ) {
- if ( input instanceof jQuery ) {
+ if ( input instanceof $ ) {
input = input.text();
}
return String( input );
*
* @param {Array} nodes List of one element, integer, n >= 0
* @param {Array} replacements List of at least n strings
- * @return {string} replacement
+ * @return {string|jQuery} replacement
*/
replace: function ( nodes, replacements ) {
var index = parseInt( nodes[ 0 ], 10 );
* Handles an (already-validated) HTML element.
*
* @param {Array} nodes Nodes to process when creating element
- * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
+ * @return {jQuery}
*/
htmlelement: function ( nodes ) {
var tagName, attributes, contents, $element;
var $el,
arg = nodes[ 0 ],
contents = nodes[ 1 ];
- if ( arg instanceof jQuery && !arg.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+ if ( arg instanceof $ && !arg.hasClass( 'mediaWiki_htmlEmitter' ) ) {
$el = arg;
} else {
$el = $( '<a>' );
* So convert it back with the current language's convertNumber.
*
* @param {Array} nodes List of nodes, [ {string|number}, {string}, {string} ... ]
- * @return {string} selected pluralized form according to current language
+ * @return {string|jQuery} selected pluralized form according to current language
*/
plural: function ( nodes ) {
var forms, firstChild, firstChildText, explicitPluralFormNumber, formIndex, form, count,
explicitPluralForms = {};
- count = parseFloat( this.language.convertNumber( nodes[ 0 ], true ) );
+ count = parseFloat( this.language.convertNumber( textify( nodes[ 0 ] ), true ) );
forms = nodes.slice( 1 );
for ( formIndex = 0; formIndex < forms.length; formIndex++ ) {
form = forms[ formIndex ];
- if ( form instanceof jQuery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+ if ( form instanceof $ && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
// This is a nested node, may be an explicit plural form like 5=[$2 linktext]
firstChild = form.contents().get( 0 );
if ( firstChild && firstChild.nodeType === Node.TEXT_NODE ) {
* - a gender string ('male', 'female' or 'unknown')
*
* @param {Array} nodes List of nodes, [ {string|mw.user}, {string}, {string}, {string} ]
- * @return {string} Selected gender form according to current language
+ * @return {string|jQuery} Selected gender form according to current language
*/
gender: function ( nodes ) {
var gender,
if ( maybeUser && maybeUser.options instanceof mw.Map ) {
gender = maybeUser.options.get( 'gender' );
} else {
- gender = maybeUser;
+ gender = textify( maybeUser );
}
return this.language.gender( gender, forms );
* Invoked by putting `{{grammar:form|word}}` in a message
*
* @param {Array} nodes List of nodes [{Grammar case eg: genitive}, {string word}]
- * @return {string} selected grammatical form according to current language
+ * @return {string|jQuery} selected grammatical form according to current language
*/
grammar: function ( nodes ) {
var form = nodes[ 0 ],
word = nodes[ 1 ];
- return word && form && this.language.convertGrammar( word, form );
+ // These could be jQuery objects (passed as message parameters),
+ // in which case we can't transform them (like rawParams() in PHP).
+ if ( typeof form === 'string' && typeof word === 'string' ) {
+ return this.language.convertGrammar( word, form );
+ }
+ return word;
},
/**
* Tranform parsed structure into a int: (interface language) message include
* Invoked by putting `{{int:othermessage}}` into a message
*
+ * TODO Syntax in the included message is not parsed, this seems like a bug?
+ *
* @param {Array} nodes List of nodes
* @return {string} Other message
*/
'int': function ( nodes ) {
- var msg = nodes[ 0 ];
+ var msg = textify( nodes[ 0 ] );
return mw.jqueryMsg.getMessageFunction()( msg.charAt( 0 ).toLowerCase() + msg.slice( 1 ) );
},
* separator, according to the current language.
*
* @param {Array} nodes List of nodes
- * @return {number|string} Formatted number
+ * @return {number|string|jQuery} Formatted number
*/
formatnum: function ( nodes ) {
var isInteger = !!nodes[ 1 ] && nodes[ 1 ] === 'R',
number = nodes[ 0 ];
- return this.language.convertNumber( number, isInteger );
+ // These could be jQuery objects (passed as message parameters),
+ // in which case we can't transform them (like rawParams() in PHP).
+ if ( typeof number === 'string' || typeof number === 'number' ) {
+ return this.language.convertNumber( number, isInteger );
+ }
+ return number;
},
/**
};
}() );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
'use strict';
/**
}
};
-}( mediaWiki ) );
+}() );
/*
* Language-fallback-chain-related utilities for mediawiki.language.
*/
-( function ( mw, $ ) {
+( function () {
/**
* @class mw.language
*/
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Base language object with methods related to language support, attempting to mirror some of the
* functionality of the Language class in MediaWiki:
}
};
-}( mediaWiki ) );
+}() );
/*
* Methods for transforming message syntax.
*/
-( function ( mw, $ ) {
+( function () {
/**
* @class mw.language
return forms[ form ][ word ];
}
- transformations = mediaWiki.language.getData( userLanguage, 'grammarTransformations' );
+ transformations = mw.language.getData( userLanguage, 'grammarTransformations' );
if ( !( transformations && transformations[ form ] ) ) {
return word;
}
} );
-}( mediaWiki, jQuery ) );
+}() );
*
* Loading this module also ensures the availability of appropriate messages via mw.msg.
*/
-( function ( mw ) {
+( function () {
var
monthMessages = [
'january', 'february', 'march', 'april',
abbrev: monthAbbrevMessages.map( mwMsgMapper )
};
-}( mediaWiki ) );
+}() );
/*
* Number-related utilities for mediawiki.language.
*/
-( function ( mw, $ ) {
+( function () {
/**
* @class mw.language
*/
} );
-}( mediaWiki, jQuery ) );
+}() );
/* eslint-disable no-restricted-properties */
-( function ( mw, $ ) {
+( function () {
var ProtectionForm,
reasonCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
reasonByteLimit = mw.config.get( 'wgCommentByteLimit' );
$( ProtectionForm.init.bind( ProtectionForm ) );
-}( mediaWiki, jQuery ) );
+}() );
/**
* MediaWiki legacy wikibits
*/
-( function ( mw, $ ) {
+( function () {
var msg,
loadedScripts = {};
}, 'Use jQuery or mw.loader.load instead.', 'document.' + method );
} );
-}( mediaWiki, jQuery ) );
+}() );
/* global JpegMeta */
-( function ( mw ) {
+( function () {
// Export as module
module.exports = function ( fileReaderResult, fileName ) {
// Back-compat: Also expose via mw.lib
// @deprecated since 1.31
mw.log.deprecate( mw.libs, 'jpegmeta', module.exports );
-}( mediaWiki ) );
+}() );
module.exports = window.pluralRuleParser;
// Back-compat: Also expose via mw.lib
-mediaWiki.libs.pluralRuleParser = window.pluralRuleParser;
+mw.libs.pluralRuleParser = window.pluralRuleParser;
-( function ( mw, $ ) {
+( function () {
/**
* This is an implementation of MessagePoster for wikitext talk pages.
*
mw.messagePoster.factory.register( 'wikitext', WikitextMessagePoster );
mw.messagePoster.WikitextMessagePoster = WikitextMessagePoster;
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* This is the abstract base class for MessagePoster implementations.
*
* something.
*/
mw.messagePoster.MessagePoster.prototype.post = function () {};
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* Factory for MessagePoster objects. This provides a pluggable to way to script the action
* of adding a message to someone's talk page.
mw.messagePoster = {
factory: new MessagePosterFactory()
};
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.plugin.convertmessagebox
* @singleton
*/
-( function ( mw, $ ) {
+( function () {
'use strict';
/**
module.exports = convertmessagebox;
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
'use strict';
var notification,
mw.notification = notification;
-}( mediaWiki, jQuery ) );
+}() );
/**
* @class mw.plugin.notify
*/
-( function ( mw ) {
+( function () {
'use strict';
/**
* @mixins mw.plugin.notify
*/
-}( mediaWiki ) );
+}() );
* - Toggle gallery captions when focused.
* - Dynamically resize images to fill horizontal space.
*/
-( function ( mw, $ ) {
+( function () {
var $galleries,
bound = false,
lastWidth = window.innerWidth,
}
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* mw.GallerySlideshow: Interface controls for the slideshow gallery
*/
-( function ( mw, $, OO ) {
+( function () {
/**
* mw.GallerySlideshow encapsulates the user interface of the slideshow
* galleries. An object is instantiated for each `.mw-gallery-slideshow`
new mw.GallerySlideshow( this );
} );
} );
-}( mediaWiki, jQuery, OO ) );
+}() );
* Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
*/
-( function ( mw, $ ) {
+( function () {
var jqXhr, $multipageimage, $spinner,
cache = {},
cacheOrder = [];
} );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
* @since 1.21
* @author Marius Hoch <hoo@online.de>
*/
-( function ( mw, $ ) {
+( function () {
if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
// Current user has no patrol right, or an old cached version of user.tokens
// that didn't have patrolToken yet.
e.preventDefault();
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
mw.hook( 'wikipage.content' ).add( function ( $content ) {
var $sortable, $collapsible;
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
* @since 1.28
* @author Timo Tijhof
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
$( '.mw-rollback-link' ).on( 'click', 'a[data-mw="interface"]', function ( e ) {
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
// Break out of framesets
if ( mw.config.get( 'wgBreakFrames' ) ) {
// Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
}
} );
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.plugin.page.watch.ajax
* @singleton
*/
-( function ( mw, $ ) {
+( function () {
var watch,
// The name of the page to watch or unwatch
title = mw.config.get( 'wgRelevantPageName' );
.done( function ( watchResponse ) {
var message, otherAction = action === 'watch' ? 'unwatch' : 'watch';
- if ( mwTitle.getNamespaceId() > 0 && mwTitle.getNamespaceId() % 2 === 1 ) {
+ if ( mwTitle.isTalkPage() ) {
message = action === 'watch' ? 'addedwatchtext-talk' : 'removedwatchtext-talk';
} else {
message = action === 'watch' ? 'addedwatchtext' : 'removedwatchtext';
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* View model for the changes list
*
mw.rcfilters.dm.ChangesListViewModel.prototype.hasUnseenWatchedChanges = function () {
return this.unseenWatchedChanges;
};
-}( mediaWiki ) );
+}() );
/* eslint-disable no-restricted-properties */
-( function ( mw ) {
+( function () {
/**
* View model for a filter group
*
itemModel.toggleVisible( visibleItems.indexOf( itemModel ) !== -1 );
} );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Filter item model
*
return this.visible;
};
-}( mediaWiki ) );
+}() );
/* eslint-disable no-restricted-properties */
-( function ( mw, $ ) {
+( function () {
/**
* View model for the filters selection and display
*
this.getItemByName( filterName ).clearHighlightColor();
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* RCFilter base item model
*
mw.rcfilters.dm.ItemModel.prototype.isHighlighted = function () {
return !!this.getHighlightColor();
};
-}( mediaWiki ) );
+}() );
/* eslint-disable no-restricted-properties */
-( function ( mw, $ ) {
+( function () {
/**
* View model for saved queries
*
mw.rcfilters.dm.SavedQueriesModel.prototype.isConverted = function () {
return this.converted;
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* View model for a single saved query
*
this.emit( 'update' );
}
};
-}( mediaWiki ) );
+}() );
/* eslint-disable no-restricted-properties */
-( function ( mw, $ ) {
+( function () {
var byteLength = require( 'mediawiki.String' ).byteLength;
label: label || mw.msg( 'blanknamespace' ),
description: '',
identifiers: [
- ( namespaceID < 0 || namespaceID % 2 === 0 ) ?
- 'subject' : 'talk'
+ mw.Title.isTalkNamespace( namespaceID ) ?
+ 'talk' : 'subject'
],
cssClass: 'mw-changeslist-ns-' + namespaceID
} );
this.filtersModel.getViewTrigger( view )
);
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Supported highlight colors.
* Warning: These are also hardcoded in "styles/mw.rcfilters.variables.less"
* @property {string[]}
*/
mw.rcfilters.HighlightColors = [ 'c1', 'c2', 'c3', 'c4', 'c5' ];
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/* eslint no-underscore-dangle: "off" */
/**
* URI Processor for RCFilters
{ urlversion: '2' }
);
};
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:RecentChanges
*/
-( function ( mw, $ ) {
+( function () {
var rcfilters = {
/**
* @member mw.rcfilters
module.exports = rcfilters;
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* @class
* @singleton
}
}
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Widget defining the button controlling the popup for the number of results
*
}
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Widget defining the popup to choose number of results
*
mw.rcfilters.ui.ChangesLimitPopupWidget.prototype.onGroupByPageModelUpdate = function () {
this.groupByPageCheckbox.setSelected( this.groupByPageItemModel.isSelected() );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* List of changes
*
// Turn off highlights
this.$element.removeClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlighted' );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* A widget representing a single toggle filter
*
mw.rcfilters.ui.CheckboxInputWidget.prototype.onUserChange = function () {
this.emit( 'userChange', this.$input.prop( 'checked' ) );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Widget defining the popup to choose date for the results
*
*
* A days item was chosen
*/
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* A button to configure highlight for a filter item
*
);
} );
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* Menu header for the RCFilters filters menu
*
mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onInvertNamespacesButtonClick = function () {
this.controller.toggleInvertedNamespaces();
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* A widget representing a single toggle filter
*
} );
}
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* A widget representing a menu section for filter groups
*
return this.model.getName();
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Extend OOUI's FilterTagItemWidget to also display a popup on hover.
*
invalid: this.itemModel.isSelected() && this.itemModel.isConflicted()
} );
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* List displaying all filter groups
*
} );
}
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* List displaying all filter groups
*
mw.rcfilters.ui.FilterWrapperWidget.prototype.onNewChangesExist = function ( newChangesExist ) {
this.showNewChangesLink.toggle( newChangesExist );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Wrapper for the RC form with hide/show links
* Must be constructed after the model is initialized.
this.$element.detach();
}
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* A group widget to allow for aggregation of events
*
OO.inheritClass( mw.rcfilters.ui.GroupWidget, OO.ui.Widget );
OO.mixinClass( mw.rcfilters.ui.GroupWidget, OO.ui.mixin.GroupWidget );
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* A widget representing a filter item highlight color picker
*
}
this.emit( 'chooseColor', color );
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* A popup containing a color picker, for setting highlight colors.
*
this.toggle( false );
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* A widget representing a base toggle item
*
return this.itemModel;
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Widget for toggling live updates
*
this.setState( enable );
};
-}( mediaWiki ) );
+}() );
-( function ( $, mw ) {
+( function () {
/**
* Wrapper for changes list content
*
return new mw.rcfilters.ui.FormWrapperWidget(
this.model, this.changesListModel, this.controller, this.$formContainer );
};
-}( jQuery, mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Button for marking all changes as seen on the Watchlist
*
this.setDisabled( !this.model.hasUnseenWatchedChanges() );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* A floating menu widget for the filter list
*
mw.rcfilters.ui.MenuSelectWidget.prototype.setUserSelecting = function ( isSelecting ) {
this.userSelecting = !!isSelecting;
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Top section (between page title and filters) on Special:Recentchanges
*
}
this.$topLinks.toggleClass( 'mw-recentchanges-toplinks-collapsed', state === 'collapsed' );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Widget to select and display target page on Special:RecentChangesLinked (AKA Related Changes)
*
this.titleSearch.setValue( text );
this.titleSearch.setTitle( text );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Widget to select to view changes that link TO or FROM the target page
* on Special:RecentChangesLinked (AKA Related Changes)
'rcfilters-filter-showlinkedfrom-label'
) );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Top section (between page title and filters) on Special:RecentChangesLinked (AKA RelatedChanges)
*
/* Initialization */
OO.inheritClass( mw.rcfilters.ui.RclTopSectionWidget, OO.ui.Widget );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Save filters widget. This widget is displayed in the tag area
* and allows the user to save the current state of the system
this.emit( 'saveCurrent' );
}
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Quick links menu option widget
*
return this.model.getID();
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Quick links widget
*
this.menu.removeItems( [ this.menu.findItemFromData( item.getID() ) ] );
this.placeholderItem.toggle( this.model.isEmpty() );
};
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/**
* Extend OOUI's TagItemWidget to also display a popup on hover.
*
this.itemModel.disconnect( this );
this.closeButton.disconnect( this );
};
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Widget defining the behavior used to choose from a set of values
* in a single_value group
this.selectWidget.selectItemByData( selectedItem.getName() );
}
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* A widget for the footer for the default view, allowing to switch views
*
mw.rcfilters.ui.ViewSwitchWidget.prototype.onButtonClick = function ( buttonWidget ) {
this.controller.switchView( buttonWidget.getData() );
};
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
/**
* Top section (between page title and filters) on Special:Watchlist
*
/* Initialization */
OO.inheritClass( mw.rcfilters.ui.WatchlistTopSectionWidget, OO.ui.Widget );
-}( mediaWiki ) );
+}() );
/*!
* Add search suggestions to the search form.
*/
-( function ( mw, $ ) {
+( function () {
var searchNS = $.map( mw.config.get( 'wgFormattedNamespaces' ), function ( nsName, nsID ) {
if ( nsID >= 0 && mw.user.options.get( 'searchNs' + nsID ) ) {
// Cast string key to number
.find( '.mw-fallbackSearchButton' ).remove();
} );
-}( mediaWiki, jQuery ) );
+}() );
/* eslint-disable no-restricted-properties */
-( function ( $, mw, OO ) {
+( function () {
'use strict';
var ApiSandbox, Util, WidgetMethods, Validators,
$content, panel, booklet, oldhash, windowManager,
module.exports = ApiSandbox;
-}( jQuery, mediaWiki, OO ) );
+}() );
/*!
* JavaScript for Special:Block
*/
-( function ( mw, $ ) {
+( function () {
// Like OO.ui.infuse(), but if the element doesn't exist, return null instead of throwing an exception.
function infuseOrNull( elem ) {
try {
updateBlockOptions();
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for change credentials form.
*/
-( function ( mw, $, OO ) {
+( function () {
mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
var api = new mw.Api();
} );
} );
} );
-}( mediaWiki, jQuery, OO ) );
+}() );
*/
/* Remember the collapse state of the legend on recent changes and watchlist pages. */
-( function ( mw ) {
+( function () {
var
cookieName = 'changeslist-state',
// Expanded by default
};
mw.hook( 'wikipage.content' ).add( doCollapsibleLegend );
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
// Return a promise that is resolved when the element is blurred (loses focus).
// If it already is blurred, resolved immediately.
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:EditTags
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:Import
*/
-( function ( $ ) {
+( function () {
var subprojectListAlreadyShown;
function updateImportSubprojectList() {
var $projectField = $( '#mw-import-table-interwiki #interwiki' ),
updateImportSubprojectList();
}
} );
-}( jQuery ) );
+}() );
/*!
* JavaScript for Special:MovePage
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
mw.widgets.visibleByteLimit( wpReason, summaryByteLimit );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript module used on Special:PageLanguage
*/
-( function ( $, OO ) {
+( function () {
$( function () {
// Select the 'Language select' option if user is trying to select language
OO.ui.infuse( 'mw-pl-languageselector' ).on( 'change', function () {
OO.ui.infuse( 'mw-pl-options' ).setValue( '2' );
} );
} );
-}( jQuery, OO ) );
+}() );
/*!
* JavaScript for Special:Preferences: editfont field enhancements.
*/
-( function ( mw ) {
+( function () {
mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
var widget, lastValue,
$target = $root.find( '#mw-input-wpeditfont' );
updateLabel( widget.getValue() );
} );
-}( mediaWiki ) );
+}() );
/*!
* JavaScript for Special:Preferences: Tab navigation.
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var $preferences, tabs, wrapper, previousTab, switchingNoHash;
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
.mixin-screen-reader-text;
}
-/* Override OOUI styles so that dropdowns near the bottom of the form don't get clipped,
- * e.g.'Appearance' / 'Threshold for stub link formatting'. This is hacky and bad, it would be
- * better solved by setting overlays for the widgets, but we can't do it from PHP... */
-#preferences .oo-ui-panelLayout {
- position: static;
- overflow: visible;
- .transform( none );
+/* Most outer Panellayout:
+ * Decrease contrast of `border` slightly as padding/border combination is sufficient
+ * accessibility wise and focus of content is more important here. */
+#preferences .oo-ui-panelLayout-framed {
+ border-color: #c8ccd1;
}
#preferences .oo-ui-menuLayout .oo-ui-panelLayout-framed .oo-ui-panelLayout-framed {
* JavaScript for Special:Preferences: Enable save button and prevent the window being accidentally
* closed when any form field is changed.
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var allowCloseWindow, saveButton, restoreButton,
oouiEnabled = $( '#mw-prefs-form' ).hasClass( 'mw-htmlform-ooui' );
$( '#mw-prefs-restoreprefs' ).on( 'click', allowCloseWindow.release );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:Preferences: Check for successbox to replace with notifications.
*/
-( function ( $ ) {
+( function () {
$( function () {
var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
convertmessagebox();
} );
-}( jQuery ) );
+}() );
/*!
* JavaScript for Special:Preferences: Email preferences better UX
*/
-( function ( $ ) {
+( function () {
$( function () {
var allowEmail, allowEmailFromNewUsers;
toggleDisabled();
}
} );
-}( jQuery ) );
+}() );
/*!
* JavaScript for Special:Preferences: Tab navigation.
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var $preftoc, $preferences, $fieldsets, labelFunc, previousTab;
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:Preferences: Timezone field enhancements.
*/
-( function ( mw, $ ) {
+( function () {
mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
var $tzSelect, $tzTextbox, timezoneWidget, $localtimeHolder, servertime,
$target = $root.find( '#wpTimeCorrection' ),
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:RecentChanges
*/
-( function ( mw, $ ) {
+( function () {
var rc, $checkboxes, $select;
/**
module.exports = rc;
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:RevisionDelete
*/
-( function ( mw, $ ) {
+( function () {
var colonSeparator = mw.message( 'colon-separator' ).text(),
summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
$wpReason.byteLimit( summaryByteLimit, filterFn );
}
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
var api = new mw.Api(),
pageUrl = new mw.Uri(),
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:Search
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var $checkboxes, $headerLinks, updateHeaderLinks, searchWidget;
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:Undelete
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
mw.widgets.visibleByteLimit( wpComment, summaryByteLimit );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:UnwatchedPages
*/
-( function ( mw, $ ) {
+( function () {
$( function () {
$( 'a.mw-watch-link' ).click( function ( e ) {
var promise,
e.preventDefault();
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
/* global Uint8Array */
-( function ( mw, $ ) {
+( function () {
var uploadWarning, uploadTemplatePreview,
ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
$license = $( '#wpLicense' );
$( '.mw-editTools' ).attr( 'tabindex', '0' );
setEditTabindex( '-1' );
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for signup form.
*/
-( function ( mw, $ ) {
+( function () {
// When sending password by email, hide the password input fields.
$( function () {
// Always required if checked, otherwise it depends, so we use the original
passwordChecker = new mw.htmlform.Checker( $passwordInput, checkPassword );
passwordChecker.attach( $usernameInput.add( $emailInput ).add( $realNameInput ) );
} );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:UserRights
*/
-( function ( mw, $ ) {
+( function () {
var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' ),
summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
$wpReason.byteLimit( summaryByteLimit );
}
-}( mediaWiki, jQuery ) );
+}() );
/*!
* JavaScript for Special:Watchlist
*/
-( function ( $ ) {
+( function () {
$( function () {
$( '.mw-changeslist-line-watched .mw-title a' ).on( 'click', function () {
$( this )
.removeClass( 'mw-changeslist-line-watched' );
} );
} );
-}( jQuery ) );
+}() );
/*!
* JavaScript for Special:Watchlist
*/
-( function ( mw, $, OO ) {
+( function () {
$( function () {
var api = new mw.Api(), $progressBar, $resetForm = $( '#mw-watchlist-resetbutton' );
$watchlistLine = $unwatchLink.closest( 'li, table' )
.find( '[data-target-page]' ),
pageTitle = $watchlistLine.data( 'targetPage' ),
- isTalk = mw.Title.newFromText( pageTitle ).getNamespaceId() % 2 === 1;
+ isTalk = mw.Title.newFromText( pageTitle ).isTalkPage();
// Utility function for looping through each watchlist line that matches
// a certain page or its associated page (e.g. Talk)
function forEachMatchingTitle( title, callback ) {
var titleObj = mw.Title.newFromText( title ),
- pageNamespaceId = titleObj.getNamespaceId(),
- isTalk = pageNamespaceId % 2 === 1,
- associatedTitle = mw.Title.makeTitle( isTalk ? pageNamespaceId - 1 : pageNamespaceId + 1,
- titleObj.getMainText() ).getPrefixedText();
+ associatedTitleObj = titleObj.isTalkPage() ? titleObj.getSubjectPage() : titleObj.getTalkPage(),
+ associatedTitle = associatedTitleObj.getPrefixedText();
$( '.mw-changeslist-line' ).each( function () {
var $this = $( this ), $row, $unwatchLink;
}
} );
-}( mediaWiki, jQuery, OO )
-);
+}() );
-( function ( mw ) {
+( function () {
'use strict';
// Catch exceptions to avoid fatal in Chrome's "Block data storage" mode
*/
mw.storage.session = new SafeStorage( sessionStorage );
-}( mediaWiki ) );
+}() );
* @class mw.template
* @singleton
*/
-( function ( mw, $ ) {
+( function () {
var compiledTemplates = {},
compilers = {};
}
} );
-}( mediaWiki, jQuery ) );
+}() );
/* global Mustache */
-( function ( mw, $ ) {
+( function () {
// Register mustache compiler
mw.template.registerCompiler( 'mustache', {
compile: function ( src ) {
}
} );
-}( mediaWiki, jQuery ) );
+}() );
-mediaWiki.template.registerCompiler( 'regexp', {
+mw.template.registerCompiler( 'regexp', {
compile: function ( src ) {
return {
render: function () {
-( function ( mw, $ ) {
+( function () {
'use strict';
// Table of contents toggle
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
* @class mw.toolbar
* @singleton
*/
-( function ( mw, $ ) {
+( function () {
var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
/**
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
* @singleton
*/
/* global Uint16Array */
-( function ( mw, $ ) {
+( function () {
var userInfoPromise, pageviewRandomId;
/**
*/
mw.log.deprecate( mw.user, 'stickyRandomId', mw.user.getPageviewToken, 'Please use getPageviewToken instead' );
-}( mediaWiki, jQuery ) );
+}() );
/*!
* Add autocomplete suggestions for names of registered users.
*/
-( function ( mw, $ ) {
+( function () {
var api, config;
config = {
$( function () {
$( '.mw-autocomplete-user' ).suggestions( config );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
'use strict';
var util;
* e.preventDefault();
* } );
*
- * @param {string} portlet ID of the target portlet ( 'p-cactions' or 'p-personal' etc.)
+ * @param {string} portletId ID of the target portlet (e.g. 'p-cactions' or 'p-personal')
* @param {string} href Link URL
* @param {string} text Link text
- * @param {string} [id] ID of the new item, should be unique and preferably have
- * the appropriate prefix ( 'ca-', 'pt-', 'n-' or 't-' )
+ * @param {string} [id] ID of the list item, should be unique and preferably have
+ * the appropriate prefix ('ca-', 'pt-', 'n-' or 't-')
* @param {string} [tooltip] Text to show when hovering over the link, without accesskey suffix
- * @param {string} [accesskey] Access key to activate this link (one character, try
- * to avoid conflicts. Use `$( '[accesskey=x]' ).get()` in the console to
+ * @param {string} [accesskey] Access key to activate this link. One character only,
+ * avoid conflicts with other links. Use `$( '[accesskey=x]' )` in the console to
* see if 'x' is already used.
- * @param {HTMLElement|jQuery|string} [nextnode] Element or jQuery-selector string to the item that
- * the new item should be added before, should be another item in the same
- * list, it will be ignored otherwise
- *
- * @return {HTMLElement|null} The added element (a ListItem or Anchor element,
- * depending on the skin) or null if no element was added to the document.
+ * @param {HTMLElement|jQuery|string} [nextnode] Element that the new item should be added before.
+ * Must be another item in the same list, it will be ignored otherwise.
+ * Can be specified as DOM reference, as jQuery object, or as CSS selector string.
+ * @return {HTMLElement|null} The added list item, or null if no element was added.
*/
- addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
- var $item, $link, $portlet, $ul;
+ addPortletLink: function ( portletId, href, text, id, tooltip, accesskey, nextnode ) {
+ var item, link, $portlet, portlet, portletDiv, ul, next;
- // Check if there's at least 3 arguments to prevent a TypeError
- if ( arguments.length < 3 ) {
+ if ( !portletId ) {
+ // Avoid confusing id="undefined" lookup
return null;
}
- // Setup the anchor tag
- $link = $( '<a>' ).attr( 'href', href ).text( text );
- if ( tooltip ) {
- $link.attr( 'title', tooltip );
- }
- // Select the specified portlet
- $portlet = $( '#' + portlet );
- if ( $portlet.length === 0 ) {
+ portlet = document.getElementById( portletId );
+ if ( !portlet ) {
+ // Invalid portlet ID
return null;
}
- // Select the first (most likely only) unordered list inside the portlet
- $ul = $portlet.find( 'ul' ).eq( 0 );
-
- // If it didn't have an unordered list yet, create it
- if ( $ul.length === 0 ) {
-
- $ul = $( '<ul>' );
- // If there's no <div> inside, append it to the portlet directly
- if ( $portlet.find( 'div:first' ).length === 0 ) {
- $portlet.append( $ul );
- } else {
- // otherwise if there's a div (such as div.body or div.pBody)
- // append the <ul> to last (most likely only) div
- $portlet.find( 'div' ).eq( -1 ).append( $ul );
- }
+ // Setup the anchor tag and set any the properties
+ link = document.createElement( 'a' );
+ link.href = href;
+ link.textContent = text;
+ if ( tooltip ) {
+ link.title = tooltip;
}
- // Just in case..
- if ( $ul.length === 0 ) {
- return null;
+ if ( accesskey ) {
+ link.accessKey = accesskey;
}
// Unhide portlet if it was hidden before
+ $portlet = $( portlet );
$portlet.removeClass( 'emptyPortlet' );
- // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
- // and back up the selector to the list item
+ // Setup the list item (and a span if $portlet is a Vector tab)
if ( $portlet.hasClass( 'vectorTabs' ) ) {
- $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+ item = $( '<li>' ).append( $( '<span>' ).append( link )[ 0 ] )[ 0 ];
} else {
- $item = $link.wrap( '<li></li>' ).parent();
+ item = $( '<li>' ).append( link )[ 0 ];
}
-
- // Implement the properties passed to the function
if ( id ) {
- $item.attr( 'id', id );
+ item.id = id;
}
- if ( accesskey ) {
- $link.attr( 'accesskey', accesskey );
- }
-
- if ( tooltip ) {
- $link.attr( 'title', tooltip );
+ // Select the first (most likely only) unordered list inside the portlet
+ ul = portlet.querySelector( 'ul' );
+ if ( !ul ) {
+ // If it didn't have an unordered list yet, create one
+ ul = document.createElement( 'ul' );
+ portletDiv = portlet.querySelector( 'div' );
+ if ( portletDiv ) {
+ // Support: Legacy skins have a div (such as div.body or div.pBody).
+ // Append the <ul> to that.
+ portletDiv.appendChild( ul );
+ } else {
+ // Append it to the portlet directly
+ portlet.appendChild( ul );
+ }
}
- if ( nextnode ) {
- // Case: nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
- // Case: nextnode is a CSS selector for jQuery
- if ( nextnode.nodeType || typeof nextnode === 'string' ) {
- nextnode = $ul.find( nextnode );
- } else if ( !nextnode.jquery ) {
- // Error: Invalid nextnode
- nextnode = undefined;
- }
- if ( nextnode && ( nextnode.length !== 1 || nextnode[ 0 ].parentNode !== $ul[ 0 ] ) ) {
- // Error: nextnode must resolve to a single node
- // Error: nextnode must have the associated <ul> as its parent
- nextnode = undefined;
+ if ( nextnode && ( typeof nextnode === 'string' || nextnode.nodeType || nextnode.jquery ) ) {
+ nextnode = $( ul ).find( nextnode );
+ if ( nextnode.length === 1 && nextnode[ 0 ].parentNode === ul ) {
+ // Insertion point: Before nextnode
+ nextnode.before( item );
+ next = true;
}
+ // Else: Invalid nextnode value (no match, more than one match, or not a direct child)
+ // Else: Invalid nextnode type
}
- // Case: nextnode is a jQuery-wrapped DOM element
- if ( nextnode ) {
- nextnode.before( $item );
- } else {
- // Fallback (this is the default behavior)
- $ul.append( $item );
+ if ( !next ) {
+ // Insertion point: End of list (default)
+ ul.appendChild( item );
}
// Update tooltip for the access key after inserting into DOM
// to get a localized access key label (T69946).
if ( accesskey ) {
- $link.updateTooltipAccessKeys();
+ $( link ).updateTooltipAccessKeys();
}
- return $item[ 0 ];
+ return item;
},
/**
mw.util = util;
module.exports = util;
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
'use strict';
/**
};
mw.viewport = viewport;
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, document ) {
+( function () {
var hidden, visibilityChange,
nextVisibleTimeoutId = 0,
activeTimeouts = {},
+ document = window.document,
init = function ( overrideDoc ) {
if ( overrideDoc !== undefined ) {
document = overrideDoc;
module.exports.setDocument = init;
}
-}( mediaWiki, document ) );
+}() );
-( function ( $, mw ) {
+( function () {
/**
* CalendarWidget displays a calendar that can be used to select a date. It
return this;
};
-}( jQuery, mediaWiki ) );
+}() );
/* eslint-disable no-restricted-properties */
-( function ( $, mw ) {
+( function () {
/**
* Provides various methods needed for formatting dates and times.
};
};
-}( jQuery, mediaWiki ) );
+}() );
-( function ( $, mw ) {
+( function () {
/**
* DateTimeInputWidgets can be used to input a date, a time, or a date and
this.focus();
};
-}( jQuery, mediaWiki ) );
+}() );
border: 0;
border-radius: @border-radius-base;
// Provide more top padding due to border not being part of the calculation
- padding-top: 10 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
+ padding-top: 10 / @ooui-font-size-browser / @ooui-font-size-base;
padding-bottom: @padding-bottom-base;
box-shadow: none;
font-size: inherit;
/* eslint-disable no-restricted-properties */
-( function ( $, mw ) {
+( function () {
/**
* Provides various methods needed for formatting dates and times. This
return ret;
};
-}( jQuery, mediaWiki ) );
+}() );
/* eslint-disable no-restricted-properties */
-( function ( $, mw ) {
+( function () {
/**
* Provides various methods needed for formatting dates and times. This
return ret;
};
-}( jQuery, mediaWiki ) );
+}() );
}
// Variables taken from OOUI's WikimediaUI theme, see its common.less for further explanations
-@oo-ui-font-size-browser: 16; // assumed browser default of `16px`
-@oo-ui-font-size-base: 0.875em; // equals `14px` at browser default of `16px`
+@ooui-font-size-browser: 16; // assumed browser default of `16px`
+@ooui-font-size-base: 0.875em; // equals `14px` at browser default of `16px`
@background-color-base: #fff;
@background-color-base--hover: #eaecf0;
@color-erroneous: #d33;
@min-size-indicator: 12px;
-@size-base: 32 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@size-icon: 24 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@size-indicator: 12 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
+@size-base: 32 / @ooui-font-size-browser / @ooui-font-size-base;
+@size-icon: 24 / @ooui-font-size-browser / @ooui-font-size-base;
+@size-indicator: 12 / @ooui-font-size-browser / @ooui-font-size-base;
@max-width-base: 50em;
@max-width-input: @max-width-base;
@padding-input-text: @padding-top-base @padding-horizontal-input-text @padding-bottom-base;
-@padding-horizontal-base: 12 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-horizontal-input-text: 8 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-top-base: 8 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-bottom-base: 7 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-start-input-text-icon: 6 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-start-input-text-icon-label: 32 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
+@padding-horizontal-base: 12 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-horizontal-input-text: 8 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-top-base: 8 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-bottom-base: 7 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-start-input-text-icon: 6 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-start-input-text-icon-label: 32 / @ooui-font-size-browser / @ooui-font-size-base;
@border-base: 1px solid #a2a9b1;
@border-color-base--disabled: #c8ccd1;
@box-shadow-widget: inset 0 0 0 1px transparent;
@box-shadow-erroneous--focus: inset 0 0 0 1px @color-erroneous;
-@line-height-widget-singleline: 15 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
+@line-height-widget-singleline: 15 / @ooui-font-size-browser / @ooui-font-size-base;
@text-shadow-base: 0 1px 1px @color-base--inverted; // 'coined' effect
@text-shadow-base--disabled: @text-shadow-base;
// Create the namespace object
-mediaWiki.widgets.datetime = {};
+mw.widgets.datetime = {};
-( function ( mw ) {
+( function () {
var byteLength = require( 'mediawiki.String' ).byteLength,
codePointLength = require( 'mediawiki.String' ).codePointLength;
textInputWidget.$input.codePointLimit( limit );
};
-}( mediaWiki ) );
+}() );
*
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
*/
-( function ( $, mw ) {
+( function () {
/**
* API Results Provider object.
mw.widgets.APIResultsProvider.prototype.setAjaxSettings = function ( settings ) {
this.ajaxSettings = settings;
};
-}( jQuery, mediaWiki ) );
+}() );
*
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
*/
-( function ( $, mw ) {
+( function () {
/**
* API Results Queue object.
mw.widgets.APIResultsQueue.prototype.getThreshold = function () {
return this.threshold;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* MediaWiki media resource provider.
this.apiurl !== undefined ||
this.scriptDirUrl !== undefined;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* MediaWiki media resource queue.
mw.widgets.MediaResourceQueue.prototype.getMaxHeight = function () {
return this.maxHeight;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Creates an mw.widgets.MediaResultWidget object.
mw.widgets.MediaResultWidget.prototype.hasSrc = function () {
return !!this.src;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* MediaWiki media search provider.
mw.widgets.MediaSearchProvider.prototype.isValid = function () {
return this.getUserParams().gsrsearch && mw.widgets.MediaSearchProvider.super.prototype.isValid.call( this );
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( mw ) {
+( function () {
/**
* MediaWiki media resource queue.
mw.widgets.MediaSearchQueue.prototype.getSearchQuery = function () {
return this.getParams().gsrsearch;
};
-}( mediaWiki ) );
+}() );
* @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Creates an mw.widgets.MediaSearchWidget object.
mw.widgets.MediaSearchWidget.prototype.getLang = function () {
return this.lang;
};
-}( jQuery, mediaWiki ) );
+}() );
* @license The MIT License (MIT); see LICENSE.txt
*/
/* global moment */
-( function ( $, mw ) {
+( function () {
/**
* Creates an mw.widgets.CalendarWidget object.
return this;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
var hasOwn = Object.prototype.hasOwnProperty,
NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
/** Search only parent categories */
ParentCategories: 4
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
var hasOwn = Object.prototype.hasOwnProperty;
// For backwards compatibility. See T183299.
mw.widgets.CategoryCapsuleItemWidget = mw.widgets.CategoryTagItemWidget;
-}( jQuery, mediaWiki ) );
+}() );
-( function ( $, mw ) {
+( function () {
/**
* A JavaScript version of CheckMatrixWidget.
*
} );
}
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus
return this;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Like TitleInputWidget, but the namespace has to be input through a separate dropdown field.
return this;
};
-}( jQuery, mediaWiki ) );
+}() );
* @license The MIT License (MIT); see LICENSE.txt
*/
/* global moment */
-( function ( $, mw ) {
+( function () {
/**
* Creates an mw.widgets.DateInputWidget object.
}
};
-}( jQuery, mediaWiki ) );
+}() );
*/
// Variables taken from OOUI's WikimediaUI theme
-@oo-ui-font-size-browser: 16; // assumed browser default of `16px`
-@oo-ui-font-size-base: 0.8em; // equals `12.8px` at browser default of `16px`
+@ooui-font-size-browser: 16; // assumed browser default of `16px`
+@ooui-font-size-base: 0.875em; // equals `14px` at browser default of `16px`
@background-color-base: #fff;
@border-radius-base: 2px;
@padding-input-text: @padding-top-base @padding-horizontal-input-text @padding-bottom-base;
-@padding-horizontal-input-text: 8 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-top-base: 8 / @oo-ui-font-size-browser / @oo-ui-font-size-base; // equals `0.625em`≈`8px`
-@padding-bottom-base: 7 / @oo-ui-font-size-browser / @oo-ui-font-size-base; // equals `0.547em`≈`7px`
+@padding-horizontal-input-text: 8 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.57142857em`≈`7px`
+@padding-top-base: 8 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-bottom-base: 7 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.5em`≈`7px`
@box-shadow-widget: inset 0 0 0 1px transparent;
@box-shadow-widget--focus: inset 0 0 0 1px #36c;
-@line-height-widget-singleline: 1.172em; // Firefox needs a value, Chrome the unit; equals `15px` at base `font-size: 12.8px`
+@line-height-widget-singleline: 15 / @ooui-font-size-browser / @ooui-font-size-base; // equals `1.07142857em`≈`15px`; Firefox needs a value, Chrome the unit;
-@transition-ease-out-sine-medium: 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
+@transition-ease-medium: @transition-duration-medium; // `ease` is the initial value
+@transition-duration-medium: 250ms;
// Mixins taken from OOUI
.oo-ui-box-sizing( @type: border-box ) {
.mw-widget-dateInputWidget-handle {
box-shadow: @box-shadow-widget; // necessary for smooth transition
.oo-ui-transition(
- border-color @transition-ease-out-sine-medium,
- box-shadow @transition-ease-out-sine-medium
+ border-color @transition-ease-medium,
+ box-shadow @transition-ease-medium
);
&:hover {
* @license The MIT License (MIT); see LICENSE.txt
*/
/* global moment */
-( function ( $, mw ) {
+( function () {
/**
* Creates a mw.widgets.ExpiryWidget object.
return this.relativeField.getValue();
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Namespace input widget. Displays a dropdown box with the choice of available namespaces.
return options;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Creates a mw.widgets.SearchInputWidget object.
return items;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Select with input widget. Displays an OO.ui.TextInputWidget along with
this.emit( 'change', this.getValue() );
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2018 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* RadioSelectInputWidget and a TextInputWidget to set minimum or maximum byte size
this.textinput.restorePreInfuseState( state.textinput );
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2016 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw, OO ) {
+( function () {
/**
* Accepts a stashed file and displays the information for purposes of
return $.Deferred().reject( 'No filekey' );
};
-}( jQuery, mediaWiki, OO ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
var trimByteLength = require( 'mediawiki.String' ).trimByteLength;
} ).newVal;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Creates a mw.widgets.TitleOptionWidget object.
OO.inheritClass( mw.widgets.TitleOptionWidget, OO.ui.MenuOptionWidget );
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( mw ) {
+( function () {
/**
* Creates an mw.widgets.TitleSearchWidget object.
return response.query || {};
};
-}( mediaWiki ) );
+}() );
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
var hasOwn = Object.prototype.hasOwnProperty;
/**
return !!this.getMWTitle();
};
-}( jQuery, mediaWiki ) );
+}() );
}
}
- &:not( &-withDescriptions ) {
+ /* TODO: Should be able to use :not( &-withDescriptions ) but LESS version is buggy (T204816) */
+ &:not( .mw-widget-titleWidget-menu-withDescriptions ) {
.mw-widget-titleOptionWidget-description {
display: none;
}
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* Creates a mw.widgets.UserInputWidget object.
return items;
};
-}( jQuery, mediaWiki ) );
+}() );
* @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
-( function ( $, mw ) {
+( function () {
/**
* UsersMultiselectWidget can be used to input list of users in a single
this.input.setValue( '' );
};
-}( jQuery, mediaWiki ) );
+}() );
-/* global mediaWiki, moment */
+/* global moment */
-( function ( mw ) {
+( function () {
// HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
// wgTranslateNumerals is respected.
moment.updateLocale( moment.locale(), {
return s;
}
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
var isMobile;
// Connect OOUI to MediaWiki's localisation system
OO.ui.getUserLanguages = mw.language.getFallbackLanguageChain;
}
return isMobile;
};
-}( mediaWiki ) );
+}() );
defineFallbacks();
- /* eslint-disable no-console */
log = ( function () {
/**
* Write a verbose message to the browser's console in debug mode.
*
* @param {...string} msg Messages to output to console
*/
- log.warn = console && console.warn && Function.prototype.bind ?
+ log.warn = console && console.warn ?
Function.prototype.bind.call( console.warn, console ) :
function () {};
* @since 1.26
* @param {...Mixed} msg Messages to output to console
*/
- log.error = console && console.error && Function.prototype.bind ?
+ log.error = console && console.error ?
Function.prototype.bind.call( console.error, console ) :
function () {};
* @param {string} [logName=key] Optional custom name for the feature.
* This is used instead of `key` in the message and `mw.deprecate` tracking.
*/
- log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
- obj[ key ] = val;
- } : function ( obj, key, val, msg, logName ) {
+ log.deprecate = function ( obj, key, val, msg, logName ) {
var stacks;
function maybeLog() {
var name,
return log;
}() );
- /* eslint-enable no-console */
/**
* @class mw
$this->assertHasCookie( 'foo', 'bar', $request->getCookieJar() );
$this->markTestIncomplete( 'CookieJar does not handle deletion' );
- return;
- $request = MWHttpRequest::factory( 'http://httpbin.org/cookies/delete?foo' );
- $cookieJar = new CookieJar();
- $cookieJar->setCookie( 'foo', 'bar', [ 'domain' => 'httpbin.org' ] );
- $cookieJar->setCookie( 'foo2', 'bar2', [ 'domain' => 'httpbin.org' ] );
- $request->setCookieJar( $cookieJar );
- $status = $request->execute();
- $this->assertTrue( $status->isGood() );
- $this->assertNotHasCookie( 'foo', $request->getCookieJar() );
- $this->assertHasCookie( 'foo2', 'bar2', $request->getCookieJar() );
+ // $request = MWHttpRequest::factory( 'http://httpbin.org/cookies/delete?foo' );
+ // $cookieJar = new CookieJar();
+ // $cookieJar->setCookie( 'foo', 'bar', [ 'domain' => 'httpbin.org' ] );
+ // $cookieJar->setCookie( 'foo2', 'bar2', [ 'domain' => 'httpbin.org' ] );
+ // $request->setCookieJar( $cookieJar );
+ // $status = $request->execute();
+ // $this->assertTrue( $status->isGood() );
+ // $this->assertNotHasCookie( 'foo', $request->getCookieJar() );
+ // $this->assertHasCookie( 'foo2', 'bar2', $request->getCookieJar() );
}
public function testGetResponseHeaders() {
* @return ParserTestResult|false false if skipped
*/
public function runTest( $test ) {
- wfDebug( __METHOD__.": running {$test['desc']}" );
+ wfDebug( __METHOD__ . ": running {$test['desc']}" );
$opts = $this->parseOptions( $test['options'] );
$teardownGuard = $this->perTestSetup( $test );
<?php
-require __DIR__.'/../../maintenance/Maintenance.php';
+require __DIR__ . '/../../maintenance/Maintenance.php';
define( 'MW_PARSER_TEST', true );
*
* @param Title|string|null $title
* @return WikiPage
- * @throws MWException
+ * @throws MWException If this test cases's needsDB() method doesn't return true.
+ * Test cases can use "@group Database" to enable database test support,
+ * or list the tables under testing in $this->tablesUsed, or override the
+ * needsDB() method.
*/
protected function getExistingTestPage( $title = null ) {
+ if ( !$this->needsDB() ) {
+ throw new MWException( 'When testing which pages, the test cases\'s needsDB()' .
+ ' method should return true. Use @group Database or $this->tablesUsed.' );
+ }
+
$title = ( $title === null ) ? 'UTPage' : $title;
$title = is_string( $title ) ? Title::newFromText( $title ) : $title;
$page = WikiPage::factory( $title );
*
* @param Title|string|null $title
* @return WikiPage
- * @throws MWException
+ * @throws MWException If this test cases's needsDB() method doesn't return true.
+ * Test cases can use "@group Database" to enable database test support,
+ * or list the tables under testing in $this->tablesUsed, or override the
+ * needsDB() method.
*/
protected function getNonexistingTestPage( $title = null ) {
+ if ( !$this->needsDB() ) {
+ throw new MWException( 'When testing which pages, the test cases\'s needsDB()' .
+ ' method should return true. Use @group Database or $this->tablesUsed.' );
+ }
+
$title = ( $title === null ) ? 'UTPage-' . rand( 0, 100000 ) : $title;
$title = is_string( $title ) ? Title::newFromText( $title ) : $title;
$page = WikiPage::factory( $title );
* @param int|null $namespace Namespace id (name cannot already contain namespace)
* @param User|null $user If null, static::getTestSysop()->getUser() is used.
* @return array Title object and page id
+ * @throws MWException If this test cases's needsDB() method doesn't return true.
+ * Test cases can use "@group Database" to enable database test support,
+ * or list the tables under testing in $this->tablesUsed, or override the
+ * needsDB() method.
*/
protected function insertPage(
$pageName,
$namespace = null,
User $user = null
) {
+ if ( !$this->needsDB() ) {
+ throw new MWException( 'When testing which pages, the test cases\'s needsDB()' .
+ ' method should return true. Use @group Database or $this->tablesUsed.' );
+ }
+
if ( is_string( $pageName ) ) {
$title = Title::newFromText( $pageName, $namespace );
} else {
* @param string $summary Optional summary string for the revision
* @param int $defaultNs Optional namespace id
* @return array Array as returned by WikiPage::doEditContent()
+ * @throws MWException If this test cases's needsDB() method doesn't return true.
+ * Test cases can use "@group Database" to enable database test support,
+ * or list the tables under testing in $this->tablesUsed, or override the
+ * needsDB() method.
*/
protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) {
+ if ( !$this->needsDB() ) {
+ throw new MWException( 'When testing which pages, the test cases\'s needsDB()' .
+ ' method should return true. Use @group Database or $this->tablesUsed.' );
+ }
+
$title = Title::newFromText( $pageName, $defaultNs );
$page = WikiPage::factory( $title );
use CommentStoreComment;
use Content;
+use ContentHandler;
use LinksUpdate;
use MediaWiki\MediaWikiServices;
use MediaWiki\Storage\DerivedPageDataUpdater;
use MediaWiki\Storage\RevisionSlotsUpdate;
use MediaWiki\Storage\SlotRecord;
use MediaWikiTestCase;
+use MWCallableUpdate;
+use PHPUnit\Framework\MockObject\MockObject;
+use TextContent;
+use TextContentHandler;
use Title;
use User;
use Wikimedia\TestingAccessWrapper;
$dataUpdates = $updater->getSecondaryDataUpdates();
- // TODO: MCR: assert updates from all slots!
$this->assertNotEmpty( $dataUpdates );
$linksUpdates = array_filter( $dataUpdates, function ( $du ) {
$this->assertCount( 1, $linksUpdates );
}
+ /**
+ * @param string $name
+ *
+ * @return ContentHandler
+ */
+ private function defineMockContentModelForUpdateTesting( $name ) {
+ /** @var ContentHandler|MockObject $handler */
+ $handler = $this->getMockBuilder( TextContentHandler::class )
+ ->setConstructorArgs( [ $name ] )
+ ->setMethods(
+ [ 'getSecondaryDataUpdates', 'getDeletionUpdates', 'unserializeContent' ]
+ )
+ ->getMock();
+
+ $dataUpdate = new MWCallableUpdate( 'time' );
+ $dataUpdate->_name = "$name data update";
+
+ $deletionUpdate = new MWCallableUpdate( 'time' );
+ $deletionUpdate->_name = "$name deletion update";
+
+ $handler->method( 'getSecondaryDataUpdates' )->willReturn( [ $dataUpdate ] );
+ $handler->method( 'getDeletionUpdates' )->willReturn( [ $deletionUpdate ] );
+ $handler->method( 'unserializeContent' )->willReturnCallback(
+ function ( $text ) use ( $handler ) {
+ return $this->createMockContent( $handler, $text );
+ }
+ );
+
+ $this->mergeMwGlobalArrayValue(
+ 'wgContentHandlers', [
+ $name => function () use ( $handler ){
+ return $handler;
+ }
+ ]
+ );
+
+ return $handler;
+ }
+
+ /**
+ * @param ContentHandler $handler
+ * @param string $text
+ *
+ * @return Content
+ */
+ private function createMockContent( ContentHandler $handler, $text ) {
+ /** @var Content|MockObject $content */
+ $content = $this->getMockBuilder( TextContent::class )
+ ->setConstructorArgs( [ $text ] )
+ ->setMethods( [ 'getModel', 'getContentHandler' ] )
+ ->getMock();
+
+ $content->method( 'getModel' )->willReturn( $handler->getModelID() );
+ $content->method( 'getContentHandler' )->willReturn( $handler );
+
+ return $content;
+ }
+
+ public function testGetSecondaryDataUpdatesWithSlotRemoval() {
+ global $wgMultiContentRevisionSchemaMigrationStage;
+
+ if ( ! ( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_READ_NEW ) ) {
+ $this->markTestSkipped( 'Slot removal cannot happen with MCR being enabled' );
+ }
+
+ $m1 = $this->defineMockContentModelForUpdateTesting( 'M1' );
+ $a1 = $this->defineMockContentModelForUpdateTesting( 'A1' );
+ $m2 = $this->defineMockContentModelForUpdateTesting( 'M2' );
+
+ $mainContent1 = $this->createMockContent( $m1, 'main 1' );
+ $auxContent1 = $this->createMockContent( $a1, 'aux 1' );
+ $mainContent2 = $this->createMockContent( $m2, 'main 2' );
+
+ $user = $this->getTestUser()->getUser();
+ $page = $this->getPage( __METHOD__ );
+ $this->createRevision(
+ $page,
+ __METHOD__,
+ [ 'main' => $mainContent1, 'aux' => $auxContent1 ]
+ );
+
+ $update = new RevisionSlotsUpdate();
+ $update->modifyContent( 'main', $mainContent2 );
+ $update->removeSlot( 'aux' );
+
+ $page = $this->getPage( __METHOD__ );
+ $updater = $this->getDerivedPageDataUpdater( $page );
+ $updater->prepareContent( $user, $update, false );
+
+ $dataUpdates = $updater->getSecondaryDataUpdates();
+
+ $this->assertNotEmpty( $dataUpdates );
+
+ $updateNames = array_map( function ( $du ) {
+ return isset( $du->_name ) ? $du->_name : get_class( $du );
+ }, $dataUpdates );
+
+ $this->assertContains( LinksUpdate::class, $updateNames );
+ $this->assertContains( 'A1 deletion update', $updateNames );
+ $this->assertContains( 'M2 data update', $updateNames );
+ $this->assertNotContains( 'M1 data update', $updateNames );
+ }
+
/**
* Creates a dummy revision object without touching the database.
*
<?php
+// phpcs:disable MediaWiki.Commenting.PhpunitAnnotations.NotClassTrait
+
namespace MediaWiki\Tests\Storage;
use CommentStoreComment;
use MediaWiki\Storage\RevisionStore;
use MediaWiki\Storage\SlotRecord;
use MediaWiki\Storage\SqlBlobStore;
+use MediaWiki\User\UserIdentityValue;
use MediaWikiTestCase;
use PHPUnit_Framework_MockObject_MockObject;
use Revision;
/** @var Revision $rev */
$rev = $page->doEditContent(
new WikitextContent( $text ),
- __METHOD__. 'a'
+ __METHOD__ . 'a'
)->value['revision'];
$store = MediaWikiServices::getInstance()->getRevisionStore();
/**
* @covers \MediaWiki\Storage\RevisionStore::newRevisionFromArchiveRow
+ */
+ public function testNewRevisionFromArchiveRow_no_user() {
+ $store = MediaWikiServices::getInstance()->getRevisionStore();
+
+ $row = (object)[
+ 'ar_id' => '1',
+ 'ar_page_id' => '2',
+ 'ar_namespace' => '0',
+ 'ar_title' => 'Something',
+ 'ar_rev_id' => '2',
+ 'ar_text_id' => '47',
+ 'ar_timestamp' => '20180528192356',
+ 'ar_minor_edit' => '0',
+ 'ar_deleted' => '0',
+ 'ar_len' => '78',
+ 'ar_parent_id' => '0',
+ 'ar_sha1' => 'deadbeef',
+ 'ar_comment_text' => 'whatever',
+ 'ar_comment_data' => null,
+ 'ar_comment_cid' => null,
+ 'ar_user' => '0',
+ 'ar_user_text' => '', // this is the important bit
+ 'ar_actor' => null,
+ 'ar_content_format' => null,
+ 'ar_content_model' => null,
+ ];
+
+ \Wikimedia\suppressWarnings();
+ $record = $store->newRevisionFromArchiveRow( $row );
+ \Wikimedia\suppressWarnings( true );
+
+ $this->assertInstanceOf( RevisionRecord::class, $record );
+ $this->assertInstanceOf( UserIdentityValue::class, $record->getUser() );
+ $this->assertSame( 'Unknown user', $record->getUser()->getName() );
+ }
+
+ /**
+ * @covers \MediaWiki\Storage\RevisionStore::newRevisionFromRow
+ */
+ public function testNewRevisionFromRow_no_user() {
+ $store = MediaWikiServices::getInstance()->getRevisionStore();
+ $title = Title::newFromText( __METHOD__ );
+
+ $row = (object)[
+ 'rev_id' => '2',
+ 'rev_page' => '2',
+ 'page_namespace' => '0',
+ 'page_title' => $title->getText(),
+ 'rev_text_id' => '47',
+ 'rev_timestamp' => '20180528192356',
+ 'rev_minor_edit' => '0',
+ 'rev_deleted' => '0',
+ 'rev_len' => '78',
+ 'rev_parent_id' => '0',
+ 'rev_sha1' => 'deadbeef',
+ 'rev_comment_text' => 'whatever',
+ 'rev_comment_data' => null,
+ 'rev_comment_cid' => null,
+ 'rev_user' => '0',
+ 'rev_user_text' => '', // this is the important bit
+ 'rev_actor' => null,
+ 'rev_content_format' => null,
+ 'rev_content_model' => null,
+ ];
+
+ \Wikimedia\suppressWarnings();
+ $record = $store->newRevisionFromRow( $row, 0, $title );
+ \Wikimedia\suppressWarnings( true );
+
+ $this->assertNotNull( $record );
+ $this->assertNotNull( $record->getUser() );
+ $this->assertNotEmpty( $record->getUser()->getName() );
+ }
+
+ /**
* @covers \MediaWiki\Storage\RevisionStore::insertRevisionOn
*/
public function testInsertRevisionOn_archive() {
/**
* @group API
* @group medium
+ * @group Database
*
* @covers ApiQueryPrefixSearch
*/
/**
* @group API
* @group medium
+ * @group Database
*
* @covers ApiQuerySiteinfo
*/
<?php
use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\SlotRenderingProvider;
/**
* @group ContentHandler
$this->assertArrayHasKey( 'file_text', $data );
$this->assertEquals( 'This is file content', $data['file_text'] );
}
+
+ public function testGetSecondaryDataUpdates() {
+ $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
+ $content = new WikitextContent( '' );
+
+ /** @var SlotRenderingProvider $srp */
+ $srp = $this->getMock( SlotRenderingProvider::class );
+
+ $handler = new WikitextContentHandler();
+ $updates = $handler->getSecondaryDataUpdates( $title, $content, 'main', $srp );
+
+ $this->assertEquals( [], $updates );
+ }
+
+ public function testGetDeletionUpdates() {
+ $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
+ $content = new WikitextContent( '' );
+
+ $srp = $this->getMock( SlotRenderingProvider::class );
+
+ $handler = new WikitextContentHandler();
+ $updates = $handler->getDeletionUpdates( $title, 'main' );
+
+ $this->assertEquals( [], $updates );
+ }
+
}
'email' => 'chad@wikimedia.org',
],
],
- 'description' => 'Constant Database (CDB) wrapper library for PHP. '.
+ 'description' => 'Constant Database (CDB) wrapper library for PHP. ' .
'Provides pure-PHP fallback when dba_* functions are absent.',
],
'cssjanus/cssjanus' => [
// Query added
$this->assertEquals(
- '<a href="/w/index.php?title=Foobar&foo=bar" '. 'title="Foobar">Foobar</a>',
+ '<a href="/w/index.php?title=Foobar&foo=bar" ' . 'title="Foobar">Foobar</a>',
$linkRenderer->makeKnownLink( $target, null, [], [ 'foo' => 'bar' ] )
);
],
[
[ 'Software' => [ 'x-default' => 'paint.net 4.0.12', '_type' => 'lang' ] ],
- [ 'Software' => '<ul class="metadata-langlist">'.
- '<li class="mw-metadata-lang-default">'.
- '<span class="mw-metadata-lang-value">paint.net 4.0.12</span>'.
- "</li>\n".
+ [ 'Software' => '<ul class="metadata-langlist">' .
+ '<li class="mw-metadata-lang-default">' .
+ '<span class="mw-metadata-lang-value">paint.net 4.0.12</span>' .
+ "</li>\n" .
'</ul>'
],
],
use MediaWiki\Edit\PreparedEdit;
use MediaWiki\MediaWikiServices;
use MediaWiki\Storage\RevisionSlotsUpdate;
+use PHPUnit\Framework\MockObject\MockObject;
use Wikimedia\TestingAccessWrapper;
/**
/**
* @param string|Title|WikiPage $page
- * @param string $text
+ * @param string|Content|Content[] $content
* @param int|null $model
*
* @return WikiPage
*/
- protected function createPage( $page, $text, $model = null, $user = null ) {
+ protected function createPage( $page, $content, $model = null, $user = null ) {
if ( is_string( $page ) || $page instanceof Title ) {
$page = $this->newPage( $page, $model );
}
- $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
- $page->doEditContent( $content, "testing", EDIT_NEW, false, $user );
+ if ( !$user ) {
+ $user = $this->getTestUser()->getUser();
+ }
+
+ if ( is_string( $content ) ) {
+ $content = ContentHandler::makeContent( $content, $page->getTitle(), $model );
+ }
+
+ if ( !is_array( $content ) ) {
+ $content = [ 'main' => $content ];
+ }
+
+ $updater = $page->newPageUpdater( $user );
+
+ foreach ( $content as $role => $cnt ) {
+ $updater->setContent( $role, $cnt );
+ }
+
+ $updater->saveRevision( CommentStoreComment::newUnsavedComment( "testing" ) );
return $page;
}
* @covers WikiPage::doDeleteUpdates
*/
public function testDoDeleteUpdates() {
+ $user = $this->getTestUser()->getUser();
$page = $this->createPage(
__METHOD__,
"[[original text]] foo",
CONTENT_MODEL_WIKITEXT
);
$id = $page->getId();
+ $page->loadPageData(); // make sure the current revision is cached.
// Similar to MovePage logic
wfGetDB( DB_MASTER )->delete( 'page', [ 'page_id' => $id ], __METHOD__ );
- $page->doDeleteUpdates( $id );
+ $page->doDeleteUpdates( $page->getId(), $page->getContent(), $page->getRevision(), $user );
// Run the job queue
JobQueueGroup::destroySingletons();
$this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
}
+ /**
+ * @param string $name
+ *
+ * @return ContentHandler
+ */
+ protected function defineMockContentModelForUpdateTesting( $name ) {
+ /** @var ContentHandler|MockObject $handler */
+ $handler = $this->getMockBuilder( TextContentHandler::class )
+ ->setConstructorArgs( [ $name ] )
+ ->setMethods(
+ [ 'getSecondaryDataUpdates', 'getDeletionUpdates', 'unserializeContent' ]
+ )
+ ->getMock();
+
+ $dataUpdate = new MWCallableUpdate( 'time' );
+ $dataUpdate->_name = "$name data update";
+
+ $deletionUpdate = new MWCallableUpdate( 'time' );
+ $deletionUpdate->_name = "$name deletion update";
+
+ $handler->method( 'getSecondaryDataUpdates' )->willReturn( [ $dataUpdate ] );
+ $handler->method( 'getDeletionUpdates' )->willReturn( [ $deletionUpdate ] );
+ $handler->method( 'unserializeContent' )->willReturnCallback(
+ function ( $text ) use ( $handler ) {
+ return $this->createMockContent( $handler, $text );
+ }
+ );
+
+ $this->mergeMwGlobalArrayValue(
+ 'wgContentHandlers', [
+ $name => function () use ( $handler ){
+ return $handler;
+ }
+ ]
+ );
+
+ return $handler;
+ }
+
+ /**
+ * @param ContentHandler $handler
+ * @param string $text
+ *
+ * @return Content
+ */
+ protected function createMockContent( ContentHandler $handler, $text ) {
+ /** @var Content|MockObject $content */
+ $content = $this->getMockBuilder( TextContent::class )
+ ->setConstructorArgs( [ $text ] )
+ ->setMethods( [ 'getModel', 'getContentHandler' ] )
+ ->getMock();
+
+ $content->method( 'getModel' )->willReturn( $handler->getModelID() );
+ $content->method( 'getContentHandler' )->willReturn( $handler );
+
+ return $content;
+ }
+
+ public function testGetDeletionUpdates() {
+ $m1 = $this->defineMockContentModelForUpdateTesting( 'M1' );
+
+ $mainContent1 = $this->createMockContent( $m1, 'main 1' );
+
+ $page = new WikiPage( Title::newFromText( __METHOD__ ) );
+ $page = $this->createPage(
+ $page,
+ [ 'main' => $mainContent1 ]
+ );
+
+ $dataUpdates = $page->getDeletionUpdates( $page->getRevisionRecord() );
+ $this->assertNotEmpty( $dataUpdates );
+
+ $updateNames = array_map( function ( $du ) {
+ return isset( $du->_name ) ? $du->_name : get_class( $du );
+ }, $dataUpdates );
+
+ $this->assertContains( LinksDeletionUpdate::class, $updateNames );
+ $this->assertContains( 'M1 deletion update', $updateNames );
+ }
+
/**
* @covers WikiPage::getRevision
*/
return true;
}
+ public function testGetDeletionUpdates() {
+ $m1 = $this->defineMockContentModelForUpdateTesting( 'M1' );
+ $a1 = $this->defineMockContentModelForUpdateTesting( 'A1' );
+
+ $mainContent1 = $this->createMockContent( $m1, 'main 1' );
+ $auxContent1 = $this->createMockContent( $a1, 'aux 1' );
+
+ $page = new WikiPage( Title::newFromText( __METHOD__ ) );
+ $page = $this->createPage(
+ $page,
+ [ 'main' => $mainContent1, 'aux' => $auxContent1 ]
+ );
+
+ $dataUpdates = $page->getDeletionUpdates( $page->getRevisionRecord() );
+ $this->assertNotEmpty( $dataUpdates );
+
+ $updateNames = array_map( function ( $du ) {
+ return isset( $du->_name ) ? $du->_name : get_class( $du );
+ }, $dataUpdates );
+
+ $this->assertContains( LinksDeletionUpdate::class, $updateNames );
+ $this->assertContains( 'M1 deletion update', $updateNames );
+ $this->assertContains( 'A1 deletion update', $updateNames );
+ }
+
}
return false;
}
+ public function testGetDeletionUpdates() {
+ $mainContent1 = new WikitextContent( '' );
+
+ $title = Title::makeTitle( $this->getDefaultWikitextNS(), __METHOD__ );
+ $page = new WikiPage( $title );
+ $page = $this->createPage(
+ $page,
+ [ 'main' => $mainContent1 ]
+ );
+
+ $dataUpdates = $page->getDeletionUpdates( $page->getRevisionRecord() );
+ $this->assertNotEmpty( $dataUpdates );
+
+ $updateNames = array_map( function ( $du ) {
+ return isset( $du->_name ) ? $du->_name : get_class( $du );
+ }, $dataUpdates );
+
+ $this->assertContains( LinksDeletionUpdate::class, $updateNames );
+ }
+
}
/**
* @covers PoolWorkArticleView
+ * @group Database
*/
class PoolWorkArticleViewTest extends MediaWikiTestCase {
. 'mw.config.set({"key":"value"});'
. 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.styles.deprecated":"ready","test.scripts":"loading"});'
. 'mw.loader.implement("test.private@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
- . 'mw.loader.load(["test"]);'
+ . 'RLPAGEMODULES=["test"];mw.loader.load(RLPAGEMODULES);'
. 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts\u0026only=scripts\u0026skin=fallback");'
. '});</script>' . "\n"
. '<link rel="stylesheet" href="/w/load.php?debug=false&lang=nl&modules=test.styles.deprecated%2Cpure&only=styles&skin=fallback"/>' . "\n"
);
$this->assertEquals(
- 'mw.loader.register( "test.name", "1234567" );',
- ResourceLoader::makeLoaderRegisterScript(
- 'test.name',
- '1234567'
- ),
- 'Variadic parameters'
+ 'mw.loader.register( [
+ [
+ "test.foo",
+ "100"
+ ],
+ [
+ "test.bar",
+ "200",
+ [
+ "test.unknown"
+ ]
+ ],
+ [
+ "test.baz",
+ "300",
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ "test.quux",
+ "400",
+ [],
+ null,
+ null,
+ "return true;"
+ ]
+] );',
+ ResourceLoader::makeLoaderRegisterScript( [
+ [ 'test.foo', '100' , [], null, null ],
+ [ 'test.bar', '200', [ 'test.unknown' ], null ],
+ [ 'test.baz', '300', [ 'test.quux', 'test.foo' ], null ],
+ [ 'test.quux', '400', [], null, null, 'return true;' ],
+ ] ),
+ 'Compact dependency indexes'
);
}
// Set up objects
$module = $this->getMockBuilder( TestResourceLoaderWikiModule::class )
- ->setMethods( [ 'getPages' ] ) ->getMock();
+ ->setMethods( [ 'getPages' ] )->getMock();
$module->method( 'getPages' )->willReturn( $pages );
$module::$returnFetchTitleInfo = $titleInfo;
$rl = new EmptyResourceLoader();
public function testGetContent( $expected, $title ) {
$context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
$module = $this->getMockBuilder( ResourceLoaderWikiModule::class )
- ->setMethods( [ 'getContentObj' ] ) ->getMock();
+ ->setMethods( [ 'getContentObj' ] )->getMock();
$module->expects( $this->any() )
->method( 'getContentObj' )->willReturn( null );
],
[
'method' => 'GET',
- 'userAgent' => Http::userAgent() ." SparqlClient",
+ 'userAgent' => Http::userAgent() . " SparqlClient",
'timeout' => 30
]
],
--- /dev/null
+<?php
+
+/**
+ * Test class for SpecialRedirect class
+ *
+ * @since 1.32
+ *
+ * @license GPL-2.0-or-later
+ * @group Database
+ */
+class SpecialRedirectTest extends MediaWikiTestCase {
+
+ protected $tablesUsed = [ 'user' ];
+
+ const CREATE_USER = 'create_user';
+
+ /**
+ * @dataProvider provideDispatch
+ * @covers SpecialRedirect::dispatchUser()
+ * @covers SpecialRedirect::dispatchFile()
+ * @covers SpecialRedirect::dispatchRevision()
+ * @covers SpecialRedirect::dispatchPage()
+ * @covers SpecialRedirect::dispatchLog()
+ */
+ public function testDispatch( $method, $type, $value, $expectedStatus ) {
+ $page = new SpecialRedirect();
+
+ // setup the user object
+ if ( $value === self::CREATE_USER ) {
+ $user = User::newFromName( __CLASS__ );
+ $user->addToDatabase();
+ $value = $user->getId();
+ }
+
+ $page->setParameter( $type . '/' . $value );
+
+ $status = $page->$method();
+ $this->assertSame(
+ $status->isGood(), $expectedStatus === 'good',
+ $method . ' does not return expected status "' . $expectedStatus . '"'
+ );
+ }
+
+ public static function provideDispatch() {
+ foreach ( [
+ [ 'nonumeric', 'fatal' ],
+ [ '3', 'fatal' ],
+ [ self::CREATE_USER, 'good' ],
+ ] as $dispatchUser ) {
+ yield [ 'dispatchUser', 'user', $dispatchUser[0], $dispatchUser[1] ];
+ }
+ foreach ( [
+ [ 'bad<name', 'fatal' ],
+ [ 'File:Non-exists.jpg', 'fatal' ],
+ // TODO Cannot test the good path here, because a file must exists
+ ] as $dispatchFile ) {
+ yield [ 'dispatchFile', 'file', $dispatchFile[0], $dispatchFile[1] ];
+ }
+ foreach ( [
+ [ 'nonumeric', 'fatal' ],
+ [ '0', 'fatal' ],
+ [ '1', 'good' ],
+ ] as $dispatch ) {
+ yield [ 'dispatchRevision', 'revision', $dispatch[0], $dispatch[1] ];
+ yield [ 'dispatchPage', 'revision', $dispatch[0], $dispatch[1] ];
+ yield [ 'dispatchLog', 'log', $dispatch[0], $dispatch[1] ];
+ }
+ }
+
+}
"(wl_notificationtimestamp >= 'TS111TS') OR (wl_notificationtimestamp IS NULL)" .
'))))' .
') OR ((wl_namespace = 1) AND (' .
- "(((wl_title = 'AnotherDbKey') AND (".
+ "(((wl_title = 'AnotherDbKey') AND (" .
"(wl_notificationtimestamp >= 'TS123TS') OR (wl_notificationtimestamp IS NULL)" .
')))))';
$mockDb->expects( $this->once() )
"(wl_notificationtimestamp >= 'TS111TS') OR (wl_notificationtimestamp IS NULL)" .
'))))' .
') OR ((wl_namespace = 1) AND (' .
- "(((wl_title = 'AnotherDbKey') AND (".
+ "(((wl_title = 'AnotherDbKey') AND (" .
"(wl_notificationtimestamp >= 'TS123TS') OR (wl_notificationtimestamp IS NULL)" .
'))))' .
') OR ' .
* @coversNothing
*/
public function testUnitTestFileNamesEndWithTest() {
- if ( wfIsWindows() ) {
- $this->markTestSkipped( 'This test does not work on Windows' );
- }
- $rootPath = escapeshellarg( __DIR__ . '/..' );
+ // realpath() also normalizes directory separator on windows for prefix compares
+ $rootPath = realpath( __DIR__ . '/..' );
+ $suitesPath = realpath( __DIR__ . '/../suites/' );
$testClassRegex = implode( '|', [
'ApiFormatTestBase',
'ApiTestCase',
'\\?PHPUnit\\Framework\\TestCase',
'TestCase', // \PHPUnit\Framework\TestCase with appropriate use statement
'DumpTestCase',
+ 'SpecialPageTestBase',
] );
- $testClassRegex = "^class .* extends ($testClassRegex)";
- $finder = "find $rootPath -name '*.php' '!' -name '*Test.php'" .
- " | xargs grep -El '$testClassRegex|function suite\('";
-
- $results = null;
- $exitCode = null;
- exec( $finder, $results, $exitCode );
+ $testClassRegex = "/^class .* extends ($testClassRegex)/m";
- $this->assertEquals(
- 0,
- $exitCode,
- 'Verify find/grep command succeeds.'
- );
+ $results = $this->recurseFiles( $rootPath );
$results = array_filter(
$results,
- [ $this, 'filterSuites' ]
+ function ( $filename ) use ( $testClassRegex, $suitesPath ) {
+ // Remove testUnitTestFileNamesEndWithTest false positives
+ if ( strpos( $filename, $suitesPath ) === 0
+ || substr( $filename, -8 ) === 'Test.php'
+ ) {
+ return false;
+ }
+ $contents = file_get_contents( $filename );
+ return preg_match( $testClassRegex, $contents );
+ }
);
- $strip = strlen( $rootPath ) - 1;
+ $strip = strlen( $rootPath ) + 1;
foreach ( $results as $k => $v ) {
$results[$k] = substr( $v, $strip );
}
);
}
- /**
- * Filter to remove testUnitTestFileNamesEndWithTest false positives.
- * @param string $filename
- * @return bool
- */
- public function filterSuites( $filename ) {
- return strpos( $filename, __DIR__ . '/../suites/' ) !== 0;
+ private function recurseFiles( $dir ) {
+ return ( new File_Iterator_Facade() )->getFilesAsArray( $dir, [ '.php' ] );
}
}
-mediaWiki.loader.testCallback();
+mw.loader.testCallback();
/* global sinon */
-( function ( $, mw, QUnit ) {
+( function () {
'use strict';
var addons, nested;
} );
} );
-}( jQuery, mediaWiki, QUnit ) );
+}() );
-( function ( $ ) {
+( function () {
var getAccessKeyPrefixTestData, updateTooltipAccessKeysTestData;
QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
$.fn.updateTooltipAccessKeys.setTestMode( false );
} );
-}( jQuery ) );
+}() );
-( function ( $ ) {
+( function () {
QUnit.module( 'jquery.color', QUnit.newMwEnvironment() );
QUnit.test( 'animate', function ( assert ) {
} )
.always( done );
} );
-}( jQuery ) );
+}() );
-( function ( $ ) {
+( function () {
QUnit.module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
QUnit.test( 'getRGB', function ( assert ) {
b = $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
assert.strictEqual( b, 'rgb(118,29,29)', 'Start with rgb string "rgb(200,50,50)", darken 20%' );
} );
-}( jQuery ) );
+}() );
-( function ( $ ) {
+( function () {
QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
QUnit.test( 'getAttrs()', function ( assert ) {
assert.propEqual( $el.getAttrs(), attrs, 'keys and values match' );
} );
-}( jQuery ) );
+}() );
-( function ( $ ) {
+( function () {
QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
QUnit.test( 'devicePixelRatio', function ( assert ) {
assert.strictEqual( $.matchSrcSet( 1.75, srcset ), 'onefive.png', '1.75 gives match to 1.5' );
assert.strictEqual( $.matchSrcSet( 2.25, srcset ), 'two.png', '2.25 gives match to 2' );
} );
-}( jQuery ) );
+}() );
-( function ( $ ) {
+( function () {
QUnit.module( 'jquery.highlightText', QUnit.newMwEnvironment() );
QUnit.test( 'Check', function ( assert ) {
);
} );
} );
-}( jQuery ) );
+}() );
-( function ( $, mw ) {
+( function () {
var simpleSample, U_20AC, poop, mbSample;
QUnit.module( 'jquery.lengthLimit', QUnit.newMwEnvironment() );
expected: '\uD800'
} );
-}( jQuery, mediaWiki ) );
+}() );
-( function ( $, mw ) {
+( function () {
QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
QUnit.test( 'Handle basic replacements', function ( assert ) {
assert.strictEqual( $lc.length, 1, 'link is created' );
assert.strictEqual( $lc.text(), 'link', 'the link text got added' );
} );
-}( jQuery, mediaWiki ) );
+}() );
-( function ( $ ) {
+( function () {
var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment() );
assert.assertFalse( $collapsible2.find( '> .mw-collapsible-toggle' ).hasClass( 'mw-collapsible-toggle-collapsed' ) );
} ).find( '> .mw-collapsible-toggle a' ).trigger( 'click' );
} );
-}( jQuery ) );
+}() );
-( function ( $ ) {
+( function () {
QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
QUnit.test( 'firstTabIndex', function ( assert ) {
$testB = $( '<div>' );
assert.strictEqual( $testB.lastTabIndex(), null, 'Return null if none available.' );
} );
-}( jQuery ) );
+}() );
-( function ( $, mw ) {
+( function () {
/**
* This module tests the input/output capabilities of the parsers of tablesorter.
* It does not test actual sorting.
// TODO add numbers sorting tests for T10115 with a different language
-}( jQuery, mediaWiki ) );
+}() );
-( function ( $, mw ) {
+( function () {
var header = [ 'Planet', 'Radius (km)' ],
// Data set "planets"
);
} );
-}( jQuery, mediaWiki ) );
+}() );
-( function ( $ ) {
+( function () {
var caretSample,
sig = {
pre: '--~~~~'
end: 11,
mode: 'set'
} );
-}( jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.ForeignApi', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
return api.post( {} );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.api.category', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
} );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
QUnit.module( 'mediawiki.api.edit', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.api.messages', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
);
} );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.api.options', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
} )
);
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
assert.strictEqual( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object' );
} );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
var self = this,
requests = this.requests = [];
this.api = new mw.Api();
- this.sandbox.stub( jQuery, 'ajax', function () {
+ this.sandbox.stub( $, 'ajax', function () {
var request = $.extend( {
abort: self.sandbox.spy()
}, $.Deferred() );
assert.ok( request.abort.calledOnce, 'abort request number ' + i );
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
QUnit.module( 'mediawiki.api.upload', QUnit.newMwEnvironment( {} ) );
QUnit.test( 'Basic functionality', function ( assert ) {
assert.strictEqual( $input.val(), 'Testing API upload.jpg', 'input value' );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.api.watch', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
} );
} );
-}( mediaWiki ) );
+}() );
/* eslint-disable camelcase */
/* eslint no-underscore-dangle: "off" */
-( function ( mw, $ ) {
+( function () {
var mockFilterStructure = [ {
name: 'group1',
title: 'Group 1',
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
/* eslint-disable camelcase */
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.rcfilters - FilterItem' );
QUnit.test( 'Initializing filter item', function ( assert ) {
assert.strictEqual( item.getValue(), '1', 'Value is kept as-is' );
} );
-}( mediaWiki ) );
+}() );
/* eslint-disable camelcase */
-( function ( mw, $ ) {
+( function () {
var filterDefinition = [ {
name: 'group1',
type: 'send_unselected_if_any',
} );
assert.strictEqual( model.areVisibleFiltersEmpty(), false );
} );
-}( mediaWiki, jQuery ) );
+}() );
/* eslint-disable camelcase */
-( function ( mw ) {
+( function () {
var filterDefinition = [ {
name: 'group1',
type: 'send_unselected_if_any',
'Invert parameter saved if there are namespaces.'
);
} );
-}( mediaWiki ) );
+}() );
/* eslint-disable camelcase */
-( function ( mw ) {
+( function () {
var itemData = {
params: {
param1: '1',
'Default state represented when item initialized with default:true.'
);
} );
-}( mediaWiki ) );
+}() );
-( function ( $ ) {
+( function () {
QUnit.module( 'mediawiki.special.recentchanges', QUnit.newMwEnvironment() );
// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
// DOM cleanup
$env.remove();
} );
-}( jQuery ) );
+}() );
QUnit.module( 'mediawiki.widgets.APIResultsQueue' );
-( function ( $, mw ) {
+( function () {
var itemCounter, FullResourceProvider, EmptyResourceProvider, SingleResultResourceProvider;
itemCounter = 0;
// Finish the async test
.then( done );
} );
-}( jQuery, mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.RegExp' );
QUnit.test( 'escape', function ( assert ) {
assert.strictEqual( mw.RegExp.escape( normal ), normal, 'Alphanumerals are left alone' );
} );
-}( mediaWiki ) );
+}() );
-( function ( $, mw ) {
+( function () {
var simpleSample, U_20AC, poop, mbSample,
trimByteLength = require( 'mediawiki.String' ).trimByteLength;
expected: '\uD800'
} );
-}( jQuery, mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/* eslint-disable camelcase */
var repeat = function ( input, multiplier ) {
return new Array( multiplier + 1 ).join( input );
assert.strictEqual( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
} );
+ QUnit.test( 'isTalkPage/getTalkPage/getSubjectPage', function ( assert ) {
+ var title;
+
+ title = new mw.Title( 'User:Foo' );
+ assert.strictEqual( title.isTalkPage(), false, 'Non-talk page detected as such' );
+ assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'User:Foo', 'getSubjectPage on a subject page is a no-op' );
+
+ title = title.getTalkPage();
+ assert.strictEqual( title.getPrefixedText(), 'User talk:Foo', 'getTalkPage creates correct title' );
+ assert.strictEqual( title.getTalkPage().getPrefixedText(), 'User talk:Foo', 'getTalkPage on a talk page is a no-op' );
+ assert.strictEqual( title.isTalkPage(), true, 'Talk page is detected as such' );
+
+ title = title.getSubjectPage();
+ assert.strictEqual( title.getPrefixedText(), 'User:Foo', 'getSubjectPage creates correct title' );
+
+ title = new mw.Title( 'Special:AllPages' );
+ assert.strictEqual( title.isTalkPage(), false, 'Special page is not a talk page' );
+ assert.strictEqual( title.getTalkPage(), null, 'getTalkPage not valid for this namespace' );
+ assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'Special:AllPages', 'getSubjectPage is self for special pages' );
+
+ title = new mw.Title( 'Category:Project:Maintenance' );
+ assert.strictEqual( title.getTalkPage().getPrefixedText(), 'Category talk:Project:Maintenance', 'getTalkPage is not confused by colon in main text' );
+ title = new mw.Title( 'Category talk:Project:Maintenance' );
+ assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'Category:Project:Maintenance', 'getSubjectPage is not confused by colon in main text' );
+
+ title = new mw.Title( 'Foo#Caption' );
+ assert.strictEqual( title.getFragment(), 'Caption', 'Subject page has a fragment' );
+ title = title.getTalkPage();
+ assert.strictEqual( title.getPrefixedText(), 'Talk:Foo', 'getTalkPage creates correct title' );
+ assert.strictEqual( title.getFragment(), null, 'getTalkPage does not copy the fragment' );
+ } );
+
QUnit.test( 'Throw error on invalid title', function ( assert ) {
assert.throws( function () {
return new mw.Title( '' );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.Uri', QUnit.newMwEnvironment( {
setup: function () {
this.mwUriOrg = mw.Uri;
href = uri.toString();
assert.strictEqual( href, testProtocol + testServer + ':' + testPort + testPath, 'Root-relative URL gets host, protocol, and port supplied' );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.base' );
QUnit.test( 'mw.hook - basic', function ( assert ) {
} ] );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
var pluralTestcases = {
/*
* Sample:
pluralTest( langCode, tests );
}
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
var NOW = 9012, // miliseconds
DEFAULT_DURATION = 5678, // seconds
assert.strictEqual( key, 'barfoo' );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.errorLogger', QUnit.newMwEnvironment() );
QUnit.test( 'installGlobalHandler', function ( assert ) {
assert.strictEqual( w.onerror( errorMessage, errorUrl, errorLine ), true,
'Global handler preserves true return from previous handler' );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
var getBucket = mw.experiments.getBucket;
);
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.html' );
QUnit.test( 'escape', function ( assert ) {
);
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.inspect' );
);
} );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
/* eslint-disable camelcase */
var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers,
expectedListUsersSitename, expectedLinkPagenamee, expectedEntrypoints,
assert.strictEqual( logSpy.callCount, 2, 'mw.log.warn calls' );
} );
+ QUnit.test( 'Non-string parameters to various functions', function ( assert ) {
+ var i, cases;
+
+ // For jquery-param-int
+ mw.messages.set( 'x', 'y' );
+ // For jquery-param-grammar
+ mw.language.setData( 'en', 'grammarTransformations', {
+ test: [
+ [ 'x', 'y' ]
+ ]
+ } );
+
+ cases = [
+ {
+ key: 'jquery-param-wikilink',
+ msg: '[[$1]] [[$1|a]]',
+ expected: '<a title="x" href="/wiki/x">x</a> <a title="x" href="/wiki/x">a</a>'
+ },
+ {
+ key: 'jquery-param-plural',
+ msg: '{{PLURAL:$1|a|b}}',
+ expected: 'b'
+ },
+ {
+ key: 'jquery-param-gender',
+ msg: '{{GENDER:$1|a|b}}',
+ expected: 'a'
+ },
+ {
+ key: 'jquery-param-grammar',
+ msg: '{{GRAMMAR:test|$1}}',
+ expected: '<b>x</b>'
+ },
+ {
+ key: 'jquery-param-int',
+ msg: '{{int:$1}}',
+ expected: 'y'
+ },
+ {
+ key: 'jquery-param-ns',
+ msg: '{{ns:$1}}',
+ expected: ''
+ },
+ {
+ key: 'jquery-param-formatnum',
+ msg: '{{formatnum:$1}}',
+ expected: '<b>x</b>'
+ },
+ {
+ key: 'jquery-param-case',
+ msg: '{{lc:$1}} {{uc:$1}} {{lcfirst:$1}} {{ucfirst:$1}}',
+ expected: 'x X x X'
+ }
+ ];
+
+ for ( i = 0; i < cases.length; i++ ) {
+ mw.messages.set( cases[ i ].key, cases[ i ].msg );
+ assert.strictEqual(
+ mw.message( cases[ i ].key, $( '<b>' ).text( 'x' ) ).parse(),
+ cases[ i ].expected,
+ cases[ i ].key
+ );
+ }
+ } );
+
QUnit.test( 'Integration', function ( assert ) {
var expected, msg;
'setParserDefaults is deep if requested'
);
} );
-}( mediaWiki, jQuery ) );
+}() );
* Some misc JavaScript compatibility tests,
* just to make sure the environments we run in are consistent.
*/
-( function ( $ ) {
+( function () {
QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
QUnit.test( 'Variable with Unicode letter in name', function ( assert ) {
assert.strictEqual( $textarea.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')' );
}
} );
-}( jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
'use strict';
var grammarTests, bcp47Tests;
assert.strictEqual( mw.language.bcp47( input ), expected );
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
QUnit.module( 'mediawiki.loader', QUnit.newMwEnvironment( {
setup: function ( assert ) {
// Expose for load.mock.php
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
var TEST_MODEL = 'test-content-model';
QUnit.module( 'mediawiki.messagePoster', QUnit.newMwEnvironment( {
'Throws exception is same model is registered a second time'
);
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.requestIdleCallback', QUnit.newMwEnvironment( {
setup: function () {
var clock = this.clock = this.sandbox.useFakeTimers();
} );
}
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.storage' );
QUnit.test( 'set/get with storage support', function ( assert ) {
mw.storage.store = old;
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.template.mustache', {
beforeEach: function () {
assert.strictEqual( htmlPartial, 'Hello goodbye', 'Render with partial' );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.template', {
beforeEach: function () {
);
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
var specialCharactersPageName,
// Can't mock SITENAME since jqueryMsg caches it at load
siteName = mw.config.get( 'wgSiteName' );
assert.strictEqual( mw.msg( 'int-msg' ), 'Some Other Message', 'int is resolved' );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
QUnit.module( 'mediawiki.toc', QUnit.newMwEnvironment( {
setup: function () {
// Prevent live cookies from interferring with the test
return $tocList.promise();
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.track' );
QUnit.test( 'track', function ( assert ) {
[ 'unsub', { key: 2 } ]
], 'Stop when unsubscribing' );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment( {
setup: function () {
this.server = this.sandbox.useFakeServer();
assert.strictEqual( result.trim(), result, 'no leading or trailing whitespace' );
assert.strictEqual( result2, result, 'retained' );
} );
-}( mediaWiki ) );
+}() );
-( function ( mw, $ ) {
+( function () {
var util = require( 'mediawiki.util' ),
// Based on IPTest.php > testisIPv4
IPV4_CASES = [
} );
QUnit.test( '$content', function ( assert ) {
- assert.ok( util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
+ assert.ok( util.$content instanceof $, 'mw.util.$content instance of jQuery' );
assert.strictEqual( util.$content.length, 1, 'mw.util.$content must have length of 1' );
} );
* one element can have a given id.
*/
QUnit.test( 'addPortletLink', function ( assert ) {
- var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
+ var tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
- pTestTb =
+ $( '#qunit-fixture' ).append(
'<div class="portlet" id="p-test-tb">' +
'<h3>Toolbox</h3>' +
'<ul class="body"></ul>' +
- '</div>';
- pCustom =
+ '</div>' +
'<div class="portlet" id="p-test-custom">' +
'<h3>Views</h3>' +
'<ul class="body">' +
'</ul>' +
'</li>' +
'</ul>' +
- '</div>';
- vectorTabs =
+ '</div>' +
'<div id="p-test-views" class="vectorTabs">' +
'<h3>Views</h3>' +
'<ul></ul>' +
- '</div>';
-
- $( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
-
- tbRL = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
- 'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l'
+ '</div>'
);
- assert.ok( tbRL && tbRL.nodeType, 'addPortletLink returns a DOM Node' );
+ tbRL = util.addPortletLink( 'p-test-tb', 'https://example.org/next',
+ 'Next', 't-rl', 'More info about Example Next ', 'l'
+ );
+ assert.strictEqual( tbRL.nodeType, 1, 'returns a DOM Node' );
+ assert.strictEqual( tbRL.nodeName, 'LI', 'returns a list item element' );
- tbMW = util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
- 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org', 'm', tbRL );
+ tbMW = util.addPortletLink( 'p-test-tb', '//example.org/',
+ 'Example.org', 't-xmp', 'Go to Example', 'x', tbRL );
$tbMW = $( tbMW );
-
assert.propEqual(
$tbMW.getAttrs(),
{
- id: 't-mworg'
+ id: 't-xmp'
},
- 'Validate attributes of created element'
+ 'List item attributes'
);
-
assert.propEqual(
$tbMW.find( 'a' ).getAttrs(),
{
- href: '//mediawiki.org/',
- title: 'Go to MediaWiki.org [test-m]',
- accesskey: 'm'
+ href: '//example.org/',
+ title: 'Go to Example [test-x]',
+ accesskey: 'x'
},
- 'Validate attributes of anchor tag in created element'
+ 'Anchor link attributes'
+ );
+ assert.strictEqual(
+ $tbMW.closest( '.portlet' ).attr( 'id' ),
+ 'p-test-tb',
+ 'Parent portlet ID'
+ );
+ assert.strictEqual(
+ $tbMW.next()[ 0 ],
+ tbRL,
+ 'Next node (set as Node object)'
+ );
+ assert.strictEqual(
+ $tbMW.find( 'span' ).length,
+ 0,
+ 'No <span> wrap for porlets without vectorTabs class'
);
-
- assert.strictEqual( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
- assert.strictEqual( $tbMW.next()[ 0 ], tbRL, 'Link is in the correct position (nextnode as Node object)' );
cuQuux = util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
$cuQuux = $( cuQuux );
-
- assert.strictEqual( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [test-q]', 'Existing accesskey is stripped and updated' );
-
+ assert.strictEqual(
+ $cuQuux.find( 'a' ).attr( 'title' ),
+ 'Example [test-q]',
+ 'Title has new accesskey and label'
+ );
assert.strictEqual(
$( '#p-test-custom #c-barmenu ul li' ).length,
1,
- 'addPortletLink did not add the item to all <ul> elements in the portlet (T37082)'
+ 'No items added to unrelated <ul> elsewhere in the portlet (T37082)'
);
tbRLDM = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
-
- assert.strictEqual( $( tbRLDM ).next()[ 0 ], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
+ assert.strictEqual( $( tbRLDM ).next()[ 0 ], tbRL, 'Next node (set as CSS selector)' );
caFoo = util.addPortletLink( 'p-test-views', '#', 'Foo' );
-
- assert.strictEqual( $tbMW.find( 'span' ).length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
- assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
+ assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'Added <span> element for porlet with vectorTabs class' );
addedAfter = util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
- assert.strictEqual( $( addedAfter ).next()[ 0 ], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
+ assert.strictEqual( $( addedAfter ).next()[ 0 ], tbRL, 'Next node (set as jQuery object)' );
- // test case - nonexistent id as next node
tbRLDMnonexistentid = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
+ assert.strictEqual(
+ tbRLDMnonexistentid,
+ $( '#p-test-tb li:last' )[ 0 ],
+ 'Next node as non-matching CSS selector falls back to appending'
+ );
- assert.strictEqual( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
-
- // test case - empty jquery object as next node
tbRLDMemptyjquery = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
-
- assert.strictEqual( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
+ assert.strictEqual(
+ tbRLDMemptyjquery,
+ $( '#p-test-tb li:last' )[ 0 ],
+ 'Next node as empty jQuery object falls back to appending'
+ );
} );
QUnit.test( 'validateEmail', function ( assert ) {
assert.strictEqual( util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
} );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw, $ ) {
+( function () {
// Simulate square element with 20px long edges placed at (20, 20) on the page
var
'It should default to a threshold of 50px and the window\'s viewport' );
} );
-}( mediaWiki, jQuery ) );
+}() );
-( function ( mw ) {
+( function () {
QUnit.module( 'mediawiki.visibleTimeout', QUnit.newMwEnvironment( {
setup: function () {
this.sandbox.clock.tick( 50 );
assert.strictEqual( called, 1 );
} );
-}( mediaWiki ) );
+}() );