sublime-*
# MediaWiki install & usage
-cache
-images/[0-9a-f]
-images/archive
-images/deleted
-images/lockdir
-images/temp
-images/thumb
+/cache
+/docs/js
+/images/[0-9a-f]
+/images/archive
+/images/deleted
+/images/lockdir
+/images/temp
+/images/thumb
## Extension:EasyTimeline
-images/timeline
-images/tmp
-maintenance/.mweval_history
-maintenance/.mwsql_history
-maintenance/dev/data
-AdminSettings.php
-LocalSettings.php
-StartProfiler.php
+/images/timeline
+/images/tmp
+/maintenance/.mweval_history
+/maintenance/.mwsql_history
+/maintenance/dev/data
+/AdminSettings.php
+/LocalSettings.php
+/StartProfiler.php
# Building & testing
node_modules/
.idea
.metadata*
.settings
-favicon.ico
-static*
-tags
+/favicon.ico
+/static*
+/tags
== Developers ==
* Aaron Schulz
* Alex Z.
+* Alexander Monk
* Alexandre Emsenhuber
* Andrew Garrett
* Arthur Richards
* Agbad
* Ahmad Sherif
* Alejandro Mery
-* Alexander Monk
* Amalthea
* Amir E. Aharoni
* Andrew Dunbar
* (bug 39273) Added AJAX support for "Show changes" (diff) in LivePreview.
* Added ResourceLoader module "jquery.badge".
* mw.util.$content now points to the overall content area in the skin rather than just
- page text content area. If you need the old behaviour please use $( '#mw-content-text').
+ page text content area. If you need the old behavior please use $( '#mw-content-text').
* jsMessage has been replaced with a floating bubble notification system complete
with auto-hide, multi-message support, and message replacement tags.
* jquery.messageBox which appears to be unused by both core and extensions has
* (bug 11142) Improve file extension blacklist error reporting in API upload.
* (bug 39665) List of query generators is now not built using reflection, instead it is
defined in code.
+* (bug 35993) Deprecated gettoken parameter - support will be removed in 1.22.
=== Languages updated in 1.20 ===
* New maintenance script to refresh image metadata (maintenance/refreshImageMetadata.php).
* (bug 16428) Include permalink in printable version.
* (bug 30722) Add an identity collation that sorts things based on what the
- unicode code point is (aka pre-1.17 behaviour).
+ unicode code point is (aka pre-1.17 behavior).
* (bug 30940) Add a hook in User:getDefaultOptions.
To give extensions a better and more flexible way of providing default
values for preferences a hook has been introdiced in User:getDefaultOptions().
make wfTempDir() return a sane value for Windows on worst-case.
* (bug 24824) Support ImageMagick 6.5.6-2+ JPEG decoder size hint, to reduce
memory usage when such an ImageMagick is used for scaling.
-* Disable multithreaded behaviour in recent ImageMagick, to avoid a deadlock
+* Disable multithreaded behavior in recent ImageMagick, to avoid a deadlock
when a resource limit such as $wgMaxShellMemory is hit.
* (bug 24981) Allow extensions to access SpecialUpload variables again.
* (bug 20744) Wiki forgets about an uploaded file.
exist. In that case the URL will get (?|&)wpDestFile=<filename> appended to
it as appropriate.
* If $wgLocaltimezone is null, use the server's timezone as the default for
- signatures. This was always the behaviour documented in DefaultSettings.php
- but has not been the actual behaviour for some time: instead, UTC was used
+ signatures. This was always the behavior documented in DefaultSettings.php
+ but has not been the actual behavior for some time: instead, UTC was used
by default.
* Added $wgExtensionAssetsPath, to decouple assets serving from $wgScriptPath.
If not specified it will default to $wgScriptPath/extensions
* (bug 12644) Template list on edit page now sorted on preview
* (bug 14058) Support pipe trick for namespaces and interwikis with "-"
* Message name filter on Special:Allmessages now case-insensitive
-* (bug 13943) Fix image redirect behaviour on image pages
+* (bug 13943) Fix image redirect behavior on image pages
* (bug 14093) Do 'sysop' => 'protect' magic in Title::isValidMoveOperation
* (bug 14063) Power search form missing <label> for redirects check
* (bug 14111) Similar filename warning links now lead to correct page
to not check and assume they are always up to date)
* The rollback permission can now be rate-limited using the normal mechanism.
* New configuration variable $wgExtraLanguageNames
-* Behaviour of $wgAddGroups and $wgRemoveGroups changed. New behaviour:
+* Behavior of $wgAddGroups and $wgRemoveGroups changed. New behavior:
* * Granting the userrights privilege allows arbitrary changing of rights.
* * Without the userrights privilege, a user will be able to add and/or
remove the groups specified in $wgAddGroups and $wgRemoveGroups for
Message transformation mode has been removed, and replaced with "preprocess"
mode. This means that some MediaWiki namespace messages may need to be updated,
-especially ones which took advantage of the terribly counterintuitive behaviour
+especially ones which took advantage of the terribly counterintuitive behavior
of the former message mode.
The header identification routines for section edit and for numbering section
entry in the TOC, but will not have a section edit link. HTML-style headings
will also not have a section edit link. Valid wikitext headings present in the
template source text will get a template section edit link. This is a major
-break from previous behaviour, but I believe the effects are almost entirely
+break from previous behavior, but I believe the effects are almost entirely
beneficial.
The main motivation for making these changes was performance. The new two-pass
enabled by default.
* Added option to install to MyISAM
* (bug 9250) Remove hardcoded minimum image name length of three characters
-* Fixed DISPLAYTITLE behaviour to reject titles which don't normalise to the
+* Fixed DISPLAYTITLE behavior to reject titles which don't normalise to the
same title as the current page, and enabled per default
* Wrap site CSS and JavaScript in a <pre> tag, like user JS/CSS
* (bug 10196) Add classes and dir="ltr" to the <pre>s on CSS and JS pages (new
* Fix upload form display in right-to-left languages
* Fixed regression in blocking of username '0'
* (bug 9437) Don't overwrite edit form submission handler when setting up
- edit box scroll position preserve/restore behaviour
+ edit box scroll position preserve/restore behavior
* (bug 10805) Fix "undo" link when viewing the diff of the most recent
change to a page using "diff=0"
* (bug 10765) img_auth.php will now refuse logged-out requests where
to image/svg+xml after loading from the database.
* Workaround for djvutoxml bug #1704049 (poor performance). Use djvudump
instead.
-* Fixed odd behaviour in ImagePage on DjVu thumbnailing errors
+* Fixed odd behavior in ImagePage on DjVu thumbnailing errors
* (bug 5439) "Go" title search will now jump to shared/foreign Image: and
MediaWiki: pages that have not been locally edited.
* (bug 9630) Limits links in Whatlinkshere forgot about namespace filter
* New maintenance script to show the cached statistics : showStats.php.
* Count deleted edits when regenerating total edits in maintenance/initStats.php
* (bug 3706) Allow users to be exempted from IP blocks. The ipblock-exempt permission
- key has been added to enable this behaviour, by default assigned to sysops.
+ key has been added to enable this behavior, by default assigned to sysops.
* (bug 7948) importDump.php now warn that Recentchanges need to be rebuild.
* (bug 7667) allow XHTML namespaces customization
* (bug 8531) Correct local name of Lingála (patch by Raymond)
* (bug 6642) Don't offer to unlock the database when it isn't locked
* cleanupTitles.php changed from --dry-run option to --fix, so default
behavior is now a non-invasive check as with namespaceDupes.php
-* (bug 6660) Fix behaviour of EditPage::blockedPage() when the article does
+* (bug 6660) Fix behavior of EditPage::blockedPage() when the article does
not exist; now doesn't show the source box if the user hasn't provided it
(blocked mid-edit) and the page doesn't exist
* Improve default value of "blockedtext"
* (bug 6023) Fixed mismatch of 0/NULL for wl_notificationtimestamp; now notification
mails are working after 'Mark all pages visited' button on Special:Watchlist is clicked
* Made {{INT:}} a core parser function instead of a special case. The syntax
- and behaviour is largely unchanged.
+ and behavior is largely unchanged.
* (bug 7448) Fixing the native name for Ewe (ee)
* (bug 6864) Replace message 'editing' with new message 'editinguser' in Special:Userrights
to allow better localisation
* (bug 1283) Use underlining and borders to highlight additions/deletions
in diff-view
* Use user's local timezone in Special:Log display
-* Show filename for images in gallery by default (restore beta 3 behaviour)
+* Show filename for images in gallery by default (restore beta 3 behavior)
* (bug 1201) Double-escaping in brokenlinks, imagelinks, categorylinks, searchindex
* When using squid reverse proxy, cache the redirect to the Main_Page
* (bug 1302) Fix Norwegian language file
in MW 1.20 (saving preferences using Special:Preferences cleared any
additional fields) and which has been disabled in 1.20.1 as a part of
a security fix (bug 42202).
+* Added option to specify "others" as author in extension credits using
+ "..." as author name.
* Added the ability to limit the wall clock time used by shell processes,
as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
* Allow memory of shell subprocesses to be limited using Linux cgroups
* (bug 5346) Categories that are redirects will be displayed italic in
the category links section at the bottom of a page.
* (bug 43915) New maintenance script deleteEqualMessages.php.
-* New collation uppercase-sv, which is like uppercase, but adapted
- to Swedish sort order.
+* You can now create checkbox option matrixes through the HTMLCheckMatrix
+ subclass in HTMLForm.
* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
html elements and tables. This allows presentational markup, especially
tables. To be marked up as such.
+* maintenance/sql.php learned the --cluster option. Let you run the script
+ on some external cluster instead of the primary cluster for a given wiki.
+* (bug 20281) test the parsing of inline URLs.
+* Added Special:PagesWithProp, which lists pages using a particular page property.
+* Implemented language-specific collations for category sorting for 67 languages
+ based in latin, greek and cyrillic alphabets. This allows one to *finally* get
+ articles to be correctly sorted on category pages. They are named
+ 'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
+ co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
+ gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
+ oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
+ uz, vi.
+* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
+* (bug 33186) Add image rotation api "imagerotate"
=== Bug fixes in 1.21 ===
* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
a fatal error.
* (bug 44775) The username field is not pre-filled when creating an account.
+* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
+ URL without address
+* (bug 45012) Creating an account by e-mail can no longer show a
+ "password mismatch" error.
+* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
+ extensions) performed using Git 1.7.8+ should now appear.
+* (bug 42184) $wgUploadSizeWarning missing second variable
+* (bug 40326) Check if files exist with a different extension during uploading
+* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
=== API changes in 1.21 ===
* prop=revisions can now report the contentmodel and contentformat.
iicontinue).
* Add supports for all pageset capabilities - generators, redirects, converttitles to
action=purge and action=setnotificationtimestamp.
+* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
+* ApiQueryImageInfo will now limit the number of calls to File::transform made
+ in any one query. If there are too many, iicontinue will be returned.
+* action=query&meta=siteinfo&siprop=general will now return the regexes used for
+ link trails and link prefices. Added for Parsoid support.
+* Added an API query module list=pageswithprop, which lists pages using a
+ particular page property.
+* Added an API query module list=pagepropnames, which lists all page prop names
+ currently in use on the wiki.
+* (bug 44921) ApiMain::execute() will now return after the CORS check for an
+ HTTP OPTIONS request.
+* (bug 44923) action=upload works correctly if the entire file is uploaded in
+ the first chunk.
+* Added 'continue=' parameter to streamline client iteration over complex query results
+* (bug 44909) API parameters may now be marked as type "upload", which is now
+ used for action=upload's 'file' and 'chunk' parameters. This type will raise
+ an error during parameter validation if the parameter is given but not
+ recognized as an uploaded file.
+* (bug 44244) prop=info may now return the number of people watching each page.
+* (bug 33304) list=allpages will no longer return duplicate entries when
+ querying protection.
+* (bug 33304) list=allpages will now find really old indefinite protections.
=== API internal changes in 1.21 ===
* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
first one keeping its meaning. ApiPageSet is now derived from ApiBase.
* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
+* $wgAPIGeneratorModules is now obsolete and will be ignored.
+* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
+* Internal API calls will now include <warnings> in case of unused parameters
=== Languages updated in 1.21 ===
were using it, you have to either copy it to your extension, or install the
Vector extension (and possibly disable its features using config settings if
you don't want them).
+* Experimental IBM DB2 support was removed due to lack of interest and maintainership
+* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
+ lowerCamelCase format, and made more explicit:
+ - clear_stats.php -> clearCacheStats.php
+ - clear_interwiki_cache.php -> clearInterwikiCache.php
+ - initStats.php -> initSiteStats.php
+ - proxy_check.php -> proxyCheck.php
+ - stats.php -> showCacheStats.php
+ - showStats.php -> showSiteStats.php.
+ Class names were renamed accordingly:
+ - clear_stats -> ClearCacheStats
+ - InitStats -> InitSiteStats
+ - CacheStats -> ShowCacheStats
+ - ShowStats -> ShowSiteStats.
+* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
+ and moved it to the TitleBlacklist extension.
== Compatibility ==
MediaWiki 1.21 requires PHP 5.3.2 or later.
MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for IBM
-DB2 and Oracle.
+support for them is somewhat less mature. There is experimental support for
+Oracle.
The supported versions are:
can change between release branches, e.g. $wgDisableUploads in 1.4 is replaced
with $wgEnableUploads in later versions. When upgrading, consult the release
notes to check for configuration changes which would alter the expected
-behaviour of MediaWiki.
+behavior of MediaWiki.
=== Check installed extensions ===
* PostgreSQL
* SQLite
* Oracle
-* IBM DB2
* MSSQL
More information can be found about each of these databases (known issues,
+++ /dev/null
-== See also ==
-*[http://www.mediawiki.org/wiki/Manual:IBM_DB2 Installation instructions]
-*[http://ca.php.net/manual/en/function.db2-connect.php PHP Manual for DB2 functions]
\ No newline at end of file
the defaults.
&$namespaces: Array of namespace numbers with corresponding canonical names
+'CategoryAfterPageAdded': After a page is added to a category.
+$category: Category that page was added to
+$wikiPage: WikiPage that was added
+
+'CategoryAfterPageRemoved': After a page is removed from a category.
+$category: Category that page was removed from
+$wikiPage: WikiPage that was removed
+
'CategoryPageView': Before viewing a categorypage in CategoryPage::view.
$catpage: CategoryPage instance
Title::isCssOrJsPage().
'TitleIsAlwaysKnown': Called when determining if a page exists. Allows
-overriding default behaviour for determining if a page exists. If $isKnown is
+overriding default behavior for determining if a page exists. If $isKnown is
kept as null, regular checks happen. If it's a boolean, this value is returned
by the isKnown method.
$title: Title object that is being checked
level /maintenance directory.
Example:
- php clear_stats.php
+ php clearCacheStats.php
The following parameters are available to all maintenance scripts
--help : Print a help message
controlled by: $wgStatsMethod
key: $wgDBname:stats:$key
ex: wikibd:stats:request_with_session
- stores: counter for statistics (see maintenance/stats.php script)
+ stores: counter for statistics (see maintenance/showCacheStats.php script)
expiry: none (?)
- cleared by: maintenance/clear_stats.php script
+ cleared by: maintenance/clearCacheStats.php script
User:
key: $wgDBname:user:id:$sId
/**
* Page on which we're performing the action
- * @var Page $page
+ * @var WikiPage|Article|ImagePage|CategoryPage|Page $page
*/
protected $page;
protected function alterForm( HTMLForm $form ) {}
/**
- * Get the HTMLForm to control behaviour
+ * Get the HTMLForm to control behavior
* @return HTMLForm|null
*/
protected function getForm() {
* some stuff underneath (history etc); to do some processing on submission of that
* form (delete, protect, etc) and to do something exciting on 'success', be that
* display something new or redirect to somewhere. Some actions have more exotic
- * behaviour, but that's what subclassing is for :D
+ * behavior, but that's what subclassing is for :D
*/
public function show() {
$this->setHeaders();
* various consistent hash implementations that existed before this
* function was introduced.
*/
- static function consistentHashSort( &$array, $key, $separator = "\000" ) {
+ public static function consistentHashSort( &$array, $key, $separator = "\000" ) {
$hashes = array();
foreach ( $array as $elt ) {
$hashes[$elt] = md5( $elt . $separator . $key );
return strcmp( $hashes[$a], $hashes[$b] );
} );
}
+
+ /**
+ * Given an array of non-normalised probabilities, this function will select
+ * an element and return the appropriate key
+ *
+ * @param $weights array
+ *
+ * @return bool|int|string
+ */
+ public static function pickRandom( $weights ){
+ if ( !is_array( $weights ) || count( $weights ) == 0 ) {
+ return false;
+ }
+
+ $sum = array_sum( $weights );
+ if ( $sum == 0 ) {
+ # No loads on any of them
+ # In previous versions, this triggered an unweighted random selection,
+ # but this feature has been removed as of April 2006 to allow for strict
+ # separation of query groups.
+ return false;
+ }
+ $max = mt_getrandmax();
+ $rand = mt_rand( 0, $max ) / $max * $sum;
+
+ $sum = 0;
+ foreach ( $weights as $i => $w ) {
+ $sum += $w;
+ # Do not return keys if they have 0 weight.
+ # Note that the "all 0 weight" case is handed above
+ if ( $w > 0 && $sum >= $rand ) {
+ break;
+ }
+ }
+ return $i;
+ }
}
return $this->mContent;
}
-
/**
* Get text content object
* Does *NOT* follow redirects.
$this->showViewFooter();
$this->mPage->doViewUpdates( $user );
+ $outputPage->addModules( 'mediawiki.action.view.postEdit' );
+
wfProfileOut( __METHOD__ );
}
public function showMissingArticle() {
global $wgSend404Code;
$outputPage = $this->getContext()->getOutput();
+ $validUserPage = false;
# Show info in user (talk) namespace. Does the user exist? Is he blocked?
if ( $this->getTitle()->getNamespace() == NS_USER || $this->getTitle()->getNamespace() == NS_USER_TALK ) {
)
)
);
+ $validUserPage = true;
+ } else {
+ $validUserPage = true;
}
}
'msgKey' => array( 'moveddeleted-notice' ) )
);
- if ( !$this->mPage->hasViewableContent() && $wgSend404Code ) {
+ if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
// If there's no backing content, send a 404 Not Found
// for better machine handling of broken links.
$this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
'Html' => 'includes/Html.php',
'HTMLApiField' => 'includes/HTMLForm.php',
'HTMLCheckField' => 'includes/HTMLForm.php',
+ 'HTMLCheckMatrix' => 'includes/HTMLForm.php',
'HTMLEditTools' => 'includes/HTMLForm.php',
'HTMLFloatField' => 'includes/HTMLForm.php',
'HTMLForm' => 'includes/HTMLForm.php',
'HTMLTextField' => 'includes/HTMLForm.php',
'Http' => 'includes/HttpFunctions.php',
'HttpError' => 'includes/Exception.php',
- 'HttpRequest' => 'includes/HttpFunctions.old.php',
'ICacheHelper' => 'includes/CacheHelper.php',
'IcuCollation' => 'includes/Collation.php',
'IdentityCollation' => 'includes/Collation.php',
'MagicWord' => 'includes/MagicWord.php',
'MagicWordArray' => 'includes/MagicWord.php',
'MailAddress' => 'includes/UserMailer.php',
+ 'MappedIterator' => 'includes/MappedIterator.php',
'MediaWiki' => 'includes/Wiki.php',
'MediaWiki_I18N' => 'includes/SkinTemplate.php',
'Message' => 'includes/Message.php',
'MWNamespace' => 'includes/Namespace.php',
'OldChangesList' => 'includes/ChangesList.php',
'OutputPage' => 'includes/OutputPage.php',
- 'Page' => 'includes/WikiPage.php',
+ 'Page' => 'includes/WikiPage.php',
'PageQueryPage' => 'includes/PageQueryPage.php',
'Pager' => 'includes/Pager.php',
'PasswordError' => 'includes/User.php',
'UnlistedSpecialPage' => 'includes/SpecialPage.php',
'UploadSourceAdapter' => 'includes/Import.php',
'UppercaseCollation' => 'includes/Collation.php',
- 'UppercaseSvCollation' => 'includes/Collation.php',
'User' => 'includes/User.php',
'UserArray' => 'includes/UserArray.php',
'UserArrayFromResult' => 'includes/UserArray.php',
'WikiError' => 'includes/WikiError.php',
'WikiErrorMsg' => 'includes/WikiError.php',
'WikiExporter' => 'includes/Export.php',
- 'WikiFilePage' => 'includes/WikiFilePage.php',
+ 'WikiFilePage' => 'includes/WikiFilePage.php',
'WikiImporter' => 'includes/Import.php',
- 'WikiPage' => 'includes/WikiPage.php',
+ 'WikiPage' => 'includes/WikiPage.php',
'WikiRevision' => 'includes/Import.php',
'WikiMap' => 'includes/WikiMap.php',
'WikiReference' => 'includes/WikiMap.php',
'ApiFormatXmlRsd' => 'includes/api/ApiRsd.php',
'ApiFormatYaml' => 'includes/api/ApiFormatYaml.php',
'ApiHelp' => 'includes/api/ApiHelp.php',
+ 'ApiImageRotate' => 'includes/api/ApiImageRotate.php',
'ApiImport' => 'includes/api/ApiImport.php',
'ApiImportReporter' => 'includes/api/ApiImport.php',
'ApiLogin' => 'includes/api/ApiLogin.php',
'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
'ApiQueryORM' => 'includes/api/ApiQueryORM.php',
'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
+ 'ApiQueryPagesWithProp' => 'includes/api/ApiQueryPagesWithProp.php',
+ 'ApiQueryPagePropNames' => 'includes/api/ApiQueryPagePropNames.php',
'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
'ChronologyProtector' => 'includes/db/LBFactory.php',
'CloneDatabase' => 'includes/db/CloneDatabase.php',
'DatabaseBase' => 'includes/db/Database.php',
- 'DatabaseIbm_db2' => 'includes/db/DatabaseIbm_db2.php',
'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
'DBUnexpectedError' => 'includes/db/DatabaseError.php',
'FakeResultWrapper' => 'includes/db/DatabaseUtility.php',
'Field' => 'includes/db/DatabaseUtility.php',
- 'IBM_DB2Blob' => 'includes/db/DatabaseIbm_db2.php',
- 'IBM_DB2Field' => 'includes/db/DatabaseIbm_db2.php',
- 'IBM_DB2Helper' => 'includes/db/DatabaseIbm_db2.php',
- 'IBM_DB2Result' => 'includes/db/DatabaseIbm_db2.php',
'LBFactory' => 'includes/db/LBFactory.php',
'LBFactory_Fake' => 'includes/db/LBFactory.php',
'LBFactory_Multi' => 'includes/db/LBFactory_Multi.php',
'LSLockManager' => 'includes/filebackend/lockmanager/LSLockManager.php',
'MemcLockManager' => 'includes/filebackend/lockmanager/MemcLockManager.php',
'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
- 'MySqlLockManager'=> 'includes/filebackend/lockmanager/DBLockManager.php',
- 'PostgreSqlLockManager'=> 'includes/filebackend/lockmanager/DBLockManager.php',
+ 'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
+ 'PostgreSqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
'FileOp' => 'includes/filebackend/FileOp.php',
'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
'CliInstaller' => 'includes/installer/CliInstaller.php',
'DatabaseInstaller' => 'includes/installer/DatabaseInstaller.php',
'DatabaseUpdater' => 'includes/installer/DatabaseUpdater.php',
- 'Ibm_db2Installer' => 'includes/installer/Ibm_db2Installer.php',
- 'Ibm_db2Updater' => 'includes/installer/Ibm_db2Updater.php',
'InstallDocFormatter' => 'includes/installer/InstallDocFormatter.php',
'Installer' => 'includes/installer/Installer.php',
'LocalSettingsGenerator' => 'includes/installer/LocalSettingsGenerator.php',
# includes/job
'Job' => 'includes/job/Job.php',
'JobQueue' => 'includes/job/JobQueue.php',
+ 'JobQueueAggregator' => 'includes/job/JobQueueAggregator.php',
+ 'JobQueueAggregatorMemc' => 'includes/job/JobQueueAggregatorMemc.php',
+ 'JobQueueAggregatorRedis' => 'includes/job/JobQueueAggregatorRedis.php',
'JobQueueDB' => 'includes/job/JobQueueDB.php',
'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
'JobQueueRedis' => 'includes/job/JobQueueRedis.php',
'RefreshLinksJob' => 'includes/job/jobs/RefreshLinksJob.php',
'RefreshLinksJob2' => 'includes/job/jobs/RefreshLinksJob.php',
'UploadFromUrlJob' => 'includes/job/jobs/UploadFromUrlJob.php',
+ 'AssembleUploadChunksJob' => 'includes/job/jobs/AssembleUploadChunksJob.php',
+ 'PublishStashedFileJob' => 'includes/job/jobs/PublishStashedFileJob.php',
# includes/json
'FormatJson' => 'includes/json/FormatJson.php',
'SearchEngine' => 'includes/search/SearchEngine.php',
'SearchEngineDummy' => 'includes/search/SearchEngine.php',
'SearchHighlighter' => 'includes/search/SearchEngine.php',
- 'SearchIBM_DB2' => 'includes/search/SearchIBM_DB2.php',
'SearchMssql' => 'includes/search/SearchMssql.php',
'SearchMySQL' => 'includes/search/SearchMySQL.php',
'SearchNearMatchResultSet' => 'includes/search/SearchEngine.php',
'SpecialNewFiles' => 'includes/specials/SpecialNewimages.php',
'SpecialNewpages' => 'includes/specials/SpecialNewpages.php',
'SpecialPasswordReset' => 'includes/specials/SpecialPasswordReset.php',
+ 'SpecialPagesWithProp' => 'includes/specials/SpecialPagesWithProp.php',
'SpecialPermanentLink' => 'includes/SpecialPage.php',
'SpecialPreferences' => 'includes/specials/SpecialPreferences.php',
'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
# This has the nice property that a /32 block is ranked equally with a
# single-IP block, which is exactly what it is...
- $score = self::TYPE_RANGE - 1 + ( $size / 128 );
+ $score = self::TYPE_RANGE - 1 + ( $size / 128 );
} else {
$score = $block->getType();
# the collation in the database differs from the one
# set in $wgCategoryCollation, pagination might go totally haywire.
$extraConds = array( 'cl_type' => $type );
- if ( $this->from[$type] !== null ) {
+ if ( isset( $this->from[$type] ) && $this->from[$type] !== null ) {
$extraConds[] = 'cl_sortkey >= '
. $dbr->addQuotes( $this->collation->getSortKey( $this->from[$type] ) );
- } elseif ( $this->until[$type] !== null ) {
+ } elseif ( isset( $this->until[$type] ) && $this->until[$type] !== null ) {
$extraConds[] = 'cl_sortkey < '
. $dbr->addQuotes( $this->collation->getSortKey( $this->until[$type] ) );
$this->flip[$type] = true;
* @return String: HTML output, possibly empty if there are no other pages
*/
private function getSectionPagingLinks( $type ) {
- if ( $this->until[$type] !== null ) {
+ if ( isset( $this->until[$type] ) && $this->until[$type] !== null ) {
return $this->pagingLinks( $this->nextPage[$type], $this->until[$type], $type );
- } elseif ( $this->nextPage[$type] !== null || $this->from[$type] !== null ) {
+ } elseif ( $this->nextPage[$type] !== null || ( isset( $this->from[$type] ) && $this->from[$type] !== null ) ) {
return $this->pagingLinks( $this->from[$type], $this->nextPage[$type], $type );
} else {
return '';
}
$fromOrUntil = false;
- if ( $this->from[$pagingType] !== null || $this->until[$pagingType] !== null ) {
+ if ( ( isset( $this->from[$pagingType] ) && $this->from[$pagingType] !== null ) ||
+ ( isset( $this->until[$pagingType] ) && $this->until[$pagingType] !== null )
+ ) {
$fromOrUntil = true;
}
}
}
-
/**
* Writer class which uses the DBA extension
*/
}
}
-
/**
* Generate a list of changes using the good old system (no javascript)
*/
}
}
-
/**
* Generate a list of changes using an Enhanced system (uses javascript).
*/
switch( $collationName ) {
case 'uppercase':
return new UppercaseCollation;
- case 'uppercase-sv':
- return new UppercaseSvCollation;
case 'identity':
return new IdentityCollation;
case 'uca-default':
return new IcuCollation( 'root' );
default:
- # Provide a mechanism for extensions to hook in.
+ $match = array();
+ if ( preg_match( '/^uca-([a-z-]+)$/', $collationName, $match ) ) {
+ return new IcuCollation( $match[1] );
+ }
+ # Provide a mechanism for extensions to hook in.
$collationObject = null;
wfRunHooks( 'Collation::factory', array( $collationName, &$collationObject ) );
}
}
-/**
- * Like UppercaseCollation but swaps Ä and Æ.
- *
- * This provides an ordering suitable for Swedish.
- * @author Lejonel
- */
-class UppercaseSvCollation extends UppercaseCollation {
-
- /* Unicode code point order is ÄÅÆÖ, Swedish order is ÅÄÖ and Æ is often sorted as Ä.
- * Replacing Ä for Æ should give a better collation. */
- function getSortKey( $string ) {
- $uppercase = $this->lang->uc( $string );
- return strtr( $uppercase, array( 'Ä' => 'Æ', 'Æ' => 'Ä' ) );
- }
-}
-
/**
* Collation class that's essentially a no-op.
*
}
}
-
class IcuCollation extends Collation {
var $primaryCollator, $mainCollator, $locale;
var $firstLetterData;
array( 0x2F800, 0x2FA1F ), // CJK Compatibility Ideographs Supplement
);
+ /**
+ * Additional characters (or character groups) to be considered separate
+ * letters for given languages, compared to the data stored in the
+ * first-letters-root.ser file (which among others includes full basic latin,
+ * cyrillic and greek alphabets).
+ *
+ * "Separate letter" is a letter that would have a separate heading/section
+ * for it in a dictionary or a phone book in this language. This data isn't
+ * used for sorting (the ICU library handles that), only for deciding which
+ * characters (or character groups) to use as headings.
+ *
+ * Initially generated based on the primary level of Unicode collation
+ * tailorings available at http://developer.mimer.com/charts/tailorings.htm ,
+ * later modified.
+ *
+ * Empty arrays are intended; this signifies that the data for the language is
+ * available and that there are, in fact, no additional letters to consider.
+ */
+ static $tailoringFirstLetters = array(
+ // Verified by native speakers
+ 'be' => array( "Ё" ),
+ 'be-tarask' => array( "Ё" ),
+ 'fi' => array( "Å", "Ä", "Ö" ),
+ 'pl' => array( "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ),
+ 'ru' => array(),
+ // Not verified, but likely correct
+ 'af' => array(),
+ 'ast' => array( "CH", "LL", "Ñ" ),
+ 'az' => array( "Ç", "Ə", "Ğ", "İ", "Ö", "Ş", "Ü" ),
+ 'bg' => array(),
+ 'br' => array( "CH", "C'H" ),
+ 'bs' => array( "Č", "Ć", "DŽ", "Đ", "LJ", "NJ", "Š", "Ž" ),
+ 'ca' => array(),
+ 'co' => array(),
+ 'cs' => array( "Č", "CH", "Ř", "Š", "Ž" ),
+ 'cy' => array( "CH", "DD", "FF", "NG", "LL", "PH", "RH", "TH" ),
+ 'da' => array( "Æ", "Ø", "Å" ),
+ 'de' => array(),
+ 'dsb' => array( "Č", "Ć", "DŹ", "Ě", "CH", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ),
+ 'el' => array(),
+ 'en' => array(),
+ 'eo' => array( "Ĉ", "Ĝ", "Ĥ", "Ĵ", "Ŝ", "Ŭ" ),
+ 'es' => array( "Ñ" ),
+ 'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
+ 'eu' => array( "Ñ" ),
+ 'fo' => array( "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ),
+ 'fr' => array(),
+ 'fur' => array( "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ),
+ 'fy' => array(),
+ 'ga' => array(),
+ 'gd' => array(),
+ 'gl' => array( "CH", "LL", "Ñ" ),
+ 'hr' => array( "Č", "Ć", "DŽ", "Đ", "LJ", "NJ", "Š", "Ž" ),
+ 'hsb' => array( "Č", "DŹ", "Ě", "CH", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ),
+ 'hu' => array( "CS", "DZ", "DZS", "GY", "LY", "NY", "Ö", "SZ", "TY", "Ü", "ZS" ),
+ 'is' => array( "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ),
+ 'it' => array(),
+ 'kk' => array( "Ү", "І" ),
+ 'kl' => array( "Æ", "Ø", "Å" ),
+ 'ku' => array( "Ç", "Ê", "Î", "Ş", "Û" ),
+ 'ky' => array( "Ё" ),
+ 'la' => array(),
+ 'lb' => array(),
+ 'lt' => array( "Č", "Š", "Ž" ),
+ 'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
+ 'mk' => array(),
+ 'mo' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
+ 'mt' => array( "Ċ", "Ġ", "GĦ", "Ħ", "Ż" ),
+ 'nl' => array(),
+ 'no' => array( "Æ", "Ø", "Å" ),
+ 'oc' => array(),
+ 'pt' => array(),
+ 'rm' => array(),
+ 'ro' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
+ 'rup' => array( "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Ţ" ),
+ 'sco' => array(),
+ 'sk' => array( "Ä", "Č", "CH", "Ô", "Š", "Ž" ),
+ 'sl' => array( "Č", "Š", "Ž" ),
+ 'smn' => array( "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ),
+ 'sq' => array( "Ç", "DH", "Ë", "GJ", "LL", "NJ", "RR", "SH", "TH", "XH", "ZH" ),
+ 'sr' => array(),
+ 'sv' => array( "Å", "Ä", "Ö" ),
+ 'tk' => array( "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ),
+ 'tl' => array( "Ñ", "NG" ),
+ 'tr' => array( "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ),
+ 'tt' => array( "Ә", "Ө", "Ү", "Җ", "Ң", "Һ" ),
+ 'uk' => array( "Ґ", "Ь" ),
+ 'uz' => array( "CH", "G'", "NG", "O'", "SH" ),
+ 'vi' => array( "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ),
+ );
+
const RECORD_LENGTH = 14;
function __construct( $locale ) {
// Generate data from serialized data file
- $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
- if ( $letters === false ) {
- throw new MWException( "MediaWiki does not support ICU locale " .
- "\"{$this->locale}\"" );
+ if ( isset ( self::$tailoringFirstLetters[$this->locale] ) ) {
+ $letters = wfGetPrecompiledData( "first-letters-root.ser" );
+ $letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] );
+ } else {
+ $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
+ if ( $letters === false ) {
+ throw new MWException( "MediaWiki does not support ICU locale " .
+ "\"{$this->locale}\"" );
+ }
}
// Sort the letters.
*/
var $stateStack;
-
/**
* The path stack is a stack of associative arrays with the following elements:
* name The name of top level of the path
*/
$wgScriptExtension = '.php';
-
/**@}*/
/************************************************************************//**
/** Allows to move images and other media files */
$wgAllowImageMoving = true;
+/**
+ * Enable deferred upload tasks that use the job queue.
+ * Only enable this if job runners are set up for both the
+ * 'AssembleUploadChunks' and 'PublishStashedFile' job types.
+ */
+$wgEnableAsyncUploads = false;
+
/**
* These are additional characters that should be replaced with '-' in filenames
*/
* Each backend configuration has the following parameters:
* - 'name' : A unique name for the lock manager
* - 'class' : The lock manger class to use
- * Additional parameters are specific to the class used.
+ *
+ * See LockManager::__construct() for more details.
+ * Additional parameters are specific to the lock manager class used.
* These settings should be global to all wikis.
*/
$wgLockManagers = array();
*/
$wgCustomConvertCommand = false;
+/** used for lossless jpeg rotation
+ *
+ * @since 1.21
+ * **/
+$wgJpegTran = '/usr/bin/jpegtran';
+
+
/**
* Some tests and extensions use exiv2 to manipulate the EXIF metadata in some
* image formats.
),
);
-
/** Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected. */
$wgAntivirusRequired = true;
/**@}*/ # End of DB settings }
-
/************************************************************************//**
* @name Text storage
* @{
/**
* Store sessions in an object cache, configured by $wgSessionCacheType. This
- * can be useful to improve performance, or to avoid the locking behaviour of
+ * can be useful to improve performance, or to avoid the locking behavior of
* PHP's default session handler, which tends to prevent multiple requests for
* the same user from acting concurrently.
*/
* change it in their preferences.
*
* This also defines the language of pages in the wiki. The content is wrapped
- * in a html element with lang=XX attribute. This behaviour can be overriden
+ * in a html element with lang=XX attribute. This behavior can be overriden
* via hooks, see Title::getPageLanguage.
*/
$wgLanguageCode = 'en';
*/
$wgSend404Code = true;
-
/**
* The $wgShowRollbackEditCount variable is used to show how many edits will be
* rollback. The numeric value of the varible are the limit up to are counted.
/** @} */ # End of resource loader settings }
-
/*************************************************************************//**
* @name Page title and interwiki link settings
* @{
*/
$wgMaxGeneratedPPNodeCount = 1000000;
-
/**
* Maximum recursion depth for templates within templates.
* The current parser adds two levels to the PHP call stack for each template,
$wgGroupPermissions['*']['createpage'] = true;
$wgGroupPermissions['*']['createtalk'] = true;
$wgGroupPermissions['*']['writeapi'] = true;
-//$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
+#$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
// Implicit group for all logged-in accounts
$wgGroupPermissions['user']['move'] = true;
$wgGroupPermissions['bot']['suppressredirect'] = true;
$wgGroupPermissions['bot']['apihighlimits'] = true;
$wgGroupPermissions['bot']['writeapi'] = true;
-#$wgGroupPermissions['bot']['editprotected'] = true; // can edit all protected pages without cascade protection enabled
+#$wgGroupPermissions['bot']['editprotected'] = true; // can edit all protected pages without cascade protection enabled
// Most extra permission abilities go to this group
$wgGroupPermissions['sysop']['block'] = true;
$wgGroupPermissions['sysop']['movefile'] = true;
$wgGroupPermissions['sysop']['unblockself'] = true;
$wgGroupPermissions['sysop']['suppressredirect'] = true;
-#$wgGroupPermissions['sysop']['upload_by_url'] = true;
-#$wgGroupPermissions['sysop']['mergehistory'] = true;
+#$wgGroupPermissions['sysop']['upload_by_url'] = true;
+#$wgGroupPermissions['sysop']['mergehistory'] = true;
// Permission to change users' group assignments
$wgGroupPermissions['bureaucrat']['userrights'] = true;
// Permission to export pages including linked pages regardless of $wgExportMaxLinkDepth
#$wgGroupPermissions['bureaucrat']['override-export-depth'] = true;
-#$wgGroupPermissions['sysop']['deletelogentry'] = true;
-#$wgGroupPermissions['sysop']['deleterevision'] = true;
+#$wgGroupPermissions['sysop']['deletelogentry'] = true;
+#$wgGroupPermissions['sysop']['deleterevision'] = true;
// To hide usernames from users and Sysops
#$wgGroupPermissions['suppress']['hideuser'] = true;
// To hide revisions/log items from users and Sysops
/** Port we want to scan for a proxy */
$wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 );
/** Script used to scan */
-$wgProxyScriptPath = "$IP/maintenance/proxy_check.php";
+$wgProxyScriptPath = "$IP/maintenance/proxyCheck.php";
/** */
$wgProxyMemcExpiry = 86400;
/** This should always be customised in LocalSettings.php */
*/
$wgCookieDomain = '';
-
/**
* Set this variable if you want to restrict cookies to a certain path within
* the domain specified by $wgCookieDomain.
),
);
-
/**
* Overwrite the caching key prefix with custom value.
* @since 1.19
/**
* Path to the GNU diff3 utility. If the file doesn't exist, edit conflicts will
- * fall back to the old behaviour (no merging).
+ * fall back to the old behavior (no merging).
*/
$wgDiff3 = '/usr/bin/diff3';
$wgUseTagFilter = true;
/**
- * If set to an integer, pages that are watched by more users than this
- * threshold will not require the unwatchedpages permission to view the
- * number of watchers.
+ * If set to an integer, pages that are watched by this many users or more
+ * will not require the unwatchedpages permission to view the number of
+ * watchers.
*
* @since 1.21
*/
* Where $type is 'specialpage', 'parserhook', 'variable', 'media' or 'other'.
* Where 'descriptionmsg' can be an array with message key and parameters:
* 'descriptionmsg' => array( 'exampleextension-desc', param1, param2, ... ),
+ *
+ * author can be a string or an array of strings. Authors can be linked using
+ * the regular wikitext link syntax. To have an internationalized version of
+ * "and others" show, add an element "...". This element can also be linked,
+ * for instance "[http://example ...]".
*/
$wgExtensionCredits = array();
'enotifNotify' => 'EnotifNotifyJob',
'fixDoubleRedirect' => 'DoubleRedirectJob',
'uploadFromUrl' => 'UploadFromUrlJob',
+ 'AssembleUploadChunks' => 'AssembleUploadChunksJob',
+ 'PublishStashedFile' => 'PublishStashedFileJob',
'null' => 'NullJob'
);
* - Jobs that you want to run on specialized machines ( like transcoding, or a particular
* machine on your cluster has 'outside' web access you could restrict uploadFromUrl )
*/
-$wgJobTypesExcludedFromDefaultQueue = array();
+$wgJobTypesExcludedFromDefaultQueue = array( 'AssembleUploadChunks', 'PublishStashedFile' );
/**
* Map of job types to configuration arrays.
+ * This determines which queue class and storage system is used for each job type.
+ * Job types that do not have explicit configuration will use the 'default' config.
* These settings should be global to all wikis.
*/
$wgJobTypeConf = array(
'default' => array( 'class' => 'JobQueueDB', 'order' => 'random' ),
);
+/**
+ * Which aggregator to use for tracking which queues have jobs.
+ * These settings should be global to all wikis.
+ */
+$wgJobQueueAggregator = array(
+ 'class' => 'JobQueueAggregatorMemc'
+);
+
/**
* Additional functions to be performed with updateSpecialPages.
* Expensive Querypages are already updated.
/**
* List of special pages, followed by what subtitle they should go under
* at Special:SpecialPages
+ *
+ * @deprecated 1.21 Override SpecialPage::getGroupName instead
*/
-$wgSpecialPageGroups = array(
- 'DoubleRedirects' => 'maintenance',
- 'BrokenRedirects' => 'maintenance',
- 'Lonelypages' => 'maintenance',
- 'Uncategorizedpages' => 'maintenance',
- 'Uncategorizedcategories' => 'maintenance',
- 'Uncategorizedimages' => 'maintenance',
- 'Uncategorizedtemplates' => 'maintenance',
- 'Unusedcategories' => 'maintenance',
- 'Unusedimages' => 'maintenance',
- 'Protectedpages' => 'maintenance',
- 'Protectedtitles' => 'maintenance',
- 'Unusedtemplates' => 'maintenance',
- 'Withoutinterwiki' => 'maintenance',
- 'Longpages' => 'maintenance',
- 'Shortpages' => 'maintenance',
- 'Ancientpages' => 'maintenance',
- 'Deadendpages' => 'maintenance',
- 'Wantedpages' => 'maintenance',
- 'Wantedcategories' => 'maintenance',
- 'Wantedfiles' => 'maintenance',
- 'Wantedtemplates' => 'maintenance',
- 'Unwatchedpages' => 'maintenance',
- 'Fewestrevisions' => 'maintenance',
-
- 'Userlogin' => 'login',
- 'Userlogout' => 'login',
- 'CreateAccount' => 'login',
-
- 'Recentchanges' => 'changes',
- 'Recentchangeslinked' => 'changes',
- 'Watchlist' => 'changes',
- 'Newimages' => 'changes',
- 'Newpages' => 'changes',
- 'Log' => 'changes',
- 'Tags' => 'changes',
-
- 'Upload' => 'media',
- 'Listfiles' => 'media',
- 'MIMEsearch' => 'media',
- 'FileDuplicateSearch' => 'media',
- 'Filepath' => 'media',
-
- 'Listusers' => 'users',
- 'Activeusers' => 'users',
- 'Listgrouprights' => 'users',
- 'BlockList' => 'users',
- 'Contributions' => 'users',
- 'Emailuser' => 'users',
- 'Listadmins' => 'users',
- 'Listbots' => 'users',
- 'Userrights' => 'users',
- 'Block' => 'users',
- 'Unblock' => 'users',
- 'Preferences' => 'users',
- 'ChangeEmail' => 'users',
- 'ChangePassword' => 'users',
- 'DeletedContributions' => 'users',
- 'PasswordReset' => 'users',
-
- 'Mostlinked' => 'highuse',
- 'Mostlinkedcategories' => 'highuse',
- 'Mostlinkedtemplates' => 'highuse',
- 'Mostcategories' => 'highuse',
- 'Mostimages' => 'highuse',
- 'Mostinterwikis' => 'highuse',
- 'Mostrevisions' => 'highuse',
-
- 'Allpages' => 'pages',
- 'Prefixindex' => 'pages',
- 'Listredirects' => 'pages',
- 'Categories' => 'pages',
- 'Disambiguations' => 'pages',
-
- 'Randompage' => 'redirects',
- 'Randomredirect' => 'redirects',
- 'Mypage' => 'redirects',
- 'Mytalk' => 'redirects',
- 'Mycontributions' => 'redirects',
- 'Search' => 'redirects',
- 'LinkSearch' => 'redirects',
-
- 'ComparePages' => 'pagetools',
- 'Movepage' => 'pagetools',
- 'MergeHistory' => 'pagetools',
- 'Revisiondelete' => 'pagetools',
- 'Undelete' => 'pagetools',
- 'Export' => 'pagetools',
- 'Import' => 'pagetools',
- 'Whatlinkshere' => 'pagetools',
-
- 'Statistics' => 'wiki',
- 'Version' => 'wiki',
- 'Lockdb' => 'wiki',
- 'Unlockdb' => 'wiki',
- 'Allmessages' => 'wiki',
- 'Popularpages' => 'wiki',
-
- 'Specialpages' => 'other',
- 'Blockme' => 'other',
- 'Booksources' => 'other',
- 'JavaScriptTest' => 'other',
-);
+$wgSpecialPageGroups = array();
/** Whether or not to sort special pages in Special:Specialpages */
$wgAPIMetaModules = array();
$wgAPIPropModules = array();
$wgAPIListModules = array();
+
+/**
+ * This variable is ignored. To add your module to the API, please add it to $wgAPI*Modules
+ * @deprecated since 1.21
+ */
$wgAPIGeneratorModules = array();
/**
$wgMaxShellWallClockTime = 180;
/**
- * Under Linux: a cgroup directory used to constrain memory usage of shell
+ * Under Linux: a cgroup directory used to constrain memory usage of shell
* commands. The directory must be writable by the user which runs MediaWiki.
*
* If specified, this is used instead of ulimit, which is inaccurate, and
* them segfault or deadlock.
*
* A wrapper script will create a cgroup for each shell command that runs, as
- * a subgroup of the specified cgroup. If the memory limit is exceeded, the
+ * a subgroup of the specified cgroup. If the memory limit is exceeded, the
* kernel will send a SIGKILL signal to a process in the subgroup.
*
* @par Example:
* echo '$wgShellCgroup = "/sys/fs/cgroup/memory/mediawiki/job";' >> LocalSettings.php
* @endcode
*
- * The reliability of cgroup cleanup can be improved by installing a
+ * The reliability of cgroup cleanup can be improved by installing a
* notify_on_release script in the root cgroup, see e.g.
* https://gerrit.wikimedia.org/r/#/c/40784
*/
define( 'DB_WRITE', -2 );
define( 'DB_LAST', -3 ); # deprecated since 2008, usage throws exception
-
/**@{
* Virtual namespaces; don't appear in the page database
*/
define( 'LIST_SET', 2 );
define( 'LIST_NAMES', 3);
define( 'LIST_OR', 4);
-define( 'LIST_SET_PREPARED', 8); // List of (?, ?, ?) for DatabaseIbm_db2
/**@}*/
/**
/**
* Status: Article successfully updated
*/
- const AS_SUCCESS_UPDATE = 200;
+ const AS_SUCCESS_UPDATE = 200;
/**
* Status: Article successfully created
*/
- const AS_SUCCESS_NEW_ARTICLE = 201;
+ const AS_SUCCESS_NEW_ARTICLE = 201;
/**
* Status: Article update aborted by a hook function
*/
- const AS_HOOK_ERROR = 210;
+ const AS_HOOK_ERROR = 210;
/**
* Status: A hook function returned an error
*/
- const AS_HOOK_ERROR_EXPECTED = 212;
+ const AS_HOOK_ERROR_EXPECTED = 212;
/**
* Status: User is blocked from editting this page
*/
- const AS_BLOCKED_PAGE_FOR_USER = 215;
+ const AS_BLOCKED_PAGE_FOR_USER = 215;
/**
* Status: Content too big (> $wgMaxArticleSize)
*/
- const AS_CONTENT_TOO_BIG = 216;
+ const AS_CONTENT_TOO_BIG = 216;
/**
* Status: User cannot edit? (not used)
*/
- const AS_USER_CANNOT_EDIT = 217;
+ const AS_USER_CANNOT_EDIT = 217;
/**
* Status: this anonymous user is not allowed to edit this page
*/
- const AS_READ_ONLY_PAGE_ANON = 218;
+ const AS_READ_ONLY_PAGE_ANON = 218;
/**
* Status: this logged in user is not allowed to edit this page
*/
- const AS_READ_ONLY_PAGE_LOGGED = 219;
+ const AS_READ_ONLY_PAGE_LOGGED = 219;
/**
* Status: wiki is in readonly mode (wfReadOnly() == true)
*/
- const AS_READ_ONLY_PAGE = 220;
+ const AS_READ_ONLY_PAGE = 220;
/**
* Status: rate limiter for action 'edit' was tripped
*/
- const AS_RATE_LIMITED = 221;
+ const AS_RATE_LIMITED = 221;
/**
* Status: article was deleted while editting and param wpRecreate == false or form
* was not posted
*/
- const AS_ARTICLE_WAS_DELETED = 222;
+ const AS_ARTICLE_WAS_DELETED = 222;
/**
* Status: user tried to create this page, but is not allowed to do that
* ( Title->usercan('create') == false )
*/
- const AS_NO_CREATE_PERMISSION = 223;
+ const AS_NO_CREATE_PERMISSION = 223;
/**
* Status: user tried to create a blank page
*/
- const AS_BLANK_ARTICLE = 224;
+ const AS_BLANK_ARTICLE = 224;
/**
* Status: (non-resolvable) edit conflict
*/
- const AS_CONFLICT_DETECTED = 225;
+ const AS_CONFLICT_DETECTED = 225;
/**
* Status: no edit summary given and the user has forceeditsummary set and the user is not
* editting in his own userspace or talkspace and wpIgnoreBlankSummary == false
*/
- const AS_SUMMARY_NEEDED = 226;
+ const AS_SUMMARY_NEEDED = 226;
/**
* Status: user tried to create a new section without content
*/
- const AS_TEXTBOX_EMPTY = 228;
+ const AS_TEXTBOX_EMPTY = 228;
/**
* Status: article is too big (> $wgMaxArticleSize), after merging in the new section
/**
* not used
*/
- const AS_OK = 230;
+ const AS_OK = 230;
/**
* Status: WikiPage::doEdit() was unsuccessfull
*/
- const AS_END = 231;
+ const AS_END = 231;
/**
* Status: summary contained spam according to one of the regexes in $wgSummarySpamRegex
*/
- const AS_SPAM_ERROR = 232;
+ const AS_SPAM_ERROR = 232;
/**
* Status: anonymous user is not allowed to upload (User::isAllowed('upload') == false)
*/
- const AS_IMAGE_REDIRECT_ANON = 233;
+ const AS_IMAGE_REDIRECT_ANON = 233;
/**
* Status: logged in user is not allowed to upload (User::isAllowed('upload') == false)
*/
- const AS_IMAGE_REDIRECT_LOGGED = 234;
+ const AS_IMAGE_REDIRECT_LOGGED = 234;
/**
* Status: can't parse content
*/
- const AS_PARSE_ERROR = 240;
+ const AS_PARSE_ERROR = 240;
/**
* HTML id and name for the beginning of the edit form.
*/
- const EDITFORM_ID = 'editform';
+ const EDITFORM_ID = 'editform';
+
+ /**
+ * Prefix of key for cookie used to pass post-edit state.
+ * The revision id edited is added after this
+ */
+ const POST_EDIT_COOKIE_KEY_PREFIX = 'PostEditRevision';
+
+ /**
+ * Duration of PostEdit cookie, in seconds.
+ * The cookie will be removed instantly if the JavaScript runs.
+ *
+ * Otherwise, though, we don't want the cookies to accumulate.
+ * RFC 2109 ( https://www.ietf.org/rfc/rfc2109.txt ) specifies a possible limit of only 20 cookies per domain.
+ * This still applies at least to some versions of IE without full updates:
+ * https://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx
+ *
+ * A value of 20 minutes should be enough to take into account slow loads and minor
+ * clock skew while still avoiding cookie accumulation when JavaScript is turned off.
+ */
+ const POST_EDIT_COOKIE_DURATION = 1200;
/**
* @var Article
$this->isConflict = false;
// css / js subpages of user pages get a special treatment
- $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
- $this->isCssSubpage = $this->mTitle->isCssSubpage();
- $this->isJsSubpage = $this->mTitle->isJsSubpage();
+ $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
+ $this->isCssSubpage = $this->mTitle->isCssSubpage();
+ $this->isJsSubpage = $this->mTitle->isJsSubpage();
$this->isWrongCaseCssJsPage = $this->isWrongCaseCssJsPage();
# Show applicable editing introductions
// Nothing *to* preview for new sections
return false;
} elseif ( ( $wgRequest->getVal( 'preload' ) !== null || $this->mTitle->exists() ) && $wgUser->getOption( 'previewonfirst' ) ) {
- // Standard preference behaviour
+ // Standard preference behavior
return true;
} elseif ( !$this->mTitle->exists() &&
isset( $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] ) &&
wfProfileOut( get_class( $this ) . "::importContentFormData" );
}
- # Trim spaces on user supplied text
- $summary = trim( $request->getText( 'wpSummary' ) );
-
# Truncate for whole multibyte characters
- $this->summary = $wgContLang->truncate( $summary, 255 );
+ $this->summary = $wgContLang->truncate( $request->getText( 'wpSummary' ), 255 );
# If the summary consists of a heading, e.g. '==Foobar==', extract the title from the
# header syntax, e.g. 'Foobar'. This is mainly an issue when we are using wpSummary for
$this->starttime = null;
}
- $this->recreate = $request->getCheck( 'wpRecreate' );
+ $this->recreate = $request->getCheck( 'wpRecreate' );
$this->minoredit = $request->getCheck( 'wpMinoredit' );
$this->watchthis = $request->getCheck( 'wpWatchthis' );
} else {
# Not a posted form? Start with nothing.
wfDebug( __METHOD__ . ": Not a posted form.\n" );
- $this->textbox1 = '';
- $this->summary = '';
+ $this->textbox1 = '';
+ $this->summary = '';
$this->sectiontitle = '';
- $this->edittime = '';
- $this->starttime = wfTimestampNow();
- $this->edit = false;
- $this->preview = false;
- $this->save = false;
- $this->diff = false;
- $this->minoredit = false;
- $this->watchthis = $request->getBool( 'watchthis', false ); // Watch may be overriden by request parameters
- $this->recreate = false;
+ $this->edittime = '';
+ $this->starttime = wfTimestampNow();
+ $this->edit = false;
+ $this->preview = false;
+ $this->save = false;
+ $this->diff = false;
+ $this->minoredit = false;
+ $this->watchthis = $request->getBool( 'watchthis', false ); // Watch may be overriden by request parameters
+ $this->recreate = false;
// When creating a new section, we can preload a section title by passing it as the
// preloadtitle parameter in the URL (Bug 13100)
$rev = $this->mArticle->getRevision();
$content = $rev ? $rev->getContent( Revision::RAW ) : null;
- if ( $content === false || $content === null ) {
+ if ( $content === false || $content === null ) {
if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
$handler = ContentHandler::getForModelID( $this->contentModel );
}
}
-
/**
* Use this method before edit() to preload some text into the edit box
*
return $this->mTokenOk;
}
+ /**
+ * Sets post-edit cookie indicating the user just saved a particular revision.
+ *
+ * This uses a temporary cookie for each revision ID so separate saves will never
+ * interfere with each other.
+ *
+ * The cookie is deleted in the mediawiki.action.view.postEdit JS module after
+ * the redirect. It must be clearable by JavaScript code, so it must not be
+ * marked HttpOnly. The JavaScript code converts the cookie to a wgPostEdit config
+ * variable.
+ *
+ * Since WebResponse::setcookie does not allow forcing HttpOnly for a single
+ * cookie, we have to use PHP's setcookie() directly.
+ *
+ * We use a path of '/' since wgCookiePath is not exposed to JS
+ *
+ * If the variable were set on the server, it would be cached, which is unwanted
+ * since the post-edit state should only apply to the load right after the save.
+ */
+ protected function setPostEditCookie() {
+ global $wgCookiePrefix, $wgCookieDomain;
+ $revisionId = $this->mArticle->getLatest();
+ $postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
+
+ setcookie( $wgCookiePrefix . $postEditKey, '1', time() + self::POST_EDIT_COOKIE_DURATION, '/', $wgCookieDomain );
+ }
+
/**
* Attempt submission
* @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError
// FIXME: once the interface for internalAttemptSave() is made nicer, this should use the message in $status
if ( $status->value == self::AS_SUCCESS_UPDATE || $status->value == self::AS_SUCCESS_NEW_ARTICLE ) {
$this->didSave = true;
+ if ( !$resultDetails['nullEdit'] ) {
+ $this->setPostEditCookie();
+ }
}
switch ( $status->value ) {
/**
* Attempt submission (no UI)
*
- * @param $result
- * @param $bot bool
+ * @param array $result array to add statuses to, currently with the possible keys:
+ * spam - string - Spam string from content if any spam is detected by matchSpamRegex
+ * sectionanchor - string - Section anchor for a section save
+ * nullEdit - boolean - Set if doEditContent is OK. True if null edit, false otherwise.
+ * redirect - boolean - Set if doEditContent is OK. True if resulting revision is a redirect
+ * @param bool $bot True if edit is being made under the bot right.
*
* @return Status object, possibly with a message, but always with one of the AS_* constants in $status->value,
*
return $status;
}
- # Handle the user preference to force summaries here, but not for null edits
- if ( $this->section != 'new' && !$this->allowBlankSummary
- && !$content->equals( $this->getOriginalContent() )
- && !$content->isRedirect() ) # check if it's not a redirect
- {
- if ( md5( $this->summary ) == $this->autoSumm ) {
+ if ( $this->section == 'new' ) {
+ // Handle the user preference to force summaries here
+ if ( !$this->allowBlankSummary && trim( $this->summary ) == '' ) {
$this->missingSummary = true;
- $status->fatal( 'missingsummary' );
+ $status->fatal( 'missingsummary' ); // or 'missingcommentheader' if $section == 'new'. Blegh
$status->value = self::AS_SUMMARY_NEEDED;
wfProfileOut( __METHOD__ );
return $status;
}
- }
- # And a similar thing for new sections
- if ( $this->section == 'new' && !$this->allowBlankSummary ) {
- if ( trim( $this->summary ) == '' ) {
- $this->missingSummary = true;
- $status->fatal( 'missingsummary' ); // or 'missingcommentheader' if $section == 'new'. Blegh
- $status->value = self::AS_SUMMARY_NEEDED;
+ // Do not allow the user to post an empty comment
+ if ( $this->textbox1 == '' ) {
+ $this->missingComment = true;
+ $status->fatal( 'missingcommenttext' );
+ $status->value = self::AS_TEXTBOX_EMPTY;
wfProfileOut( __METHOD__ );
return $status;
}
+ } elseif ( !$this->allowBlankSummary
+ && !$content->equals( $this->getOriginalContent() )
+ && !$content->isRedirect()
+ && md5( $this->summary ) == $this->autoSumm
+ ) {
+ $this->missingSummary = true;
+ $status->fatal( 'missingsummary' );
+ $status->value = self::AS_SUMMARY_NEEDED;
+ wfProfileOut( __METHOD__ );
+ return $status;
}
# All's well
wfProfileIn( __METHOD__ . '-sectionanchor' );
$sectionanchor = '';
if ( $this->section == 'new' ) {
- if ( $this->textbox1 == '' ) {
- $this->missingComment = true;
- $status->fatal( 'missingcommenttext' );
- $status->value = self::AS_TEXTBOX_EMPTY;
- wfProfileOut( __METHOD__ . '-sectionanchor' );
- wfProfileOut( __METHOD__ );
- return $status;
- }
if ( $this->sectiontitle !== '' ) {
$sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
// If no edit summary was specified, create one automatically from the section
return $doEditStatus;
}
+ $result['nullEdit'] = $doEditStatus->hasMessage( 'edit-no-change' );
$result['redirect'] = $content->isRedirect();
$this->updateWatchlist();
wfProfileOut( __METHOD__ );
$this->showHeaderCopyrightWarning();
}
-
/**
* Standard summary input and label (wgSummary), abstracted so EditPage
* subclasses may reorganize the form.
* @return String
*/
protected function getSummaryPreview( $isSubjectPreview, $summary = "" ) {
+ // avoid spaces in preview, gets always trimmed on save
+ $summary = trim( $summary );
if ( !$summary || ( !$this->preview && !$this->diff ) ) {
return "";
}
$callargs = array_merge( array( $this ), $args );
foreach ( $hooks as $hook ) {
- if ( is_string( $hook ) || ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) ) { // 'function' or array( 'class', hook' )
+ if ( is_string( $hook ) || ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) ) { // 'function' or array( 'class', hook' )
$result = call_user_func_array( $hook, $callargs );
} else {
$result = null;
foreach ( $resultset as $row ) {
if ( $last === null ||
$last->page_namespace != $row->page_namespace ||
- $last->page_title != $row->page_title ) {
+ $last->page_title != $row->page_title ) {
if ( $last !== null ) {
$output = '';
if ( $this->dumpUploads ) {
}
if ( isset( $row->rev_minor_edit ) && $row->rev_minor_edit ) {
- $out .= " <minor/>\n";
+ $out .= " <minor/>\n";
}
if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_COMMENT ) ) {
$out .= " " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
}
}
-
/**
* Base class for output stream; prints to stdout or buffer or whereever.
* @ingroup Dump
}
}
-
/**
* Dump output filter to include only the last revision in each page sequence.
* @ingroup Dump
return $total;
}
-
/**
* Fallback implementation of mb_strpos, hardcoded to UTF-8.
* @param $haystack String
public static function applyDiffStyle( $text ) {
$styles = array(
'diff' => 'background-color: white; color:black;',
- 'diff-otitle' => 'background-color: white; color:black;',
- 'diff-ntitle' => 'background-color: white; color:black;',
- 'diff-addedline' => 'background: #cfc; color:black; font-size: smaller;',
- 'diff-deletedline' => 'background: #ffa; color:black; font-size: smaller;',
- 'diff-context' => 'background: #eee; color:black; font-size: smaller;',
- 'diffchange' => 'color: red; font-weight: bold; text-decoration: none;',
+ 'diff-otitle' => 'background-color: white; color:black; text-align: center;',
+ 'diff-ntitle' => 'background-color: white; color:black; text-align: center;',
+ 'diff-addedline' => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;',
+ 'diff-deletedline' => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;',
+ 'diff-context' => 'background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;',
+ 'diffchange' => 'font-weight: bold; text-decoration: none;',
);
foreach( $styles as $class => $style ) {
* @param $dir string The root directory of the repo where the .git dir can be found
*/
public function __construct( $dir ) {
- $this->basedir = "{$dir}/.git/";
+ $this->basedir = "{$dir}/.git";
+ if ( is_readable( $this->basedir ) && !is_dir( $this->basedir ) ) {
+ $GITfile = file_get_contents( $this->basedir );
+ if ( strlen( $GITfile ) > 8 && substr( $GITfile, 0, 8 ) === 'gitdir: ' ) {
+ $path = rtrim( substr( $GITfile, 8 ), "\r\n" );
+ $isAbsolute = $path[0] === '/' || substr( $path, 1, 1 ) === ':';
+ $this->basedir = $isAbsolute ? $path : "{$dir}/{$path}";
+ }
+ }
}
/**
}
// If not a SHA1 it may be a ref:
- $REFfile = "{$this->basedir}{$HEAD}";
+ $REFfile = "{$this->basedir}/{$HEAD}";
if ( !is_readable( $REFfile ) ) {
return false;
}
}
}
-
// Support for Wietse Venema's taint feature
if ( !function_exists( 'istainted' ) ) {
/**
*
* @param $s String:
* @return string
-*/
+ */
function wfUrlencode( $s ) {
static $needle;
if ( is_null( $s ) ) {
if ( !isset( $bits['host'] ) ) {
$bits['host'] = '';
- /* parse_url loses the third / for file:///c:/ urls (but not on variants) */
- if ( substr( $bits['path'], 0, 1 ) !== '/' ) {
- $bits['path'] = '/' . $bits['path'];
+ // bug 45069
+ if ( isset( $bits['path'] ) ) {
+ /* parse_url loses the third / for file:///c:/ urls (but not on variants) */
+ if ( substr( $bits['path'], 0, 1 ) !== '/' ) {
+ $bits['path'] = '/' . $bits['path'];
+ }
+ } else {
+ $bits['path'] = '';
}
}
return urldecode( $matches[1] );
}
-
-
/**
* Make URL indexes, appropriate for the el_index field of externallinks.
*
}
/**
- * This is the new function for getting translated interface messages.
- * See the Message class for documentation how to use them.
- * The intention is that this function replaces all old wfMsg* functions.
+ * This is the function for getting translated interface messages.
+ *
+ * @see Message class for documentation how to use them.
+ * @see https://www.mediawiki.org/wiki/Manual:Messages_API
+ *
+ * This function replaces all old wfMsg* functions.
+ *
* @param $key \string Message key.
* Varargs: normal message parameters.
* @return Message
$frame['function'];
}
-
/* Some generic result counters, pulled out of SearchEngine */
-
/**
* @todo document
*
*/
define( 'TS_POSTGRES', 7 );
-/**
- * DB2 format time
- */
-define( 'TS_DB2', 8 );
-
/**
* ISO 8601 basic format with no timezone: 19860209T200000Z. This is used by ResourceLoader
*/
* @return string|bool The output number as a string, or false on error
*/
function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = true, $engine = 'auto' ) {
+ $input = (string)$input;
if(
$sourceBase < 2 ||
$sourceBase > 36 ||
'submit' => 'HTMLSubmitField',
'hidden' => 'HTMLHiddenField',
'edittools' => 'HTMLEditTools',
+ 'checkmatrix' => 'HTMLCheckMatrix',
// HTMLTextField will output the correct type="" attribute automagically.
// There are about four zillion other HTML5 input types, like url, but
$hasLabel = true;
}
} elseif ( is_array( $value ) ) {
- $section = $this->displaySection( $value, $key );
+ $section = $this->displaySection( $value, $key, "$fieldsetIDPrefix$key-" );
$legend = $this->getLegend( $key );
if ( isset( $this->mSectionHeaders[$key] ) ) {
$section = $this->mSectionHeaders[$key] . $section;
}
}
+/**
+ * A checkbox matrix
+ * Operates similarly to HTMLMultiSelectField, but instead of using an array of
+ * options, uses an array of rows and an array of columns to dynamically
+ * construct a matrix of options.
+ */
+class HTMLCheckMatrix extends HTMLFormField {
+
+ function validate( $value, $alldata ) {
+ $rows = $this->mParams['rows'];
+ $columns = $this->mParams['columns'];
+
+ // Make sure user-defined validation callback is run
+ $p = parent::validate( $value, $alldata );
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ // Make sure submitted value is an array
+ if ( !is_array( $value ) ) {
+ return false;
+ }
+
+ // If all options are valid, array_intersect of the valid options
+ // and the provided options will return the provided options.
+ $validOptions = array();
+ foreach ( $rows as $rowTag ) {
+ foreach ( $columns as $columnTag ) {
+ $validOptions[] = $columnTag . '-' . $rowTag;
+ }
+ }
+ $validValues = array_intersect( $value, $validOptions );
+ if ( count( $validValues ) == count( $value ) ) {
+ return true;
+ } else {
+ return $this->msg( 'htmlform-select-badoption' )->parse();
+ }
+ }
+
+ /**
+ * Build a table containing a matrix of checkbox options.
+ * The value of each option is a combination of the row tag and column tag.
+ * mParams['rows'] is an array with row labels as keys and row tags as values.
+ * mParams['columns'] is an array with column labels as keys and column tags as values.
+ * @param $value Array of the options that should be checked
+ * @return String
+ */
+ function getInputHTML( $value ) {
+ $html = '';
+ $tableContents = '';
+ $attribs = array();
+ $rows = $this->mParams['rows'];
+ $columns = $this->mParams['columns'];
+
+ // If the disabled param is set, disable all the options
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $attribs['disabled'] = 'disabled';
+ }
+
+ // Build the column headers
+ $headerContents = Html::rawElement( 'td', array(), ' ' );
+ foreach ( $columns as $columnLabel => $columnTag ) {
+ $headerContents .= Html::rawElement( 'td', array(), $columnLabel );
+ }
+ $tableContents .= Html::rawElement( 'tr', array(), "\n$headerContents\n" );
+
+ // Build the options matrix
+ foreach ( $rows as $rowLabel => $rowTag ) {
+ $rowContents = Html::rawElement( 'td', array(), $rowLabel );
+ foreach ( $columns as $columnTag ) {
+ // Knock out any options that are not wanted
+ if ( isset( $this->mParams['remove-options'] )
+ && in_array( "$columnTag-$rowTag", $this->mParams['remove-options'] ) )
+ {
+ $rowContents .= Html::rawElement( 'td', array(), ' ' );
+ } else {
+ // Construct the checkbox
+ $thisAttribs = array(
+ 'id' => "{$this->mID}-$columnTag-$rowTag",
+ 'value' => $columnTag . '-' . $rowTag
+ );
+ $checkbox = Xml::check(
+ $this->mName . '[]',
+ in_array( $columnTag . '-' . $rowTag, (array)$value, true ),
+ $attribs + $thisAttribs );
+ $rowContents .= Html::rawElement( 'td', array(), $checkbox );
+ }
+ }
+ $tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" );
+ }
+
+ // Put it all in a table
+ $html .= Html::rawElement( 'table', array( 'class' => 'mw-htmlform-matrix' ),
+ Html::rawElement( 'tbody', array(), "\n$tableContents\n" ) ) . "\n";
+
+ return $html;
+ }
+
+ /**
+ * Get the complete table row for the input, including help text,
+ * labels, and whatever.
+ * We override this function since the label should always be on a separate
+ * line above the options in the case of a checkbox matrix, i.e. it's always
+ * a "vertical-label".
+ * @param $value String the value to set the input to
+ * @return String complete HTML table row
+ */
+ function getTableRow( $value ) {
+ list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+ $inputHtml = $this->getInputHTML( $value );
+ $fieldType = get_class( $this );
+ $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
+ $cellAttributes = array( 'colspan' => 2 );
+
+ $label = $this->getLabelHtml( $cellAttributes );
+
+ $field = Html::rawElement(
+ 'td',
+ array( 'class' => 'mw-input' ) + $cellAttributes,
+ $inputHtml . "\n$errors"
+ );
+
+ $html = Html::rawElement( 'tr',
+ array( 'class' => 'mw-htmlform-vertical-label' ), $label );
+ $html .= Html::rawElement( 'tr',
+ array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+ $field );
+
+ return $html . $helptext;
+ }
+
+ /**
+ * @param $request WebRequest
+ * @return Array
+ */
+ function loadDataFromRequest( $request ) {
+ if ( $this->mParent->getMethod() == 'post' ) {
+ if ( $request->wasPosted() ) {
+ // Checkboxes are not added to the request arrays if they're not checked,
+ // so it's perfectly possible for there not to be an entry at all
+ return $request->getArray( $this->mName, array() );
+ } else {
+ // That's ok, the user has not yet submitted the form, so show the defaults
+ return $this->getDefault();
+ }
+ } else {
+ // This is the impossible case: if we look at $_GET and see no data for our
+ // field, is it because the user has not yet submitted the form, or that they
+ // have submitted it with all the options unchecked. We will have to assume the
+ // latter, which basically means that you can't specify 'positive' defaults
+ // for GET forms.
+ return $request->getArray( $this->mName, array() );
+ }
+ }
+
+ function getDefault() {
+ if ( isset( $this->mDefault ) ) {
+ return $this->mDefault;
+ } else {
+ return array();
+ }
+ }
+}
+
/**
* A select dropdown field. Basically a wrapper for Xmlselect class
*/
*/
class HTMLRadioField extends HTMLFormField {
-
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
}
}
-
/**
* Pointer object for an item within a CGZ blob stored in the text table.
*/
}
}
-
/**
* To speed up conversion from 1.4 to 1.5 schema, text rows can refer to the
* leftover cur table as the backend. This avoids expensively copying hundreds
unset( self::$handlers[$name] );
}
-
/**
* Attach an event handler to a given hook
*
+++ /dev/null
-<?php
-/**
- * Class alias kept for backward compatibility.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup HTTP
- */
-
-/**
- * HttpRequest was renamed to MWHttpRequest in order
- * to prevent conflicts with PHP's HTTP extension
- * which also defines an HttpRequest class.
- * http://www.php.net/manual/en/class.httprequest.php
- *
- * This is for backwards compatibility.
- * @since 1.17
- */
-class HttpRequest extends MWHttpRequest { }
* Otherwise it will use $wgHTTPProxy (if set)
* Otherwise it will use the environment variable "http_proxy" (if set)
* - noProxy Don't use any proxy at all. Takes precedence over proxy value(s).
- * - sslVerifyHost (curl only) Set to 2 to verify hostname against certificate
- * Setting to 1 (or true) will NOT verify the host name. It will
- * only check its existence. Setting to 0 (or false) disables entirely.
+ * - sslVerifyHost (curl only) Verify hostname against certificate
* - sslVerifyCert (curl only) Verify SSL certificate
* - caInfo (curl only) Provide CA information
* - maxRedirects Maximum number of redirects to follow (defaults to 5)
protected $postData = null;
protected $proxy = null;
protected $noProxy = false;
- /**
- * Parameter passed to Curl that specifies whether
- * to validate SSL certificates.
- *
- * Setting to 0 disables entirely. Setting to 1 checks
- * the existence of a CN, but doesn't verify it. Setting
- * to 2 (the default) actually verifies the host.
- */
- protected $sslVerifyHost = 2;
+ protected $sslVerifyHost = true;
protected $sslVerifyCert = true;
protected $caInfo = null;
protected $method = "GET";
return (int)$this->respStatus;
}
-
/**
* Returns true if the last status code was a redirect.
*
if ( isset( $url['host'] ) ) {
$domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
- break; //found correct URI (with host)
+ break; //found correct URI (with host)
} else {
$foundRelativeURI = true;
}
}
$this->curlOptions[CURLOPT_USERAGENT] = $this->reqHeaders['User-Agent'];
- if ( isset( $this->sslVerifyHost ) ) {
- $this->curlOptions[CURLOPT_SSL_VERIFYHOST] = $this->sslVerifyHost;
- }
-
- if ( isset( $this->sslVerifyCert ) ) {
- $this->curlOptions[CURLOPT_SSL_VERIFYPEER] = $this->sslVerifyCert;
- }
+ $this->curlOptions[CURLOPT_SSL_VERIFYHOST] = $this->sslVerifyHost ? 2 : 0;
+ $this->curlOptions[CURLOPT_SSL_VERIFYPEER] = $this->sslVerifyCert;
if ( $this->caInfo ) {
$this->curlOptions[CURLOPT_CAINFO] = $this->caInfo;
return long2ip( ( hexdec( $m[1] ) << 16 ) + hexdec( $m[2] ) );
}
- return null; // give up
+ return null; // give up
}
/**
* @return string
*/
function toHTML() {
- global $wgLang;
-
if ( $this->mPerRow > 0 ) {
$maxwidth = $this->mPerRow * ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING + self::GB_BORDERS );
$oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : '';
$output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
}
+ $lang = $this->getLang();
$params = array(
'width' => $this->mWidths,
'height' => $this->mHeights
if( $this->mShowBytes ) {
if( $img ) {
- $fileSize = htmlspecialchars( $wgLang->formatSize( $img->getSize() ) );
+ $fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
} else {
$fileSize = wfMessage( 'filemissing' )->escaped();
}
$textlink = $this->mShowFilename ?
Linker::link(
$nt,
- htmlspecialchars( $wgLang->truncate( $nt->getText(), $this->mCaptionLength ) ),
+ htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) ),
array(),
array(),
array( 'known', 'noclasses' )
: false;
}
+ /**
+ * Determines the correct language to be used for this image gallery
+ * @return Language object
+ */
+ private function getLang() {
+ global $wgLang;
+ return $this->mParser
+ ? $this->mParser->getTargetLanguage()
+ : $wgLang;
+ }
+
} //class
public function getImageLimitsFromOption( $user, $optionName ) {
global $wgImageLimits;
- $option = intval( $user->getOption( $optionName ) );
+ $option = $user->getIntOption( $optionName );
if ( !isset( $wgImageLimits[$option] ) ) {
$option = User::getDefaultOption( $optionName );
}
* @file
*/
-
/**
* Some functions to help implement an external link filter for spam control.
*
if ( $file && isset( $fp['frameless'] ) ) {
$srcWidth = $file->getWidth( $page );
# For "frameless" option: do not present an image bigger than the source (for bitmap-style images)
- # This is the same behaviour as the "thumb" option does it already.
+ # This is the same behavior as the "thumb" option does it already.
if ( $srcWidth && !$file->mustRender() && $hp['width'] > $srcWidth ) {
$hp['width'] = $srcWidth;
}
$noscale = true;
} else {
# Do not present an image bigger than the source, for bitmap-style images
- # This is a hack to maintain compatibility with arbitrary pre-1.10 behaviour
+ # This is a hack to maintain compatibility with arbitrary pre-1.10 behavior
$srcWidth = $file->getWidth( $page );
if ( $srcWidth && !$file->mustRender() && $hp['width'] > $srcWidth ) {
$hp['width'] = $srcWidth;
return self::userToolLinks( $userId, $userText, true, 0, $edits );
}
-
/**
* @param $userId Integer: user id in database.
* @param $userText String: user name in database.
* Make an HTML list of templates, and then add a "More..." link at
* the bottom. If $more is null, do not add a "More..." link. If $more
* is a Title, make a link to that title and use it. If $more is a string,
- * directly paste it in as the link.
+ * directly paste it in as the link (escaping needs to be done manually).
+ * Finally, if $more is a Message, call toString().
*
- * @param $templates Array of templates from Article::getUsedTemplate
- * or similar
+ * @param array $templates Array of templates from Article::getUsedTemplate or similar
* @param bool $preview Whether this is for a preview
* @param bool $section Whether this is for a section edit
- * @param Title|string|null $more A link for "More..." of the templates
+ * @param Title|Message|string|null $more An escaped link for "More..." of the templates
* @return String: HTML output
*/
public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) {
}
}
-
/**
* Returns true if the text matches the word, and alters the
* input string, removing all instances of the word
--- /dev/null
+<?php
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * @since 1.21
+ */
+class MappedIterator implements Iterator {
+ /** @var Iterator */
+ protected $baseIterator;
+ /** @var Closure */
+ protected $vCallback;
+
+ /**
+ * Build an new iterator from a base iterator by having the former wrap the
+ * later, returning the result of "value" callback for each current() invocation.
+ * The callback takes the result of current() on the base iterator as an argument.
+ * The keys of the base iterator are reused verbatim.
+ *
+ * @param Iterator|Array $iter
+ * @param Closure $vCallback
+ * @throws MWException
+ */
+ public function __construct( $iter, Closure $vCallback ) {
+ if ( is_array( $iter ) ) {
+ $this->baseIterator = new ArrayIterator( $iter );
+ } elseif ( $iter instanceof Iterator ) {
+ $this->baseIterator = $iter;
+ } else {
+ throw new MWException( "Invalid base iterator provided." );
+ }
+ $this->vCallback = $vCallback;
+ }
+
+ /**
+ * @return void
+ */
+ public function rewind() {
+ $this->baseIterator->rewind();
+ }
+
+ /**
+ * @return Mixed|null Returns null if out of range
+ */
+ public function current() {
+ if ( !$this->baseIterator->valid() ) {
+ return null; // out of range
+ }
+ return call_user_func_array( $this->vCallback, array( $this->baseIterator->current() ) );
+ }
+
+ /**
+ * @return Mixed|null Returns null if out of range
+ */
+ public function key() {
+ if ( !$this->baseIterator->valid() ) {
+ return null; // out of range
+ }
+ return $this->baseIterator->key();
+ }
+
+ /**
+ * @return void
+ */
+ public function next() {
+ $this->baseIterator->next();
+ }
+
+ /**
+ * @return bool
+ */
+ public function valid() {
+ return $this->baseIterator->valid();
+ }
+}
$this->language = $wgLang;
}
+ /**
+ * Returns the message key
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getKey() {
+ return $this->key;
+ }
+
+ /**
+ * Returns the message parameters
+ *
+ * @since 1.21
+ *
+ * @return string[]
+ */
+ public function getParams() {
+ return $this->parameters;
+ }
+
+ /**
+ * Returns the message format
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getFormat() {
+ return $this->format;
+ }
+
/**
* Factory function that is just wrapper for the real constructor. It is
* intented to be used instead of the real constructor, because it allows
* Call the parent constructor, then store the key as
* the message.
*
- * @param $key Message to use
- * @param $params Parameters for the message
+ * @param $key string Message to use
+ * @param $params array Parameters for the message
* @see Message::__construct
*/
public function __construct( $key, $params = array() ) {
class MimeMagic {
/**
- * Mapping of media types to arrays of mime types.
- * This is used by findMediaType and getMediaType, respectively
- */
+ * Mapping of media types to arrays of mime types.
+ * This is used by findMediaType and getMediaType, respectively
+ */
var $mMediaTypes = null;
/** Map of mime type aliases
- */
+ */
var $mMimeTypeAliases = null;
/** map of mime types to file extensions (as a space seprarated list)
- */
+ */
var $mMimeToExt = null;
/** map of file extensions types to mime types (as a space seprarated list)
- */
+ */
var $mExtToMime = null;
/** IEContentAnalyzer instance
*/
function __construct() {
/**
- * --- load mime.types ---
- */
+ * --- load mime.types ---
+ */
global $wgMimeTypeFile, $IP, $wgLoadFileinfoExtension;
return $m;
}
-
/**
* Tests if the extension matches the given mime type. Returns true if a
* match was found, null if the mime type is unknown, and false if the
$ext = $this->getExtensionsForType( $mime );
if ( !$ext ) {
- return null; // Unknown mime type
+ return null; // Unknown mime type
}
$ext = explode( ' ', $ext );
# TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
if ( $ext !== true && $ext !== false ) {
/** This is the mode used by getPropsFromPath
- * These mime's are stored in the database, where we don't really want
- * x-opc+zip, because we use it only for internal purposes
- */
+ * These mime's are stored in the database, where we don't really want
+ * x-opc+zip, because we use it only for internal purposes
+ */
if ( $this->isMatchingExtension( $ext, $mime) ) {
/* A known file extension for an OPC file,
- * find the proper mime type for that file extension */
+ * find the proper mime type for that file extension
+ */
$mime = $this->guessTypesForExtension( $ext );
} else {
$mime = "application/zip";
*/
private $mRedirectedFrom = null;
+ /**
+ * Additional key => value data
+ */
+ private $mProperties = array();
+
/**
* Constructor for OutputPage. This should not be called directly.
* Instead a new RequestContext should be created and it will implicitly create
}
/**
- * Add only CSS of one or more modules recognized by the resource loader. Module
- * styles added through this function will be loaded by the resource loader when
- * the page loads.
+ * Add only CSS of one or more modules recognized by the resource loader.
+ *
+ * Module styles added through this function will be added using standard link CSS
+ * tags, rather than as a combined Javascript and CSS package. Thus, they will
+ * load when JavaScript is disabled (unless CSS also happens to be disabled).
*
* @param $modules Mixed: module name (string) or array of module names
*/
return $this->mArticleBodyOnly;
}
+ /**
+ * Set an additional output property
+ * @since 1.21
+ *
+ * @param string $name
+ * @param mixed $value
+ */
+ public function setProperty( $name, $value ) {
+ $this->mProperties[$name] = $value;
+ }
+
+ /**
+ * Get an additional output property
+ * @since 1.21
+ *
+ * @param $name
+ * @return mixed: Property value or null if not found
+ */
+ public function getProperty( $name ) {
+ if ( isset( $this->mProperties[$name] ) ) {
+ return $this->mProperties[$name];
+ } else {
+ return null;
+ }
+ }
+
/**
* checkLastModified tells the client to use the client-cached page if
* possible. If successful, the OutputPage is disabled so that
$this->addHTML( $text );
}
-
/**
* Add the output of a QuickTemplate to the output buffer
*
$this->mJsConfigVars[$keys] = $value;
}
-
/**
* Get an array containing the variables to be set in mw.config in JavaScript.
*
* DO NOT CALL THIS FROM OUTSIDE OF THIS CLASS OR Skin::makeGlobalVariablesScript().
* This is only public until that function is removed. You have been warned.
*
- * Do not add things here which can be evaluated in ResourceLoaderStartupScript
+ * Do not add things here which can be evaluated in ResourceLoaderStartUpModule
* - in other words, page-independent/site-wide variables (without state).
* You will only be adding bloat to the html page and causing page caches to
* have to be purged on configuration changes.
implode( "\t", $digitTransTable ),
);
+ $user = $this->getUser();
+
$vars = array(
'wgCanonicalNamespace' => $nsname,
'wgCanonicalSpecialPageName' => $canonicalName,
'wgArticleId' => $pageID,
'wgIsArticle' => $this->isArticle(),
'wgAction' => Action::getActionName( $this->getContext() ),
- 'wgUserName' => $this->getUser()->isAnon() ? null : $this->getUser()->getName(),
- 'wgUserGroups' => $this->getUser()->getEffectiveGroups(),
+ 'wgUserName' => $user->isAnon() ? null : $user->getName(),
+ 'wgUserGroups' => $user->getEffectiveGroups(),
'wgCategories' => $this->getCategories(),
'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
'wgPageContentLanguage' => $lang->getCode(),
'wgMonthNamesShort' => $lang->getMonthAbbreviationsArray(),
'wgRelevantPageName' => $relevantTitle->getPrefixedDBKey(),
);
+ if ( $user->isLoggedIn() ) {
+ $vars['wgUserId'] = $user->getId();
+ $vars['wgUserEditCount'] = $user->getEditCount();
+ $userReg = wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
+ $vars['wgUserRegistration'] = $userReg !== null ? ( $userReg * 1000 ) : null;
+ }
if ( $wgContLang->hasVariants() ) {
$vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
}
) );
}
-
# Language variants
if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks ) {
$lang = $this->getTitle()->getPageLanguage();
* @return string
*/
public function buildCssLinks() {
- global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs,
- $wgLang, $wgContLang;
+ global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs, $wgContLang;
$this->getSkin()->setupSkinUserCss( $this );
// If needed, Janus it first. This is user-supplied CSS, so it's
// assumed to be right for the content language directionality.
$previewedCSS = $this->getRequest()->getText( 'wpTextbox1' );
- if ( $wgLang->getDir() !== $wgContLang->getDir() ) {
+ if ( $this->getLanguage()->getDir() !== $wgContLang->getDir() ) {
$previewedCSS = CSSJanus::transform( $previewedCSS, true, false );
}
$otherTags .= Html::inlineStyle( $previewedCSS );
$this->mOffset = $this->mRequest->getText( 'offset' );
# Use consistent behavior for the limit options
- $this->mDefaultLimit = intval( $this->getUser()->getOption( 'rclimit' ) );
+ $this->mDefaultLimit = $this->getUser()->getIntOption( 'rclimit' );
if ( !$this->mLimit ) {
// Don't override if a subclass calls $this->setLimit() in its constructor.
list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset();
protected function getDefaultDirections() { return false; }
}
-
/**
* IndexPager with an alphabetic list and a formatted navigation bar
* @ingroup Pager
abstract class PoolCounter {
/* Return codes */
- const LOCKED = 1; /* Lock acquired */
+ const LOCKED = 1; /* Lock acquired */
const RELEASED = 2; /* Lock released */
- const DONE = 3; /* Another worker did the work for you */
+ const DONE = 3; /* Another worker did the work for you */
- const ERROR = -1; /* Indeterminate error */
+ const ERROR = -1; /* Indeterminate error */
const NOT_LOCKED = -2; /* Called release() with no lock held */
const QUEUE_FULL = -3; /* There are already maxqueue workers on this lock */
- const TIMEOUT = -4; /* Timeout exceeded */
- const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
+ const TIMEOUT = -4; /* Timeout exceeded */
+ const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
/**
* I want to do this task and I need to do it myself.
protected function __construct( $conf, $type, $key ) {
$this->key = $key;
- $this->workers = $conf['workers'];
+ $this->workers = $conf['workers'];
$this->maxqueue = $conf['maxqueue'];
- $this->timeout = $conf['timeout'];
+ $this->timeout = $conf['timeout'];
}
}
static function getOptionFromUser( $name, $info, $user ) {
$val = $user->getOption( $name );
- // Handling for array-type preferences
+ // Handling for multiselect preferences
if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
$options = HTMLFormField::flattenOptions( $info['options'] );
}
}
+ // Handling for checkmatrix preferences
+ if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
+ ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+ $columns = HTMLFormField::flattenOptions( $info['columns'] );
+ $rows = HTMLFormField::flattenOptions( $info['rows'] );
+ $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+ $val = array();
+
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ if ( $user->getOption( "$prefix-$column-$row" ) ) {
+ $val[] = "$column-$row";
+ }
+ }
+ }
+ }
+
return $val;
}
// Skip the default * group, seems useless here
continue;
}
- $groupName = User::getGroupName( $ueg );
+ $groupName = User::getGroupName( $ueg );
$userGroups[] = User::makeGroupLinkHTML( $ueg, $groupName );
$memberName = User::getGroupMember( $ueg, $userName );
);
}
-
$defaultPreferences['emailaddress'] = array(
'type' => 'info',
'raw' => true,
'label-message' => 'tog-forceeditsummary',
);
-
$defaultPreferences['uselivepreview'] = array(
'type' => 'toggle',
'section' => 'editing/advancedediting',
'min' => 0,
);
-
if ( $wgVectorUseSimpleSearch ) {
$defaultPreferences['vector-simplesearch'] = array(
'type' => 'toggle',
* @return array
*/
function filterDataForSubmit( $data ) {
- // Support for separating MultiSelect preferences into multiple preferences
+ // Support for separating multi-option preferences into multiple preferences
// Due to lack of array support.
foreach ( $this->mFlatFields as $fieldname => $field ) {
$info = $field->mParams;
+
if ( $field instanceof HTMLMultiSelectField ) {
$options = HTMLFormField::flattenOptions( $info['options'] );
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
$data["$prefix$opt"] = in_array( $opt, $data[$fieldname] );
}
+ unset( $data[$fieldname] );
+
+ } elseif ( $field instanceof HTMLCheckMatrix ) {
+ $columns = HTMLFormField::flattenOptions( $info['columns'] );
+ $rows = HTMLFormField::flattenOptions( $info['rows'] );
+ $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ // Make sure option hasn't been removed
+ if ( !isset( $info['remove-options'] )
+ || !in_array( "$column-$row", $info['remove-options'] ) )
+ {
+ $data["$prefix-$column-$row"] = in_array( "$column-$row", $data[$fieldname] );
+ }
+ }
+ }
+
unset( $data[$fieldname] );
}
}
# Add manual and custom reason field/selects as well as submit
if( !$this->disabled ) {
- $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
+ $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
Xml::openElement( 'tbody' );
$out .= "
<tr>
if ( !$wgDisableCounters )
$wgQueryPages[] = array( 'PopularPagesPage', 'Popularpages' );
-
/**
* This is a class for doing query pages; since they're almost all the same,
* we factor out some of the functionality into a superclass, and let
public function &getTitle() {
if ( $this->mTitle === false ) {
$this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
- # Make sure the correct page ID is process cached
- $this->mTitle->resetArticleID( $this->mAttribs['rc_cur_id'] );
}
return $this->mTitle;
}
'rc_params' => ''
);
- $rc->mExtra = array(
+ $rc->mExtra = array(
'prefixedDBkey' => $title->getPrefixedDBkey(),
'lastTimestamp' => $lastTimestamp,
'oldSize' => $oldSize,
'rc_params' => ''
);
- $rc->mExtra = array(
+ $rc->mExtra = array(
'prefixedDBkey' => $title->getPrefixedDBkey(),
'lastTimestamp' => 0,
'oldSize' => 0,
'rc_params' => $params
);
- $rc->mExtra = array(
+ $rc->mExtra = array(
'prefixedDBkey' => $title->getPrefixedDBkey(),
'lastTimestamp' => 0,
'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage
// Build a new revision to be saved...
global $wgUser; // ugh
-
# if we have a content object, use it to set the model and type
if ( !empty( $row['content'] ) ) {
//@todo: when is that set? test with external store setup! check out insertOn() [dk]
/**
* Get previous revision for this title
*
- * @return Revision or null
+ * @return Revision|null
*/
public function getPrevious() {
if( $this->getTitle() ) {
if ( $wgContentHandlerUseDB ) {
//NOTE: Store null for the default model and format, to save space.
- //XXX: Makes the DB sensitive to changed defaults. Make this behaviour optional? Only in miser mode?
+ //XXX: Makes the DB sensitive to changed defaults. Make this behavior optional? Only in miser mode?
$model = $this->getContentModel();
$format = $this->getContentFormat();
*/
static function getTimestampFromId( $title, $id ) {
$dbr = wfGetDB( DB_SLAVE );
- // Casting fix for DB2
+ // Casting fix for databases that can't take '' for rev_id
if ( $id == '' ) {
$id = 0;
}
// Please note strings below are enclosed in brackets [], this make the
// hyphen "-" a range indicator. Hence it is double backslashed below.
// See bug 26948
- $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
+ $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
$rfc1034_ldh_str = "a-z0-9\\-";
$HTML5_email_regexp = "/
if ( $wgStylePath === false ) $wgStylePath = "$wgScriptPath/skins";
if ( $wgLocalStylePath === false ) $wgLocalStylePath = "$wgScriptPath/skins";
-if ( $wgStyleDirectory === false ) $wgStyleDirectory = "$IP/skins";
+if ( $wgStyleDirectory === false ) $wgStyleDirectory = "$IP/skins";
if ( $wgExtensionAssetsPath === false ) $wgExtensionAssetsPath = "$wgScriptPath/extensions";
if ( $wgLogo === false ) $wgLogo = "$wgStylePath/common/images/wiki.png";
}
# Blacklisted file extensions shouldn't appear on the "allowed" list
-$wgFileExtensions = array_diff ( $wgFileExtensions, $wgFileBlacklist );
+$wgFileExtensions = array_values( array_diff ( $wgFileExtensions, $wgFileBlacklist ) );
if ( $wgArticleCountMethod === null ) {
$wgArticleCountMethod = $wgUseCommaCount ? 'comma' : 'link';
*/
public $siteParamsCallback = null;
+ /**
+ * Configuration cache for getConfig()
+ * @var array
+ */
+ protected $cfgCache = array();
+
/**
* Retrieves a configuration setting for a given wiki.
* @param $settingName String ID of the setting name to retrieve
return array( $site, $lang );
}
+ /**
+ * Get the resolved (post-setup) configuration of a potentially foreign wiki.
+ * For foreign wikis, this is expensive, and only works if maintenance
+ * scripts are setup to handle the --wiki parameter such as in wiki farms.
+ *
+ * @param string $wiki
+ * @param array|string $settings A setting name or array of setting names
+ * @return Array|mixed Array if $settings is an array, otherwise the value
+ * @throws MWException
+ * @since 1.21
+ */
+ public function getConfig( $wiki, $settings ) {
+ global $IP;
+
+ $multi = is_array( $settings );
+ $settings = (array)$settings;
+ if ( $wiki === wfWikiID() ) { // $wiki is this wiki
+ $res = array();
+ foreach ( $settings as $name ) {
+ if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
+ throw new MWException( "Variable '$name' does start with 'wg'." );
+ } elseif ( !isset( $GLOBALS[$name] ) ) {
+ throw new MWException( "Variable '$name' is not set." );
+ }
+ $res[$name] = $GLOBALS[$name];
+ }
+ } else { // $wiki is a foreign wiki
+ if ( isset( $this->cfgCache[$wiki] ) ) {
+ $res = array_intersect_key( $this->cfgCache[$wiki], array_flip( $settings ) );
+ if ( count( $res ) == count( $settings ) ) {
+ return $res; // cache hit
+ }
+ } elseif ( !in_array( $wiki, $this->wikis ) ) {
+ throw new MWException( "No such wiki '$wiki'." );
+ } else {
+ $this->cfgCache[$wiki] = array();
+ }
+ $retVal = 1;
+ $cmd = wfShellWikiCmd(
+ "$IP/maintenance/getConfiguration.php",
+ array(
+ '--wiki', $wiki,
+ '--settings', implode( ' ', $settings ),
+ '--format', 'PHP'
+ )
+ );
+ // ulimit5.sh breaks this call
+ $data = trim( wfShellExec( $cmd, $retVal, array(), array( 'memory' => 0 ) ) );
+ if ( $retVal != 0 || !strlen( $data ) ) {
+ throw new MWException( "Failed to run getConfiguration.php." );
+ }
+ $res = unserialize( $data );
+ if ( !is_array( $res ) ) {
+ throw new MWException( "Failed to unserialize configuration array." );
+ }
+ $this->cfgCache[$wiki] = $this->cfgCache[$wiki] + $res;
+ }
+
+ return $multi ? $res : current( $res );
+ }
+
/**
* Returns true if the given vhost is handled locally.
* @param $vhost String
( $this->getTitle()->getArticleID() == 0 || $action == 'history' ) ) {
$n = $this->getTitle()->isDeleted();
-
if ( $n ) {
if ( $this->getUser()->isAllowed( 'undelete' ) ) {
$msg = 'thisisdeleted';
return '';
}
- # __NEWSECTIONLINK___ changes behaviour here
+ # __NEWSECTIONLINK___ changes behavior here
# If it is present, the link points to this page, otherwise
# it points to the talk page
if ( !$title->isTalkPage() && !$wgOut->showNewSectionLink() ) {
$userLang = $this->getLanguage();
$userLangCode = $userLang->getHtmlCode();
- $userLangDir = $userLang->getDir();
+ $userLangDir = $userLang->getDir();
$tpl->set( 'lang', $userLangCode );
$tpl->set( 'dir', $userLangDir );
* be displayed by the default execute() method, without the global function ever
* being called.
*
- * If you override execute(), you can recover the default behaviour with userCanExecute()
+ * If you override execute(), you can recover the default behavior with userCanExecute()
* and displayRestrictionError()
*
* @param $name String: name of the special page, as seen in links and URLs
* also the name that will be listed in Special:Specialpages
*
* Derived classes can override this, but usually it is easier to keep the
- * default behaviour. Messages can be added at run-time, see
+ * default behavior. Messages can be added at run-time, see
* MessageCache.php.
*
* @return String
$this->getOutput()->addFeedLink( $format, $url );
}
}
+
+ /**
+ * Get the group that the special page belongs in on Special:SpecialPage
+ * Use this method, instead of getGroupName to allow customization
+ * of the group name from the wiki side
+ *
+ * @return string Group of this special page
+ * @since 1.21
+ */
+ public function getFinalGroupName() {
+ global $wgSpecialPageGroups;
+ $name = $this->getName();
+ $group = '-';
+
+ // Allow overridding the group from the wiki side
+ $msg = $this->msg( 'specialpages-specialpagegroup-' . strtolower( $name ) )->inContentLanguage();
+ if ( !$msg->isBlank() ) {
+ $group = $msg->text();
+ } else {
+ // Than use the group from this object
+ $group = $this->getGroupName();
+
+ // Group '-' is used as default to have the chance to determine,
+ // if the special pages overriddes this method,
+ // if not overridden, $wgSpecialPageGroups is checked for b/c
+ if ( $group === '-' && isset( $wgSpecialPageGroups[$name] ) ) {
+ $group = $wgSpecialPageGroups[$name];
+ }
+ }
+
+ // never give '-' back, change to 'other'
+ if ( $group === '-' ) {
+ $group = 'other';
+ }
+
+ return $group;
+ }
+
+ /**
+ * Under which header this special page is listed in Special:SpecialPages
+ * See messages 'specialpages-group-*' for valid names
+ * This method defaults to group 'other'
+ *
+ * @return string
+ * @since 1.21
+ */
+ protected function getGroupName() {
+ // '-' used here to determine, if this group is overridden or has a hardcoded 'other'
+ // Needed for b/c in getFinalGroupName
+ return '-';
+ }
}
/**
}
/**
- * Get the HTMLForm to control behaviour
+ * Get the HTMLForm to control behavior
* @return HTMLForm|null
*/
protected function getForm() {
'Categories' => 'SpecialCategories',
'Disambiguations' => 'DisambiguationsPage',
'Listredirects' => 'ListredirectsPage',
+ 'PagesWithProp' => 'SpecialPagesWithProp',
// Login/create account
'Userlogin' => 'LoginForm',
*
* @param $page Mixed: SpecialPage or string
* @param $group String
+ * @deprecated 1.21 Override SpecialPage::getGroupName
*/
public static function setGroup( $page, $group ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
global $wgSpecialPageGroups;
$name = is_object( $page ) ? $page->getName() : $page;
$wgSpecialPageGroups[$name] = $group;
*
* @param $page SpecialPage
* @return String
+ * @deprecated 1.21 Use SpecialPage::getFinalGroupName
*/
public static function getGroup( &$page ) {
- $name = $page->getName();
+ wfDeprecated( __METHOD__, '1.21' );
- global $wgSpecialPageGroups;
- static $specialPageGroupsCache = array();
- if ( isset( $specialPageGroupsCache[$name] ) ) {
- return $specialPageGroupsCache[$name];
- }
- $msg = wfMessage( 'specialpages-specialpagegroup-' . strtolower( $name ) );
- if ( !$msg->isBlank() ) {
- $group = $msg->text();
- } else {
- $group = isset( $wgSpecialPageGroups[$name] )
- ? $wgSpecialPageGroups[$name]
- : '-';
- }
- if ( $group == '-' ) {
- $group = 'other';
- }
- $specialPageGroupsCache[$name] = $group;
- return $group;
+ return $page->getFinalGroupName();
}
/**
/**
* Get the error message as HTML. This is done by parsing the wikitext error
* message.
+ *
+ * @note: this does not perform a full wikitext to HTML conversion, it merely applies
+ * a message transformation.
+ * @todo: figure out whether that is actually The Right Thing.
*/
public function getHTML( $shortContext = false, $longContext = false ) {
$text = $this->getWikiText( $shortContext, $longContext );
* memory. The delimiters are literal strings, not regular expressions.
*
* If the start delimiter ends with an initial substring of the end delimiter,
- * e.g. in the case of C-style comments, the behaviour differs from the model
+ * e.g. in the case of C-style comments, the behavior differs from the model
* regex. In this implementation, the end must share no characters with the
* start, so e.g. /*\/ is not considered to be both the start and end of a
* comment. /*\/xy/*\/ is considered to be a single comment with contents /xy/.
TS_RFC2822 => 'D, d M Y H:i:s',
TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
TS_POSTGRES => 'Y-m-d H:i:s',
- TS_DB2 => 'Y-m-d H:i:s',
);
/**
# TS_POSTGRES
} elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
# TS_POSTGRES
- } elseif (preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.\d\d\d$/', $ts, $da ) ) {
- # TS_DB2
} elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week
'\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' . # dd Mon yyyy
'[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss
var $mHasSubpage; // /< Whether a page has any subpages
// @}
-
/**
* Constructor
*/
public function getContentModel() {
if ( !$this->mContentModel ) {
$linkCache = LinkCache::singleton();
+ $linkCache->addLinkObj( $this );
$this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
}
* Used for the title field in <a> tags.
*
* @return String the text, including any prefixes
+ * @deprecated since 1.19
*/
public function getEscapedText() {
wfDeprecated( __METHOD__, '1.19' );
* @param $query string
* @param $query2 bool|string
* @return String the URL
+ * @deprecated since 1.19
*/
public function escapeLocalURL( $query = '', $query2 = false ) {
wfDeprecated( __METHOD__, '1.19' );
*
* @see self::getLocalURL
* @return String the URL
+ * @deprecated since 1.19
*/
public function escapeFullURL( $query = '', $query2 = false ) {
wfDeprecated( __METHOD__, '1.19' );
* @see self::getLocalURL
* @since 1.18
* @return string
+ * @deprecated since 1.19
*/
public function escapeCanonicalURL( $query = '', $query2 = false ) {
wfDeprecated( __METHOD__, '1.19' );
*/
private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
if ( $action == 'create' ) {
- if ( ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
- ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) ) ) {
+ if (
+ ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
+ ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) )
+ ) {
$errors[] = $user->isAnon() ? array( 'nocreatetext' ) : array( 'nocreate-loggedin' );
}
} elseif ( $action == 'move' ) {
$errors = $this->resultToError( $errors, $result );
}
// Check getUserPermissionsErrorsExpensive hook
- if ( $doExpensiveQueries && !( $short && count( $errors ) > 0 ) &&
- !wfRunHooks( 'getUserPermissionsErrorsExpensive', array( &$this, &$user, $action, &$result ) ) ) {
+ if (
+ $doExpensiveQueries
+ && !( $short && count( $errors ) > 0 )
+ && !wfRunHooks( 'getUserPermissionsErrorsExpensive', array( &$this, &$user, $action, &$result ) )
+ ) {
$errors = $this->resultToError( $errors, $result );
}
# If it's a special page, ditch the subpage bit and check again
$name = $this->getDBkey();
list( $name, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $name );
- if ( $name !== false ) {
+ if ( $name ) {
$pure = SpecialPage::getTitleFor( $name )->getPrefixedText();
if ( in_array( $pure, $wgWhitelistRead, true ) ) {
$whitelisted = true;
public function userCanEditJsSubpage() {
global $wgUser;
wfDeprecated( __METHOD__, '1.19' );
- return ( ( $wgUser->isAllowedAll( 'editusercssjs', 'edituserjs' ) )
- || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
+ return (
+ ( $wgUser->isAllowedAll( 'editusercssjs', 'edituserjs' ) )
+ || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform )
+ );
}
/**
if ( $getPages ) {
$cols = array( 'pr_page', 'page_namespace', 'page_title',
- 'pr_expiry', 'pr_type', 'pr_level' );
+ 'pr_expiry', 'pr_type', 'pr_level' );
$where_clauses[] = 'page_id=pr_page';
$tables[] = 'page';
} else {
$pagerestrictions[$row->pr_type] = array();
}
- if ( isset( $pagerestrictions[$row->pr_type] ) &&
- !in_array( $row->pr_level, $pagerestrictions[$row->pr_type] ) ) {
+ if (
+ isset( $pagerestrictions[$row->pr_type] )
+ && !in_array( $row->pr_level, $pagerestrictions[$row->pr_type] )
+ ) {
$pagerestrictions[$row->pr_type][] = $row->pr_level;
}
} else {
* @return Bool
*/
public function isRedirect( $flags = 0 ) {
- if ( !is_null( $this->mRedirect ) ) {
+ if ( !( $flags & Title::GAID_FOR_UPDATE ) && !is_null( $this->mRedirect ) ) {
return $this->mRedirect;
}
- # Calling getArticleID() loads the field from cache as needed
+
if ( !$this->getArticleID( $flags ) ) {
return $this->mRedirect = false;
}
$linkCache = LinkCache::singleton();
+ $linkCache->addLinkObj( $this );
$cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
+
if ( $cached === null ) {
- // TODO: check the assumption that the cache actually knows about this title
- // and handle this, such as get the title from the database.
- // See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
- wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
- wfDebug( wfBacktrace() );
+ // Should not happen
+ throw new MWException( "LinkCache doesn't know redirect status of this title: " . $this->getPrefixedDBkey() );
}
$this->mRedirect = (bool)$cached;
* @return Int
*/
public function getLength( $flags = 0 ) {
- if ( $this->mLength != -1 ) {
+ if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLength != -1 ) {
return $this->mLength;
}
- # Calling getArticleID() loads the field from cache as needed
+
if ( !$this->getArticleID( $flags ) ) {
return $this->mLength = 0;
}
+
$linkCache = LinkCache::singleton();
+ $linkCache->addLinkObj( $this );
$cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
- if ( $cached === null ) { # check the assumption that the cache actually knows about this title
- # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
- # as a stop gap, perhaps log this, but don't throw an exception?
- wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
- wfDebug( wfBacktrace() );
+
+ if ( $cached === null ) {
+ // Should not happen
+ throw new MWException( "LinkCache doesn't know redirect status of this title: " . $this->getPrefixedDBkey() );
}
$this->mLength = intval( $cached );
if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLatestID !== false ) {
return intval( $this->mLatestID );
}
- # Calling getArticleID() loads the field from cache as needed
+
if ( !$this->getArticleID( $flags ) ) {
return $this->mLatestID = 0;
}
+
$linkCache = LinkCache::singleton();
$linkCache->addLinkObj( $this );
$cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
- if ( $cached === null ) { # check the assumption that the cache actually knows about this title
- # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
- # as a stop gap, perhaps log this, but don't throw an exception?
- throw new MWException( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+
+ if ( $cached === null ) {
+ // Should not happen
+ throw new MWException( "LinkCache doesn't know latest revision ID of this title: " . $this->getPrefixedDBkey() );
}
$this->mLatestID = intval( $cached );
# Pages with "/./" or "/../" appearing in the URLs will often be un-
# reachable due to the way web browsers deal with 'relative' URLs.
# Also, they conflict with subpage syntax. Forbid them explicitly.
- if ( strpos( $dbkey, '.' ) !== false &&
- ( $dbkey === '.' || $dbkey === '..' ||
- strpos( $dbkey, './' ) === 0 ||
- strpos( $dbkey, '../' ) === 0 ||
- strpos( $dbkey, '/./' ) !== false ||
- strpos( $dbkey, '/../' ) !== false ||
- substr( $dbkey, -2 ) == '/.' ||
- substr( $dbkey, -3 ) == '/..' ) )
- {
+ if (
+ strpos( $dbkey, '.' ) !== false &&
+ (
+ $dbkey === '.' || $dbkey === '..' ||
+ strpos( $dbkey, './' ) === 0 ||
+ strpos( $dbkey, '../' ) === 0 ||
+ strpos( $dbkey, '/./' ) !== false ||
+ strpos( $dbkey, '/../' ) !== false ||
+ substr( $dbkey, -2 ) == '/.' ||
+ substr( $dbkey, -3 ) == '/..'
+ )
+ ) {
return false;
}
# underlying database field. We make an exception for special pages, which
# don't need to be stored in the database, and may edge over 255 bytes due
# to subpage syntax for long titles, e.g. [[Special:Block/Long name]]
- if ( ( $this->mNamespace != NS_SPECIAL && strlen( $dbkey ) > 255 ) ||
- strlen( $dbkey ) > 512 )
- {
+ if (
+ ( $this->mNamespace != NS_SPECIAL && strlen( $dbkey ) > 255 )
+ || strlen( $dbkey ) > 512
+ ) {
return false;
}
return $retVal;
}
-
/**
* Get a list of URLs to purge from the Squid cache when this
* page changes
if ( strlen( $nt->getDBkey() ) < 1 ) {
$errors[] = array( 'articleexists' );
}
- if ( ( $this->getDBkey() == '' ) ||
- ( !$oldid ) ||
- ( $nt->getDBkey() == '' ) ) {
+ if (
+ ( $this->getDBkey() == '' ) ||
+ ( !$oldid ) ||
+ ( $nt->getDBkey() == '' )
+ ) {
$errors[] = array( 'badarticleerror' );
}
}
$old_cmp = '>';
$new_cmp = '<';
- $options = (array) $options;
+ $options = (array)$options;
if ( in_array( 'include_old', $options ) ) {
$old_cmp = '>=';
}
$isKnown = null;
/**
- * Allows overriding default behaviour for determining if a page exists.
+ * Allows overriding default behavior for determining if a page exists.
* If $isKnown is kept as null, regular checks happen. If it's
* a boolean, this value is returned by the isKnown method.
*
return false;
}
-
// Ensure that the name can't be misresolved as a different title,
// such as with extra namespace keys at the start.
$parsed = Title::newFromText( $name );
* @note This no longer clears uncached lazy-initialised properties;
* the constructor does that instead.
*
- * @param $name string
+ * @param $name string|bool
*/
public function loadDefaults( $name = false ) {
wfProfileIn( __METHOD__ );
}
if ( $request->getSessionData( 'wsToken' ) ) {
- $passwordCorrect = $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' );
+ $passwordCorrect = ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
$from = 'session';
} elseif ( $request->getCookie( 'Token' ) ) {
- $passwordCorrect = $proposedUser->getToken( false ) === $request->getCookie( 'Token' );
+ # Get the token from DB/cache and clean it up to remove garbage padding.
+ # This deals with historical problems with bugs and the default column value.
+ $token = rtrim( $proposedUser->getToken( false ) ); // correct token
+ $passwordCorrect = ( strlen( $token ) && $token === $request->getCookie( 'Token' ) );
$from = 'cookie';
} else {
# No session or persistent login cookie
}
}
-
/**
* Get blocking information
* @param $bFromSlave Bool Whether to check the slave database first. To
/**
* Set the password and reset the random token unconditionally.
*
- * @param $str String New password to set
+ * @param $str string|null New password to set or null to set an invalid
+ * password hash meaning that the user will not be able to log in
+ * through the web interface.
*/
public function setInternalPassword( $str ) {
$this->load();
/**
* Get the user's current token.
- * @param $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
+ * @param $forceCreation bool Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
* @return String Token
*/
public function getToken( $forceCreation = true ) {
* - 'registered' - preferences which are registered in core MediaWiki or
* by extensions using the UserGetDefaultOptions hook.
* - 'registered-multiselect' - as above, using the 'multiselect' type.
+ * - 'registered-checkmatrix' - as above, using the 'checkmatrix' type.
* - 'userjs' - preferences with names starting with 'userjs-', intended to
* be used by user scripts.
* - 'unused' - preferences about which MediaWiki doesn't know anything.
return array(
'registered',
'registered-multiselect',
+ 'registered-checkmatrix',
'userjs',
'unused'
);
$prefs = Preferences::getPreferences( $this, $context );
$mapping = array();
- // Multiselect options are stored in the database with one key per
- // option, each having a boolean value. Extract those keys.
+ // Multiselect and checkmatrix options are stored in the database with
+ // one key per option, each having a boolean value. Extract those keys.
$multiselectOptions = array();
foreach ( $prefs as $name => $info ) {
if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
unset( $prefs[$name] );
}
}
+ $checkmatrixOptions = array();
+ foreach ( $prefs as $name => $info ) {
+ if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
+ ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+ $columns = HTMLFormField::flattenOptions( $info['columns'] );
+ $rows = HTMLFormField::flattenOptions( $info['rows'] );
+ $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ $checkmatrixOptions["$prefix-$column-$row"] = true;
+ }
+ }
+
+ unset( $prefs[$name] );
+ }
+ }
// $value is ignored
foreach ( $options as $key => $value ) {
$mapping[$key] = 'registered';
} elseif( isset( $multiselectOptions[$key] ) ) {
$mapping[$key] = 'registered-multiselect';
+ } elseif( isset( $checkmatrixOptions[$key] ) ) {
+ $mapping[$key] = 'registered-checkmatrix';
} elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
$mapping[$key] = 'userjs';
} else {
* and 'all', which forces a reset of *all* preferences and overrides everything else.
*
* @param $resetKinds array|string which kinds of preferences to reset. Defaults to
- * array( 'registered', 'registered-multiselect', 'unused' )
- * for backwards-compatibility.
+ * array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
+ * for backwards-compatibility.
* @param $context IContextSource|null context source used when $resetKinds
- * does not contain 'all', passed to getOptionKinds().
- * Defaults to RequestContext::getMain() when null.
+ * does not contain 'all', passed to getOptionKinds().
+ * Defaults to RequestContext::getMain() when null.
*/
public function resetOptions(
- $resetKinds = array( 'registered', 'registered-multiselect', 'unused' ),
+ $resetKinds = array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' ),
IContextSource $context = null
) {
$this->load();
*/
public function getStubThreshold() {
global $wgMaxArticleSize; # Maximum article size, in Kb
- $threshold = intval( $this->getOption( 'stubthreshold' ) );
+ $threshold = $this->getIntOption( 'stubthreshold' );
if ( $threshold > $wgMaxArticleSize * 1024 ) {
# If they have set an impossible value, disable the preference
# so we can use the parser cache again.
*
* @param $request WebRequest object to use; $wgRequest will be used if null
* is passed.
- * @param $secure Whether to force secure/insecure cookies or use default
+ * @param $secure bool Whether to force secure/insecure cookies or use default
*/
public function setCookies( $request = null, $secure = null ) {
if ( $request === null ) {
}
$this->load();
- if ( 0 == $this->mId ) return;
+ if ( 0 == $this->mId ) {
+ return;
+ }
if ( !$this->mToken ) {
// When token is empty or NULL generate a new one and then save it to the database
// This allows a wiki to re-secure itself after a leak of it's user table or $wgSecretKey
public static function createNew( $name, $params = array() ) {
$user = new User;
$user->load();
+ $user->setToken(); // init token
if ( isset( $params['options'] ) ) {
$user->mOptions = $params['options'] + (array)$user->mOptions;
unset( $params['options'] );
*/
public function addToDatabase() {
$this->load();
+ if ( !$this->mToken ) {
+ $this->setToken(); // init token
+ }
$this->mTouched = self::newTouchedTimestamp();
// since it disables the parser cache, its value will always
// be 0 when this function is called by parsercache.
- $confstr = $this->getOption( 'math' );
+ $confstr = $this->getOption( 'math' );
$confstr .= '!' . $this->getStubThreshold();
$confstr .= '!' . ( $this->getOption( 'numberheadings' ) ? '1' : '' );
$confstr .= '!' . $wgLang->getCode();
/**
* Generate a looking random token for various uses.
*
- * @param $salt String Optional salt value
* @return String The new random token
* @deprecated since 1.20; Use MWCryptRand for secure purposes or wfRandomString for pesudo-randomness
*/
- public static function generateToken( $salt = '' ) {
+ public static function generateToken() {
return MWCryptRand::generateHex( 32 );
}
}
/**
- * Return a URL the user can use to confirm their email address.
+ * Return a URL the user can use to confirm their email address.
* @param $token String Accepts the email confirmation token
* @return String New token URL
*/
/**
* Get the timestamp of account creation.
*
- * @return String|Bool Timestamp of account creation, or false for
- * non-existent/anonymous user accounts.
+ * @return String|Bool|Null Timestamp of account creation, false for
+ * non-existent/anonymous user accounts, or null if existing account
+ * but information is not in database.
*/
public function getRegistration() {
if ( $this->isAnon() ) {
/**
* Load the user options either from cache, the database or an array
*
- * @param $data Rows for the current user out of the user_properties table
+ * @param $data array Rows for the current user out of the user_properties table
*/
protected function loadOptions( $data = null ) {
global $wgContLang;
* @author Luke Welling lwelling@wikimedia.org
*/
-
/**
* Stores a single person's name and email address.
* These are passed in via the constructor, and will be returned in SMTP
}
}
-
/**
* Collection of static functions for sending mail
*/
$mime = new Mail_mime( array( 'eol' => $endl ) );
$mime->setTXTBody( $body['text'] );
$mime->setHTMLBody( $body['html'] );
- $body = $mime->get(); // must call get() before headers()
+ $body = $mime->get(); // must call get() before headers()
$headers = $mime->headers( $headers );
}
}
$success = true;
}
- # the following code compensates the new behaviour, introduced by the
+ # the following code compensates the new behavior, introduced by the
# enotif patch, that every single watched page needs now to be listed
# in watchlist namespace:page and namespace_talk:page had separate
# entries: clear them
$limit = 0;
}
if( ( $limit == 0 ) && ( $optionname != '' ) ) {
- $limit = (int)$wgUser->getOption( $optionname );
+ $limit = $wgUser->getIntOption( $optionname );
}
if( $limit <= 0 ) {
$limit = $deflimit;
$this->ip = $ip;
return $ip;
}
+
+ /**
+ * @param string $ip
+ * @return void
+ * @since 1.21
+ */
+ public function setIP( $ip ) {
+ $this->ip = $ip;
+ }
+
+ /**
+ * Export the resolved user IP, HTTP headers, and session ID.
+ * The result will be reasonably sized to allow for serialization.
+ *
+ * @return Array
+ * @since 1.21
+ */
+ public function exportUserSession() {
+ return array(
+ 'ip' => $this->getIP(),
+ 'headers' => $this->getAllHeaders(),
+ 'sessionId' => session_id()
+ );
+ }
}
/**
throw new MWException( "FauxRequest() got bogus data" );
}
$this->wasPosted = $wasPosted;
- if( $session )
+ if( $session ) {
$this->session = $session;
+ }
}
/**
* Set the browser cookie
* @param $name String: name of cookie
* @param $value String: value to give cookie
- * @param $expire Int: number of seconds til cookie expires
+ * @param $expire Int: Unix timestamp (in seconds) when the cookie should expire.
+ * 0 (the default) causes it to expire $wgCookieExpiration seconds from now.
* @param $prefix String: Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
* @param $domain String: Cookie domain to use, if not $wgCookieDomain
* @param $forceSecure Bool:
$secureCookie = $forceSecure;
}
- $httpOnlySafe = wfHttpOnlySafe() && $wgCookieHttpOnly;
+ // Mark the cookie as httpOnly if $wgCookieHttpOnly is true,
+ // unless the requesting user-agent is known to have trouble with
+ // httpOnly cookies.
+ $httpOnlySafe = $wgCookieHttpOnly && wfHttpOnlySafe();
+
wfDebugLog( 'cookie',
'setcookie: "' . implode( '", "',
array(
// Check for redirects ...
$action = $request->getVal( 'action', 'view' );
$file = ( $title->getNamespace() == NS_FILE ) ? $article->getFile() : null;
- if ( ( $action == 'view' || $action == 'render' ) // ... for actions that show content
- && !$request->getVal( 'oldid' ) && // ... and are not old revisions
- !$request->getVal( 'diff' ) && // ... and not when showing diff
- $request->getVal( 'redirect' ) != 'no' && // ... unless explicitly told not to
+ if ( ( $action == 'view' || $action == 'render' ) // ... for actions that show content
+ && !$request->getVal( 'oldid' ) && // ... and are not old revisions
+ !$request->getVal( 'diff' ) && // ... and not when showing diff
+ $request->getVal( 'redirect' ) != 'no' && // ... unless explicitly told not to
// ... and the article is not a non-redirect image page with associated file
!( is_object( $file ) && $file->exists() && !$file->getRedirected() ) )
{
public $mPreparedEdit = false; // !< Array
/**@}}*/
+ /**
+ * @var int
+ */
+ protected $mId = null;
+
/**
* @var int; one of the READ_* constants
*/
* @return void
*/
protected function clearCacheFields() {
+ $this->mId = null;
$this->mCounter = null;
$this->mRedirectTarget = null; // Title object if set
$this->mLastRevision = null; // Latest revision
// Old-fashioned restrictions
$this->mTitle->loadRestrictions( $data->page_restrictions );
- $this->mCounter = intval( $data->page_counter );
- $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
- $this->mIsRedirect = intval( $data->page_is_redirect );
- $this->mLatest = intval( $data->page_latest );
+ $this->mId = intval( $data->page_id );
+ $this->mCounter = intval( $data->page_counter );
+ $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
+ $this->mIsRedirect = intval( $data->page_is_redirect );
+ $this->mLatest = intval( $data->page_latest );
// Bug 37225: $latest may no longer match the cached latest Revision object.
// Double-check the ID of any cached latest Revision object for consistency.
if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
$this->mTitle->loadFromRow( false );
$this->clearCacheFields();
+
+ $this->mId = 0;
}
$this->mDataLoaded = true;
* @return int Page ID
*/
public function getId() {
- return $this->mTitle->getArticleID();
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mId;
}
/**
* @return bool Whether or not the page exists in the database
*/
public function exists() {
- return $this->mTitle->exists();
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mId > 0;
}
/**
* @return bool
*/
public function hasViewableContent() {
- return $this->mTitle->exists() || $this->mTitle->isAlwaysKnown();
+ return $this->exists() || $this->mTitle->isAlwaysKnown();
}
/**
return $wgEnableParserCache
&& $parserOptions->getStubThreshold() == 0
- && $this->mTitle->exists()
+ && $this->exists()
&& ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
&& $this->getContentHandler()->isParserCacheSupported();
}
}
// Don't update page view counters on views from bot users (bug 14044)
- if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->mTitle->exists() ) {
+ if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
}
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
// @todo: move this logic to MessageCache
- if ( $this->mTitle->exists() ) {
+ if ( $this->exists() ) {
// NOTE: use transclusion text for messages.
// This is consistent with MessageCache::getMsgFromNamespace()
if ( $affected ) {
$newid = $dbw->insertId();
+ $this->mId = $newid;
$this->mTitle->resetArticleID( $newid );
}
wfProfileOut( __METHOD__ );
*/
function checkFlags( $flags ) {
if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
- if ( $this->mTitle->getArticleID() ) {
+ if ( $this->exists() ) {
$flags |= EDIT_UPDATE;
} else {
$flags |= EDIT_NEW;
$editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
$serialized = $editInfo->pst;
$content = $editInfo->pstContent;
- $newsize = $content->getSize();
+ $newsize = $content->getSize();
$dbw = wfGetDB( DB_MASTER );
$now = wfTimestampNow();
}
}
- if ( !$this->mTitle->exists() ) {
+ if ( !$this->exists() ) {
wfProfileOut( __METHOD__ );
return;
}
$restrictionTypes = $this->mTitle->getRestrictionTypes();
- $id = $this->mTitle->getArticleID();
+ $id = $this->getId();
if ( !$cascade ) {
$cascade = false;
// Now that it's safely backed up, delete it
$dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
- $ok = ( $dbw->affectedRows() > 0 ); // getArticleID() uses slave, could be laggy
+ $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
if ( !$ok ) {
$dbw->rollback( __METHOD__ );
// Clear caches
WikiPage::onArticleDelete( $this->mTitle );
- // Reset this object
- $this->clear();
-
- // Clear the cached article id so the interface doesn't act like we exist
- $this->mTitle->resetArticleID( 0 );
+ // Reset this object and the Title object
+ $this->loadFromRow( false, self::READ_LATEST );
}
/**
*/
public function getHiddenCategories() {
$result = array();
- $id = $this->mTitle->getArticleID();
+ $id = $this->getId();
if ( $id == 0 ) {
return array();
}
/**
- * Return an applicable autosummary if one exists for the given edit.
- * @param $oldtext String|null: the previous text of the page.
- * @param $newtext String|null: The submitted text of the page.
- * @param $flags Int bitmask: a bitmask of flags submitted for the edit.
- * @return string An appropriate autosummary, or an empty string.
- *
- * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
- */
+ * Return an applicable autosummary if one exists for the given edit.
+ * @param $oldtext String|null: the previous text of the page.
+ * @param $newtext String|null: The submitted text of the page.
+ * @param $flags Int bitmask: a bitmask of flags submitted for the edit.
+ * @return string An appropriate autosummary, or an empty string.
+ *
+ * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
+ */
public static function getAutosummary( $oldtext, $newtext, $flags ) {
// NOTE: stub for backwards-compatibility. assumes the given text is wikitext. will break horribly if it isn't.
}
$dbw->insert( 'category', $insertRows, __METHOD__, 'IGNORE' );
- $addFields = array( 'cat_pages = cat_pages + 1' );
+ $addFields = array( 'cat_pages = cat_pages + 1' );
$removeFields = array( 'cat_pages = cat_pages - 1' );
if ( $ns == NS_CATEGORY ) {
__METHOD__
);
}
+
+ foreach( $added as $catName ) {
+ $cat = Category::newFromName( $catName );
+ wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $this ) );
+ }
+ foreach( $deleted as $catName ) {
+ $cat = Category::newFromName( $catName );
+ wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $this ) );
+ }
}
/**
// are visible.
// Get templates from templatelinks
- $id = $this->mTitle->getArticleID();
+ $id = $this->getId();
$tlTemplates = array();
public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
$out = '<' . $element;
if( !is_null( $attribs ) ) {
- $out .= self::expandAttributes( $attribs );
+ $out .= self::expandAttributes( $attribs );
}
if( is_null( $contents ) ) {
$out .= '>';
}
/**
- * Generate a form (without the opening form element).
- * Output optionally includes a submit button.
- * @param $fields Array Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
- * @param $submitLabel String A message containing a label for the submit button.
- * @return string HTML form.
- */
+ * Generate a form (without the opening form element).
+ * Output optionally includes a submit button.
+ * @param $fields Array Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
+ * @param $submitLabel String A message containing a label for the submit button.
+ * @return string HTML form.
+ */
public static function buildForm( $fields, $submitLabel = null ) {
$form = '';
$form .= "<table><tbody>";
*
* Because this class is aimed at verification, an error is raised on
* suspicious or ambiguous input, instead of emulating some standard
- * behaviour.
+ * behavior.
*
* @param $fileName string The archive file name
* @param $callback Array The callback function. It will be called for each file
/**
* Add date selector to quickly get to a certain time
*/
- $year = $request->getInt( 'year' );
- $month = $request->getInt( 'month' );
- $tagFilter = $request->getVal( 'tagfilter' );
+ $year = $request->getInt( 'year' );
+ $month = $request->getInt( 'month' );
+ $tagFilter = $request->getVal( 'tagfilter' );
$tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
/**
// Hide "This page is a member of # hidden categories" explanation
$content .= Html::element( 'style', array(),
- '.mw-hiddenCategoriesExplanation { display: none; }' );
+ '.mw-hiddenCategoriesExplanation { display: none; }' ) . "\n";
// Hide "Templates used on this page" explanation
$content .= Html::element( 'style', array(),
- '.mw-templatesUsedExplanation { display: none; }' );
+ '.mw-templatesUsedExplanation { display: none; }' ) . "\n";
// Get page information
$pageInfo = $this->pageInfo();
// Render page information
foreach ( $pageInfo as $header => $infoTable ) {
- $content .= $this->makeHeader( $this->msg( "pageinfo-${header}" )->escaped() );
- $table = '';
+ $content .= $this->makeHeader( $this->msg( "pageinfo-${header}" )->escaped() ) . "\n";
+ $table = "\n";
foreach ( $infoTable as $infoRow ) {
$name = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->escaped() : $infoRow[0];
$value = ( $infoRow[1] instanceof Message ) ? $infoRow[1]->escaped() : $infoRow[1];
- $table = $this->addRow( $table, $name, $value );
+ $table = $this->addRow( $table, $name, $value ) . "\n";
}
- $content = $this->addTable( $content, $table );
+ $content = $this->addTable( $content, $table ) . "\n";
}
// Page footer
$lastRev = $this->page->getRevision();
$batch = new LinkBatch;
- $firstRevUser = $firstRev->getUserText( Revision::FOR_THIS_USER );
- if ( $firstRevUser !== '' ) {
- $batch->add( NS_USER, $firstRevUser );
- $batch->add( NS_USER_TALK, $firstRevUser );
+ if ( $firstRev ) {
+ $firstRevUser = $firstRev->getUserText( Revision::FOR_THIS_USER );
+ if ( $firstRevUser !== '' ) {
+ $batch->add( NS_USER, $firstRevUser );
+ $batch->add( NS_USER_TALK, $firstRevUser );
+ }
}
- $lastRevUser = $lastRev->getUserText( Revision::FOR_THIS_USER );
- if ( $lastRevUser !== '' ) {
- $batch->add( NS_USER, $lastRevUser );
- $batch->add( NS_USER_TALK, $lastRevUser );
+ if ( $lastRev ) {
+ $lastRevUser = $lastRev->getUserText( Revision::FOR_THIS_USER );
+ if ( $lastRevUser !== '' ) {
+ $batch->add( NS_USER, $lastRevUser );
+ $batch->add( NS_USER_TALK, $lastRevUser );
+ }
}
$batch->execute();
- // Page creator
- $pageInfo['header-edits'][] = array(
- $this->msg( 'pageinfo-firstuser' ),
- Linker::revUserTools( $firstRev )
- );
+ if ( $firstRev ) {
+ // Page creator
+ $pageInfo['header-edits'][] = array(
+ $this->msg( 'pageinfo-firstuser' ),
+ Linker::revUserTools( $firstRev )
+ );
- // Date of page creation
- $pageInfo['header-edits'][] = array(
- $this->msg( 'pageinfo-firsttime' ),
- Linker::linkKnown(
- $title,
- $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ),
- array(),
- array( 'oldid' => $firstRev->getId() )
- )
- );
+ // Date of page creation
+ $pageInfo['header-edits'][] = array(
+ $this->msg( 'pageinfo-firsttime' ),
+ Linker::linkKnown(
+ $title,
+ $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ),
+ array(),
+ array( 'oldid' => $firstRev->getId() )
+ )
+ );
+ }
- // Latest editor
- $pageInfo['header-edits'][] = array(
- $this->msg( 'pageinfo-lastuser' ),
- Linker::revUserTools( $lastRev )
- );
+ if ( $lastRev ) {
+ // Latest editor
+ $pageInfo['header-edits'][] = array(
+ $this->msg( 'pageinfo-lastuser' ),
+ Linker::revUserTools( $lastRev )
+ );
- // Date of latest edit
- $pageInfo['header-edits'][] = array(
- $this->msg( 'pageinfo-lasttime' ),
- Linker::linkKnown(
- $title,
- $lang->userTimeAndDate( $this->page->getTimestamp(), $user ),
- array(),
- array( 'oldid' => $this->page->getLatest() )
- )
- );
+ // Date of latest edit
+ $pageInfo['header-edits'][] = array(
+ $this->msg( 'pageinfo-lasttime' ),
+ Linker::linkKnown(
+ $title,
+ $lang->userTimeAndDate( $this->page->getTimestamp(), $user ),
+ array(),
+ array( 'oldid' => $this->page->getLatest() )
+ )
+ );
+ }
// Total number of edits
$pageInfo['header-edits'][] = array(
return $this->mModuleName;
}
-
/**
* Get the module manager, or null if this module has no sub-modules
* @since 1.21
public function setWarning( $warning ) {
$result = $this->getResult();
$data = $result->getData();
- if ( isset( $data['warnings'][$this->getModuleName()] ) ) {
+ $moduleName = $this->getModuleName();
+ if ( isset( $data['warnings'][$moduleName] ) ) {
// Don't add duplicate warnings
- $warn_regex = preg_quote( $warning, '/' );
- if ( preg_match( "/{$warn_regex}(\\n|$)/", $data['warnings'][$this->getModuleName()]['*'] ) ) {
- return;
+ $oldWarning = $data['warnings'][$moduleName]['*'];
+ $warnPos = strpos( $oldWarning, $warning );
+ // If $warning was found in $oldWarning, check if it starts at 0 or after "\n"
+ if ( $warnPos !== false && ( $warnPos === 0 || $oldWarning[$warnPos - 1] === "\n" ) ) {
+ // Check if $warning is followed by "\n" or the end of the $oldWarning
+ $warnPos += strlen( $warning );
+ if ( strlen( $oldWarning ) <= $warnPos || $oldWarning[$warnPos] === "\n" ) {
+ return;
+ }
}
- $oldwarning = $data['warnings'][$this->getModuleName()]['*'];
// If there is a warning already, append it to the existing one
- $warning = "$oldwarning\n$warning";
- $result->unsetValue( 'warnings', $this->getModuleName() );
+ $warning = "$oldWarning\n$warning";
}
$msg = array();
ApiResult::setContent( $msg, $warning );
$result->disableSizeCheck();
- $result->addValue( 'warnings', $this->getModuleName(), $msg );
+ $result->addValue( 'warnings', $moduleName,
+ $msg, ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP );
$result->enableSizeCheck();
}
if ( $t === '' ) {
$nothingPrompt = 'Can be empty, or ';
} else {
- $choices[] = $t;
+ $choices[] = $t;
}
}
$desc .= $paramPrefix . $nothingPrompt . $prompt;
$desc .= $paramPrefix . $intRangeStr;
}
break;
+ case 'upload':
+ $desc .= $paramPrefix . "Must be posted as a file upload using multipart/form-data";
+ break;
}
}
$pageObj = null;
if ( isset( $params['title'] ) ) {
$titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj ) {
+ if ( !$titleObj || $titleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
if ( !$titleObj->canExist() ) {
? 'watchdefault' : 'watchcreations';
}
# Watch the article based on the user preference
- return (bool)$this->getUser()->getOption( $userOption );
+ return $this->getUser()->getBoolOption( $userOption );
case 'nochange':
return $userWatching;
}
$value = $this->getMain()->getCheck( $encParamName );
+ } elseif ( $type == 'upload' ) {
+ if ( isset( $default ) ) {
+ // Having a default value is not allowed
+ ApiBase::dieDebug( __METHOD__, "File upload param $encParamName's default is set to '$default'. File upload parameters may not have a default." );
+ }
+ if ( $multi ) {
+ ApiBase::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" );
+ }
+ $value = $this->getMain()->getUpload( $encParamName );
+ if ( !$value->exists() ) {
+ // This will get the value without trying to normalize it
+ // (because trying to normalize a large binary file
+ // accidentally uploaded as a field fails spectacularly)
+ $value = $this->getMain()->getRequest()->unsetVal( $encParamName );
+ if ( $value !== null ) {
+ $this->dieUsage(
+ "File upload param $encParamName is not a file upload; " .
+ "be sure to use multipart/form-data for your POST and include " .
+ "a filename in the Content-Disposition header.",
+ "badupload_{$encParamName}"
+ );
+ }
+ }
} else {
$value = $this->getMain()->getVal( $encParamName, $default );
$value = $value[0];
}
break;
+ case 'upload': // nothing to do
+ break;
default:
ApiBase::dieDebug( __METHOD__, "Param $encParamName's type is unknown - $type" );
}
'nocreatetext' => array( 'code' => 'cantcreate-anon', 'info' => "Anonymous users can't create new pages" ),
'movenologintext' => array( 'code' => 'cantmove-anon', 'info' => "Anonymous users can't move pages" ),
'movenotallowed' => array( 'code' => 'cantmove', 'info' => "You don't have permission to move pages" ),
- 'confirmedittext' => array( 'code' => 'confirmemail', 'info' => "You must confirm your e-mail address before you can edit" ),
+ 'confirmedittext' => array( 'code' => 'confirmemail', 'info' => "You must confirm your email address before you can edit" ),
'blockedtext' => array( 'code' => 'blocked', 'info' => "You have been blocked from editing" ),
'autoblockedtext' => array( 'code' => 'autoblocked', 'info' => "Your IP address has been blocked automatically, because it was used by a blocked user" ),
'ipb_already_blocked' => array( 'code' => 'alreadyblocked', 'info' => "The user you tried to block was already blocked" ),
'ipb_blocked_as_range' => array( 'code' => 'blockedasrange', 'info' => "IP address \"\$1\" was blocked as part of range \"\$2\". You can't unblock the IP invidually, but you can unblock the range as a whole." ),
'ipb_cant_unblock' => array( 'code' => 'cantunblock', 'info' => "The block you specified was not found. It may have been unblocked already" ),
- 'mailnologin' => array( 'code' => 'cantsend', 'info' => "You are not logged in, you do not have a confirmed e-mail address, or you are not allowed to send e-mail to other users, so you cannot send e-mail" ),
+ 'mailnologin' => array( 'code' => 'cantsend', 'info' => "You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email" ),
'ipbblocked' => array( 'code' => 'ipbblocked', 'info' => 'You cannot block or unblock users while you are yourself blocked' ),
'ipbnounblockself' => array( 'code' => 'ipbnounblockself', 'info' => 'You are not allowed to unblock yourself' ),
'usermaildisabled' => array( 'code' => 'usermaildisabled', 'info' => "User email has been disabled" ),
- 'blockedemailuser' => array( 'code' => 'blockedfrommail', 'info' => "You have been blocked from sending e-mail" ),
+ 'blockedemailuser' => array( 'code' => 'blockedfrommail', 'info' => "You have been blocked from sending email" ),
'notarget' => array( 'code' => 'notarget', 'info' => "You have not specified a valid target for this action" ),
- 'noemail' => array( 'code' => 'noemail', 'info' => "The user has not specified a valid e-mail address, or has chosen not to receive e-mail from other users" ),
+ 'noemail' => array( 'code' => 'noemail', 'info' => "The user has not specified a valid email address, or has chosen not to receive email from other users" ),
'rcpatroldisabled' => array( 'code' => 'patroldisabled', 'info' => "Patrolling is disabled on this wiki" ),
'markedaspatrollederror-noautopatrol' => array( 'code' => 'noautopatrol', 'info' => "You don't have permission to patrol your own changes" ),
'delete-toobig' => array( 'code' => 'bigdelete', 'info' => "You can't delete this page because it has more than \$1 revisions" ),
'missingtitle-createonly' => array( 'code' => 'missingtitle-createonly', 'info' => "Missing titles can only be protected with 'create'" ),
'cantblock' => array( 'code' => 'cantblock', 'info' => "You don't have permission to block users" ),
'canthide' => array( 'code' => 'canthide', 'info' => "You don't have permission to hide user names from the block log" ),
- 'cantblock-email' => array( 'code' => 'cantblock-email', 'info' => "You don't have permission to block users from sending e-mail through the wiki" ),
+ 'cantblock-email' => array( 'code' => 'cantblock-email', 'info' => "You don't have permission to block users from sending email through the wiki" ),
'unblock-notarget' => array( 'code' => 'notarget', 'info' => "Either the id or the user parameter must be set" ),
'unblock-idanduser' => array( 'code' => 'idanduser', 'info' => "The id and user parameters can't be used together" ),
'cantunblock' => array( 'code' => 'permissiondenied', 'info' => "You don't have permission to unblock users" ),
}
}
+ /**
+ * Die with the $prefix.'badcontinue' error. This call is common enough to make it into the base method.
+ * @param $condition boolean will only die if this value is true
+ * @since 1.21
+ */
+ protected function dieContinueUsageIf( $condition ) {
+ if ( $condition ) {
+ $this->dieUsage(
+ 'Invalid continue param. You should pass the original value returned by the previous query',
+ 'badcontinue' );
+ }
+ }
+
/**
* Return the error message related to a certain array
* @param $error array Element of a getUserPermissionsErrors()-style array
$ret[] = array( 'missingparam', $paramName );
}
}
+ if ( array_key_exists( 'continue', $params ) ) {
+ $ret[] = array(
+ array(
+ 'code' => 'badcontinue',
+ 'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
+ ) );
+ }
}
if ( $this->mustBePosted() ) {
*/
/**
-* API module that facilitates the blocking of users. Requires API write mode
-* to be enabled.
-*
+ * API module that facilitates the blocking of users. Requires API write mode
+ * to be enabled.
+ *
* @ingroup API
*/
class ApiBlock extends ApiBase {
'anononly' => 'Block anonymous users only (i.e. disable anonymous edits for this IP)',
'nocreate' => 'Prevent account creation',
'autoblock' => 'Automatically block the last used IP address, and any subsequent IP addresses they try to login from',
- 'noemail' => 'Prevent user from sending e-mail through the wiki. (Requires the "blockemail" right.)',
+ 'noemail' => 'Prevent user from sending email through the wiki. (Requires the "blockemail" right.)',
'hidename' => 'Hide the username from the block log. (Requires the "hideuser" right.)',
'allowusertalk' => 'Allow the user to edit their own talk page (depends on $wgBlockAllowsUTEdit)',
'reblock' => 'If the user is already blocked, overwrite the existing block',
return $revision;
} elseif( $titleText ) {
$title = Title::newFromText( $titleText );
- if( !$title ) {
+ if( !$title || $title->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
}
return $title->getLatestRevID();
public function getParamDescription() {
$p = $this->getModulePrefix();
return array(
- 'name' => 'User Name',
+ 'name' => 'Username',
'password' => "Password (ignored if {$p}mailpassword is set)",
- 'domain' => 'Domain (optional)',
+ 'domain' => 'Domain for external authentication (optional)',
'token' => 'Account creation token obtained in first request',
- 'email' => 'Email address of user',
- 'realname' => 'Real Name of user',
- 'mailpassword' => 'Whether to generate and mail a random password to the user',
- 'reason' => "Optional reason for creating the account (used when {$p}mailpassword is set)",
- 'language' => 'Language code to set for the user.'
+ 'email' => 'Email address of user (optional)',
+ 'realname' => 'Real name of user (optional)',
+ 'mailpassword' => 'If set to any value, a random password will be emailed to the user',
+ 'reason' => 'Optional reason for creating the account to be put in the logs',
+ 'language' => 'Language code to set as default for the user (optional, defaults to content language)'
);
}
}
public function getHelpUrls() {
- return 'https://www.mediawiki.org/wiki/API:Account creation';
+ return 'https://www.mediawiki.org/wiki/API:Account_creation';
}
}
$pageObj = $this->getTitleOrPageId( $params );
$titleObj = $pageObj->getTitle();
- if ( $titleObj->isExternal() ) {
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
- }
-
$apiResult = $this->getResult();
if ( $params['redirect'] ) {
if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' ) {
$requestArray['wpStarttime'] = wfTimestamp( TS_MW, $params['starttimestamp'] );
} else {
- $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
+ $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
}
if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) ) {
// TODO: Make them not or check if they still do
$wgTitle = $titleObj;
- $articleObject = new Article( $titleObj );
+ $articleContext = new RequestContext;
+ $articleContext->setRequest( $req );
+ $articleContext->setWikiPage( $pageObj );
+ $articleContext->setUser( $this->getUser() );
+
+ $articleObject = Article::newFromWikiPage( $pageObj, $articleContext );
+
$ep = new EditPage( $articleObject );
// allow editing of non-textual content.
} else {
$r['oldrevid'] = intval( $oldRevId );
$r['newrevid'] = intval( $newRevId );
- $pageObj->clear();
$r['newtimestamp'] = wfTimestamp( TS_ISO_8601,
$pageObj->getTimestamp() );
}
}
public function getHelpUrls() {
- return 'https://www.mediawiki.org/wiki/API:E-mail';
+ return 'https://www.mediawiki.org/wiki/API:Email';
}
}
// Create title for parser
$title_obj = Title::newFromText( $params['title'] );
- if ( !$title_obj ) {
+ if ( !$title_obj || $title_obj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
/**
* Initialize the printer function and prepare the output headers, etc.
- * This method must be the first outputing method during execution.
- * A help screen's header is printed for the HTML-based output
- * @param $isError bool Whether an error message is printed
+ * This method must be the first outputting method during execution.
+ * A human-targeted notice about available formats is printed for the HTML-based output,
+ * except for help screens (caused by either an error in the API parameters,
+ * the calling of action=help, or requesting the root script api.php).
+ * @param $isHelpScreen bool Whether a help screen is going to be shown
*/
- function initPrinter( $isError ) {
+ function initPrinter( $isHelpScreen ) {
if ( $this->mDisabled ) {
return;
}
<?php
- if ( !$isError ) {
+ if ( !$isHelpScreen ) {
?>
<br />
<small>
See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
<a href='<?php echo( $script ); ?>'>API help</a> for more information.
</small>
+<pre style='white-space: pre-wrap;'>
<?php
- }
+ } else { // don't wrap the contents of the <pre> for help screens
+ // because these are actually formatted to rely on
+ // the monospaced font for layout purposes
?>
<pre>
<?php
-
+ }
}
}
}
/**
- * Sets whether the pretty-printer should format *bold* and $italics$
+ * Sets whether the pretty-printer should format *bold*
* @param $help bool
*/
public function setHelp( $help = true ) {
protected function formatHTML( $text ) {
// Escape everything first for full coverage
$text = htmlspecialchars( $text );
-
// encode all comments or tags as safe blue strings
$text = str_replace( '<', '<span style="color:blue;"><', $text );
$text = str_replace( '>', '></span>', $text );
- // identify URLs
- $protos = wfUrlProtocolsWithoutProtRel();
- // This regex hacks around bug 13218 (" included in the URL)
- $text = preg_replace( "#(((?i)$protos).*?)(")?([ \\'\"<>\n]|<|>|")#", '<a href="\\1">\\1</a>\\3\\4', $text );
// identify requests to api.php
$text = preg_replace( "#api\\.php\\?[^ <\n\t]+#", '<a href="\\0">\\0</a>', $text );
if ( $this->mHelp ) {
// make strings inside * bold
$text = preg_replace( "#\\*[^<>\n]+\\*#", '<b>\\0</b>', $text );
- // make strings inside $ italic
- $text = preg_replace( "#\\$[^<>\n]+\\$#", '<b><i>\\0</i></b>', $text );
}
+ // identify URLs
+ $protos = wfUrlProtocolsWithoutProtRel();
+ // This regex hacks around bug 13218 (" included in the URL)
+ $text = preg_replace( "#(((?i)$protos).*?)(")?([ \\'\"<>\n]|<|>|")#", '<a href="\\1">\\1</a>\\3\\4', $text );
/**
* Temporary fix for bad links in help messages. As a special case,
--- /dev/null
+<?php
+/**
+ *
+ * Created on January 3rd, 2013
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class ApiImageRotate extends ApiBase {
+
+ private $mPageSet = null;
+
+ public function __construct( $main, $action ) {
+ parent::__construct( $main, $action );
+ }
+
+ /**
+ * Add all items from $values into the result
+ * @param $result array output
+ * @param $values array values to add
+ * @param $flag string the name of the boolean flag to mark this element
+ * @param $name string if given, name of the value
+ */
+ private static function addValues( array &$result, $values, $flag = null, $name = null ) {
+ foreach ( $values as $val ) {
+ if( $val instanceof Title ) {
+ $v = array();
+ ApiQueryBase::addTitleInfo( $v, $val );
+ } elseif( $name !== null ) {
+ $v = array( $name => $val );
+ } else {
+ $v = $val;
+ }
+ if( $flag !== null ) {
+ $v[$flag] = '';
+ }
+ $result[] = $v;
+ }
+ }
+
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+ $rotation = $params[ 'rotation' ];
+ $user = $this->getUser();
+
+ if( is_null( $rotation ) || $rotation % 90 ) {
+ $this->dieUsage( "Rotation: {$rotation}", 'rotation must be multiple of 90 degrees' );
+ }
+
+ $pageSet = $this->getPageSet();
+ $pageSet->execute();
+
+ $result = array();
+ $result = array();
+
+ self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
+ self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
+ self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' );
+ self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' );
+ self::addValues( $result, $pageSet->getMissingTitles(), 'missing' );
+ self::addValues( $result, $pageSet->getInterwikiTitlesAsResult() );
+
+ foreach ( $pageSet->getTitles() as $title ) {
+ $file = wfFindFile( $title );
+
+ $r = array();
+ $r[ 'title' ] = $title->getFullText();
+ if ( !$file ) {
+ $r['missing'] = '';
+ $r['result'] = 'Failure';
+ $result[] = $r;
+ continue;
+ }
+ $handler = $file->getHandler();
+ if ( !$handler || !$handler->canRotate() ) {
+ $r['invalid'] = '';
+ $r['result'] = 'Failure';
+ $result[] = $r;
+ continue;
+ }
+
+ // Check whether we're allowed to rotate this file
+ $this->checkPermissions( $this->getUser(), $file->getTitle() );
+
+ $srcPath = $file->getLocalRefPath();
+ $ext = strtolower( pathinfo( "$srcPath", PATHINFO_EXTENSION ) );
+ $tmpFile = TempFSFile::factory( 'rotate_', $ext);
+ $dstPath = $tmpFile->getPath();
+ $err = $handler->rotate( $file, array(
+ "srcPath" => $srcPath,
+ "dstPath" => $dstPath,
+ "rotation"=> $rotation
+ ) );
+ if ( !$err ) {
+ $comment = wfMessage( 'rotate-comment' )->numParams( $rotation )->text();
+ $status = $file->upload( $dstPath,
+ $comment, $comment, 0, false, false, $this->getUser() );
+ if ( $status->isGood() ) {
+ $r['result'] = 'Success';
+ } else {
+ $r['result'] = 'Failure';
+ $r['errormessage'] = $this->getResult()->convertStatusToArray( $status );
+ }
+ } else {
+ $r['result'] = 'Failure';
+ $r['errormessage'] = $err->toText();
+ }
+ $result[] = $r;
+ }
+ $apiResult = $this->getResult();
+ $apiResult->setIndexedTagName( $result, 'page' );
+ $apiResult->addValue( null, $this->getModuleName(), $result );
+ }
+
+ /**
+ * Get a cached instance of an ApiPageSet object
+ * @return ApiPageSet
+ */
+ private function getPageSet() {
+ if ( $this->mPageSet === null ) {
+ $this->mPageSet = new ApiPageSet( $this, 0, NS_FILE);
+ }
+ return $this->mPageSet;
+ }
+
+ /**
+ * Checks that the user has permissions to perform rotations.
+ * Dies with usage message on inadequate permissions.
+ * @param $user User The user to check.
+ */
+ protected function checkPermissions( $user, $title ) {
+ $permissionErrors = array_merge(
+ $title->getUserPermissionsErrors( 'edit' , $user ),
+ $title->getUserPermissionsErrors( 'upload' , $user )
+ );
+
+ if ( $permissionErrors ) {
+ $this->dieUsageMsg( $permissionErrors[0] );
+ }
+ }
+
+ public function mustBePosted() {
+ return true;
+ }
+
+ public function isWriteMode() {
+ return true;
+ }
+
+ public function getAllowedParams( $flags = 0 ) {
+ $pageSet = $this->getPageSet();
+ $result = array(
+ 'rotation' => array(
+ ApiBase::PARAM_DFLT => 0,
+ ),
+ 'token' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
+ );
+ if ( $flags ) {
+ $result += $this->getPageSet()->getFinalParams( $flags );
+ }
+ return $result;
+ }
+
+ public function getParamDescription() {
+ $pageSet = $this->getPageSet();
+ return $pageSet->getParamDescription() + array(
+ 'rotation' => 'Degrees to rotate image, values can be 0, 90, 180 or 270',
+ 'token' => 'Edit token. You can get one of these through prop=info',
+ );
+ }
+
+ public function getDescription() {
+ return 'Rotate one or more images';
+ }
+
+ public function needsToken() {
+ return true;
+ }
+
+ public function getTokenSalt() {
+ return '';
+ }
+
+ public function getPossibleErrors() {
+ $pageSet = $this->getPageSet();
+ return array_merge(
+ parent::getPossibleErrors(),
+ $pageSet->getPossibleErrors()
+ );
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=imagerotate&titles=Example.jpg&rotation=90&token=+\\',
+ );
+ }
+}
ApiBase::PARAM_REQUIRED => true
),
'summary' => null,
- 'xml' => null,
+ 'xml' => array(
+ ApiBase::PARAM_TYPE => 'upload',
+ ),
'interwikisource' => array(
ApiBase::PARAM_TYPE => $wgImportSources
),
case LoginForm::ABORTED:
$result['result'] = 'Aborted';
- $result['reason'] = $loginForm->mAbortLoginErrorMsg;
+ $result['reason'] = $loginForm->mAbortLoginErrorMsg;
break;
default:
'import' => 'ApiImport',
'userrights' => 'ApiUserrights',
'options' => 'ApiOptions',
+ 'imagerotate' =>'ApiImageRotate',
);
/**
return;
}
+ // Exit here if the request method was OPTIONS
+ // (assume there will be a followup GET or POST)
+ if ( $this->getRequest()->getMethod() === 'OPTIONS' ) {
+ return;
+ }
+
// In case an error occurs during data output,
// clear the output buffer and print just the error information
ob_start();
wfRunHooks( 'APIAfterExecute', array( &$module ) );
$module->profileOut();
- if ( !$this->mInternalMode ) {
- // Report unused params
- $this->reportUnusedParams();
+ $this->reportUnusedParams();
+ if ( !$this->mInternalMode ) {
//append Debug information
MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
return $this->getRequest()->getCheck( $name );
}
+ /**
+ * Get a request upload, and register the fact that it was used, for logging.
+ *
+ * @since 1.21
+ * @param $name string Parameter name
+ * @return WebRequestUpload
+ */
+ public function getUpload( $name ) {
+ $this->mParamsUsed[$name] = true;
+ return $this->getRequest()->getUpload( $name );
+ }
+
/**
* Report unused parameters, so the client gets a hint in case it gave us parameters we don't know,
* for example in case of spelling mistakes or a missing 'g' prefix for generators.
$paramsUsed = $this->getParamsUsed();
$allParams = $this->getRequest()->getValueNames();
- $unusedParams = array_diff( $allParams, $paramsUsed );
+ if ( !$this->mInternalMode ) {
+ // Printer has not yet executed; don't warn that its parameters are unused
+ $printerParams = array_map(
+ array( $this->mPrinter, 'encodeParamName' ),
+ array_keys( $this->mPrinter->getFinalParams() ?: array() )
+ );
+ $unusedParams = array_diff( $allParams, $paramsUsed, $printerParams );
+ } else {
+ $unusedParams = array_diff( $allParams, $paramsUsed );
+ }
+
if( count( $unusedParams ) ) {
$s = count( $unusedParams ) > 1 ? 's' : '';
$this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
* tell the printer not to escape ampersands so that our links do
* not break.
*/
- $printer->setUnescapeAmps( ( $this->mAction == 'help' || $isError )
- && $printer->getFormat() == 'XML' && $printer->getIsHtml() );
+ $isHelp = $isError || $this->mAction == 'help';
+ $printer->setUnescapeAmps( $isHelp && $printer->getFormat() == 'XML' && $printer->getIsHtml() );
- $printer->initPrinter( $isError );
+ $printer->initPrinter( $isHelp );
$printer->execute();
$printer->closePrinter();
protected function getCredits() {
return array(
'API developers:',
- ' Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-present)',
+ ' Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-2009)',
' Victor Vasiliev - vasilvv at gee mail dot com',
' Bryan Tong Minh - bryan . tongminh @ gmail . com',
' Sam Reed - sam @ reedyboy . net',
- ' Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007, 2012)',
+ ' Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
'',
'Please send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org',
'or file a bug report at https://bugzilla.wikimedia.org/'
* @param $class ApiFormatBase The class implementing this format.
*/
protected function addFormat( $name, $class ) {
- $this->getModuleManager->addModule( $name, 'format', $class );
+ $this->getModuleManager()->addModule( $name, 'format', $class );
}
/**
if ( isset( $params['from'] ) ) {
$fromTitle = Title::newFromText( $params['from'] );
- if ( !$fromTitle ) {
+ if ( !$fromTitle || $fromTitle->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['from'] ) );
}
} elseif ( isset( $params['fromid'] ) ) {
$fromTalk = $fromTitle->getTalkPage();
$toTitle = Title::newFromText( $params['to'] );
- if ( !$toTitle ) {
+ if ( !$toTitle || $toTitle->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['to'] ) );
}
$toTalk = $toTitle->getTalkPage();
*/
/**
-* API module that facilitates the changing of user's preferences.
-* Requires API write mode to be enabled.
-*
+ * API module that facilitates the changing of user's preferences.
+ * Requires API write mode to be enabled.
+ *
* @ingroup API
*/
class ApiOptions extends ApiBase {
$validation = $field->validate( $value, $user->getOptions() );
break;
case 'registered-multiselect':
- // A key for a multiselect option.
+ case 'registered-checkmatrix':
+ // A key for a multiselect or checkmatrix option.
$validation = true;
$value = $value !== null ? (bool) $value : null;
break;
*/
const DISABLE_GENERATORS = 1;
- private $mDbSource, $mParams;
- private $mResolveRedirects, $mConvertTitles, $mAllowGenerator;
+ private $mDbSource;
+ private $mParams;
+ private $mResolveRedirects;
+ private $mConvertTitles;
+ private $mAllowGenerator;
private $mAllPages = array(); // [ns][dbkey] => page_id or negative when missing
private $mTitles = array();
private $mFakePageId = -1;
private $mCacheMode = 'public';
private $mRequestedPageFields = array();
+ private $mDefaultNamespace = NS_MAIN;
/**
* Constructor
* @param $dbSource ApiBase Module implementing getDB().
* Allows PageSet to reuse existing db connection from the shared state like ApiQuery.
* @param $flags int Zero or more flags like DISABLE_GENERATORS
+ * @param $defaultNamespace int the namespace to use if none is specified by a prefix.
* @since 1.21 accepts $flags instead of two boolean values
*/
- public function __construct( ApiBase $dbSource, $flags = 0 ) {
+ public function __construct( ApiBase $dbSource, $flags = 0, $defaultNamespace = NS_MAIN ) {
parent::__construct( $dbSource->getMain(), $dbSource->getModuleName() );
$this->mDbSource = $dbSource;
$this->mAllowGenerator = ( $flags & ApiPageSet::DISABLE_GENERATORS ) == 0;
+ $this->mDefaultNamespace = $defaultNamespace;
$this->profileIn();
$this->mParams = $this->extractRequestParams();
$this->profileOut();
}
+ /**
+ * In case execute() is not called, call this method to mark all relevant parameters as used
+ * This prevents unused parameters from being reported as warnings
+ */
+ public function executeDryRun() {
+ $this->executeInternal( true );
+ }
+
/**
* Populate the PageSet from the request parameters.
*/
public function execute() {
+ $this->executeInternal( false );
+ }
+
+ /**
+ * Populate the PageSet from the request parameters.
+ * @param bool $isDryRun If true, instantiates generator, but only to mark relevant parameters as used
+ */
+ private function executeInternal( $isDryRun ) {
$this->profileIn();
$generatorName = $this->mAllowGenerator ? $this->mParams['generator'] : null;
$tmpPageSet = new ApiPageSet( $dbSource, ApiPageSet::DISABLE_GENERATORS );
$generator->setGeneratorMode( $tmpPageSet );
$this->mCacheMode = $generator->getCacheMode( $generator->extractRequestParams() );
- $generator->requestExtraData( $tmpPageSet );
- $tmpPageSet->execute();
+
+ if ( !$isDryRun ) {
+ $generator->requestExtraData( $tmpPageSet );
+ }
+ $tmpPageSet->executeInternal( $isDryRun );
// populate this pageset with the generator output
$this->profileOut();
$generator->profileIn();
- $generator->executeGenerator( $this );
- wfRunHooks( 'APIQueryGeneratorAfterExecute', array( &$generator, &$this ) );
- $this->resolvePendingRedirects();
+
+ if ( !$isDryRun ) {
+ $generator->executeGenerator( $this );
+ wfRunHooks( 'APIQueryGeneratorAfterExecute', array( &$generator, &$this ) );
+ $this->resolvePendingRedirects();
+ } else {
+ // Prevent warnings from being reported on these parameters
+ $main = $this->getMain();
+ foreach ( $generator->extractRequestParams() as $paramName => $param ) {
+ $main->getVal( $generator->encodeParamName( $paramName ) );
+ }
+ }
$generator->profileOut();
$this->profileIn();
}
$dataSource = 'revids';
}
- // Populate page information with the original user input
- switch( $dataSource ) {
- case 'titles':
- $this->initFromTitles( $this->mParams['titles'] );
- break;
- case 'pageids':
- $this->initFromPageIds( $this->mParams['pageids'] );
- break;
- case 'revids':
- if ( $this->mResolveRedirects ) {
- $this->setWarning( 'Redirect resolution cannot be used together with the revids= parameter. ' .
- 'Any redirects the revids= point to have not been resolved.' );
- }
- $this->mResolveRedirects = false;
- $this->initFromRevIDs( $this->mParams['revids'] );
- break;
- default:
- // Do nothing - some queries do not need any of the data sources.
- break;
+
+ if ( !$isDryRun ) {
+ // Populate page information with the original user input
+ switch( $dataSource ) {
+ case 'titles':
+ $this->initFromTitles( $this->mParams['titles'] );
+ break;
+ case 'pageids':
+ $this->initFromPageIds( $this->mParams['pageids'] );
+ break;
+ case 'revids':
+ if ( $this->mResolveRedirects ) {
+ $this->setWarning( 'Redirect resolution cannot be used together with the revids= parameter. ' .
+ 'Any redirects the revids= point to have not been resolved.' );
+ }
+ $this->mResolveRedirects = false;
+ $this->initFromRevIDs( $this->mParams['revids'] );
+ break;
+ default:
+ // Do nothing - some queries do not need any of the data sources.
+ break;
+ }
}
}
$this->profileOut();
$this->profileDBOut();
}
- $this->initFromQueryResult( $res, $remaining, false ); // process PageIDs
+ $this->initFromQueryResult( $res, $remaining, false ); // process PageIDs
// Resolve any found redirects
$this->resolvePendingRedirects();
/**
* Given an array of title strings, convert them into Title objects.
- * Alternativelly, an array of Title objects may be given.
+ * Alternatively, an array of Title objects may be given.
* This method validates access rights for the title,
* and appends normalization values to the output.
*
* @return LinkBatch
*/
private function processTitlesArray( $titles ) {
- $genderCache = GenderCache::singleton();
- $genderCache->doTitlesArray( $titles, __METHOD__ );
-
+ $usernames = array();
$linkBatch = new LinkBatch();
foreach ( $titles as $title ) {
- $titleObj = is_string( $title ) ? Title::newFromText( $title ) : $title;
+ if ( is_string( $title ) ) {
+ $titleObj = Title::newFromText( $title, $this->mDefaultNamespace );
+ } else {
+ $titleObj = $title;
+ }
if ( !$titleObj ) {
// Handle invalid titles gracefully
- $this->mAllpages[0][$title] = $this->mFakePageId;
+ $this->mAllPages[0][$title] = $this->mFakePageId;
$this->mInvalidTitles[$this->mFakePageId] = $title;
$this->mFakePageId--;
continue; // There's nothing else we can do
}
$unconvertedTitle = $titleObj->getPrefixedText();
$titleWasConverted = false;
- $iw = $titleObj->getInterwiki();
- if ( strval( $iw ) !== '' ) {
+ if ( $titleObj->isExternal() ) {
// This title is an interwiki link.
- $this->mInterwikiTitles[$titleObj->getPrefixedText()] = $iw;
+ $this->mInterwikiTitles[$unconvertedTitle] = $titleObj->getInterwiki();
} else {
// Variants checking
global $wgContLang;
if ( $this->mConvertTitles &&
- count( $wgContLang->getVariants() ) > 1 &&
+ count( $wgContLang->getVariants() ) > 1 &&
!$titleObj->exists() ) {
// Language::findVariantLink will modify titleText and titleObj into
// the canonical variant if possible
} elseif ( is_string( $title ) && $title !== $titleObj->getPrefixedText() ) {
$this->mNormalizedTitles[$title] = $titleObj->getPrefixedText();
}
+
+ // Need gender information
+ if ( MWNamespace::hasGenderDistinction( $titleObj->getNamespace() ) ) {
+ $usernames[] = $titleObj->getText();
+ }
}
+ // Get gender information
+ $genderCache = GenderCache::singleton();
+ $genderCache->doQuery( $usernames, __METHOD__ );
return $linkBatch;
}
'converttitles' => false,
);
if ( $this->mAllowGenerator ) {
- $result['generator'] = array(
- ApiBase::PARAM_TYPE => $this->getGenerators() );
+ if ( $flags & ApiBase::GET_VALUES_FOR_HELP ) {
+ $result['generator'] = array(
+ ApiBase::PARAM_TYPE => $this->getGenerators()
+ );
+ } else {
+ $result['generator'] = null;
+ }
}
return $result;
}
// we must create it to get module manager
$query = $this->getMain()->getModuleManager()->getModule( 'query' );
}
- $gens = array_keys( $query->getGenerators() );
+ $gens = array();
+ $mgr = $query->getModuleManager();
+ foreach ( $mgr->getNamesWithClasses() as $name => $class ) {
+ if ( is_subclass_of( $class, 'ApiQueryGeneratorBase' ) ) {
+ $gens[] = $name;
+ }
+ }
sort( $gens );
self::$generators = $gens;
}
// TODO: Does this still need $wgTitle?
global $wgParser, $wgTitle;
- // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang
+ // Currently unnecessary, code to act as a safeguard against any change in current behavior of uselang
$oldLang = null;
if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
$oldLang = $this->getContext()->getLanguage(); // Backup language
}
} else { // Not $oldid, $pageid, $page. Hence based on $text
$titleObj = Title::newFromText( $title );
- if ( !$titleObj ) {
+ if ( !$titleObj || $titleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $title ) );
}
if ( !$titleObj->canExist() ) {
'iwbacklinks' => 'ApiQueryIWBacklinks',
'langbacklinks' => 'ApiQueryLangBacklinks',
'logevents' => 'ApiQueryLogEvents',
+ 'pageswithprop' => 'ApiQueryPagesWithProp',
+ 'pagepropnames' => 'ApiQueryPagePropNames',
'protectedtitles' => 'ApiQueryProtectedTitles',
'querypage' => 'ApiQueryQueryPage',
'random' => 'ApiQueryRandom',
'userinfo' => 'ApiQueryUserInfo',
);
- /**
- * List of Api Query generator modules
- * Defined in code, rather than being derived at runtime,
- * due to performance reasons
- * @var array
- */
- private $mQueryGenerators = array(
- 'allcategories' => 'ApiQueryAllCategories',
- 'allimages' => 'ApiQueryAllImages',
- 'alllinks' => 'ApiQueryAllLinks',
- 'allpages' => 'ApiQueryAllPages',
- 'alltransclusions' => 'ApiQueryAllLinks',
- 'backlinks' => 'ApiQueryBacklinks',
- 'categories' => 'ApiQueryCategories',
- 'categorymembers' => 'ApiQueryCategoryMembers',
- 'duplicatefiles' => 'ApiQueryDuplicateFiles',
- 'embeddedin' => 'ApiQueryBacklinks',
- 'exturlusage' => 'ApiQueryExtLinksUsage',
- 'images' => 'ApiQueryImages',
- 'imageusage' => 'ApiQueryBacklinks',
- 'iwbacklinks' => 'ApiQueryIWBacklinks',
- 'langbacklinks' => 'ApiQueryLangBacklinks',
- 'links' => 'ApiQueryLinks',
- 'protectedtitles' => 'ApiQueryProtectedTitles',
- 'querypage' => 'ApiQueryQueryPage',
- 'random' => 'ApiQueryRandom',
- 'recentchanges' => 'ApiQueryRecentChanges',
- 'search' => 'ApiQuerySearch',
- 'templates' => 'ApiQueryLinks',
- 'watchlist' => 'ApiQueryWatchlist',
- 'watchlistraw' => 'ApiQueryWatchlistRaw',
- );
-
/**
* @var ApiPageSet
*/
private $mPageSet;
- private $params;
- private $iwUrl;
+ private $mParams;
private $mNamedDB = array();
private $mModuleMgr;
+ private $mGeneratorContinue;
+ private $mUseLegacyContinue;
/**
* @param $main ApiMain
$this->mModuleMgr->addModules( self::$QueryMetaModules, 'meta' );
$this->mModuleMgr->addModules( $wgAPIMetaModules, 'meta' );
- global $wgAPIGeneratorModules;
- if ( is_array( $wgAPIGeneratorModules ) ) {
- foreach ( $wgAPIGeneratorModules as $moduleName => $moduleClass ) {
- $this->mQueryGenerators[$moduleName] = $moduleClass;
- }
- }
-
// Create PageSet that will process titles/pageids/revids/generator
$this->mPageSet = new ApiPageSet( $this );
}
/**
* Get the generators array mapping module names to class names
+ * @deprecated since 1.21, list of generators is maintained by ApiPageSet
* @return array array(modulename => classname)
*/
public function getGenerators() {
- return $this->mQueryGenerators;
+ wfDeprecated( __METHOD__, '1.21' );
+ $gens = array();
+ foreach ( $this->mModuleMgr->getNamesWithClasses() as $name => $class ) {
+ if ( is_subclass_of( $class, 'ApiQueryGeneratorBase' ) ) {
+ $gens[$name] = $class;
+ }
+ }
+ return $gens;
}
/**
* #5 Execute all requested modules
*/
public function execute() {
- $this->params = $this->extractRequestParams();
- $this->iwUrl = $this->params['iwurl'];
+ $this->mParams = $this->extractRequestParams();
- // Instantiate requested modules
- $modules = array();
- $this->instantiateModules( $modules, 'prop' );
- $this->instantiateModules( $modules, 'list' );
- $this->instantiateModules( $modules, 'meta' );
-
- // Query modules may optimize data requests through the $this->getPageSet()
- // object by adding extra fields from the page table.
- // This function will gather all the extra request fields from the modules.
- foreach ( $modules as $module ) {
- if ( !$this->getRequest()->wasPosted() && $module->mustBePosted() ) {
- $this->dieUsageMsgOrDebug( array( 'mustbeposted', $module->getModuleName() ) );
- }
+ // $pagesetParams is a array of parameter names used by the pageset generator
+ // or null if pageset has already finished and is no longer needed
+ // $completeModules is a set of complete modules with the name as key
+ $this->initContinue( $pagesetParams, $completeModules );
- $module->requestExtraData( $this->mPageSet );
+ // Instantiate requested modules
+ $allModules = array();
+ $this->instantiateModules( $allModules, 'prop' );
+ $propModules = $allModules; // Keep a copy
+ $this->instantiateModules( $allModules, 'list' );
+ $this->instantiateModules( $allModules, 'meta' );
+
+ // Filter modules based on continue parameter
+ $modules = $this->initModules( $allModules, $completeModules, $pagesetParams !== null );
+
+ // Execute pageset if in legacy mode or if pageset is not done
+ if ( $completeModules === null || $pagesetParams !== null ) {
+ // Populate page/revision information
+ $this->mPageSet->execute();
+ // Record page information (title, namespace, if exists, etc)
+ $this->outputGeneralPageInfo();
+ } else {
+ $this->mPageSet->executeDryRun();
}
- // Populate page/revision information
- $this->mPageSet->execute();
$cacheMode = $this->mPageSet->getCacheMode();
- // Record page information (title, namespace, if exists, etc)
- $this->outputGeneralPageInfo();
-
- // Execute all requested modules.
- /**
- * @var $module ApiQueryBase
- */
+ // Execute all unfinished modules
+ /** @var $module ApiQueryBase */
foreach ( $modules as $module ) {
$params = $module->extractRequestParams();
$cacheMode = $this->mergeCacheMode(
// Set the cache mode
$this->getMain()->setCacheMode( $cacheMode );
+
+ if ( $completeModules === null ) {
+ return; // Legacy continue, we are done
+ }
+
+ // Reformat query-continue result section
+ $result = $this->getResult();
+ $qc = $result->getData();
+ if ( isset( $qc['query-continue'] ) ) {
+ $qc = $qc['query-continue'];
+ $result->unsetValue( null, 'query-continue' );
+ } elseif ( $this->mGeneratorContinue !== null ) {
+ $qc = array();
+ } else {
+ // no more "continue"s, we are done!
+ return;
+ }
+
+ // we are done with all the modules that do not have result in query-continue
+ $completeModules = array_merge( $completeModules, array_diff_key( $modules, $qc ) );
+ if ( $pagesetParams !== null ) {
+ // The pageset is still in use, check if all props have finished
+ $incompleteProps = array_intersect_key( $propModules, $qc );
+ if ( count( $incompleteProps ) > 0 ) {
+ // Properties are not done, continue with the same pageset state - copy current parameters
+ $main = $this->getMain();
+ $contValues = array();
+ foreach ( $pagesetParams as $param ) {
+ // The param name is already prefix-encoded
+ $contValues[$param] = $main->getVal( $param );
+ }
+ } elseif ( $this->mGeneratorContinue !== null ) {
+ // Move to the next set of pages produced by pageset, properties need to be restarted
+ $contValues = $this->mGeneratorContinue;
+ $pagesetParams = array_keys( $contValues );
+ $completeModules = array_diff_key( $completeModules, $propModules );
+ } else {
+ // Done with the pageset, finish up with the the lists and meta modules
+ $pagesetParams = null;
+ }
+ }
+
+ $continue = '||' . implode( '|', array_keys( $completeModules ) );
+ if ( $pagesetParams !== null ) {
+ // list of all pageset parameters to use in the next request
+ $continue = implode( '|', $pagesetParams ) . $continue;
+ } else {
+ // we are done with the pageset
+ $contValues = array();
+ $continue = '-' . $continue;
+ }
+ $contValues['continue'] = $continue;
+ foreach ( $qc as $qcModule ) {
+ foreach ( $qcModule as $qcKey => $qcValue ) {
+ $contValues[$qcKey] = $qcValue;
+ }
+ }
+ $this->getResult()->addValue( null, 'continue', $contValues );
+ }
+
+ /**
+ * Parse 'continue' parameter into the list of complete modules and a list of generator parameters
+ * @param array|null $pagesetParams returns list of generator params or null if pageset is done
+ * @param array|null $completeModules returns list of finished modules (as keys), or null if legacy
+ */
+ private function initContinue( &$pagesetParams, &$completeModules ) {
+ $pagesetParams = array();
+ $continue = $this->mParams['continue'];
+ if ( $continue !== null ) {
+ $this->mUseLegacyContinue = false;
+ if ( $continue !== '' ) {
+ // Format: ' pagesetParam1 | pagesetParam2 || module1 | module2 | module3 | ...
+ // If pageset is done, use '-'
+ $continue = explode( '||', $continue );
+ $this->dieContinueUsageIf( count( $continue ) !== 2 );
+ if ( $continue[0] === '-' ) {
+ $pagesetParams = null; // No need to execute pageset
+ } elseif ( $continue[0] !== '' ) {
+ // list of pageset params that might need to be repeated
+ $pagesetParams = explode( '|', $continue[0] );
+ }
+ $continue = $continue[1];
+ }
+ if ( $continue !== '' ) {
+ $completeModules = array_flip( explode( '|', $continue ) );
+ } else {
+ $completeModules = array();
+ }
+ } else {
+ $this->mUseLegacyContinue = true;
+ $completeModules = null;
+ }
+ }
+
+ /**
+ * Validate sub-modules, filter out completed ones, and do requestExtraData()
+ * @param array $allModules An dict of name=>instance of all modules requested by the client
+ * @param array|null $completeModules list of finished modules, or null if legacy continue
+ * @param bool $usePageset True if pageset will be executed
+ * @return array of modules to be processed during this execution
+ */
+ private function initModules( $allModules, $completeModules, $usePageset ) {
+ $modules = $allModules;
+ $tmp = $completeModules;
+ $wasPosted = $this->getRequest()->wasPosted();
+ $main = $this->getMain();
+
+ /** @var $module ApiQueryBase */
+ foreach ( $allModules as $moduleName => $module ) {
+ if ( !$wasPosted && $module->mustBePosted() ) {
+ $this->dieUsageMsgOrDebug( array( 'mustbeposted', $moduleName ) );
+ }
+ if ( $completeModules !== null && array_key_exists( $moduleName, $completeModules ) ) {
+ // If this module is done, mark all its params as used
+ $module->extractRequestParams();
+ // Make sure this module is not used during execution
+ unset( $modules[$moduleName] );
+ unset( $tmp[$moduleName] );
+ } elseif ( $completeModules === null || $usePageset ) {
+ // Query modules may optimize data requests through the $this->getPageSet()
+ // object by adding extra fields from the page table.
+ // This function will gather all the extra request fields from the modules.
+ $module->requestExtraData( $this->mPageSet );
+ } else {
+ // Error - this prop module must have finished before generator is done
+ $this->dieContinueUsageIf( $this->mModuleMgr->getModuleGroup( $moduleName ) === 'prop' );
+ }
+ }
+ $this->dieContinueUsageIf( $completeModules !== null && count( $tmp ) !== 0 );
+ return $modules;
}
/**
* @param $param string Parameter name to read modules from
*/
private function instantiateModules( &$modules, $param ) {
- if ( isset( $this->params[$param] ) ) {
- foreach ( $this->params[$param] as $moduleName ) {
- $modules[] = $this->mModuleMgr->getModule( $moduleName );
+ if ( isset( $this->mParams[$param] ) ) {
+ foreach ( $this->mParams[$param] as $moduleName ) {
+ $instance = $this->mModuleMgr->getModule( $moduleName, $param );
+ if ( $instance === null ) {
+ ApiBase::dieDebug( __METHOD__, 'Error instantiating module' );
+ }
+ // Ignore duplicates. TODO 2.0: die()?
+ if ( !array_key_exists( $moduleName, $modules ) ) {
+ $modules[$moduleName] = $instance;
+ }
}
}
}
if ( $values ) {
$result->addValue( 'query', 'converted', $values );
}
- $values = $pageSet->getInterwikiTitlesAsResult( $result, $this->iwUrl );
+ $values = $pageSet->getInterwikiTitlesAsResult( $result, $this->mParams['iwurl'] );
if ( $values ) {
$result->addValue( 'query', 'interwiki', $values );
}
}
if ( count( $pages ) ) {
- if ( $this->params['indexpageids'] ) {
+ if ( $this->mParams['indexpageids'] ) {
$pageIDs = array_keys( $pages );
// json treats all map keys as strings - converting to match
$pageIDs = array_map( 'strval', $pageIDs );
$result->setIndexedTagName( $pages, 'page' );
$result->addValue( 'query', 'pages', $pages );
}
- if ( $this->params['export'] ) {
+ if ( $this->mParams['export'] ) {
$this->doExport( $pageSet, $result );
}
}
+ /**
+ * This method is called by the generator base when generator in the smart-continue
+ * mode tries to set 'query-continue' value. ApiQuery stores those values separately
+ * until the post-processing when it is known if the generation should continue or repeat.
+ * @param ApiQueryGeneratorBase $module generator module
+ * @param string $paramName
+ * @param mixed $paramValue
+ * @return bool true if processed, false if this is a legacy continue
+ */
+ public function setGeneratorContinue( $module, $paramName, $paramValue ) {
+ if ( $this->mUseLegacyContinue ) {
+ return false;
+ }
+ $paramName = $module->encodeParamName( $paramName );
+ if ( $this->mGeneratorContinue === null ) {
+ $this->mGeneratorContinue = array();
+ }
+ $this->mGeneratorContinue[$paramName] = $paramValue;
+ return true;
+ }
+
/**
* @param $pageSet ApiPageSet Pages to be exported
* @param $result ApiResult Result to output to
// It's not continuable, so it would cause more
// problems than it'd solve
$result->disableSizeCheck();
- if ( $this->params['exportnowrap'] ) {
+ if ( $this->mParams['exportnowrap'] ) {
$result->reset();
// Raw formatter will handle this
$result->addValue( null, 'text', $exportxml );
'export' => false,
'exportnowrap' => false,
'iwurl' => false,
+ 'continue' => null,
);
- if( $flags ) {
+ if ( $flags ) {
$result += $this->getPageSet()->getFinalParams( $flags );
}
return $result;
'export' => 'Export the current revisions of all given or generated pages',
'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export',
'iwurl' => 'Whether to get the full URL if the title is an interwiki link',
+ 'continue' => array(
+ 'When present, formats query-continue as key-value pairs that should simply be merged into the original request.',
+ 'This parameter must be set to an empty string in the initial query.',
+ 'This parameter is recommended for all new development, and will be made default in the next API version.' ),
);
}
public function getExamples() {
return array(
- 'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment',
- 'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions',
+ 'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment&continue=',
+ 'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions&continue=',
);
}
$params = $this->extractRequestParams();
if ( is_null( $params['lang'] ) ) {
- global $wgLang;
- $langObj = $wgLang;
+ $langObj = $this->getLanguage();
} else {
$langObj = Language::factory( $params['lang'] );
}
if ( $params['enableparser'] ) {
if ( !is_null( $params['title'] ) ) {
$title = Title::newFromText( $params['title'] );
- if ( !$title ) {
+ if ( !$title || $title->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
} else {
if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
$this->addTables( 'page_restrictions' );
$this->addWhere( 'page_id=pr_page' );
- $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
+ $this->addWhere( "pr_expiry > {$db->addQuotes( $db->timestamp() )} OR pr_expiry IS NULL" );
if ( count( $params['prtype'] ) ) {
$this->addWhereFld( 'pr_type', $params['prtype'] );
} elseif ( $params['prfiltercascade'] == 'noncascading' ) {
$this->addWhereFld( 'pr_cascade', 0 );
}
-
- $this->addOption( 'DISTINCT' );
}
$forceNameTitleIndex = false;
$this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
}
+ $this->addOption( 'DISTINCT' );
+
} elseif ( isset( $params['prlevel'] ) ) {
$this->dieUsage( 'prlevel may not be used without prtype', 'params' );
}
$this->addFields( array( 'recentedits' => 'COUNT(*)' ) );
$this->addWhere( 'rc_log_type IS NULL OR rc_log_type != ' . $db->addQuotes( 'newusers' ) );
- $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 );
+ $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 );
$this->addWhere( 'rc_timestamp >= ' . $db->addQuotes( $timestamp ) );
$this->addOption( 'GROUP BY', $userFieldToSort );
if ( $fld_rights ) {
if ( !isset( $lastUserData['rights'] ) ) {
if ( $lastUserObj ) {
- $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+ $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
} else {
// This should not normally happen
$lastUserData['rights'] = array();
$this->params = $this->extractRequestParams( false );
$this->redirect = isset( $this->params['redirect'] ) && $this->params['redirect'];
$userMax = ( $this->redirect ? ApiBase::LIMIT_BIG1 / 2 : ApiBase::LIMIT_BIG1 );
- $botMax = ( $this->redirect ? ApiBase::LIMIT_BIG2 / 2 : ApiBase::LIMIT_BIG2 );
+ $botMax = ( $this->redirect ? ApiBase::LIMIT_BIG2 / 2 : ApiBase::LIMIT_BIG2 );
$result = $this->getResult();
$msg = array( $paramName => $paramValue );
$result = $this->getResult();
$result->disableSizeCheck();
- $result->addValue( 'query-continue', $this->getModuleName(), $msg );
+ $result->addValue( 'query-continue', $this->getModuleName(), $msg, ApiResult::ADD_ON_TOP );
$result->enableSizeCheck();
}
- /**
- * Die with the $prefix.'badcontinue' error. This call is common enough to make it into the base method.
- * @param $condition boolean will only die if this value is true
- * @since 1.21
- */
- protected function dieContinueUsageIf( $condition ) {
- if ( $condition ) {
- $this->dieUsage(
- 'Invalid continue param. You should pass the original value returned by the previous query',
- 'badcontinue' );
- }
- }
-
/**
* Get the Query database connection (read-only)
* @return DatabaseBase
array( 'invalidtitle', 'title' ),
array( 'invalidtitle', 'key' ),
) );
- $params = $this->getFinalParams();
- if ( array_key_exists( 'continue', $params ) ) {
- $errors = array_merge( $errors, array(
- array(
- 'code' => 'badcontinue',
- 'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
- ),
- ) );
- }
return $errors;
}
}
}
}
+ /**
+ * Overrides base in case of generator & smart continue to
+ * notify ApiQueryMain instead of adding them to the result right away.
+ * @param $paramName string Parameter name
+ * @param $paramValue string Parameter value
+ */
+ protected function setContinueEnumParameter( $paramName, $paramValue ) {
+ // If this is a generator and query->setGeneratorContinue() returns false, treat as before
+ if ( $this->mGeneratorPageSet === null
+ || !$this->getQuery()->setGeneratorContinue( $this, $paramName, $paramValue )
+ ) {
+ parent::setContinueEnumParameter( $paramName, $paramValue );
+ }
+ }
+
/**
* Execute this module as a generator
* @param $resultPageSet ApiPageSet: All output should be appended to
*/
private function run( $resultPageSet = null ) {
if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
- return; // nothing to do
+ return; // nothing to do
}
$params = $this->extractRequestParams();
$this->addFieldsIf( 'cl_timestamp', $fld_timestamp || $params['sort'] == 'timestamp' );
- $this->addTables( array( 'page', 'categorylinks' ) ); // must be in this order for 'USE INDEX'
+ $this->addTables( array( 'page', 'categorylinks' ) ); // must be in this order for 'USE INDEX'
$this->addWhereFld( 'cl_to', $categoryTitle->getDBkey() );
$queryTypes = $params['type'];
if ( $mode == 'revs' || $mode == 'user' ) {
// Ignore namespace and unique due to inability to know whether they were purposely set
- foreach( array( 'from', 'to', 'prefix', /*'namespace',*/ 'continue', /*'unique'*/ ) as $p ) {
+ foreach( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
if ( !is_null( $params[$p] ) ) {
$this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams' );
}
}
// Check limits
$userMax = $fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1;
- $botMax = $fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2;
+ $botMax = $fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2;
$limit = $params['limit'];
'namespace' => 'Only list pages in this namespace (3)',
'user' => 'Only list revisions by this user',
'excludeuser' => 'Don\'t list revisions by this user',
- 'continue' => 'When more results are available, use this to continue (3)',
+ 'continue' => 'When more results are available, use this to continue (1, 3)',
'unique' => 'List only one revision for each page (3)',
);
}
array( 'code' => 'badparams', 'info' => "The 'from' parameter cannot be used in modes 1 or 2" ),
array( 'code' => 'badparams', 'info' => "The 'to' parameter cannot be used in modes 1 or 2" ),
array( 'code' => 'badparams', 'info' => "The 'prefix' parameter cannot be used in modes 1 or 2" ),
- array( 'code' => 'badparams', 'info' => "The 'continue' parameter cannot be used in modes 1 or 2" ),
array( 'code' => 'badparams', 'info' => "The 'start' parameter cannot be used in mode 3" ),
array( 'code' => 'badparams', 'info' => "The 'end' parameter cannot be used in mode 3" ),
) );
$query = $params['query'];
$protocol = self::getProtocolPrefix( $params['protocol'] );
- $this->addTables( array( 'page', 'externallinks' ) ); // must be in this order for 'USE INDEX'
+ $this->addTables( array( 'page', 'externallinks' ) ); // must be in this order for 'USE INDEX'
$this->addOption( 'USE INDEX', 'el_index' );
$this->addWhere( 'page_id=el_from' );
$file['suppressed'] = '';
}
-
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $file );
if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $row->fa_name );
* @ingroup API
*/
class ApiQueryImageInfo extends ApiQueryBase {
+ const TRANSFORM_LIMIT = 50;
+ private static $transformCount = 0;
public function __construct( $query, $moduleName, $prefix = 'ii' ) {
// We allow a subclass to override the prefix, to create a related API module.
$img = $images[$title];
+ if ( self::getTransformCount() >= self::TRANSFORM_LIMIT ) {
+ if ( count( $pageIds[NS_FILE] ) == 1 ) {
+ // See the 'the user is screwed' comment below
+ $this->setContinueEnumParameter( 'start',
+ $start !== null ? $start : wfTimestamp( TS_ISO_8601, $img->getTimestamp() )
+ );
+ } else {
+ $this->setContinueEnumParameter( 'continue',
+ $this->getContinueStr( $img, $start ) );
+ }
+ break;
+ }
+
$fit = $result->addValue(
array( 'query', 'pages', intval( $pageId ) ),
'imagerepository', $img->getRepoName()
if ( $url ) {
if ( !is_null( $thumbParams ) ) {
$mto = $file->transform( $thumbParams );
+ self::$transformCount++;
if ( $mto && !$mto->isError() ) {
$vals['thumburl'] = wfExpandUrl( $mto->getUrl(), PROTO_CURRENT );
return $vals;
}
+ /**
+ * Get the count of image transformations performed
+ *
+ * If this is >= TRANSFORM_LIMIT, you should probably stop processing images.
+ *
+ * @return integer count
+ */
+ static function getTransformCount() {
+ return self::$transformCount;
+ }
+
/**
*
* @param $metadata Array
*/
private function run( $resultPageSet = null ) {
if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
- return; // nothing to do
+ return; // nothing to do
}
$params = $this->extractRequestParams();
private $fld_protection = false, $fld_talkid = false,
$fld_subjectid = false, $fld_url = false,
- $fld_readable = false, $fld_watched = false, $fld_notificationtimestamp = false,
+ $fld_readable = false, $fld_watched = false, $fld_watchers = false,
+ $fld_notificationtimestamp = false,
$fld_preload = false, $fld_displaytitle = false;
private $params, $titles, $missing, $everything, $pageCounter;
private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched,
$pageLatest, $pageLength;
- private $protections, $watched, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
+ private $protections, $watched, $watchers, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
+ private $showZeroWatchers = false;
private $tokenFunctions;
$prop = array_flip( $this->params['prop'] );
$this->fld_protection = isset( $prop['protection'] );
$this->fld_watched = isset( $prop['watched'] );
+ $this->fld_watchers = isset( $prop['watchers'] );
$this->fld_notificationtimestamp = isset( $prop['notificationtimestamp'] );
$this->fld_talkid = isset( $prop['talkid'] );
$this->fld_subjectid = isset( $prop['subjectid'] );
$this->getWatchedInfo();
}
+ if ( $this->fld_watchers ) {
+ $this->getWatcherInfo();
+ }
+
// Run the talkid/subjectid query if requested
if ( $this->fld_talkid || $this->fld_subjectid ) {
$this->getTSIDs();
$pageInfo['watched'] = '';
}
+ if ( $this->fld_watchers ) {
+ if ( isset( $this->watchers[$ns][$dbkey] ) ) {
+ $pageInfo['watchers'] = $this->watchers[$ns][$dbkey];
+ } elseif ( $this->showZeroWatchers ) {
+ $pageInfo['watchers'] = 0;
+ }
+ }
+
if ( $this->fld_notificationtimestamp ) {
$pageInfo['notificationtimestamp'] = '';
if ( isset( $this->notificationtimestamps[$ns][$dbkey] ) ) {
}
}
+ /**
+ * Get the count of watchers and put it in $this->watchers
+ */
+ private function getWatcherInfo() {
+ global $wgUnwatchedPageThreshold;
+
+ if ( count( $this->everything ) == 0 ) {
+ return;
+ }
+
+ $user = $this->getUser();
+ $canUnwatchedpages = $user->isAllowed( 'unwatchedpages' );
+ if ( !$canUnwatchedpages && !is_int( $wgUnwatchedPageThreshold ) ) {
+ return;
+ }
+
+ $this->watchers = array();
+ $this->showZeroWatchers = $canUnwatchedpages;
+ $db = $this->getDB();
+
+ $lb = new LinkBatch( $this->everything );
+
+ $this->resetQueryParams();
+ $this->addTables( array( 'watchlist' ) );
+ $this->addFields( array( 'wl_title', 'wl_namespace', 'count' => 'COUNT(*)' ) );
+ $this->addWhere( array(
+ $lb->constructSet( 'wl', $db )
+ ) );
+ $this->addOption( 'GROUP BY', array( 'wl_namespace', 'wl_title' ) );
+ if ( !$canUnwatchedpages ) {
+ $this->addOption( 'HAVING', "COUNT(*) >= $wgUnwatchedPageThreshold" );
+ }
+
+ $res = $this->select( __METHOD__ );
+
+ foreach ( $res as $row ) {
+ $this->watchers[$row->wl_namespace][$row->wl_title] = (int)$row->count;
+ }
+ }
+
public function getCacheMode( $params ) {
$publicProps = array(
'protection',
'protection',
'talkid',
'watched', # private
+ 'watchers', # private
'notificationtimestamp', # private
'subjectid',
'url',
' protection - List the protection level of each page',
' talkid - The page ID of the talk page for each non-talk page',
' watched - List the watched status of each page',
+ ' watchers - The number of watchers, if allowed',
' notificationtimestamp - The watchlist notification timestamp of each page',
' subjectid - The page ID of the parent page for each talk page',
' url - Gives a full URL to the page, and also an edit URL',
'watched' => array(
'watched' => 'boolean'
),
+ 'watchers' => array(
+ 'watchers' => array(
+ ApiBase::PROP_TYPE => 'integer',
+ ApiBase::PROP_NULLABLE => true
+ )
+ ),
'notificationtimestamp' => array(
'notificationtimestamp' => array(
ApiBase::PROP_TYPE => 'timestamp',
*/
private function run( $resultPageSet = null ) {
if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
- return; // nothing to do
+ return; // nothing to do
}
$params = $this->extractRequestParams();
--- /dev/null
+<?php
+/**
+ * Created on January 21, 2013
+ *
+ * Copyright © 2013 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ * @author Brad Jorsch
+ */
+
+/**
+ * A query module to list used page props
+ *
+ * @ingroup API
+ * @since 1.21
+ */
+class ApiQueryPagePropNames extends ApiQueryBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'ppn' );
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+
+ $this->addTables( 'page_props' );
+ $this->addFields( 'pp_propname' );
+ $this->addOption( 'DISTINCT' );
+ $this->addOption( 'ORDER BY', 'pp_propname' );
+
+ if ( $params['continue'] ) {
+ $cont = explode( '|', $params['continue'] );
+ $this->dieContinueUsageIf( count( $cont ) != 1 );
+
+ // Add a WHERE clause
+ $this->addWhereRange( 'pp_propname', 'newer', $cont[0], null );
+ }
+
+ $limit = $params['limit'];
+ $this->addOption( 'LIMIT', $limit + 1 );
+
+ $result = $this->getResult();
+ $count = 0;
+ foreach ( $this->select( __METHOD__ ) as $row ) {
+ if ( ++$count > $limit ) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'continue', $row->pp_propname );
+ break;
+ }
+
+ $vals = array();
+ $vals['propname'] = $row->pp_propname;
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'continue', $row->pp_propname );
+ break;
+ }
+ }
+
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'continue' => null,
+ 'limit' => array(
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'continue' => 'When more results are available, use this to continue',
+ 'limit' => 'The maximum number of pages to return',
+ );
+ }
+
+ public function getDescription() {
+ return 'List all page prop names in use on the wiki';
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=query&list=pagepropnames' => 'Get first 10 prop names',
+ );
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Pagepropnames';
+ }
+}
}
# Force a sort order to ensure that properties are grouped by page
- $this->addOption( 'ORDER BY', 'pp_page' );
+ # But only if pp_page is not constant in the WHERE clause.
+ if ( count( $pages ) > 1 ) {
+ $this->addOption( 'ORDER BY', 'pp_page' );
+ }
$res = $this->select( __METHOD__ );
$currentPage = 0; # Id of the page currently processed
public function getAllowedParams() {
return array(
'continue' => null,
- 'prop' => null,
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ),
);
}
public function getParamDescription() {
return array(
'continue' => 'When more results are available, use this to continue',
- 'prop' => 'Page prop to look on the page for. Useful for checking whether a certain page uses a certain page prop.'
+ 'prop' => 'Only list these props. Useful for checking whether a certain page uses a certain page prop',
);
}
--- /dev/null
+<?php
+/**
+ * Created on December 31, 2012
+ *
+ * Copyright © 2012 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ * @author Brad Jorsch
+ */
+
+/**
+ * A query module to enumerate pages that use a particular prop
+ *
+ * @ingroup API
+ * @since 1.21
+ */
+class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'pwp' );
+ }
+
+ public function execute() {
+ $this->run();
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function executeGenerator( $resultPageSet ) {
+ $this->run( $resultPageSet );
+ }
+
+ /**
+ * @param $resultPageSet ApiPageSet
+ * @return void
+ */
+ private function run( $resultPageSet = null ) {
+ $params = $this->extractRequestParams();
+
+ $prop = array_flip( $params['prop'] );
+ $fld_ids = isset( $prop['ids'] );
+ $fld_title = isset( $prop['title'] );
+ $fld_value = isset( $prop['value'] );
+
+ if ( $resultPageSet === null ) {
+ $this->addFields( array( 'page_id' ) );
+ $this->addFieldsIf( array( 'page_title', 'page_namespace' ), $fld_title );
+ $this->addFieldsIf( 'pp_value', $fld_value );
+ } else {
+ $this->addFields( $resultPageSet->getPageTableFields() );
+ }
+ $this->addTables( array( 'page_props', 'page' ) );
+ $this->addWhere( 'pp_page=page_id' );
+ $this->addWhereFld( 'pp_propname', $params['propname'] );
+
+ $dir = ( $params['dir'] == 'ascending' ) ? 'newer' : 'older';
+
+ if ( $params['continue'] ) {
+ $cont = explode( '|', $params['continue'] );
+ $this->dieContinueUsageIf( count( $cont ) != 1 );
+
+ // Add a WHERE clause
+ $from = (int)$cont[0];
+ $this->addWhereRange( 'pp_page', $dir, $from, null );
+ }
+
+ $sort = ( $params['dir'] === 'descending' ? ' DESC' : '' );
+ $this->addOption( 'ORDER BY', 'pp_page' . $sort );
+
+ $limit = $params['limit'];
+ $this->addOption( 'LIMIT', $limit + 1 );
+
+ $result = $this->getResult();
+ $count = 0;
+ foreach ( $this->select( __METHOD__ ) as $row ) {
+ if ( ++$count > $limit ) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'continue', $row->page_id );
+ break;
+ }
+
+ if ( $resultPageSet === null ) {
+ $vals = array();
+ if ( $fld_ids ) {
+ $vals['pageid'] = (int)$row->page_id;
+ }
+ if ( $fld_title ) {
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ ApiQueryBase::addTitleInfo( $vals, $title );
+ }
+ if ( $fld_value ) {
+ $vals['value'] = $row->pp_value;
+ }
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'continue', $row->page_id );
+ break;
+ }
+ } else {
+ $resultPageSet->processDbRow( $row );
+ }
+ }
+
+ if ( $resultPageSet === null ) {
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
+ }
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'propname' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true,
+ ),
+ 'prop' => array(
+ ApiBase::PARAM_DFLT => 'ids|title',
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array (
+ 'ids',
+ 'title',
+ 'value',
+ )
+ ),
+ 'continue' => null,
+ 'limit' => array(
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+ ),
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending',
+ )
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'propname' => 'Page prop for which to enumerate pages',
+ 'prop' => array(
+ 'What pieces of information to include',
+ ' ids - Adds the page ID',
+ ' title - Adds the title and namespace ID of the page',
+ ' value - Adds the value of the page prop',
+ ),
+ 'dir' => 'In which direction to sort',
+ 'continue' => 'When more results are available, use this to continue',
+ 'limit' => 'The maximum number of pages to return',
+ );
+ }
+
+ public function getDescription() {
+ return 'List all pages using a given page prop';
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=query&list=pageswithprop&pwppropname=displaytitle&pwpprop=ids|title|value' => 'Get first 10 pages using {{DISPLAYTITLE:}}',
+ 'api.php?action=query&generator=pageswithprop&gpwppropname=notoc&prop=info' => 'Get page info about first 10 pages using __NOTOC__',
+ );
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Pageswithprop';
+ }
+}
$this->addTables( 'recentchanges' );
$index = array( 'recentchanges' => 'rc_timestamp' ); // May change
$this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
+
+ if ( !is_null( $params['continue'] ) ) {
+ $cont = explode( '|', $params['continue'] );
+ if ( count( $cont ) != 2 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the ' .
+ 'original value returned by the previous query', '_badcontinue' );
+ }
+
+ $timestamp = $this->getDB()->addQuotes( wfTimestamp( TS_MW, $cont[0] ) );
+ $id = intval( $cont[1] );
+ $op = $params['dir'] == 'descending' ? '<' : '>';
+
+ $this->addWhere(
+ "rc_timestamp $op $timestamp OR " .
+ "(rc_timestamp = $timestamp AND " .
+ "rc_id <= $id)"
+ );
+ }
+
+
$this->addWhereFld( 'rc_namespace', $params['namespace'] );
$this->addWhereFld( 'rc_deleted', 0 );
$this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
}
+ $this->addFields( 'rc_id' );
/* Add fields to our query if they are specified as a needed parameter. */
- $this->addFieldsIf( array( 'rc_id', 'rc_this_oldid', 'rc_last_oldid' ), $this->fld_ids );
+ $this->addFieldsIf( array( 'rc_this_oldid', 'rc_last_oldid' ), $this->fld_ids );
$this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
$this->addFieldsIf( 'rc_user', $this->fld_user );
$this->addFieldsIf( 'rc_user_text', $this->fld_user || $this->fld_userid );
foreach ( $res as $row ) {
if ( ++ $count > $params['limit'] ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
- $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+ $this->setContinueEnumParameter( 'continue', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id );
break;
}
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
if ( !$fit ) {
- $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+ $this->setContinueEnumParameter( 'continue', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id );
break;
}
} else {
)
),
'toponly' => false,
+ 'continue' => null,
);
}
'limit' => 'How many total changes to return',
'tag' => 'Only list changes tagged with this tag',
'toponly' => 'Only list changes which are the latest revision',
+ 'continue' => 'When more results are available, use this to continue',
);
}
!is_null( $params['endid'] ) || $params['dir'] === 'newer' ||
!is_null( $params['start'] ) || !is_null( $params['end'] ) );
-
$pageSet = $this->getPageSet();
$pageCount = $pageSet->getGoodTitleCount();
$revCount = $pageSet->getRevisionCount();
$index = array();
$userMax = ( $this->fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1 );
- $botMax = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
+ $botMax = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
$limit = $params['limit'];
if ( $limit == 'max' ) {
$limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
}
protected function appendGeneralInfo( $property ) {
- global $wgContLang;
+ global $wgContLang,
+ $wgDisableLangConversion,
+ $wgDisableTitleConversion;
$data = array();
$mainPage = Title::newMainPage();
$data['dbtype'] = $GLOBALS['wgDBtype'];
$data['dbversion'] = $this->getDB()->getServerVersion();
+ if ( !$wgDisableLangConversion ) {
+ $data['langconversion'] = '';
+ }
+
+ if ( !$wgDisableTitleConversion ) {
+ $data['titleconversion'] = '';
+ }
+
+ if ( $wgContLang->linkPrefixExtension() ) {
+ $data['linkprefix'] = wfMessage( 'linkprefix' )->inContentLanguage()->text();
+ } else {
+ $data['linkprefix'] = '';
+ }
+
+ $linktrail = $wgContLang->linkTrail();
+ if ( $linktrail ) {
+ $data['linktrail'] = $linktrail;
+ } else {
+ $data['linktrail'] = '';
+ }
+
$git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
if ( $git ) {
$data['git-hash'] = $git;
public function appendProtocols( $property ) {
global $wgUrlProtocols;
- $this->getResult()->setIndexedTagName( $wgUrlProtocols, 'p' );
- return $this->getResult()->addValue( 'query', $property, $wgUrlProtocols );
+ // Make a copy of the global so we don't try to set the _element key of it - bug 45130
+ $protocols = array_values( $wgUrlProtocols );
+ $this->getResult()->setIndexedTagName( $protocols, 'p' );
+ return $this->getResult()->addValue( 'query', $property, $protocols );
}
private function formatParserTags( $item ) {
if ( isset( $this->prop['groups'] ) ) {
$vals['groups'] = $user->getEffectiveGroups();
- $result->setIndexedTagName( $vals['groups'], 'g' ); // even if empty
+ $result->setIndexedTagName( $vals['groups'], 'g' ); // even if empty
}
if ( isset( $this->prop['implicitgroups'] ) ) {
$vals['implicitgroups'] = $user->getAutomaticGroups();
- $result->setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
+ $result->setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
}
if ( isset( $this->prop['rights'] ) ) {
// User::getRights() may return duplicate values, strip them
$vals['rights'] = array_values( array_unique( $user->getRights() ) );
- $result->setIndexedTagName( $vals['rights'], 'r' ); // even if empty
+ $result->setIndexedTagName( $vals['rights'], 'r' ); // even if empty
}
if ( isset( $this->prop['changeablegroups'] ) ) {
}
/**
- * Gets all the groups that a user is automatically a member of (implicit groups)
- *
- * @deprecated since 1.20; call User::getAutomaticGroups() directly.
- * @param $user User
- * @return array
- */
+ * Gets all the groups that a user is automatically a member of (implicit groups)
+ *
+ * @deprecated since 1.20; call User::getAutomaticGroups() directly.
+ * @param $user User
+ * @return array
+ */
public static function getAutoGroups( $user ) {
wfDeprecated( __METHOD__, '1.20' );
' rights - Lists all the rights the user(s) has',
' editcount - Adds the user\'s edit count',
' registration - Adds the user\'s registration timestamp',
- ' emailable - Tags if the user can and wants to receive e-mail through [[Special:Emailuser]]',
+ ' emailable - Tags if the user can and wants to receive email through [[Special:Emailuser]]',
' gender - Tags the gender of the user. Returns "male", "female", or "unknown"',
),
'users' => 'A list of users to obtain the same information for',
*/
class ApiResult extends ApiBase {
+ /**
+ * override existing value in addValue() and setElement()
+ * @since 1.21
+ */
+ const OVERRIDE = 1;
+
+ /**
+ * For addValue() and setElement(), if the value does not exist, add it as the first element.
+ * In case the new value has no name (numerical index), all indexes will be renumbered.
+ * @since 1.21
+ */
+ const ADD_ON_TOP = 2;
+
private $mData, $mIsRawMode, $mSize, $mCheckingSize;
/**
* @param $arr array to add $value to
* @param $name string Index of $arr to add $value at
* @param $value mixed
- * @param $overwrite bool Whether overwriting an existing element is allowed
+ * @param $flags int Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This parameter used to be
+ * boolean, and the value of OVERRIDE=1 was specifically chosen so that it would be backwards
+ * compatible with the new method signature.
+ *
+ * @since 1.21 int $flags replaced boolean $override
*/
- public static function setElement( &$arr, $name, $value, $overwrite = false ) {
+ public static function setElement( &$arr, $name, $value, $flags = 0 ) {
if ( $arr === null || $name === null || $value === null || !is_array( $arr ) || is_array( $name ) ) {
ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
}
- if ( !isset ( $arr[$name] ) || $overwrite ) {
- $arr[$name] = $value;
+ $exists = isset( $arr[$name] );
+ if ( !$exists || ( $flags & ApiResult::OVERRIDE ) ) {
+ if ( !$exists && ( $flags & ApiResult::ADD_ON_TOP ) ) {
+ $arr = array( $name => $value ) + $arr;
+ } else {
+ $arr[$name] = $value;
+ }
} elseif ( is_array( $arr[$name] ) && is_array( $value ) ) {
$merged = array_intersect_key( $arr[$name], $value );
if ( !count( $merged ) ) {
* @param $path array|string|null
* @param $name string
* @param $value mixed
- * @param $overwrite bool
- *
+ * @param $flags int Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This parameter used to be
+ * boolean, and the value of OVERRIDE=1 was specifically chosen so that it would be backwards
+ * compatible with the new method signature.
* @return bool True if $value fits in the result, false if not
+ *
+ * @since 1.21 int $flags replaced boolean $override
*/
- public function addValue( $path, $name, $value, $overwrite = false ) {
+ public function addValue( $path, $name, $value, $flags = 0 ) {
global $wgAPIMaxResultSize;
$data = &$this->mData;
$this->mSize = $newsize;
}
- if ( !is_null( $path ) ) {
- if ( is_array( $path ) ) {
- foreach ( $path as $p ) {
- if ( !isset( $data[$p] ) ) {
+ $addOnTop = $flags & ApiResult::ADD_ON_TOP;
+ if ( $path !== null ) {
+ foreach ( (array)$path as $p ) {
+ if ( !isset( $data[$p] ) ) {
+ if ( $addOnTop ) {
+ $data = array( $p => array() ) + $data;
+ $addOnTop = false;
+ } else {
$data[$p] = array();
}
- $data = &$data[$p];
}
- } else {
- if ( !isset( $data[$path] ) ) {
- $data[$path] = array();
- }
- $data = &$data[$path];
+ $data = &$data[$p];
}
}
if ( !$name ) {
- $data[] = $value; // Add list element
+ // Add list element
+ if ( $addOnTop ) {
+ // This element needs to be inserted in the beginning
+ // Numerical indexes will be renumbered
+ array_unshift( $data, $value );
+ } else {
+ // Add new value at the end
+ $data[] = $value;
+ }
} else {
- self::setElement( $data, $name, $value, $overwrite ); // Add named element
+ // Add named element
+ self::setElement( $data, $name, $value, $flags );
}
return true;
}
*/
public function setParsedLimit( $moduleName, $limit ) {
// Add value, allowing overwriting
- $this->addValue( 'limits', $moduleName, $limit, true );
+ $this->addValue( 'limits', $moduleName, $limit, ApiResult::OVERRIDE );
}
/**
* Unset a value previously added to the result set.
* Fails silently if the value isn't found.
* For parameters, see addValue()
- * @param $path array
+ * @param $path array|null
* @param $name string
*/
public function unsetValue( $path, $name ) {
$data = &$this->mData;
- if ( !is_null( $path ) ) {
+ if ( $path !== null ) {
foreach ( (array)$path as $p ) {
if ( !isset( $data[$p] ) ) {
return;
$this->mTitleObj = Title::newFromText( $params['title'] );
- if ( !$this->mTitleObj ) {
+ if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
if ( !$this->mTitleObj->exists() ) {
public function getDescription() {
return array( 'Update the notification timestamp for watched pages.',
'This affects the highlighting of changed pages in the watchlist and history,',
- 'and the sending of email when the "E-mail me when a page on my watchlist is',
+ 'and the sending of email when the "Email me when a page on my watchlist is',
'changed" preference is enabled.'
);
}
* @file
*/
-
/**
* @ingroup API
*/
class ApiTokens extends ApiBase {
public function execute() {
- wfProfileIn( __METHOD__ );
$params = $this->extractRequestParams();
$res = array();
$types = $this->getTokenTypes();
foreach ( $params['type'] as $type ) {
- $type = strtolower( $type );
-
$val = call_user_func( $types[$type], null, null );
if ( $val === false ) {
}
$this->getResult()->addValue( null, $this->getModuleName(), $res );
- wfProfileOut( __METHOD__ );
}
private function getTokenTypes() {
return $types;
}
wfProfileIn( __METHOD__ );
- $types = array( 'patrol' => 'ApiQueryRecentChanges::getPatrolToken' );
+ $types = array( 'patrol' => array( 'ApiQueryRecentChanges', 'getPatrolToken' ) );
$names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
'email', 'import', 'watch', 'options' );
foreach ( $names as $name ) {
- $types[$name] = 'ApiQueryInfo::get' . ucfirst( $name ) . 'Token';
+ $types[$name] = array( 'ApiQueryInfo', 'get' . ucfirst( $name ) . 'Token' );
}
wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
ksort( $types );
}
public function getResultProperties() {
- return array(
- '' => array(
- 'patroltoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'edittoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'deletetoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'protecttoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'movetoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'blocktoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'unblocktoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'emailtoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'importtoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'watchtoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'optionstoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- )
- )
+ $props = array(
+ '' => array(),
);
+
+ self::addTokenProperties( $props, $this->getTokenTypes() );
+
+ return $props;
}
public function getParamDescription() {
$res['id'] = $block->getId();
$target = $block->getType() == Block::TYPE_AUTO ? '' : $block->getTarget();
- $res['user'] = $target;
+ $res['user'] = $target instanceof User ? $target->getName() : $target;
$res['userid'] = $target instanceof User ? $target->getId() : 0;
$res['reason'] = $params['reason'];
$this->getResult()->addValue( null, $this->getModuleName(), $res );
}
$titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj ) {
+ if ( !$titleObj || $titleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
protected $mParams;
public function execute() {
+ global $wgEnableAsyncUploads;
+
// Check whether upload is enabled
if ( !UploadBase::isEnabled() ) {
$this->dieUsageMsg( 'uploaddisabled' );
// Parameter handling
$this->mParams = $this->extractRequestParams();
$request = $this->getMain()->getRequest();
- // Check if async mode is actually supported
- $this->mParams['async'] = ( $this->mParams['async'] && !wfIsWindows() );
- $this->mParams['async'] = false; // XXX: disabled per bug 44080
+ // Check if async mode is actually supported (jobs done in cli mode)
+ $this->mParams['async'] = ( $this->mParams['async'] && $wgEnableAsyncUploads );
// Add the uploaded file to the params array
$this->mParams['file'] = $request->getFileName( 'file' );
$this->mParams['chunk'] = $request->getFileName( 'chunk' );
* @return array
*/
private function getChunkResult( $warnings ) {
- global $IP;
-
$result = array();
$result['result'] = 'Continue';
$chunkPath = $request->getFileTempname( 'chunk' );
$chunkSize = $request->getUpload( 'chunk' )->getSize();
if ( $this->mParams['offset'] == 0 ) {
- $result['filekey'] = $this->performStash();
+ $filekey = $this->performStash();
} else {
+ $filekey = $this->mParams['filekey'];
$status = $this->mUpload->addChunk(
$chunkPath, $chunkSize, $this->mParams['offset'] );
if ( !$status->isGood() ) {
$this->dieUsage( $status->getWikiText(), 'stashfailed' );
return array();
}
+ }
- // Check we added the last chunk:
- if( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
- if ( $this->mParams['async'] && !wfIsWindows() ) {
- $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
- if ( $progress && $progress['result'] === 'Poll' ) {
- $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
- }
- UploadBase::setSessionStatus(
- $this->mParams['filekey'],
- array( 'result' => 'Poll',
- 'stage' => 'queued', 'status' => Status::newGood() )
- );
- $retVal = 1;
- $cmd = wfShellWikiCmd(
- "$IP/includes/upload/AssembleUploadChunks.php",
- array(
- '--wiki', wfWikiID(),
- '--filename', $this->mParams['filename'],
- '--filekey', $this->mParams['filekey'],
- '--userid', $this->getUser()->getId(),
- '--sessionid', session_id(),
- '--quiet'
- )
- ) . " < " . wfGetNull() . " > " . wfGetNull() . " 2>&1 &";
- // Start a process in the background. Enforce the time limits via PHP
- // since ulimit4.sh seems to often not work for this particular usage.
- wfShellExec( $cmd, $retVal, array(), array( 'time' => 0, 'memory' => 0 ) );
- if ( $retVal == 0 ) {
- $result['result'] = 'Poll';
- } else {
- UploadBase::setSessionStatus( $this->mParams['filekey'], false );
- $this->dieUsage(
- "Failed to start AssembleUploadChunks.php", 'stashfailed' );
- }
+ // Check we added the last chunk:
+ if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
+ if ( $this->mParams['async'] ) {
+ $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+ if ( $progress && $progress['result'] === 'Poll' ) {
+ $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
+ }
+ UploadBase::setSessionStatus(
+ $this->mParams['filekey'],
+ array( 'result' => 'Poll',
+ 'stage' => 'queued', 'status' => Status::newGood() )
+ );
+ $ok = JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
+ Title::makeTitle( NS_FILE, $this->mParams['filekey'] ),
+ array(
+ 'filename' => $this->mParams['filename'],
+ 'filekey' => $this->mParams['filekey'],
+ 'session' => $this->getRequest()->exportUserSession(),
+ 'userid' => $this->getUser()->getId()
+ )
+ ) );
+ if ( $ok ) {
+ $result['result'] = 'Poll';
} else {
- $status = $this->mUpload->concatenateChunks();
- if ( !$status->isGood() ) {
- $this->dieUsage( $status->getWikiText(), 'stashfailed' );
- return array();
- }
-
- // We have a new filekey for the fully concatenated file.
- $result['filekey'] = $this->mUpload->getLocalFile()->getFileKey();
-
- // Remove chunk from stash. (Checks against user ownership of chunks.)
- $this->mUpload->stash->removeFile( $this->mParams['filekey'] );
-
- $result['result'] = 'Success';
+ UploadBase::setSessionStatus( $this->mParams['filekey'], false );
+ $this->dieUsage(
+ "Failed to start AssembleUploadChunks.php", 'stashfailed' );
}
} else {
- // Continue passing through the filekey for adding further chunks.
- $result['filekey'] = $this->mParams['filekey'];
+ $status = $this->mUpload->concatenateChunks();
+ if ( !$status->isGood() ) {
+ $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+ return array();
+ }
+
+ // The fully concatenated file has a new filekey. So remove
+ // the old filekey and fetch the new one.
+ $this->mUpload->stash->removeFile( $filekey );
+ $filekey = $this->mUpload->getLocalFile()->getFileKey();
+
+ $result['result'] = 'Success';
}
}
+ $result['filekey'] = $filekey;
$result['offset'] = $this->mParams['offset'] + $chunkSize;
return $result;
}
}
}
-
/**
* Check warnings.
* Returns a suitable array for inclusion into API results if there were warnings
return $warnings;
}
-
/**
* Perform the actual upload. Returns a suitable result array on success;
* dies on failure.
* @return array
*/
protected function performUpload( $warnings ) {
- global $IP;
-
// Use comment as initial page text by default
if ( is_null( $this->mParams['text'] ) ) {
$this->mParams['text'] = $this->mParams['comment'];
$this->mParams['filekey'],
array( 'result' => 'Poll', 'stage' => 'queued', 'status' => Status::newGood() )
);
- $retVal = 1;
- $cmd = wfShellWikiCmd(
- "$IP/includes/upload/PublishStashedFile.php",
+ $ok = JobQueueGroup::singleton()->push( new PublishStashedFileJob(
+ Title::makeTitle( NS_FILE, $this->mParams['filename'] ),
array(
- '--wiki', wfWikiID(),
- '--filename', $this->mParams['filename'],
- '--filekey', $this->mParams['filekey'],
- '--userid', $this->getUser()->getId(),
- '--comment', $this->mParams['comment'],
- '--text', $this->mParams['text'],
- '--watch', $watch,
- '--sessionid', session_id(),
- '--quiet'
+ 'filename' => $this->mParams['filename'],
+ 'filekey' => $this->mParams['filekey'],
+ 'comment' => $this->mParams['comment'],
+ 'text' => $this->mParams['text'],
+ 'watch' => $watch,
+ 'session' => $this->getRequest()->exportUserSession(),
+ 'userid' => $this->getUser()->getId()
)
- ) . " < " . wfGetNull() . " > " . wfGetNull() . " 2>&1 &";
- // Start a process in the background. Enforce the time limits via PHP
- // since ulimit4.sh seems to often not work for this particular usage.
- wfShellExec( $cmd, $retVal, array(), array( 'time' => 0, 'memory' => 0 ) );
- if ( $retVal == 0 ) {
+ ) );
+ if ( $ok ) {
$result['result'] = 'Poll';
} else {
UploadBase::setSessionStatus( $this->mParams['filekey'], false );
),
),
'ignorewarnings' => false,
- 'file' => null,
+ 'file' => array(
+ ApiBase::PARAM_TYPE => 'upload',
+ ),
'url' => null,
'filekey' => null,
'sessionkey' => array(
'filesize' => null,
'offset' => null,
- 'chunk' => null,
+ 'chunk' => array(
+ ApiBase::PARAM_TYPE => 'upload',
+ ),
'async' => false,
'asyncdownload' => false,
$params = $this->extractRequestParams();
$title = Title::newFromText( $params['title'] );
- if ( !$title || $title->getNamespace() < 0 ) {
+ if ( !$title || $title->isExternal() || !$title->canExist() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
$res = array( 'title' => $title->getPrefixedText() );
- // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang
+ // Currently unnecessary, code to act as a safeguard against any change in current behavior of uselang
// Copy from ApiParse
$oldLang = null;
if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
*/
protected function getPrefix( $table ) {
static $prefixes = array(
- 'pagelinks' => 'pl',
- 'imagelinks' => 'il',
+ 'pagelinks' => 'pl',
+ 'imagelinks' => 'il',
'categorylinks' => 'cl',
'templatelinks' => 'tl',
- 'redirect' => 'rd',
+ 'redirect' => 'rd',
);
if ( isset( $prefixes[$table] ) ) {
case 'templatelinks':
$conds = array(
"{$prefix}_namespace" => $this->title->getNamespace(),
- "{$prefix}_title" => $this->title->getDBkey(),
+ "{$prefix}_title" => $this->title->getDBkey(),
"page_id={$prefix}_from"
);
break;
case 'redirect':
$conds = array(
"{$prefix}_namespace" => $this->title->getNamespace(),
- "{$prefix}_title" => $this->title->getDBkey(),
+ "{$prefix}_title" => $this->title->getDBkey(),
$this->getDb()->makeList( array(
- "{$prefix}_interwiki = ''",
- "{$prefix}_interwiki is null",
+ "{$prefix}_interwiki" => '',
+ "{$prefix}_interwiki IS NULL",
), LIST_OR ),
"page_id={$prefix}_from"
);
return $cacheEntry['batches'];
}
-
// 4) ... finally fetch from the slow database :(
$this->getLinks( $table );
$cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
}
}
-
/**
* Load a plural XML file with the given filename, compile the relevant
* rules, and save the compiled rules in a process-local cache.
}
/**
- * Get a message from either the content language or the user language.
+ * Get a message from either the content language or the user language. The fallback
+ * language order is the users language fallback union the content language fallback.
+ * This list is then applied to find keys in the following order
+ * 1) MediaWiki:$key/$langcode (for every language except the content language where
+ * we look at MediaWiki:$key)
+ * 2) Built-in messages via the l10n cache which is also in fallback order
*
* @param $key String: the message cache key
- * @param $useDB Boolean: get the message from the DB, false to use only
- * the localisation
- * @param bool|string $langcode Code of the language to get the message for, if
- * it is a valid code create a language for that language,
- * if it is a string but not a valid code then make a basic
- * language object, if it is a false boolean then use the
- * current users language (as a fallback for the old
- * parameter functionality), or if it is a true boolean
- * then use the wikis content language (also as a
- * fallback).
+ * @param $useDB Boolean: If true will look for the message in the DB, false only
+ * get the message from the DB, false to use only the compiled l10n cache.
+ * @param bool|string|object $langcode Code of the language to get the message for.
+ * - If string and a valid code, will create a standard language object
+ * - If string but not a valid code, will create a basic language object
+ * - If boolean and false, create object from the current users language
+ * - If boolean and true, create object from the wikis content language
+ * - If language object, use it as given
* @param $isFullKey Boolean: specifies whether $key is a two part key
* "msg/lang".
*
* @throws MWException
- * @return string|bool
+ * @return string|bool False if the message doesn't exist, otherwise the message
*/
function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
global $wgLanguageCode, $wgContLang;
+ wfProfileIn( __METHOD__ );
+
if ( is_int( $key ) ) {
// "Non-string key given" exception sometimes happens for numerical strings that become ints somewhere on their way here
$key = strval( $key );
}
if ( !is_string( $key ) ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( 'Non-string key given' );
}
if ( strval( $key ) === '' ) {
# Shortcut: the empty key is always missing
+ wfProfileOut( __METHOD__ );
return false;
}
- $lang = wfGetLangObj( $langcode );
- if ( !$lang ) {
- throw new MWException( "Bad lang code $langcode given" );
- }
- $langcode = $lang->getCode();
+ # Obtain the initial language object
+ if ( $isFullKey ) {
+ $keyParts = explode( '/', $key );
+ if ( count( $keyParts ) < 2 ) {
+ throw new MWException( "Message key '$key' does not appear to be a full key." );
+ }
- $message = false;
+ $langcode = array_pop( $keyParts );
+ $key = implode( '/', $keyParts );
+ }
+
+ # Obtain a language object for the requested language from the passed language code
+ # Note that the language code could in fact be a language object already but we assume
+ # it's a string further below.
+ $requestedLangObj = wfGetLangObj( $langcode );
+ if ( !$requestedLangObj ) {
+ wfProfileOut( __METHOD__ );
+ throw new MWException( "Bad lang code $langcode given" );
+ }
+ $langcode = $requestedLangObj->getCode();
# Normalise title-case input (with some inlining)
$lckey = str_replace( ' ', '_', $key );
$uckey = $wgContLang->ucfirst( $lckey );
}
+ # Loop through each language in the fallback list until we find something useful
+ $message = false;
+
# Try the MediaWiki namespace
- if( !$this->mDisable && $useDB ) {
- $title = $uckey;
- if( !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
- $title .= '/' . $langcode;
+ if ( !$this->mDisable && $useDB ) {
+ $fallbackChain = Language::getFallbacksIncludingSiteLanguage( $langcode );
+ array_unshift( $fallbackChain, $langcode );
+
+ foreach ( $fallbackChain as $langcode ) {
+ if ( $langcode === $wgLanguageCode ) {
+ # Messages created in the content language will not have the /lang extension
+ $message = $this->getMsgFromNamespace( $uckey, $langcode );
+ } else {
+ $message = $this->getMsgFromNamespace( "$uckey/$langcode", $langcode );
+ }
+
+ if ( $message !== false ) {
+ break;
+ }
}
- $message = $this->getMsgFromNamespace( $title, $langcode );
}
# Try the array in the language object
if ( $message === false ) {
- $message = $lang->getMessage( $lckey );
- if ( is_null( $message ) ) {
+ $message = $requestedLangObj->getMessage( $lckey );
+ if ( is_null ( $message ) ) {
$message = false;
}
}
- # Try the array of another language
+ # If we still have no message, maybe the key was in fact a full key so try that
if( $message === false ) {
$parts = explode( '/', $lckey );
# We may get calls for things that are http-urls from sidebar
}
}
- # Is this a custom message? Try the default language in the db...
- if( ( $message === false || $message === '-' ) &&
- !$this->mDisable && $useDB &&
- !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
- $message = $this->getMsgFromNamespace( $uckey, $wgLanguageCode );
- }
-
# Final fallback
if( $message === false ) {
+ wfProfileOut( __METHOD__ );
return false;
}
' ' => "\xc2\xa0",
) );
+ wfProfileOut( __METHOD__ );
return $message;
}
array( 'page_namespace', 'page_title' ),
array(
'pl_namespace' => $title->getNamespace(),
- 'pl_title' => $title->getDBkey(),
+ 'pl_title' => $title->getDBkey(),
'pl_from=page_id' ),
__METHOD__ );
$blurlArr = $title->getSquidURLs();
protected $connectTimeout; // string; connection timeout
protected $persistent; // bool; whether connections persist
protected $password; // string; plaintext auth password
- protected $poolSize; // integer; maximum number of idle connections
protected $serializer; // integer; the serializer to use (Redis::SERIALIZER_*)
protected $idlePoolSize = 0; // integer; current idle pool size
* Optional, default is 1 second.
* - persistent : Set this to true to allow connections to persist across
* multiple web requests. False by default.
- * - poolSize : Maximim number of idle connections. Default is 5.
* - password : The authentication password, will be sent to Redis in clear text.
* Optional, if it is unspecified, no AUTH command will be sent.
* - serializer : Set to "php" or "igbinary". Default is "php".
throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
'https://github.com/nicolasff/phpredis' );
}
- $this->connectTimeout = isset( $options['connectTimeout'] )
- ? $options['connectTimeout']
- : 1;
- $this->persistent = isset( $options['persistent'] )
- ? $options['persistent']
- : false;
- $this->password = isset( $options['password'] )
- ? $options['password']
- : '';
- $this->poolSize = isset( $options['poolSize'] )
- ? $options['poolSize']
- : 5;
+ $this->connectTimeout = $options['connectTimeout'];
+ $this->persistent = $options['persistent'];
+ $this->password = $options['password'];
if ( !isset( $options['serializer'] ) || $options['serializer'] === 'php' ) {
$this->serializer = Redis::SERIALIZER_PHP;
} elseif ( $options['serializer'] === 'igbinary' ) {
}
}
+ /**
+ * @param $options Array
+ * @return Array
+ */
+ protected static function applyDefaultConfig( array $options ) {
+ if ( !isset( $options['connectTimeout'] ) ) {
+ $options['connectTimeout'] = 1;
+ }
+ if ( !isset( $options['persistent'] ) ) {
+ $options['persistent'] = false;
+ }
+ if ( !isset( $options['password'] ) ) {
+ $options['password'] = '';
+ }
+ return $options;
+ }
+
/**
* @param $options Array
* @return RedisConnectionPool
*/
public static function singleton( array $options ) {
- ksort( $options ); // normalize
+ $options = self::applyDefaultConfig( $options );
+ // Map the options to a unique hash...
+ ksort( $options ); // normalize to avoid pool fragmentation
$id = sha1( serialize( $options ) );
+ // Initialize the object at the hash as needed...
if ( !isset( self::$instances[$id] ) ) {
self::$instances[$id] = new self( $options );
wfDebug( "Creating a new " . __CLASS__ . " instance with id $id." );
* @return void
*/
protected function closeExcessIdleConections() {
- if ( $this->idlePoolSize <= $this->poolSize ) {
- return; // nothing to do
+ if ( $this->idlePoolSize <= count( $this->connections ) ) {
+ return; // nothing to do (no more connections than servers)
}
foreach ( $this->connections as $server => &$serverConnections ) {
foreach ( $serverConnections as $key => &$connection ) {
if ( $connection['free'] ) {
unset( $serverConnections[$key] );
- if ( --$this->idlePoolSize <= $this->poolSize ) {
- return; // done
+ if ( --$this->idlePoolSize <= count( $this->connections ) ) {
+ return; // done (no more connections than servers)
}
}
}
return $this->getNativeData() === $that->getNativeData();
}
-
/**
* Returns a list of DataUpdate objects for recording information about this
* Content in some secondary data store.
return $parserOutput->getSecondaryDataUpdates( $title, $recursive );
}
-
/**
* @see Content::getRedirectChain
*
* target is hit in order to provide (hopefully) the Title of the final
* destination instead of another redirect.
*
- * There is usually no need to override the default behaviour, subclasses that
+ * There is usually no need to override the default behavior, subclasses that
* want to implement redirects should override getRedirectTarget().
*
* @since 1.21
* form of the content.
* - If $wgContentHandlerTextFallback is 'ignore' and $content is not a
* TextContent object, this method returns null.
- * - otherwise, the behaviour is undefined.
+ * - otherwise, the behavior is undefined.
*
* @since 1.21
*
return new CssContent( $pst );
}
-
protected function getHtml( ) {
$html = "";
$html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
return new JavaScriptContent( $pst );
}
-
protected function getHtml( ) {
$html = "";
$html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
return $diff;
}
-
/**
* Returns a generic ParserOutput object, wrapping the HTML returned by
* getHtml().
return new WikitextContent( '' );
}
-
/**
* Returns a WikitextContent object representing a redirect to the given destination page.
*
return $instance;
}
+ /**
+ * Import the resolved user IP, HTTP headers, and session ID.
+ * This sets the current session and sets $wgUser and $wgRequest.
+ * Once the return value falls out of scope, the old context is restored.
+ * This function can only be called within CLI mode scripts.
+ *
+ * This will setup the session from the given ID. This is useful when
+ * background scripts inherit some context when acting on behalf of a user.
+ *
+ * $param array $params Result of WebRequest::exportUserSession()
+ * @return ScopedCallback
+ * @throws MWException
+ * @since 1.21
+ */
+ public static function importScopedSession( array $params ) {
+ if ( PHP_SAPI !== 'cli' ) {
+ // Don't send random private cookie headers to other random users
+ throw new MWException( "Sessions can only be imported in cli mode." );
+ }
+
+ $importSessionFunction = function( array $params ) {
+ global $wgRequest, $wgUser;
+
+ // Write and close any current session
+ session_write_close(); // persist
+ session_id( '' ); // detach
+ $_SESSION = array(); // clear in-memory array
+ // Load the new session from the session ID
+ if ( strlen( $params['sessionId'] ) ) {
+ wfSetupSession( $params['sessionId'] ); // sets $_SESSION
+ }
+ // Build the new WebRequest object
+ $request = new FauxRequest( array(), false, $_SESSION );
+ $request->setIP( $params['ip'] );
+ foreach ( $params['headers'] as $name => $value ) {
+ $request->setHeader( $name, $value );
+ }
+
+ $context = RequestContext::getMain();
+ // Set the current context to use the new WebRequest
+ $context->setRequest( $request );
+ $wgRequest = $context->getRequest(); // b/c
+ // Set the current user based on the new session and WebRequest
+ $context->setUser( User::newFromSession( $request ) ); // uses $_SESSION
+ $wgUser = $context->getUser(); // b/c
+ };
+
+ // Stash the old session and load in the new one
+ $oldParams = self::getMain()->getRequest()->exportUserSession();
+ $importSessionFunction( $params );
+
+ // Set callback to save and close the new session and reload the old one
+ return new ScopedCallback( function() use ( $importSessionFunction, $oldParams ) {
+ $importSessionFunction( $oldParams );
+ } );
+ }
+
/**
* Create a new extraneous context. The context is filled with information
* external to the current session.
*/
interface IDBAccessObject {
// Constants for object loading bitfield flags (higher => higher QoS)
- const READ_LATEST = 1; // read from the master
+ const READ_LATEST = 1; // read from the master
const READ_LOCKING = 3; // READ_LATEST and "FOR UPDATE"
// Convenience constant for callers to explicitly request slave data
* Fetch the next row from the given result object, in object form.
* Fields can be retrieved with $row->fieldname, with fields acting like
* member variables.
+ * If no more rows are available, false is returned.
*
* @param $res ResultWrapper|object as returned from DatabaseBase::query(), etc.
- * @return Row object
+ * @return object|bool
* @throws DBUnexpectedError Thrown if the database returns an error
*/
function fetchObject( $res );
/**
* Fetch the next row from the given result object, in associative array
* form. Fields are retrieved with $row['fieldname'].
+ * If no more rows are available, false is returned.
*
* @param $res ResultWrapper result object as returned from DatabaseBase::query(), etc.
- * @return Row object
+ * @return array|bool
* @throws DBUnexpectedError Thrown if the database returns an error
*/
function fetchRow( $res );
*/
protected $fileHandle = null;
-
# ------------------------------------------------------------------------------
# Accessors
# ------------------------------------------------------------------------------
* Returns true if this database uses timestamps rather than integers
*
* @return bool
- */
+ */
public function realTimestamps() {
return false;
}
*/
final public static function factory( $dbType, $p = array() ) {
$canonicalDBTypes = array(
- 'mysql', 'postgres', 'sqlite', 'oracle', 'mssql', 'ibm_db2'
+ 'mysql', 'postgres', 'sqlite', 'oracle', 'mssql'
);
$dbType = strtolower( $dbType );
$class = 'Database' . ucfirst( $dbType );
&& in_array( $table, $wgSharedTables ) # A shared table is selected
) {
$database = $wgSharedDB;
- $prefix = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
+ $prefix = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
} else {
$database = null;
$prefix = $this->mTablePrefix; # Default prefix
$sorry = htmlspecialchars( $this->msg( 'dberr-problems', 'Sorry! This site is experiencing technical difficulties.' ) );
$again = htmlspecialchars( $this->msg( 'dberr-again', 'Try waiting a few minutes and reloading.' ) );
- $info = htmlspecialchars( $this->msg( 'dberr-info', '(Can\'t contact the database server: $1)' ) );
+ $info = htmlspecialchars( $this->msg( 'dberr-info', '(Can\'t contact the database server: $1)' ) );
# No database access
MessageCache::singleton()->disable();
+++ /dev/null
-<?php
-/**
- * This is the IBM DB2 database abstraction layer.
- * See maintenance/ibm_db2/README for development notes
- * and other specific information.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- * @author leo.petr+mediawiki@gmail.com
- */
-
-/**
- * This represents a column in a DB2 database
- * @ingroup Database
- */
-class IBM_DB2Field implements Field {
- private $name = '';
- private $tablename = '';
- private $type = '';
- private $nullable = false;
- private $max_length = 0;
-
- /**
- * Builder method for the class
- * @param $db DatabaseIbm_db2: Database interface
- * @param $table String: table name
- * @param $field String: column name
- * @return IBM_DB2Field
- */
- static function fromText( $db, $table, $field ) {
- global $wgDBmwschema;
-
- $q = <<<SQL
-SELECT
-lcase( coltype ) AS typname,
-nulls AS attnotnull, length AS attlen
-FROM sysibm.syscolumns
-WHERE tbcreator=%s AND tbname=%s AND name=%s;
-SQL;
- $res = $db->query(
- sprintf( $q,
- $db->addQuotes( $wgDBmwschema ),
- $db->addQuotes( $table ),
- $db->addQuotes( $field )
- )
- );
- $row = $db->fetchObject( $res );
- if ( !$row ) {
- return null;
- }
- $n = new IBM_DB2Field;
- $n->type = $row->typname;
- $n->nullable = ( $row->attnotnull == 'N' );
- $n->name = $field;
- $n->tablename = $table;
- $n->max_length = $row->attlen;
- return $n;
- }
- /**
- * Get column name
- * @return string column name
- */
- function name() { return $this->name; }
- /**
- * Get table name
- * @return string table name
- */
- function tableName() { return $this->tablename; }
- /**
- * Get column type
- * @return string column type
- */
- function type() { return $this->type; }
- /**
- * Can column be null?
- * @return bool true or false
- */
- function isNullable() { return $this->nullable; }
- /**
- * How much can you fit in the column per row?
- * @return int length
- */
- function maxLength() { return $this->max_length; }
-}
-
-/**
- * Wrapper around binary large objects
- * @ingroup Database
- */
-class IBM_DB2Blob {
- private $mData;
-
- public function __construct( $data ) {
- $this->mData = $data;
- }
-
- public function getData() {
- return $this->mData;
- }
-
- public function __toString() {
- return $this->mData;
- }
-}
-
-/**
- * Wrapper to address lack of certain operations in the DB2 driver
- * ( seek, num_rows )
- * @ingroup Database
- * @since 1.19
- */
-class IBM_DB2Result{
- private $db;
- private $result;
- private $num_rows;
- private $current_pos;
- private $columns = array();
- private $sql;
-
- private $resultSet = array();
- private $loadedLines = 0;
-
- /**
- * Construct and initialize a wrapper for DB2 query results
- * @param $db DatabaseBase
- * @param $result Object
- * @param $num_rows Integer
- * @param $sql String
- * @param $columns Array
- */
- public function __construct( $db, $result, $num_rows, $sql, $columns ) {
- $this->db = $db;
-
- if( $result instanceof ResultWrapper ) {
- $this->result = $result->result;
- } else {
- $this->result = $result;
- }
-
- $this->num_rows = $num_rows;
- $this->current_pos = 0;
- if ( $this->num_rows > 0 ) {
- // Make a lower-case list of the column names
- // By default, DB2 column names are capitalized
- // while MySQL column names are lowercase
-
- // Is there a reasonable maximum value for $i?
- // Setting to 2048 to prevent an infinite loop
- for( $i = 0; $i < 2048; $i++ ) {
- $name = db2_field_name( $this->result, $i );
- if ( $name != false ) {
- continue;
- }
- else {
- return false;
- }
-
- $this->columns[$i] = strtolower( $name );
- }
- }
-
- $this->sql = $sql;
- }
-
- /**
- * Unwrap the DB2 query results
- * @return mixed Object on success, false on failure
- */
- public function getResult() {
- if ( $this->result ) {
- return $this->result;
- }
- else return false;
- }
-
- /**
- * Get the number of rows in the result set
- * @return integer
- */
- public function getNum_rows() {
- return $this->num_rows;
- }
-
- /**
- * Return a row from the result set in object format
- * @return mixed Object on success, false on failure.
- */
- public function fetchObject() {
- if ( $this->result
- && $this->num_rows > 0
- && $this->current_pos >= 0
- && $this->current_pos < $this->num_rows )
- {
- $row = $this->fetchRow();
- $ret = new stdClass();
-
- foreach ( $row as $k => $v ) {
- $lc = $this->columns[$k];
- $ret->$lc = $v;
- }
- return $ret;
- }
- return false;
- }
-
- /**
- * Return a row form the result set in array format
- * @return mixed Array on success, false on failure
- * @throws DBUnexpectedError
- */
- public function fetchRow() {
- if ( $this->result
- && $this->num_rows > 0
- && $this->current_pos >= 0
- && $this->current_pos < $this->num_rows )
- {
- if ( $this->loadedLines <= $this->current_pos ) {
- $row = db2_fetch_array( $this->result );
- $this->resultSet[$this->loadedLines++] = $row;
- if ( $this->db->lastErrno() ) {
- throw new DBUnexpectedError( $this->db, 'Error in fetchRow(): '
- . htmlspecialchars( $this->db->lastError() ) );
- }
- }
-
- if ( $this->loadedLines > $this->current_pos ) {
- return $this->resultSet[$this->current_pos++];
- }
-
- }
- return false;
- }
-
- /**
- * Free a DB2 result object
- * @throws DBUnexpectedError
- */
- public function freeResult() {
- unset( $this->resultSet );
- if ( !@db2_free_result( $this->result ) ) {
- throw new DBUnexpectedError( $this, "Unable to free DB2 result\n" );
- }
- }
-}
-
-/**
- * Primary database interface
- * @ingroup Database
- */
-class DatabaseIbm_db2 extends DatabaseBase {
- /*
- * Inherited members
- protected $mLastQuery = '';
- protected $mPHPError = false;
-
- protected $mServer, $mUser, $mPassword, $mConn = null, $mDBname;
- protected $mOpened = false;
-
- protected $mTablePrefix;
- protected $mFlags;
- protected $mTrxLevel = 0;
- protected $mErrorCount = 0;
- protected $mLBInfo = array();
- protected $mFakeSlaveLag = null, $mFakeMaster = false;
- *
- */
-
- /** Database server port */
- protected $mPort = null;
- /** Schema for tables, stored procedures, triggers */
- protected $mSchema = null;
- /** Whether the schema has been applied in this session */
- protected $mSchemaSet = false;
- /** Result of last query */
- protected $mLastResult = null;
- /** Number of rows affected by last INSERT/UPDATE/DELETE */
- protected $mAffectedRows = null;
- /** Number of rows returned by last SELECT */
- protected $mNumRows = null;
- /** Current row number on the cursor of the last SELECT */
- protected $currentRow = 0;
-
- /** Connection config options - see constructor */
- public $mConnOptions = array();
- /** Statement config options -- see constructor */
- public $mStmtOptions = array();
-
- /** Default schema */
- const USE_GLOBAL = 'get from global';
-
- /** Option that applies to nothing */
- const NONE_OPTION = 0x00;
- /** Option that applies to connection objects */
- const CONN_OPTION = 0x01;
- /** Option that applies to statement objects */
- const STMT_OPTION = 0x02;
-
- /** Regular operation mode -- minimal debug messages */
- const REGULAR_MODE = 'regular';
- /** Installation mode -- lots of debug messages */
- const INSTALL_MODE = 'install';
-
- /** Controls the level of debug message output */
- protected $mMode = self::REGULAR_MODE;
-
- /** Last sequence value used for a primary key */
- protected $mInsertId = null;
-
- ######################################
- # Getters and Setters
- ######################################
-
- /**
- * Returns true if this database supports (and uses) cascading deletes
- * @return bool
- */
- function cascadingDeletes() {
- return true;
- }
-
- /**
- * Returns true if this database supports (and uses) triggers (e.g. on the
- * page table)
- * @return bool
- */
- function cleanupTriggers() {
- return true;
- }
-
- /**
- * Returns true if this database is strict about what can be put into an
- * IP field.
- * Specifically, it uses a NULL value instead of an empty string.
- * @return bool
- */
- function strictIPs() {
- return true;
- }
-
- /**
- * Returns true if this database uses timestamps rather than integers
- * @return bool
- */
- function realTimestamps() {
- return true;
- }
-
- /**
- * Returns true if this database does an implicit sort when doing GROUP BY
- * @return bool
- */
- function implicitGroupby() {
- return false;
- }
-
- /**
- * Returns true if this database does an implicit order by when the column
- * has an index
- * For example: SELECT page_title FROM page LIMIT 1
- * @return bool
- */
- function implicitOrderby() {
- return false;
- }
-
- /**
- * Returns true if this database can do a native search on IP columns
- * e.g. this works as expected: .. WHERE rc_ip = '127.42.12.102/32';
- * @return bool
- */
- function searchableIPs() {
- return true;
- }
-
- /**
- * Returns true if this database can use functional indexes
- * @return bool
- */
- function functionalIndexes() {
- return true;
- }
-
- /**
- * Returns a unique string representing the wiki on the server
- * @return string
- */
- public function getWikiID() {
- if( $this->mSchema ) {
- return "{$this->mDBname}-{$this->mSchema}";
- } else {
- return $this->mDBname;
- }
- }
-
- /**
- * Returns the database software identifieir
- * @return string
- */
- public function getType() {
- return 'ibm_db2';
- }
-
- /**
- * Returns the database connection object
- * @return Object
- */
- public function getDb() {
- return $this->mConn;
- }
-
- /**
- *
- * @param $server String: hostname of database server
- * @param $user String: username
- * @param $password String: password
- * @param $dbName String: database name on the server
- * @param $flags Integer: database behaviour flags (optional, unused)
- * @param $schema String
- */
- public function __construct( $server = false, $user = false,
- $password = false,
- $dbName = false, $flags = 0,
- $schema = self::USE_GLOBAL )
- {
- global $wgDBmwschema;
-
- if ( $schema == self::USE_GLOBAL ) {
- $this->mSchema = $wgDBmwschema;
- } else {
- $this->mSchema = $schema;
- }
-
- // configure the connection and statement objects
- $this->setDB2Option( 'db2_attr_case', 'DB2_CASE_LOWER',
- self::CONN_OPTION | self::STMT_OPTION );
- $this->setDB2Option( 'deferred_prepare', 'DB2_DEFERRED_PREPARE_ON',
- self::STMT_OPTION );
- $this->setDB2Option( 'rowcount', 'DB2_ROWCOUNT_PREFETCH_ON',
- self::STMT_OPTION );
- parent::__construct( $server, $user, $password, $dbName, DBO_TRX | $flags );
- }
-
- /**
- * Enables options only if the ibm_db2 extension version supports them
- * @param $name String: name of the option in the options array
- * @param $const String: name of the constant holding the right option value
- * @param $type Integer: whether this is a Connection or Statement otion
- */
- private function setDB2Option( $name, $const, $type ) {
- if ( defined( $const ) ) {
- if ( $type & self::CONN_OPTION ) {
- $this->mConnOptions[$name] = constant( $const );
- }
- if ( $type & self::STMT_OPTION ) {
- $this->mStmtOptions[$name] = constant( $const );
- }
- } else {
- $this->installPrint(
- "$const is not defined. ibm_db2 version is likely too low." );
- }
- }
-
- /**
- * Outputs debug information in the appropriate place
- * @param $string String: the relevant debug message
- */
- private function installPrint( $string ) {
- wfDebug( "$string\n" );
- if ( $this->mMode == self::INSTALL_MODE ) {
- print "<li><pre>$string</pre></li>";
- flush();
- }
- }
-
- /**
- * Opens a database connection and returns it
- * Closes any existing connection
- *
- * @param $server String: hostname
- * @param $user String
- * @param $password String
- * @param $dbName String: database name
- * @throws DBConnectionError
- * @return DatabaseBase a fresh connection
- */
- public function open( $server, $user, $password, $dbName ) {
- wfProfileIn( __METHOD__ );
-
- # Load IBM DB2 driver if missing
- wfDl( 'ibm_db2' );
-
- # Test for IBM DB2 support, to avoid suppressed fatal error
- if ( !function_exists( 'db2_connect' ) ) {
- throw new DBConnectionError( $this, "DB2 functions missing, have you enabled the ibm_db2 extension for PHP?" );
- }
-
- global $wgDBport;
-
- // Close existing connection
- $this->close();
- // Cache conn info
- $this->mServer = $server;
- $this->mPort = $port = $wgDBport;
- $this->mUser = $user;
- $this->mPassword = $password;
- $this->mDBname = $dbName;
-
- $this->openUncataloged( $dbName, $user, $password, $server, $port );
-
- if ( !$this->mConn ) {
- $this->installPrint( "DB connection error\n" );
- $this->installPrint(
- "Server: $server, Database: $dbName, User: $user, Password: "
- . substr( $password, 0, 3 ) . "...\n" );
- $this->installPrint( $this->lastError() . "\n" );
- wfProfileOut( __METHOD__ );
- wfDebug( "DB connection error\n" );
- wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
- wfDebug( $this->lastError() . "\n" );
- throw new DBConnectionError( $this, $this->lastError() );
- }
-
- // Some MediaWiki code is still transaction-less (?).
- // The strategy is to keep AutoCommit on for that code
- // but switch it off whenever a transaction is begun.
- db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
-
- $this->mOpened = true;
- $this->applySchema();
-
- wfProfileOut( __METHOD__ );
- return $this->mConn;
- }
-
- /**
- * Opens a cataloged database connection, sets mConn
- */
- protected function openCataloged( $dbName, $user, $password ) {
- wfSuppressWarnings();
- $this->mConn = db2_pconnect( $dbName, $user, $password );
- wfRestoreWarnings();
- }
-
- /**
- * Opens an uncataloged database connection, sets mConn
- */
- protected function openUncataloged( $dbName, $user, $password, $server, $port )
- {
- $dsn = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$dbName;CHARSET=UTF-8;HOSTNAME=$server;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
- wfSuppressWarnings();
- $this->mConn = db2_pconnect( $dsn, "", "", array() );
- wfRestoreWarnings();
- }
-
- /**
- * Closes a database connection, if it is open
- * Returns success, true if already closed
- * @return bool
- */
- protected function closeConnection() {
- return db2_close( $this->mConn );
- }
-
- /**
- * Retrieves the most current database error
- * Forces a database rollback
- * @return bool|string
- */
- public function lastError() {
- $connerr = db2_conn_errormsg();
- if ( $connerr ) {
- //$this->rollback( __METHOD__ );
- return $connerr;
- }
- $stmterr = db2_stmt_errormsg();
- if ( $stmterr ) {
- //$this->rollback( __METHOD__ );
- return $stmterr;
- }
-
- return false;
- }
-
- /**
- * Get the last error number
- * Return 0 if no error
- * @return integer
- */
- public function lastErrno() {
- $connerr = db2_conn_error();
- if ( $connerr ) {
- return $connerr;
- }
- $stmterr = db2_stmt_error();
- if ( $stmterr ) {
- return $stmterr;
- }
- return 0;
- }
-
- /**
- * Is a database connection open?
- * @return
- */
- public function isOpen() { return $this->mOpened; }
-
- /**
- * The DBMS-dependent part of query()
- * @param $sql String: SQL query.
- * @throws DBUnexpectedError
- * @return object Result object for fetch functions or false on failure
- */
- protected function doQuery( $sql ) {
- $this->applySchema();
-
- // Needed to handle any UTF-8 encoding issues in the raw sql
- // Note that we fully support prepared statements for DB2
- // prepare() and execute() should be used instead of doQuery() whenever possible
- $sql = utf8_decode( $sql );
-
- $ret = db2_exec( $this->mConn, $sql, $this->mStmtOptions );
- if( $ret == false ) {
- $error = db2_stmt_errormsg();
-
- $this->installPrint( "<pre>$sql</pre>" );
- $this->installPrint( $error );
- throw new DBUnexpectedError( $this, 'SQL error: '
- . htmlspecialchars( $error ) );
- }
- $this->mLastResult = $ret;
- $this->mAffectedRows = null; // Not calculated until asked for
- return $ret;
- }
-
- /**
- * @return string Version information from the database
- */
- public function getServerVersion() {
- $info = db2_server_info( $this->mConn );
- return $info->DBMS_VER;
- }
-
- /**
- * Queries whether a given table exists
- * @return boolean
- */
- public function tableExists( $table, $fname = __METHOD__ ) {
- $schema = $this->mSchema;
-
- $sql = "SELECT COUNT( * ) FROM SYSIBM.SYSTABLES ST WHERE ST.NAME = '" .
- strtoupper( $table ) .
- "' AND ST.CREATOR = '" .
- strtoupper( $schema ) . "'";
- $res = $this->query( $sql );
- if ( !$res ) {
- return false;
- }
-
- // If the table exists, there should be one of it
- $row = $this->fetchRow( $res );
- $count = $row[0];
- if ( $count == '1' || $count == 1 ) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Fetch the next row from the given result object, in object form.
- * Fields can be retrieved with $row->fieldname, with fields acting like
- * member variables.
- *
- * @param $res array|ResultWrapper SQL result object as returned from Database::query(), etc.
- * @return DB2 row object
- * @throws DBUnexpectedError Thrown if the database returns an error
- */
- public function fetchObject( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- wfSuppressWarnings();
- $row = db2_fetch_object( $res );
- wfRestoreWarnings();
- if( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in fetchObject(): '
- . htmlspecialchars( $this->lastError() ) );
- }
- return $row;
- }
-
- /**
- * Fetch the next row from the given result object, in associative array
- * form. Fields are retrieved with $row['fieldname'].
- *
- * @param $res array|ResultWrapper SQL result object as returned from Database::query(), etc.
- * @return ResultWrapper row object
- * @throws DBUnexpectedError Thrown if the database returns an error
- */
- public function fetchRow( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- if ( db2_num_rows( $res ) > 0) {
- wfSuppressWarnings();
- $row = db2_fetch_array( $res );
- wfRestoreWarnings();
- if ( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in fetchRow(): '
- . htmlspecialchars( $this->lastError() ) );
- }
- return $row;
- }
- return false;
- }
-
- /**
- * Escapes strings
- * Doesn't escape numbers
- *
- * @param $s String: string to escape
- * @return string escaped string
- */
- public function addQuotes( $s ) {
- //$this->installPrint( "DB2::addQuotes( $s )\n" );
- if ( is_null( $s ) ) {
- return 'NULL';
- } elseif ( $s instanceof Blob ) {
- return "'" . $s->fetch( $s ) . "'";
- } elseif ( $s instanceof IBM_DB2Blob ) {
- return "'" . $this->decodeBlob( $s ) . "'";
- }
- $s = $this->strencode( $s );
- if ( is_numeric( $s ) ) {
- return $s;
- } else {
- return "'$s'";
- }
- }
-
- /**
- * Verifies that a DB2 column/field type is numeric
- *
- * @param $type String: DB2 column type
- * @return Boolean: true if numeric
- */
- public function is_numeric_type( $type ) {
- switch ( strtoupper( $type ) ) {
- case 'SMALLINT':
- case 'INTEGER':
- case 'INT':
- case 'BIGINT':
- case 'DECIMAL':
- case 'REAL':
- case 'DOUBLE':
- case 'DECFLOAT':
- return true;
- }
- return false;
- }
-
- /**
- * Alias for addQuotes()
- * @param $s String: string to escape
- * @return string escaped string
- */
- public function strencode( $s ) {
- // Bloody useless function
- // Prepends backslashes to \x00, \n, \r, \, ', " and \x1a.
- // But also necessary
- $s = db2_escape_string( $s );
- // Wide characters are evil -- some of them look like '
- $s = utf8_encode( $s );
- // Fix its stupidity
- $from = array( "\\\\", "\\'", '\\n', '\\t', '\\"', '\\r' );
- $to = array( "\\", "''", "\n", "\t", '"', "\r" );
- $s = str_replace( $from, $to, $s ); // DB2 expects '', not \' escaping
- return $s;
- }
-
- /**
- * Switch into the database schema
- */
- protected function applySchema() {
- if ( !( $this->mSchemaSet ) ) {
- $this->mSchemaSet = true;
- $this->begin( __METHOD__ );
- $this->doQuery( "SET SCHEMA = $this->mSchema" );
- $this->commit( __METHOD__ );
- }
- }
-
- /**
- * Start a transaction (mandatory)
- */
- protected function doBegin( $fname = 'DatabaseIbm_db2::begin' ) {
- // BEGIN is implicit for DB2
- // However, it requires that AutoCommit be off.
-
- // Some MediaWiki code is still transaction-less (?).
- // The strategy is to keep AutoCommit on for that code
- // but switch it off whenever a transaction is begun.
- db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_OFF );
-
- $this->mTrxLevel = 1;
- }
-
- /**
- * End a transaction
- * Must have a preceding begin()
- */
- protected function doCommit( $fname = 'DatabaseIbm_db2::commit' ) {
- db2_commit( $this->mConn );
-
- // Some MediaWiki code is still transaction-less (?).
- // The strategy is to keep AutoCommit on for that code
- // but switch it off whenever a transaction is begun.
- db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
-
- $this->mTrxLevel = 0;
- }
-
- /**
- * Cancel a transaction
- */
- protected function doRollback( $fname = 'DatabaseIbm_db2::rollback' ) {
- db2_rollback( $this->mConn );
- // turn auto-commit back on
- // not sure if this is appropriate
- db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
- $this->mTrxLevel = 0;
- }
-
- /**
- * Makes an encoded list of strings from an array
- * $mode:
- * LIST_COMMA - comma separated, no field names
- * LIST_AND - ANDed WHERE clause (without the WHERE)
- * LIST_OR - ORed WHERE clause (without the WHERE)
- * LIST_SET - comma separated with field names, like a SET clause
- * LIST_NAMES - comma separated field names
- * LIST_SET_PREPARED - like LIST_SET, except with ? tokens as values
- * @param array $a
- * @param int $mode
- * @throws DBUnexpectedError
- * @return string
- */
- function makeList( $a, $mode = LIST_COMMA ) {
- if ( !is_array( $a ) ) {
- throw new DBUnexpectedError( $this,
- 'DatabaseIbm_db2::makeList called with incorrect parameters' );
- }
-
- // if this is for a prepared UPDATE statement
- // (this should be promoted to the parent class
- // once other databases use prepared statements)
- if ( $mode == LIST_SET_PREPARED ) {
- $first = true;
- $list = '';
- foreach ( $a as $field => $value ) {
- if ( !$first ) {
- $list .= ", $field = ?";
- } else {
- $list .= "$field = ?";
- $first = false;
- }
- }
- $list .= '';
-
- return $list;
- }
-
- // otherwise, call the usual function
- return parent::makeList( $a, $mode );
- }
-
- /**
- * Construct a LIMIT query with optional offset
- * This is used for query pages
- *
- * @param $sql string SQL query we will append the limit too
- * @param $limit integer the SQL limit
- * @param bool|int $offset SQL offset (default false)
- * @throws DBUnexpectedError
- * @return string
- */
- public function limitResult( $sql, $limit, $offset=false ) {
- if( !is_numeric( $limit ) ) {
- throw new DBUnexpectedError( $this,
- "Invalid non-numeric limit passed to limitResult()\n" );
- }
- if( $offset ) {
- if ( stripos( $sql, 'where' ) === false ) {
- return "$sql AND ( ROWNUM BETWEEN $offset AND $offset+$limit )";
- } else {
- return "$sql WHERE ( ROWNUM BETWEEN $offset AND $offset+$limit )";
- }
- }
- return "$sql FETCH FIRST $limit ROWS ONLY ";
- }
-
- /**
- * Handle reserved keyword replacement in table names
- *
- * @param $name Object
- * @param $format String Ignored parameter Default 'quoted'Boolean
- * @return String
- */
- public function tableName( $name, $format = 'quoted' ) {
- // we want maximum compatibility with MySQL schema
- return $name;
- }
-
- /**
- * Generates a timestamp in an insertable format
- *
- * @param $ts string timestamp
- * @return String: timestamp value
- */
- public function timestamp( $ts = 0 ) {
- // TS_MW cannot be easily distinguished from an integer
- return wfTimestamp( TS_DB2, $ts );
- }
-
- /**
- * Return the next in a sequence, save the value for retrieval via insertId()
- * @param $seqName String: name of a defined sequence in the database
- * @return int next value in that sequence
- */
- public function nextSequenceValue( $seqName ) {
- // Not using sequences in the primary schema to allow for easier migration
- // from MySQL
- // Emulating MySQL behaviour of using NULL to signal that sequences
- // aren't used
- /*
- $safeseq = preg_replace( "/'/", "''", $seqName );
- $res = $this->query( "VALUES NEXTVAL FOR $safeseq" );
- $row = $this->fetchRow( $res );
- $this->mInsertId = $row[0];
- return $this->mInsertId;
- */
- return null;
- }
-
- /**
- * This must be called after nextSequenceVal
- * @return int Last sequence value used as a primary key
- */
- public function insertId() {
- return $this->mInsertId;
- }
-
- /**
- * Updates the mInsertId property with the value of the last insert
- * into a generated column
- *
- * @param $table String: sanitized table name
- * @param $primaryKey Mixed: string name of the primary key
- * @param $stmt Resource: prepared statement resource
- * of the SELECT primary_key FROM FINAL TABLE ( INSERT ... ) form
- */
- private function calcInsertId( $table, $primaryKey, $stmt ) {
- if ( $primaryKey ) {
- $this->mInsertId = db2_last_insert_id( $this->mConn );
- }
- }
-
- /**
- * INSERT wrapper, inserts an array into a table
- *
- * $args may be a single associative array, or an array of arrays
- * with numeric keys, for multi-row insert
- *
- * @param $table String: Name of the table to insert to.
- * @param $args Array: Items to insert into the table.
- * @param $fname String: Name of the function, for profiling
- * @param $options String or Array. Valid options: IGNORE
- *
- * @return bool Success of insert operation. IGNORE always returns true.
- */
- public function insert( $table, $args, $fname = 'DatabaseIbm_db2::insert',
- $options = array() )
- {
- if ( !count( $args ) ) {
- return true;
- }
- // get database-specific table name (not used)
- $table = $this->tableName( $table );
- // format options as an array
- $options = IBM_DB2Helper::makeArray( $options );
- // format args as an array of arrays
- if ( !( isset( $args[0] ) && is_array( $args[0] ) ) ) {
- $args = array( $args );
- }
-
- // prevent insertion of NULL into primary key columns
- list( $args, $primaryKeys ) = $this->removeNullPrimaryKeys( $table, $args );
- // if there's only one primary key
- // we'll be able to read its value after insertion
- $primaryKey = false;
- if ( count( $primaryKeys ) == 1 ) {
- $primaryKey = $primaryKeys[0];
- }
-
- // get column names
- $keys = array_keys( $args[0] );
- $key_count = count( $keys );
-
- // If IGNORE is set, we use savepoints to emulate mysql's behavior
- $ignore = in_array( 'IGNORE', $options ) ? 'mw' : '';
-
- // assume success
- $res = true;
- // If we are not in a transaction, we need to be for savepoint trickery
- if ( !$this->mTrxLevel ) {
- $this->begin( __METHOD__ );
- }
-
- $sql = "INSERT INTO $table ( " . implode( ',', $keys ) . ' ) VALUES ';
- if ( $key_count == 1 ) {
- $sql .= '( ? )';
- } else {
- $sql .= '( ?' . str_repeat( ',?', $key_count-1 ) . ' )';
- }
- $this->installPrint( "Preparing the following SQL:" );
- $this->installPrint( "$sql" );
- $this->installPrint( print_r( $args, true ));
- $stmt = $this->prepare( $sql );
-
- // start a transaction/enter transaction mode
- $this->begin( __METHOD__ );
-
- if ( !$ignore ) {
- //$first = true;
- foreach ( $args as $row ) {
- //$this->installPrint( "Inserting " . print_r( $row, true ));
- // insert each row into the database
- $res = $res & $this->execute( $stmt, $row );
- if ( !$res ) {
- $this->installPrint( 'Last error:' );
- $this->installPrint( $this->lastError() );
- }
- // get the last inserted value into a generated column
- $this->calcInsertId( $table, $primaryKey, $stmt );
- }
- } else {
- $olde = error_reporting( 0 );
- // For future use, we may want to track the number of actual inserts
- // Right now, insert (all writes) simply return true/false
- $numrowsinserted = 0;
-
- // always return true
- $res = true;
-
- foreach ( $args as $row ) {
- $overhead = "SAVEPOINT $ignore ON ROLLBACK RETAIN CURSORS";
- db2_exec( $this->mConn, $overhead, $this->mStmtOptions );
-
- $res2 = $this->execute( $stmt, $row );
-
- if ( !$res2 ) {
- $this->installPrint( 'Last error:' );
- $this->installPrint( $this->lastError() );
- }
- // get the last inserted value into a generated column
- $this->calcInsertId( $table, $primaryKey, $stmt );
-
- $errNum = $this->lastErrno();
- if ( $errNum ) {
- db2_exec( $this->mConn, "ROLLBACK TO SAVEPOINT $ignore",
- $this->mStmtOptions );
- } else {
- db2_exec( $this->mConn, "RELEASE SAVEPOINT $ignore",
- $this->mStmtOptions );
- $numrowsinserted++;
- }
- }
-
- $olde = error_reporting( $olde );
- // Set the affected row count for the whole operation
- $this->mAffectedRows = $numrowsinserted;
- }
- // commit either way
- $this->commit( __METHOD__ );
- $this->freePrepared( $stmt );
-
- return $res;
- }
-
- /**
- * Given a table name and a hash of columns with values
- * Removes primary key columns from the hash where the value is NULL
- *
- * @param $table String: name of the table
- * @param $args Array of hashes of column names with values
- * @return Array: tuple( filtered array of columns, array of primary keys )
- */
- private function removeNullPrimaryKeys( $table, $args ) {
- $schema = $this->mSchema;
-
- // find out the primary keys
- $keyres = $this->doQuery( "SELECT NAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME = '"
- . strtoupper( $table )
- . "' AND TBCREATOR = '"
- . strtoupper( $schema )
- . "' AND KEYSEQ > 0" );
-
- $keys = array();
- for (
- $row = $this->fetchRow( $keyres );
- $row != null;
- $row = $this->fetchRow( $keyres )
- )
- {
- $keys[] = strtolower( $row[0] );
- }
- // remove primary keys
- foreach ( $args as $ai => $row ) {
- foreach ( $keys as $key ) {
- if ( $row[$key] == null ) {
- unset( $row[$key] );
- }
- }
- $args[$ai] = $row;
- }
- // return modified hash
- return array( $args, $keys );
- }
-
- /**
- * UPDATE wrapper, takes a condition array and a SET array
- *
- * @param $table String: The table to UPDATE
- * @param $values array An array of values to SET
- * @param $conds array An array of conditions ( WHERE ). Use '*' to update all rows.
- * @param $fname String: The Class::Function calling this function
- * ( for the log )
- * @param $options array An array of UPDATE options, can be one or
- * more of IGNORE, LOW_PRIORITY
- * @return Boolean
- */
- public function update( $table, $values, $conds, $fname = 'DatabaseIbm_db2::update',
- $options = array() )
- {
- $table = $this->tableName( $table );
- $opts = $this->makeUpdateOptions( $options );
- $sql = "UPDATE $opts $table SET "
- . $this->makeList( $values, LIST_SET_PREPARED );
- if ( $conds != '*' ) {
- $sql .= " WHERE " . $this->makeList( $conds, LIST_AND );
- }
- $stmt = $this->prepare( $sql );
- $this->installPrint( 'UPDATE: ' . print_r( $values, true ) );
- // assuming for now that an array with string keys will work
- // if not, convert to simple array first
- $result = $this->execute( $stmt, $values );
- $this->freePrepared( $stmt );
-
- return $result;
- }
-
- /**
- * DELETE query wrapper
- *
- * Use $conds == "*" to delete all rows
- * @param array $table
- * @param array|string $conds
- * @param string $fname
- * @throws DBUnexpectedError
- * @return bool|ResultWrapper
- */
- public function delete( $table, $conds, $fname = 'DatabaseIbm_db2::delete' ) {
- if ( !$conds ) {
- throw new DBUnexpectedError( $this,
- 'DatabaseIbm_db2::delete() called with no conditions' );
- }
- $table = $this->tableName( $table );
- $sql = "DELETE FROM $table";
- if ( $conds != '*' ) {
- $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
- }
- $result = $this->query( $sql, $fname );
-
- return $result;
- }
-
- /**
- * Returns the number of rows affected by the last query or 0
- * @return Integer: the number of rows affected by the last query
- */
- public function affectedRows() {
- if ( !is_null( $this->mAffectedRows ) ) {
- // Forced result for simulated queries
- return $this->mAffectedRows;
- }
- if( empty( $this->mLastResult ) ) {
- return 0;
- }
- return db2_num_rows( $this->mLastResult );
- }
-
- /**
- * Returns the number of rows in the result set
- * Has to be called right after the corresponding select query
- * @param $res Object result set
- * @return Integer: number of rows
- */
- public function numRows( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
-
- if ( $this->mNumRows ) {
- return $this->mNumRows;
- } else {
- return 0;
- }
- }
-
- /**
- * Moves the row pointer of the result set
- * @param $res Object: result set
- * @param $row Integer: row number
- * @return bool success or failure
- */
- public function dataSeek( $res, $row ) {
- if ( $res instanceof ResultWrapper ) {
- return $res = $res->result;
- }
- if ( $res instanceof IBM_DB2Result ) {
- return $res->dataSeek( $row );
- }
- wfDebug( "dataSeek operation in DB2 database\n" );
- return false;
- }
-
- ###
- # Fix notices in Block.php
- ###
-
- /**
- * Frees memory associated with a statement resource
- * @param $res Object: statement resource to free
- * @throws DBUnexpectedError
- * @return Boolean success or failure
- */
- public function freeResult( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- wfSuppressWarnings();
- $ok = db2_free_result( $res );
- wfRestoreWarnings();
- if ( !$ok ) {
- throw new DBUnexpectedError( $this, "Unable to free DB2 result\n" );
- }
- }
-
- /**
- * Returns the number of columns in a resource
- * @param $res Object: statement resource
- * @return Number of fields/columns in resource
- */
- public function numFields( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- if ( $res instanceof IBM_DB2Result ) {
- $res = $res->getResult();
- }
- return db2_num_fields( $res );
- }
-
- /**
- * Returns the nth column name
- * @param $res Object: statement resource
- * @param $n Integer: Index of field or column
- * @return String name of nth column
- */
- public function fieldName( $res, $n ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- if ( $res instanceof IBM_DB2Result ) {
- $res = $res->getResult();
- }
- return db2_field_name( $res, $n );
- }
-
- /**
- * SELECT wrapper
- *
- * @param $table Array or string, table name(s) (prefix auto-added)
- * @param $vars Array or string, field name(s) to be retrieved
- * @param $conds Array or string, condition(s) for WHERE
- * @param $fname String: calling function name (use __METHOD__)
- * for logs/profiling
- * @param $options array Associative array of options
- * (e.g. array( 'GROUP BY' => 'page_title' )),
- * see Database::makeSelectOptions code for list of
- * supported stuff
- * @param $join_conds array Associative array of table join conditions (optional)
- * (e.g. array( 'page' => array('LEFT JOIN',
- * 'page_latest=rev_id') )
- * @return Mixed: database result resource for fetch functions or false
- * on failure
- */
- public function select( $table, $vars, $conds = '', $fname = 'DatabaseIbm_db2::select', $options = array(), $join_conds = array() )
- {
- $res = parent::select( $table, $vars, $conds, $fname, $options,
- $join_conds );
- $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-
- // We must adjust for offset
- if ( isset( $options['LIMIT'] ) && isset ( $options['OFFSET'] ) ) {
- $limit = $options['LIMIT'];
- $offset = $options['OFFSET'];
- }
-
- // DB2 does not have a proper num_rows() function yet, so we must emulate
- // DB2 9.5.4 and the corresponding ibm_db2 driver will introduce
- // a working one
- // TODO: Yay!
-
- // we want the count
- $vars2 = array( 'count( * ) as num_rows' );
- // respecting just the limit option
- $options2 = array();
- if ( isset( $options['LIMIT'] ) ) {
- $options2['LIMIT'] = $options['LIMIT'];
- }
- // but don't try to emulate for GROUP BY
- if ( isset( $options['GROUP BY'] ) ) {
- return $res;
- }
-
- $res2 = parent::select( $table, $vars2, $conds, $fname, $options2,
- $join_conds );
-
- $obj = $this->fetchObject( $res2 );
- $this->mNumRows = $obj->num_rows;
-
- return new ResultWrapper( $this, new IBM_DB2Result( $this, $res, $obj->num_rows, $vars, $sql ) );
- }
-
- /**
- * Handles ordering, grouping, and having options ('GROUP BY' => colname)
- * Has limited support for per-column options (colnum => 'DISTINCT')
- *
- * @private
- *
- * @param $options array Associative array of options to be turned into
- * an SQL query, valid keys are listed in the function.
- * @return Array
- */
- function makeSelectOptions( $options ) {
- $preLimitTail = $postLimitTail = '';
- $startOpts = '';
-
- $noKeyOptions = array();
- foreach ( $options as $key => $option ) {
- if ( is_numeric( $key ) ) {
- $noKeyOptions[$option] = true;
- }
- }
-
- $preLimitTail .= $this->makeGroupByWithHaving( $options );
-
- $preLimitTail .= $this->makeOrderBy( $options );
-
- if ( isset( $noKeyOptions['DISTINCT'] )
- || isset( $noKeyOptions['DISTINCTROW'] ) )
- {
- $startOpts .= 'DISTINCT';
- }
-
- return array( $startOpts, '', $preLimitTail, $postLimitTail );
- }
-
- /**
- * Returns link to IBM DB2 free download
- * @return String: wikitext of a link to the server software's web site
- */
- public static function getSoftwareLink() {
- return '[http://www.ibm.com/db2/express/ IBM DB2]';
- }
-
- /**
- * Get search engine class. All subclasses of this
- * need to implement this if they wish to use searching.
- *
- * @return String
- */
- public function getSearchEngine() {
- return 'SearchIBM_DB2';
- }
-
- /**
- * Did the last database access fail because of deadlock?
- * @return Boolean
- */
- public function wasDeadlock() {
- // get SQLSTATE
- $err = $this->lastErrno();
- switch( $err ) {
- // This is literal port of the MySQL logic and may be wrong for DB2
- case '40001': // sql0911n, Deadlock or timeout, rollback
- case '57011': // sql0904n, Resource unavailable, no rollback
- case '57033': // sql0913n, Deadlock or timeout, no rollback
- $this->installPrint( "In a deadlock because of SQLSTATE $err" );
- return true;
- }
- return false;
- }
-
- /**
- * Ping the server and try to reconnect if it there is no connection
- * The connection may be closed and reopened while this happens
- * @return Boolean: whether the connection exists
- */
- public function ping() {
- // db2_ping() doesn't exist
- // Emulate
- $this->close();
- $this->openUncataloged( $this->mDBName, $this->mUser,
- $this->mPassword, $this->mServer, $this->mPort );
-
- return false;
- }
- ######################################
- # Unimplemented and not applicable
- ######################################
-
- /**
- * Only useful with fake prepare like in base Database class
- * @return string
- */
- public function fillPreparedArg( $matches ) {
- $this->installPrint( 'Not useful for DB2: fillPreparedArg()' );
- return '';
- }
-
- ######################################
- # Reflection
- ######################################
-
- /**
- * Returns information about an index
- * If errors are explicitly ignored, returns NULL on failure
- * @param $table String: table name
- * @param $index String: index name
- * @param $fname String: function name for logging and profiling
- * @return Object query row in object form
- */
- public function indexInfo( $table, $index,
- $fname = 'DatabaseIbm_db2::indexExists' )
- {
- $table = $this->tableName( $table );
- $sql = <<<SQL
-SELECT name as indexname
-FROM sysibm.sysindexes si
-WHERE si.name='$index' AND si.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-SQL;
- $res = $this->query( $sql, $fname );
- if ( !$res ) {
- return null;
- }
- $row = $this->fetchObject( $res );
- if ( $row != null ) {
- return $row;
- } else {
- return false;
- }
- }
-
- /**
- * Returns an information object on a table column
- * @param $table String: table name
- * @param $field String: column name
- * @return IBM_DB2Field
- */
- public function fieldInfo( $table, $field ) {
- return IBM_DB2Field::fromText( $this, $table, $field );
- }
-
- /**
- * db2_field_type() wrapper
- * @param $res Object: result of executed statement
- * @param $index Mixed: number or name of the column
- * @return String column type
- */
- public function fieldType( $res, $index ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- if ( $res instanceof IBM_DB2Result ) {
- $res = $res->getResult();
- }
- return db2_field_type( $res, $index );
- }
-
- /**
- * Verifies that an index was created as unique
- * @param $table String: table name
- * @param $index String: index name
- * @param $fname string function name for profiling
- * @return Bool
- */
- public function indexUnique ( $table, $index,
- $fname = 'DatabaseIbm_db2::indexUnique' )
- {
- $table = $this->tableName( $table );
- $sql = <<<SQL
-SELECT si.name as indexname
-FROM sysibm.sysindexes si
-WHERE si.name='$index' AND si.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-AND si.uniquerule IN ( 'U', 'P' )
-SQL;
- $res = $this->query( $sql, $fname );
- if ( !$res ) {
- return null;
- }
- if ( $this->fetchObject( $res ) ) {
- return true;
- }
- return false;
-
- }
-
- /**
- * Returns the size of a text field, or -1 for "unlimited"
- * @param $table String: table name
- * @param $field String: column name
- * @return Integer: length or -1 for unlimited
- */
- public function textFieldSize( $table, $field ) {
- $table = $this->tableName( $table );
- $sql = <<<SQL
-SELECT length as size
-FROM sysibm.syscolumns sc
-WHERE sc.name='$field' AND sc.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-SQL;
- $res = $this->query( $sql );
- $row = $this->fetchObject( $res );
- $size = $row->size;
- return $size;
- }
-
- /**
- * Description is left as an exercise for the reader
- * @param $b Mixed: data to be encoded
- * @return IBM_DB2Blob
- */
- public function encodeBlob( $b ) {
- return new IBM_DB2Blob( $b );
- }
-
- /**
- * Description is left as an exercise for the reader
- * @param $b IBM_DB2Blob: data to be decoded
- * @return mixed
- */
- public function decodeBlob( $b ) {
- return "$b";
- }
-
- /**
- * Convert into a list of string being concatenated
- * @param $stringList Array: strings that need to be joined together
- * by the SQL engine
- * @return String: joined by the concatenation operator
- */
- public function buildConcat( $stringList ) {
- // || is equivalent to CONCAT
- // Sample query: VALUES 'foo' CONCAT 'bar' CONCAT 'baz'
- return implode( ' || ', $stringList );
- }
-
- /**
- * Generates the SQL required to convert a DB2 timestamp into a Unix epoch
- * @param $column String: name of timestamp column
- * @return String: SQL code
- */
- public function extractUnixEpoch( $column ) {
- // TODO
- // see SpecialAncientpages
- }
-
- ######################################
- # Prepared statements
- ######################################
-
- /**
- * Intended to be compatible with the PEAR::DB wrapper functions.
- * http://pear.php.net/manual/en/package.database.db.intro-execute.php
- *
- * ? = scalar value, quoted as necessary
- * ! = raw SQL bit (a function for instance)
- * & = filename; reads the file and inserts as a blob
- * (we don't use this though...)
- * @param $sql String: SQL statement with appropriate markers
- * @param $func String: Name of the function, for profiling
- * @return resource a prepared DB2 SQL statement
- */
- public function prepare( $sql, $func = 'DB2::prepare' ) {
- $stmt = db2_prepare( $this->mConn, $sql, $this->mStmtOptions );
- return $stmt;
- }
-
- /**
- * Frees resources associated with a prepared statement
- * @return Boolean success or failure
- */
- public function freePrepared( $prepared ) {
- return db2_free_stmt( $prepared );
- }
-
- /**
- * Execute a prepared query with the various arguments
- * @param $prepared String: the prepared sql
- * @param $args Mixed: either an array here, or put scalars as varargs
- * @return Resource: results object
- */
- public function execute( $prepared, $args = null ) {
- if( !is_array( $args ) ) {
- # Pull the var args
- $args = func_get_args();
- array_shift( $args );
- }
- $res = db2_execute( $prepared, $args );
- if ( !$res ) {
- $this->installPrint( db2_stmt_errormsg() );
- }
- return $res;
- }
-
- /**
- * For faking prepared SQL statements on DBs that don't support
- * it directly.
- * @param $preparedQuery String: a 'preparable' SQL statement
- * @param $args Array of arguments to fill it with
- * @return String: executable statement
- */
- public function fillPrepared( $preparedQuery, $args ) {
- reset( $args );
- $this->preparedArgs =& $args;
-
- foreach ( $args as $i => $arg ) {
- db2_bind_param( $preparedQuery, $i+1, $args[$i] );
- }
-
- return $preparedQuery;
- }
-
- /**
- * Switches module between regular and install modes
- * @return string
- */
- public function setMode( $mode ) {
- $old = $this->mMode;
- $this->mMode = $mode;
- return $old;
- }
-
- /**
- * Bitwise negation of a column or value in SQL
- * Same as (~field) in C
- * @param $field String
- * @return String
- */
- function bitNot( $field ) {
- // expecting bit-fields smaller than 4bytes
- return "BITNOT( $field )";
- }
-
- /**
- * Bitwise AND of two columns or values in SQL
- * Same as (fieldLeft & fieldRight) in C
- * @param $fieldLeft String
- * @param $fieldRight String
- * @return String
- */
- function bitAnd( $fieldLeft, $fieldRight ) {
- return "BITAND( $fieldLeft, $fieldRight )";
- }
-
- /**
- * Bitwise OR of two columns or values in SQL
- * Same as (fieldLeft | fieldRight) in C
- * @param $fieldLeft String
- * @param $fieldRight String
- * @return String
- */
- function bitOr( $fieldLeft, $fieldRight ) {
- return "BITOR( $fieldLeft, $fieldRight )";
- }
-}
-
-class IBM_DB2Helper {
- public static function makeArray( $maybeArray ) {
- if ( !is_array( $maybeArray ) ) {
- return array( $maybeArray );
- }
-
- return $maybeArray;
- }
-}
TO $newUser
;
" );
-
-
}
function encodeBlob( $b ) {
/**
* @param $res ResultWrapper
- * @return object|stdClass
+ * @return object|bool
* @throws DBUnexpectedError
*/
function fetchObject( $res ) {
/**
* @param $res ResultWrapper
- * @return array
+ * @return array|bool
* @throws DBUnexpectedError
*/
function fetchRow( $res ) {
parent::reportQueryError( $error, $errno, $sql, $fname, false );
}
-
function queryIgnore( $sql, $fname = 'DatabasePostgres::queryIgnore' ) {
return $this->query( $sql, $fname, true );
}
return $a;
}
-
function indexUnique( $table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
$sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'".
" AND indexdef LIKE 'CREATE UNIQUE%(" .
return '[http://www.postgresql.org/ PostgreSQL]';
}
-
/**
* Return current schema (executes SELECT current_schema())
* Needs transaction
*/
public function lock( $lockName, $method, $timeout = 5 ) {
$key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
- for ( $attempts=1; $attempts <= $timeout; ++$attempts ) {
+ for ( $attempts = 1; $attempts <= $timeout; ++$attempts ) {
$result = $this->query(
"SELECT pg_try_advisory_lock($key) AS lockstatus", $method );
$row = $this->fetchObject( $result );
# set error codes only, don't raise exceptions
if ( $this->mOpened ) {
$this->mConn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
- # Enforce LIKE to be case sensitive, just like MySQL\r
+ # Enforce LIKE to be case sensitive, just like MySQL
$this->query( 'PRAGMA case_sensitive_like = 1' );
return true;
}
/**
* @param $res ResultWrapper
- * @return
+ * @return object|bool
*/
function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
/**
* @param $res ResultWrapper
- * @return bool|mixed
+ * @return array|bool
*/
function fetchRow( $res ) {
if ( $res instanceof ResultWrapper ) {
* @return bool
*/
function wasErrorReissuable() {
- return $this->lastErrno() == 17; // SQLITE_SCHEMA;
+ return $this->lastErrno() == 17; // SQLITE_SCHEMA;
}
/**
return $this->query( $sql, $fname );
}
-
/**
* List all tables on the database
*
* doesn't go anywhere near an actual database.
*/
class FakeResultWrapper extends ResultWrapper {
- var $result = array();
- var $db = null; // And it's going to stay that way :D
- var $pos = 0;
+ var $result = array();
+ var $db = null; // And it's going to stay that way :D
+ var $pos = 0;
var $currentRow = null;
function __construct( $array ) {
interface IORMRow {
-
/**
* Constructor.
*
*/
public function setReadDb( $db );
-
/**
* Get the ID of the any foreign wiki to use as a target for database operations
*
* @ingroup Database
*/
-
/**
* A multi-wiki, multi-master factory for Wikimedia and similar installations.
* Ignores the old configuration globals
* Given an array of non-normalised probabilities, this function will select
* an element and return the appropriate key
*
+ * @deprecated 1.21, use ArrayUtils::pickRandom()
+ *
* @param $weights array
*
- * @return int
+ * @return bool|int|string
*/
function pickRandom( $weights ) {
- if ( !is_array( $weights ) || count( $weights ) == 0 ) {
- return false;
- }
-
- $sum = array_sum( $weights );
- if ( $sum == 0 ) {
- # No loads on any of them
- # In previous versions, this triggered an unweighted random selection,
- # but this feature has been removed as of April 2006 to allow for strict
- # separation of query groups.
- return false;
- }
- $max = mt_getrandmax();
- $rand = mt_rand( 0, $max ) / $max * $sum;
-
- $sum = 0;
- foreach ( $weights as $i => $w ) {
- $sum += $w;
- if ( $sum >= $rand ) {
- break;
- }
- }
- return $i;
+ return ArrayUtils::pickRandom( $weights );
}
/**
$this->mServers[$i]['slave pos'] = $conn->getSlavePos();
}
}
- if ( $this->mReadIndex <=0 && $this->mLoads[$i]>0 && $i !== false ) {
+ if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $i !== false ) {
$this->mReadIndex = $i;
}
}
$value = (float)$value;
break;
case 'bool':
- if ( is_string( $value ) ) {
- $value = $value !== '0';
- } elseif ( is_int( $value ) ) {
- $value = $value !== 0;
- }
+ $value = (bool)$value;
break;
case 'array':
if ( is_string( $value ) ) {
* @return ORMResult
*/
public function select( $fields = null, array $conditions = array(),
- array $options = array(), $functionName = null ) {
+ array $options = array(), $functionName = null ) {
$res = $this->rawSelect( $fields, $conditions, $options, $functionName );
return new ORMResult( $this, $res );
}
* @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode).
*/
public function selectObjects( $fields = null, array $conditions = array(),
- array $options = array(), $functionName = null ) {
+ array $options = array(), $functionName = null ) {
$result = $this->selectFields( $fields, $conditions, $options, false, $functionName );
$objects = array();
* @throws DBQueryError if the quey failed (even if the database was in ignoreErrors mode).
*/
public function rawSelect( $fields = null, array $conditions = array(),
- array $options = array(), $functionName = null ) {
+ array $options = array(), $functionName = null ) {
if ( is_null( $fields ) ) {
$fields = array_keys( $this->getFields() );
}
* @return array of array
*/
public function selectFields( $fields = null, array $conditions = array(),
- array $options = array(), $collapse = true, $functionName = null ) {
+ array $options = array(), $collapse = true, $functionName = null ) {
$objects = array();
$result = $this->rawSelect( $fields, $conditions, $options, $functionName );
trigger_error( "Reversed closing doesn't match", E_USER_ERROR );
}
-
$prevtype = 'none';
foreach ( $this->edits as $edit ) {
if ( $prevtype == $edit->type ) {
return $this->msg( 'lineno' )->numParams( $matches[1] )->escaped();
}
-
/**
* If there are revisions between the ones being compared, return a note saying so.
* @return string
$temp = array( 0, 0, 0 );
-
$max_progress = array_fill( 0, ceil( max( $forward_end_diag - $forward_start_diag,
$backward_end_diag - $backward_start_diag ) / 2 ), $temp );
$num_progress = 0; // the 1st entry is current, it is initialized
* @return string|bool The text stored or false on error
* @throws MWException
*/
- public abstract function fetchFromURL( $url );
+ abstract public function fetchFromURL( $url );
/**
* Insert a data item into a given location
* @return string|bool The URL of the stored data item, or false on error
* @throws MWException
*/
- public abstract function store( $location, $data );
+ abstract public function store( $location, $data );
}
*/
class FSFile {
protected $path; // path to file
+ private $sha1Base36 = null; // File Sha1Base36
/**
* Sets up the file object
* 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
* fairly neatly.
*
+ * @param $recache bool
* @return bool|string False on failure
*/
- public function getSha1Base36() {
+ public function getSha1Base36( $recache = false ) {
wfProfileIn( __METHOD__ );
+ if ( $this->sha1Base36 !== null && !$recache ) {
+ wfProfileOut( __METHOD__ );
+ return $this->sha1Base36;
+ }
+
wfSuppressWarnings();
- $hash = sha1_file( $this->path );
+ $this->sha1Base36 = sha1_file( $this->path );
wfRestoreWarnings();
- if ( $hash !== false ) {
- $hash = wfBaseConvert( $hash, 16, 36, 31 );
+
+ if ( $this->sha1Base36 !== false ) {
+ $this->sha1Base36 = wfBaseConvert( $this->sha1Base36, 16, 36, 31 );
}
wfProfileOut( __METHOD__ );
- return $hash;
+ return $this->sha1Base36;
}
/**
* fairly neatly.
*
* @param $path string
+ * @param $recache bool
*
* @return bool|string False on failure
*/
- public static function getSha1Base36FromPath( $path ) {
- $fsFile = new self( $path );
- return $fsFile->getSha1Base36();
+ public static function getSha1Base36FromPath( $path, $recache = false ) {
+ static $sha1Base36 = array();
+
+ if ( !isset( $sha1Base36[$path] ) || $recache ) {
+ $fsFile = new self( $path );
+ $sha1Base36[$path] = $fsFile->getSha1Base36();
+ }
+
+ return $sha1Base36[$path];
}
}
if ( isset( $config['containerPaths'] ) ) {
$this->containerPaths = (array)$config['containerPaths'];
foreach ( $this->containerPaths as &$path ) {
- $path = rtrim( $path, '/' ); // remove trailing slash
+ $path = rtrim( $path, '/' ); // remove trailing slash
}
}
* $opts is an associative of boolean flags, including:
* - force : Operation precondition errors no longer trigger an abort.
* Any remaining operations are still attempted. Unexpected
- * failures may still cause remaning operations to be aborted.
+ * failures may still cause remaining operations to be aborted.
* - nonLocking : No locks are acquired for the operations.
* This can increase performance for non-critical writes.
* This has no effect unless the 'force' flag is set.
* @param $params Array
* $params include:
* - src : source storage path
+ * - ttl : lifetime (seconds) if pre-authenticated; default is 1 day
* @return string|null
* @since 1.21
*/
$mBackend = $this->backends[$this->masterIndex];
foreach ( $paths as $path ) {
- $mPath = $this->substPaths( $path, $mBackend );
- $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
+ $mPath = $this->substPaths( $path, $mBackend );
+ $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
$mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
// Check if the master backend is available...
if ( $mExist === null ) {
*/
public function __construct( array $config ) {
parent::__construct( $config );
- $this->memCache = new EmptyBagOStuff(); // disabled by default
- $this->cheapCache = new ProcessCacheLRU( 300 );
+ $this->memCache = new EmptyBagOStuff(); // disabled by default
+ $this->cheapCache = new ProcessCacheLRU( 300 );
$this->expensiveCache = new ProcessCacheLRU( 5 );
}
$hash = $this->doGetFileSha1Base36( $params );
wfProfileOut( __METHOD__ . '-miss-' . $this->name );
wfProfileOut( __METHOD__ . '-miss' );
- if ( $hash ) { // don't cache negatives
- $this->cheapCache->set( $path, 'sha1',
- array( 'hash' => $hash, 'latest' => $latest ) );
- }
+ $this->cheapCache->set( $path, 'sha1', array( 'hash' => $hash, 'latest' => $latest ) );
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
return $hash;
$res = '';
foreach ( explode( ';', $disposition ) as $part ) {
$part = trim( $part );
- $new = ( $res === '' ) ? $part : "{$res};{$part}";
+ $new = ( $res === '' ) ? $part : "{$res};{$part}";
if ( strlen( $new ) <= 255 ) {
$res = $new;
} else {
return null; // invalid path
}
try {
+ $ttl = isset( $params['ttl'] ) ? $params['ttl'] : 86400;
$sContObj = $this->getContainer( $srcCont );
$obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
if ( $this->swiftTempUrlKey != '' ) {
- return $obj->get_temp_url( $this->swiftTempUrlKey, 86400, "GET" );
+ return $obj->get_temp_url( $this->swiftTempUrlKey, $ttl, "GET" );
} else { // give S3 API URL for rgw
- $expires = time() + 86400;
+ $expires = time() + $ttl;
// Path for signature starts with the bucket
$spath = '/' . rawurlencode( $srcCont ) . '/' .
str_replace( '%2F', '/', rawurlencode( $srcRel ) );
);
}
+ /**
+ * @see FileJournal::doGetPositionAtTime()
+ * @param $time integer|string timestamp
+ * @return integer|false
+ */
+ protected function doGetPositionAtTime( $time ) {
+ $dbw = $this->getMasterDB();
+
+ $encTimestamp = $dbw->addQuotes( $dbw->timestamp( $time ) );
+ return $dbw->selectField( 'filejournal', 'fj_id',
+ array( 'fj_backend' => $this->backend, "fj_timestamp <= $encTimestamp" ),
+ __METHOD__,
+ array( 'ORDER BY' => 'fj_timestamp DESC' )
+ );
+ }
+
/**
* @see FileJournal::doGetChangeEntries()
* @return Array
*/
abstract protected function doGetCurrentPosition();
+ /**
+ * Get the position ID of the latest journal entry at some point in time
+ *
+ * @param $time integer|string timestamp
+ * @return integer|false
+ */
+ final public function getPositionAtTime( $time ) {
+ return $this->doGetPositionAtTime( $time );
+ }
+
+ /**
+ * @see FileJournal::getPositionAtTime()
+ * @param $time integer|string timestamp
+ * @return integer|false
+ */
+ abstract protected function doGetPositionAtTime( $time );
+
/**
* Get an array of file change log entries.
* A starting change ID and/or limit can be specified.
return false;
}
+ /**
+ * @see FileJournal::doGetPositionAtTime()
+ * @param $time integer|string timestamp
+ * @return integer|false
+ */
+ protected function doGetPositionAtTime( $time ) {
+ return false;
+ }
+
/**
* @see FileJournal::doGetChangeEntries()
* @return Array
return null;
}
+ /**
+ * Release a scoped lock and set any errors in the attatched Status object.
+ * This is useful for early release of locks before function scope is destroyed.
+ * This is the same as setting the lock object to null.
+ *
+ * @param ScopedLock $lock
+ * @return void
+ * @since 1.21
+ */
+ public static function release( ScopedLock &$lock = null ) {
+ $lock = null;
+ }
+
function __destruct() {
$wasOk = $this->status->isOK();
$this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
return $result;
}
+ /**
+ * Return an array of files where the name starts with $prefix.
+ *
+ * STUB
+ * @param string $prefix The prefix to search for
+ * @param int $limit The maximum amount of files to return
+ * @return array
+ */
+ public function findFilesByPrefix( $prefix, $limit ) {
+ return array();
+ }
+
/**
* Get the public root URL of the repository
*
throw new MWException( 'Validation error in $dstRel' );
}
$dstPath = "$root/$dstRel";
- $dstDir = dirname( $dstPath );
+ $dstDir = dirname( $dstPath );
// Create destination directories for this triplet
if ( !$this->initDirectory( $dstDir )->isOK() ) {
return $this->newFatal( 'directorycreateerror', $dstDir );
public function storeTemp( $originalName, $srcPath ) {
$this->assertWritableRepo(); // fail out if read-only
- $date = gmdate( "YmdHis" );
- $hashPath = $this->getHashPath( $originalName );
- $dstRel = "{$hashPath}{$date}!{$originalName}";
- $dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
+ $date = gmdate( "YmdHis" );
+ $hashPath = $this->getHashPath( $originalName );
+ $dstRel = "{$hashPath}{$date}!{$originalName}";
+ $dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
$virtualUrl = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
$result = $this->quickImport( $srcPath, $virtualUrl );
*/
public function nameForThumb( $name ) {
if ( strlen( $name ) > $this->abbrvThreshold ) {
- $ext = FileBackend::extensionFromPath( $name );
+ $ext = FileBackend::extensionFromPath( $name );
$name = ( $ext == '' ) ? 'thumbnail' : "thumbnail.$ext";
}
return $name;
return false;
}
-
# @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
$backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
$params = array( 'dst' => $localFilename, 'content' => $thumb );
$expiry = 86400; // has invalidation, 1 day
}
$cachedValue = $wgMemc->get( $memcKey );
- if ( $cachedValue === ' ' || $cachedValue === '' ) {
+ if ( $cachedValue === ' ' || $cachedValue === '' ) {
// Does not exist
return false;
} elseif ( strval( $cachedValue ) !== '' ) {
'page_namespace' => $title->getNamespace(),
'page_title' => $title->getDBkey(),
),
- __METHOD__ //Function name
+ __METHOD__ //Function name
);
return $id;
}
return $result;
}
+ /**\r
+ * Return an array of files where the name starts with $prefix.\r
+ *\r
+ * @param string $prefix The prefix to search for\r
+ * @param int $limit The maximum amount of files to return\r
+ * @return array\r
+ */\r
+ public function findFilesByPrefix( $prefix, $limit ) {
+ $selectOptions = array( 'ORDER BY' => 'img_name', 'LIMIT' => intval( $limit ) );
+
+ // Query database\r
+ $dbr = $this->getSlaveDB();
+ $res = $dbr->select(
+ 'image',
+ LocalFile::selectFields(),
+ 'img_name ' . $dbr->buildLike( $prefix, $dbr->anyString() ),
+ __METHOD__,
+ $selectOptions
+ );
+
+ // Build file objects
+ $files = array();
+ foreach ( $res as $row ) {
+ $files[] = $this->newFileFromRow( $row );
+ }
+ return $files;\r
+ }
+
/**
* Get a connection to the slave DB
* @return DatabaseBase
FileRepo, where no such configuration is needed.
File objects are generated by a factory function from the repository. The
-repository thus has full control over the behaviour of its subsidiary file
+repository thus has full control over the behavior of its subsidiary file
class, since it can subclass the file class and override functionality at its
whim. Thus there is no need for the File subclass to query its parent repository
-for information about repository-class-dependent behaviour -- the file subclass
+for information about repository-class-dependent behavior -- the file subclass
is generally fully aware of the static preferences of its repository. Limited
exceptions can be made to this rule to permit sharing of functions, or perhaps
even entire classes, between repositories.
* returns false.
*
* @return string|bool ForeignAPIFile::getPath can return false
- */
+ */
public function getPath() {
if ( !isset( $this->path ) ) {
$this->assertRepoDefined();
}
/**
- * get versioned metadata
- *
- * @param $metadata Mixed Array or String of (serialized) metadata
- * @param $version integer version number.
- * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
- */
+ * get versioned metadata
+ *
+ * @param $metadata Mixed Array or String of (serialized) metadata
+ * @param $version integer version number.
+ * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
+ */
public function convertMetadataVersion($metadata, $version) {
$handler = $this->getHandler();
if ( !is_array( $metadata ) ) {
* @param $copyStatus string
* @param $source string
* @param $watch bool
+ * @param $timestamp string|bool
+ * @param $user User object or null to use $wgUser
+ * @return bool
+ * @throws MWException
*/
- function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '', $watch = false ) {
+ function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '', $watch = false, $timestamp = false, User $user = null ) {
$this->readOnlyError();
}
* Set it to false to ignore the extension.
*
* @return array
+ * @deprecated since 1.19
*/
static function getPropsFromPath( $path, $ext = true ) {
wfDebug( __METHOD__ . ": Getting file info for $path\n" );
* @param $path string
*
* @return bool|string False on failure
+ * @deprecated since 1.19
*/
static function sha1Base36( $path ) {
wfDeprecated( __METHOD__, '1.19' );
* @param $source string
* @param $watch bool
* @param $timestamp bool|string
+ * @param $user User object or null to use $wgUser
* @return bool
* @throws MWException
*/
function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
- $watch = false, $timestamp = false ) {
+ $watch = false, $timestamp = false, User $user = null ) {
$this->readOnlyError();
}
* @return string
*/
function getDescriptionUrl() {
- // Restore remote behaviour
+ // Restore remote behavior
return File::getDescriptionUrl();
}
* @return string
*/
function getDescriptionText() {
- // Restore remote behaviour
+ // Restore remote behavior
return File::getDescriptionText();
}
}
$extraDataLoaded, # Whether or not lazy-loaded data has been loaded from the database
$upgraded, # Whether the row was upgraded on load
$locked, # True if the image row is locked
+ $lockedOwnTrx, # True if the image row is locked with a lock initiated transaction
$missing, # True if file is not present in file system. Not to be cached in memcached
$deleted; # Bitfield akin to rev_deleted
// If the cache value gets to large it will not fit in memcached and nothing will
// get cached at all, causing master queries for any file access.
foreach ( $this->getLazyCacheFields( '' ) as $field ) {
- if ( isset( $cache[$field] ) && strlen( $cache[$field] ) > 100*1024 ) {
+ if ( isset( $cache[$field] ) && strlen( $cache[$field] ) > 100 * 1024 ) {
unset( $cache[$field] ); // don't let the value get too big
}
}
* @param $source string
* @param $watch bool
* @param $timestamp string|bool
+ * @param $user User object or null to use $wgUser
* @return bool
*/
function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
- $watch = false, $timestamp = false )
+ $watch = false, $timestamp = false, User $user = null )
{
+ if ( !$user ) {
+ global $wgUser;
+ $user = $wgUser;
+ }
+
$pageText = SpecialUpload::getInitialPageText( $desc, $license, $copyStatus, $source );
- if ( !$this->recordUpload2( $oldver, $desc, $pageText, false, $timestamp ) ) {
+ if ( !$this->recordUpload2( $oldver, $desc, $pageText, false, $timestamp, $user ) ) {
return false;
}
if ( $watch ) {
- global $wgUser;
- $wgUser->addWatch( $this->getTitle() );
+ $user->addWatch( $this->getTitle() );
}
return true;
}
$dbw = $this->repo->getMasterDB();
if ( !$this->locked ) {
- $dbw->begin( __METHOD__ );
+ if ( !$dbw->trxLevel() ) {
+ $dbw->begin( __METHOD__ );
+ $this->lockedOwnTrx = true;
+ }
$this->locked++;
}
function unlock() {
if ( $this->locked ) {
--$this->locked;
- if ( !$this->locked ) {
+ if ( !$this->locked && $this->lockedOwnTrx ) {
$dbw = $this->repo->getMasterDB();
$dbw->commit( __METHOD__ );
+ $this->lockedOwnTrx = false;
}
}
}
$this->locked = false;
$dbw = $this->repo->getMasterDB();
$dbw->rollback( __METHOD__ );
+ $this->lockedOwnTrx = false;
}
/**
*/
function getMoveTriplets() {
$moves = array_merge( array( $this->cur ), $this->olds );
- $triplets = array(); // The format is: (srcUrl, destZone, destUrl)
+ $triplets = array(); // The format is: (srcUrl, destZone, destUrl)
foreach ( $moves as $move ) {
// $move: (oldRelativePath, newRelativePath)
+++ /dev/null
-<?php
-/**
- * IBM_DB2-specific installer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Deployment
- */
-
-/**
- * Class for setting up the MediaWiki database using IBM_DB2.
- *
- * @ingroup Deployment
- * @since 1.17
- */
-class Ibm_db2Installer extends DatabaseInstaller {
-
-
- protected $globalNames = array(
- 'wgDBserver',
- 'wgDBport',
- 'wgDBname',
- 'wgDBuser',
- 'wgDBpassword',
- 'wgDBmwschema',
- );
-
- protected $internalDefaults = array(
- '_InstallUser' => 'db2admin'
- );
-
- /**
- * Get the DB2 database extension name
- * @return string
- */
- public function getName() {
- return 'ibm_db2';
- }
-
- /**
- * Determine whether the DB2 database extension is currently available in PHP
- * @return boolean
- */
- public function isCompiled() {
- return self::checkExtension( 'ibm_db2' );
- }
-
- /**
- * Generate a connection form for a DB2 database
- * @return string
- */
- public function getConnectForm() {
- return
- $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
- $this->getTextBox( 'wgDBport', 'config-db-port', array(), $this->parent->getHelpBox( 'config-db-port' ) ) .
- Html::openElement( 'fieldset' ) .
- Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
- $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
- $this->getTextBox( 'wgDBmwschema', 'config-db-schema', array(), $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
- Html::closeElement( 'fieldset' ) .
- $this->getInstallUserBox();
- }
-
- /**
- * Validate and then execute the connection form for a DB2 database
- * @return Status
- */
- public function submitConnectForm() {
- // Get variables from the request
- $newValues = $this->setVarsFromRequest(
- array( 'wgDBserver', 'wgDBport', 'wgDBname',
- 'wgDBmwschema', 'wgDBuser', 'wgDBpassword' ) );
-
- // Validate them
- $status = Status::newGood();
- if ( !strlen( $newValues['wgDBname'] ) ) {
- $status->fatal( 'config-missing-db-name' );
- } elseif ( !preg_match( '/^[a-zA-Z0-9_]+$/', $newValues['wgDBname'] ) ) {
- $status->fatal( 'config-invalid-db-name', $newValues['wgDBname'] );
- }
- if ( !strlen( $newValues['wgDBmwschema'] ) ) {
- $status->fatal( 'config-invalid-schema' );
- }
- elseif ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBmwschema'] ) ) {
- $status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
- }
- if ( !strlen( $newValues['wgDBport'] ) ) {
- $status->fatal( 'config-invalid-port' );
- }
- elseif ( !preg_match( '/^[0-9_]*$/', $newValues['wgDBport'] ) ) {
- $status->fatal( 'config-invalid-port', $newValues['wgDBport'] );
- }
-
- // Submit user box
- if ( $status->isOK() ) {
- $status->merge( $this->submitInstallUserBox() );
- }
- if ( !$status->isOK() ) {
- return $status;
- }
-
- global $wgDBport;
- $wgDBport = $newValues['wgDBport'];
-
- // Try to connect
- $status->merge( $this->getConnection() );
- if ( !$status->isOK() ) {
- return $status;
- }
-
- $this->parent->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
- $this->parent->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
-
- return $status;
- }
-
- /**
- * Open a DB2 database connection
- * @return Status
- */
- public function openConnection() {
- $status = Status::newGood();
- try {
- $db = new DatabaseIbm_db2(
- $this->getVar( 'wgDBserver' ),
- $this->getVar( '_InstallUser' ),
- $this->getVar( '_InstallPassword' ),
- $this->getVar( 'wgDBname' ),
- 0,
- $this->getVar( 'wgDBmwschema' )
- );
- $status->value = $db;
- } catch ( DBConnectionError $e ) {
- $status->fatal( 'config-connection-error', $e->getMessage() );
- }
- return $status;
- }
-
- /**
- * Create a DB2 database for MediaWiki
- * @return Status
- */
- public function setupDatabase() {
- $status = $this->getConnection();
- if ( !$status->isOK() ) {
- return $status;
- }
- /**
- * @var $conn DatabaseBase
- */
- $conn = $status->value;
- $dbName = $this->getVar( 'wgDBname' );
- if( !$conn->selectDB( $dbName ) ) {
- $conn->query( "CREATE DATABASE "
- . $conn->addIdentifierQuotes( $dbName )
- . " AUTOMATIC STORAGE YES"
- . " USING CODESET UTF-8 TERRITORY US COLLATE USING SYSTEM"
- . " PAGESIZE 32768", __METHOD__ );
- $conn->selectDB( $dbName );
- }
- $this->setupSchemaVars();
- return $status;
- }
-
- /**
- * Create tables from scratch.
- * First check if pagesize >= 32k.
- *
- * @return Status
- */
- public function createTables() {
- $status = $this->getConnection();
- if ( !$status->isOK() ) {
- return $status;
- }
- $this->db->selectDB( $this->getVar( 'wgDBname' ) );
-
- if( $this->db->tableExists( 'user' ) ) {
- $status->warning( 'config-install-tables-exist' );
- return $status;
- }
-
- /* Check for pagesize */
- $status = $this->checkPageSize();
- if ( !$status->isOK() ) {
- return $status;
- }
-
- $this->db->setFlag( DBO_DDLMODE ); // For Oracle's handling of schema files
- $this->db->begin( __METHOD__ );
-
- $error = $this->db->sourceFile( $this->db->getSchemaPath() );
- if( $error !== true ) {
- $this->db->reportQueryError( $error, 0, '', __METHOD__ );
- $this->db->rollback( __METHOD__ );
- $status->fatal( 'config-install-tables-failed', $error );
- } else {
- $this->db->commit( __METHOD__ );
- }
- // Resume normal operations
- if( $status->isOk() ) {
- $this->enableLB();
- }
- return $status;
- }
-
- /**
- * Check if database has a tablspace with pagesize >= 32k.
- *
- * @return Status
- */
- public function checkPageSize() {
- $status = $this->getConnection();
- if ( !$status->isOK() ) {
- return $status;
- }
- $this->db->selectDB( $this->getVar( 'wgDBname' ) );
-
- try {
- $result = $this->db->query( 'SELECT PAGESIZE FROM SYSCAT.TABLESPACES FOR READ ONLY' );
- if( $result == false ) {
- $status->fatal( 'config-connection-error', '' );
- } else {
- $row = $this->db->fetchRow( $result );
- while ( $row ) {
- if( $row[0] >= 32768 ) {
- return $status;
- }
- $row = $this->db->fetchRow( $result );
- }
- $status->fatal( 'config-ibm_db2-low-db-pagesize', '' );
- }
- } catch ( DBUnexpectedError $e ) {
- $status->fatal( 'config-connection-error', $e->getMessage() );
- }
-
- return $status;
- }
-
- /**
- * Generate the code to store the DB2-specific settings defined by the configuration form
- * @return string
- */
- public function getLocalSettings() {
- $schema = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBmwschema' ) );
- $port = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBport' ) );
- return
-"# IBM_DB2 specific settings
-\$wgDBmwschema = \"{$schema}\";
-\$wgDBport = \"{$port}\";";
- }
-
- public function __construct( $parent ) {
- parent::__construct( $parent );
- }
-}
+++ /dev/null
-<?php
-/**
- * IBM_DB2-specific updater.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Deployment
- */
-
-/**
- * Class for handling updates to IBM_DB2 databases.
- *
- * @ingroup Deployment
- * @since 1.17
- */
-class Ibm_db2Updater extends DatabaseUpdater {
-
- /**
- * Get the changes in the DB2 database scheme since MediaWiki 1.14
- * @return array
- */
- protected function getCoreUpdateList() {
- return array(
- // 1.14
- array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
- array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
-
- // 1.15
- array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
- array( 'addTable', 'tag_summary', 'patch-change_tag_summary.sql' ),
- array( 'addTable', 'valid_tag', 'patch-change_valid_tag.sql' ),
-
- // 1.16
- array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
- array( 'addTable', 'log_search', 'patch-log_search.sql' ),
- array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ),
- array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
- array( 'addTable', 'external_user', 'patch-external_user.sql' ),
- array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ),
- array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
- array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
-
- // 1.17
- array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
- array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ),
- array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
- array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
- array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
- array( 'addTable', 'msg_resource_links', 'patch-msg_resource_links.sql' ),
- array( 'addIndex', 'msg_resource_links', 'uq61_msg_resource_links', 'patch-uq_61_msg_resource_links.sql' ),
- array( 'addIndex', 'msg_resource', 'uq81_msg_resource', 'patch-uq_81_msg_resource.sql' ),
- array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
- array( 'addIndex', 'module_deps', 'uq96_module_deps', 'patch-uq_96_module_deps.sql' ),
- array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api-field.sql' ),
- array( 'addField', 'interwiki', 'iw_wikiid', 'patch-iw_wikiid-field.sql' ),
- array( 'addField', 'categorylinks', 'cl_sortkey_prefix', 'patch-cl_sortkey_prefix-field.sql' ),
- array( 'addField', 'categorylinks', 'cl_collation', 'patch-cl_collation-field.sql' ),
- array( 'addField', 'categorylinks', 'cl_type', 'patch-cl_type-field.sql' ),
-
- //1.18
- array( 'doUserNewTalkTimestampNotNull' ),
- array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
- array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
- array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
- array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql'),
- array( 'doRebuildLocalisationCache' ),
-
- // 1.19
- array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql'),
- array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
- array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
- array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
-
- // 1.21
- array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
- array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
- array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
- array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
- array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
- );
- }
-}
However, MediaWiki requires PHP $2 or higher.',
'config-unicode-using-utf8' => 'Using Brion Vibber\'s utf8_normalize.so for Unicode normalization.',
'config-unicode-using-intl' => 'Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.',
- 'config-unicode-pure-php-warning' => "'''Warning''': The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
+ 'config-unicode-pure-php-warning' => "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
If you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
- 'config-unicode-update-warning' => "'''Warning''': The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
+ 'config-unicode-update-warning' => "'''Warning:''' The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
You should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
'config-no-db' => 'Could not find a suitable database driver! You need to install a database driver for PHP.
The following database types are supported: $1.
If you are on shared hosting, ask your hosting provider to install a suitable database driver.
If you compiled PHP yourself, reconfigure it with a database client enabled, for example using <code>./configure --with-mysql</code>.
If you installed PHP from a Debian or Ubuntu package, then you also need install the php5-mysql module.',
- 'config-outdated-sqlite' => "'''Warning''': you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
- 'config-no-fts3' => "'''Warning''': SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
+ 'config-outdated-sqlite' => "'''Warning:''' you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
+ 'config-no-fts3' => "'''Warning:''' SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
'config-register-globals' => "'''Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.'''
'''Disable it if you can.'''
MediaWiki will work, but your server is exposed to potential security vulnerabilities.",
If you're running Mandrake, install the php-xml package.",
'config-pcre' => 'The PCRE support module appears to be missing.
MediaWiki requires the Perl-compatible regular expression functions to work.',
- 'config-pcre-no-utf8' => "'''Fatal''': PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
+ 'config-pcre-no-utf8' => "'''Fatal:''' PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
MediaWiki requires UTF-8 support to function correctly.",
'config-memory-raised' => "PHP's <code>memory_limit</code> is $1, raised to $2.",
'config-memory-bad' => "'''Warning:''' PHP's <code>memory_limit</code> is $1.
This is probably too low.
The installation may fail!",
- 'config-ctype' => "'''Fatal''': PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+ 'config-ctype' => "'''Fatal:''' PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] is installed',
'config-apc' => '[http://www.php.net/apc APC] is installed',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] is installed',
'config-no-cache' => "'''Warning:''' Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].
Object caching is not enabled.",
- 'config-mod-security' => "'''Warning''': Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.
+ 'config-mod-security' => "'''Warning:''' Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.
Refer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
'config-diff3-bad' => 'GNU diff3 not found.',
'config-imagemagick' => 'Found ImageMagick: <code>$1</code>.
Image thumbnailing will be disabled.',
'config-no-uri' => "'''Error:''' Could not determine the current URI.
Installation aborted.",
- 'config-no-cli-uri' => "'''Warning''': No --scriptpath specified, using default: <code>$1</code>.",
+ 'config-no-cli-uri' => "'''Warning:''' No --scriptpath specified, using default: <code>$1</code>.",
'config-using-server' => 'Using server name "<nowiki>$1</nowiki>".',
'config-using-uri' => 'Using server URL "<nowiki>$1$2</nowiki>".',
'config-uploads-not-safe' => "'''Warning:''' Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.
It should '''not''' be accessible via the web, this is why we're not putting it where your PHP files are.
The installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.
-That includes raw user data (e-mail addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.
+That includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.
Consider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
'config-oracle-def-ts' => 'Default tablespace:',
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki supports the following database systems:
$1
'config-support-postgres' => '* $1 is a popular open source database system as an alternative to MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). There may be some minor outstanding bugs, and it is not recommended for use in a production environment.',
'config-support-sqlite' => '* $1 is a lightweight database system which is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
'config-support-oracle' => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
- 'config-support-ibm_db2' => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
'config-header-mysql' => 'MySQL settings',
'config-header-postgres' => 'PostgreSQL settings',
'config-header-sqlite' => 'SQLite settings',
'config-header-oracle' => 'Oracle settings',
- 'config-header-ibm_db2' => 'IBM DB2 settings',
'config-invalid-db-type' => 'Invalid database type',
'config-missing-db-name' => 'You must enter a value for "Database name"',
'config-missing-db-host' => 'You must enter a value for "Database host"',
You can now [$1 start using your wiki].",
'config-regenerate' => 'Regenerate <code>LocalSettings.php</code> →',
'config-show-table-status' => '<code>SHOW TABLE STATUS</code> query failed!',
- 'config-unknown-collation' => "'''Warning:''' Database is using unrecognised collation.",
+ 'config-unknown-collation' => "'''Warning:''' Database is using unrecognized collation.",
'config-db-web-account' => 'Database account for web access',
'config-db-web-help' => 'Select the username and password that the web server will use to connect to the database server, during ordinary operation of the wiki.',
'config-db-web-account-same' => 'Use the same account as for installation',
'config-mysql-engine' => 'Storage engine:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
- 'config-mysql-myisam-dep' => "'''Warning''': You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:
+ 'config-mysql-myisam-dep' => "'''Warning:''' You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:
* it barely supports concurrency due to table locking
* it is more prone to corruption than other engines
* the MediaWiki codebase does not always handle MyISAM as it should
In '''UTF-8 mode''', MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
- 'config-ibm_db2-low-db-pagesize' => "Your DB2 database has a default tablespace with an insufficient pagesize. The pagesize has to be '''32K''' or greater.",
-
'config-site-name' => 'Name of wiki:',
'config-site-name-help' => "This will appear in the title bar of the browser and in various other places.",
'config-site-name-blank' => 'Enter a site name.',
'config-admin-password-blank' => 'Enter a password for the administrator account.',
'config-admin-password-same' => 'The password must not be the same as the username.',
'config-admin-password-mismatch' => 'The two passwords you entered do not match.',
- 'config-admin-email' => 'E-mail address:',
- 'config-admin-email-help' => 'Enter an e-mail address here to allow you to receive e-mail from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist. You can leave this field empty.',
+ 'config-admin-email' => 'Email address:',
+ 'config-admin-email-help' => 'Enter an email address here to allow you to receive email from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist. You can leave this field empty.',
'config-admin-error-user' => 'Internal error when creating an admin with the name "<nowiki>$1</nowiki>".',
'config-admin-error-password' => 'Internal error when setting a password for the admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
- 'config-admin-error-bademail' => 'You have entered an invalid e-mail address.',
+ 'config-admin-error-bademail' => 'You have entered an invalid email address.',
'config-subscribe' => 'Subscribe to the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].',
'config-subscribe-help' => 'This is a low-volume mailing list used for release announcements, including important security announcements.
You should subscribe to it and update your MediaWiki installation when new versions come out.',
- 'config-subscribe-noemail' => 'You tried to subscribe to the release announcements mailing list without providing an e-mail address.
-Please provide an e-mail address if you wish to subscribe to the mailing list.',
+ 'config-subscribe-noemail' => 'You tried to subscribe to the release announcements mailing list without providing an email address.
+Please provide an email address if you wish to subscribe to the mailing list.',
'config-almost-done' => 'You are almost done!
You can now skip the remaining configuration and install the wiki right now.',
'config-optional-continue' => 'Ask me more questions.',
Wikipedia previously used the GNU Free Documentation License.
The GFDL is a valid license, but it is difficult to understand.
It is also difficult to reuse content licensed under the GFDL.",
- 'config-email-settings' => 'E-mail settings',
- 'config-enable-email' => 'Enable outbound e-mail',
- 'config-enable-email-help' => "If you want e-mail to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.
-If you do not want any e-mail features, you can disable them here.",
- 'config-email-user' => 'Enable user-to-user e-mail',
- 'config-email-user-help' => 'Allow all users to send each other e-mail if they have enabled it in their preferences.',
+ 'config-email-settings' => 'Email settings',
+ 'config-enable-email' => 'Enable outbound email',
+ 'config-enable-email-help' => "If you want email to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.
+If you do not want any email features, you can disable them here.",
+ 'config-email-user' => 'Enable user-to-user email',
+ 'config-email-user-help' => 'Allow all users to send each other email if they have enabled it in their preferences.',
'config-email-usertalk' => 'Enable user talk page notification',
'config-email-usertalk-help' => 'Allow users to receive notifications on user talk page changes, if they have enabled it in their preferences.',
'config-email-watchlist' => 'Enable watchlist notification',
'config-email-watchlist-help' => 'Allow users to receive notifications about their watched pages if they have enabled it in their preferences.',
- 'config-email-auth' => 'Enable e-mail authentication',
- 'config-email-auth-help' => "If this option is enabled, users have to confirm their e-mail address using a link sent to them whenever they set or change it.
-Only authenticated e-mail addresses can receive e-mails from other users or change notification e-mails.
-Setting this option is '''recommended''' for public wikis because of potential abuse of the e-mail features.",
- 'config-email-sender' => 'Return e-mail address:',
- 'config-email-sender-help' => 'Enter the e-mail address to use as the return address on outbound e-mail.
+ 'config-email-auth' => 'Enable email authentication',
+ 'config-email-auth-help' => "If this option is enabled, users have to confirm their email address using a link sent to them whenever they set or change it.
+Only authenticated email addresses can receive emails from other users or change notification emails.
+Setting this option is '''recommended''' for public wikis because of potential abuse of the email features.",
+ 'config-email-sender' => 'Return email address:',
+ 'config-email-sender-help' => 'Enter the email address to use as the return address on outbound email.
This is where bounces will be sent.
Many mail servers require at least the domain name part to be valid.',
'config-upload-settings' => 'Images and file uploads',
'config-install-user-missing-create' => 'The specified user "$1" does not exist.
Please click the "create account" checkbox below if you want to create it.',
'config-install-tables' => 'Creating tables',
- 'config-install-tables-exist' => "'''Warning''': MediaWiki tables seem to already exist.
+ 'config-install-tables-exist' => "'''Warning:''' MediaWiki tables seem to already exist.
Skipping creation.",
- 'config-install-tables-failed' => "'''Error''': Table creation failed with the following error: $1",
+ 'config-install-tables-failed' => "'''Error:''' Table creation failed with the following error: $1",
'config-install-interwiki' => 'Populating default interwiki table',
'config-install-interwiki-list' => 'Could not read file <code>interwiki.list</code>.',
- 'config-install-interwiki-exists' => "'''Warning''': The interwiki table seems to already have entries.
+ 'config-install-interwiki-exists' => "'''Warning:''' The interwiki table seems to already have entries.
Skipping default list.",
'config-install-stats' => 'Initializing statistics',
'config-install-keys' => 'Generating secret keys',
$3
-'''Note''': If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.
+'''Note:''' If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.
When that has been done, you can '''[$2 enter your wiki]'''.",
'config-download-localsettings' => 'Download <code>LocalSettings.php</code>',
* $1 - a link to the SQLite home page having the anchor text "SQLite".',
'config-support-oracle' => 'Parameters:
* $1 - a link to the Oracle home page, the anchor text of which is "Oracle".',
- 'config-support-ibm_db2' => 'Used in the DBConnect step of the installer, explaining what is the ibm_db2 database',
'config-connection-error' => '$1 is the external error from the database, such as "DB connection error: Access denied for user \'dba\'@\'localhost\' (using password: YES) (localhost)."
If you\'re translating this message to a right-to-left language, consider writing <nowiki><div dir="ltr">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir="auto">$1.</div></nowiki>.)',
'config-admin-password' => '{{Identical|Password}}',
'config-admin-email' => '{{Identical|E-mail address}}',
'config-subscribe' => 'Used as label for the installer checkbox',
+ 'config-subscribe-help' => '"Low-volume" in this context means that there will be few e-mails to that mailing list per time period.',
'config-profile-help' => 'Messages referenced:
* {{msg-mw|config-profile-wiki}}
* {{msg-mw|config-profile-no-anon}}
* {{msg-mw|config-profile-fishbowl}}
* {{msg-mw|config-profile-private}}',
+ 'config-email-settings' => '{{Identical|E-mail setting}}',
+ 'config-email-user' => '{{Identical|Enable user-to-user e-mail}}',
'config-upload-help' => 'The word "mode" here refers to the access rights given to various user groups when attempting to create and store files and/or subdiretories in the said directory on the server. It also refers to the <code>mode</code> command used to maipulate said right mask under Unix, Linux, and similar operating systems. A less operating-system-centric translation is fine.',
'config-logo-help' => '',
'config-cc-not-chosen' => '{{doc-important|Do not translate the "<code>proceed</code>" part.}}
);
/** Asturian (asturianu)
+ * @author Xuacu
*/
$messages['ast'] = array(
+ 'config-desc' => "L'instalador pa MediaWiki",
+ 'config-title' => 'Instalación de MediaWiki $1',
+ 'config-information' => 'Información',
+ 'config-localsettings-upgrade' => "Detectose un ficheru <code>LocalSettings.php</code>.
+P'anovar esta instalación, escriba'l valor de
+<code>\$wgUpgradeKey</code> nel cuadru d'abaxo.
+Alcontraralu en <code>LocalSettings.php</code>.",
+ 'config-localsettings-cli-upgrade' => "Deteutose un ficheru <code>LocalSettings.php</code>.
+P'anovar esta instalación, execute <code>update.php</code>",
+ 'config-localsettings-key' => "Clave d'anovamientu:",
+ 'config-localsettings-badkey' => 'La clave que dio ye incorreuta.',
+ 'config-upgrade-key-missing' => "Deteutose una instalación esistente de MediaWiki.
+P'anovar esta instalación, ponga la llinia siguiente al final del ficheru <code>LocalSettings.php</code>:
+
+$1",
+ 'config-localsettings-incomplete' => 'Paez que\'l ficheru <code>LocalSettings.php</code> esistente ta incompletu.
+La variable $1 nun ta definida.
+Camude\'l ficheru <code>LocalSettings.php</code> pa qu\'esta variable quede definida y calque "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Alcontrose un error al conectar cola base de datos usando la configuración especificada en <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corrixa esta configuración y vuelva a intentalo.
+
+$1',
+ 'config-your-language' => 'La so llingua:',
+ 'config-your-language-help' => "Seleicione la llingua a emplegar nel procesu d'instalación.",
+ 'config-wiki-language' => 'Llingua de la wiki:',
+ 'config-wiki-language-help' => "Seleicione la llingua que s'usará preferentemente na wiki.",
+ 'config-back' => '← Atrás',
+ 'config-continue' => 'Siguir →',
+ 'config-page-language' => 'Llingua',
+ 'config-page-welcome' => '¡Bienveníu a MediaWiki!',
+ 'config-page-dbconnect' => 'Conectar cola base de datos',
+ 'config-page-upgrade' => 'Anovar instalación esistente',
+ 'config-page-dbsettings' => 'Configuración de la base de datos',
+ 'config-page-name' => 'Nome',
+ 'config-page-options' => 'Opciones',
+ 'config-page-install' => 'Instalar',
+ 'config-page-complete' => '¡Completo!',
+ 'config-page-restart' => 'Reaniciar la instalación',
+ 'config-page-readme' => 'Llei-me',
+ 'config-page-releasenotes' => 'Notes de la versión',
+ 'config-page-copying' => 'Copiar',
+ 'config-page-upgradedoc' => 'Anovando',
+ 'config-page-existingwiki' => 'Wiki esistente',
+ 'config-download-localsettings' => 'Descargar <code>LocalSettings.php</code>',
+ 'config-help' => 'Ayuda',
+ 'config-nofile' => 'Nun pudo atopase\'l ficheru "$1". ¿Desaniciose?',
'mainpagetext' => "'''MediaWiki instalóse correchamente.'''",
- 'mainpagedocfooter' => "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía d'usuariu] pa saber cómo usar esti software wiki.
+ 'mainpagedocfooter' => 'Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar esti software wiki.
== Empecipiando ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de les opciones de configuración]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]',
);
/** Kotava (Kotava)
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :
$1
'config-support-postgres' => "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.",
'config-support-sqlite' => "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
'config-support-oracle' => '* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])',
- 'config-support-ibm_db2' => '* Un diaz titouroù evit embregerezhioù kenwerzhel eo $1.', # Fuzzy
'config-header-mysql' => 'Arventennoù MySQL',
'config-header-postgres' => 'Arventennoù PostgreSQL',
'config-header-sqlite' => 'Arventennoù SQLite',
'config-header-oracle' => 'Arventennoù Oracle',
- 'config-header-ibm_db2' => 'Arventennoù IBM DB2',
'config-invalid-db-type' => 'Direizh eo ar seurt diaz roadennoù',
'config-missing-db-name' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Anv an diaz titouroù"',
'config-missing-db-host' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Ostiz an diaz titouroù"',
'config-optional-continue' => "Sevel muioc'h a goulennoù ouzhin.",
'config-optional-skip' => 'Aet on skuizh, staliañ ar wiki hepken.',
'config-profile' => 'Profil ar gwirioù implijer :',
- 'config-profile-wiki' => 'Wiki hengounel', # Fuzzy
+ 'config-profile-wiki' => 'Wiki digor',
'config-profile-no-anon' => 'Krouidigezh ur gont ret',
'config-profile-fishbowl' => 'Embanner aotreet hepken',
'config-profile-private' => 'Wiki prevez',
'config-install-alreadydone' => "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.
Kit d'ar bajenn war-lerc'h, mar plij.",
'config-install-begin' => 'Pa vo bet pouezet ganeoc\'h war "{{int:config-continue}}" e krogo staliadur MediaWiki.
-Pouezit war Kent mar fell deoc\'h cheñch tra pe dra.', # Fuzzy
+Pouezit war "{{int:config-back}}" mar fell deoc\'h cheñch tra pe dra.',
'config-install-step-done' => 'graet',
'config-install-step-failed' => "c'hwitet",
'config-install-extensions' => 'En ur gontañ an astennoù',
== Kregiñ ganti ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Roll an arventennoù kefluniañ]
+* [//www.mediawiki.org/wiki/Manual:FAQ FAG MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh", # Fuzzy
);
/** Bosnian (bosanski)
* @author Calak
*/
$messages['ckb'] = array(
+ 'config-wiki-language' => 'زمانی ویکی:',
+ 'config-page-language' => 'زمان',
+ 'config-page-name' => 'ناو',
'mainpagetext' => "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
'mainpagedocfooter' => 'لە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی کەڵک وەربگرە.
* @author Rillke
* @author The Evil IP address
* @author Umherirrender
+ * @author Wikinaut
* @author 아라
*/
$messages['de'] = array(
'config-page-copying' => 'Kopie der Lizenz',
'config-page-upgradedoc' => 'Aktualisiere',
'config-page-existingwiki' => 'Vorhandenes Wiki',
- 'config-help-restart' => 'Sollen alle bereits eingegebene Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
+ 'config-help-restart' => 'Sollen alle bereits eingegebenen Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
'config-restart' => 'Ja, erneut starten',
'config-welcome' => '=== Prüfung der Installationsumgebung ===
Die Basisprüfungen werden durchgeführt, um festzustellen, ob die Installationsumgebung für die Installation von MediaWiki geeignet ist.
'mainpagedocfooter' => 'Περισσότερες πληροφορίες σχετικά με τη χρήση και με τη ρύθμιση παραμέτρων θα βρείτε στους συνδέσμους: [//meta.wikimedia.org/wiki/MediaWiki_localisation Οδηγίες για τροποποίηση του περιβάλλοντος εργασίας] και [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Εγχειρίδιο χρήστη].', # Fuzzy
);
+/** British English (British English)
+ * @author Shirayuki
+ */
+$messages['en-gb'] = array(
+ 'config-unicode-using-utf8' => "Using Brion Vibber's utf8_normalize.so for Unicode normalisation.",
+ 'config-unicode-using-intl' => 'Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalisation.',
+ 'config-unicode-pure-php-warning' => "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalisation, falling back to slow pure-PHP implementation.
+If you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalisation].",
+ 'config-unicode-update-warning' => "'''Warning:''' The installed version of the Unicode normalisation wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
+You should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
+ 'config-unknown-collation' => "'''Warning:''' Database is using unrecognised collation.",
+ 'config-profile-fishbowl' => 'Authorised editors only',
+ 'config-install-stats' => 'Initialising statistics',
+);
+
/** Esperanto (Esperanto)
* @author Airon90
* @author Yekrats
== Toiseach tòiseachaidh ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liosta suidheachadh nan roghainnean]
* [//www.mediawiki.org/wiki/Manual:FAQ CÀBHA MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cuir do chànan air MediaWiki]",
);
/** Galician (galego)
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-mysql' => '* $1 je primarny cil za MediaWiki a podpěruje so najlěpje ([http://www.php.net/manual/en/mysql.installation.php Nawod ke kompilowanju PHP z MySQL-podpěru])',
'config-support-postgres' => '* $1 je popularny system datoweje banki zjawneho žórła jako alternatiwa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php nawod za kompilowanje PHP z podpěru PostgreSQL]). Móhło hišće někotre zmylki eksistować, a njeporuča so jón w produktiwnej wokolinje wužiwać.',
'config-support-oracle' => '* $1 je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/oci8.installation.php Nawod za kompilowanje PHP z OCI8-podpěru])',
- 'config-support-ibm_db2' => '* $1 je komercielna předewzaćelska datowa banka.', # Fuzzy
'config-header-mysql' => 'Nastajenja MySQL',
'config-header-postgres' => 'Nastajenja PostgreSQL',
'config-header-sqlite' => 'Nastajenja SQLite',
'config-header-oracle' => 'Nastajenja Oracle',
- 'config-header-ibm_db2' => 'Nastajenja IBM DB2',
'config-invalid-db-type' => 'Njepłaćiwy typ datoweje banki',
'config-missing-db-name' => 'Dyrbiš hódnotu za "Mjeno datoweje banki" zapodać',
'config-missing-db-host' => 'Dyrbiš hódnotu za "Database host" zapodać',
'config-optional-continue' => 'Dalše prašenja?',
'config-optional-skip' => 'Instaluj nětko wiki.',
'config-profile' => 'Profil wužiwarskich prawow:',
- 'config-profile-wiki' => 'Tradicionelny wiki', # Fuzzy
+ 'config-profile-wiki' => 'Zjawny wiki',
'config-profile-no-anon' => 'Załoženje konto je trěbne',
'config-profile-fishbowl' => 'Jenož awtorizowani wobdźěłarjo',
'config-profile-private' => 'Priwatny wiki',
'config-install-alreadydone' => "'''Warnowanje:''' Zda so, zo sy hižo MediaWiki instalował a pospytuješ jón znowa instalować.
Prošu pokročuj z přichodnej stronu.",
'config-install-begin' => 'Přez kliknjenje na "{{int:config-continue}}" budźe so instalacija MediaWiki startować.
-Jeli hišće chceš něšto změnić, klikń na "Wróćo".', # Fuzzy
+Jeli hišće chceš něšto změnić, klikń na "{{int:config-back}}".',
'config-install-step-done' => 'dokónčene',
'config-install-step-failed' => 'njeporadźiło',
'config-install-extensions' => 'Inkluziwnje rozšěrjenja',
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Wo nastajenjach]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]',
);
/** Haitian (Kreyòl ayisyen)
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki mendukung sistem basis data berikut:
$1
'config-support-postgres' => '* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL]). Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi.',
'config-support-sqlite' => '* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)',
'config-support-oracle' => '* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])',
- 'config-support-ibm_db2' => '* $1 adalah basis data-perusahaan komersial.', # Fuzzy
'config-header-mysql' => 'Pengaturan MySQL',
'config-header-postgres' => 'Pengaturan PostgreSQL',
'config-header-sqlite' => 'Pengaturan SQLite',
'config-header-oracle' => 'Pengaturan Oracle',
- 'config-header-ibm_db2' => 'Pengaturan IBM DB2',
'config-invalid-db-type' => 'Jenis basis data tidak sah',
'config-missing-db-name' => 'Anda harus memasukkan nilai untuk "Nama basis data"',
'config-missing-db-host' => 'Anda harus memasukkan nilai untuk "Inang basis data"',
Ini lebih efisien daripada modus UTF-8 MySQL dan memungkinkan Anda untuk menggunakan ragam penuh karakter Unicode.
Dalam '''modus UTF-8''', MySQL akan tahu apa set karakter data dan dapat menampilkan dan mengubahnya sesuai keperluan, tetapi tidak akan mengizinkan Anda menyimpan karakter di atas [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
- 'config-ibm_db2-low-db-pagesize' => "Basis data DB2 Anda tidak memiliki pagesize yang cukup untuk tablespace bawaan. Pagesize harus sama atau lebih dari '''32K'''.",
'config-site-name' => 'Nama wiki:',
'config-site-name-help' => 'Ini akan muncul di bilah judul peramban dan di berbagai tempat lainnya.',
'config-site-name-blank' => 'Masukkan nama situs.',
'config-copyright' => '=== 著作権および規約 ===
$1
-この作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約に基づき、このライブラリを再配布および改変できます。
+この作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License) (バージョン2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。
この作品は、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。
詳しくは、GNU一般公衆利用許諾書をご覧ください。
-あなたはこのプログラムと共に、<doclink href=Copying>GNU一般公衆利用許諾契約書の複製</doclink>を一部受け取ったはずです。もし受け取っていなければ、フリーソフトウェア財団(宛先は the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA)まで請求してください。',
+あなたはこのプログラムと共に、<doclink href=Copying>GNU一般公衆利用許諾契約書の複製</doclink>を一部受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (宛先は the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA) まで請求してください。',
'config-sidebar' => '* [//www.mediawiki.org MediaWikiのホーム]
* [//www.mediawiki.org/wiki/Help:Contents 利用者向け案内]
* [//www.mediawiki.org/wiki/Manual:Contents 管理者向け案内]
しかし、MediaWikiには PHP $2 以上が必要です。',
'config-unicode-using-utf8' => 'Unicode正規化に、Brion Vibberのutf8_normalize.soを使用。',
'config-unicode-using-intl' => 'Unicode正規化に[http://pecl.php.net/intl intl PECL 拡張機能]を使用。',
- 'config-unicode-pure-php-warning' => "'''警告''': Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。
+ 'config-unicode-pure-php-warning' => "'''警告:''' Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。
高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
- 'config-unicode-update-warning' => "'''警告''': インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。
+ 'config-unicode-update-warning' => "'''警告:''' インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。
Unicode を少しでも利用する可能性がある場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]してください。",
'config-no-db' => '適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。
以下の種類のデータベースに対応しています: $1
共有サーバーを使用している場合は、適切なデータベース ドライバーのインストールを、サーバーの管理者に依頼してください。
PHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysql</code> を実行して、データベース クライアントを使用できるように再設定してください。
Debian または Ubuntu のパッケージから PHP をインストールした場合は、php5-mysql モジュールもインストールする必要があります。',
- 'config-no-fts3' => "'''警告''': SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
+ 'config-no-fts3' => "'''警告:''' SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
'config-register-globals' => "'''警告: PHP の <code>[http://php.net/register_globals register_globals]</code> オプションが有効になっています。'''
'''可能なら無効化してください。'''
MediaWiki は動作しますが、サーバーの潜在的なセキュリティ脆弱性が露呈されます。",
Mandrakeを実行している場合、php-xmlパッケージをインストールしてください。',
'config-pcre' => 'PCREをサポートしているモジュールが不足しているようです。
MediaWikiは、Perl互換の正規表現関数の動作が必要です。',
- 'config-pcre-no-utf8' => "'''致命的エラー''': PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。
+ 'config-pcre-no-utf8' => "'''致命的エラー:''' PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。
MediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
'config-memory-raised' => 'PHPの<code>memory_limit</code>は$1で、$2に引き上げられました。',
'config-memory-bad' => "'''警告:''' PHPの<code>memory_limit</code>に$1に設定されています。
'config-no-cache' => "'''警告:''' [http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]、[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。
オブジェクトのキャッシュは有効化されません。",
'config-diff3-bad' => 'GNU diff3 が見つかりません。',
- 'config-imagemagick' => 'ImageMagickが見つかりました:<code>$1</code>。
-ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81\8cæ\9c\89å\8a¹ã\81ªã\82\89ã\80\81ç\94»å\83\8fã\81®ã\82µã\83 ã\83\8dã\82¤ã\83«ã\81\8c利用できます。',
+ 'config-imagemagick' => 'ImageMagickが見つかりました: <code>$1</code>。
+ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81\8cæ\9c\89å\8a¹ã\81§ã\81\82ã\82\8cã\81°ã\80\81ç\94»å\83\8fã\81®ã\82µã\83 ã\83\8dã\82¤ã\83«ã\82\92利用できます。',
'config-gd' => 'GD画像ライブラリが内蔵されていることが確認されました。
アップロードが有効なら、画像のサムネイルが利用できます。',
'config-no-scaling' => 'GDライブラリもImageMagickも見つかりませんでした。
画像のサムネイル生成は無効になります。',
'config-no-uri' => "'''エラー:''' 現在のURIを決定できませんでした。
インストールは中止されました。",
- 'config-no-cli-uri' => "'''警告''': --scriptpath が指定されていないため、既定値 <code>$1</code> を使用します。",
+ 'config-no-cli-uri' => "'''警告:''' --scriptpath が指定されていないため、既定値 <code>$1</code> を使用します。",
'config-using-server' => 'サーバー名「<nowiki>$1</nowiki>」を使用しています。',
'config-using-uri' => 'サーバー URL「<nowiki>$1$2</nowiki>」を使用しています。',
'config-uploads-not-safe' => "'''警告:''' アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki は以下のデータベース システムに対応しています:
$1
'config-support-postgres' => '* $1は、MySQLの代替として人気があるオープンソースのデータベースシステムです ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQLに対応したPHPをコンパイルする方法])',
'config-support-sqlite' => '* $1は、良くサポートされている、軽量データベースシステムです。([http://www.php.net/manual/ja/pdo.installation.php SQLiteに対応したPHPをコンパイルする方法]、PDOを使用)',
'config-support-oracle' => '* $1は商業企業のデータベースです。([http://www.php.net/manual/en/oci8.installation.php OCI8サポートなPHPをコンパイルする方法])',
- 'config-support-ibm_db2' => '* $1 は商業企業のデータベースです。([http://www.php.net/manual/en/ibm-db2.installation.php IBM DB2に対応したPHPをコンパイルする方法])',
'config-header-mysql' => 'MySQL の設定',
'config-header-postgres' => 'PostgreSQL の設定',
'config-header-sqlite' => 'SQLite の設定',
'config-header-oracle' => 'Oracle の設定',
- 'config-header-ibm_db2' => 'IBM DB2 の設定',
'config-invalid-db-type' => '無効なデータベースの種類',
'config-missing-db-name' => '「データベース名」を入力してください',
'config-missing-db-host' => '「データベースのホスト」を入力してください',
'config-project-namespace-help' => "ウィキペディアの例に従い、多くのウィキは、コンテンツのページとは分離したポリシーページを「'''プロジェクトの名前空間'''」に持っています。
この名前空間内のページのページ名はすべて特定の接頭辞で始まります。それをここで指定できます。
通常、この接頭辞はウィキ名に基づきますが、「#」や「:」のような区切り文字を含めることはできません。",
- 'config-ns-invalid' => '"<nowiki>$1</nowiki>"のように指定された名前空間は無効です。
-違うプロジェクト名前空間を指定してください。',
+ 'config-ns-invalid' => '指定した名前空間「<nowiki>$1</nowiki>」は無効です。
+別のプロジェクト名前空間を指定してください。',
'config-admin-box' => '管理アカウント',
'config-admin-name' => '名前:',
'config-admin-password' => 'パスワード:',
'config-admin-password-confirm' => 'パスワードの再入力:',
- 'config-admin-help' => '希望するユーザー名をここに入力してください (例: "Joe Bloggs")。
+ 'config-admin-help' => '希望するユーザー名をここに入力してください (例:「Joe Bloggs」)。
この名前でこのウィキにログインすることになります。',
'config-admin-name-blank' => '管理者のユーザー名を入力してください。',
'config-admin-name-invalid' => '指定したユーザー名「<nowiki>$1</nowiki>」は無効です。
'config-admin-password-mismatch' => '入力された2つのパスワードが一致しません。',
'config-admin-email' => 'メールアドレス:',
'config-admin-email-help' => 'メールアドレスを入力してください。他の利用者からのメールの受け取り、パスワードのリセット、ウォッチリストに登録したページの更新通知に使用します。空欄のままにすることもできます。',
- 'config-admin-error-user' => '"<nowiki>$1</nowiki>"という名前の管理者を作成する際に内部エラーが発生しました。',
- 'config-admin-error-password' => '管理者"<nowiki>$1</nowiki>"のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
+ 'config-admin-error-user' => '「<nowiki>$1</nowiki>」という名前の管理者を作成する際に内部エラーが発生しました。',
+ 'config-admin-error-password' => '管理者「<nowiki>$1</nowiki>」のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
+ 'config-admin-error-bademail' => '無効なメールアドレスを入力しました。',
'config-subscribe' => '[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce リリース告知のメーリングリスト]を購読する。',
- 'config-subscribe-help' => 'これは、リリースの告知(重要なセキュリティに関する案内を含む)に使われる、低容量のメーリングリストです。
+ 'config-subscribe-help' => 'これは、リリースの告知 (重要なセキュリティに関する案内を含む) に使用される、流量が少ないメーリングリストです。
このメーリングリストを購読して、新しいバージョンが出た場合にMediaWikiを更新してください。',
'config-almost-done' => 'これでほぼ終わりました!
残りの設定を飛ばして、ウィキを今すぐインストールできます。',
'config-install-user-missing-create' => '指定したユーザー「$1」は存在しません。
アカウントを作成する場合は、下の「アカウント作成」をクリックしてください。',
'config-install-tables' => 'テーブルの作成',
- 'config-install-tables-exist' => "'''警告''': MediaWiki テーブルは既に存在するようです。
+ 'config-install-tables-exist' => "'''警告:''' MediaWiki テーブルは既に存在するようです。
作成を省略します。",
- 'config-install-tables-failed' => "'''エラー''': テーブルの作成が、以下のエラーにより失敗しました: $1",
+ 'config-install-tables-failed' => "'''エラー:''' テーブルの作成が、以下のエラーにより失敗しました: $1",
'config-install-interwiki' => '既定のウィキ間テーブルの導入',
'config-install-interwiki-list' => 'ファイル <code>interwiki.list</code> から読み取れませんでした。',
- 'config-install-interwiki-exists' => "'''警告''': ウィキ間テーブルは既に登録されているようです。
+ 'config-install-interwiki-exists' => "'''警告:''' ウィキ間テーブルは既に登録されているようです。
既定のテーブルを無視します。",
'config-install-stats' => '統計情報の初期化',
'config-install-keys' => '秘密鍵の生成',
$3
-'''注意''': この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。
+'''注意:''' この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。
上記の作業が完了すると、'''[$2 ウィキに入る]'''ことができます。",
'config-download-localsettings' => '<code>LocalSettings.php</code> をダウンロード',
* @author පසිඳු කාවින්ද
*/
$messages['yi'] = array(
+ 'config-desc' => 'דער אינסטאלירער פאר מעדיעוויקי',
+ 'config-title' => 'מעדיעוויקי $1 אינסטאלירונג',
+ 'config-information' => 'אינפֿארמאציע',
+ 'config-wiki-language' => 'ווקי שפראך:',
'config-back' => '→ צוריק',
+ 'config-continue' => 'פֿארזעצן ←',
'config-page-language' => 'שפראַך',
'config-page-name' => 'נאָמען',
'config-page-options' => 'ברירות',
+ 'config-db-type' => 'דאטנבאזע טיפ:',
+ 'config-db-name' => 'דאטנבאזע נאָמען:',
+ 'config-project-namespace' => 'פראיעקט נאָמענטייל:',
'config-ns-generic' => 'פראיעקט',
'config-admin-name' => 'אײַער נאָמען:',
'config-admin-password' => 'פאַסווארט:',
+ 'config-admin-password-mismatch' => 'די צוויי פאסוועטרט איר האט איינגעגעבן שטימען נישט.',
'config-admin-email' => 'בליצפּאָסט אַדרעס:',
+ 'config-install-tables' => 'שאפן טאבעלעס',
+ 'config-install-tables-exist' => "'''ווארענונג''': זעט אויס אז די מעדיעוויקי טאבעלעס עקזיסטירן שוין.
+איבערהיפן שאפֿן.",
+ 'config-download-localsettings' => 'אראפלאדן <code>LocalSettings.php</code>',
'config-help' => 'הילף',
+ 'config-nofile' => 'מ\'האט נישט געקענט טרעפן די טעקע "$1". צי האט מען זי אויסגעמעקט?',
'mainpagetext' => "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
'mainpagedocfooter' => "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.
== נוצליכע וועבלינקען פֿאַר אנהייבערס ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]
* [//www.mediawiki.org/wiki/Manual:FAQ אפֿט געפֿרעגטע שאלות]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]",
);
/** Yoruba (Yorùbá)
'config-env-php-toolow' => '已安装PHP $1;但是,MediaWiki需要PHP $2或更高版本。',
'config-unicode-using-utf8' => '使用Brion Vibber的utf8_normalize.so实现Unicode正常化。',
'config-unicode-using-intl' => '使用[http://pecl.php.net/intl intl PECL扩展]实现Unicode正常化。',
- 'config-unicode-pure-php-warning' => "'''警告''':因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。
+ 'config-unicode-pure-php-warning' => "'''警告:'''因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。
如果您运行着一个高流量的站点,请参阅 [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正常化]一文。",
'config-unicode-update-warning' => "'''警告''':Unicode正常化封装器的已安装版本使用了旧版本的[http://site.icu-project.org/ ICU项目]库。如果您需要使用Unicode,请将其[//www.mediawiki.org/wiki/Unicode_normalization_considerations 升级]。",
'config-no-db' => '找不到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库:$1。
请考虑将数据库统一放置在某处,如<code>/var/lib/mediawiki/yourwiki</code>下。",
'config-oracle-def-ts' => '默认表空间:',
'config-oracle-temp-ts' => '临时表空间:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki支持以下数据库系统:
$1
'config-support-postgres' => '* $1是一种流行的开源数据库系统,可作为MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何将对PostgreSQL的支持编译进PHP中])。本程序中可能依然存在一些小而明显的错误,因此并不建议在生产环境中使用该数据库系统。',
'config-support-sqlite' => '* $1是一种轻量级的数据库系统,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何将对SQLite的支持编译进PHP中],须使用PDO)',
'config-support-oracle' => '* $1是一种商用企业级的数据库。([http://www.php.net/manual/en/oci8.installation.php 如何将对OCI8的支持编译进PHP中])',
- 'config-support-ibm_db2' => '* $1是一种商用企业级数据库。([http://www.php.net/manual/en/ibm-db2.installation.php 如何编译支持IBM DB2的PHP])',
'config-header-mysql' => 'MySQL设置',
'config-header-postgres' => 'PostgreSQL设置',
'config-header-sqlite' => 'SQLite设置',
'config-header-oracle' => 'Oracle设置',
- 'config-header-ibm_db2' => 'IBM DB2设置',
'config-invalid-db-type' => '无效的数据库类型',
'config-missing-db-name' => '您必须为“数据库名称”输入内容',
'config-missing-db-host' => '您必须为“数据库主机”输入内容',
'config-mysql-charset-help' => "在'''二进制模式'''下,MediaWiki会将UTF-8编码的文本存于数据库的二进制字段中。相对于MySQL的UTF-8模式,这种方法效率更高,并允许您使用全范围的Unicode字符。
在'''UTF-8模式'''下,MySQL将知道您数据使用的字符集,并能适当地提供和转换内容。但这样做您将无法在数据库中存储[//zh.wikipedia.org/wiki/基本多文种平面 基本多文种平面]以外的字符。",
- 'config-ibm_db2-low-db-pagesize' => "您的DB2数据库默认表空间的页长(pagesize)不足。至少需要'''32K'''或更大的页长。",
'config-site-name' => 'Wiki的名称:',
'config-site-name-help' => '填入的内容会出现在浏览器的标题栏以及其他多处位置中。',
'config-site-name-blank' => '输入网站的名称。',
'config-env-php-toolow' => '已安裝 PHP $1;但是,MediaWiki 需要 PHP $2 或更高版本。',
'config-unicode-using-utf8' => '將使用 Brion Vibber 的 utf8_normalize.so 以實作 Unicode 正規化。',
'config-unicode-using-intl' => '將使用 [http://pecl.php.net/intl intl PECL 延伸函式庫]以實作 Unicode 正規化。',
- 'config-unicode-pure-php-warning' => "'''警告''':因為尚未安裝 [http://pecl.php.net/intl intl PECL 延伸函式庫]以處理 Unicode 正規化,故只能退而採用較慢的純 PHP 實作。如果您運行着一個高流量的網站,請參閱 [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正規化]一文。",
+ 'config-unicode-pure-php-warning' => "'''警告:'''因為尚未安裝 [http://pecl.php.net/intl intl PECL 延伸函式庫]以處理 Unicode 正規化,故只能退而採用較慢的純 PHP 實作。如果您運行着一個高流量的網站,請參閱 [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正規化]一文。",
'config-unicode-update-warning' => "'''警告''':Unicode正常化封裝器的已安裝版本使用了舊版本的[http://site.icu-project.org/ ICU項目]庫。如果您需要使用Unicode,請將其[//www.mediawiki.org/wiki/Unicode_normalization_considerations 升級]。",
'config-no-db' => '找不到合適的數據庫驅動!您需要為PHP安裝數據庫驅動。目前支持以下數據庫:$1。
請考慮將數據庫統一放置在某處,如<code>/var/lib/mediawiki/yourwiki</code>下。",
'config-oracle-def-ts' => '默認表空間:',
'config-oracle-temp-ts' => '臨時表空間:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki支持以下數據庫系統:
$1
'config-support-postgres' => '* $1是一種流行的開源數據庫系統,可作為MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何將對PostgreSQL的支持編譯進PHP中])。本程序中可能依然存在一些小而明顯的錯誤,因此並不建議在生產環境中使用該數據庫系統。',
'config-support-sqlite' => '* $1是一種輕量級的數據庫系統,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何將對SQLite的支持編譯進PHP中],須使用PDO)',
'config-support-oracle' => '* $1是一種商用企業級的數據庫。([http://www.php.net/manual/en/oci8.installation.php 如何將對OCI8的支持編譯進PHP中])',
- 'config-support-ibm_db2' => '* $1是一種商用企業級數據庫。', # Fuzzy
'config-header-mysql' => 'MySQL 的設定',
'config-header-postgres' => 'PostgreSQL設置',
'config-header-sqlite' => 'SQLite 的設定',
'config-header-oracle' => '甲骨文設定',
- 'config-header-ibm_db2' => 'IBM DB2設置',
'config-invalid-db-type' => '無效的資料庫類型',
'config-missing-db-name' => '您必須為“數據庫名稱”輸入內容',
'config-missing-db-host' => '您必須為“數據庫主機”輸入內容',
'config-mysql-charset-help' => "在'''二進制模式'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相對於MySQL的UTF-8模式,這種方法效率更高,並允許您使用全範圍的Unicode字符。
在'''UTF-8模式'''下,MySQL將知道您數據使用的字符集,並能適當地提供和轉換內容。但這樣做您將無法在數據庫中存儲[//zh.wikipedia.org/wiki/基本多文種平面 基本多文種平面]以外的字符。",
- 'config-ibm_db2-low-db-pagesize' => "您的DB2數據庫默認表空間的頁長(pagesize)不足。至少需要'''32K'''或更大的頁長。",
'config-site-name' => 'Wiki的名稱:',
'config-site-name-help' => '填入的內容會出現在瀏覽器的標題欄以及其他多處位置中。',
'config-site-name-blank' => '輸入站點名稱。',
'postgres',
'oracle',
'sqlite',
- 'ibm_db2',
);
/**
}
}
-
/**
* Check the libicu version
*/
## Uncomment this to disable output compression
# \$wgDisableOutputCompression = true;
-\$wgSitename = \"{$this->values['wgSitename']}\";
+\$wgSitename = \"{$this->values['wgSitename']}\";
{$metaNamespace}
## The URL base path to the directory containing the wiki;
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs
## (like /w/index.php/Page_title to /wiki/Page_title) please see:
## http://www.mediawiki.org/wiki/Manual:Short_URL
-\$wgScriptPath = \"{$this->values['wgScriptPath']}\";
-\$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
+\$wgScriptPath = \"{$this->values['wgScriptPath']}\";
+\$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
## The protocol and server name to use in fully-qualified URLs
-\$wgServer = \"{$this->values['wgServer']}\";
+\$wgServer = \"{$this->values['wgServer']}\";
## The relative URL path to the skins directory
-\$wgStylePath = \"\$wgScriptPath/skins\";
+\$wgStylePath = \"\$wgScriptPath/skins\";
## The relative URL path to the logo. Make sure you change this from the default,
## or else you'll overwrite your logo when you upgrade!
-\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
+\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
## UPO means: this is also a user preference option
-\$wgEnableEmail = {$this->values['wgEnableEmail']};
-\$wgEnableUserEmail = {$this->values['wgEnableUserEmail']}; # UPO
+\$wgEnableEmail = {$this->values['wgEnableEmail']};
+\$wgEnableUserEmail = {$this->values['wgEnableUserEmail']}; # UPO
\$wgEmergencyContact = \"{$this->values['wgEmergencyContact']}\";
-\$wgPasswordSender = \"{$this->values['wgPasswordSender']}\";
+\$wgPasswordSender = \"{$this->values['wgPasswordSender']}\";
-\$wgEnotifUserTalk = {$this->values['wgEnotifUserTalk']}; # UPO
-\$wgEnotifWatchlist = {$this->values['wgEnotifWatchlist']}; # UPO
+\$wgEnotifUserTalk = {$this->values['wgEnotifUserTalk']}; # UPO
+\$wgEnotifWatchlist = {$this->values['wgEnotifWatchlist']}; # UPO
\$wgEmailAuthentication = {$this->values['wgEmailAuthentication']};
## Database settings
-\$wgDBtype = \"{$this->values['wgDBtype']}\";
-\$wgDBserver = \"{$this->values['wgDBserver']}\";
-\$wgDBname = \"{$this->values['wgDBname']}\";
-\$wgDBuser = \"{$this->values['wgDBuser']}\";
-\$wgDBpassword = \"{$this->values['wgDBpassword']}\";
+\$wgDBtype = \"{$this->values['wgDBtype']}\";
+\$wgDBserver = \"{$this->values['wgDBserver']}\";
+\$wgDBname = \"{$this->values['wgDBname']}\";
+\$wgDBuser = \"{$this->values['wgDBuser']}\";
+\$wgDBpassword = \"{$this->values['wgDBpassword']}\";
{$this->dbSettings}
## Shared memory settings
-\$wgMainCacheType = $cacheType;
+\$wgMainCacheType = $cacheType;
\$wgMemCachedServers = $mcservers;
## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
-\$wgEnableUploads = {$this->values['wgEnableUploads']};
+\$wgEnableUploads = {$this->values['wgEnableUploads']};
{$magic}\$wgUseImageMagick = true;
{$magic}\$wgImageMagickConvertCommand = \"{$this->values['wgImageMagickConvertCommand']}\";
# InstantCommons allows wiki to use images from http://commons.wikimedia.org
-\$wgUseInstantCommons = {$this->values['wgUseInstantCommons']};
+\$wgUseInstantCommons = {$this->values['wgUseInstantCommons']};
## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
## appropriate copyright notice / icon. GNU Free Documentation
## License and Creative Commons licenses are supported so far.
\$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
-\$wgRightsUrl = \"{$this->values['wgRightsUrl']}\";
+\$wgRightsUrl = \"{$this->values['wgRightsUrl']}\";
\$wgRightsText = \"{$this->values['wgRightsText']}\";
\$wgRightsIcon = \"{$this->values['wgRightsIcon']}\";
$tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
return
"# MySQL specific settings
-\$wgDBprefix = \"{$prefix}\";
+\$wgDBprefix = \"{$prefix}\";
# MySQL table options to use during installation or update
-\$wgDBTableOptions = \"{$tblOpts}\";
+\$wgDBTableOptions = \"{$tblOpts}\";
# Experimental charset support for MySQL 5.0.
\$wgDBmysql5 = {$dbmysql5};";
array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+ array( 'addIndex', 'page_props', 'pp_propname_page', 'patch-page_props-propname-page-index.sql' ),
);
}
if ( $prev_title == $row->cur_title && $prev_namespace == $row->cur_namespace ) {
$deleteId[] = $row->cur_id;
}
- $prev_title = $row->cur_title;
+ $prev_title = $row->cur_title;
$prev_namespace = $row->cur_namespace;
}
$sql = "DELETE FROM $cur WHERE cur_id IN ( " . join( ',', $deleteId ) . ')';
$this->parent->addInstallStep( $callback, 'database' );
}
-
public function setupDatabase() {
$status = Status::newGood();
return $status;
$prefix = $this->getVar( 'wgDBprefix' );
return
"# Oracle specific settings
-\$wgDBprefix = \"{$prefix}\";
+\$wgDBprefix = \"{$prefix}\";
";
}
$schema = $this->getVar( 'wgDBmwschema' );
return
"# Postgres specific settings
-\$wgDBport = \"{$port}\";
-\$wgDBmwschema = \"{$schema}\";";
+\$wgDBport = \"{$port}\";
+\$wgDBmwschema = \"{$schema}\";";
}
public function preUpgrade() {
array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ),
array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ),
array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ),
+ array( 'addPgIndex', 'page_props', 'pp_propname_page', '(pp_propname, pp_page)' ),
array( 'addPgIndex', 'revision', 'rev_text_id_idx', '(rev_text_id)' ),
array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ),
array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ),
$module = DatabaseSqlite::getFulltextSearchModule();
$fts3tTable = $this->db->checkForEnabledSearch();
- if ( $fts3tTable && !$module ) {
+ if ( $fts3tTable && !$module ) {
$status->warning( 'config-sqlite-fts3-downgrade' );
$this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-no-fts.sql" );
} elseif ( !$fts3tTable && $module == 'FTS3' ) {
$dir = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgSQLiteDataDir' ) );
return
"# SQLite-specific settings
-\$wgSQLiteDataDir = \"{$dir}\";";
+\$wgSQLiteDataDir = \"{$dir}\";";
}
}
array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+ array( 'addIndex', 'page_props', 'pp_propname_page', 'patch-page_props-propname-page-index.sql' ),
);
}
protected function sqliteSetupSearchindex() {
$module = DatabaseSqlite::getFulltextSearchModule();
$fts3tTable = $this->updateRowExists( 'fts3' );
- if ( $fts3tTable && !$module ) {
+ if ( $fts3tTable && !$module ) {
$this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' );
} elseif ( !$fts3tTable && $module == 'FTS3' ) {
$this->applyPatch( 'searchindex-fts3.sql', false, "Adding FTS3 search capabilities" );
}
/**
- * @return bool
+ * @return bool Whether only one of each identical set of jobs should be run
*/
public function ignoreDuplicates() {
return $this->removeDuplicates;
}
+ /**
+ * @return bool Whether this job can be retried on failure by job runners
+ */
+ public function allowRetries() {
+ return true;
+ }
+
/**
* Subclasses may need to override this to make duplication detection work
*
protected $type; // string; job type
protected $order; // string; job priority for pop()
protected $claimTTL; // integer; seconds
+ protected $maxTries; // integer; maximum number of times to try a job
const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
- const MAX_ATTEMPTS = 3; // integer; number of times to try a job
-
/**
* @param $params array
*/
protected function __construct( array $params ) {
- $this->wiki = $params['wiki'];
- $this->type = $params['type'];
- $this->order = isset( $params['order'] ) ? $params['order'] : 'random';
+ $this->wiki = $params['wiki'];
+ $this->type = $params['type'];
$this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
+ $this->maxTries = isset( $params['maxTries'] ) ? $params['maxTries'] : 3;
+ if ( isset( $params['order'] ) && $params['order'] !== 'any' ) {
+ $this->order = $params['order'];
+ } else {
+ $this->order = $this->optimalOrder();
+ }
+ if ( !in_array( $this->order, $this->supportedOrders() ) ) {
+ throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
+ }
}
/**
* job runners since jobs can take different times to finish once popped.
* If "timestamp" is used, the queue will at least be loosely ordered
* by timestamp, allowing for some jobs to be popped off out of order.
- * If "random" is used, pop() will pick jobs in random order. This might be
- * useful for improving concurrency depending on the queue storage medium.
+ * If "random" is used, pop() will pick jobs in random order.
+ * Note that it may only be weakly random (e.g. a lottery of the oldest X).
+ * If "any" is choosen, the queue will use whatever order is the fastest.
+ * This might be useful for improving concurrency for job acquisition.
* - claimTTL : If supported, the queue will recycle jobs that have been popped
* but not acknowledged as completed after this many seconds. Recycling
* of jobs simple means re-inserting them into the queue. Jobs can be
return $this->type;
}
+ /**
+ * @return string One of (random, timestamp, fifo)
+ */
+ final public function getOrder() {
+ return $this->order;
+ }
+
+ /**
+ * @return Array Subset of (random, timestamp, fifo)
+ */
+ abstract protected function supportedOrders();
+
+ /**
+ * @return string One of (random, timestamp, fifo)
+ */
+ abstract protected function optimalOrder();
+
/**
* Quickly check if the queue is empty (has no available jobs).
* Queue classes should use caching if they are any slower without memcached.
/**
* Push a single jobs into the queue.
* This does not require $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::push() instead of this function.
*
* @param $jobs Job|Array
* @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
* @throws MWException
*/
final public function push( $jobs, $flags = 0 ) {
- $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
-
- return $this->batchPush( $jobs, $flags );
+ return $this->batchPush( is_array( $jobs ) ? $jobs : array( $jobs ), $flags );
}
/**
* Push a batch of jobs into the queue.
* This does not require $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::push() instead of this function.
*
* @param $jobs array List of Jobs
* @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
* @throws MWException
*/
final public function batchPush( array $jobs, $flags = 0 ) {
+ if ( !count( $jobs ) ) {
+ return true; // nothing to do
+ }
foreach ( $jobs as $job ) {
if ( $job->getType() !== $this->type ) {
throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
}
}
+
wfProfileIn( __METHOD__ );
$ok = $this->doBatchPush( $jobs, $flags );
wfProfileOut( __METHOD__ );
/**
* Pop a job off of the queue.
* This requires $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::pop() instead of this function.
*
- * @return Job|bool Returns false on failure
+ * @return Job|bool Returns false if there are no jobs
* @throws MWException
*/
final public function pop() {
* Acknowledge that a job was completed.
*
* This does nothing for certain queue classes or if "claimTTL" is not set.
+ * Outside callers should use JobQueueGroup::ack() instead of this function.
*
* @param $job Job
* @return bool
* @return void
*/
protected function doFlushCaches() {}
+
+ /**
+ * Get an iterator to traverse over all of the jobs in this queue.
+ * This does not include jobs that are current acquired. In general,
+ * this should only be called on a queue that is no longer being popped.
+ *
+ * @return Iterator|Traversable|Array
+ * @throws MWException
+ */
+ abstract public function getAllQueuedJobs();
+
+ /**
+ * Namespace the queue with a key to isolate it for testing
+ *
+ * @param $key string
+ * @return void
+ * @throws MWException
+ */
+ public function setTestingPrefix( $key ) {
+ throw new MWException( "Queue namespacing not supported for this queue type." );
+ }
}
--- /dev/null
+<?php
+/**
+ * Job queue aggregator code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueueAggregator {
+ /** @var JobQueueAggregator */
+ protected static $instance = null;
+
+ /**
+ * @param array $params
+ */
+ protected function __construct( array $params ) {}
+
+ /**
+ * @return JobQueueAggregator
+ */
+ final public static function singleton() {
+ global $wgJobQueueAggregator;
+
+ if ( !isset( self::$instance ) ) {
+ $class = $wgJobQueueAggregator['class'];
+ $obj = new $class( $wgJobQueueAggregator );
+ if ( !( $obj instanceof JobQueueAggregator ) ) {
+ throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
+ }
+ self::$instance = $obj;
+ }
+
+ return self::$instance;
+ }
+
+ /**
+ * Destroy the singleton instance
+ *
+ * @return void
+ */
+ final public static function destroySingleton() {
+ self::$instance = null;
+ }
+
+ /**
+ * Mark a queue as being empty
+ *
+ * @param string $wiki
+ * @param string $type
+ * @return bool Success
+ */
+ final public function notifyQueueEmpty( $wiki, $type ) {
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doNotifyQueueEmpty( $wiki, $type );
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueueAggregator::notifyQueueEmpty()
+ */
+ abstract protected function doNotifyQueueEmpty( $wiki, $type );
+
+ /**
+ * Mark a queue as being non-empty
+ *
+ * @param string $wiki
+ * @param string $type
+ * @return bool Success
+ */
+ final public function notifyQueueNonEmpty( $wiki, $type ) {
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueueAggregator::notifyQueueNonEmpty()
+ */
+ abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
+
+ /**
+ * Get the list of all of the queues with jobs
+ *
+ * @return Array (job type => (list of wiki IDs))
+ */
+ final public function getAllReadyWikiQueues() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetAllReadyWikiQueues();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueueAggregator::getAllReadyWikiQueues()
+ */
+ abstract protected function doGetAllReadyWikiQueues();
+
+ /**
+ * Get all databases that have a pending job.
+ * This poll all the queues and is this expensive.
+ *
+ * @return Array (job type => (list of wiki IDs))
+ */
+ protected function findPendingWikiQueues() {
+ global $wgLocalDatabases;
+
+ $pendingDBs = array(); // (job type => (db list))
+ foreach ( $wgLocalDatabases as $db ) {
+ foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
+ $pendingDBs[$type][] = $db;
+ }
+ }
+
+ return $pendingDBs;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job queue aggregator code that uses BagOStuff.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using BagOStuff
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorMemc extends JobQueueAggregator {
+ /** @var BagOStuff */
+ protected $cache;
+
+ protected $cacheTTL; // integer; seconds
+
+ /**
+ * @params include:
+ * - objectCache : Name of an object cache registered in $wgObjectCaches.
+ * This defaults to the one specified by $wgMainCacheType.
+ * - cacheTTL : Seconds to cache the aggregate data before regenerating.
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $this->cache = isset( $params['objectCache'] )
+ ? wfGetCache( $params['objectCache'] )
+ : wfGetMainCache();
+ $this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueEmpty()
+ */
+ protected function doNotifyQueueEmpty( $wiki, $type ) {
+ $key = $this->getReadyQueueCacheKey();
+ // Delist the queue from the "ready queue" list
+ if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+ $curInfo = $this->cache->get( $key );
+ if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
+ if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
+ $curInfo['pendingDBs'][$type] = array_diff(
+ $curInfo['pendingDBs'][$type], array( $wiki ) );
+ $this->cache->set( $key, $curInfo );
+ }
+ }
+ $this->cache->delete( "$key:lock" ); // unlock
+ }
+ return true;
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+ */
+ protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+ return true; // updated periodically
+ }
+
+ /**
+ * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+ */
+ protected function doGetAllReadyWikiQueues() {
+ $key = $this->getReadyQueueCacheKey();
+ // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
+ // regenerate the cache. Use any available stale cache if another process is
+ // currently regenerating the pending DB information.
+ $pendingDbInfo = $this->cache->get( $key );
+ if ( !is_array( $pendingDbInfo )
+ || ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
+ || mt_rand( 0, 999 ) == 0
+ ) {
+ if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
+ $pendingDbInfo = array(
+ 'pendingDBs' => $this->findPendingWikiQueues(),
+ 'timestamp' => time()
+ );
+ for ( $attempts=1; $attempts <= 25; ++$attempts ) {
+ if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+ $this->cache->set( $key, $pendingDbInfo );
+ $this->cache->delete( "$key:lock" ); // unlock
+ break;
+ }
+ }
+ $this->cache->delete( "$key:rebuild" ); // unlock
+ }
+ }
+ return is_array( $pendingDbInfo )
+ ? $pendingDbInfo['pendingDBs']
+ : array(); // cache is both empty and locked
+ }
+
+ /**
+ * @return string
+ */
+ private function getReadyQueueCacheKey() {
+ return "jobqueue:aggregator:ready-queues:v1"; // global
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job queue aggregator code that uses PhpRedis.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using PhpRedis
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorRedis extends JobQueueAggregator {
+ /** @var RedisConnectionPool */
+ protected $redisPool;
+
+ /**
+ * @params include:
+ * - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+ * - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+ * If a hostname is specified but no port, the standard port number
+ * 6379 will be used. Required.
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $this->server = $params['redisServer'];
+ $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueEmpty()
+ */
+ protected function doNotifyQueueEmpty( $wiki, $type ) {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return false;
+ }
+ try {
+ $conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
+ return true;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+ return false;
+ }
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+ */
+ protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return false;
+ }
+ try {
+ $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
+ return true;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+ return false;
+ }
+ }
+
+ /**
+ * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+ */
+ protected function doGetAllReadyWikiQueues() {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return array();
+ }
+ try {
+ $conn->multi( Redis::PIPELINE );
+ $conn->exists( $this->getReadyQueueKey() );
+ $conn->hGetAll( $this->getReadyQueueKey() );
+ list( $exists, $map ) = $conn->exec();
+
+ if ( $exists ) { // cache hit
+ $pendingDBs = array(); // (type => list of wikis)
+ foreach ( $map as $key => $time ) {
+ list( $type, $wiki ) = $this->dencQueueName( $key );
+ $pendingDBs[$type][] = $wiki;
+ }
+ } else { // cache miss
+ $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
+
+ $now = time();
+ $map = array();
+ foreach ( $pendingDBs as $type => $wikis ) {
+ foreach ( $wikis as $wiki ) {
+ $map[$this->encQueueName( $type, $wiki )] = $now;
+ }
+ }
+ $conn->hMSet( $this->getReadyQueueKey(), $map );
+ }
+
+ return $pendingDBs;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+ return array();
+ }
+ }
+
+ /**
+ * Get a connection to the server that handles all sub-queues for this queue
+ *
+ * @return Array (server name, Redis instance)
+ * @throws MWException
+ */
+ protected function getConnection() {
+ return $this->redisPool->getConnection( $this->server );
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @param RedisException $e
+ * @return void
+ */
+ protected function handleException( RedisConnRef $conn, $e ) {
+ $this->redisPool->handleException( $this->server, $conn, $e );
+ }
+
+ /**
+ * @return string
+ */
+ private function getReadyQueueKey() {
+ return "jobqueue:aggregator:h-ready-queues:v1"; // global
+ }
+
+ /**
+ * @param string $type
+ * @param string $wiki
+ * @return string
+ */
+ private function encQueueName( $type, $wiki ) {
+ return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
+ }
+
+ /**
+ * @param string $name
+ * @return string
+ */
+ private function dencQueueName( $name ) {
+ list( $type, $wiki ) = explode( '/', $name, 2 );
+ return array( rawurldecode( $type ), rawurldecode( $wiki ) );
+ }
+}
* @since 1.21
*/
class JobQueueDB extends JobQueue {
- const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
+ const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
- const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
- const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
- const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
- const MAX_OFFSET = 255; // integer; maximum number of rows to skip
+ const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
+ const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
+ const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
+ const MAX_OFFSET = 255; // integer; maximum number of rows to skip
protected $cluster = false; // string; name of an external DB cluster
$this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
}
+ protected function supportedOrders() {
+ return array( 'random', 'timestamp', 'fifo' );
+ }
+
+ protected function optimalOrder() {
+ return 'random';
+ }
+
/**
* @see JobQueue::doIsEmpty()
* @return bool
}
}
+ $key = $this->getCacheKey( 'empty' );
$atomic = ( $flags & self::QoS_Atomic );
- $key = $this->getCacheKey( 'empty' );
- $ttl = self::CACHE_TTL_LONG;
$dbw->onTransactionIdle(
- function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $ttl, $scope
+ function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $scope
) {
global $wgMemc;
$dbw->commit( __METHOD__ );
}
- $wgMemc->set( $key, 'false', $ttl ); // queue is not empty
+ $wgMemc->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
} );
}
$row = $this->claimOldest( $uuid );
} else { // random first
$rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
- $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
- $row = $this->claimRandom( $uuid, $rand, $gte );
+ $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+ $row = $this->claimRandom( $uuid, $rand, $gte );
}
// Check if we found a row to reserve...
if ( !$row ) {
// For small queues, using OFFSET will overshoot and return no rows more often.
// Instead, this uses job_random to pick a row (possibly checking both directions).
$ineq = $gte ? '>=' : '<=';
- $dir = $gte ? 'ASC' : 'DESC';
- $row = $dbw->selectRow( 'job', '*', // find a random job
+ $dir = $gte ? 'ASC' : 'DESC';
+ $row = $dbw->selectRow( 'job', '*', // find a random job
array(
'job_cmd' => $this->type,
'job_token' => '', // unclaimed
'job_cmd' => $this->type,
"job_token != {$dbw->addQuotes( '' )}", // was acquired
"job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
- "job_attempts < {$dbw->addQuotes( self::MAX_ATTEMPTS )}" ), // retries left
+ "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
__METHOD__
);
$ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
"job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
);
if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
- $conds[] = "job_attempts >= {$dbw->addQuotes( self::MAX_ATTEMPTS )}";
+ $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
}
// Get the IDs of jobs that are considered stale and should be removed. Selecting
// the IDs first means that the UPDATE can be done by primary key (less deadlocks).
}
}
+ /**
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllQueuedJobs() {
+ list( $dbr, $scope ) = $this->getSlaveDB();
+ return new MappedIterator(
+ $dbr->select( 'job', '*', array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
+ function( $row ) use ( $scope ) {
+ $job = Job::factory(
+ $row->job_cmd,
+ Title::makeTitle( $row->job_namespace, $row->job_title ),
+ strlen( $row->job_params ) ? unserialize( $row->job_params ) : false,
+ $row->job_id
+ );
+ $job->id = $row->job_id; // XXX: work around broken subclasses
+ return $job;
+ }
+ );
+ }
+
/**
* @return Array (DatabaseBase, ScopedCallback)
*/
protected $wiki; // string; wiki ID
const TYPE_DEFAULT = 1; // integer; jobs popped by default
- const TYPE_ANY = 2; // integer; any job
+ const TYPE_ANY = 2; // integer; any job
- const USE_CACHE = 1; // integer; use process cache
+ const USE_CACHE = 1; // integer; use process or persistent cache
const PROC_CACHE_TTL = 15; // integer; seconds
+ const CACHE_VERSION = 1; // integer; cache version
+
/**
* @param $wiki string Wiki ID
*/
protected function __construct( $wiki ) {
$this->wiki = $wiki;
- $this->cache = new ProcessCacheLRU( 1 );
+ $this->cache = new ProcessCacheLRU( 10 );
}
/**
}
/**
+ * Get the job queue object for a given queue type
+ *
* @param $type string
- * @return JobQueue Job queue object for a given queue type
+ * @return JobQueue
*/
public function get( $type ) {
global $wgJobTypeConf;
/**
* Insert jobs into the respective queues of with the belong.
- * This inserts the jobs into the queue specified by $wgJobTypeConf.
+ *
+ * This inserts the jobs into the queue specified by $wgJobTypeConf
+ * and updates the aggregate job queue information cache as needed.
*
* @param $jobs Job|array A single Job or a list of Jobs
* @throws MWException
$ok = true;
foreach ( $jobsByType as $type => $jobs ) {
- if ( !$this->get( $type )->push( $jobs ) ) {
+ if ( $this->get( $type )->push( $jobs ) ) {
+ JobQueueAggregator::singleton()->notifyQueueNonEmpty( $this->wiki, $type );
+ } else {
$ok = false;
}
}
/**
* Pop a job off one of the job queues
*
- * @param $queueType integer JobQueueGroup::TYPE_* constant
+ * This pops a job off a queue as specified by $wgJobTypeConf and
+ * updates the aggregate job queue information cache as needed.
+ *
+ * @param $qtype integer|string JobQueueGroup::TYPE_DEFAULT or type string
* @param $flags integer Bitfield of JobQueueGroup::USE_* constants
* @return Job|bool Returns false on failure
*/
- public function pop( $queueType = self::TYPE_DEFAULT, $flags = 0 ) {
- if ( $flags & self::USE_CACHE ) {
- if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
- $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
+ public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0 ) {
+ if ( is_string( $qtype ) ) { // specific job type
+ $job = $this->get( $qtype )->pop();
+ if ( !$job ) {
+ JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
+ }
+ return $job;
+ } else { // any job in the "default" jobs types
+ if ( $flags & self::USE_CACHE ) {
+ if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
+ $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
+ }
+ $types = $this->cache->get( 'queues-ready', 'list' );
+ } else {
+ $types = $this->getQueuesWithJobs();
}
- $types = $this->cache->get( 'queues-ready', 'list' );
- } else {
- $types = $this->getQueuesWithJobs();
- }
-
- if ( $queueType == self::TYPE_DEFAULT ) {
- $types = array_intersect( $types, $this->getDefaultQueueTypes() );
- }
- shuffle( $types ); // avoid starvation
- foreach ( $types as $type ) { // for each queue...
- $job = $this->get( $type )->pop();
- if ( $job ) { // found
- return $job;
- } else { // not found
- $this->cache->clear( 'queues-ready' );
+ if ( $qtype == self::TYPE_DEFAULT ) {
+ $types = array_intersect( $types, $this->getDefaultQueueTypes() );
+ }
+ shuffle( $types ); // avoid starvation
+
+ foreach ( $types as $type ) { // for each queue...
+ $job = $this->get( $type )->pop();
+ if ( $job ) { // found
+ return $job;
+ } else { // not found
+ JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $type );
+ $this->cache->clear( 'queues-ready' );
+ }
}
- }
- return false; // no jobs found
+ return false; // no jobs found
+ }
}
/**
* @return array List of strings
*/
public function getQueueTypes() {
- global $wgJobClasses;
-
- return array_keys( $wgJobClasses );
+ return array_keys( $this->getCachedConfigVar( 'wgJobClasses' ) );
}
/**
}
/**
+ * Get the list of job types that have non-empty queues
+ *
* @return Array List of job types that have non-empty queues
*/
public function getQueuesWithJobs() {
}
/**
- * @return Array List of default job types that have non-empty queues
+ * Check if jobs should not be popped of a queue right now.
+ * This is only used for performance, such as to avoid spamming
+ * the queue with many sub-jobs before they actually get run.
+ *
+ * @param $type string
+ * @return bool
*/
- public function getDefaultQueuesWithJobs() {
- $types = array();
- foreach ( $this->getDefaultQueueTypes() as $type ) {
- if ( !$this->get( $type )->isEmpty() ) {
- $types[] = $type;
- }
+ public function isQueueDeprioritized( $type ) {
+ if ( $type === 'refreshLinks2' ) {
+ // Don't keep converting refreshLinks2 => refreshLinks jobs if the
+ // later jobs have not been done yet. This helps throttle queue spam.
+ return !$this->get( 'refreshLinks' )->isEmpty();
}
- return $types;
+ return false;
}
/**
return $count;
}
+
+ /**
+ * @param $name string
+ * @return mixed
+ */
+ private function getCachedConfigVar( $name ) {
+ global $wgConf, $wgMemc;
+
+ if ( $this->wiki === wfWikiID() ) {
+ return $GLOBALS[$name]; // common case
+ } else {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ $key = wfForeignMemcKey( $db, $prefix, 'configvalue', $name );
+ $value = $wgMemc->get( $key ); // ('v' => ...) or false
+ if ( is_array( $value ) ) {
+ return $value['v'];
+ } else {
+ $value = $wgConf->getConfig( $this->wiki, $name );
+ $wgMemc->set( $key, array( 'v' => $value ), 86400 + mt_rand( 0, 86400 ) );
+ return $value;
+ }
+ }
+ }
}
protected $server; // string; server address
- const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
+ const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
+ protected $key; // string; key to prefix the queue keys with (used for testing)
+
/**
* @params include:
- * - redisConf : An array of parameters to RedisConnectionPool::__construct().
- * - server : A hostname/port combination or the absolute path of a UNIX socket.
- * If a hostname is specified but no port, the standard port number
- * 6379 will be used. Required.
+ * - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+ * - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+ * If a hostname is specified but no port, the standard port number
+ * 6379 will be used. Required.
* @param array $params
*/
public function __construct( array $params ) {
parent::__construct( $params );
- $this->server = $params['redisConf']['server'];
- $this->redisPool = RedisConnectionPool::singleton( $params['redisConf'] );
+ $this->server = $params['redisServer'];
+ $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+ }
+
+ protected function supportedOrders() {
+ return array( 'timestamp', 'fifo' );
+ }
+
+ protected function optimalOrder() {
+ return 'fifo';
}
/**
* @throws MWException
*/
protected function doIsEmpty() {
- if ( mt_rand( 0, 99 ) == 0 ) {
- $this->doInternalMaintenance();
- }
-
$conn = $this->getConnection();
try {
return ( $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) ) == 0 );
* @throws MWException
*/
protected function doGetSize() {
- if ( mt_rand( 0, 99 ) == 0 ) {
- $this->doInternalMaintenance();
- }
-
$conn = $this->getConnection();
try {
return $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) );
* @throws MWException
*/
protected function doGetAcquiredCount() {
- if ( mt_rand( 0, 99 ) == 0 ) {
- $this->doInternalMaintenance();
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
}
-
$conn = $this->getConnection();
try {
- if ( $this->claimTTL > 0 ) {
- return $conn->lSize( $this->getQueueKey( 'l-claimed' ) );
- } else {
- return 0;
- }
+ return $conn->lSize( $this->getQueueKey( 'l-claimed' ) );
} catch ( RedisException $e ) {
$this->throwRedisException( $this->server, $conn, $e );
}
protected function doPop() {
$job = false;
- if ( mt_rand( 0, 99 ) == 0 ) {
- $this->doInternalMaintenance();
+ if ( $this->claimTTL <= 0 && mt_rand( 0, 99 ) == 0 ) {
+ $this->cleanupClaimedJobs(); // prune jobs and IDs from the "garbage" list
}
$conn = $this->getConnection();
}
/**
- * Do any job recycling or queue cleanup as needed
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllQueuedJobs() {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ throw new MWException( "Unable to connect to redis server." );
+ }
+ try {
+ $that = $this;
+ return new MappedIterator(
+ $conn->lRange( $this->getQueueKey( 'l-unclaimed' ), 0, -1 ),
+ function( $uid ) use ( $that, $conn ) {
+ return $that->getJobFromUidInternal( $uid, $conn );
+ }
+ );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * This function should not be called outside RedisJobQueue
*
- * @return void
- * @return integer Number of jobs recycled/deleted
+ * @param $uid string
+ * @param $conn RedisConnRef
+ * @return Job
* @throws MWException
*/
- protected function doInternalMaintenance() {
- return ( $this->claimTTL > 0 ) ?
- $this->recycleAndDeleteStaleJobs() : $this->cleanupClaimedJobs();
+ public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
+ try {
+ $fields = $conn->get( $this->prefixWithQueueKey( 'data', $uid ) );
+ if ( !is_array( $fields ) ) { // wtf?
+ $conn->delete( $this->prefixWithQueueKey( 'data', $uid ) );
+ throw new MWException( "Could not find job with UID '$uid'." );
+ }
+ $title = Title::makeTitle( $fields['namespace'], $fields['title'] );
+ $job = Job::factory( $fields['type'], $title, $fields['params'] );
+ $job->metadata['sourceFields'] = $fields;
+ return $job;
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
}
/**
* @return integer Number of jobs recycled/deleted
* @throws MWException
*/
- protected function recycleAndDeleteStaleJobs() {
+ public function recycleAndDeleteStaleJobs() {
+ if ( $this->claimTTL <= 0 ) { // sanity
+ throw new MWException( "Cannot recycle jobs since acknowledgements are disabled." );
+ }
$count = 0;
// For each job item that can be retried, we need to add it back to the
// main queue and remove it from the list of currenty claimed job items.
if ( $ctime < $claimCutoff ) {
// Get the number of failed attempts
$attempts = isset( $info['attempts'] ) ? $info['attempts'] : 0;
- if ( $attempts < self::MAX_ATTEMPTS ) {
+ if ( $attempts < $this->maxTries ) {
$uidsPush[] = $uid; // retry it
} elseif ( $ctime < $pruneCutoff ) {
$uidsRemove[] = $uid; // just remove it
return $count;
}
+ /**
+ * @return Array
+ */
+ protected function doGetPeriodicTasks() {
+ if ( $this->claimTTL > 0 ) {
+ return array(
+ 'recycleAndDeleteStaleJobs' => array(
+ 'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+ 'period' => ceil( $this->claimTTL / 2 )
+ )
+ );
+ } else {
+ return array();
+ }
+ }
+
/**
* @param $job Job
* @return array
*/
private function getQueueKey( $prop ) {
list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
- return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $prop );
+ if ( strlen( $this->key ) ) { // namespaced queue (for testing)
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $this->key, $prop );
+ } else {
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $prop );
+ }
}
/**
}
return $res;
}
+
+ /**
+ * @param $key string
+ * @return void
+ */
+ public function setTestingPrefix( $key ) {
+ $this->key = $key;
+ }
}
\section intro Introduction
The data model consist of the following main components:
-
* The Job object represents a particular deferred task that happens in the
background. All jobs subclass the Job object and put the main logic in the
function called run().
For example there may be a queue for email jobs and a queue for squid purge
jobs.
+\section jobqueue Job queues
+
Each job type has its own queue and is associated to a storage medium. One
queue might save its jobs in redis while another one uses would use a database.
The following queue classes are available:
* JobQueueDB (stores jobs in the `job` table in a database)
+* JobQueueRedis (stores jobs in a redis server)
All queue classes support some basic operations (though some may be no-ops):
* enqueueing a batch of jobs
lost. Some jobs, like purging squid caches after a template change, may not
require durable queues, whereas other jobs might be more important.
+\section aggregator Job queue aggregator
+
+The aggregators are used by nextJobDB.php, which is a script that will return a
+random ready queue (on any wiki in the farm) that can be used with runJobs.php.
+This can be used in conjuction with any scripts that handle wiki farm job queues.
+Note that $wgLocalDatabases defines what wikis are in the wiki farm.
+
+Since each job type has its own queue, and wiki-farms may have many wikis,
+there might be a large number of queues to keep track of. To avoid wasting
+large amounts of time polling empty queues, aggregators exists to keep track
+of which queues are ready.
+
+The following queue aggregator classes are available:
+* JobQueueAggregatorMemc (uses $wgMemc to track ready queues)
+* JobQueueAggregatorRedis (uses a redis server to track ready queues)
+
+Some aggregators cache data for a few minutes while others may be always up to date.
+This can be an important factor for jobs that need a low pickup time (or latency).
+
+\section jobs Jobs
+
Callers should also try to make jobs maintain correctness when executed twice.
This is useful for queues that actually implement ack(), since they may recycle
dequeued but un-acknowledged jobs back into the queue to be attempted again. If
--- /dev/null
+<?php
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Upload
+ */
+
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * @ingroup Upload
+ */
+class AssembleUploadChunksJob extends Job {
+ public function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'AssembleUploadChunks', $title, $params, $id );
+ $this->removeDuplicates = true;
+ }
+
+ public function run() {
+ $scope = RequestContext::importScopedSession( $this->params['session'] );
+ $context = RequestContext::getMain();
+ try {
+ $user = $context->getUser();
+ if ( !$user->isLoggedIn() || $user->getId() != $this->params['userid'] ) {
+ $this->setLastError( "Could not load the author user from session." );
+ return true; // no retries
+ }
+
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
+ );
+
+ $upload = new UploadFromChunks( $user );
+ $upload->continueChunks(
+ $this->params['filename'],
+ $this->params['filekey'],
+ $context->getRequest()
+ );
+
+ // Combine all of the chunks into a local file and upload that to a new stash file
+ $status = $upload->concatenateChunks();
+ if ( !$status->isGood() ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
+ );
+ $this->setLastError( $status->getWikiText() );
+ return true; // no retries
+ }
+
+ // We have a new filekey for the fully concatenated file
+ $newFileKey = $upload->getLocalFile()->getFileKey();
+
+ // Remove the old stash file row and first chunk file
+ $upload->stash->removeFileNoAuth( $this->params['filekey'] );
+
+ // Build the image info array while we have the local reference handy
+ $apiMain = new ApiMain(); // dummy object (XXX)
+ $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+ // Cleanup any temporary local file
+ $upload->cleanupTempFile();
+
+ // Cache the info so the user doesn't have to wait forever to get the final info
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Success',
+ 'stage' => 'assembling',
+ 'filekey' => $newFileKey,
+ 'imageinfo' => $imageInfo,
+ 'status' => Status::newGood()
+ )
+ );
+ } catch ( MWException $e ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Failure',
+ 'stage' => 'assembling',
+ 'status' => Status::newFatal( 'api-error-stashfailed' )
+ )
+ );
+ $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+ }
+ return true; // returns true on success and erro (no retries)
+ }
+
+ /**
+ * @return Array
+ */
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ if ( is_array( $info['params'] ) ) {
+ $info['params'] = array( 'filekey' => $info['params']['filekey'] );
+ }
+ return $info;
+ }
+}
return false;
}
+ $user = $this->getUser();
+ if ( !$user ) {
+ $this->setLastError( 'Invalid user' );
+ return false;
+ }
+
# Save it
global $wgUser;
$oldUser = $wgUser;
- $wgUser = $this->getUser();
+ $wgUser = $user;
$article = WikiPage::factory( $this->title );
$reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
$this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
)->inContentLanguage()->text();
- $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $this->getUser() );
+ $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $user );
$wgUser = $oldUser;
return true;
/**
* Get a user object for doing edits, from a request-lifetime cache
- * @return User
+ * False will be returned if the user name specified in the
+ * 'double-redirect-fixer' message is invalid.
+ *
+ * @return User|bool
*/
function getUser() {
if ( !self::$user ) {
- self::$user = User::newFromName( wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text(), false );
- # FIXME: newFromName could return false on a badly configured wiki.
- if ( !self::$user->isLoggedIn() ) {
+ self::$user = User::newFromName( wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text() );
+ # User::newFromName() can return false on a badly configured wiki.
+ if ( self::$user && !self::$user->isLoggedIn() ) {
self::$user->addToDatabase();
}
}
*/
public static function newFromJob( Job $job ) {
$djob = new self( $job->getTitle(), $job->getParams(), $job->getId() );
- $djob->command = $job->getType();
- $djob->params = is_array( $djob->params ) ? $djob->params : array();
- $djob->params = array( 'isDuplicate' => true ) + $djob->params;
+ $djob->command = $job->getType();
+ $djob->params = is_array( $djob->params ) ? $djob->params : array();
+ $djob->params = array( 'isDuplicate' => true ) + $djob->params;
$djob->metadata = $job->metadata;
return $djob;
}
parent::__construct( 'htmlCacheUpdate', $title, $params, $id );
- $this->rowsPerJob = $wgUpdateRowsPerJob;
+ $this->rowsPerJob = $wgUpdateRowsPerJob;
$this->rowsPerQuery = $wgUpdateRowsPerQuery;
- $this->blCache = $title->getBacklinkCache();
+ $this->blCache = $title->getBacklinkCache();
}
public function run() {
--- /dev/null
+<?php
+/**
+ * Upload a file from the upload stash into the local file repo.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Upload
+ */
+
+/**
+ * Upload a file from the upload stash into the local file repo.
+ *
+ * @ingroup Upload
+ */
+class PublishStashedFileJob extends Job {
+ public function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'PublishStashedFile', $title, $params, $id );
+ $this->removeDuplicates = true;
+ }
+
+ public function run() {
+ $scope = RequestContext::importScopedSession( $this->params['session'] );
+ $context = RequestContext::getMain();
+ try {
+ $user = $context->getUser();
+ if ( !$user->isLoggedIn() || $user->getId() != $this->params['userid'] ) {
+ $this->setLastError( "Could not load the author user from session." );
+ return true; // no retries
+ }
+
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
+ );
+
+ $upload = new UploadFromStash( $user );
+ // @TODO: initialize() causes a GET, ideally we could frontload the antivirus
+ // checks and anything else to the stash stage (which includes concatenation and
+ // the local file is thus already there). That way, instead of GET+PUT, there could
+ // just be a COPY operation from the stash to the public zone.
+ $upload->initialize( $this->params['filekey'], $this->params['filename'] );
+
+ // Check if the local file checks out (this is generally a no-op)
+ $verification = $upload->verifyUpload();
+ if ( $verification['status'] !== UploadBase::OK ) {
+ $status = Status::newFatal( 'verification-error' );
+ $status->value = array( 'verification' => $verification );
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
+ );
+ $this->setLastError( "Could not verify upload." );
+ return true; // no retries
+ }
+
+ // Upload the stashed file to a permanent location
+ $status = $upload->performUpload(
+ $this->params['comment'],
+ $this->params['text'],
+ $this->params['watch'],
+ $user
+ );
+ if ( !$status->isGood() ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
+ );
+ $this->setLastError( $status->getWikiText() );
+ return true; // no retries
+ }
+
+ // Build the image info array while we have the local reference handy
+ $apiMain = new ApiMain(); // dummy object (XXX)
+ $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+ // Cleanup any temporary local file
+ $upload->cleanupTempFile();
+
+ // Cache the info so the user doesn't have to wait forever to get the final info
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Success',
+ 'stage' => 'publish',
+ 'filename' => $upload->getLocalFile()->getName(),
+ 'imageinfo' => $imageInfo,
+ 'status' => Status::newGood()
+ )
+ );
+ } catch ( MWException $e ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Failure',
+ 'stage' => 'publish',
+ 'status' => Status::newFatal( 'api-error-publishfailed' )
+ )
+ );
+ $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+ }
+ return true; // returns true on success and erro (no retries)
+ }
+
+ /**
+ * @return Array
+ */
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ if ( is_array( $info['params'] ) ) {
+ $info['params'] = array( 'filekey' => $info['params']['filekey'] );
+ }
+ return $info;
+ }
+}
$masterPos = false;
}
- $tbc = $this->title->getBacklinkCache();
+ $tbc = $this->title->getBacklinkCache();
$jobs = array(); // jobs to insert
if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
*/
protected function getSingleTitleJobs( $table, $masterPos ) {
# The "start"/"end" fields are not set for the base jobs
- $start = isset( $this->params['start'] ) ? $this->params['start'] : false;
- $end = isset( $this->params['end'] ) ? $this->params['end'] : false;
+ $start = isset( $this->params['start'] ) ? $this->params['start'] : false;
+ $end = isset( $this->params['end'] ) ? $this->params['end'] : false;
$titles = $this->title->getBacklinkCache()->getLinks( $table, $start, $end );
# Convert into single page refresh links jobs.
# This handles well when in sapi mode and is useful in any case for job
/**
* Returns an array holding all the data that should go into serialization calls.
* This is intended to allow overloading without having to reimplement the
- * behaviour of this base class.
+ * behavior of this base class.
*
* @since 1.20
*
* whether the script filename has been obscured.
*
* The function returns false if the server is not known to have this
- * behaviour. Microsoft IIS in particular is known to decode escaped script
+ * behavior. Microsoft IIS in particular is known to decode escaped script
* filenames.
*
* SERVER_SOFTWARE typically contains either a plain string such as "Zeus",
else
ulimit -v "$MW_MEM_LIMIT"
fi
+else
+ MW_CGROUP=""
fi
if [ "$MW_FILE_SIZE_LIMIT" -gt 0 ]; then
ulimit -f "$MW_FILE_SIZE_LIMIT"
$entry = $this->entry;
$params = $this->extractParameters();
$params[0] = Message::rawParam( $this->getPerformerElement() );
- $params[1] = $entry->getPerformer()->getName();
+ $params[1] = $this->canView( LogPage::DELETED_USER ) ? $entry->getPerformer()->getName() : '';
$params[2] = Message::rawParam( $this->makePageLink( $entry->getTarget() ) );
// Bad things happens if the numbers are not in correct order
}
$changeText = $this->context->getLanguage()->listToText( $changes );
-
$newParams = array_slice( $params, 0, 3 );
$newParams[3] = $changeText;
$count = count( explode( ',', $params[$paramStart] ) );
return $messages[$flag];
}
-
/**
* Name of the log.
* @return Message
return true;
}
-
/**
* Extracts the width/height if the image will be scaled before rotating
*
return array( $width, $height );
}
-
/**
* Function that returns the number of pixels to be thumbnailed.
* Intended for animated GIFs to multiply by the number of frames.
return $this->getClientScalingThumbnailImage( $image, $scalerParams );
}
-
if ( $scaler == 'client' ) {
# Client-side image scaling, use the source URL
# Using the destination URL in a TRANSFORM_LATER request would be incorrect
$rotation = $this->getRotation( $image );
list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
- $cmd =
+ $cmd =
wfEscapeShellArg( $wgImageMagickConvertCommand ) .
// Specify white background color, will be used for transparent images
// in Internet Explorer/Windows instead of default black.
# Escape glob chars
$path = preg_replace( '/[*?\[\]{}]/', '\\\\\0', $path );
- return $this->escapeMagickPath( $path, $scene );
+ return self::escapeMagickPath( $path, $scene );
}
/**
*/
function escapeMagickOutput( $path, $scene = false ) {
$path = str_replace( '%', '%%', $path );
- return $this->escapeMagickPath( $path, $scene );
+ return self::escapeMagickPath( $path, $scene );
}
/**
}
}
+ /**
+ * @param $file File
+ * @param $params array Rotate parameters.
+ * 'rotation' clockwise rotation in degrees, allowed are multiples of 90
+ * @since 1.21
+ * @return bool
+ */
+ public static function rotate( $file, $params ) {
+ global $wgImageMagickConvertCommand;
+
+ $rotation = ( $params[ 'rotation' ] + self::getRotation( $file ) ) % 360;
+ $scene = false;
+
+ $scaler = self::getScalerType( null, false );
+ switch ( $scaler ) {
+ case 'im':
+ $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
+ wfEscapeShellArg( self::escapeMagickInput( $params[ 'srcPath' ], $scene ) ) .
+ " -rotate -$rotation " .
+ wfEscapeShellArg( self::escapeMagickOutput( $params[ 'dstPath' ] ) ) . " 2>&1";
+ wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
+ wfProfileIn( 'convert' );
+ $retval = 0;
+ $err = wfShellExec( $cmd, $retval, $env );
+ wfProfileOut( 'convert' );
+ if ( $retval !== 0 ) {
+ self::logErrorForExternalProcess( $retval, $err, $cmd );
+ return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
+ }
+ return false;
+ case 'imext':
+ $im = new Imagick();
+ $im->readImage( $params['srcPath'] );
+ if ( !$im->rotateImage( new ImagickPixel( 'white' ), 360 - $rotation ) ) {
+ return new MediaTransformError( 'thumbnail_error', 0, 0,
+ "Error rotating $rotation degrees" );
+ }
+ $result = $im->writeImage( $params['dstPath'] );
+ if ( !$result ) {
+ return new MediaTransformError( 'thumbnail_error', 0, 0,
+ "Unable to write image to {$params['dstPath']}" );
+ }
+ return false;
+ default:
+ return new MediaTransformError( 'thumbnail_error', 0, 0,
+ "$scaler rotation not implemented" );
+ }
+ }
+
/**
* Rerurns whether the file needs to be rendered. Returns true if the
* file requires rotation and we are able to rotate it.
private $iptcType = 'iptc-no-hash';
/**
- * This does the photoshop image resource app13 block
- * of interest, IPTC-IIM metadata is stored here.
- *
- * Mostly just calls doPSIR and doIPTC
- *
- * @param String $app13 String containing app13 block from jpeg file
- */
+ * This does the photoshop image resource app13 block
+ * of interest, IPTC-IIM metadata is stored here.
+ *
+ * Mostly just calls doPSIR and doIPTC
+ *
+ * @param String $app13 String containing app13 block from jpeg file
+ */
private function doApp13 ( $app13 ) {
try {
$this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
$this->addMetadata( $iptc, $this->iptcType );
}
-
/**
* Get exif info using exif class.
* Basically what used to be in BitmapHandler::getMetadata().
}
}
/** Add misc metadata. Warning: atm if the metadata category
- * doesn't have a priority, it will be silently discarded.
- *
- * @param Array $metaArray array of metadata values
- * @param string $type type. defaults to other. if two things have the same type they're merged
- */
+ * doesn't have a priority, it will be silently discarded.
+ *
+ * @param Array $metaArray array of metadata values
+ * @param string $type type. defaults to other. if two things have the same type they're merged
+ */
function addMetadata ( $metaArray, $type = 'other' ) {
if ( isset( $this->metadata[$type] ) ) {
/* merge with old data */
}
/**
- * Merge together the various types of metadata
- * the different types have different priorites,
- * and are merged in order.
- *
- * This function is generally called by the media handlers' getMetadata()
- *
- * @return Array metadata array
- */
+ * Merge together the various types of metadata
+ * the different types have different priorites,
+ * and are merged in order.
+ *
+ * This function is generally called by the media handlers' getMetadata()
+ *
+ * @return Array metadata array
+ */
function getMetadataArray () {
// this seems a bit ugly... This is all so its merged in right order
// based on the MWG recomendation.
}
}
-
-
}
return $info !== false;
}
-
/**
* Return data in the style of getimagesize()
* @return array or false on failure
$data = $this->getInfo();
if( $data !== false ) {
- $width = $data['width'];
+ $width = $data['width'];
$height = $data['height'];
return array( $width, $height, 'DjVu',
*/
class Exif {
- const BYTE = 1; //!< An 8-bit (1-byte) unsigned integer.
- const ASCII = 2; //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.
- const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
- const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
- const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
- const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
- const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
- const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
- const IGNORE = -1; // A fake value for things we don't want or don't support.
+ const BYTE = 1; //!< An 8-bit (1-byte) unsigned integer.
+ const ASCII = 2; //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.
+ const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
+ const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
+ const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
+ const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
+ const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
+ const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
+ const IGNORE = -1; // A fake value for things we don't want or don't support.
//@{
/* @var array
}
/**
- * Collapse some fields together.
- * This converts some fields from exif form, to a more friendly form.
- * For example GPS latitude to a single number.
- *
- * The rationale behind this is that we're storing data, not presenting to the user
- * For example a longitude is a single number describing how far away you are from
- * the prime meridian. Well it might be nice to split it up into minutes and seconds
- * for the user, it doesn't really make sense to split a single number into 4 parts
- * for storage. (degrees, minutes, second, direction vs single floating point number).
- *
- * Other things this might do (not really sure if they make sense or not):
- * Dates -> mediawiki date format.
- * convert values that can be in different units to be in one standardized unit.
- *
- * As an alternative approach, some of this could be done in the validate phase
- * if we make up our own types like Exif::DATE.
- */
+ * Collapse some fields together.
+ * This converts some fields from exif form, to a more friendly form.
+ * For example GPS latitude to a single number.
+ *
+ * The rationale behind this is that we're storing data, not presenting to the user
+ * For example a longitude is a single number describing how far away you are from
+ * the prime meridian. Well it might be nice to split it up into minutes and seconds
+ * for the user, it doesn't really make sense to split a single number into 4 parts
+ * for storage. (degrees, minutes, second, direction vs single floating point number).
+ *
+ * Other things this might do (not really sure if they make sense or not):
+ * Dates -> mediawiki date format.
+ * convert values that can be in different units to be in one standardized unit.
+ *
+ * As an alternative approach, some of this could be done in the validate phase
+ * if we make up our own types like Exif::DATE.
+ */
function collapseData( ) {
$this->exifGPStoNumber( 'GPSLatitude' );
}
/**
- * Do userComment tags and similar. See pg. 34 of exif standard.
- * basically first 8 bytes is charset, rest is value.
- * This has not been tested on any shift-JIS strings.
- * @param $prop String prop name.
- */
+ * Do userComment tags and similar. See pg. 34 of exif standard.
+ * basically first 8 bytes is charset, rest is value.
+ * This has not been tested on any shift-JIS strings.
+ * @param $prop String prop name.
+ */
private function charCodeString ( $prop ) {
if ( isset( $this->mFilteredExifData[$prop] ) ) {
}
}
/**
- * Convert an Exif::UNDEFINED from a raw binary string
- * to its value. This is sometimes needed depending on
- * the type of UNDEFINED field
- * @param $prop String name of property
- */
+ * Convert an Exif::UNDEFINED from a raw binary string
+ * to its value. This is sometimes needed depending on
+ * the type of UNDEFINED field
+ * @param $prop String name of property
+ */
private function exifPropToOrd ( $prop ) {
if ( isset( $this->mFilteredExifData[$prop] ) ) {
$this->mFilteredExifData[$prop] = ord( $this->mFilteredExifData[$prop] );
}
}
/**
- * Convert gps in exif form to a single floating point number
- * for example 10 degress 20`40`` S -> -10.34444
- * @param String $prop a gps coordinate exif tag name (like GPSLongitude)
- */
+ * Convert gps in exif form to a single floating point number
+ * for example 10 degress 20`40`` S -> -10.34444
+ * @param String $prop a gps coordinate exif tag name (like GPSLongitude)
+ */
private function exifGPStoNumber ( $prop ) {
$loc =& $this->mFilteredExifData[$prop];
$dir =& $this->mFilteredExifData[$prop . 'Ref'];
}
$data = $file->getMetadata();
- return $this->getRotationForExif( $data );
+ return self::getRotationForExif( $data );
}
/**
* @file
*/
-
/**
* Format Image metadata values into a human readable form.
*
}
break;
-
case 'GPSTrackRef':
case 'GPSImgDirectionRef':
case 'GPSDestBearingRef':
}
/**
- * A function to collapse multivalued tags into a single value.
- * This turns an array of (for example) authors into a bulleted list.
- *
- * This is public on the basis it might be useful outside of this class.
- *
- * @param $vals Array array of values
- * @param $type String Type of array (either lang, ul, ol).
- * lang = language assoc array with keys being the lang code
- * ul = unordered list, ol = ordered list
- * type can also come from the '_type' member of $vals.
- * @param $noHtml Boolean If to avoid returning anything resembling
- * html. (Ugly hack for backwards compatibility with old mediawiki).
- * @return String single value (in wiki-syntax).
- */
+ * A function to collapse multivalued tags into a single value.
+ * This turns an array of (for example) authors into a bulleted list.
+ *
+ * This is public on the basis it might be useful outside of this class.
+ *
+ * @param $vals Array array of values
+ * @param $type String Type of array (either lang, ul, ol).
+ * lang = language assoc array with keys being the lang code
+ * ul = unordered list, ol = ordered list
+ * type can also come from the '_type' member of $vals.
+ * @param $noHtml Boolean If to avoid returning anything resembling
+ * html. (Ugly hack for backwards compatibility with old mediawiki).
+ * @return String single value (in wiki-syntax).
+ */
public static function flattenArray( $vals, $type = 'ul', $noHtml = false ) {
if ( isset( $vals['_type'] ) ) {
$type = $vals['_type'];
*
* @deprecated since 1.18
*
-**/
+ */
class FormatExif {
var $meta;
*/
static function readGCT( $fh, $bpp ) {
if ( $bpp > 0 ) {
- for( $i=1; $i<=pow( 2, $bpp ); ++$i ) {
+ for( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
fread( $fh, 3 );
}
}
class IPTC {
/**
- * This takes the results of iptcparse() and puts it into a
- * form that can be handled by mediawiki. Generally called from
- * BitmapMetadataHandler::doApp13.
- *
- * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
- *
- * @param $rawData String app13 block from jpeg containing iptc/iim data
- * @return Array iptc metadata array
- */
+ * This takes the results of iptcparse() and puts it into a
+ * form that can be handled by mediawiki. Generally called from
+ * BitmapMetadataHandler::doApp13.
+ *
+ * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
+ *
+ * @param $rawData String app13 block from jpeg containing iptc/iim data
+ * @return Array iptc metadata array
+ */
static function parse( $rawData ) {
$parsed = iptcparse( $rawData );
$data = Array();
/* original transmission ref.
* "A code representing the location of original transmission ac-
* cording to practises of the provider."
- */
+ */
$data['OriginalTransmissionRef'] = self::convIPTC( $val, $c );
break;
case '2#118': /*contact*/
}
/**
- * Convert an iptc date and time tags into the exif format
- *
- * @todo Potentially this should also capture the timezone offset.
- * @param Array $date The date tag
- * @param Array $time The time tag
- * @param $c
- * @return String Date in exif format.
- */
+ * Convert an iptc date and time tags into the exif format
+ *
+ * @todo Potentially this should also capture the timezone offset.
+ * @param Array $date The date tag
+ * @param Array $time The time tag
+ * @param $c
+ * @return String Date in exif format.
+ */
private static function timeHelper( $date, $time, $c ) {
if ( count( $date ) === 1 ) {
//the standard says this should always be 1
}
/**
- * Helper function to convert charset for iptc values.
- * @param $data string|array The iptc string
- * @param $charset String: The charset
+ * Helper function to convert charset for iptc values.
+ * @param $data string|array The iptc string
+ * @param $charset String: The charset
*
* @return string|array
- */
+ */
private static function convIPTC ( $data, $charset ) {
if ( is_array( $data ) ) {
foreach ( $data as &$val ) {
return $data;
}
/**
- * Helper function of a helper function to convert charset for iptc values.
- * @param $data Mixed String or Array: The iptc string
- * @param $charset String: The charset
- *
- * @return string
- */
+ * Helper function of a helper function to convert charset for iptc values.
+ * @param $data Mixed String or Array: The iptc string
+ * @param $charset String: The charset
+ *
+ * @return string
+ */
private static function convIPTCHelper ( $data, $charset ) {
if ( $charset ) {
wfSuppressWarnings();
}
/**
- * take the value of 1:90 tag and returns a charset
- * @param String $tag 1:90 tag.
- * @return string charset name or "?"
- * Warning, this function does not (and is not intended to) detect
- * all iso 2022 escape codes. In practise, the code for utf-8 is the
- * only code that seems to have wide use. It does detect that code.
- */
+ * take the value of 1:90 tag and returns a charset
+ * @param String $tag 1:90 tag.
+ * @return string charset name or "?"
+ * Warning, this function does not (and is not intended to) detect
+ * all iso 2022 escape codes. In practise, the code for utf-8 is the
+ * only code that seems to have wide use. It does detect that code.
+ */
static function getCharset( $tag ) {
//According to iim standard, charset is defined by the tag 1:90.
case "\x1b(K":
$c = "ISO646-DE";
break;
- case "\x1b(N": //crylic
+ case "\x1b(N": //crylic
$c = "ISO_5427";
break;
case "\x1b(`": //iso646-NO
$params['height'] = $params['physicalHeight'];
}
-
if ( !$this->validateThumbParams( $params['physicalWidth'],
$params['physicalHeight'], $srcWidth, $srcHeight, $mimeType ) ) {
return false;
}
}
+ /**
+ * @param $file File
+ * @param $params array Rotate parameters.
+ * 'rotation' clockwise rotation in degrees, allowed are multiples of 90
+ * @since 1.21
+ * @return bool
+ */
+ public static function rotate( $file, $params ) {
+ global $wgJpegTran;
+
+ $rotation = ( $params[ 'rotation' ] + self::getRotation( $file ) ) % 360;
+
+ if( $wgJpegTran && is_file( $wgJpegTran ) ){
+ $cmd = wfEscapeShellArg( $wgJpegTran ) .
+ " -rotate " . wfEscapeShellArg( $rotation ) .
+ " -outfile " . wfEscapeShellArg( $params[ 'dstPath' ] ) .
+ " " . wfEscapeShellArg( $params[ 'srcPath' ] ) . " 2>&1";
+ wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
+ wfProfileIn( 'jpegtran' );
+ $retval = 0;
+ $err = wfShellExec( $cmd, $retval, $env );
+ wfProfileOut( 'jpegtran' );
+ if ( $retval !== 0 ) {
+ self::logErrorForExternalProcess( $retval, $err, $cmd );
+ return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
+ }
+ return false;
+ } else {
+ return Bitmap::rotate( $file, $params );
+ }
+ }
+
}
// that many segments. Your average file has about 10.
/** Function to extract metadata segments of interest from jpeg files
- * based on GIFMetadataExtractor.
- *
- * we can almost use getimagesize to do this
- * but gis doesn't support having multiple app1 segments
- * and those can't extract xmp on files containing both exif and xmp data
- *
- * @param String $filename name of jpeg file
- * @return Array of interesting segments.
- * @throws MWException if given invalid file.
- */
+ * based on GIFMetadataExtractor.
+ *
+ * we can almost use getimagesize to do this
+ * but gis doesn't support having multiple app1 segments
+ * and those can't extract xmp on files containing both exif and xmp data
+ *
+ * @param String $filename name of jpeg file
+ * @return Array of interesting segments.
+ * @throws MWException if given invalid file.
+ */
static function segmentSplitter ( $filename ) {
$showXMP = function_exists( 'xml_parser_create_ns' );
}
/**
- * This reads the photoshop image resource.
- * Currently it only compares the iptc/iim hash
- * with the stored hash, which is used to determine the precedence
- * of the iptc data. In future it may extract some other info, like
- * url of copyright license.
- *
- * This should generally be called by BitmapMetadataHandler::doApp13()
- *
- * @param String $app13 photoshop psir app13 block from jpg.
- * @throws MWException (It gets caught next level up though)
- * @return String if the iptc hash is good or not.
- */
+ * This reads the photoshop image resource.
+ * Currently it only compares the iptc/iim hash
+ * with the stored hash, which is used to determine the precedence
+ * of the iptc data. In future it may extract some other info, like
+ * url of copyright license.
+ *
+ * This should generally be called by BitmapMetadataHandler::doApp13()
+ *
+ * @param String $app13 photoshop psir app13 block from jpg.
+ * @throws MWException (It gets caught next level up though)
+ * @return String if the iptc hash is good or not.
+ */
public static function doPSIR ( $app13 ) {
if ( !$app13 ) {
throw new MWException( "No App13 segment given" );
function getMetadata( $image, $path ) { return ''; }
/**
- * Get metadata version.
- *
- * This is not used for validating metadata, this is used for the api when returning
- * metadata, since api content formats should stay the same over time, and so things
- * using ForiegnApiRepo can keep backwards compatibility
- *
- * All core media handlers share a common version number, and extensions can
- * use the GetMetadataVersion hook to append to the array (they should append a unique
- * string so not to get confusing). If there was a media handler named 'foo' with metadata
- * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
- * version is 2, the end version string would look like '2;foo=3'.
- *
- * @return string version string
- */
+ * Get metadata version.
+ *
+ * This is not used for validating metadata, this is used for the api when returning
+ * metadata, since api content formats should stay the same over time, and so things
+ * using ForiegnApiRepo can keep backwards compatibility
+ *
+ * All core media handlers share a common version number, and extensions can
+ * use the GetMetadataVersion hook to append to the array (they should append a unique
+ * string so not to get confusing). If there was a media handler named 'foo' with metadata
+ * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
+ * version is 2, the end version string would look like '2;foo=3'.
+ *
+ * @return string version string
+ */
static function getMetadataVersion () {
$version = Array( '2' ); // core metadata version
wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
}
/**
- * Convert metadata version.
- *
- * By default just returns $metadata, but can be used to allow
- * media handlers to convert between metadata versions.
- *
- * @param $metadata Mixed String or Array metadata array (serialized if string)
- * @param $version Integer target version
- * @return Array serialized metadata in specified version, or $metadata on fail.
- */
+ * Convert metadata version.
+ *
+ * By default just returns $metadata, but can be used to allow
+ * media handlers to convert between metadata versions.
+ *
+ * @param $metadata Mixed String or Array metadata array (serialized if string)
+ * @param $version Integer target version
+ * @return Array serialized metadata in specified version, or $metadata on fail.
+ */
function convertMetadataVersion( $metadata, $version = 1 ) {
if ( !is_array( $metadata ) ) {
return self::METADATA_GOOD;
}
-
/**
* Get a MediaTransformOutput object representing an alternate of the transformed
* output which will call an intermediary thumbnail assist script.
return $fields;
}
-
/**
* This is used to generate an array element for each metadata value
* That array is then used to generate the table of metadata values
public function filterThumbnailPurgeList( &$files, $options ) {
// Do nothing
}
+
+ /*
+ * True if the handler can rotate the media
+ * @since 1.21
+ * @return bool
+ */
+ public static function canRotate() {
+ return false;
+ }
}
*/
/**
-* Class for reading xmp data containing properties relevant to
-* images, and spitting out an array that FormatExif accepts.
-*
-* Note, this is not meant to recognize every possible thing you can
-* encode in XMP. It should recognize all the properties we want.
-* For example it doesn't have support for structures with multiple
-* nesting levels, as none of the properties we're supporting use that
-* feature. If it comes across properties it doesn't recognize, it should
-* ignore them.
-*
-* The public methods one would call in this class are
-* - parse( $content )
-* Reads in xmp content.
-* Can potentially be called multiple times with partial data each time.
-* - parseExtended( $content )
-* Reads XMPExtended blocks (jpeg files only).
-* - getResults
-* Outputs a results array.
-*
-* Note XMP kind of looks like rdf. They are not the same thing - XMP is
-* encoded as a specific subset of rdf. This class can read XMP. It cannot
-* read rdf.
-*
-*/
+ * Class for reading xmp data containing properties relevant to
+ * images, and spitting out an array that FormatExif accepts.
+ *
+ * Note, this is not meant to recognize every possible thing you can
+ * encode in XMP. It should recognize all the properties we want.
+ * For example it doesn't have support for structures with multiple
+ * nesting levels, as none of the properties we're supporting use that
+ * feature. If it comes across properties it doesn't recognize, it should
+ * ignore them.
+ *
+ * The public methods one would call in this class are
+ * - parse( $content )
+ * Reads in xmp content.
+ * Can potentially be called multiple times with partial data each time.
+ * - parseExtended( $content )
+ * Reads XMPExtended blocks (jpeg files only).
+ * - getResults
+ * Outputs a results array.
+ *
+ * Note XMP kind of looks like rdf. They are not the same thing - XMP is
+ * encoded as a specific subset of rdf. This class can read XMP. It cannot
+ * read rdf.
+ *
+ */
class XMPReader {
private $curItem = array(); // array to hold the current element (and previous element, and so on)
protected $items;
/**
- * These are various mode constants.
- * they are used to figure out what to do
- * with an element when its encountered.
- *
- * For example, MODE_IGNORE is used when processing
- * a property we're not interested in. So if a new
- * element pops up when we're in that mode, we ignore it.
- */
+ * These are various mode constants.
+ * they are used to figure out what to do
+ * with an element when its encountered.
+ *
+ * For example, MODE_IGNORE is used when processing
+ * a property we're not interested in. So if a new
+ * element pops up when we're in that mode, we ignore it.
+ */
const MODE_INITIAL = 0;
- const MODE_IGNORE = 1;
- const MODE_LI = 2;
+ const MODE_IGNORE = 1;
+ const MODE_LI = 2;
const MODE_LI_LANG = 3;
- const MODE_QDESC = 4;
+ const MODE_QDESC = 4;
// The following MODE constants are also used in the
// $items array to denote what type of property the item is.
- const MODE_SIMPLE = 10;
- const MODE_STRUCT = 11; // structure (associative array)
- const MODE_SEQ = 12; // ordered list
- const MODE_BAG = 13; // unordered list
- const MODE_LANG = 14;
- const MODE_ALT = 15; // non-language alt. Currently not implemented, and not needed atm.
+ const MODE_SIMPLE = 10;
+ const MODE_STRUCT = 11; // structure (associative array)
+ const MODE_SEQ = 12; // ordered list
+ const MODE_BAG = 13; // unordered list
+ const MODE_LANG = 14;
+ const MODE_ALT = 15; // non-language alt. Currently not implemented, and not needed atm.
const MODE_BAGSTRUCT = 16; // A BAG of Structs.
const NS_RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
const NS_XML = 'http://www.w3.org/XML/1998/namespace';
-
/**
- * Constructor.
- *
- * Primary job is to initialize the XMLParser
- */
+ * Constructor.
+ *
+ * Primary job is to initialize the XMLParser
+ */
function __construct() {
if ( !function_exists( 'xml_parser_create_ns' ) ) {
}
/**
- * Main use is if a single item has multiple xmp documents describing it.
- * For example in jpeg's with extendedXMP
- */
+ * Main use is if a single item has multiple xmp documents describing it.
+ * For example in jpeg's with extendedXMP
+ */
private function resetXMLParser() {
if ( $this->xmlParser ) {
}
/** Destroy the xml parser
- *
- * Not sure if this is actually needed.
- */
+ *
+ * Not sure if this is actually needed.
+ */
function __destruct() {
// not sure if this is needed.
xml_parser_free( $this->xmlParser );
}
/** Get the result array. Do some post-processing before returning
- * the array, and transform any metadata that is special-cased.
- *
- * @return Array array of results as an array of arrays suitable for
- * FormatMetadata::getFormattedData().
- */
+ * the array, and transform any metadata that is special-cased.
+ *
+ * @return Array array of results as an array of arrays suitable for
+ * FormatMetadata::getFormattedData().
+ */
public function getResults() {
// xmp-special is for metadata that affects how stuff
// is extracted. For example xmpNote:HasExtendedXMP.
}
}
-
// We don't want to return the special values, since they're
// special and not info to be stored about the file.
unset( $data['xmp-special'] );
return false;
}
-
// we're not very robust here. we should accept it in the wrong order. To quote
// the xmp standard:
// "A JPEG writer should write the ExtendedXMP marker segments in order, immediately following the
}
/**
- * Character data handler
- * Called whenever character data is found in the xmp document.
- *
- * does nothing if we're in MODE_IGNORE or if the data is whitespace
- * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
- * data in the other modes).
- *
- * As an example, this happens when we encounter XMP like:
- * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
- * and are processing the 0/10 bit.
- *
- * @param $parser XMLParser reference to the xml parser
- * @param $data String Character data
- * @throws MWException on invalid data
- */
+ * Character data handler
+ * Called whenever character data is found in the xmp document.
+ *
+ * does nothing if we're in MODE_IGNORE or if the data is whitespace
+ * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
+ * data in the other modes).
+ *
+ * As an example, this happens when we encounter XMP like:
+ * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
+ * and are processing the 0/10 bit.
+ *
+ * @param $parser XMLParser reference to the xml parser
+ * @param $data String Character data
+ * @throws MWException on invalid data
+ */
function char( $parser, $data ) {
$data = trim( $data );
}
/** When we hit a closing element in MODE_IGNORE
- * Check to see if this is the element we started to ignore,
- * in which case we get out of MODE_IGNORE
- *
- * @param $elm String Namespace of element followed by a space and then tag name of element.
- */
+ * Check to see if this is the element we started to ignore,
+ * in which case we get out of MODE_IGNORE
+ *
+ * @param $elm String Namespace of element followed by a space and then tag name of element.
+ */
private function endElementModeIgnore ( $elm ) {
if ( $this->curItem[0] === $elm ) {
array_shift( $this->curItem );
}
/**
- * Hit a closing element when in MODE_SIMPLE.
- * This generally means that we finished processing a
- * property value, and now have to save the result to the
- * results array
- *
- * For example, when processing:
- * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
- * this deals with when we hit </exif:DigitalZoomRatio>.
- *
- * Or it could be if we hit the end element of a property
- * of a compound data structure (like a member of an array).
- *
- * @param $elm String namespace, space, and tag name.
- */
+ * Hit a closing element when in MODE_SIMPLE.
+ * This generally means that we finished processing a
+ * property value, and now have to save the result to the
+ * results array
+ *
+ * For example, when processing:
+ * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
+ * this deals with when we hit </exif:DigitalZoomRatio>.
+ *
+ * Or it could be if we hit the end element of a property
+ * of a compound data structure (like a member of an array).
+ *
+ * @param $elm String namespace, space, and tag name.
+ */
private function endElementModeSimple ( $elm ) {
if ( $this->charContent !== false ) {
if ( $this->processingArray ) {
}
/**
- * End element while in MODE_QDESC
- * mostly when ending an element when we have a simple value
- * that has qualifiers.
- *
- * Qualifiers aren't all that common, and we don't do anything
- * with them.
- *
- * @param $elm String namespace and element
- */
+ * End element while in MODE_QDESC
+ * mostly when ending an element when we have a simple value
+ * that has qualifiers.
+ *
+ * Qualifiers aren't all that common, and we don't do anything
+ * with them.
+ *
+ * @param $elm String namespace and element
+ */
private function endElementModeQDesc( $elm ) {
if ( $elm === self::NS_RDF . ' value' ) {
array_shift( $this->mode );
array_shift( $this->curItem );
}
-
-
}
/**
}
/**
- * Hit an opening element while in MODE_IGNORE
- *
- * XMP is extensible, so ignore any tag we don't understand.
- *
- * Mostly ignores, unless we encounter the element that we are ignoring.
- * in which case we add it to the item stack, so we can ignore things
- * that are nested, correctly.
- *
- * @param $elm String namespace . ' ' . tag name
- */
+ * Hit an opening element while in MODE_IGNORE
+ *
+ * XMP is extensible, so ignore any tag we don't understand.
+ *
+ * Mostly ignores, unless we encounter the element that we are ignoring.
+ * in which case we add it to the item stack, so we can ignore things
+ * that are nested, correctly.
+ *
+ * @param $elm String namespace . ' ' . tag name
+ */
private function startElementModeIgnore( $elm ) {
if ( $elm === $this->curItem[0] ) {
array_unshift( $this->curItem, $elm );
}
/**
- * Start element in MODE_BAG (unordered array)
- * this should always be <rdf:Bag>
- *
- * @param $elm String namespace . ' ' . tag
- * @throws MWException if we have an element that's not <rdf:Bag>
- */
+ * Start element in MODE_BAG (unordered array)
+ * this should always be <rdf:Bag>
+ *
+ * @param $elm String namespace . ' ' . tag
+ * @throws MWException if we have an element that's not <rdf:Bag>
+ */
private function startElementModeBag( $elm ) {
if ( $elm === self::NS_RDF . ' Bag' ) {
array_unshift( $this->mode, self::MODE_LI );
}
/**
- * Start element in MODE_SEQ (ordered array)
- * this should always be <rdf:Seq>
- *
- * @param $elm String namespace . ' ' . tag
- * @throws MWException if we have an element that's not <rdf:Seq>
- */
+ * Start element in MODE_SEQ (ordered array)
+ * this should always be <rdf:Seq>
+ *
+ * @param $elm String namespace . ' ' . tag
+ * @throws MWException if we have an element that's not <rdf:Seq>
+ */
private function startElementModeSeq( $elm ) {
if ( $elm === self::NS_RDF . ' Seq' ) {
array_unshift( $this->mode, self::MODE_LI );
}
/**
- * Start element in MODE_LANG (language alternative)
- * this should always be <rdf:Alt>
- *
- * This tag tends to be used for metadata like describe this
- * picture, which can be translated into multiple languages.
- *
- * XMP supports non-linguistic alternative selections,
- * which are really only used for thumbnails, which
- * we don't care about.
- *
- * @param $elm String namespace . ' ' . tag
- * @throws MWException if we have an element that's not <rdf:Alt>
- */
+ * Start element in MODE_LANG (language alternative)
+ * this should always be <rdf:Alt>
+ *
+ * This tag tends to be used for metadata like describe this
+ * picture, which can be translated into multiple languages.
+ *
+ * XMP supports non-linguistic alternative selections,
+ * which are really only used for thumbnails, which
+ * we don't care about.
+ *
+ * @param $elm String namespace . ' ' . tag
+ * @throws MWException if we have an element that's not <rdf:Alt>
+ */
private function startElementModeLang( $elm ) {
if ( $elm === self::NS_RDF . ' Alt' ) {
array_unshift( $this->mode, self::MODE_LI_LANG );
}
/**
- * Start an element when in MODE_QDESC.
- * This generally happens when a simple element has an inner
- * rdf:Description to hold qualifier elements.
- *
- * For example in:
- * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
- * <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
- * </exif:DigitalZoomRatio>
- * Called when processing the <rdf:value> or <foo:someQualifier>.
- *
- * @param $elm String namespace and tag name separated by a space.
- *
- */
+ * Start an element when in MODE_QDESC.
+ * This generally happens when a simple element has an inner
+ * rdf:Description to hold qualifier elements.
+ *
+ * For example in:
+ * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
+ * <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
+ * </exif:DigitalZoomRatio>
+ * Called when processing the <rdf:value> or <foo:someQualifier>.
+ *
+ * @param $elm String namespace and tag name separated by a space.
+ *
+ */
private function startElementModeQDesc( $elm ) {
if ( $elm === self::NS_RDF . ' value' ) {
return; // do nothing
}
/**
- * opening element in MODE_LI
- * process elements of arrays.
- *
- * Example:
- * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
- * </rdf:Seq> </exif:ISOSpeedRatings>
- * This method is called when we hit the <rdf:li> element.
- *
- * @param $elm String: namespace . ' ' . tagname
- * @param $attribs Array: Attributes. (needed for BAGSTRUCTS)
- * @throws MWException if gets a tag other than <rdf:li>
- */
+ * opening element in MODE_LI
+ * process elements of arrays.
+ *
+ * Example:
+ * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
+ * </rdf:Seq> </exif:ISOSpeedRatings>
+ * This method is called when we hit the <rdf:li> element.
+ *
+ * @param $elm String: namespace . ' ' . tagname
+ * @param $attribs Array: Attributes. (needed for BAGSTRUCTS)
+ * @throws MWException if gets a tag other than <rdf:li>
+ */
private function startElementModeLi( $elm, $attribs ) {
if ( ( $elm ) !== self::NS_RDF . ' li' ) {
throw new MWException( "<rdf:li> expected but got $elm." );
}
/**
- * Opening element in MODE_LI_LANG.
- * process elements of language alternatives
- *
- * Example:
- * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
- * </rdf:li> </rdf:Alt> </dc:title>
- *
- * This method is called when we hit the <rdf:li> element.
- *
- * @param $elm String namespace . ' ' . tag
- * @param $attribs array array of elements (most importantly xml:lang)
- * @throws MWException if gets a tag other than <rdf:li> or if no xml:lang
- */
+ * Opening element in MODE_LI_LANG.
+ * process elements of language alternatives
+ *
+ * Example:
+ * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
+ * </rdf:li> </rdf:Alt> </dc:title>
+ *
+ * This method is called when we hit the <rdf:li> element.
+ *
+ * @param $elm String namespace . ' ' . tag
+ * @param $attribs array array of elements (most importantly xml:lang)
+ * @throws MWException if gets a tag other than <rdf:li> or if no xml:lang
+ */
private function startElementModeLiLang( $elm, $attribs ) {
if ( $elm !== self::NS_RDF . ' li' ) {
throw new MWException( __METHOD__ . " <rdf:li> expected but got $elm." );
$this->mode[0] = self::MODE_QDESC;
}
foreach ( $attribs as $name => $val ) {
-
-
if ( strpos( $name, ' ' ) === false ) {
// This shouldn't happen, but so far some old software forgets namespace
// on rdf:about.
}
/**
- * Given an extracted value, save it to results array
- *
- * note also uses $this->ancestorStruct and
- * $this->processingArray to determine what name to
- * save the value under. (in addition to $tag).
- *
- * @param $ns String namespace of tag this is for
- * @param $tag String tag name
- * @param $val String value to save
- */
+ * Given an extracted value, save it to results array
+ *
+ * note also uses $this->ancestorStruct and
+ * $this->processingArray to determine what name to
+ * save the value under. (in addition to $tag).
+ *
+ * @param $ns String namespace of tag this is for
+ * @param $tag String tag name
+ * @param $val String value to save
+ */
private function saveValue( $ns, $tag, $val ) {
$info =& $this->items[$ns][$tag];
*/
/**
-* This class is just a container for a big array
-* used by XMPReader to determine which XMP items to
-* extract.
-*/
+ * This class is just a container for a big array
+ * used by XMPReader to determine which XMP items to
+ * extract.
+ */
class XMPInfo {
/** get the items array
* @return Array XMP item configuration array.
- */
+ */
public static function getItems ( ) {
if( !self::$ranHooks ) {
// This is for if someone makes a custom metadata extension.
static private $ranHooks = false;
/**
- * XMPInfo::$items keeps a list of all the items
- * we are interested to extract, as well as
- * information about the item like what type
- * it is.
- *
- * Format is an array of namespaces,
- * each containing an array of tags
- * each tag is an array of information about the
- * tag, including:
- * * map_group - what group (used for precedence during conflicts)
- * * mode - What type of item (self::MODE_SIMPLE usually, see above for all values)
- * * validate - method to validate input. Could also post-process the input. A string value is assumed to be a static method of XMPValidate. Can also take a array( 'className', 'methodName' ).
- * * choices - array of potential values (format of 'value' => true ). Only used with validateClosed
- * * rangeLow and rangeHigh - alternative to choices for numeric ranges. Again for validateClosed only.
- * * children - for MODE_STRUCT items, allowed children.
- * * structPart - Indicates that this element can only appear as a member of a structure.
- *
- * currently this just has a bunch of exif values as this class is only half-done
- */
-
+ * XMPInfo::$items keeps a list of all the items
+ * we are interested to extract, as well as
+ * information about the item like what type
+ * it is.
+ *
+ * Format is an array of namespaces,
+ * each containing an array of tags
+ * each tag is an array of information about the
+ * tag, including:
+ * * map_group - what group (used for precedence during conflicts)
+ * * mode - What type of item (self::MODE_SIMPLE usually, see above for all values)
+ * * validate - method to validate input. Could also post-process the input. A string value is assumed to be a static method of XMPValidate. Can also take a array( 'className', 'methodName' ).
+ * * choices - array of potential values (format of 'value' => true ). Only used with validateClosed
+ * * rangeLow and rangeHigh - alternative to choices for numeric ranges. Again for validateClosed only.
+ * * children - for MODE_STRUCT items, allowed children.
+ * * structPart - Indicates that this element can only appear as a member of a structure.
+ *
+ * currently this just has a bunch of exif values as this class is only half-done
+ */
static private $items = array(
'http://ns.adobe.com/exif/1.0/' => array(
'ApertureValue' => array(
*/
/**
-* This contains some static methods for
-* validating XMP properties. See XMPInfo and XMPReader classes.
-*
-* Each of these functions take the same parameters
-* * an info array which is a subset of the XMPInfo::items array
-* * A value (passed as reference) to validate. This can be either a
-* simple value or an array
-* * A boolean to determine if this is validating a simple or complex values
-*
-* It should be noted that when an array is being validated, typically the validation
-* function is called once for each value, and then once at the end for the entire array.
-*
-* These validation functions can also be used to modify the data. See the gps and flash one's
-* for example.
-*
-* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
-* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
-*/
+ * This contains some static methods for
+ * validating XMP properties. See XMPInfo and XMPReader classes.
+ *
+ * Each of these functions take the same parameters
+ * * an info array which is a subset of the XMPInfo::items array
+ * * A value (passed as reference) to validate. This can be either a
+ * simple value or an array
+ * * A boolean to determine if this is validating a simple or complex values
+ *
+ * It should be noted that when an array is being validated, typically the validation
+ * function is called once for each value, and then once at the end for the entire array.
+ *
+ * These validation functions can also be used to modify the data. See the gps and flash one's
+ * for example.
+ *
+ * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
+ * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
+ */
class XMPValidate {
/**
- * function to validate boolean properties ( True or False )
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate boolean properties ( True or False )
+ *
+ * @param $info Array information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateBoolean( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
}
/**
- * function to validate rational properties ( 12/10 )
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate rational properties ( 12/10 )
+ *
+ * @param $info Array information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateRational( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
}
/**
- * function to validate rating properties -1, 0-5
- *
- * if its outside of range put it into range.
- *
- * @see MWG spec
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate rating properties -1, 0-5
+ *
+ * if its outside of range put it into range.
+ *
+ * @see MWG spec
+ * @param $info Array information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateRating( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
}
/**
- * function to validate integers
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate integers
+ *
+ * @param $info Array information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateInteger( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
}
/**
- * function to validate properties with a fixed number of allowed
- * choices. (closed choice)
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate properties with a fixed number of allowed
+ * choices. (closed choice)
+ *
+ * @param $info Array information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateClosed( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
}
/**
- * function to validate and modify flash structure
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate and modify flash structure
+ *
+ * @param $info Array information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateFlash( $info, &$val, $standalone ) {
if ( $standalone ) {
// this only validates flash structs, not individual properties
}
/**
- * function to validate LangCode properties ( en-GB, etc )
- *
- * This is just a naive check to make sure it somewhat looks like a lang code.
- *
- * @see rfc 3066
- * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf page 30 (section 8.2.2.5)
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate LangCode properties ( en-GB, etc )
+ *
+ * This is just a naive check to make sure it somewhat looks like a lang code.
+ *
+ * @see rfc 3066
+ * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf page 30 (section 8.2.2.5)
+ *
+ * @param $info Array information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateLangCode( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
}
/**
- * function to validate date properties, and convert to (partial) Exif format.
- *
- * Dates can be one of the following formats:
- * YYYY
- * YYYY-MM
- * YYYY-MM-DD
- * YYYY-MM-DDThh:mmTZD
- * YYYY-MM-DDThh:mm:ssTZD
- * YYYY-MM-DDThh:mm:ss.sTZD
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
- * in cases where there's only a partial date, it will give things like
- * 2011:04.
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate date properties, and convert to (partial) Exif format.
+ *
+ * Dates can be one of the following formats:
+ * YYYY
+ * YYYY-MM
+ * YYYY-MM-DD
+ * YYYY-MM-DDThh:mmTZD
+ * YYYY-MM-DDThh:mm:ssTZD
+ * YYYY-MM-DDThh:mm:ss.sTZD
+ *
+ * @param $info Array information about current property
+ * @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
+ * in cases where there's only a partial date, it will give things like
+ * 2011:04.
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateDate( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
return;
}
-
// Extra check for empty string necessary due to TZ but no second case.
$stripSeconds = false;
if ( !isset( $res[6] ) || $res[6] === '' ) {
/** */
+if ( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
require_once 'UtfNormalDefines.php';
require_once 'UtfNormalUtil.php';
require_once 'UtfNormal.php';
$verbose = false;
#$verbose = true;
-if( PHP_SAPI != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
$in = fopen( "UTF-8-test.txt", "rt" );
if( !$in ) {
* @ingroup UtfNormal
*/
+if( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
dl( 'php_utfnormal.so' );
}
define( 'BENCH_CYCLES', 5 );
-if( PHP_SAPI != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
-
$testfiles = array(
'testdata/washington.txt' => 'English text',
'testdata/berlin.txt' => 'German text',
* @ingroup UtfNormal
*/
+if( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
dl( 'php_utfnormal.so' );
}
define( 'BIGSIZE', 1024 * 1024 * 10); // 10m
ini_set('memory_limit', BIGSIZE + 120 * 1024 * 1024);
-if( PHP_SAPI != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
-
$testfiles = array(
'testdata/washington.txt' => 'English text',
'testdata/berlin.txt' => 'German text',
* @ingroup UtfNormal
*/
+if( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
$verbose = true;
#define( 'PRETTY_UTF8', true );
require_once 'UtfNormalUtil.php';
require_once 'UtfNormal.php';
-if( PHP_SAPI != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
-
$in = fopen("NormalizationTest.txt", "rt");
if( !$in ) {
print "Couldn't open NormalizationTest.txt -- can't run tests.\n";
-#!/usr/bin/php
+#!/usr/bin/env php
<?php
/**
* Other tests for the unicode normalization module.
$z >>= $length;
# Add in the free bits from subsequent bytes
- for ( $i=1; $i<$length; $i++ ) {
+ for ( $i=1; $i < $length; $i++ ) {
$z <<= 6;
$z |= ord( $char[$i] ) & 0x3f;
}
return true;
}
- $uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
+ $uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
$sleep = 2*$uRTT; // rough time to do get()+set()
- $locked = false; // lock acquired
+ $locked = false; // lock acquired
$attempts = 0; // failed attempts
do {
if ( ++$attempts >= 3 && $sleep <= 1e6 ) {
// }}}
-
/**
* Command statistics
*
* @access private
*/
function _load_items( $sock, &$ret, &$casToken = null ) {
+ $results = array();
+
while ( 1 ) {
$decl = $this->_fgets( $sock );
+
if( $decl === false ) {
+ /*
+ * If nothing can be read, something is wrong because we know exactly when
+ * to stop reading (right after "END") and we return right after that.
+ */
return false;
- } elseif ( $decl == "END" ) {
- return true;
} elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
- list( $rkey, $flags, $len, $casToken ) = array( $match[1], $match[2], $match[3], $match[4] );
- $data = $this->_fread( $sock, $len + 2 );
- if ( $data === false ) {
- return false;
- }
- if ( substr( $data, -2 ) !== "\r\n" ) {
- $this->_handle_error( $sock,
- 'line ending missing from data block from $1' );
+ /*
+ * Read all data returned. This can be either one or multiple values.
+ * Save all that data (in an array) to be processed later: we'll first
+ * want to continue reading until "END" before doing anything else,
+ * to make sure that we don't leave our client in a state where it's
+ * output is not yet fully read.
+ */
+ $results[] = array(
+ $match[1], // rkey
+ $match[2], // flags
+ $match[3], // len
+ $match[4], // casToken
+ $this->_fread( $sock, $match[3] + 2 ), // data
+ );
+ } elseif ( $decl == "END" ) {
+ if ( count( $results ) == 0 ) {
return false;
}
- $data = substr( $data, 0, -2 );
- $ret[$rkey] = $data;
- if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
- $ret[$rkey] = gzuncompress( $ret[$rkey] );
- }
+ /**
+ * All data has been read, time to process the data and build
+ * meaningful return values.
+ */
+ foreach ( $results as $vars ) {
+ list( $rkey, $flags, $len, $casToken, $data ) = $vars;
+
+ if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
+ $this->_handle_error( $sock,
+ 'line ending missing from data block from $1' );
+ return false;
+ }
+ $data = substr( $data, 0, -2 );
+ $ret[$rkey] = $data;
+
+ if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
+ $ret[$rkey] = gzuncompress( $ret[$rkey] );
+ }
- if ( $flags & self::SERIALIZED ) {
- $ret[$rkey] = unserialize( $ret[$rkey] );
+ /*
+ * This unserialize is the exact reason that we only want to
+ * process data after having read until "END" (instead of doing
+ * this right away): "unserialize" can trigger outside code:
+ * in the event that $ret[$rkey] is a serialized object,
+ * unserializing it will trigger __wakeup() if present. If that
+ * function attempted to read from memcached (while we did not
+ * yet read "END"), these 2 calls would collide.
+ */
+ if ( $flags & self::SERIALIZED ) {
+ $ret[$rkey] = unserialize( $ret[$rkey] );
+ }
}
+ return true;
} else {
$this->_handle_error( $sock, 'Error parsing response from $1' );
return false;
// }}}
}
-
// }}}
class MemCachedClientforWiki extends MWMemcached {
* @file
*/
-
class RedisBagOStuff extends BagOStuff {
- protected $connectTimeout, $persistent, $password, $automaticFailover;
-
- /**
- * A list of server names, from $params['servers']
- */
+ /** @var RedisConnectionPool */
+ protected $redisPool;
+ /** @var Array List of server names */
protected $servers;
-
- /**
- * A cache of Redis objects, representing connections to Redis servers.
- * The key is the server name.
- */
- protected $conns = array();
-
- /**
- * An array listing "dead" servers which have had a connection error in
- * the past. Servers are marked dead for a limited period of time, to
- * avoid excessive overhead from repeated connection timeouts. The key in
- * the array is the server name, the value is the UNIX timestamp at which
- * the server is resurrected.
- */
- protected $deadServers = array();
+ /** @var bool */
+ protected $automaticFailover;
/**
* Construct a RedisBagOStuff object. Parameters are:
* flap, for example if it is in swap death.
*/
function __construct( $params ) {
- if ( !extension_loaded( 'redis' ) ) {
- throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
- 'https://github.com/nicolasff/phpredis' );
+ $redisConf = array( 'serializer' => 'php' );
+ foreach ( array( 'connectTimeout', 'persistent', 'password' ) as $opt ) {
+ if ( isset( $params[$opt] ) ) {
+ $redisConf[$opt] = $params[$opt];
+ }
}
+ $this->redisPool = RedisConnectionPool::singleton( $redisConf );
$this->servers = $params['servers'];
- $this->connectTimeout = isset( $params['connectTimeout'] )
- ? $params['connectTimeout'] : 1;
- $this->persistent = !empty( $params['persistent'] );
- if ( isset( $params['password'] ) ) {
- $this->password = $params['password'];
- }
if ( isset( $params['automaticFailover'] ) ) {
$this->automaticFailover = $params['automaticFailover'];
} else {
$result = $conn->get( $key );
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$casToken = $result;
$this->logRequest( 'get', $key, $server, $result );
}
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'set', $key, $server, $result );
return $result;
}
- /**
- * @param $casToken mixed
- * @param $key string
- * @param $value mixed
- * @param $exptime int
- * @return bool
- */
public function cas( $casToken, $key, $value, $expiry = 0 ) {
wfProfileIn( __METHOD__ );
list( $server, $conn ) = $this->getConnection( $key );
$result = $conn->exec();
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'cas', $key, $server, $result );
$result = true;
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'delete', $key, $server, $result );
wfProfileOut( __METHOD__ );
}
}
} catch ( RedisException $e ) {
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
}
}
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'add', $key, $server, $result );
wfProfileOut( __METHOD__ );
}
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'replace', $key, $server, $result );
$result = $conn->incrBy( $key, $value );
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'incr', $key, $server, $result );
/**
* Get a Redis object with a connection suitable for fetching the specified key
+ * @return Array (server, RedisConnRef) or (false, false)
*/
protected function getConnection( $key ) {
if ( count( $this->servers ) === 1 ) {
}
foreach ( $candidates as $server ) {
- $conn = $this->getConnectionToServer( $server );
+ $conn = $this->redisPool->getConnection( $server );
if ( $conn ) {
return array( $server, $conn );
}
return array( false, false );
}
- /**
- * Get a connection to the server with the specified name. Connections
- * are cached, and failures are persistent to avoid multiple timeouts.
- *
- * @param $server
- * @throws MWException
- * @return Redis object, or false on failure
- */
- protected function getConnectionToServer( $server ) {
- if ( isset( $this->deadServers[$server] ) ) {
- $now = time();
- if ( $now > $this->deadServers[$server] ) {
- // Dead time expired
- unset( $this->deadServers[$server] );
- } else {
- // Server is dead
- $this->debug( "server $server is marked down for another " .
- ($this->deadServers[$server] - $now ) .
- " seconds, can't get connection" );
- return false;
- }
- }
-
- if ( isset( $this->conns[$server] ) ) {
- return $this->conns[$server];
- }
-
- if ( substr( $server, 0, 1 ) === '/' ) {
- // UNIX domain socket
- // These are required by the redis extension to start with a slash, but
- // we still need to set the port to a special value to make it work.
- $host = $server;
- $port = 0;
- } else {
- // TCP connection
- $hostPort = IP::splitHostAndPort( $server );
- if ( !$hostPort ) {
- throw new MWException( __CLASS__.": invalid configured server \"$server\"" );
- }
- list( $host, $port ) = $hostPort;
- if ( $port === false ) {
- $port = 6379;
- }
- }
- $conn = new Redis;
- try {
- if ( $this->persistent ) {
- $this->debug( "opening persistent connection to $host:$port" );
- $result = $conn->pconnect( $host, $port, $this->connectTimeout );
- } else {
- $this->debug( "opening non-persistent connection to $host:$port" );
- $result = $conn->connect( $host, $port, $this->connectTimeout );
- }
- if ( !$result ) {
- $this->logError( "could not connect to server $server" );
- // Mark server down for 30s to avoid further timeouts
- $this->deadServers[$server] = time() + 30;
- return false;
- }
- if ( $this->password !== null ) {
- if ( !$conn->auth( $this->password ) ) {
- $this->logError( "authentication error connecting to $server" );
- }
- }
- } catch ( RedisException $e ) {
- $this->deadServers[$server] = time() + 30;
- wfDebugLog( 'redis', "Redis exception: " . $e->getMessage() . "\n" );
- return false;
- }
-
- $conn->setOption( Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP );
- $this->conns[$server] = $conn;
- return $conn;
- }
-
/**
* Log a fatal error
*/
* not. The safest response for us is to explicitly destroy the connection
* object and let it be reopened during the next request.
*/
- protected function handleException( $server, $e ) {
- wfDebugLog( 'redis', "Redis exception on server $server: " . $e->getMessage() . "\n" );
- unset( $this->conns[$server] );
+ protected function handleException( $server, RedisConnRef $conn, $e ) {
+ $this->redisPool->handleException( $server, $conn, $e );
}
/**
} else {
/*
* We must keep a separate connection to MySQL in order to avoid deadlocks
- * However, SQLite has an opposite behaviour. And PostgreSQL needs to know
+ * However, SQLite has an opposite behavior. And PostgreSQL needs to know
* if we are in transaction or no
*/
if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
);
$db->commit( __METHOD__ );
} catch ( DBQueryError $e ) {
- $this->handleWriteError( $e );
+ $this->handleWriteError( $e, $serverIndex );
return false;
}
/**
* @param $parser Parser
* @param string $num
- * @param null $raw
- * @return
+ * @param string $arg
+ * @return string
*/
- static function formatnum( $parser, $num = '', $raw = null) {
- if ( self::isRaw( $raw ) ) {
+ static function formatnum( $parser, $num = '', $arg = null ) {
+ if ( self::matchAgainstMagicword( 'rawsuffix', $arg ) ) {
$func = array( $parser->getFunctionLang(), 'parseFormattedNumber' );
+ } elseif ( self::matchAgainstMagicword( 'nocommafysuffix', $arg ) ) {
+ $func = array( $parser->getFunctionLang(), 'formatNumNoSeparators' );
} else {
$func = array( $parser->getFunctionLang(), 'formatNum' );
}
return '';
}
- static function isRaw( $param ) {
- static $mwRaw;
- if ( !$mwRaw ) {
- $mwRaw =& MagicWord::get( 'rawsuffix' );
- }
- if ( is_null( $param ) ) {
+ /**
+ * Matches the given value against the value of given magic word
+ *
+ * @param string $magicword magic word key
+ * @param mixed $value value to match
+ * @return boolean true on successful match
+ */
+ static private function matchAgainstMagicword( $magicword, $value ) {
+ if ( strval( $value ) === '' ) {
return false;
- } else {
- return $mwRaw->match( $param );
}
+ $mwObject = MagicWord::get( $magicword );
+ return $mwObject->match( $value );
}
static function formatRaw( $num, $raw ) {
- if( self::isRaw( $raw ) ) {
+ if( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
return $num;
} else {
global $wgContLang;
return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
}
-
/**
* Given a title, return the namespace name that would be given by the
* corresponding magic word
static $cache = array();
// split the given option to its variable
- if( self::isRaw( $arg1 ) ) {
+ if( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
//{{pagesincategory:|raw[|type]}}
$raw = $arg1;
$type = $magicWords->matchStartToEnd( $arg2 );
$this->lang = $lang;
$this->monthNames = $this->getMonthRegex();
- for ( $i=1; $i<=12; $i++ ) {
+ for ( $i = 1; $i <= 12; $i++ ) {
$this->xMonths[$this->lang->lc( $this->lang->getMonthName( $i ) )] = $i;
$this->xMonths[$this->lang->lc( $this->lang->getMonthAbbreviation( $i ) )] = $i;
}
} else {
$preference = self::NONE;
}
- for ( $i=1; $i<=self::LAST; $i++ ) {
+ for ( $i = 1; $i <= self::LAST; $i++ ) {
$this->mSource = $i;
if ( isset ( $this->rules[$preference][$i] ) ) {
# Specific rules
$bits = array();
$key = $this->keys[$this->mSource];
- for ( $p=0; $p < strlen( $key ); $p++ ) {
+ for ( $p = 0; $p < strlen( $key ); $p++ ) {
if ( $key[$p] != ' ' ) {
$bits[$key[$p]] = $matches[$p+1];
}
$bits['d'] = sprintf( '%02d', $bits['j'] );
}
- for ( $p=0; $p < strlen( $format ); $p++ ) {
+ for ( $p = 0; $p < strlen( $format ); $p++ ) {
$char = $format[$p];
switch ( $char ) {
case 'd': # ISO day of month
}
}
-
if( !$linkBatch->isEmpty() ) {
// construct query
$dbr = wfGetDB( DB_SLAVE );
*/
function replaceTextCallback( $matches ) {
$type = $matches[1];
- $key = $matches[2];
+ $key = $matches[2];
if( $type == 'LINK' ) {
list( $ns, $index ) = explode( ':', $key, 2 );
if( isset( $this->internals[$ns][$index]['text'] ) ) {
var $mFunctionHooks = array();
var $mFunctionSynonyms = array( 0 => array(), 1 => array() );
var $mFunctionTagHooks = array();
- var $mStripList = array();
- var $mDefaultStripList = array();
+ var $mStripList = array();
+ var $mDefaultStripList = array();
var $mVarCache = array();
var $mImageParams = array();
var $mImageParamsMagicArray = array();
* string constructs.
*
* Must not consist of all title characters, or else it will change
- * the behaviour of <nowiki> in a link.
+ * the behavior of <nowiki> in a link.
*/
$this->mUniqPrefix = "\x7fUNIQ" . self::getRandomString();
$this->mStripState = new StripState( $this->mUniqPrefix );
-
# Clear these on every parse, bug 4549
$this->mTplExpandCache = $this->mTplRedirCache = $this->mTplDomCache = array();
}
if ( count( $p ) > 5 ) {
# comment
- $element = $p[4];
+ $element = $p[4];
$attributes = '';
- $close = '';
- $inside = $p[5];
+ $close = '';
+ $inside = $p[5];
} else {
# tag
- $element = $p[1];
+ $element = $p[1];
$attributes = $p[2];
- $close = $p[3];
- $inside = $p[4];
+ $close = $p[3];
+ $inside = $p[4];
}
$marker = "$uniq_prefix-$element-" . sprintf( '%08X', $n++ ) . self::MARKER_SUFFIX;
array_push( $tr_history, false );
array_push( $td_history, false );
array_push( $last_tag_history, '' );
- } elseif ( $first_character === '|' || $first_character === '!' || substr( $line, 0, 2 ) === '|+' ) {
+ } elseif ( $first_character === '|' || $first_character === '!' || substr( $line, 0, 2 ) === '|+' ) {
# This might be cell elements, td, th or captions
if ( substr( $line, 0, 2 ) === '|+' ) {
$first_character = '+';
return $text . $trail;
}
-
/**
* Parse headers and return html
*
wfProfileOut( __METHOD__ . "-might_be_img" );
}
- $wasblank = ( $text == '' );
+ $wasblank = ( $text == '' );
if ( $wasblank ) {
$text = $link;
} else {
{
# Bug 529: if the template begins with a table or block-level
# element, it should be treated as beginning a new line.
- # This behaviour is somewhat controversial.
+ # This behavior is somewhat controversial.
$text = "\n" . $text;
}
# Increase TOC level
$toclevel++;
$sublevelCount[$toclevel] = 0;
- if ( $toclevel<$wgMaxTocLevel ) {
+ if ( $toclevel < $wgMaxTocLevel ) {
$prevtoclevel = $toclevel;
$toc .= Linker::tocIndent();
$numVisible++;
if ( $i == 0 ) {
$toclevel = 1;
}
- if ( $toclevel<$wgMaxTocLevel ) {
+ if ( $toclevel < $wgMaxTocLevel ) {
if ( $prevtoclevel < $wgMaxTocLevel ) {
# Unindent only if the previous toc level was shown :p
$toc .= Linker::tocUnindent( $prevtoclevel - $toclevel );
}
} else {
# No change in level, end TOC line
- if ( $toclevel<$wgMaxTocLevel ) {
+ if ( $toclevel < $wgMaxTocLevel ) {
$toc .= Linker::tocLineEnd();
}
}
$confstr .= '*';
}
-
// Space assigned for the stubthreshold but unused
// since it disables the parser cache, its value will always
// be 0 when this function is called by parsercache.
return $this->mProperties;
}
-
/**
* Returns the options from its ParserOptions which have been taken
* into account to produce this output or false if not available.
*/
function getChildrenOfType( $type );
-
/**
* Returns the length of the array, or false if this is not an array-type node
*/
if ( $equalsLength > 0 ) {
if ( $searchStart - $equalsLength == $piece->startPos ) {
// This is just a single string of equals signs on its own line
- // Replicate the doHeadings behaviour /={count}(.+)={count}/
+ // Replicate the doHeadings behavior /={count}(.+)={count}/
// First find out how many equals signs there really are (don't stop at 6)
$count = $equalsLength;
if ( $count < 3 ) {
*/
var $depth;
-
/**
* Construct a new preprocessor frame.
* @param $preprocessor Preprocessor The parent preprocessor
if ( $equalsLength > 0 ) {
if ( $searchStart - $equalsLength == $piece->startPos ) {
// This is just a single string of equals signs on its own line
- // Replicate the doHeadings behaviour /={count}(.+)={count}/
+ // Replicate the doHeadings behavior /={count}(.+)={count}/
// First find out how many equals signs there really are (don't stop at 6)
$count = $equalsLength;
if ( $count < 3 ) {
*/
var $depth;
-
/**
* Construct a new preprocessor frame.
* @param $preprocessor Preprocessor: the parent preprocessor
$width = 140;
$nameWidth = $width - 65;
- $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d (%13.3f -%13.3f) [%d]\n";
+ $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d (%13.3f -%13.3f) [%d]\n";
$titleFormat = "%-{$nameWidth}s %6s %13s %13s %13s %9s\n";
$prof = "\nProfiling data\n";
$prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
class ProfilerSimple extends Profiler {
var $mMinimumTime = 0;
- var $zeroEntry = array( 'cpu'=> 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0 );
+ var $zeroEntry = array( 'cpu' => 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0 );
var $errorEntry;
public function isPersistent() {
$this->registerTestModules();
}
-
wfProfileOut( __METHOD__ );
}
$this->hasErrors = true;
continue;
}
- $modules[$name] = $this->getModule( $name );
+ $modules[$name] = $module;
} else {
$missing[] = $name;
}
// to propagate to clients quickly
// If there were errors, we also need a shorter expiry time so we can recover quickly
if ( is_null( $context->getVersion() ) || $errors ) {
- $maxage = $wgResourceLoaderMaxage['unversioned']['client'];
+ $maxage = $wgResourceLoaderMaxage['unversioned']['client'];
$smaxage = $wgResourceLoaderMaxage['unversioned']['server'];
// If a version was specified we can use a longer expiry time since changing
// version numbers causes cache misses
} else {
- $maxage = $wgResourceLoaderMaxage['versioned']['client'];
+ $maxage = $wgResourceLoaderMaxage['versioned']['client'];
$smaxage = $wgResourceLoaderMaxage['versioned']['server'];
}
if ( $context->getOnly() === 'styles' ) {
// Interpret request
// List of modules
$modules = $request->getVal( 'modules' );
- $this->modules = $modules ? self::expandModuleNames( $modules ) : array();
+ $this->modules = $modules ? self::expandModuleNames( $modules ) : array();
// Various parameters
- $this->skin = $request->getVal( 'skin' );
- $this->user = $request->getVal( 'user' );
- $this->debug = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug );
- $this->only = $request->getVal( 'only' );
- $this->version = $request->getVal( 'version' );
- $this->raw = $request->getFuzzyBool( 'raw' );
+ $this->skin = $request->getVal( 'skin' );
+ $this->user = $request->getVal( 'user' );
+ $this->debug = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug );
+ $this->only = $request->getVal( 'only' );
+ $this->version = $request->getVal( 'version' );
+ $this->raw = $request->getFuzzyBool( 'raw' );
$skinnames = Skin::getSkinNames();
// If no skin is specified, or we don't recognize the skin, use the default skin
public function getLanguage() {
if ( $this->language === null ) {
global $wgLang;
- $this->language = $this->request->getVal( 'lang' );
+ $this->language = $this->request->getVal( 'lang' );
if ( !$this->language ) {
$this->language = $wgLang->getCode();
}
return $this->language->getPluralRules();
}
+ /**
+ * Get the digit groupin Pattern for the site content language.
+ *
+ * @return array
+ */
+ protected function getDigitGroupingPattern() {
+ return $this->language->digitGroupingPattern();
+ }
+
/**
* Get the digit transform table for the content language
- * Seperator transform table also required here to convert
- * the . and , sign to appropriate forms in content language.
*
* @return array
*/
protected function getDigitTransformTable() {
- $digitTransformTable = $this->language->digitTransformTable();
- $separatorTransformTable = $this->language->separatorTransformTable();
- if ( $digitTransformTable ) {
- array_merge( $digitTransformTable, (array)$separatorTransformTable );
- } else {
- return $separatorTransformTable;
- }
- return $digitTransformTable;
+ return $this->language->digitTransformTable();
}
+ /**
+ * Get seperator transform table required for converting
+ * the . and , sign to appropriate forms in site content language.
+ *
+ * @return array
+ */
+ protected function getSeparatorTransformTable() {
+ return $this->language->separatorTransformTable();
+ }
+
+
/**
* Get all the dynamic data for the content language to an array
*
protected function getData() {
return array(
'digitTransformTable' => $this->getDigitTransformTable(),
+ 'separatorTransformTable' => $this->getSeparatorTransformTable(),
'grammarForms' => $this->getSiteLangGrammarForms(),
'pluralRules' => $this->getPluralRules(),
+ 'digitGroupingPattern' => $this->getDigitGroupingPattern(),
);
}
return false;
}
-
/** @var JSParser lazy-initialized; use self::javaScriptParser() */
private static $jsParser;
private static $parseCacheVersion = 1;
if ( strval( $script ) !== '' ) {
$script = $this->validateScriptFile( $titleText, $script );
if ( strpos( $titleText, '*/' ) === false ) {
- $scripts .= "/* $titleText */\n";
+ $scripts .= "/* $titleText */\n";
}
$scripts .= $script . "\n";
}
$styles[$media] = array();
}
if ( strpos( $titleText, '*/' ) === false ) {
- $style = "/* $titleText */\n" . $style;
+ $style = "/* $titleText */\n" . $style;
}
$styles[$media][] = $style;
}
}
}
-
/**
* Item class for a archive table row by ar_rev_id -- actually
* used via RevDel_RevisionList.
$title = Title::newFromText( $searchterm );
-
# Entering an IP address goes to the contributions page
if ( $wgEnableSearchContributorsByIP ) {
if ( ( $title->getNamespace() == NS_USER && User::isIP( $title->getText() ) )
}
}
-
# Entering a user goes to the user page whether it's there or not
if ( $title->getNamespace() == NS_USER ) {
return $title;
# # Some search engines may bail out if too many matches are found
}
-
/**
* @todo FIXME: This class is horribly factored. It would probably be better to
* have a useful base class to which you pass some standard information, then
}
$spat .= '/';
$textExt = array(); // text extracts
- $otherExt = array(); // other extracts
+ $otherExt = array(); // other extracts
wfProfileIn( "$fname-split" );
$start = 0;
$textLen = strlen( $text );
+++ /dev/null
-<?php
-/**
- * IBM DB2 search engine
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Search
- */
-
-/**
- * Search engine hook base class for IBM DB2
- * @ingroup Search
- */
-class SearchIBM_DB2 extends SearchEngine {
-
- /**
- * Creates an instance of this class
- * @param $db DatabaseIbm_db2: database object
- */
- function __construct( $db ) {
- parent::__construct( $db );
- }
-
- /**
- * Perform a full text search query and return a result set.
- *
- * @param $term String: raw search term
- * @return SqlSearchResultSet
- */
- function searchText( $term ) {
- $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
- return new SqlSearchResultSet( $resultSet, $this->searchTerms );
- }
-
- /**
- * Perform a title-only search query and return a result set.
- *
- * @param $term String: taw search term
- * @return SqlSearchResultSet
- */
- function searchTitle( $term ) {
- $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
- return new SqlSearchResultSet( $resultSet, $this->searchTerms );
- }
-
-
- /**
- * Return a partial WHERE clause to exclude redirects, if so set
- * @return String
- */
- function queryRedirect() {
- if ( $this->showRedirects ) {
- return '';
- } else {
- return 'AND page_is_redirect=0';
- }
- }
-
- /**
- * Return a partial WHERE clause to limit the search to the given namespaces
- * @return String
- */
- function queryNamespaces() {
- if( is_null( $this->namespaces ) )
- return '';
- $namespaces = implode( ',', $this->namespaces );
- if ( $namespaces == '' ) {
- $namespaces = '0';
- }
- return 'AND page_namespace IN (' . $namespaces . ')';
- }
-
- /**
- * Return a LIMIT clause to limit results on the query.
- * @return String
- */
- function queryLimit( $sql ) {
- return $this->db->limitResult( $sql, $this->limit, $this->offset );
- }
-
- /**
- * Does not do anything for generic search engine
- * subclasses may define this though
- * @return String
- */
- function queryRanking( $filteredTerm, $fulltext ) {
- // requires Net Search Extender or equivalent
- // return ' ORDER BY score(1)';
- return '';
- }
-
- /**
- * Construct the full SQL query to do the search.
- * The guts shoulds be constructed in queryMain()
- * @param $filteredTerm String
- * @param $fulltext Boolean
- * @return String
- */
- function getQuery( $filteredTerm, $fulltext ) {
- return $this->queryLimit( $this->queryMain( $filteredTerm, $fulltext ) . ' ' .
- $this->queryRedirect() . ' ' .
- $this->queryNamespaces() . ' ' .
- $this->queryRanking( $filteredTerm, $fulltext ) . ' ' );
- }
-
-
- /**
- * Picks which field to index on, depending on what type of query.
- * @param $fulltext Boolean
- * @return String
- */
- function getIndexField( $fulltext ) {
- return $fulltext ? 'si_text' : 'si_title';
- }
-
- /**
- * Get the base part of the search query.
- *
- * @param $filteredTerm String
- * @param $fulltext Boolean
- * @return String
- */
- function queryMain( $filteredTerm, $fulltext ) {
- $match = $this->parseQuery( $filteredTerm, $fulltext );
- $page = $this->db->tableName( 'page' );
- $searchindex = $this->db->tableName( 'searchindex' );
- return 'SELECT page_id, page_namespace, page_title ' .
- "FROM $page,$searchindex " .
- 'WHERE page_id=si_page AND ' . $match;
- }
-
- /** @todo document
- * @return string
- */
- function parseQuery( $filteredText, $fulltext ) {
- global $wgContLang;
- $lc = SearchEngine::legalSearchChars();
- $this->searchTerms = array();
-
- # @todo FIXME: This doesn't handle parenthetical expressions.
- $m = array();
- $q = array();
-
- if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
- $filteredText, $m, PREG_SET_ORDER ) ) {
- foreach( $m as $terms ) {
-
- // Search terms in all variant forms, only
- // apply on wiki with LanguageConverter
- $temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
- if( is_array( $temp_terms )) {
- $temp_terms = array_unique( array_values( $temp_terms ));
- foreach( $temp_terms as $t )
- $q[] = $terms[1] . $wgContLang->normalizeForSearch( $t );
- }
- else
- $q[] = $terms[1] . $wgContLang->normalizeForSearch( $terms[2] );
-
- if ( !empty( $terms[3] ) ) {
- $regexp = preg_quote( $terms[3], '/' );
- if ( $terms[4] )
- $regexp .= "[0-9A-Za-z_]+";
- } else {
- $regexp = preg_quote(str_replace( '"', '', $terms[2]), '/' );
- }
- $this->searchTerms[] = $regexp;
- }
- }
-
- $searchon = $this->db->strencode( join( ',', $q ) );
- $field = $this->getIndexField( $fulltext );
-
- // requires Net Search Extender or equivalent
- //return " CONTAINS($field, '$searchon') > 0 ";
-
- return " lcase($field) LIKE lcase('%$searchon%')";
- }
-
- /**
- * Create or update the search index record for the given page.
- * Title and text should be pre-processed.
- *
- * @param $id Integer
- * @param $title String
- * @param $text String
- */
- function update( $id, $title, $text ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->replace( 'searchindex',
- array( 'si_page' ),
- array(
- 'si_page' => $id,
- 'si_title' => $title,
- 'si_text' => $text
- ), 'SearchIBM_DB2::update' );
- // ?
- //$dbw->query( "CALL ctx_ddl.sync_index('si_text_idx')" );
- //$dbw->query( "CALL ctx_ddl.sync_index('si_title_idx')" );
- }
-
- /**
- * Update a search index record's title only.
- * Title should be pre-processed.
- *
- * @param $id Integer
- * @param $title String
- */
- function updateTitle( $id, $title ) {
- $dbw = wfGetDB( DB_MASTER );
-
- $dbw->update( 'searchindex',
- array( 'si_title' => $title ),
- array( 'si_page' => $id ),
- 'SearchIBM_DB2::updateTitle',
- array() );
- }
-}
return new MssqlSearchResultSet( $resultSet, $this->searchTerms );
}
-
/**
* Return a partial WHERE clause to exclude redirects, if so set
*
*/
function queryMain( $filteredTerm, $fulltext ) {
$match = $this->parseQuery( $filteredTerm, $fulltext );
- $page = $this->db->tableName( 'page' );
+ $page = $this->db->tableName( 'page' );
$searchindex = $this->db->tableName( 'searchindex' );
return 'SELECT page_id, page_namespace, page_title, ftindex.[RANK]' .
return new MySQLSearchResultSet( $resultSet, $this->searchTerms );
}
-
/**
* Return a partial WHERE clause to exclude redirects, if so set
* @return String
$this->queryRanking( $filteredTerm, $fulltext ) . ' ' );
}
-
/**
* Picks which field to index on, depending on what type of query.
* @param $fulltext Boolean
}
}
-
$searchon = $this->db->addQuotes( ltrim( $searchon, ' &' ) );
$field = $this->getIndexField( $fulltext );
return " CONTAINS($field, $searchon, 1) > 0 ";
array() );
}
-
public static function legalSearchChars() {
return "\"" . parent::legalSearchChars();
}
return new SqliteSearchResultSet( $resultSet, $this->searchTerms, $total );
}
-
/**
* Return a partial WHERE clause to exclude redirects, if so set
* @return String
function getCountQuery( $filteredTerm, $fulltext ) {
$match = $this->parseQuery( $filteredTerm, $fulltext );
- $page = $this->db->tableName( 'page' );
+ $page = $this->db->tableName( 'page' );
$searchindex = $this->db->tableName( 'searchindex' );
return "SELECT COUNT(*) AS c " .
"FROM $page,$searchindex " .
return $page['title'];
}
-
/**
* Get normalization record for a given page title from an API response.
*
* @see Site::getPageUrl
*
* This implementation returns a URL constructed using the path returned by getLinkPath().
- * In addition to the default behaviour implemented by Site::getPageUrl(), this
+ * In addition to the default behavior implemented by Site::getPageUrl(), this
* method converts the $pageName to DBKey-format by replacing spaces with underscores
* before using it in the URL.
*
const PATH_LINK = 'link';
-
/**
* A version ID that identifies the serialization structure used by getSerializationData()
* and unserialize(). This is useful for constructing cache keys in cases where the cache relies
}
}
+ protected function getGroupName() {
+ return 'users';
+ }
}
}
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
/**
$this->lang = ( $langObj ? $langObj : $wgContLang );
$this->langcode = $this->lang->getCode();
- $this->foreign = $this->langcode != $wgContLang->getCode();
+ $this->foreign = $this->langcode != $wgContLang->getCode();
$request = $this->getRequest();
function formatValue( $field, $value ) {
switch( $field ) {
-
case 'am_title' :
-
$title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
- $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
+ $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
if( $this->mCurrentRow->am_customised ) {
$title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
global $wgScript;
$t = $this->getTitle();
- $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
+ $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
$out .= Html::hidden( 'title', $t->getPrefixedText() );
$out .= Xml::openElement( 'fieldset' );
Linker::link( $self, $this->msg( 'allpages' )->escaped() );
# Do we put a previous link ?
- if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
+ if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
$query = array( 'from' => $prevTitle->getText() );
if( $namespace )
return null;
}
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
);
return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
$out->setPageTitle( $this->msg( 'blockipsuccesssub' ) );
$out->addWikiMsg( 'blockipsuccesstext', wfEscapeWikiText( $this->target ) );
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
# BC @since 1.18
$out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
}
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
class BlockListPager extends TablePager {
*/
/**
- * A special page called by proxy_check.php to block open proxies
+ * A special page called by proxyCheck.php to block open proxies
*
* @ingroup SpecialPage
*/
$this->getOutput()->addWikiMsg( 'proxyblocksuccess' );
}
+
+ protected function getGroupName() {
+ return 'other';
+ }
}
private function makeForm() {
global $wgScript;
- $form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
+ $form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
$form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
$form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
$form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn );
$url = str_replace( '$1', $this->isbn, $url );
return '<li><a href="' . htmlspecialchars( $url ) . '" class="external">' . htmlspecialchars( $label ) . '</a></li>';
}
+
+ protected function getGroupName() {
+ return 'other';
+ }
}
$out .= " {$arr} {$to}";
return $out;
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
Html::closeElement( 'div' )
);
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
/**
return $status->value;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
$user->saveSettings();
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
}
return true;
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
$out->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>", 'confirmemail_pending' );
}
$out->addWikiMsg( 'confirmemail_text' );
- $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
+ $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
$form .= Html::hidden( 'token', $user->getEditToken() );
$form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() );
$form .= Xml::closeElement( 'form' );
function execute( $code ) {
$this->setHeaders();
- if ( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
+ $this->checkReadOnly();
$this->attemptInvalidate( $code );
}
}
$out->preventClickjacking( $pager->getPreventClickjacking() );
-
# Show the appropriate "footer" message - WHOIS tools, etc.
if ( $this->opts['contribs'] == 'newbie' ) {
$message = 'sp-contributions-footer-newbies';
Xml::closeElement( 'form' );
return $form;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
/**
return array( 'page_title' );
}
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
Xml::closeElement( 'form' );
return $f;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
return "$from $edit $arr $to";
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
return( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
return $status;
}
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
return $pageSet;
}
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
);
}
-
function sortDescending() {
return false;
}
return $this->getLanguage()->specialList( $plink, $nlink );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
return "$plink . . $user . . $time";
}
+
+ protected function getGroupName() {
+ return 'media';
+ }
}
$file = wfFindFile( $title );
if ( $file && $file->exists() ) {
- // Default behaviour: Use the direct link to the file.
+ // Default behavior: Use the direct link to the file.
$url = $file->getURL();
$width = $request->getInt( 'width', -1 );
$height = $request->getInt( 'height', -1 );
Html::closeElement( 'form' )
);
}
+
+ protected function getGroupName() {
+ return 'media';
+ }
}
);
}
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
/**
// $wgJavaScriptTestConfig in DefaultSettings.php
$out->addJsConfigVars( 'QUnitTestSwarmInjectJSPath', $wgJavaScriptTestConfig['qunit']['testswarm-injectjs'] );
}
+
+ protected function getGroupName() {
+ return 'other';
+ }
}
* @author Brion Vibber
*/
-
/**
* Special:LinkSearch to search the external-links table.
* @ingroup SpecialPage
function getOrderFields() {
return array();
}
+
+ protected function getGroupName() {
+ return 'redirects';
+ }
}
}
$this->getOutput()->addHTML( $html );
}
+
+ protected function getGroupName() {
+ return 'media';
+ }
}
/**
return '<ul><li>' . implode( "</li>\n<li>", $r ) . '</li></ul>';
}
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
return "<del>$rd_link</del>";
}
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
$this->getOutput()->addHTML( $s );
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
$out->addSubtitle( $this->msg( 'lockdbsuccesssub' ) );
$out->addWikiMsg( 'lockdbsuccesstext' );
}
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
return $s;
}
-
/**
* Set page title and show header for this log type
* @param $type string
$this->getOutput()->addHTML( $page->getDescription()->parseAsBlock() );
}
+ protected function getGroupName() {
+ return 'changes';
+ }
}
return array( 'page_title' );
}
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
function sortDescending() {
return true;
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
parent::execute( $par );
}
-
function formatResult( $skin, $result ) {
global $wgContLang;
);
return in_array( $type, $types );
}
+
+ protected function getGroupName() {
+ return 'media';
+ }
}
return true;
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
class MergeHistoryPager extends ReverseChronologicalPager {
return $this->getLanguage()->specialList( $link, $count );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
return $this->msg( 'nimagelinks' )->numParams( $row->value )->escaped() . '<br />';
}
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
return $this->getLanguage()->specialList( $link, $count );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
$this->msg( 'nlinks' )->numParams( $result->value )->escaped() );
return $this->getLanguage()->specialList( $link, $wlh );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
$nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
return $this->getLanguage()->specialList( $plink, $nlinks );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
$label = $this->msg( 'ntransclusions' )->numParams( $result->value )->escaped();
return Linker::link( $wlh, $label );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
function sortDescending() {
return true;
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
? Title::newFromText( $newTitleText_bc )
: Title::makeTitleSafe( $newTitleTextNs, $newTitleTextMain );
-
$user = $this->getUser();
# Check rights
$msgName = 'movepage-moved-noredirect';
}
-
$out->addHTML( $this->msg( 'movepage-moved' )->rawParams( $oldLink,
$newLink )->params( $oldText, $newText )->parseAsBlock() );
$out->addWikiMsg( $msgName );
}
$out->addHTML( "</ul>\n" );
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
$this->getOutput()->addHTML( $pager->getNavigationBar() );
}
}
-}
+ protected function getGroupName() {
+ return 'changes';
+ }
+}
/**
* @ingroup SpecialPage Pager
$opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'newpageshidepatrolled' ) );
$opts->add( 'hidebots', false );
$opts->add( 'hideredirs', true );
- $opts->add( 'limit', (int)$this->getUser()->getOption( 'rclimit' ) );
+ $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
$opts->add( 'offset', '' );
$opts->add( 'namespace', '0' );
$opts->add( 'username', '' );
$opts->add( 'feed', '' );
$opts->add( 'tagfilter', '' );
+ $opts->add( 'invert', false );
$this->customFilters = array();
wfRunHooks( 'SpecialNewPagesFilters', array( $this, &$this->customFilters ) );
$namespace = $this->opts->consumeValue( 'namespace' );
$username = $this->opts->consumeValue( 'username' );
$tagFilterVal = $this->opts->consumeValue( 'tagfilter' );
+ $nsinvert = $this->opts->consumeValue( 'invert' );
// Check username input validity
$ut = Title::makeTitleSafe( NS_USER, $username );
'id' => 'namespace',
'class' => 'namespaceselector',
)
+ ) . ' ' .
+ Xml::checkLabel(
+ $this->msg( 'invert' )->text(),
+ 'invert',
+ 'nsinvert',
+ $nsinvert,
+ array( 'title' => $this->msg( 'tooltip-invert' )->text() )
) .
'</td>
</tr>' . ( $tagFilter ? (
}
return '';
}
+
+ protected function getGroupName() {
+ return 'changes';
+ }
}
/**
$user = Title::makeTitleSafe( NS_USER, $username );
if( $namespace !== false ) {
- $conds['rc_namespace'] = $namespace;
+ if ( $this->opts->getValue( 'invert' ) ) {
+ $conds[] = 'rc_namespace != ' . $this->mDb->addQuotes( $namespace );
+ } else {
+ $conds['rc_namespace'] = $namespace;
+ }
$rcIndexes = array( 'new_name_timestamp' );
} else {
$rcIndexes = array( 'rc_timestamp' );
--- /dev/null
+<?php
+/**
+ * Implements Special:PagesWithProp
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ * @file
+ * @ingroup SpecialPage
+ * @author Brad Jorsch
+ */
+
+
+/**
+ * Special:PagesWithProp to search the page_props table
+ * @ingroup SpecialPage
+ * @since 1.21
+ */
+class SpecialPagesWithProp extends QueryPage {
+ private $propName = null;
+
+ function __construct( $name = 'PagesWithProp' ) {
+ parent::__construct( $name );
+ }
+
+ function isCacheable() {
+ return false;
+ }
+
+ function execute( $par ) {
+ $this->setHeaders();
+ $this->outputHeader();
+
+ $request = $this->getRequest();
+ $propname = $request->getVal( 'propname', $par );
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select(
+ 'page_props',
+ 'pp_propname',
+ '',
+ __METHOD__,
+ array( 'DISTINCT', 'ORDER BY' => 'pp_propname' )
+ );
+ foreach ( $res as $row ) {
+ $propnames[$row->pp_propname] = $row->pp_propname;
+ }
+
+ $form = new HTMLForm( array(
+ 'propname' => array(
+ 'type' => 'selectorother',
+ 'name' => 'propname',
+ 'options' => $propnames,
+ 'default' => $propname,
+ 'label-message' => 'pageswithprop-prop',
+ 'required' => true,
+ ),
+ ), $this->getContext() );
+ $form->setMethod( 'get' );
+ $form->setAction( $this->getTitle()->getFullUrl() );
+ $form->setSubmitCallback( array( $this, 'onSubmit' ) );
+ $form->setWrapperLegend( $this->msg( 'pageswithprop-legend' ) );
+ $form->addHeaderText( $this->msg( 'pageswithprop-text' )->parseAsBlock() );
+ $form->setSubmitTextMsg( 'pageswithprop-submit' );
+
+ $form->prepareForm();
+ $form->displayForm( false );
+ if ( $propname !== '' && $propname !== null ) {
+ $form->trySubmit();
+ }
+ }
+
+ public function onSubmit( $data, $form ) {
+ $this->propName = $data['propname'];
+ parent::execute( $data['propname'] );
+ }
+
+ /**
+ * Disable RSS/Atom feeds
+ * @return bool
+ */
+ function isSyndicated() {
+ return false;
+ }
+
+ function getQueryInfo() {
+ return array(
+ 'tables' => array( 'page_props', 'page' ),
+ 'fields' => array(
+ 'page_id' => 'pp_page',
+ 'page_namespace',
+ 'page_title',
+ 'page_len',
+ 'page_is_redirect',
+ 'page_latest',
+ 'pp_value',
+ ),
+ 'conds' => array(
+ 'page_id = pp_page',
+ 'pp_propname' => $this->propName,
+ ),
+ 'options' => array()
+ );
+ }
+
+ function getOrderFields() {
+ return array( 'page_id' );
+ }
+
+ function formatResult( $skin, $result ) {
+ $title = Title::newFromRow( $result );
+ $ret = Linker::link( $title, null, array(), array(), array( 'known' ) );
+ if ( $result->pp_value !== '' ) {
+ $value = $this->msg( 'parentheses' )
+ ->rawParams( Xml::span( $result->pp_value, 'prop-value' ) )
+ ->escaped();
+ $ret .= " $value";
+ }
+ return $ret;
+ }
+
+ protected function getGroupName() {
+ return 'pages';
+ }
+}
return false;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
$nv = $this->msg( 'nviews' )->numParams( $result->value )->escaped();
return $this->getLanguage()->specialList( $link, $nv );
}
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
return true;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
function namespacePrefixForm( $namespace = NS_MAIN, $from = '', $hideredirects = false ) {
global $wgScript;
- $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
+ $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
$out .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
$out .= Xml::openElement( 'fieldset' );
$this->getOutput()->addHTML( $out2 . $out . $footer );
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
class SpecialProtectedpages extends SpecialPage {
protected $IdLevel = 'level';
- protected $IdType = 'type';
+ protected $IdType = 'type';
public function __construct() {
parent::__construct( 'Protectedpages' );
array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
implode( "\n", $options ) ) . "</span>";
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
/**
class SpecialProtectedtitles extends SpecialPage {
protected $IdLevel = 'level';
- protected $IdType = 'type';
+ protected $IdType = 'type';
public function __construct() {
parent::__construct( 'Protectedtitles' );
array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
implode( "\n", $options ) );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
/**
* @ingroup SpecialPage
*/
class RandomPage extends SpecialPage {
- private $namespaces; // namespaces to select pages from
+ private $namespaces; // namespaces to select pages from
protected $isRedir = false; // should the result be a redirect?
protected $extra = array(); // Extra SQL statements
return $dbr->fetchObject( $res );
}
+
+ protected function getGroupName() {
+ return 'redirects';
+ }
}
public function getDefaultOptions() {
$opts = new FormOptions();
- $opts->add( 'days', (int)$this->getUser()->getOption( 'rcdays' ) );
- $opts->add( 'limit', (int)$this->getUser()->getOption( 'rclimit' ) );
+ $opts->add( 'days', $this->getUser()->getIntOption( 'rcdays' ) );
+ $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
$opts->add( 'from', '' );
$opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
return $this->rcOptions;
}
-
/**
* Main execution point
*
if( $opts['namespace'] !== '' ) {
$selectedNS = $dbr->addQuotes( $opts['namespace'] );
$operator = $opts['invert'] ? '!=' : '=';
- $boolean = $opts['invert'] ? 'AND' : 'OR';
+ $boolean = $opts['invert'] ? 'AND' : 'OR';
# namespace association (bug 2429)
if( !$opts['associated'] ) {
}
$dl = $lang->pipeList( $dl );
-
// show/hide links
$showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
$filters = array(
'mediawiki.special.recentchanges',
) );
}
+
+ protected function getGroupName() {
+ return 'changes';
+ }
}
}
/**
- * @return String: HTML
- */
+ * @return String: HTML
+ */
protected function buildCheckBoxes() {
$html = '<table>';
// If there is just one item, use checkboxes
array( 'value' => $bitfield, 'comment' => $reason )
);
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
if( $textMatches && $textMatches->hasSuggestion() ) {
$st = SpecialPage::getTitleFor( 'Search' );
- # mirror Go/Search behaviour of original request ..
+ # mirror Go/Search behavior of original request ..
$didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
if( $this->fulltext != null ) {
$out->addHTML( $this->formHeader( $term, $num, $totalRes ) );
$out->addHtml( $this->getProfileForm( $this->profile, $term ) );
-
$out->addHtml( Xml::closeElement( 'form' ) );
$out->addHtml( "<div class='searchresults'>" );
$this->extraParams[$key] = $value;
}
+ protected function getGroupName() {
+ return 'redirects';
+ }
}
? "${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]"
: "<del>${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]</del>";
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
$groups = array();
foreach ( $pages as $page ) {
if ( $page->isListed() ) {
- $group = SpecialPageFactory::getGroup( $page );
+ $group = $page->getFinalGroupName();
if( !isset( $groups[$group] ) ) {
$groups[$group] = array();
}
return $text;
}
- private function getOtherStats( $stats ) {
- if ( !count( $stats ) )
- return '';
+ /**
+ * Conversion of external statistics into an internal representation
+ * Following a ([<header-message>][<item-message>] = number) pattern
+ *
+ * @param array $stats
+ * @return string
+ */
+ private function getOtherStats( array $stats ) {
+ $return = '';
- $return = Xml::openElement( 'tr' ) .
- Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-hooks' )->parse() ) .
- Xml::closeElement( 'tr' );
+ foreach( $stats as $header => $items ) {
+
+ // Identify the structure used
+ if ( is_array( $items ) ) {
- foreach( $stats as $name => $number ) {
- $name = htmlspecialchars( $name );
- $number = htmlspecialchars( $number );
+ // Ignore headers that are recursively set as legacy header
+ if ( $header !== 'statistics-header-hooks' ) {
+ $return .= $this->formatRowHeader( $header );
+ }
+
+ // Collect all items that belong to the same header
+ foreach( $items as $key => $value ) {
+ $name = $this->msg( $key )->inContentLanguage()->parse();
+ $number = htmlspecialchars( $value );
+
+ $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+ }
+ } else {
+ // Create the legacy header only once
+ if ( $return === '' ) {
+ $return .= $this->formatRowHeader( 'statistics-header-hooks' );
+ }
- $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+ // Recursively remap the legacy structure
+ $return .= $this->getOtherStats( array( 'statistics-header-hooks' => array( $header => $items ) ) );
+ }
}
return $return;
}
+
+ /**
+ * Format row header
+ *
+ * @param string $header
+ * @return string
+ */
+ private function formatRowHeader( $header ) {
+ return Xml::openElement( 'tr' ) .
+ Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( $header )->parse() ) .
+ Xml::closeElement( 'tr' );
+ }
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
return Xml::tags( 'tr', null, $newRow ) . "\n";
}
+
+ protected function getGroupName() {
+ return 'changes';
+ }
}
return true;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
);
}
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
// default for page_namespace is all content namespaces (if requestedNamespace is false)
// otherwise, page_namespace is requestedNamespace
'conds' => array ( 'cl_from IS NULL',
- 'page_namespace' => ( $this->requestedNamespace!==false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
+ 'page_namespace' => ( $this->requestedNamespace !== false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
'page_is_redirect' => 0 ),
'join_conds' => array ( 'categorylinks' => array (
'LEFT JOIN', 'cl_from = page_id' ) )
return array( 'page_namespace', 'page_title' );
return array( 'page_title' );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
$makepage = false;
# Page already exists. Import the history, and if necessary
# we'll update the latest revision field in the record.
- $newid = 0;
- $pageId = $page->page_id;
- $previousRevId = $page->page_latest;
+ $newid = 0;
+ $pageId = $page->page_id;
+ $previousRevId = $page->page_latest;
# Get the time span of this page
$previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
array( 'rev_id' => $previousRevId ),
return Status::newFatal( "undeleterevdel" );
}
// Safe to insert now...
- $newid = $article->insertOn( $dbw );
+ $newid = $article->insertOn( $dbw );
$pageId = $newid;
} else {
// Check if a deleted revision will become the current revision...
}
}
- $newid = false;
+ $newid = false;
$pageId = $article->getId();
}
// source view for textual content
$sourceView = Xml::element( 'textarea', array(
'readonly' => 'readonly',
- 'cols' => intval( $user->getOption( 'cols' ) ),
- 'rows' => intval( $user->getOption( 'rows' ) ) ),
+ 'cols' => $user->getIntOption( 'cols' ),
+ 'rows' => $user->getIntOption( 'rows' ) ),
$content->getNativeData() . "\n" );
$previewButton = Xml::element( 'input', array(
if ( $this->mAllowed ) {
# Slip in the hidden controls here
- $misc = Html::hidden( 'target', $this->mTarget );
+ $misc = Html::hidden( 'target', $this->mTarget );
$misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() );
$misc .= Xml::closeElement( 'form' );
$out->addHTML( $misc );
$out->addWikiText( '<div class="error">' . $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) . '</div>' );
}
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
$out->addSubtitle( $this->msg( 'unlockdbsuccesssub' ) );
$out->addWikiMsg( 'unlockdbsuccesstext' );
}
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
$title = Title::makeTitle( NS_CATEGORY, $result->title );
return Linker::link( $title, htmlspecialchars( $title->getText() ) );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
return $this->msg( 'unusedimagestext' )->parseAsBlock();
}
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
function getPageHeader() {
return $this->msg( 'unusedtemplatestext' )->parseAsBlock();
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
return $this->getLanguage()->specialList( $plink, $wlink );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
}
/** Misc variables **/
- public $mRequest; // The WebRequest or FauxRequest this form is supposed to handle
+ public $mRequest; // The WebRequest or FauxRequest this form is supposed to handle
public $mSourceType;
/**
public $mUploadClicked;
/** User input variables from the "description" section **/
- public $mDesiredDestName; // The requested target file name
+ public $mDesiredDestName; // The requested target file name
public $mComment;
public $mLicense;
/** Hidden variables **/
public $mDestWarningAck;
- public $mForReUpload; // The user followed an "overwrite this file" link
- public $mCancelUpload; // The user clicked "Cancel and return to upload form" button
+ public $mForReUpload; // The user followed an "overwrite this file" link
+ public $mCancelUpload; // The user clicked "Cancel and return to upload form" button
public $mTokenOk;
- public $mUploadSuccessful = false; // Subclasses can use this to determine whether a file was uploaded
+ public $mUploadSuccessful = false; // Subclasses can use this to determine whether a file was uploaded
/** Text injection points for hooks not using HTMLForm **/
public $uploadFormTextTop;
$this->mCopyrightStatus = $request->getText( 'wpUploadCopyStatus' );
$this->mCopyrightSource = $request->getText( 'wpUploadSource' );
-
$this->mForReUpload = $request->getBool( 'wpForReUpload' ); // updating a file
$this->mCancelUpload = $request->getCheck( 'wpCancelUpload' )
|| $request->getCheck( 'wpReUpload' ); // b/w compat
}
}
-
/**
* Provides output to the user for a result of UploadBase::verifyUpload
*
$gallery->toHtml() . "</li>\n";
}
+ protected function getGroupName() {
+ return 'media';
+ }
}
/**
? 'filereuploadsummary'
: 'fileuploadsummary',
'default' => $this->mComment,
- 'cols' => intval( $this->getUser()->getOption( 'cols' ) ),
+ 'cols' => $this->getUser()->getIntOption( 'cols' ),
'rows' => 8,
)
);
$out = $this->getOutput();
$out->addJsConfigVars( $scriptVars );
-
$out->addModules( array(
'mediawiki.action.edit', // For <charinsert> support
'mediawiki.legacy.upload', // Old form stuff...
if( !$status->isGood() ) {
$error = $this->getOutput()->parse( $status->getWikiText() );
$this->mainLoginForm( $error );
- return false;
+ return;
}
$u = $status->getValue();
return Status::newFatal( 'noname' );
} elseif ( 0 != $u->idForName() ) {
return Status::newFatal( 'userexists' );
- } elseif ( 0 != strcmp( $this->mPassword, $this->mRetype ) ) {
- return Status::newFatal( 'badretype' );
}
- # check for minimal password length
- $valid = $u->getPasswordValidity( $this->mPassword );
- if ( $valid !== true ) {
- if ( !$this->mCreateaccountMail ) {
+ if ( $this->mCreateaccountMail ) {
+ # do not force a password for account creation by email
+ # set invalid password, it will be replaced later by a random generated password
+ $this->mPassword = null;
+ } else {
+ if ( $this->mPassword !== $this->mRetype ) {
+ return Status::newFatal( 'badretype' );
+ }
+
+ # check for minimal password length
+ $valid = $u->getPasswordValidity( $this->mPassword );
+ if ( $valid !== true ) {
if ( !is_array( $valid ) ) {
$valid = array( $valid, $wgMinimalPasswordLength );
}
return call_user_func_array( 'Status::newFatal', $valid );
- } else {
- # do not force a password for account creation by email
- # set invalid password, it will be replaced later by a random generated password
- $this->mPassword = null;
}
}
// faces etc will probably just fail cleanly here.
$retval = self::RESET_PASS;
} else {
- $retval = ( $this->mPassword == '' ) ? self::EMPTY_PASS : self::WRONG_PASS;
+ $retval = ( $this->mPassword == '' ) ? self::EMPTY_PASS : self::WRONG_PASS;
}
} elseif ( $wgBlockDisablesLogin && $u->isBlocked() ) {
// If we've enabled it, make it so that a blocked user cannot login
case self::SUCCESS:
# We've verified now, update the real record
$user = $this->getUser();
- if( (bool)$this->mRemember != (bool)$user->getOption( 'rememberpassword' ) ) {
+ if( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
$user->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
$user->saveSettings();
} else {
}
}
+ /**
+ * @param $error string
+ */
function resetLoginForm( $error ) {
$this->getOutput()->addHTML( Xml::element( 'p', array( 'class' => 'error' ), $error ) );
$reset = new SpecialChangePassword();
return $result;
}
-
/**
* Run any hooks registered for logins, then HTTP redirect to
* $this->mReturnTo (or Main Page if that's undefined). Formerly we had a
* User::isBlockedFromCreateAccount(), which gets this block, ignores the 'hardblock'
* setting on blocks (bug 13611).
* @param $block Block the block causing this error
+ * @throws ErrorPageError
*/
function userBlockedMessage( Block $block ) {
# Let's be nice about this, it's likely that this feature will be used
* Create a language selector link for a particular language
* Links back to this page preserving type and returnto
*
- * @param $text Link text
- * @param $lang Language code
+ * @param $text string Link text
+ * @param $lang string Language code
* @return string
*/
function makeLanguageSelectorLink( $text, $lang ) {
$query
);
}
+
+ protected function getGroupName() {
+ return 'login';
+ }
}
$out->returnToMain();
}
+
+ protected function getGroupName() {
+ return 'login';
+ }
}
return array( $add, $remove );
}
-
/**
* Add a rights log entry for an action.
*/
$output->addHTML( Xml::element( 'h2', null, $rightsLogPage->getName()->text() ) );
LogEventsList::showLogExtract( $output, 'rights', $user->getUserPage() );
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
*/
private function IPInfo() {
$ip = str_replace( '--', ' - ', htmlspecialchars( $this->getRequest()->getIP() ) );
- return "<!-- visited from $ip -->\n" .
- "<span style='display:none'>visited from $ip</span>";
+ return "<!-- visited from $ip -->\n<span style='display:none'>visited from $ip</span>";
}
/**
function listAuthors( $authors ) {
$list = array();
foreach( (array)$authors as $item ) {
- if( $item == '...' ) {
+ if ( $item == '...' ) {
$list[] = $this->msg( 'version-poweredby-others' )->text();
+ } elseif ( substr( $item, -5 ) == ' ...]' ) {
+ $list[] = substr( $item, 0, -4 ) . $this->msg( 'version-poweredby-others' )->text() . "]";
} else {
$list[] = $item;
}
return $repo->getHeadSHA1();
}
-
/**
* Get the list of entry points and their URLs
* @return string Wikitext
return $out;
}
+ protected function getGroupName() {
+ return 'wiki';
+ }
+
function showEasterEgg() {
$rx = $rp = $xe = '';
$alpha = array( "", "kbQW", "\$\n()" );
$nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
return $this->getLanguage()->specialList( $plink, $nlinks );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
)
);
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
wfRunHooks( 'WantedPages::getQueryInfo', array( &$this, &$query ) );
return $query;
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
'page_title = tl_title' ) ) )
);
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
/* bool */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
/* bool */ 'hidePatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
/* bool */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
- /* ? */ 'namespace' => 'all',
+ /* bool */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
+ /* ? */ 'namespace' => '', //means all
/* ? */ 'invert' => false,
/* bool */ 'associated' => false,
);
# Extract variables from the request, falling back to user preferences or
# other default values if these don't exist
- $prefs['days'] = floatval( $user->getOption( 'watchlistdays' ) );
- $prefs['hideminor'] = $user->getBoolOption( 'watchlisthideminor' );
- $prefs['hidebots'] = $user->getBoolOption( 'watchlisthidebots' );
- $prefs['hideanons'] = $user->getBoolOption( 'watchlisthideanons' );
- $prefs['hideliu'] = $user->getBoolOption( 'watchlisthideliu' );
- $prefs['hideown'] = $user->getBoolOption( 'watchlisthideown' );
- $prefs['hidepatrolled'] = $user->getBoolOption( 'watchlisthidepatrolled' );
-
- # Get query variables
$values = array();
- $values['days'] = $request->getVal( 'days', $prefs['days'] );
- $values['hideMinor'] = (int)$request->getBool( 'hideMinor', $prefs['hideminor'] );
- $values['hideBots'] = (int)$request->getBool( 'hideBots', $prefs['hidebots'] );
- $values['hideAnons'] = (int)$request->getBool( 'hideAnons', $prefs['hideanons'] );
- $values['hideLiu'] = (int)$request->getBool( 'hideLiu', $prefs['hideliu'] );
- $values['hideOwn'] = (int)$request->getBool( 'hideOwn', $prefs['hideown'] );
- $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $prefs['hidepatrolled'] );
+ $values['days'] = $request->getVal( 'days', $defaults['days'] );
+ $values['hideMinor'] = (int)$request->getBool( 'hideMinor', $defaults['hideMinor'] );
+ $values['hideBots'] = (int)$request->getBool( 'hideBots', $defaults['hideBots'] );
+ $values['hideAnons'] = (int)$request->getBool( 'hideAnons', $defaults['hideAnons'] );
+ $values['hideLiu'] = (int)$request->getBool( 'hideLiu', $defaults['hideLiu'] );
+ $values['hideOwn'] = (int)$request->getBool( 'hideOwn', $defaults['hideOwn'] );
+ $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
+ $values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
foreach( $this->customFilters as $key => $params ) {
$values[$key] = (int)$request->getBool( $key );
}
# Up estimate of watched items by 15% to compensate for talk pages...
-
# Toggles
if( $values['hideOwn'] ) {
$conds[] = 'rc_user != ' . $user->getId();
}
# Toggle watchlist content (all recent edits or just the latest)
- if( $user->getOption( 'extendwatchlist' ) ) {
- $limitWatchlist = intval( $user->getOption( 'wllimit' ) );
+ if( $values['extended'] ) {
+ $limitWatchlist = $user->getIntOption( 'wllimit' );
$usePage = false;
} else {
# Top log Ids for a page are not stored
$form = Xml::fieldset( $this->msg( 'watchlist-options' )->text(), false, array( 'id' => 'mw-watchlist-options' ) );
# Show watchlist header
- $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse();
+ $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist) {
$form .= $this->msg( 'wlheader-enotif' )->parseAsBlock() . "\n";
if( $wgShowUpdatedMarker ) {
$form .= Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->getTitle()->getLocalUrl(),
- 'id' => 'mw-watchlist-resetbutton' ) ) .
- $this->msg( 'wlheader-showupdated' )->parse() . ' ' .
- Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) .
- Html::hidden( 'reset', 'all' );
+ 'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
+ $this->msg( 'wlheader-showupdated' )->parse() .
+ Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
+ Html::hidden( 'reset', 'all' ) . "\n";
foreach ( $nondefaults as $key => $value ) {
- $form .= Html::hidden( $key, $value );
+ $form .= Html::hidden( $key, $value ) . "\n";
}
- $form .= Xml::closeElement( 'form' );
+ $form .= Xml::closeElement( 'form' ) . "\n";
}
- $form .= '<hr />';
+ $form .= "<hr />\n";
$tables = array( 'recentchanges', 'watchlist' );
$fields = RecentChange::selectFields();
if( $values['days'] > 0 ) {
$timestamp = wfTimestampNow();
$wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
- $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . '<br />';
+ $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
}
- $cutofflinks = "\n" . $this->cutoffLinks( $values['days'], $nondefaults ) . "<br />\n";
+ $cutofflinks = $this->cutoffLinks( $values['days'], $nondefaults ) . "<br />\n";
# Spit out some control panel links
$filters = array(
$links[] = $this->showHideLink( $nondefaults, $msg, $name, $values[$name] );
}
+ $hiddenFields = $nondefaults;
+ unset( $hiddenFields['namespace'] );
+ unset( $hiddenFields['invert'] );
+ unset( $hiddenFields['associated'] );
+
# Namespace filter and put the whole form together.
$form .= $wlInfo;
$form .= $cutofflinks;
- $form .= $lang->pipeList( $links );
- $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) );
- $form .= '<hr /><p>';
+ $form .= $lang->pipeList( $links ) . "\n";
+ $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) ) . "\n";
+ $form .= "<hr />\n<p>";
$form .= Html::namespaceSelector(
array(
'selected' => $nameSpace,
$associated,
array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
) . ' ';
- $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . '</p>';
- $form .= Html::hidden( 'days', $values['days'] );
- foreach ( $filters as $key => $msg ) {
- if ( $values[$key] ) {
- $form .= Html::hidden( $key, 1 );
- }
+ $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "</p>\n";
+ foreach ( $hiddenFields as $key => $value ) {
+ $form .= Html::hidden( $key, $value ) . "\n";
}
- $form .= Xml::closeElement( 'form' );
- $form .= Xml::closeElement( 'fieldset' );
+ $form .= Xml::closeElement( 'form' ) . "\n";
+ $form .= Xml::closeElement( 'fieldset' ) . "\n";
$output->addHTML( $form );
# If there's nothing to show, stop here
return floor( $count / 2 );
}
+
+ protected function getGroupName() {
+ return 'changes';
+ }
}
}
return Xml::fieldset( $this->msg( 'whatlinkshere-filters' )->text(), $this->getLanguage()->pipeList( $links ) );
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
}
return $query;
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
* @ingroup Templates
*/
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
+}
+
if ( !isset( $wgVersion ) ) {
$wgVersion = 'VERSION';
}
+++ /dev/null
-<?php
-/**
- * Assemble the segments of a chunked upload.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-require_once( __DIR__ . '/../../maintenance/Maintenance.php' );
-set_time_limit( 3600 ); // 1 hour
-
-/**
- * Assemble the segments of a chunked upload.
- *
- * @ingroup Maintenance
- */
-class AssembleUploadChunks extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Re-assemble the segments of a chunked upload into a single file";
- $this->addOption( 'filename', "Desired file name", true, true );
- $this->addOption( 'filekey', "Upload stash file key", true, true );
- $this->addOption( 'userid', "Upload owner user ID", true, true );
- $this->addOption( 'sessionid', "Upload owner session ID", true, true );
- }
-
- public function execute() {
- $e = null;
- wfDebug( "Started assembly for file {$this->getOption( 'filename' )}\n" );
- wfSetupSession( $this->getOption( 'sessionid' ) );
- try {
- $user = User::newFromId( $this->getOption( 'userid' ) );
- if ( !$user ) {
- throw new MWException( "No user with ID " . $this->getOption( 'userid' ) . "." );
- }
-
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
- );
-
- $upload = new UploadFromChunks( $user );
- $upload->continueChunks(
- $this->getOption( 'filename' ),
- $this->getOption( 'filekey' ),
- // @TODO: set User?
- RequestContext::getMain()->getRequest() // dummy request
- );
-
- // Combine all of the chunks into a local file and upload that to a new stash file
- $status = $upload->concatenateChunks();
- if ( !$status->isGood() ) {
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
- );
- session_write_close();
- $this->error( $status->getWikiText() . "\n", 1 ); // die
- }
-
- // We have a new filekey for the fully concatenated file
- $newFileKey = $upload->getLocalFile()->getFileKey();
-
- // Remove the old stash file row and first chunk file
- $upload->stash->removeFileNoAuth( $this->getOption( 'filekey' ) );
-
- // Build the image info array while we have the local reference handy
- $apiMain = new ApiMain(); // dummy object (XXX)
- $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
-
- // Cleanup any temporary local file
- $upload->cleanupTempFile();
-
- // Cache the info so the user doesn't have to wait forever to get the final info
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array(
- 'result' => 'Success',
- 'stage' => 'assembling',
- 'filekey' => $newFileKey,
- 'imageinfo' => $imageInfo,
- 'status' => Status::newGood()
- )
- );
- } catch ( MWException $e ) {
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array(
- 'result' => 'Failure',
- 'stage' => 'assembling',
- 'status' => Status::newFatal( 'api-error-stashfailed' )
- )
- );
- }
- session_write_close();
- if ( $e ) {
- throw $e;
- }
- wfDebug( "Finished assembly for file {$this->getOption( 'filename' )}\n" );
- }
-}
-
-$maintClass = "AssembleUploadChunks";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+++ /dev/null
-<?php
-/**
- * Upload a file from the upload stash into the local file repo.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-require_once( __DIR__ . '/../../maintenance/Maintenance.php' );
-set_time_limit( 3600 ); // 1 hour
-
-/**
- * Upload a file from the upload stash into the local file repo.
- *
- * @ingroup Maintenance
- */
-class PublishStashedFile extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Upload stashed file into the local file repo";
- $this->addOption( 'filename', "Desired file name", true, true );
- $this->addOption( 'filekey', "Upload stash file key", true, true );
- $this->addOption( 'userid', "Upload owner user ID", true, true );
- $this->addOption( 'comment', "Upload comment", true, true );
- $this->addOption( 'text', "Upload description", true, true );
- $this->addOption( 'watch', "Whether the uploader should watch the page", true, true );
- $this->addOption( 'sessionid', "Upload owner session ID", true, true );
- }
-
- public function execute() {
- wfSetupSession( $this->getOption( 'sessionid' ) );
- try {
- $user = User::newFromId( $this->getOption( 'userid' ) );
- if ( !$user ) {
- throw new MWException( "No user with ID " . $this->getOption( 'userid' ) . "." );
- }
-
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
- );
-
- $upload = new UploadFromStash( $user );
- // @TODO: initialize() causes a GET, ideally we could frontload the antivirus
- // checks and anything else to the stash stage (which includes concatenation and
- // the local file is thus already there). That way, instead of GET+PUT, there could
- // just be a COPY operation from the stash to the public zone.
- $upload->initialize( $this->getOption( 'filekey' ), $this->getOption( 'filename' ) );
-
- // Check if the local file checks out (this is generally a no-op)
- $verification = $upload->verifyUpload();
- if ( $verification['status'] !== UploadBase::OK ) {
- $status = Status::newFatal( 'verification-error' );
- $status->value = array( 'verification' => $verification );
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
- );
- $this->error( "Could not verify upload.\n", 1 ); // die
- }
-
- // Upload the stashed file to a permanent location
- $status = $upload->performUpload(
- $this->getOption( 'comment' ),
- $this->getOption( 'text' ),
- $this->getOption( 'watch' ),
- $user
- );
- if ( !$status->isGood() ) {
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
- );
- $this->error( $status->getWikiText() . "\n", 1 ); // die
- }
-
- // Build the image info array while we have the local reference handy
- $apiMain = new ApiMain(); // dummy object (XXX)
- $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
-
- // Cleanup any temporary local file
- $upload->cleanupTempFile();
-
- // Cache the info so the user doesn't have to wait forever to get the final info
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array(
- 'result' => 'Success',
- 'stage' => 'publish',
- 'filename' => $upload->getLocalFile()->getName(),
- 'imageinfo' => $imageInfo,
- 'status' => Status::newGood()
- )
- );
- } catch ( MWException $e ) {
- UploadBase::setSessionStatus(
- $this->getOption( 'filekey' ),
- array(
- 'result' => 'Failure',
- 'stage' => 'publish',
- 'status' => Status::newFatal( 'api-error-publishfailed' )
- )
- );
- throw $e;
- }
- session_write_close();
- }
-}
-
-$maintClass = "PublishStashedFile";
-require_once( RUN_MAINTENANCE_IF_MAIN );
* Get the base 36 SHA1 of the file
* @return string
*/
- protected function getTempFileSha1Base36() {
+ public function getTempFileSha1Base36() {
return FSFile::getSha1Base36FromPath( $this->mTempPath );
}
}
$this->mFilteredName = $nt->getDBkey();
-
-
/**
* We'll want to blacklist against *any* 'extension', and use
* only the final one for the whitelist.
$ext = array( $this->mFinalExtension );
}
}
-
}
/* Don't allow users to override the blacklist (check file extension) */
}
# use set to add a remote / data / script target to an element
- if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+ if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found svg setting attibute to '$value' in uploaded file.\n" );
return true;
}
-
# use handler attribute with remote / data / script
- if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+ if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
return true;
}
}
}
+ // Check for files with the same name but a different extension
+ $similarFiles = RepoGroup::singleton()->getLocalRepo()->findFilesByPrefix(
+ "{$partname}.", 1 );
+ if ( count( $similarFiles ) ) {
+ return array(\r
+ 'warning' => 'exists-normalized',\r
+ 'file' => $file,\r
+ 'normalizedFile' => $similarFiles[0],\r
+ );
+ }
+
if ( self::isThumbName( $file->getName() ) ) {
# Check for filenames like 50px- or 180px-, these are mostly thumbnails
$nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
}
}
-
foreach( self::getFilenamePrefixBlacklist() as $prefix ) {
if ( substr( $partname, 0, strlen( $prefix ) ) == $prefix ) {
return array(
* Get the base 36 SHA1 of the file
* @return string
*/
- protected function getTempFileSha1Base36() {
+ public function getTempFileSha1Base36() {
return $this->mFileProps['sha1'];
}
return $this->removeFileNoAuth( $key );
}
-
/**
* Remove a file (see removeFile), but doesn't check ownership first.
*
public function removeFileNoAuth( $key ) {
wfDebug( __METHOD__ . " clearing row $key\n" );
+ // Ensure we have the UploadStashFile loaded for this key
+ $this->getFile( $key );
+
$dbw = $this->repo->getMasterDb();
$dbw->delete(
return $number;
}
+ /**
+ * Front-end for non-commafied formatNum
+ *
+ * @param mixed $number the string to be formatted, should be an integer
+ * or a floating point number.
+ * @since 1.21
+ * @return string
+ */
+ public function formatNumNoSeparators( $number ) {
+ return $this->formatNum( $number, true );
+ }
+
/**
* @param $number string
* @return string
return '';
}
- // Handle explicit 0= and 1= forms
+ // Handle explicit n=pluralform cases
foreach ( $forms as $index => $form ) {
- if ( isset( $form[1] ) && $form[1] === '=' ) {
- if ( $form[0] === (string) $count ) {
- return substr( $form, 2 );
+ if ( preg_match( '/\d+=/i', $form ) ) {
+ $pos = strpos( $form, '=' );
+ if ( substr( $form, 0, $pos ) === (string) $count ) {
+ return substr( $form, $pos + 1 );
}
unset( $forms[$index] );
}
}
}
+ /**
+ * Get the ordered list of fallback languages, ending with the fallback
+ * language chain for the site language.
+ *
+ * @since 1.21
+ * @param $code string Language code
+ * @return array
+ */
+ public static function getFallbacksIncludingSiteLanguage( $code ) {
+ global $wgLanguageCode;
+
+ // Usually, we will only store a tiny number of fallback chains, so we
+ // keep them in static memory.
+ static $fallbackLanguageCache = array();
+ $cacheKey = "{$code}-{$wgLanguageCode}";
+
+ if ( !array_key_exists( $cacheKey, $fallbackLanguageCache ) ) {
+ $fallbacks = self::getFallbacksFor( $code );
+
+ // Take the final 'en' off of the array before splicing
+ if ( end( $fallbacks ) === 'en' ) {
+ array_pop( $fallbacks );
+ }
+ // Append the site's fallback chain
+ $siteFallbacks = self::getFallbacksFor( $wgLanguageCode );
+
+ // Eliminate any languages already included in the chain
+ $siteFallbacks = array_intersect( array_diff( $siteFallbacks, $fallbacks ), $siteFallbacks );
+ if ( $siteFallbacks ) {
+ $fallbacks = array_merge( $fallbacks, $siteFallbacks );
+ }
+ if ( end( $fallbacks ) !== 'en' ) {
+ $fallbacks[] = 'en';
+ }
+ $fallbackLanguageCache[$cacheKey] = $fallbacks;
+ }
+ return $fallbackLanguageCache[$cacheKey];
+ }
+
/**
* Get all messages for a given language
* WARNING: this may take a long time. If you just need all message *keys*
+++ /dev/null
-<?php
-/**
- * Lithuanian (Lietuvių) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Lithuanian (Lietuvių)
- *
- * @ingroup Language
- */
-class LanguageLt extends Language {
- /* Word forms (with examples):
- 1 - vienas (1) lapas, dvidešimt vienas (21) lapas
- 2 - trys (3) lapai
- 3 - penkiolika (15) lapų
- */
-
- /**
- * Lithuanian plural forms as per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#lt
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
-
- // if the number is not mentioned in message, then use $form[0] for singular and $form[1] for plural or zero
- if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
-
- $forms = $this->preConvertPlural( $forms, 3 );
- // Form[0] if n mod 10 is 1 and n mod 100 not in 11..19;
- if ( $count % 10 == 1 && $count % 100 != 11 ) return $forms[0];
- // Forms[1] if n mod 10 in 2..9 and n mod 100 not in 11..19;
- if ( $count % 10 >= 2 && ( $count % 100 < 10 || $count % 100 >= 20 ) ) return $forms[1];
- return $forms[2];
- }
-}
+++ /dev/null
-<?php
-/**
- * Latvian (Latviešu) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Niklas Laxström
- * @copyright Copyright © 2006, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- * @ingroup Language
- */
-
-/**
- * Latvian (Latviešu)
- *
- * @ingroup Language
- */
-class LanguageLv extends Language {
- /**
- * Plural form transformations. Using the first form for words with the last digit 1, but not for words with the last digits 11, and the second form for all the others.
- *
- * Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}}
- *
- * @param $count Integer
- * @param $forms Array
- * @return String
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
-
- // @todo FIXME: CLDR defines 3 plural forms instead of 2. Form for 0 is missing.
- // http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#lv
- $forms = $this->preConvertPlural( $forms, 2 );
-
- return ( ( $count % 10 == 1 ) && ( $count % 100 != 11 ) ) ? $forms[0] : $forms[1];
- }
-}
<pluralRule count="two">n mod 10 is 2</pluralRule>
<pluralRule count="few">n mod 10 in 3..4</pluralRule>
</pluralRules>
- <!-- Plural form transformations
- Based on this discussion: http://translatewiki.net/wiki/Thread:Support/New_plural_rules_for_Scots_Gaelic_(gd)
- $forms[0] - 1
- $forms[1] - 2
- $forms[2] - 11
- $forms[3] - 12
- $forms[4] - 3-10, 13-19
- $forms[5] - 0, 20, rest -->
- <pluralRules locales="gd">
- <pluralRule count="one">n is 1</pluralRule>
- <pluralRule count="two">n is 2</pluralRule>
- <pluralRule count="elevan">n is 11</pluralRule>
- <pluralRule count="twelve">n is 12</pluralRule>
- <pluralRule count="few">n in 3..10 or n in 13..19</pluralRule>
- </pluralRules>
- <!-- Hopefully temporary overrides for bug 40251 -->
- <pluralRules locales="fa hu ja vi">
- <pluralRule count="one">n is 1</pluralRule>
- </pluralRules>
<!-- Copied from "bh" -->
<pluralRules locales="bho">
<pluralRule count="one">n in 0..1</pluralRule>
'gotaccount' => "Het u reeds 'n rekening? '''$1'''.",
'gotaccountlink' => 'Teken in',
'userlogin-resetlink' => 'U aanmeld besonderhede vergeet?',
-'createaccountmail' => 'deur e-pos',
+'createaccountmail' => "Gebruik 'n tydelike lukrake wagwoord en stuur dit na die e-posadres hier onder",
'createaccountreason' => 'Rede:',
'badretype' => 'Die ingetikte wagwoorde is nie dieselfde nie.',
'userexists' => "Die gebruikersnaam wat u gekies het is reeds geneem.
'loginlanguagelabel' => 'Taal: $1',
'suspicious-userlogout' => "U versoek om af te teken is geïgnoreer omdat dit lyk asof dit deur 'n gebreekte webleser of instaanbediener gestuur is.",
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Onbekende fout in PHP se mail()-funksie',
'user-mail-no-addy' => "Geprobeer om e-pos te stuur sonder 'n e-posadres.",
'user-mail-no-body' => "Daar is probeer om 'n leë of 'n onredelike kort boodskap te stuur.",
'search-interwiki-default' => '$1 resultate:',
'search-interwiki-more' => '(meer)',
'search-relatedarticle' => 'Verwante',
-'mwsuggest-disable' => 'Deaktiveer AJAX-voorstelle',
+'mwsuggest-disable' => 'Deaktiveer soek-voorstelle',
'searcheverything-enable' => 'Soek in alle naamruimtes',
'searchrelated' => 'verwante',
'searchall' => 'alle',
'prefs-displaywatchlist' => 'Weergaweopsies',
'prefs-diffs' => 'Verskille',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Die e-posadres lyk geldig',
'email-address-validity-invalid' => "Verskaf 'n geldige e-posadres",
Hulle moet gewysig word om eerder direk na die regte onderwerpe te skakel.<br />
'n Bladsy word beskou as 'n dubbelsinnigheidsbladsy as dit 'n sjabloon bevat wat geskakel is vanaf [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => "Blaaie met 'n bladsy-eienskap",
+'pageswithprop-legend' => "Blaaie met 'n bladsy-eienskap",
+'pageswithprop-text' => "Hierdie bladsy lys blaaie met 'n bepaalde blady-eienskap.",
+'pageswithprop-prop' => 'Naam van die eienskap:',
+'pageswithprop-submit' => 'OK',
+
'doubleredirects' => 'Dubbele aansture',
'doubleredirectstext' => 'Hierdie lys bevat bladsye wat aansture na ander aanstuurblaaie is.
Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste reël van van die tweede aanstuur se teks, wat gewoonlik die "regte" teiken-bladsy gee waarna die eerste aanstuur behoort te wys.
'listgrouprights-addgroup-self-all' => 'Alle groepe byvoeg tot eie gebruiker',
'listgrouprights-removegroup-self-all' => 'Alle groepe verwyder van eie gebruiker',
-# E-mail user
+# Email user
'mailnologin' => 'Geen versendadres beskikbaar',
'mailnologintext' => "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in die [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te stuur.",
'emailuser' => 'Stuur e-pos na hierdie gebruiker',
'usermessage-editor' => 'Stelselboodskapper',
# Watchlist
-'watchlist' => 'My dophoulys',
+'watchlist' => 'Dophoulys',
'mywatchlist' => 'Dophoulys',
'watchlistfor2' => 'Vir $1 $2',
'nowatchlist' => 'U het geen items in u dophoulys nie.',
'pageinfo-robot-noindex' => 'Nie indekseerbaar nie',
'pageinfo-views' => 'Aantal kere gewys',
'pageinfo-watchers' => 'Aantal dophouers',
+'pageinfo-few-watchers' => 'Minder as {{PLURAL:$1|dophouer|$1 dophouers}}',
'pageinfo-redirects-name' => 'Aansture na die bladsy',
'pageinfo-subpages-name' => 'Subblaaie van die bladsy',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|aanstuur|aansture}}; $3 {{PLURAL:$3|nie-aanstuur|nie-aansture}})',
'monthsall' => 'alle',
'limitall' => 'alle',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Bevestig e-posadres',
'confirmemail_noemail' => "U het nie 'n geldige e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] gestel nie.",
'confirmemail_text' => "Hierdie wiki vereis dat u e-posadres bevestig word voordat epos-funksies gebruik word. Klik onderstaande knoppie om 'n bevestigingspos na u adres te stuur. Die pos sal 'n skakel met 'n kode insluit; maak hierdie skakel oop in u webblaaier om te bevestig dat die adres geldig is.",
'specialpages-group-highuse' => 'Baie gebruikte bladsye',
'specialpages-group-pages' => 'Lyste van bladsye',
'specialpages-group-pagetools' => 'Bladsyhulpmiddels',
-'specialpages-group-wiki' => 'Wiki data en hulpmiddels',
+'specialpages-group-wiki' => 'Data en hulpmiddels',
'specialpages-group-redirects' => 'Aanstuur gewone bladsye',
'specialpages-group-spam' => 'Spam-hulpmiddels',
'logentry-newusers-newusers' => 'Gebruiker $1 is geskep',
'logentry-newusers-create' => 'Gebruiker $1 is geskep',
'logentry-newusers-create2' => 'Gebruiker $3 is deur $1 geskep',
+'logentry-newusers-byemail' => 'Gebruiker $3 is deur $1 geskep en die wagwoord is per e-pos aangestuur',
'logentry-newusers-autocreate' => 'Die gebruiker $1 is outomaties geskep',
'logentry-rights-rights' => '$1 het groepslidmaatskap vir $3 van $4 na $5 gewysig',
'logentry-rights-rights-legacy' => '$1 het groepslidmaatskap vir $3 gewysig',
'api-error-ok-but-empty' => 'Interne fout: geen reaksie van die bediener.',
'api-error-overwrite' => "'N bestaande lêer vervang word nie toegelaat nie.",
'api-error-stashfailed' => 'Interne fout: Server nie tydelike lêer te stoor.',
+'api-error-publishfailed' => 'Interne fout: bediener kon nie die tydelike lêer publiseer nie.',
'api-error-timeout' => 'Die bediener het nie reageer binne die verwagte tyd.',
'api-error-unclassified' => "'n Onbekende fout het voorgekom.",
'api-error-unknown-code' => 'Onbekende fout: "$1"',
* @author Ali1
* @author Alnokta
* @author Antime
+ * @author Arjanizary
* @author Avocato
* @author Bassem JARKAS
* @author Chaos
'october-gen' => 'أكتوبر',
'november-gen' => 'نوفمبر',
'december-gen' => 'ديسمبر',
-'jan' => 'Ù\8aÙ\86اÙ\8aر',
-'feb' => 'فبراير',
-'mar' => 'مارس',
-'apr' => 'أبريل',
-'may' => 'مايو',
-'jun' => 'يونيو',
-'jul' => 'يوليو',
-'aug' => 'أغسطس',
-'sep' => 'سبتÙ\85بر',
-'oct' => 'Ø£Ù\83تÙ\88بر',
-'nov' => 'نوفمبر',
-'dec' => 'ديسمبر',
+'jan' => 'Ù\83اÙ\86Ù\88Ù\86 اÙ\84ثاÙ\86Ù\8a',
+'feb' => 'شباط',
+'mar' => 'آذار',
+'apr' => 'نيسان',
+'may' => 'أيار',
+'jun' => 'حزيران',
+'jul' => 'تموز',
+'aug' => 'آب',
+'sep' => 'Ø£Ù\8aÙ\84Ù\88Ù\84',
+'oct' => 'تشرÙ\8aÙ\86 اÙ\84Ø£Ù\88Ù\84',
+'nov' => 'تشرين الثاني',
+'dec' => 'كانون الأول',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|لا تصنيف|تصنيف|تصنيفان|تصنيفات}}',
'loginlanguagelabel' => 'اللغة: $1',
'suspicious-userlogout' => 'رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "خطأ غير معروف في وظيفة البريد PHP's mail()",
'user-mail-no-addy' => 'لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.',
'user-mail-no-body' => 'محاول ارسال بريد إلكتروني فارغ أو ذو نص قصير.',
'search-interwiki-default' => '$1 نتيجة:',
'search-interwiki-more' => '(المزيد)',
'search-relatedarticle' => 'مرتبطة',
-'mwsuggest-disable' => 'عطÙ\84 اÙ\82تراØات أجاÙ\83س',
+'mwsuggest-disable' => 'تعطÙ\8aÙ\84 اÙ\82تراØات AJAX',
'searcheverything-enable' => 'ابحث في جميع النطاقات',
'searchrelated' => 'مرتبطة',
'searchall' => 'الكل',
'prefs-displaywatchlist' => 'خصائص العرض',
'prefs-diffs' => 'فروقات',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'يبدو أن عنوان البريد الإلكتروني صالح',
'email-address-validity-invalid' => 'أدخل عنوان بريد إلكتروني صالح',
ربما ينبغي أن تصل إلى صفحة أكثر ملائمة. <br />
تعامل الصفحة كصفحة توضيح إذا كان بها قالب موجود في [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'صفحات مع خاصية الصفحة',
+'pageswithprop-legend' => 'صفحات مع خاصية الصفحة',
+'pageswithprop-text' => 'تسرد هذه الصفحة الصفحات التي تستخدم خاصية صفحة معينة.',
+'pageswithprop-prop' => 'اسم الخاصية:',
+'pageswithprop-submit' => 'اذهب',
+
'doubleredirects' => 'تحويلات مزدوجة',
'doubleredirectstext' => 'هذه الصفحة تعرض الصفحات التي تحول إلى صفحات تحويل أخرى.
كل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهدف التحويلة الثانية، والذي عادة ما يشير إلى صفحة الهدف "الحقيقية"، التي من المفترض أن تحول إليها التحويلة الأولى.
'listgrouprights-addgroup-self-all' => 'يمكنه إضافة كل المجموعات إلى حسابه الخاص',
'listgrouprights-removegroup-self-all' => 'يمكنه إزالة كل المجموعات من حسابه الخاص',
-# E-mail user
+# Email user
'mailnologin' => 'لا يوجد عنوان للإرسال',
'mailnologintext' => 'يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.',
'emailuser' => 'إرسال رسالة لهذا المستخدم',
'import-error-interwiki' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها محجوز للربط الخارجي (interwiki).',
'import-error-special' => 'صفحة "$1" لم تستورد لأنها تنتمي إلى نطاق خاص يمنع الصفحات.',
'import-error-invalid' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها غير صحيح.',
+'import-error-unserialize' => 'مراجعة $2 من صفحة " $1 " لا يمكن أن يكون أونسيرياليزيد. وأفيد المراجعة استخدام طراز المحتوى $3 تسلسل ك $4 .',
'import-options-wrong' => 'خطأ {{PLURAL:$2|خيار|خيارات}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'إن عنوان الصفحة الجذر المعطاة هي ذات عنوان غير صالح.',
'import-rootpage-nosubpage' => 'إن النطاق "$1" لصفحة الجذر لا يسمح بصفحات فرعية.',
'monthsall' => 'الكل',
'limitall' => 'الكل',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'تأكيد عنوان البريد الإلكتروني',
'confirmemail_noemail' => 'ليس لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]].',
'confirmemail_text' => '{{SITENAME}} يجب تأكيد عنوانك الإلكتروني قبل استخدام خصائص البريد الإلكتروني.
'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܕܬܚܙܐ ܘܬܢܣܚ ܠܡܒܘ̈ܥܐ ܕܗܕܐ ܦܐܬܐ:',
'protectedinterface' => 'ܗܕܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ ܒܗܢܐ ܘܝܩܝ, ܘܐܝܬܝܗܝ ܢܛܪܬܐ ܠܡܘܢܥ ܚܘܒܠܐ.
ܠܡܘܣܦ ܐܘ ܫܘܚܠܦ ܬܘܪ̈ܓܡܐ ܕܟܠܗܘܢ ܘܝܩܝ، ܐܦܠܚ [//translatewiki.net/ translatewiki.net]، ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ.',
-'editinginterface' => "'''Ü\99Ü\98Ü\97ܪÜ\90:''' Ü\90ܢܬ Ü«Ü\9aÜ Ü¦Ü¬ ܦܐܬܐ ܕܡܬܦܠܚܬ ܒܚܙܝܐ ܟܬܝܒܝܐ ܕܬܚܪܙܬܐ.
+'editinginterface' => "'''Ü\99Ü\98Ü\97ܪÜ\90:''' Ü\90ܢܬ ܬܫÜ\9aÜ Ü¦ ܦܐܬܐ ܕܡܬܦܠܚܬ ܒܚܙܝܐ ܟܬܝܒܝܐ ܕܬܚܪܙܬܐ.
ܟܠ ܫܘܚܠܦܐ ܒܦܐܬܐ ܗܕܐ ܢܗܘܐ ܠܗ ܡܥܒܕܢܘܬܐ ܥܠ ܐܣܟܡܐ ܕܦܐܬܐ ܕܡܦܠܚܢܐ ܕܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ ܒܘܝܩܝ ܗܢܐ.
ܠܡܘܣܦ ܐܘ ܫܘܚܠܦ ܬܘܪ̈ܓܡܐ ܕܟܠܗܘܢ ܘܝܩܝ، ܐܦܠܚ [//translatewiki.net/ translatewiki.net]، ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ.",
'sqlhidden' => '(ܒܘܬܬܐ SQL ܛܫܝܐ)',
'revdelete-selected' => "'''{{PLURAL:$2|ܬܢܝܬܐ ܓܒܝܬܐ|ܬܢܝܬ̈ܐ ܓܒܝܬܐ}} ܕ [[:$1]]:'''",
'revdelete-hide-text' => 'ܛܫܝ ܟܬܒܬܐ ܕܬܢܝܬܐ',
'revdelete-hide-image' => 'ܛܫܝ ܚܒܝܫܬ̈ܐ ܕܠܦܦܐ',
+'revdelete-hide-name' => 'ܛܫܝ ܥܒܕܐ ܘܢܘܦܐ',
'revdelete-hide-comment' => 'ܛܫܝ ܟܪܝܘܬܐ ܕܫܘܚܠܦܐ',
'revdelete-hide-user' => 'ܛܫܝ ܫܡܐ/ܐܝ ܦܝ (IP) ܕܡܦܠܚܢܐ',
+'revdelete-radio-same' => '(ܠܐ ܬܫܚܠܦ)',
'revdelete-radio-set' => 'ܐܝܢ',
'revdelete-radio-unset' => 'ܠܐ',
'revdelete-log' => 'ܥܠܬܐ:',
'search-result-size' => '$1 ({{PLURAL:$2|1 ܡܠܬܐ|$2 ܡܠ̈ܐ}})',
'search-redirect' => '(ܨܝܒ $1)',
'search-section' => '(ܡܢܬܐ $1)',
-'search-suggest' => 'ܐܪܐ ܣܟܠ ܗܘܐ ܐܢܬ: $1',
+'search-suggest' => 'ܐܪܐ ܣܟܠܬ ܗܘܐ: $1',
'search-interwiki-caption' => 'ܬܪ̈ܡܝܬܐ ܐܚܘܬ̈ܐ',
'search-interwiki-default' => 'ܦܠܛ̈ܐ ܕ $1:',
'search-interwiki-more' => '(ܝܬܝܪ)',
'search-relatedarticle' => 'ܐܚܝܢܝ̈ܐ',
+'mwsuggest-disable' => 'ܒܛܘܠ ܬܘܦܥܠܐ ܕܡܚܫܚܬ̈ܐ ܕܒܨܝܐ',
'searcheverything-enable' => 'ܒܨܝ ܒܟܠ ܚܩܠܬ̈ܐ',
'searchrelated' => 'ܐܚܝܢܝ̈ܐ',
'searchall' => 'ܟܠ',
# User rights log
'rightslog' => 'ܣܓܠܐ ܕܙܕ̈ܩܐ ܕܡܦܠܚܢܐ',
+'rightslogtext' => 'ܗܢܘ ܣܓܠܐ ܕܫܘܚܠܦ̈ܐ ܕܙܕ̈ܩܐ ܕܡܦܠܚܢܐ.',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ܩܪܝ ܦܐܬܐ ܗܕܐ',
'listgrouprights-removegroup-self' => 'ܠܚܝ {{PLURAL:$2|ܟܢܘܫܬܐ|ܟܢܘܫܬ̈ܐ}} ܡܢ ܚܘܫܒܢܗ ܕܝܠܢܝܐ: $1',
'listgrouprights-removegroup-self-all' => 'ܠܚܝ ܟܠ ܟܢܘܫܬ̈ܐ ܡܢ ܚܘܫܒܢܗ ܕܝܠܢܝܐ',
-# E-mail user
+# Email user
'mailnologin' => 'ܠܝܬ ܡܘܢܥܐ ܠܫܘܕܪܐ',
'emailuser' => 'ܫܕܪ ܐܓܪܬܐ ܠܗܢܐ ܡܦܠܚܢܐ',
'emailpage' => 'ܫܕܪ ܐܓܪܬܐ ܒܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܠܡܦܠܚܢܐ',
'actioncomplete' => 'ܥܡܠܝܬܐ ܓܡܪܬ',
'actionfailed' => 'ܥܡܠܝܬܐ ܠܐ ܢܨܚܬ',
'dellogpage' => 'ܣܓܠܐ ܕܫܝܦܐ',
+'dellogpagetext' => 'ܠܬܚܬ ܡܟܬܒܘܬܐ ܕܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ ܚܕ̈ܬܬܐ.',
'deletionlog' => 'ܣܓܠܐ ܕܫܝܦܐ',
'deletecomment' => 'ܥܠܬܐ:',
'deleteotherreason' => 'ܥܠܬܐ ܐܚܪܬܐ/ܝܬܝܪܬܐ:',
# Namespace 8 related
'allmessages' => 'ܐܓܪ̈ܬܐ ܕܛܟܣܐ',
'allmessagesname' => 'ܫܡܐ',
+'allmessagesdefault' => 'ܐܓܪܬܐ ܕܟܬܒܬܐ ܡܬܚܫܒܢܝܬܐ',
'allmessagescurrent' => 'ܟܬܒܬܐ ܗܫܝܬܐ ܕܐܓܪܬܐ',
'allmessages-filter-legend' => 'ܡܨܦܝܢܝܬܐ',
+'allmessages-filter' => 'ܨܦܝ ܐܝܟ ܐܝܟܢܝܘܬܐ ܕܡܬܕܝܠܢܘܬܐ:',
+'allmessages-filter-unmodified' => 'ܠܐ ܫܘܓܢܝܐ',
'allmessages-filter-all' => 'ܟܠ',
+'allmessages-filter-modified' => 'ܫܘܓܢܝܐ',
'allmessages-prefix' => 'ܡܨܦܝܢܝܬܐ ܐܝܟ ܫܘܪܝܐ',
'allmessages-language' => 'ܠܫܢܐ:',
'allmessages-filter-submit' => 'ܙܠ',
'pageinfo-lasttime' => 'ܣܝܩܘܡܐ ܕܫܘܚܠܦܐ ܐܚܪܝܐ',
'pageinfo-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ',
'pageinfo-authors' => 'ܡܢܝܢܐ ܕܡܫܚܠܦܢ̈ܐ ܡܫܚܠܦ̈ܐ',
-'pageinfo-recent-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ (ܒ {{PLURAL:$1||ܚܕ ܝܘܡܐ|$1 ܝܘܡܬ̈ܐ}})',
+'pageinfo-recent-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ (ܒ $1 ܕܕܥܒܪ)',
'pageinfo-recent-authors' => 'ܡܢܝܢܐ ܕܡܫܚܠܦܢ̈ܐ ܡܫܚܠܦ̈ܐ ܐܚܪ̈ܝܐ',
'pageinfo-toolboxlink' => 'ܝܕ̈ܥܬܐ ܥܠ ܦܐܬܐ',
'pageinfo-contentpage-yes' => 'ܐܝܢ',
'monthsall' => 'ܟܠ',
'limitall' => 'ܟܠ',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'ܫܪܪ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
'confirmemail_subject' => 'ܫܘܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܡܢ {{SITENAME}}',
'confirmemail_invalidated' => 'ܫܘܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܐܬܒܛܠ',
'specialpages-group-highuse' => 'ܦܐܬܬ̈ܐ ܕܡܬܚܫܚܢܘܬܐ ܥܠܝܬܐ',
'specialpages-group-pages' => 'ܡܟܬܒܘܬ̈ܐ ܕܦܐܬܬ̈ܐ',
'specialpages-group-pagetools' => 'ܡܐܢ̈ܐ ܕܦܐܬܐ',
-'specialpages-group-wiki' => 'ܠܝܬ̈ܐ ܘܡܐܢ̈ܐ',
+'specialpages-group-wiki' => 'Ü\93Ü Ü\9dܬÌ\88Ü\90 Ü\98Ü¡Ü\90Ü¢Ì\88Ü\90',
'specialpages-group-redirects' => 'ܨܘܝܒܐ ܕܦܐܬܐ ܕܝܠܢܝܬܐ',
# Special:BlankPage
'logentry-move-move_redir-noredirect' => '$1 ܫܢܐ ܦܐܬܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܦܐܬܐ ܕܨܘܝܒܐ ܘܕܠܐ ܫܒܩܐ ܦܐܬܐ ܕܨܘܝܒܐ',
'logentry-patrol-patrol' => '$1 ܫܘܕܥ ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
'logentry-patrol-patrol-auto' => '$1 ܝܬܐܝܬ ܫܘܕܥ ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
-'logentry-newusers-newusers' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 $1 Ü\90ܬÜ\92ܪÜ\90',
-'logentry-newusers-create' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 $1 Ü\90ܬÜ\92ܪÜ\90',
-'logentry-newusers-create2' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 $3 Ü\90ܬÜ\92ܪÜ\90 ܒܝܕ $1',
+'logentry-newusers-newusers' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 $1 Ü\90ܬܬÜ\9fÜ\9dÜ¢',
+'logentry-newusers-create' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 $1 Ü\90ܬܬÜ\9fÜ\9dÜ¢',
+'logentry-newusers-create2' => 'Ü\9aÜ\98Ü«Ü\92Ü¢Ü\90 Ü\95Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 $3 Ü\90ܬܬÜ\9fÜ\9dÜ¢ ܒܝܕ $1',
'logentry-newusers-autocreate' => 'ܚܘܫܒܢܐ $1 ܐܬܒܪܝ ܝܬܐܝܬ',
'rightsnone' => '(ܠܐ ܡܕܡ)',
'loginlanguagelabel' => 'Llingua: $1',
'suspicious-userlogout' => "Negósete'l pidimientu de desconexón porque paez que vien d'un restolador frañíu o d'un proxy de caché.",
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
'user-mail-no-addy' => 'Intentasti unviar un corréu electrónicu ensin direición.',
'user-mail-no-body' => "Trató d'unviar un corréu electrónicu con un cuerpu baleru o curtiu enforma.",
'prefs-displaywatchlist' => 'Opciones de vista',
'prefs-diffs' => 'Diferencies',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'La direición de corréu paez válida',
'email-address-validity-invalid' => 'Escribi una direición de corréu válida',
'disambiguations-text' => "Les siguientes páxines contienen polo menos un enllaz a una '''páxina de dixebra'''. En cuenta d'ello habríen enllaciar a una páxina más apropiada.<br />
Una páxina tratase como una páxina de dixebra si usa una plantía que tea enllaciada dende [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Páxines con una propiedá de páxina',
+'pageswithprop-legend' => 'Páxines con una propiedá de páxina',
+'pageswithprop-text' => "Esta páxina llista les páxines qu'usen una propiedá de páxina determinada.",
+'pageswithprop-prop' => 'Nome de la propiedá:',
+'pageswithprop-submit' => 'Dir',
+
'doubleredirects' => 'Redireiciones dobles',
'doubleredirectstext' => 'Esta páxina llista páxines que redireicionen a otres páxines de redireición.
Cada filera contién enllaces a la primer y segunda redireición, asina como al oxetivu de la segunda redireición, que de vezu ye la páxina oxetivu "real", onde tendría d\'empobinar la primer redireición.
'listgrouprights-addgroup-self-all' => 'Amestar tolos grupos a la cuenta propia',
'listgrouprights-removegroup-self-all' => 'Desaniciar tolos grupos de la cuenta propia',
-# E-mail user
+# Email user
'mailnologin' => "Ensin direición d'unviu",
'mailnologintext' => 'Has tar [[Special:UserLogin|identificáu]]
y tener una direición de corréu válida nes tos [[Special:Preferences|preferencies]]
'monthsall' => 'toos',
'limitall' => 'toos',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Confirmar direición de corréu',
'confirmemail_noemail' => "Nun tienes una direición de corréu válida nes tos [[Special:Preferences|preferencies d'usuariu]].",
'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les
'duration-centuries' => '$1 {{PLURAL:$1|sieglu|sieglos}}',
'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenios}}',
+# Image rotation
+'rotate-comment' => 'Imaxe xirada $1 {{PLURAL:$1|grau|graos}} en sentíu horariu',
+
);
'loginlanguagelabel' => 'Мова: $1',
'suspicious-userlogout' => 'Ваш запыт на выхад быў адмоўлены, паколькі ён выглядае як накіраваны са зламанага браўзера або кэшаванне проксі-сервераў.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Невядомая памылка ў функцыі PHP-пошты',
'user-mail-no-addy' => 'Паспрабаваў адправіць электронны ліст без адрасу электроннай пошты',
'prefs-displaywatchlist' => 'Паказ',
'prefs-diffs' => 'Розніцы',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => "Адрас электроннай пошты з'яўляецца сапраўдным",
'email-address-validity-invalid' => 'Увядзіце слушны адрас электроннай пошты',
'action-sendemail' => 'адпраўка электронных пісем',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|мена|менаў}}',
+'nchanges' => '$1 {{PLURAL:$1|змена|зменÑ\8b|зменаў}}',
'recentchanges' => 'Нядаўнія змяненні',
'recentchanges-legend' => 'Магчымасці паказу',
'recentchanges-summary' => 'Гэта апошнія мены на пляцоўцы {{SITENAME}}.',
'listgrouprights-addgroup-self-all' => 'Дадаць усе групы да свайго акаунта',
'listgrouprights-removegroup-self-all' => 'Выдаліць усе групы са свайго акаунта',
-# E-mail user
+# Email user
'mailnologin' => 'Няма эл.адрасу',
'mailnologintext' => 'Трэба [[Special:UserLogin|ўвайсці ў сістэму]] і мець пацверджаны адрас эл.пошты ў сваіх [[Special:Preferences|настáўленнях]], каб слаць эл.пошту іншым удзельнікам.',
'emailuser' => 'Эл.пошта ўдзельніка',
'contributions-title' => 'Уклад удзельніка $1',
'mycontris' => 'Уклад',
'contribsub2' => 'Для $1 ($2)',
-'nocontribs' => 'Не знойдзена менаў, адпаведных зададзеным параметрам.',
+'nocontribs' => 'Ð\9dе знойдзена зменаÑ\9e, адпаведнÑ\8bÑ\85 зададзенÑ\8bм паÑ\80амеÑ\82Ñ\80ам.',
'uctop' => '(апошн.)',
'month' => 'Ад месяцу (і раней):',
'year' => 'Ад году (і раней):',
'monthsall' => 'усе',
'limitall' => 'усе',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Пацвердзіць адрас эл.пошты',
'confirmemail_noemail' => 'У [[Special:Preferences|вашых настаўленнях]] няма дапушчальнага адрасу эл.пошты.',
'confirmemail_text' => 'На пляцоўцы {{SITENAME}} патрабуецца праверка адрасу эл.пошты перад тым, як карыстацца магчымасцямі эл.пошты. Націсніце кнопку, што ніжэй, каб адаслаць сабе пацвярджальны ліст. У лісце будзе спасылка на спецыяльную пацвярджальную старонку, якую трэба будзе адкрыць у браўзеры, каб пацвердзіць правільнасць свайго адрасу эл.пошты.',
'tags-description-header' => 'Поўнае апісанне значэння',
'tags-hitcount-header' => 'Пазначаных правак',
'tags-edit' => 'правіць',
-'tags-hitcount' => '$1 {{PLURAL:$1|мена|менаў}}',
+'tags-hitcount' => '$1 {{PLURAL:$1|змена|зменÑ\8b|зменаў}}',
# Special:ComparePages
'comparepages' => 'Параўнанне старонак',
'loginlanguagelabel' => 'Мова: $1',
'suspicious-userlogout' => 'Ваш запыт на выхад з сыстэмы быў адхілены, таму што выглядае, што ён быў дасланы пашкоджаным браўзэрам альбо кэшаваным проксі-сэрвэрам.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Узьнікла невядомая памылка ў функцыі PHP mail()',
'user-mail-no-addy' => 'Спроба даслаць электронны ліст без адрасу дастаўкі',
'user-mail-no-body' => 'Спроба даслаць ліст з пустым або надзвычай кароткім зьместам.',
'undo-success' => 'Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.',
'undo-failure' => 'Рэдагаваньне ня можа быць скасаванае праз канфлікт паміж папярэднімі рэдагаваньнямі.',
'undo-norev' => 'Рэдагаваньне ня можа быць адмененае, таму што яно не існуе альбо было выдаленае.',
-'undo-summary' => 'Скасаваньне праўкі $1 удзельніка [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])',
+'undo-summary' => 'Скасаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])',
# Account creation failure
'cantcreateaccounttitle' => 'Немагчыма стварыць рахунак',
'qbsettings-none' => 'Не паказваць',
'qbsettings-fixedleft' => 'Замацаваная зьлева',
'qbsettings-fixedright' => 'Замацаваная справа',
-'qbsettings-floatingleft' => 'Ð Ñ\83Ñ\85омаÑ\8f зьлева',
+'qbsettings-floatingleft' => 'Ð\9fлавае зьлева',
'qbsettings-floatingright' => 'Плавае справа',
'qbsettings-directionality' => 'Замацаваная, у залежнасьці ад накірунку напісаньня ў Вашай мове',
'prefs-displaywatchlist' => 'Налады паказу',
'prefs-diffs' => 'Розьніцы вэрсіяў',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Выглядае слушна',
'email-address-validity-invalid' => 'Неабходны слушны адрас!',
'action-userrights' => 'рэдагаваньне правоў усіх удзельнікаў',
'action-userrights-interwiki' => 'рэдагаваньне правоў удзельнікаў у іншых вікі',
'action-siteadmin' => 'блякаваньне і разблякаваньне базы зьвестак',
-'action-sendemail' => 'адпÑ\80аÑ\9eкÑ\83 Ñ\8dлекÑ\82Ñ\80оннÑ\8bÑ\85 лÑ\96Ñ\81Ñ\82оÑ\9e іншым удзельнікам',
+'action-sendemail' => 'адпÑ\80аÑ\9eлÑ\8fÑ\86Ñ\8c лÑ\96Ñ\81Ñ\82Ñ\8b іншым удзельнікам',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
'largefileserver' => 'Памер гэтага файла перавышае максымальна дазволены.',
'emptyfile' => 'Загружаны файл, здаецца, пусты. Магчыма гэты адбылося з-за памылкі ў назьве файла.
Удакладніце, ці Вы сапраўды жадаеце загрузіць гэты файл.',
-'windows-nonascii-filename' => '{{SITENAME}} не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.',
-'fileexists' => 'Файл з такой назвай ужо існуе.
-Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць.
-[[$1|thumb]]',
+'windows-nonascii-filename' => 'Гэтая вікі не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.',
+'fileexists' => 'Файл з такой назвай ужо існуе. Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць. [[$1|thumb]]',
'filepageexists' => 'Старонка апісаньня для гэтага файла ўжо існуе як <strong>[[:$1]]</strong>, але файла з такой назвай няма.
Апісаньне якое Вы дадалі ня зьявіцца на старонцы апісаньня.
Каб яно там зьявілася, Вам трэба рэдагаваць яе самастойна.
Замест гэтага, яны павінны спасылацца на пэўныя старонкі.<br />
Старонка лічыцца шматзначнай, калі яна ўтрымлівае шаблён назва якога знаходзіцца на старонцы [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Старонкі з уласьцівасьцямі старонак',
+'pageswithprop-legend' => 'Старонкі з уласьцівасьцямі старонак',
+'pageswithprop-text' => 'На гэтай старонцы адлюстроўваюцца старонкі, якія ўжываюць пэўныя ўласьцівасьці старонак',
+'pageswithprop-prop' => 'Імя ўласьцівасьці:',
+'pageswithprop-submit' => 'Паказаць',
+
'doubleredirects' => 'Двайныя перанакіраваньні',
'doubleredirectstext' => 'На гэтай старонцы пададзены сьпіс перанакіраваньняў на іншыя перанакіраваньні. Кожны радок утрымлівае спасылкі на першае і другое перанакіраваньне, а таксама мэтавую старонку другога перанакіраваньня, якая звычайна зьяўляецца «сапраўднай» мэтавай старонкай, куды павіннае спасылацца першае перанакіраваньне.
<del>Закрэсьленыя</del> элемэнты былі выпраўленыя.',
'listusers-editsonly' => 'Паказаць толькі ўдзельнікаў, якія маюць рэдагаваньні',
'listusers-creationsort' => 'Адсартаваць па даце стварэньня',
'usereditcount' => '$1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}',
-'usercreated' => '{{GENDER:$3|}}Створаны $1 у $2',
+'usercreated' => '{{GENDER:$3|Створаны|Створаная}} $1 у $2',
'newpages' => 'Новыя старонкі',
-'newpages-username' => 'Імя ўдзельніка/ўдзельніцы:',
+'newpages-username' => 'Імя ўдзельніка:',
'ancientpages' => 'Найстарэйшыя старонкі',
'move' => 'Перанесьці',
'movethispage' => 'Перанесьці гэтую старонку',
'listgrouprights-addgroup-self-all' => 'Можа дадаць уласны рахунак да ўсіх груп',
'listgrouprights-removegroup-self-all' => 'Можа выдаліць уласны рахунак з ўсіх груп',
-# E-mail user
+# Email user
'mailnologin' => 'Няма адрасу атрымальніка',
'mailnologintext' => 'Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.',
'emailuser' => 'Даслаць ліст',
'emailccsubject' => 'Копія Вашага ліста да $1: $2',
'emailsent' => 'Ліст адасланы',
'emailsenttext' => 'Ваш ліст быў адасланы.',
-'emailuserfooter' => 'Гэты ліст быў дасланы ўдзельнікам $1 да ўдзельніка $2 з дапамогай функцыі «Даслаць ліст» праекту {{SITENAME}}.',
+'emailuserfooter' => 'Гэты ліст быў дасланы ўдзельнікам $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «Даслаць ліст» {{GRAMMAR:родны|{{SITENAME}}}}.',
# User Messenger
'usermessage-summary' => 'Паведамленьне пра выхад з сыстэмы.',
'monthsall' => 'усе',
'limitall' => 'усе',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Пацьвердзіць адрас электроннай пошты',
'confirmemail_noemail' => 'Вы не пазначылі слушны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах удзельніка]].',
'confirmemail_text' => '{{SITENAME}} патрабуе, каб Вы пацьвердзілі Ваш адрас электроннай пошты перад ўжываньнем магчымасьцяў электроннай пошты. Актывізуйце кнопку ніжэй, каб даслаць ліст з пацьверджаньнем на Ваш адрас. Ліст будзе ўтрымліваць спасылку з кодам; загрузіце спасылку ў Вашым браўзэры, каб пацьвердзіць, што Ваш адрас электроннай пошты зьяўляецца слушным.',
'sqlite-no-fts' => '$1 без падтрымкі поўнатэкстнага пошуку',
# New logging system
-'logentry-delete-delete' => '$1 выдаліў старонку $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3',
'logentry-delete-restore' => '$1 аднавіў старонку $3',
'logentry-delete-event' => '$1 зьмяніў бачнасьць $5 {{PLURAL:$5|падзеі ў журнале|падзеяў у журнале|падзеяў у журнале}} на $3: $4',
'logentry-delete-revision' => '$1 зьмяніў бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў|вэрсіяў}} старонкі $3: $4',
'revdelete-uname-unhid' => 'імя ўдзельніка адкрытае',
'revdelete-restricted' => 'ужыць абмежаваньні для адміністратараў',
'revdelete-unrestricted' => 'зьнятыя абмежаваньні для адміністратараў',
-'logentry-move-move' => '$1 перанёс старонку $3 у $4',
+'logentry-move-move' => '$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4',
'logentry-move-move-noredirect' => '$1 перанёс старонку $3 у $4 без пакінутага перанакіраваньня',
'logentry-move-move_redir' => '$1 перанёс старонку $3 у $4 паўзьверх перанакіраваньня',
'logentry-move-move_redir-noredirect' => '$1 перанёс старонку $3 у $4 паўзьверх перанакіраваньня без пакінутага перанакіраваньня',
'duration-centuries' => '$1 {{PLURAL:$1|стагодзьдзе|стагодзьдзі|стагодзьдзяў}}',
'duration-millennia' => '$1 {{PLURAL:$1|тысячагодзьдзе|тысячагодзьдзі|тысячагодзьдзяў}}',
+# Image rotation
+'rotate-comment' => 'Выява павернутая на $1{{PLURAL:$1|°}} па гадзіньнікавай стрэлцы',
+
);
'gotaccount' => "Имате ли вече сметка? '''$1'''.",
'gotaccountlink' => 'Влизане',
'userlogin-resetlink' => 'Забравени данни за влизане в системата?',
-'createaccountmail' => 'с писмо по електронната поща',
+'createaccountmail' => 'Използване на временна парола, която се изпраща по електронната поща, посочена по-долу',
'createaccountreason' => 'Причина:',
'badretype' => 'Въведените пароли не съвпадат.',
'userexists' => 'Въведеното потребителско име вече се използва.
'loginlanguagelabel' => 'Език: $1',
'suspicious-userlogout' => 'Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Неизвестна грешка в mail() функцията на PHP',
'user-mail-no-addy' => 'Опитвате се да изпратите е-писмо без да е посочен адрес за електронна поща.',
'userinvalidcssjstitle' => "'''Внимание:''' Не съществува облик „$1“. Необходимо е да се знае, че имената на потребителските ви страници за CSS и Джаваскрипт трябва да се състоят от малки букви, например: „{{ns:user}}:Иван/vector.css“ (а не „{{ns:user}}:Иван/Vector.css“).",
'updated' => '(обновена)',
'note' => "'''Забележка:'''",
-'previewnote' => "'''Това е само предварителен преглед. Промените все още не са съхранени!'''",
-'continue-editing' => 'Ð\9fÑ\80одÑ\8aлжаване на Ñ\80едакÑ\82иÑ\80анеÑ\82о',
+'previewnote' => "'''Ð\92ажно е да Ñ\81е помни, Ñ\87е Ñ\82ова е само предварителен преглед. Промените все още не са съхранени!'''",
+'continue-editing' => 'Ð\9fÑ\80одÑ\8aлжаване кÑ\8aм полеÑ\82о за Ñ\80едакÑ\82иÑ\80ане',
'previewconflict' => 'Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.',
'session_fail_preview' => "'''За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия. Опитайте отново. Ако все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново.'''",
'session_fail_preview_html' => "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''
'editundo' => 'връщане',
'diff-multi' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от {{PLURAL:$2|един потребител|$2 потребителя}}.)',
'diff-multi-manyusers' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от $2 {{PLURAL:$2|потребител|потребителя}})',
+'difference-missing-revision' => '{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).
+
+Това обикновено се случва, когато е последвана остаряларазликова препратка на страница,коятоебила изтрита.
+Повече подробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].',
# Search results
'searchresults' => 'Резултати от търсенето',
'search-interwiki-default' => '$1 резултата:',
'search-interwiki-more' => '(още)',
'search-relatedarticle' => 'Свързани',
-'mwsuggest-disable' => 'Изключване на AJAX предположенията',
+'mwsuggest-disable' => 'Изключване на предположенията при търсене',
'searcheverything-enable' => 'Търсене във всички именни пространства',
'searchrelated' => 'свързани',
'searchall' => 'всички',
'prefs-displaywatchlist' => 'Видими настройки',
'prefs-diffs' => 'Разлики',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Адресът за е-поща изглежда валиден',
'email-address-validity-invalid' => 'Въведете валиден адрес за е-поща',
'backend-fail-writetemp' => 'Грешка при записването във временния файл.',
'backend-fail-closetemp' => 'Не може да бъде затворен временният файл.',
'backend-fail-read' => 'Файлът $1 не може да бъде прочетен.',
-'backend-fail-create' => 'Файлът $1 не може да бъде създаден.',
+'backend-fail-create' => 'Файлът „$1“ не може да бъде съхранен.',
+'backend-fail-maxsize' => 'Файлът „$1“ не може да бъде съхранен, тъй като размерът му надвишава {{PLURAL:$2|един байт|$2 байт}}.',
# ZipDirectoryReader
'zip-file-open-error' => 'Възникна грешка при отваряне на файла за проверка на ZIP.',
# Special:ActiveUsers
'activeusers' => 'Списък на активните потребители',
'activeusers-intro' => 'Това е списък на потребителите, които са демонстрирали някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|редакция|редакции}} за {{PLURAL:$3|последния ден|последните $3 дни}}',
+'activeusers-count' => '$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}',
'activeusers-from' => 'Показване на потребителите, започвайки от:',
'activeusers-hidebots' => 'Скриване на ботовете',
'activeusers-hidesysops' => 'Скриване на администраторите',
'listgrouprights-addgroup-self-all' => 'Може да добавя всички групи към своята сметка',
'listgrouprights-removegroup-self-all' => 'Може да премахва всички групи от собствената сметка',
-# E-mail user
+# Email user
'mailnologin' => 'Няма електронна поща',
'mailnologintext' => 'Необходимо е да [[Special:UserLogin|влезете]] и да посочите валидна електронна поща в [[Special:Preferences|настройките]] си, за да може да пращате писма на други потребители.',
'emailuser' => 'Писмо до потребителя',
'emailpage' => 'Пращане писмо на потребител',
-'emailpagetext' => 'Можете да използвате формуляра по-долу, за да изпратите електронно писмо на този потребител.
-Адресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори.',
+'emailpagetext' => 'Можете да използвате формуляра по-долу, за да изпратите електронно писмо на {{GENDER:$1|този потребител}}.
+Адресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори директно.',
'usermailererror' => 'Пощенският обект даде грешка:',
'defemailsubject' => 'Писмо от потребител $1 в {{SITENAME}}',
'usermaildisabled' => 'Потребителят не е разрешил да получава електронна поща',
'usermessage-editor' => 'Системни съобщения',
# Watchlist
-'watchlist' => 'Ð\9cоÑ\8fÑ\82 Ñ\81писък за наблюдение',
-'mywatchlist' => 'Ð\9cоÑ\8fÑ\82 Ñ\81писък за наблюдение',
+'watchlist' => 'Списък за наблюдение',
+'mywatchlist' => 'Списък за наблюдение',
'watchlistfor2' => 'За $1 $2',
'nowatchlist' => 'Списъкът ви за наблюдение е празен.',
'watchlistanontext' => 'За преглеждане и редактиране на списъка за наблюдение се изисква $1 в системата.',
'prot_1movedto2' => '„[[$1]]“ преместена като „[[$2]]“',
'protect-badnamespace-title' => 'Незащитимо именно пространство',
'protect-badnamespace-text' => 'Страниците в това именно пространство не могат да бъдат защитени.',
+'protect-norestrictiontypes-title' => 'Незащитима страница',
'protect-legend' => 'Потвърждение на защитата',
'protectcomment' => 'Причина:',
'protectexpiry' => 'Изтича на:',
'thumbnail_error' => 'Грешка при създаване на миникартинка: $1',
'djvu_page_error' => 'Номерът на DjVu-страницата е извън обхвата',
'djvu_no_xml' => 'Не е възможно вземането на XML за DjVu-файла',
+'thumbnail-temp-create' => 'Временния файл с миникартинка не може да бъде създаден.',
'thumbnail_invalid_params' => 'Параметрите за миникартинка са невалидни',
'thumbnail_dest_directory' => 'Целевата директория не може да бъде създадена',
'thumbnail_image-type' => 'Типът картинка не се поддържа',
# JavaScriptTest
'javascripttest-pagetext-noframework' => 'Тази страница е запазена за изпълнение на Джаваскрипт тестове.',
+'javascripttest-pagetext-skins' => 'Избор на облик за тестванията:',
'javascripttest-qunit-intro' => 'Вижте [$1 тестовата документация] на mediawiki.org.',
# Tooltip help for the actions
'pageinfo-article-id' => 'Номер на страницата',
'pageinfo-views' => 'Брой прегледи',
'pageinfo-watchers' => 'Брой наблюдаващи страницата',
+'pageinfo-few-watchers' => 'Под $1 {{PLURAL:$1|наблюдаващ|наблюдаващи}}',
'pageinfo-redirects-name' => 'Пренасочвания към тази страница',
'pageinfo-subpages-name' => 'Подстраници на тази страница',
+'pageinfo-firsttime' => 'Дата на създаване на страницата',
'pageinfo-lastuser' => 'Последeн редактор',
'pageinfo-lasttime' => 'Дата на последнoто редактиране',
'pageinfo-edits' => 'Общ брой редакции',
'pageinfo-authors' => 'Общ брой на отделните автори',
+'pageinfo-recent-edits' => 'Скорошен брой редакции (в рамките на $1)',
'pageinfo-magic-words' => '{{PLURAL:$1|Вълшебна думичка|Вълшебни думички}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрита категория|Скрити категории}} ($1)',
'pageinfo-toolboxlink' => 'Информация за страницата',
'pageinfo-contentpage-yes' => 'Да',
'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-category-pages' => 'Брой страници',
+'pageinfo-category-subcats' => 'Брой подкатегории',
+'pageinfo-category-files' => 'Брой файлове',
# Skin names
'skinname-standard' => 'Класика',
'file-info-size-pages' => '$1 × $2 пиксела, размер на файла: $3, MIME тип: $4, $5 {{PLURAL:$5|страница|страници}}',
'file-nohires' => 'Не е налична версия с по-висока разделителна способност.',
'svg-long-desc' => 'Файл във формат SVG, основен размер: $1 × $2 пиксела, големина на файла: $3',
+'svg-long-desc-animated' => 'Анимиран SVG файл, основен размер $1 × $2 пиксела, големина на файла: $3',
'svg-long-error' => 'Невалиден SVG файл: $1',
'show-big-image' => 'Пълна разделителна способност',
'show-big-image-preview' => 'Размер на този преглед: $1.',
'file-info-png-looped' => 'зациклен',
'file-info-png-repeat' => 'изпълнено $1 {{PLURAL:$1|път|пъти}}',
'file-info-png-frames' => '$1 {{PLURAL:$1|кадър|кадъра}}',
+'file-no-thumb-animation' => "'''Забележка: По технически причини миниатюрите на този файл няма да бъдат анимирани.'''",
+'file-no-thumb-animation-gif' => "'''Забележка: По технически причини миниатюрите на GIF файловете с висока резолюция като този няма да бъдат анимирани.'''",
# Special:NewFiles
'newimages' => 'Галерия на новите файлове',
'exif-gpsdifferential' => 'Диференциална корекция на GPS',
'exif-jpegfilecomment' => 'Kоментар на JPEG файл',
'exif-keywords' => 'Ключови думи',
+'exif-worldregioncreated' => 'Регион на света, където е направена снимката',
+'exif-countrycreated' => 'Държава, в която е направена снимката',
+'exif-countrycodecreated' => 'Код на държавата, където е направена снимката',
+'exif-provinceorstatecreated' => 'Област или щат, където е направена снимката',
+'exif-citycreated' => 'Град, в който е направена снимката',
'exif-objectname' => 'Кратко заглавие',
'exif-specialinstructions' => 'Специални инструкции',
+'exif-source' => 'Източник',
'exif-contact' => 'Информация за контакти',
'exif-languagecode' => 'Език',
'exif-iimversion' => 'IIM версия',
'monthsall' => 'всички',
'limitall' => 'всички',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Потвърждаване на адрес за електронна поща',
'confirmemail_noemail' => 'Не сте посочили валиден адрес за електронна поща в [[Special:Preferences|настройки си]].',
'confirmemail_text' => '{{SITENAME}} изисква да потвърдите адреса си за електронна поща преди да използвате възможностите за е-поща. Натиснете долния бутон, за да ви бъде изпратено писмо, съдържащо специално генерирана препратка, чрез която ще можете да потвърдите валидността на адреса си.',
'version-license' => 'Лиценз',
'version-poweredby-credits' => "Това уики се задвиждва от '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'други',
+'version-credits-summary' => 'Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.
MediaWiki се разпространява с надеждата, че ще бъде полезен, но БЕЗ НИКАКВИ ГАРАНЦИИ, без дори косвена гаранция за ПРОДАВАЕМОСТ или ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА. Вижте GNU General Public License за повече подробности.
'logentry-newusers-newusers' => 'Потребителската сметка $1 беше създадена',
'logentry-newusers-create' => 'Потребителската сметка $1 беше създадена',
'logentry-newusers-create2' => '$1 създаде потребителска сметка $3',
+'logentry-newusers-byemail' => '$1 създаде потребителската сметка $3, паролата беше изпратена по електронна поща',
'logentry-newusers-autocreate' => 'Сметката $1 беше създадена автоматично',
+'logentry-rights-rights' => '$1 промени потребителската група на $3 от $4 на $5',
+'logentry-rights-rights-legacy' => '$1 промени потребителската група на $3',
'logentry-rights-autopromote' => '
$1 е автоматично повишен от $4 до $5',
'rightsnone' => '(никакви)',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|श्रेणी|श्रेणी}}',
+'hidden-categories' => '{{PLURAL:$1|छुपावल गईल श्रेणी|छुपावल गईल श्रेणी}}',
'about' => 'बारे में',
'article' => 'सामग्री पन्ना',
'vector-view-history' => 'इतिहास देखीं',
'vector-view-view' => 'पढ़ीं',
'vector-view-viewsource' => 'स्त्रोत देखीं',
+'actions' => 'क्रिया',
+'namespaces' => 'नामस्थान',
+'variants' => 'संस्करण',
'errorpagetitle' => 'त्रुटी',
'returnto' => 'जाईं $1 पर।',
'yourname' => 'प्रयोगकर्ता नाम',
'yourpassword' => 'गुप्त शब्द',
'yourpasswordagain' => 'गुप्त-शब्द पुन:डालीं:',
+'remembermypassword' => 'इ ब्राउजर पर हमार प्रवेश जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})',
'login' => 'खाता में प्रवेश',
'nav-login-createaccount' => 'खाता प्रवेश / खाता बनाईं',
'loginprompt' => '{{SITENAME}} में प्रवेश खातिर राउर कुकिज चालू होवे के चाहीं',
'italic_sample' => 'इटालिक पाठ्य',
'italic_tip' => 'इटालिक पाठ्य',
'headline_sample' => 'शिर्षक पाठ्य',
+'headline_tip' => 'द्वितीय-श्रेणी के शीर्षक',
'image_sample' => 'उदाहरण.jpg',
'media_sample' => 'उदाहरण.ogg',
'media_tip' => 'फाईल लिंक',
'newarticletext' => "रउआ एगो अइसन लिंक के पन्ना के अनुसरण कइले बानी जउन अभी तक उपलब्ध नइखे।
पन्ना बनावे खातिर, नीचे के बाकस में टाईप करे के शुरु करीं (ज्यादा जानकारी खातिर देखीं [[{{MediaWiki:Helppage}}|मदद पन्ना]])।
यदि रउआ अहिजा गलती से आ गईल बानी त, आपन ब्राउजर के '''back''' (बैक) बटन दबाईं",
+'noarticletext' => 'ई पन्ना मे अभी कउनो सामग्री नईखे बा ।
+रउआ अन्य पन्ना में [[Special:Search/{{PAGENAME}}|ई शीर्षक के खोज]] कर सकत बानीं',
'yourdiff' => 'अंतर',
'template-protected' => '(संरक्षित)',
+# Parser/template warnings
+'post-expand-template-inclusion-category' => 'अइसन पृष्ठ जे पर साँचा जोडे के सीमा पार हो गइल बा',
+
# History pages
'revisionasof' => '$1 के रुप में संशोधन',
'revision-info' => '$2 में से $1 के रुप में संशोधन',
'searchprofile-project-tooltip' => '$1 में खोजीं',
'searchprofile-images-tooltip' => 'फाईल खातिर खोज',
'searchprofile-everything-tooltip' => 'सभन सामग्री में खोजीं (वार्ता पन्ना सहित)',
+'searchprofile-advanced-tooltip' => 'विशेष नामस्थान में खोजीं',
'search-result-size' => '$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})',
'search-result-score' => 'प्रासंगिकता: $1%',
'search-redirect' => '(पुन: निर्देशण $1)',
'searchall' => 'सब',
'showingresults' => "नीचे देखावल जा रहल बा {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
'showingresultsnum' => "नीचे देखावल जा रहल बा {{PLURAL:$3|'''1''' परिणाम|'''$3''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
+'search-nonefound' => 'राउर खोज मे से मेल खात कउनो परिणाम नईखे बा',
'powersearch' => 'उन्नत खोज',
'powersearch-legend' => 'उन्नत खोज',
'powersearch-ns' => 'सन्दर्भ में खोजीं',
# Recent changes
'recentchanges' => 'तुरंत भईल परिवर्तन',
+'recentchanges-legend' => 'हाल के परिवर्तन संबंधी विकल्प',
+'recentchanges-label-newpage' => 'ई सम्पादन से एगो नवका पृष्ठ तैयार हो गइल बा',
+'recentchanges-label-minor' => 'ई एगो छोटा सम्पाद बा',
'rcshowhideminor' => '$1 छोट सम्पादन',
'diff' => 'अन्तर',
'hist' => 'इति',
'upload' => 'फाईल लादीं',
# File description page
+'file-anchor-link' => 'फ़ाइल',
'filehist' => 'पन्ना के इतिहास',
'filehist-deleteall' => 'सब मिटाईं',
'filehist-deleteone' => 'मिटाईं',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|बाईट|बाईट्स}}',
+'newpages' => 'नवका पन्ना',
'move' => 'स्थान्तरण',
'movethispage' => 'ई पन्ना के स्थांतरण करीं',
'booksources' => 'किताबी स्त्रोत',
# Special:AllPages
+'alphaindexline' => '$1 से $2',
+'allarticles' => 'सभी पन्ना',
'allpagessubmit' => 'जाईं',
'allpagesprefix' => 'उपसर्ग के साथे पन्ना प्रदर्शन:',
-# E-mail user
+# Email user
'emailuser' => 'ई प्रयोगकर्ता के ईमेल करीं',
# Watchlist
'created' => 'बनावल गईल',
+# Rollback
+'rollbacklink' => 'वापिस लीं',
+
# Undelete
'undeletelink' => 'देखीं/बहाल करीं',
'movepagebtn' => 'पन्ना स्थांतरण करीं',
'revertmove' => 'पिछलका स्थिति',
+# Export
+'export' => 'पन्ना निर्यात करीं',
+
# Thumbnails
'thumbnail-more' => 'बढ़ाईं',
'filemissing' => 'फाईल गायब',
'tooltip-pt-userpage' => 'राउर प्रयोगकर्ता पन्ना',
'tooltip-pt-mytalk' => 'राउर वार्ता पन्ना',
'tooltip-pt-preferences' => 'राउर पसन्द',
+'tooltip-pt-watchlist' => 'राउर ध्यान दियल पन्ना के सूची',
'tooltip-pt-mycontris' => 'राउर योगदान के सूची',
'tooltip-pt-login' => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाकि ई अनिवार्य नईखे',
'tooltip-pt-anonlogin' => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाँकि ई अनिवार्य नईखे',
'tooltip-n-help' => 'जगह पता लगावे खातिर',
'tooltip-t-whatlinkshere' => 'अहिजा लिंक होखे वाला सब विकि पन्ना के सूची',
'tooltip-t-recentchangeslinked' => 'ई पन्ना से जुड़ल पन्नवन पर तुरंत भईल परिवर्तन',
+'tooltip-feed-atom' => 'ई पन्ना खातिर अणु फ़ीड',
'tooltip-t-upload' => 'फाईल लादीं (अपलोड )',
'tooltip-t-specialpages' => 'ख़ाश पन्नवन के सूची',
'tooltip-t-print' => 'ई पन्ना के छापे लायक संस्करण।',
'tooltip-t-permalink' => 'ई पन्ना के संसोधन खातिर स्थायी लिंक।',
'tooltip-ca-nstab-main' => 'सामग्री पन्ना देखीं',
'tooltip-ca-nstab-special' => 'ई एगो ख़ाश पन्ना ह, रउआ ई पन्ना के सम्पादन नईखीं कर सकत',
+'tooltip-ca-nstab-image' => 'संचिका के पन्ना देखीं',
+'tooltip-ca-nstab-template' => 'टेम्प्लेट देखीं',
+'tooltip-ca-nstab-category' => 'श्रेणी के पन्ना देखीं',
'tooltip-save' => 'आपन बदलाव के सुरक्षित करीं',
+'tooltip-preview' => 'आपन द्वारा कियल गइल बदलाव के देखीं, संजोये से पहले ईका इस्तेमाल करीं!',
+'tooltip-rollback' => '"वापिस लीं" ई पन्ना के पिछ्ला योगदाता के बदलाव एकही चटके मे गायब कर देवेला',
+'tooltip-summary' => 'एगो संक्षिप्त सारांश दर्ज करीं',
# Media information
'file-nohires' => ' उच्च गुणवत्ता उपलब्ध नईखे।',
'monthsall' => 'सब',
'limitall' => 'सब',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'इ-मेल पता कन्फर्म करीं',
# Special:SpecialPages
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Rummad |Rummad }}',
'category_header' => 'Niver a bennadoù er rummad "$1"',
-'subcategories' => 'Isrummad',
+'subcategories' => 'Isrummadoù',
'category-media-header' => 'Restroù liesvedia er rummad "$1"',
'category-empty' => "''N'eus na pajenn na media ebet er rummad-mañ evit ar mare.''",
'hidden-categories' => '{{PLURAL:$1|Rummad kuzhet|Rummad kuzhet}}',
'newwindow' => '(digeriñ en ur prenestr nevez)',
'cancel' => 'Nullañ',
'moredotdotdot' => "Ha muioc'h c'hoazh...",
+'morenotlisted' => "Ha muioc'h c'hoazh n'int ket rollet...",
'mypage' => 'Ma zammig pajenn',
'mytalk' => "Ma c'haozeadennoù",
'anontalk' => "Kaozeal gant ar chomlec'h IP-mañ",
'youhavenewmessagesmulti' => "Kemennoù nevez zo ganeoc'h war $1",
'editsection' => 'kemmañ',
'editold' => 'kemmañ',
-'viewsourceold' => 'gwelet ar vammenn',
+'viewsourceold' => 'sellet ouzh tarzh an destenn',
'editlink' => 'kemmañ',
'viewsourcelink' => 'gwelet an tarzh',
'editsectionhint' => 'Kemmañ ar rann : $1',
Gallout a rit kenderc'hel da implijout {{SITENAME}} en un doare dizanv, pe <span class='plainlinks'>[$1 kevreañ en-dro]</span> gant an hevelep anv pe un anv all mar fell deoc'h.
Notit mat e c'hallo pajennoù zo kenderc'hel da vezañ diskwelet evel pa vefec'h kevreet c'hoazh, betek ma vo riñset krubuilh ho merdeer ganeoc'h.",
'welcomeuser' => 'Degemer mat $1 !',
+'welcomecreation-msg' => 'Krouet eo bet ho kont implijer.
+Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}}]].',
'yourname' => 'Anv implijer :',
'yourpassword' => 'Ger-tremen :',
'yourpasswordagain' => 'Skrivit ho ker-tremen en-dro',
'loginlanguagelabel' => 'Yezh : $1',
'suspicious-userlogout' => 'Distaolet eo bet ho koulenn digevreañ rak kaset e oa bet gant ur merdeer direizhet pe krubuilhadenn ur proksi, evit doare.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "Fazi dianav en arc'hwel postel () PHP",
'user-mail-no-addy' => "Klasket kas ur postel hep lakaat ur chomlec'h postel.",
'changeemail-oldemail' => "Chomlec'h postel a-vremañ :",
'changeemail-newemail' => "Chomlec'h postel nevez :",
'changeemail-none' => '(hini ebet)',
+'changeemail-password' => 'Ho ker-tremen war {{SITENAME}}:',
'changeemail-submit' => "Cheñch chomlec'h postel",
'changeemail-cancel' => 'Nullañ',
'converter-manual-rule-error' => 'Fazi dinodet er reolenn cheñch yezh dre zorn',
# "Undo" feature
-'undo-success' => "Gallout a reer disteurel ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
+'undo-success' => "Gallout a reer dizober ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
'undo-failure' => "N'eus ket bet tu da zisteuler ar c'hemm-mañ abalamour d'un tabut gant kemmoù degaset e-keit-se.",
'undo-norev' => "N'eus ket bet gallet degas ar c'hemmoù-mañ rak pe n'eus ket anezho pe int bet diverket.",
-'undo-summary' => 'Disteurel kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])',
+'undo-summary' => 'Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])',
# Account creation failure
'cantcreateaccounttitle' => 'Dibosupl krouiñ ar gont',
'search-interwiki-default' => "$1 disoc'h :",
'search-interwiki-more' => "(muioc'h)",
'search-relatedarticle' => "Disoc'hoù kar",
-'mwsuggest-disable' => 'Diweredekaat kinnigoù AJAX',
+'mwsuggest-disable' => "Diweredekaat ar c'hinnigoù klask",
'searcheverything-enable' => 'Klask en holl esaouennoù anv',
'searchrelated' => "disoc'hoù kar",
'searchall' => 'An holl',
'prefs-displaywatchlist' => 'Dibarzhioù diskwel',
'prefs-diffs' => "Diforc'hioù",
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => "Reizh eo ar chomlec'h postel war a seblant",
'email-address-validity-invalid' => "Ebarzhit ur chomlec'h postel reizh",
'rclinks' => "Diskouez an $1 kemm diwezhañ c'hoarvezet e-pad an $2 devezh diwezhañ<br />$3",
'diff' => "diforc'h",
'hist' => 'ist',
-'hide' => 'kuzhat',
+'hide' => 'Kuzhat',
'show' => 'Diskouez',
'minoreditletter' => 'D',
'newpageletter' => 'N',
'rc-old-title' => 'bet krouet da gentañ gant an anv "$1"',
# Recent changes linked
-'recentchangeslinked' => 'Heuliañ al liammoù',
-'recentchangeslinked-feed' => 'Heuliañ al liammoù',
-'recentchangeslinked-toolbox' => 'Heuliañ al liammoù',
+'recentchangeslinked' => 'Heuliañ ar pajennoù liammet',
+'recentchangeslinked-feed' => 'Heuliañ ar pajennoù liammet',
+'recentchangeslinked-toolbox' => 'Heuliañ ar pajennoù liammet',
'recentchangeslinked-title' => 'Kemmoù a denn da "$1"',
'recentchangeslinked-noresult' => 'Kemm ebet war ar pajennoù liammet e-pad an amzer spisaet.',
'recentchangeslinked-summary' => "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).
'backend-fail-notsame' => "Ur restr disheñvel zo e $1 c'hoazh.",
'backend-fail-invalidpath' => "$1 n'eo ket un hent stokañ reizh.",
'backend-fail-delete' => 'Dibosupl eo diverkañ ar restr $1.',
+'backend-fail-describe' => 'N\'eus ket bet gallet cheñch ar metaroadennoù evit ar restr "$1".',
'backend-fail-alreadyexists' => 'Ar restr "$1" zo anezhi c\'hoazh.',
'backend-fail-store' => 'Dibosupl stokañ ar restr $1 e $2.',
'backend-fail-copy' => 'Dibosupl eilañ ar restr "$1" war-du "$2".',
Padal e tlefent kas war-eeun d'an danvez anezho.<br />
Sellet e vez ouzh ur bajenn evel ouzh ur bajenn disheñvelout ma ra gant ur patrom liammet ouzh [[MediaWiki:Disambiguationspage]]",
+'pageswithprop-prop' => 'Anv ar perzh :',
+'pageswithprop-submit' => 'Mont',
+
'doubleredirects' => 'Adkasoù doubl',
'doubleredirectstext' => 'Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.
War bep linenn ez eus liammoù war-du pajennoù an adkas kentañ hag en eil adkas, hag ivez war-du pajenn-dal an eil adkas zo sañset bezañ ar pal "gwirion" a zlefe an adkas kentañ kas di.
'linksearch-ok' => 'Klask',
'linksearch-text' => 'Gallout a reer implijout arouezennoù "joker" evel, da skouer, "*.wikipedia.org".
Rekis eo dezho un domani a-us da nebeutañ evel, da skouer, "*.org".<br />
-Protokoloù skoret : <code>$1</code> (defaults to http:// na lakait hini ebet eus ar re-se en ho klask)',
+{{PLURAL:$2|Protokol|Protokoloù}} skoret : <code>$1</code> (defaults to http:// na lakait hini ebet eus ar re-se en ho klask).',
'linksearch-line' => '$1 gant ul liamm adal $2',
'linksearch-error' => "N'hall an arouezennoù joker bezañ implijet nemet e deroù anv domani an ostiz.",
# Special:ActiveUsers
'activeusers' => 'Roll an implijerien oberiant',
'activeusers-intro' => 'Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.',
-'activeusers-count' => '$1 {{PLURAL:$1|degasadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ',
+'activeusers-count' => '$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ',
'activeusers-from' => 'Diskouez an implijerien adal :',
'activeusers-hidebots' => 'Kuzhat ar robotoù',
'activeusers-hidesysops' => 'Kuzhat ar verourien',
'listgrouprights-addgroup-self-all' => 'Gallout a ra ouzhpennañ an holl strolladoù da gont an-unan',
'listgrouprights-removegroup-self-all' => 'Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.',
-# E-mail user
+# Email user
'mailnologin' => "Chomlec'h ebet",
'mailnologintext' => "Ret eo deoc'h bezañ [[Special:UserLogin|kevreet]]
ha bezañ merket ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù]]
a-benn gellout kemmañ ho roll evezhiañ.",
'addwatch' => "Ouzhpennañ d'ar roll evezhiañ",
'addedwatchtext' => 'Ouzh ho [[Special:Watchlist|rollad evezhiañ]] eo bet ouzhpennet ar bajenn "[[:$1]]".
-Kemmoù da zont ar bajenn-mañ ha re ar bajenn gaozeal stag outi a vo rollet amañ hag e teuio ar bajenn <b>e tev</b> er [[Special:RecentChanges|roll kemmoù diwezhañ]] evit bezañ gwelet aesoc\'h ganeoc\'h.
-
-Evit tennañ ar bajenn-mañ a-ziwar ho rollad evezhiañ, klikit war "Paouez da evezhiañ" er framm merdeiñ.',
+Amañ e vo rollet ar c\'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozeal stag outi.',
'removewatch' => 'Lemel a-ziwar ar roll evezhiañ',
'removedwatchtext' => 'Lamet eo bet ar bajenn "[[:$1]]" a-ziwar ho [[Special:Watchlist|roll evezhiañ]].',
'watch' => 'Evezhiañ',
'rollback' => "disteuler ar c'hemmoù",
'rollback_short' => 'Disteuler',
'rollbacklink' => 'disteuler',
-'rollbacklinkcount' => 'terriñ $1 {{PLURAL:$1|kemm|kemmañ}}',
-'rollbacklinkcount-morethan' => 'terriñ ouzhpenn $1 {{PLURAL:$1|kemm|kemmoù}}',
+'rollbacklinkcount' => 'disteurel $1 {{PLURAL:$1|kemm}}',
+'rollbacklinkcount-morethan' => 'disteurel ouzhpenn $1 {{PLURAL:$1|kemm}}',
'rollbackfailed' => "C'hwitet eo bet an distaoladenn",
'cantrollback' => 'Dibosupl da zisteuler: an aozer diwezhañ eo an hini nemetañ da vezañ kemmet ar pennad-mañ',
'alreadyrolled' => "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
Setu an doare a-vremañ evit ar bajenn-mañ '''$1''':",
'protect-cascadeon' => "Gwarezet eo ar bajenn-mañ peogwir he c'haver er {{PLURAL:$1|bajenn|pajennoù}} da-heul zo gweredekaet enno ar gwareziñ dre skalierad. Gallout a rit kemmañ al live gwareziñ met ne cheñcho ket ar gwareziñ dre skalierad.",
'protect-default' => 'Aotren an holl implijerien',
-'protect-fallback' => 'Ezhomm zo aotre "$1"',
-'protect-level-autoconfirmed' => "Stankañ an implijerien nevez hag ar re n'int ket enrollet",
+'protect-fallback' => 'Degemer hepken an implijerien gant an aotre "$1"',
+'protect-level-autoconfirmed' => 'Degemer hepken an implijerien emgadarnaet',
'protect-level-sysop' => 'Aotren ar verourien hepken',
'protect-summary-cascade' => 'Gwareziñ dre skalierad',
'protect-expiring' => "a zeu d'e dermen d'an $1",
** Emzalc'h hegazus/handeus betek re
** Mont re bell gant implij meur a gont
** Anv implijer n'eo ket aotreet",
-'ipb-hardblock' => "Mirout a ra ouzh an implijerien kevreet da zegas kemmoù adalek ar c'homlec'h IP-mañ",
+'ipb-hardblock' => "Mirout ouzh an implijerien kevreet da zegas kemmoù adalek ar chomlec'h IP-mañ",
'ipbcreateaccount' => 'Mirout ouzh an implijer da grouiñ kontoù',
'ipbemailban' => 'Mirout ouzh an implijer da gas posteloù',
'ipbenableautoblock' => "Stankañ war-eeun ar chomlec'h IP diwezhañ implijet gant an den-mañ hag an holl chomlec'hioù a c'hallfe klask kemmañ traoù drezo drezo diwezhatoc'h",
# Move page
'move-page' => "Dilec'hiañ $1",
'move-page-legend' => 'Adenvel ur pennad',
-'movepagetext' => "Grit gant ar furmskrid a-is evit adenvel ur pennad hag adkas an holl stummoù kent anezhañ war-du an anv nevez.
-Dont a raio an titl kentañ da vezañ ur bajenn adkas war-du an titl nevez.
+'movepagetext' => "Grit gant ar furmskrid a-is evit adenvel ur pennad hag adkas an holl stummoù kent anezhañ war-zu an anv nevez.
+Dont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.
+Gallout a rit nevesaat ent emgefre an adkasoù a-vremañ a gas d'an titl orin.
Ne vo ket kemmet liammoù an titl kozh ha ne vo ket dilec'hiet ar bajenn gaozeal, ma'z eus anezhi.
+Ma rit ho soñj chom hep en ober, gwiriit mat an holl [[Special:DoubleRedirects|adkasoù doubl]] pe [[Special:BrokenRedirects|adkasoù torret]].
+C'hwi eo zo karget da wiriañ e kas mat al liammoù d'al lec'h int sañset kas.
+
+Notit mat '''ne vo ket''' dilec'hiet ma'z eus dija ur bajenn ganti an anv nevez, nemet e vefe un adkas ha ne vefe tamm istor ebet stag outi.
+Dre se e c'haller adkas ur bajenn war-zu he lec'h orin ma oa kamm an adkas.
+
'''DIWALLIT!'''
Gallout a ra kement-se bezañ ur c'hemm bras ha dic'hortoz evit ur pennad a vez sellet outi alies;
bezit sur e komprenit mat an heuliadoù a-raok kenderc'hel ganti.",
'pageinfo-redirectsto-info' => 'Titouroù',
'pageinfo-contentpage-yes' => 'Ya',
'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-category-info' => 'Titouroù ar rummad',
+'pageinfo-category-pages' => 'Niver a bajennoù',
+'pageinfo-category-subcats' => 'Niver a isrummadoù',
+'pageinfo-category-files' => 'Niver a restroù',
# Skin names
'skinname-standard' => 'Standard',
'minutes' => '{{PLURAL:$1|$1 vunutenn|$1 munutenn}}',
'hours' => '{{PLURAL:$1|$1 eurvezh|$1 eurvezh}}',
'days' => '{{PLURAL:$1|$1 deiz|$1 deiz}}',
+'months' => '{{PLURAL: $1|$1 miz|$1 miz}}',
+'years' => '{{PLURAL: $1|$1 bloaz|$1 bloaz}}',
'ago' => '$1 zo',
+'just-now' => 'bremañ diouzhtu',
# Bad image list
'bad_image_list' => "Setu doare ar furmad :
'monthsall' => 'an holl',
'limitall' => 'An holl',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => "Kadarnaat ar chomlec'h postel",
'confirmemail_noemail' => "N'hoc'h eus ket spisaet chomlec'h postel mat ebet en ho [[Special:Preferences|penndibaboù implijer]].",
'confirmemail_text' => "Rankout a ra ar wiki-mañ bezañ gwiriet ho chomlec'h postel a-raok gallout implijout nep arc'hwel postel. Implijit ar bouton a-is evit kas ur postel kadarnaat d'ho chomlec'h. Ul liamm ennañ ur c'hod a vo er postel. Kargit al liamm-se en o merdeer evit kadarnaat ho chomlec'h.",
# Scary transclusion
'scarytranscludedisabled' => '[Diweredekaet eo an treuzkludañ etrewiki]',
'scarytranscludefailed' => "[N'eus ket bet gallet tapout ar patrom evit $1]",
+'scarytranscludefailed-httpstatus' => "[c'hwitet adtapout ar patrom evit $1: HTTP $2]",
'scarytranscludetoolong' => '[URL re hir]',
# Delete conflict
'logentry-newusers-create' => 'Krouet eo bet ar gont implijer $1',
'logentry-newusers-create2' => 'Gant $1 eo bet krouet ar gont implijer $3',
'logentry-newusers-autocreate' => 'Krouet eo bet kont $1 ent emgefre',
+'logentry-rights-autopromote' => '$1 zo bet anvet ent emgefre a $4 da $5',
'rightsnone' => '(netra)',
# Feedback
'api-error-ok-but-empty' => 'Fazi diabarzh : respont ebet a-berzh ar servijer.',
'api-error-overwrite' => "N'eo ket aotreet frikañ ur restr zo anezhi c'hoazh.",
'api-error-stashfailed' => "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
+'api-error-publishfailed' => "Fazi diabarzh : dibosupl d'ar servijer embann ar restr padennek.",
'api-error-timeout' => "N'eo ket bet ar servijer evit respont en termen lakaet.",
'api-error-unclassified' => "C'hoarvezet ez eus ur gudenn dianav.",
'api-error-unknown-code' => 'Fazi dianav : "$1"',
'ns-specialprotected' => 'Specijalne stranice se ne mogu uređivati.',
'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
Iz razloga "\'\'$2\'\'".',
+'invalidtitle-knownnamespace' => 'Neispravan naslov s imenskim prostorom "$2" i tekstom "$3"',
+'invalidtitle-unknownnamespace' => 'Neispravan naslov s imenskim prostorom br. $1 i tekstom "$2"',
'exception-nologin' => 'Niste prijavljeni',
'exception-nologin-text' => 'Ova stranica ili aktivnost zahtijeva da budete prijavljeni na ovom wikiju.',
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
'user-mail-no-addy' => 'Pokušaj slanja e-maila bez navedene e-mail adrese.',
'changeemail-oldemail' => 'Trenutna e-mail adresa:',
'changeemail-newemail' => 'Nova e-mail adresa:',
'changeemail-none' => '(ništa)',
+'changeemail-password' => 'Tvoja šifra/lozinka za {{SITENAME}}:',
'changeemail-submit' => 'Promijeni e-mail',
'changeemail-cancel' => 'Otkaži',
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.',
'noarticletext-nopermission' => 'Trenutno nema teksta na ovoj stranici.
Možete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>, ali nemate dozvolu da napravite ovu stranicu.',
+'missing-revision' => 'Uređivanje broj $1 na stranici "{{PAGENAME}}" ne postoji.
+
+Ovo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.
+Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].',
'userpage-userdoesnotexist' => 'Korisnički račun "<nowiki>$1</nowiki>" nije registrovan.
Molimo provjerite da li želite napraviti/izmijeniti ovu stranicu.',
'userpage-userdoesnotexist-view' => 'Korisnički račun "$1" nije registrovan.',
'expansion-depth-exceeded-warning' => 'Stranice koje su prekoračile dubinu proširenja',
'parser-unstrip-loop-warning' => 'Pronađena petlja',
'parser-unstrip-recursion-limit' => 'Prekoračeno ograničenje rekurzije ($1)',
+'converter-manual-rule-error' => 'Pronađena je greška u pravilu za ručno pretvaranje jezika',
# "Undo" feature
'undo-success' => 'Izmjena se može vratiti.
'youremail' => 'E-mail:',
'username' => '{{GENDER:$1|Korisničko}} ime:',
'uid' => '{{GENDER:$1|Korisnički}} ID:',
-'prefs-memberingroups' => 'Član {{PLURAL:$1|grupe|grupa}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:',
'prefs-registration' => 'Vrijeme registracije:',
'yourrealname' => 'Vaše pravo ime:',
'yourlanguage' => 'Jezik:',
'prefs-displaywatchlist' => 'Postavke izgleda',
'prefs-diffs' => 'Razlike',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Izgleda valjano',
'email-address-validity-invalid' => 'Neophodna valjana adresa!',
'backend-fail-store' => 'Ne može se spremiti datoteka $1 na $2.',
'backend-fail-copy' => 'Nije uspjelo kopiranje datoteke "$1" u "$2".',
'backend-fail-move' => 'Nije uspjelo premještanje datoteke "$1" u "$2".',
+'backend-fail-opentemp' => 'Ne mogu otvoriti privremenu datoteku.',
+'backend-fail-writetemp' => 'Ne mogu pisati u privremenu datoteku.',
+'backend-fail-closetemp' => 'Ne mogu zatvoriti privremenu datoteku.',
'backend-fail-read' => 'Ne mogu čitati datoteku $1.',
'backend-fail-create' => 'Ne mogu napraviti datoteku $1.',
+'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smjestim u "$1".',
# Lock manager
+'lockmanager-notlocked' => 'Ne mogu otključati "$1"; nije zaključan.',
+'lockmanager-fail-closelock' => 'Ne mogu zatvoriti "lock"-datoteku za "$1".',
+'lockmanager-fail-deletelock' => 'Ne mogu obrisati "lock"-datoteku za "$1".',
+'lockmanager-fail-acquirelock' => 'Ne mogu dobiti "lock"-datoteku za "$1".',
+'lockmanager-fail-openlock' => 'Ne mogu otvoriti "lock"-datoteku za "$1".',
+'lockmanager-fail-releaselock' => 'Ne mogu osloboditi katanac za „$1“.',
+'lockmanager-fail-db-bucket' => 'Ne mogu da kontaktiram s dovoljno "lock"-baza u kanti $1.',
+'lockmanager-fail-db-release' => 'Ne mogu osloboditi katance u bazi $1.',
'lockmanager-fail-svr-release' => 'Ne mogu se otključati katanci na serveru file $1.',
# ZipDirectoryReader
'uploadstash-badtoken' => 'Izvršavanje ove akcije je bilo neuspješno, možda zato što su vaša uređivačka odobrenja istekla. Pokušajte ponovo.',
'uploadstash-errclear' => 'Brisanje sakrivenih datoteka je bilo neuspješno.',
'uploadstash-refresh' => 'Osvježi spisak datoteka',
+'invalid-chunk-offset' => 'Neispravna polazna tačka',
# img_auth script messages
'img-auth-accessdenied' => 'Pristup onemogućen',
'uploadnewversion-linktext' => 'Postavite noviju verziju ove datoteke',
'shared-repo-from' => 'iz $1',
'shared-repo' => 'dijeljeni repozitorijum',
+'upload-disallowed-here' => 'Ne možete prepisati ovu datoteku.',
# File reversion
'filerevert' => 'Vrati $1',
'wantedpages' => 'Tražene stranice',
'wantedpages-badtitle' => 'Nevaljan naslov u setu rezultata: $1',
'wantedfiles' => 'Tražene datoteke',
+'wantedfiletext-cat' => 'Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze u [[:$1]].',
+'wantedfiletext-nocat' => 'Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska.',
'wantedtemplates' => 'Potrebni šabloni',
'mostlinked' => 'Članci sa najviše linkova',
'mostlinkedcategories' => 'Kategorije sa najviše linkova',
'listgrouprights-addgroup-self-all' => 'Može dodati sve grupe na svoj račun',
'listgrouprights-removegroup-self-all' => 'Može ukloniti sve grupe sa svog računa',
-# E-mail user
+# Email user
'mailnologin' => 'Nema adrese za slanje',
'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]]
i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]
'enotif_mailer' => '{{SITENAME}} obaviještenje o pošti',
'enotif_reset' => 'Označi sve strane kao posjećene',
'enotif_impersonal_salutation' => '{{SITENAME}} korisnik',
+'enotif_subject_deleted' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|obrisao|obrisala}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_created' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|napravio|napravila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_moved' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|premjestio|premjestila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_restored' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|vratio|vratila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_changed' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|promijenio|promijenila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_body_intro_deleted' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3.',
+'enotif_body_intro_created' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|napravio|napravila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.',
+'enotif_body_intro_moved' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|premjestio|premjestila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.',
+'enotif_body_intro_restored' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|vratio|vratila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.',
+'enotif_body_intro_changed' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|promijenio|promijenila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.',
'enotif_lastvisited' => 'Pogledajte $1 za sve izmjene od vaše posljednje posjete.',
'enotif_lastdiff' => 'Vidi $1 da pregledate ovu promjenu.',
'enotif_anon_editor' => 'anonimni korisnik $1',
'enotif_body' => 'Poštovani $WATCHINGUSERNAME,
-
-Stranica {{SITENAME}} sa naslovom $PAGETITLE je bila $CHANGEDORCREATED dana $PAGEEDITDATE od strane $PAGEEDITOR, pogledajte $PAGETITLE_URL za trenutnu reviziju.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Sažetak urednika: $PAGESUMMARY $PAGEMINOREDIT
Kontaktirajte urednika:
-mail: $PAGEEDITOR_EMAIL
+e-pošta: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Neće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu.
-Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.
+Neće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.
- Vaš prijateljski {{SITENAME}} sistem obavještavanja
+Vaš prijateljski {{SITENAME}} sistem obavještavanja
--
Za promjenu vaših postavki e-mail obavijesti, posjetite
'protect-title' => 'Zaštićuje se "$1"',
'protect-title-notallowed' => 'Pregled stepena zaštite za "$1"',
'prot_1movedto2' => 'članak [[$1]] premješten na [[$2]]',
+'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
+'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
'protect-legend' => 'Potvrdite zaštitu',
'protectcomment' => 'Razlog:',
'protectexpiry' => 'Ističe:',
'protect-default' => 'Dopusti svim korisnicima',
'protect-fallback' => 'Potrebno je imati "$1" ovlasti',
'protect-level-autoconfirmed' => 'Blokiraj nove i neregistrovane korisnike',
-'protect-level-sysop' => 'Samo administratori',
+'protect-level-sysop' => 'Dozvoli samo administratorima',
'protect-summary-cascade' => 'prenosna zaštita',
'protect-expiring' => 'ističe $1 (UTC)',
'protect-expiring-local' => 'ističe $1',
'blocklist-userblocks' => 'Sakrij blokade računa',
'blocklist-tempblocks' => 'Sakrij privremene blokade',
'blocklist-addressblocks' => 'Sakrij pojedinačne IP blokade',
+'blocklist-rangeblocks' => 'Sakrij blokiranja opsega',
'blocklist-timestamp' => 'Vremenska oznaka',
'blocklist-target' => 'Cilj',
'blocklist-expiry' => 'Ističe',
# Move page
'move-page' => 'Pomjeranje $1',
'move-page-legend' => 'Premjestite stranicu',
-'movepagetext' => "Korištenjem ovog formulara možete preusmjeriti članak
-zajedno sa stranicom za diskusiju tog članka.
+'movepagetext' => "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.
+Članak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom.
+Možete automatski izmjeniti preusmjerenje do izvornog naslova.
+Ako se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].
+Dužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.
-Članak pod starim imenom će postati stranica koja preusmjerava
-na članak pod novim imenom. Linkovi koji vode na članak sa
-starim imenom neće biti preusmjereni. Vaša je dužnost da se
-pobrinete da svi linkovi koji vode na članak sa starim imenom
-budu adekvatno preusmjereni (stranica posebne namjene za
-održavanje je korisna za obavještenje o [[Special:BrokenRedirects|mrtvim]] i [[Special:DoubleRedirects|duplim]] preusmjerenjima).
-
-Imajte na umu da članak '''neće''' biti preusmjeren ukoliko
-već postoji članak pod imenom na koje namjeravate da
-preusmjerite.
+Imajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.
+To znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.
'''Pažnja!'''
-Imajte na umu da preusmjeravanje popularnog članka može biti
-drastična i neočekivana promjena za korisnike.",
+Ovo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;
+Molimo dobro razmislite prije nego što preimenujete stranicu.",
'movepagetext-noredirectfixer' => "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.
Stari naziv će postati preusmjerenje na novi naziv.
Molimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].
'djvu_page_error' => 'DjVu stranica je van opsega',
'djvu_no_xml' => 'Za XML-datoteku se ne može pozvati DjVu datoteka',
'thumbnail-temp-create' => 'Ne mogu da napravim privremenu smanjenu sliku',
+'thumbnail-dest-create' => 'Ne mogu da sačuvam smanjenu sliku ("thumbnail") na destinaciju',
'thumbnail_invalid_params' => 'Pogrešne postavke smanjenog prikaza',
'thumbnail_dest_directory' => 'Ne može se napraviti odredišni folder',
'thumbnail_image-type' => 'Tip slike nije podržan',
'import-upload' => 'Postavljanje XML podataka',
'import-token-mismatch' => 'Izgubljeni podaci sesije. Molimo pokušajte ponovno.',
'import-invalid-interwiki' => 'Ne može se uvesti iz navedenog wikija.',
+'import-error-edit' => 'Stranica "$1" nije uvezena jer vam nije dopušteno da je uređujete.',
+'import-error-create' => 'Stranica "$1" nije uvezena jer vam nije dozvoljeno da je napravite.',
+'import-error-interwiki' => 'Stranica "$1" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (interwiki).',
+'import-error-special' => 'Stranica "$1" nije uvezena jer pripada posebnom imenskom prostoru koje ne prihvata stranice.',
+'import-error-invalid' => 'Stranica "$1" nije uvezena jer je njen naziv neispravan.',
'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
# Import log
'pageinfo-article-id' => 'ID stranice',
'pageinfo-language' => 'Jezik sadržaja stranice',
'pageinfo-views' => 'Broj pogleda',
-'pageinfo-watchers' => 'Broj onih koji pregledaju',
+'pageinfo-watchers' => 'Broj pratitelja stranice',
'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
'pageinfo-subpages-name' => 'Podstranice ove stranice',
'pageinfo-firstuser' => 'Korisnik koji je napravio stranicu',
'monthsall' => 'sve',
'limitall' => 'sve',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Potvrdite adresu e-pošte',
'confirmemail_noemail' => 'Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].',
'confirmemail_text' => 'Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. Aktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu. Pošta uključuje link koji sadrži kod; učitajte link u Vaš preglednik da bi ste potvrdili da je adresa Vaše e-pošte validna.',
'specialpages-group-highuse' => 'Najčešće korištene stranice',
'specialpages-group-pages' => 'Spiskovi stranica',
'specialpages-group-pagetools' => 'Alati stranice',
-'specialpages-group-wiki' => 'Wiki podaci i alati',
+'specialpages-group-wiki' => 'Podaci i alati',
'specialpages-group-redirects' => 'Preusmjeravanje posebnih stranica',
'specialpages-group-spam' => 'Alati za spam',
'compare-submit' => 'Usporedi',
'compare-invalid-title' => 'Naslov koji ste unijeli je nevaljan.',
'compare-title-not-exists' => 'Naslov koji ste naveli ne postoji.',
+'compare-revision-not-exists' => 'Izmjena koji ste naveli ne postoji.',
# Database error messages
'dberr-header' => 'Ovaj wiki ima problem',
# New logging system
'logentry-delete-delete' => '$1 je obrisao stranicu $3',
'logentry-delete-restore' => '$1 je vratio stranicu $3',
+'logentry-delete-event' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4',
+'logentry-delete-revision' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4',
+'logentry-delete-event-legacy' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost događaja u evidenciji na $3',
+'logentry-delete-revision-legacy' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost izmjena na stranici $3',
+'logentry-suppress-delete' => '$1 {{GENDER:|je potisnuo|je potisnula}} stranicu $3',
+'logentry-suppress-event' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4',
+'logentry-suppress-revision' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4',
+'logentry-suppress-event-legacy' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost događaja u evidenciji na $3',
+'logentry-suppress-revision-legacy' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost izmjena na stranici $3',
'revdelete-content-hid' => 'skriveni sadržaj',
'revdelete-summary-hid' => 'sažetak izmjene je sakriven',
'revdelete-uname-hid' => 'sažetak izmjene je sakriven',
'logentry-newusers-newusers' => 'Korisnički račun $1 je napravljen',
'logentry-newusers-create' => 'Korisnički račun $1 je napravljen',
'logentry-newusers-create2' => '$3 je {{GENDER:$2|napravio|napravila}} korisnički račun $1',
+'logentry-newusers-byemail' => 'Korisnički račun $3 je napravio $1 i lozinka/šifra je poslana putem e-maila',
'logentry-newusers-autocreate' => 'Korisnički račun $1 je automatski napravljen',
'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3 iz $4 u $5',
'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3',
'api-error-emptypage' => 'Stvaranje novih praznih stranica nije dozvoljeno.',
'api-error-fetchfileerror' => 'Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.',
'api-error-fileexists-forbidden' => 'Datoteka s imenom "$1" već postoji, i ne može biti zamijenjena.',
+'api-error-fileexists-shared-forbidden' => 'Datoteka s imenom "$1" već postoji u zajedničkom spremištu i ne može biti prepisana.',
'api-error-file-too-large' => 'Datoteka koju ste poslali je bila prevelika.',
'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
-'api-error-filetype-banned-type' => '$1 nije dopuštena vrsta datoteke. {{PLURAL:$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} $2.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|nije dopušteni vrsta datoteke|su nedopušteni vrste datoteke|su nedopušteni vrste datoteka}}. {{PLURAL:$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} $2.',
'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
'api-error-hookaborted' => 'Izmjena koji ste pokušali načiniti je obustavljena preko kuke proširenja.',
'api-error-http' => 'Unutrašnja greška: ne može se spojiti na server.',
'api-error-ok-but-empty' => 'Unutrašnja greška: nema odgovora od servera.',
'api-error-overwrite' => 'Pisanje preko postojeće datoteke nije dopušteno.',
'api-error-stashfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
+'api-error-publishfailed' => 'Unutrašnja greška: Server nije uspio objaviti privremenu datoteku.',
'api-error-timeout' => 'Server nije odgovorio unutar očekivanog vremena.',
'api-error-unclassified' => 'Desila se nepoznata greška',
'api-error-unknown-code' => 'Nepoznata greška: "$1"',
# Durations
'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
-'duration-minutes' => '$1 {{PLURAL:$1|minut|minuta|minuta}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minute|minuta}}',
'duration-hours' => '$1 {{PLURAL:$1|sat|sata|sati}}',
'duration-days' => '$1 {{PLURAL:$1|dan|dana}}',
'duration-weeks' => '$1 {{PLURAL:$1|sedmica|sedmice|sedmica}}',
'loginlanguagelabel' => 'Llengua: $1',
'suspicious-userlogout' => "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
'user-mail-no-addy' => "S'ha intentat enviar un missatge de correu electrònic sense adreça.",
'prefs-displaywatchlist' => 'Opcions de visualització',
'prefs-diffs' => 'Difs',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => "L'adreça de correu electrònic sembla vàlida",
'email-address-validity-invalid' => 'Escriviu una adreça vàlida de correu electrònic',
'userrights-lookup-user' => "Gestiona els grups d'usuari",
'userrights-user-editname' => "Introduïu un nom d'usuari:",
'editusergroup' => "Edita els grups d'usuaris",
-'editinguser' => "S'està canviant els permisos de l'usuari '''[[User:$1|$1]]''' $2",
+'editinguser' => "Modificació dels permisos de {{GENDER:$1|l’usuari|la usuària}} '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => "Edita els grups d'usuaris",
'saveusergroups' => "Desa els grups d'usuari",
'userrights-groupsmember' => 'Membre de:',
'userrights-groupsmember-auto' => 'Membre implícit de:',
-'userrights-groups-help' => "Podeu modificar els grups als quals pertany aquest usuari.
-* Els requadres marcats indiquen que l'usuari és dins del grup.
-* Els requadres sense marcar indiquen que l'usuari no hi pertany.
-* Un asterisc (*) indica que no el podreu treure del grup una vegada l'hàgiu afegit o viceversa.",
+'userrights-groups-help' => "Podeu modificar els grups als quals pertany {{GENDER:$1|aquest usuari|aquesta usuària}}.
+* Una casella marcada significa que {{GENDER:$1|l’usuari|la usuària}} pertany a aquest grup.
+* Una casella no marcada significa que {{GENDER:$1|l’usuari|la usuària}} no pertany a aquest grup.
+* Un asterisc (*) indica que no {{GENDER:$1|el|la}} podreu treure del grup una vegada l'hàgiu afegit o viceversa.",
'userrights-reason' => 'Motiu:',
'userrights-no-interwiki' => "No teniu permisos per a editar els permisos d'usuari d'altres wikis.",
'userrights-nodatabase' => 'La base de dades $1 no existeix o no és local.',
'listgrouprights-addgroup-self-all' => 'Afegir-se a qualsevol grup',
'listgrouprights-removegroup-self-all' => 'Abandona tots els grups',
-# E-mail user
+# Email user
'mailnologin' => "No enviïs l'adreça",
'mailnologintext' => "Heu d'haver [[Special:UserLogin|entrat]]
i tenir una direcció electrònica vàlida en les vostres [[Special:Preferences|preferències]]
per enviar un correu electrònic a altres usuaris.",
'emailuser' => 'Envia un missatge de correu electrònic a aquest usuari',
'emailuser-title-target' => 'Enviar un correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}',
-'emailuser-title-notarget' => "Enviar un correu electrònic a l'usuari",
+'emailuser-title-notarget' => 'Enviar un correu electrònic a un usuari',
'emailpage' => 'Correu electrònic a usuari',
'emailpagetext' => "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}.
L'adreça electrònica que vau indicar a [[Special:Preferences|les vostres preferències d'usuari]] apareixerà com a remitent del correu electrònic, de manera que el destinatari us podrà respondre directament.",
'ipadressorusername' => "Adreça IP o nom de l'usuari",
'ipbexpiry' => 'Venciment',
'ipbreason' => 'Motiu:',
-'ipbreasonotherlist' => 'Un altre motiu',
+'ipbreasonotherlist' => 'Altres motius',
'ipbreason-dropdown' => "*Motius de bloqueig més freqüents
** Inserció d'informació falsa
** Supressió de contingut sense justificació
** Abús de comptes d'usuari múltiples
** Nom d'usuari no acceptable",
'ipb-hardblock' => "Impedeix que els usuaris registrats puguin editar des d'aquesta adreça IP",
-'ipbcreateaccount' => 'Evita la creació de comptes',
-'ipbemailban' => "Evita que l'usuari enviï correu electrònic",
+'ipbcreateaccount' => 'Impedeix la creació de comptes',
+'ipbemailban' => "Impedeix que l'usuari enviï correus electrònics",
'ipbenableautoblock' => "Bloca l'adreça IP d'aquest usuari, i totes les subseqüents adreces des de les quals intenti registrar-se",
'ipbsubmit' => 'Bloqueja aquesta adreça',
'ipbother' => 'Un altre termini',
'ipboptions' => '2 hores:2 hours,1 dia:1 day,3 dies:3 days,1 setmana:1 week,2 setmanes:2 weeks,1 mes:1 month,3 mesos:3 months,6 mesos:6 months,1 any:1 year,infinit:infinite',
'ipbotheroption' => 'un altre',
-'ipbotherreason' => 'Motiu diferent o addicional:',
+'ipbotherreason' => 'Altres motius o addicionals:',
'ipbhidename' => "Amaga el nom d'usuari de les edicions i llistes",
'ipbwatchuser' => "Vigila les pàgines d'usuari i de discussió de l'usuari",
'ipb-disableusertalk' => 'Impedeix que aquest usuari pugui modificar la seva pàgina de discussió mentre dura el blocatge',
'createaccountblock' => "s'ha blocat la creació de nous comptes",
'emailblock' => "s'ha blocat l'enviament de correus electrònics",
'blocklist-nousertalk' => 'no podeu modificar la pàgina de discussió pròpia',
-'ipblocklist-empty' => 'La llista de bloqueig està buida.',
+'ipblocklist-empty' => 'La llista de bloqueigs està buida.',
'ipblocklist-no-results' => "L'adreça IP o nom d'usuari soŀlicitat no està bloquejat.",
'blocklink' => 'bloca',
'unblocklink' => 'desbloca',
'thumbnail_image-missing' => 'Sembla que falta el fitxer: $1',
# Special:Import
-'import' => 'Importa les pàgines',
+'import' => 'Importació de pàgines',
'importinterwiki' => 'Importa interwiki',
'import-interwiki-text' => "Trieu un web basat en wiki i un títol de pàgina per a importar.
Es conservaran les dates de les versions i els noms dels editors.
'importcantopen' => "No ha estat possible d'obrir el fitxer a importar",
'importbadinterwiki' => "Enllaç d'interwiki incorrecte",
'importnotext' => 'Buit o sense text',
-'importsuccess' => "S'ha acabat d'importar.",
+'importsuccess' => 'Importació completada!',
'importhistoryconflict' => "Hi ha un conflicte de versions en l'historial (la pàgina podria haver sigut importada abans)",
'importnosources' => "No s'ha definit cap font d'origen interwiki i s'ha inhabilitat la càrrega directa d'una còpia de l'historial",
'importnofile' => "No s'ha pujat cap fitxer d'importació.",
'tooltip-t-print' => "Versió per a impressió d'aquesta pàgina",
'tooltip-t-permalink' => 'Enllaç permanent a aquesta versió de la pàgina',
'tooltip-ca-nstab-main' => 'Vegeu el contingut de la pàgina.',
-'tooltip-ca-nstab-user' => "Vegeu la pàgina de l'usuari.",
+'tooltip-ca-nstab-user' => "Vegeu la pàgina d'usuari",
'tooltip-ca-nstab-media' => "Vegeu la pàgina de l'element multimèdia",
'tooltip-ca-nstab-special' => 'Aquesta és una pàgina especial, no podeu modificar-la',
'tooltip-ca-nstab-project' => 'Vegeu la pàgina del projecte',
'monthsall' => 'tots',
'limitall' => 'tots',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => "Confirma l'adreça de correu electrònic",
'confirmemail_noemail' => "No heu introduït una direcció vàlida de correu electrònic en les vostres [[Special:Preferences|preferències d'usuari]].",
'confirmemail_text' => "El projecte {{SITENAME}} necessita que valideu la vostra adreça de correu
'newwindow' => '(لە پەڕەیەکی نوێدا دەکرێتەوە)',
'cancel' => 'ھەڵیوەشێنەوە',
'moredotdotdot' => 'زیاتر',
+'morenotlisted' => 'درێژەی پێرست...',
'mypage' => 'پەڕه',
'mytalk' => 'لێدوان',
'anontalk' => 'وتووێژ بۆ ئەم ئایپی یە',
'searcharticle' => 'بڕۆ',
'history' => 'مێژووی پەڕە',
'history_short' => 'مێژووی پەڕە',
-'updatedmarker' => 'لە دوای دواسەردانم نوێکراوەتەوە',
+'updatedmarker' => 'لە دوایین سەردانمدا نوێ کراوەتەوە',
'printableversion' => 'وەشانی ئامادەی چاپ',
'permalink' => 'بەستەری ھەمیشەیی',
'print' => 'چاپ',
'otherlanguages' => 'بە زمانەکانی تر',
'redirectedfrom' => '(ڕەوانەکراوە لە $1 ەوە)',
'redirectpagesub' => 'پەڕەی ڕەوانەکردن',
-'lastmodifiedat' => 'ئەم پەڕەیە دواجار لە $2ی $1 نوێکراوەتەوە.',
+'lastmodifiedat' => 'ئەم پەڕەیە دواجار لە $2ی $1 نوێ کراوەتەوە.',
'viewcount' => 'ئەم پەڕەیە {{PLURAL:$1|یەکجار|$1 جار}} بینراوە.',
'protectedpage' => 'پەڕەی پارێزراو',
'jumpto' => 'باز بدە بۆ:',
'search-interwiki-default' => '$1 ئەنجام:',
'search-interwiki-more' => '(زیاتر)',
'search-relatedarticle' => 'پەیوەست',
-'mwsuggest-disable' => 'پێشنیارەکانی AJAX نیشان مەدە',
+'mwsuggest-disable' => 'پێشنیارەکانی گەڕان ناچالاک بکە',
'searcheverything-enable' => 'لە ھەموو بۆشاییناوەکان دا بگەڕێ',
'searchrelated' => 'پەیوەست',
'searchall' => 'ھەموو',
'timezoneregion-australia' => 'ئۆسترالیا',
'timezoneregion-europe' => 'ئەورووپا',
'timezoneregion-indian' => 'ئوقیانووسی ھیند',
-'timezoneregion-pacific' => 'ئوقیانووسی پاسیفیک',
+'timezoneregion-pacific' => 'ئۆقیانووسی پاسیفیک',
'allowemail' => 'ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن',
'prefs-searchoptions' => 'گەڕان',
'prefs-namespaces' => 'بۆشاییناوەکان',
'prefs-displaywatchlist' => 'ھەڵبژاردەکانی نیشاندان',
'prefs-diffs' => 'جیاوازییەکان',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'ناونیشانی ئیمەیل دروست وە بەر چاو دێت',
'email-address-validity-invalid' => 'ناونیشانێکی دروستی ئیمەیل بنووسە',
# Rights
'right-read' => 'خوێندنەوەی پەڕەکان',
'right-edit' => 'دەستکاری کردنی پەڕەکان',
-'right-createpage' => 'دروست کردنی پەڕەکان (کە پەڕەی لێدوان نین)',
+'right-createpage' => 'دروستکردنی پەڕەکان (کە پەڕەی وتووێژ نین)',
'right-createtalk' => 'دروست کردنی پەڕەکانی لێدوان',
'right-createaccount' => 'دروست کردنی ھەژماری بەکارھێنەریی نوێ',
'right-minoredit' => 'بچووک دیاری کردنی گۆڕانکارییەکان',
'listgrouprights-addgroup-self-all' => 'زیادکردنی هەموو گرووپەکان بۆ سهر ههژماری خۆ',
'listgrouprights-removegroup-self-all' => 'لابردنی هەموو گرووپەکان له سهر ههژماری خۆ',
-# E-mail user
+# Email user
'mailnologin' => 'ناونیشان بۆ ناردن نییه',
'mailnologintext' => 'دهبێ له [[Special:UserLogin|ژوورهوه]] بیت و ناونیشانێکی بڕواپێکراوی ئیمهیلت له ناو [[Special:Preferences|ههڵبژاردهکان]] دیاری کردبێت تا بتوانی ئیمهیل بنێریت بۆ بهکارهێنهرانی دیکه.',
'emailuser' => 'ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە',
'''ئاگاداربە: '''ھەناردنی ھەموو مێژووی پەڕەکان لەم فۆرمەوە لەبەر ھۆکاری ڕێخستن، داخراوە.",
'export-submit' => 'هەناردن',
'export-addcattext' => 'پەڕەکان زێدەبکە لە پۆلی:',
-'export-addcat' => 'زÛ\8eدÛ\95بکە',
+'export-addcat' => 'زÛ\8cاد بکە',
'export-addnstext' => 'پەڕەکان زێدەبکە لە بۆشاییناوی:',
'export-addns' => 'زێدەبکە',
'export-download' => 'وەک پەڕگە پاشەکەوتی بکە',
'pageinfo-robot-noindex' => 'نەشیاو بۆ پێرستکردن',
'pageinfo-views' => 'ژمارەی بینینەکان',
'pageinfo-watchers' => 'ژمارەی چاودێرانی پەڕە',
+'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاوەدێر}}',
'pageinfo-redirects-name' => 'ڕەوانەکەرەکان بۆ ئەم پەڕەیە',
'pageinfo-subpages-name' => 'ژێرپەڕەکانی ئەم پەڕەیە',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ڕەوانەکەر}}; $3 {{PLURAL:$3|ڕەوانەنەکەر}})',
'monthsall' => 'ھەموو',
'limitall' => 'ھەموو',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'بڕواپێکردنی ناونیشانی ئیمەیل',
'confirmemail_noemail' => 'لە [[Special:Preferences|هەڵبژاردەکانی بەکارهێنەر]] ناونیشانی ئیمەیلی گونجاوت دیاری نەکردووە.',
'confirmemail_text' => '{{SITENAME}} بە پێویستی دەزانێ پێش کەڵک وەرگرتن لە تایبەتمەندیەکانی ئیمەیل، ناونیشانی ئیمەیلی خۆت ڕاچاو بکەیت.
# General errors
'error' => 'Chyba',
-'databaseerror' => 'Databázová chyba',
+'databaseerror' => 'Chyba databáze',
'dberrortext' => 'Při dotazu do databáze došlo k syntaktické chybě.
Příčinou může být chyba v programu.
Poslední dotaz byl:
'notloggedin' => 'Nejste přihlášen(a)',
'nologin' => "Dosud nemáte účet? '''$1'''.",
'nologinlink' => 'Zaregistrujte se',
-'createaccount' => 'Vytvořit nový účet',
+'createaccount' => 'Vytvořit účet',
'gotaccount' => "Už jste registrováni? '''$1'''.",
'gotaccountlink' => 'Přihlaste se',
'userlogin-resetlink' => 'Zapomněli jste přihlašovací údaje?',
'loginlanguagelabel' => 'Jazyk: $1',
'suspicious-userlogout' => 'Váš požadavek na odhlášení byl odmítnut, neboť to vypadá, že ho poslal rozbitý prohlížeč nebo cachující proxy.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Neznámá chyba v PHP funkci mail()',
'user-mail-no-addy' => 'Pokus o odeslání e-mailu bez e-mailové adresy',
'user-mail-no-body' => 'Pokus o odeslání prázdného nebo nesmyslně krátkého e-mailu.',
'prefs-displaywatchlist' => 'Možnosti zobrazení',
'prefs-diffs' => 'Porovnání verzí',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mailová adresa vypadá platně',
'email-address-validity-invalid' => 'Zadejte platnou e-mailovou adresu',
Asi by místo toho měly odkazovat na konkrétnější stránku.<br />
Stránka je považována za rozcestník, pokud používá některou ze šablon odkazovaných na [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Stránky s vlastností',
+'pageswithprop-text' => 'Tato stránka obsahuje seznam stránek, které používají zadanou vlastnost stránky.',
+'pageswithprop-prop' => 'Název vlastnosti:',
+
'doubleredirects' => 'Dvojitá přesměrování',
'doubleredirectstext' => 'Na této stránce je seznam přesměrování vedoucích na další přesměrování.
Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl druhého přesměrování, který obvykle ukazuje jméno „skutečné“ cílové stránky, na kterou by mělo první přesměrování odkazovat.
'listgrouprights-addgroup-self-all' => 'Přidání svého účtu do libovolné skupiny',
'listgrouprights-removegroup-self-all' => 'Vyřazení svého účtu z libovolné skupiny',
-# E-mail user
+# Email user
'mailnologin' => 'Bez odesílací adresy',
'mailnologintext' => 'Pokud chcete posílat e-maily jiným uživatelům, musíte se [[Special:UserLogin|přihlásit]] a mít platnou e-mailovou adresu ve svém [[Special:Preferences|nastavení]].',
'emailuser' => 'Poslat e-mail',
'months' => '{{PLURAL:$1|$1 měsícem|$1 měsíci}}',
'years' => '{{PLURAL:$1|$1 rokem|$1 roky}}',
'ago' => 'před $1',
-'just-now' => 'Právě teď',
+'just-now' => 'právě teď',
# Bad image list
'bad_image_list' => 'Tato stránka má následující formát:
'monthsall' => 'všechny',
'limitall' => 'vše',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Potvrzení e-mailové adresy',
'confirmemail_noemail' => 'Ve svém [[Special:Preferences|uživatelském nastavení]] jste nezadali platnou e-mailovou adresu.',
'confirmemail_text' => 'Tato wiki vyžaduje, abyste před využíváním některých funkcí potvrdili svoji e-mailovou adresu. Kliknutím na tlačítko níže odešlete potvrzovací e-mail na vámi uvedenou adresu. Tento e-mail obsahuje odkaz a potvrzovací kód; zobrazením odkazované stránky ve svém internetovém prohlížeči potvrdíte, že zadaná adresa je platná.',
'duration-centuries' => '$1 {{PLURAL:$1|století}}',
'duration-millennia' => '$1 {{PLURAL:$1|tisíciletí}}',
+# Unknown messages
+'pageswithprop-legend' => 'Stránky s vlastností',
+'pageswithprop-submit' => 'Provést',
);
'tog-enotifminoredits' => 'Gyrru e-bost ataf hefyd ar gyfer golygiadau bychain i dudalennau a ffeiliau',
'tog-enotifrevealaddr' => 'Datguddio fy nghyfeiriad e-bost mewn e-byst hysbysu',
'tog-shownumberswatching' => "Dangos y nifer o ddefnyddwyr sy'n gwylio",
-'tog-oldsig' => 'Llofnod cyfredol:',
+'tog-oldsig' => 'Y llofnod cyfredol:',
'tog-fancysig' => 'Trin y llofnod fel testun wici (heb gyswllt wici awtomatig)',
'tog-externaleditor' => 'Defnyddio golygydd allanol trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
'tog-externaldiff' => 'Defnyddio "external diff" trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
'loginlanguagelabel' => 'Iaith: $1',
'suspicious-userlogout' => 'Gwrthodwyd eich cais i allgofnodi oherwydd ei fod yn ymddangos mai gweinydd wedi torri neu ddirprwy gelc a anfonodd y cais.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Gwall anhysbys yng ngweithrediad post() PHP',
'user-mail-no-addy' => 'Wedi ceisio anfon e-bost heb gyfeiriad e-bost',
'user-mail-no-body' => 'Ceisiwyd anfon e-bost gwag neu e-bost oedd a thestun rhy bwt iddo.',
'prefs-displaywatchlist' => 'Dewisiadau arddangos',
'prefs-diffs' => "Cymharu golygiadau ('gwahan')",
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Y cyfeiriad e-bost yn ymddangos yn un dilys',
'email-address-validity-invalid' => 'Rhowch gyfeiriad e-bost dilys',
'disambiguations-text' => "Mae'r tudalennau canlynol yn cynnwys un neu ragor o gysylltau, sydd yn arwain at '''dudalennau gwahaniaethu'''. Hwyrach y byddai'n hwylusach petai'r cyswllt yn arwain yn syth at y dudalen briodol.<br />
Diffinir tudalen yn dudalen gwahaniaethu pan mae'n cynnwys un o'r nodiadau '[[MediaWiki:Disambiguationspage|tudalen gwahaniaethu]]'.",
+'pageswithprop' => 'Tudalennau a chanddynt nodwedd arbennig',
+'pageswithprop-legend' => 'Tudalennau a chanddynt nodwedd arbennig',
+'pageswithprop-text' => "Mae'r dudalen hon yn rhestru tudalennau sydd yn defnyddio nodwedd arbennig yn y dudalen.",
+'pageswithprop-prop' => "Enw'r nodwedd:",
+'pageswithprop-submit' => 'Gwneler',
+
'doubleredirects' => 'Ailgyfeiriadau dwbl',
'doubleredirectstext' => "Mae pob rhes yn cynnwys cysylltiad i'r ddau ail-gyfeiriad cyntaf, ynghyd â chyrchfan yr ail ailgyfeiriad. Fel arfer bydd hyn yn rhoi'r gwir dudalen y dylai'r tudalennau cynt gyfeirio ati.
Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
'listgrouprights-addgroup-self-all' => "Yn gallu ychwanegu'r holl grwpiau at eich cyfrif eich hunan",
'listgrouprights-removegroup-self-all' => "Yn gallu tynnu'r holl grwpiau oddi ar eich cyfrif eich hunan",
-# E-mail user
+# Email user
'mailnologin' => "Does dim cyfeiriad i'w anfon iddo",
'mailnologintext' => 'Rhaid eich bod wedi [[Special:UserLogin|mewngofnodi]]
a bod cyfeiriad e-bost dilys yn eich [[Special:Preferences|dewisiadau]]
'prot_1movedto2' => 'wedi symud [[$1]] i [[$2]]',
'protect-badnamespace-title' => 'Parth na ellir ei ddiogelu',
'protect-badnamespace-text' => 'Ni ellir diogelu tudalennau yn y parth hwn.',
+'protect-norestrictiontypes-text' => 'Ni ellir gwarchod y dudalen hon gan nad oes mathau o gyfyngiadau ar gael iddi.',
+'protect-norestrictiontypes-title' => 'Tudalen na ellir ei gwarchod',
'protect-legend' => "Cadarnháu'r diogelu",
'protectcomment' => 'Rheswm:',
'protectexpiry' => 'Yn dod i ben:',
'immobile-target-namespace-iw' => 'Nid yw cyswllt rhyngwici yn nod dilys wrth symud tudalen.',
'immobile-source-page' => 'Ni ellir symud y dudalen hon.',
'immobile-target-page' => "Ddim yn gallu symud i'r teitl newydd hwn.",
+'bad-target-model' => "Mae'r cyrchfan dewisedig yn defnyddio model gwahanol i'w chynnwys. Ni ellir trawsnewid o $1 i $2.",
'imagenocrossnamespace' => 'Ni ellir symud ffeil i barth arall',
'nonfile-cannot-move-to-file' => 'Ni ellir symud unrhywbeth heblaw ffeil i barth y ffeiliau',
'imagetypemismatch' => "Nid yw'r estyniad ffeil newydd yn cyfateb i'r math o ffeil",
'pageinfo-magic-words' => '{{PLURAL:$1|Gair|Gair|Geiriau}} hud ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categori|Categori|Categorïau}} cudd ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Nodyn|Nodyn|Nodiadau}} a drawsgynhwyswyd ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Tudalen|Tudalen|Tudalennau}} y trawsgynhwyswyd y dudalen hon arnynt ($1)',
'pageinfo-toolboxlink' => 'Gwybodaeth am y dudalen',
'pageinfo-redirectsto' => 'Yn ailgyfeirio i',
+'pageinfo-redirectsto-info' => 'manylion',
+'pageinfo-contentpage' => 'Ymhlith tudalennau pwnc y wici',
+'pageinfo-contentpage-yes' => 'Ydi',
+'pageinfo-protect-cascading' => "Mae diogelu sgydol yn deillio o'r dudalen hon",
+'pageinfo-protect-cascading-yes' => 'Oes',
+'pageinfo-protect-cascading-from' => "Mae'r diogelu sgydol yn dechrau ar",
'pageinfo-category-info' => 'Gwybodaeth am y categori',
'pageinfo-category-pages' => 'Nifer y tudalennau',
'pageinfo-category-subcats' => 'Nifer yr is-gategorïau',
'markedaspatrollederror' => 'Ni ellir gosod marc ymweliad patrôl',
'markedaspatrollederrortext' => "Rhaid nodi'r union olygiad sydd angen marc ymweliad patrôl.",
'markedaspatrollederror-noautopatrol' => "Ni chaniateir i chi farcio'ch newidiadau eich hunan fel rhai derbyniol.",
+'markedaspatrollednotify' => 'Nodwyd bod y newid hwn i $1 wedi derbyn ymweliad patrôl.',
+'markedaspatrollederrornotify' => 'Methwyd rhoi marc ymweliad patrôl arni.',
# Patrol log
'patrol-log-page' => 'Lòg patrolio',
'exif-pixelydimension' => 'Lled y ddelwedd',
'exif-pixelxdimension' => 'Uchder y ddelwedd',
'exif-usercomment' => "Sylwadau'r defnyddiwr",
-'exif-relatedsoundfile' => 'Ffeil sain cysylltiedig',
+'exif-relatedsoundfile' => 'Ffeil sain gysylltiedig',
'exif-datetimeoriginal' => 'Dyddiad ac amser y cynhyrchwyd y data',
'exif-datetimedigitized' => 'Dyddiad ac amser y digiteiddiwyd',
'exif-subsectime' => 'Manylyn iseiliad amser newid y ffeil',
'exif-originaldocumentid' => 'ID unigryw y ddogfen wreiddiol',
'exif-licenseurl' => 'URL y drwydded hawlfraint',
'exif-morepermissionsurl' => 'Gwybodaeth trwyddedu amgen',
-'exif-attributionurl' => "Wrth ail-ddefnyddio'r gwaith yma, darparwch ddolen at",
-'exif-preferredattributionname' => "Wrth ail-ddefnyddio'r gwaith yma, cydnabyddwch",
+'exif-attributionurl' => "Wrth ailddefnyddio'r gwaith yma, darparwch ddolen at",
+'exif-preferredattributionname' => "Wrth ailddefnyddio'r gwaith yma, cydnabyddwch",
'exif-pngfilecomment' => 'Sylwadau ar y ffeil PNG',
'exif-disclaimer' => 'Ymwadiad',
'exif-contentwarning' => 'Rhybudd am y cynnwys',
'monthsall' => 'pob mis',
'limitall' => 'oll',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => "Cadarnhau'r cyfeiriad e-bost",
'confirmemail_noemail' => 'Does dim cyfeiriad e-bost dilys wedi ei osod yn eich [[Special:Preferences|dewisiadau defnyddiwr]].',
'confirmemail_text' => "Cyn i chi allu defnyddio'r nodweddion e-bost, mae'n rhaid i {{SITENAME}} ddilysu'ch cyfeiriad e-bost. Pwyswch y botwm isod er mwyn anfon côd cadarnhau i'ch cyfeiriad e-bost. Bydd yr e-bost yn cynnwys cyswllt gyda chôd ynddi; llwythwch y cyswllt ar eich porwr er mwyn cadarnhau dilysrwydd eich cyfeiriad e-bost.",
# Scary transclusion
'scarytranscludedisabled' => '[Analluogwyd cynhwysiad rhyng-wici]',
-'scarytranscludefailed' => '[Methwyd â nôl y nodyn ar gyfer $1]',
+'scarytranscludefailed' => '[Methwyd nôl y nodyn ar gyfer $1]',
+'scarytranscludefailed-httpstatus' => '[Methwyd nôl y nodyn ar gyfer $1: HTTP $2]',
'scarytranscludetoolong' => "[Mae'r URL yn rhy hir]",
# Delete conflict
'logentry-newusers-newusers' => 'Dechreuwyd y cyfrif defnyddiwr $1',
'logentry-newusers-create' => 'Dechreuwyd y cyfrif defnyddiwr $1',
'logentry-newusers-create2' => 'Dechreuwyd y cyfrif defnyddiwr $3 gan $1',
+'logentry-newusers-byemail' => 'Dechreuodd $1 y cyfrif defnyddiwr $3 ac anfonodd gyfrinair drwy e-bost',
'logentry-newusers-autocreate' => 'Crëwyd y cyfrif $1 yn awtomatig',
+'logentry-rights-rights' => 'Newidiodd $1 y grwpiau y mae $3 yn aelod ohonynt o $4 i $5',
+'logentry-rights-rights-legacy' => 'Newidiodd $1 y grwpiau y mae $3 yn aelod ohonynt',
+'logentry-rights-autopromote' => 'Dyrchafwyd $1 yn awtomatig o $4 i $5',
'rightsnone' => '(dim)',
# Feedback
'api-error-ok-but-empty' => 'Gwall mewnol: dim ymateb gan y gweinydd.',
'api-error-overwrite' => 'Ni chaniateir trosysgrifo ffeil sydd eisoes yn bod.',
'api-error-stashfailed' => "Gwall mewnol: methodd y gweinydd â rhoi'r ffeil dros dro ar gadw.",
+'api-error-publishfailed' => "Gwall mewnol: methodd y gweinydd â chyhoeddi'r ffeil dros dro.",
'api-error-timeout' => 'Ni chafwyd ymateb gan y gweinydd mewn da bryd.',
'api-error-unclassified' => 'Cafwyd gwall anhysbys',
'api-error-unknown-code' => 'Gwall anhysbys: "$1"',
'loginlanguagelabel' => 'Sprog: $1',
'suspicious-userlogout' => 'Din anmodning om at logge ud blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
'user-mail-no-addy' => 'Forsøgte at sende email uden en email-adresse',
'user-mail-no-body' => 'Forsøgte at sende en e-mail med tomt eller urimeligt kort indhold.',
'prefs-info' => 'Grundlæggende information',
'prefs-i18n' => 'Internationalisering:',
'prefs-signature' => 'Signatur',
-'prefs-dateformat' => 'Dataformat',
+'prefs-dateformat' => 'Formatering af datoer',
'prefs-timeoffset' => 'Tidsforskel',
'prefs-advancedediting' => 'Avancerede indstillinger',
'prefs-advancedrc' => 'Avancerede indstillinger',
'prefs-displaywatchlist' => 'Visningsmuligheder',
'prefs-diffs' => 'Forskelle',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mailadressen ser ud til at være gyldig',
'email-address-validity-invalid' => 'Indtast en gyldig e-mail adresse',
'listgrouprights-addgroup-self-all' => 'Kan tilføje alle grupper til egen konto',
'listgrouprights-removegroup-self-all' => 'Kan fjerne alle grupper fra egen konto',
-# E-mail user
+# Email user
'mailnologin' => 'Du er ikke logget på',
'mailnologintext' => 'Du skal være [[Special:UserLogin|logget på]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.',
'emailuser' => 'E-mail til denne bruger',
'monthsall' => 'alle',
'limitall' => 'alle',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Bekræft e-mail-adressen',
'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mail-adresse i din [[Special:Preferences|brugerprofil]].',
'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mail-adresse (autentificering), før du kan bruge de udvidede e-mail-funktioner. Med et klik på kontrolfeltet forneden sendes en e-mail til dig. Denne e-mail indeholder et link med en bekræftelseskode. Med et klik på dette link bekræftes, at e-mail-adressen er gyldig.',
'Userlogin' => array( 'Anmelden' ),
'Userlogout' => array( 'Abmelden' ),
'Userrights' => array( 'Benutzerrechte' ),
- 'Version' => array( 'Versionsinformationen' ),
'Wantedcategories' => array( 'Gewünschte_Kategorien' ),
'Wantedfiles' => array( 'Gewünschte_Dateien', 'Fehlende_Dateien' ),
'Wantedpages' => array( 'Gewünschte_Seiten' ),
'loginlanguagelabel' => 'Sprache: $1',
'suspicious-userlogout' => 'Deine Abmeldeanfrage wurde verweigert, da sie vermutlich von einem defekten Browser oder einem Cache-Proxy gesendet wurde.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Unbekannter Fehler mit der Funktion mail() von PHP',
'user-mail-no-addy' => 'Versuchte, eine E-Mail ohne Angabe einer E-Mail-Adresse zu versenden.',
'user-mail-no-body' => 'Es wurde versucht, eine E-Mail mit einem leeren oder zu kurzen Textkörper zu versenden.',
'columns' => 'Spalten:',
'searchresultshead' => 'Suche',
'resultsperpage' => 'Treffer pro Seite:',
-'stub-threshold' => 'Linkformatierung <a href="#" class="stub">kleiner Seiten</a> (in Byte):',
+'stub-threshold' => 'Linkformatierung <a href="#" class="stub">kleiner Seiten</a> (in Bytes):',
'stub-threshold-disabled' => 'Deaktiviert',
'recentchangesdays' => 'Anzahl der standardmäßig einbezogenen Tage:',
'recentchangesdays-max' => 'Maximal $1 {{PLURAL:$1|Tag|Tage}}',
'prefs-displaywatchlist' => 'Anzeigeoptionen',
'prefs-diffs' => 'Versionsvergleich',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Diese E-Mail-Adresse scheint gültig zu sein.',
'email-address-validity-invalid' => 'Eine gültige E-Mail-Adresse ist erforderlich.',
'rc_categories' => 'Nur Seiten aus den Kategorien (getrennt mit „|“):',
'rc_categories_any' => 'Alle',
'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Byte}} nach der Änderung',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung',
'newsectionsummary' => 'Neuer Abschnitt /* $1 */',
'rc-enhanced-expand' => 'Details anzeigen (benötigt JavaScript)',
'rc-enhanced-hide' => 'Details verstecken',
'ignorewarnings' => 'Warnungen ignorieren',
'minlength1' => 'Dateinamen müssen mindestens einen Buchstaben lang sein.',
'illegalfilename' => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benenne die Datei um und versuche, sie erneut hochzuladen.',
-'filename-toolong' => 'Dateinamen dürfen nicht größer als 240 Byte sein.',
+'filename-toolong' => 'Dateinamen dürfen nicht größer als 240 Bytes sein.',
'badfilename' => 'Der Dateiname wurde in „$1“ geändert.',
'filetype-mime-mismatch' => 'Dateierweiterung „.$1“ stimmt nicht mit dem MIME-Typ ($2) überein.',
'filetype-badmime' => 'Dateien mit dem MIME-Typ „$1“ dürfen nicht hochgeladen werden.',
'backend-fail-closetemp' => 'Die temporäre Datei konnte nicht geschlossen werden.',
'backend-fail-read' => 'Die Datei $1 konnte nicht gelesen werden.',
'backend-fail-create' => 'Die Datei $1 konnte nicht gespeichert werden.',
-'backend-fail-maxsize' => 'Die Datei $1 konnte nicht gespeichert werden, da sie größer als {{PLURAL:$2|ein Byte|$2 Byte}} ist.',
+'backend-fail-maxsize' => 'Die Datei $1 konnte nicht gespeichert werden, da sie größer als {{PLURAL:$2|ein Byte|$2 Bytes}} ist.',
'backend-fail-readonly' => 'Das Speicher-Backend „$1“ befindet sich derzeit im Lesemodus. Der angegebene Grund lautet: „$2“',
'backend-fail-synced' => 'Die Datei „$1“ befindet sich, innerhalb des internen Speicher-Backends, in einem inkonsistenten Zustand.',
'backend-fail-connect' => 'Es konnte keine Verbindung zum Speicher-Backend „$1“ hergestellt werden.',
Eine Seite gilt als Begriffsklärungsseite, wenn sie mindestens eine der auf der Seite [[MediaWiki:Disambiguationspage|Disambiguationspage]] aufgeführten Vorlagen enthält.",
+'pageswithprop' => 'Seiten mit einer Seiteneigenschaft',
+'pageswithprop-legend' => 'Seiten mit einer Seiteneigenschaft',
+'pageswithprop-text' => 'Diese Spezialseite listet Seiten auf, die eine bestimmte Seiteneigenschaft verwenden.',
+'pageswithprop-prop' => 'Eigenschaftsname:',
+'pageswithprop-submit' => 'Los',
+
'doubleredirects' => 'Doppelte Weiterleitungen',
'doubleredirectstext' => 'Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.
Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.
'fewestrevisions' => 'Seiten mit den wenigsten Versionen',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|Byte|Byte}}',
+'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
'ncategories' => '$1 {{PLURAL:$1|Kategorie|Kategorien}}',
'ninterwikis' => '{{PLURAL:$1|Ein Interwikilink|$1 Interwikilinks}}',
'nlinks' => '{{PLURAL:$1|1 Link|$1 Links}}',
'listgrouprights-addgroup-self-all' => 'Kann alle Gruppen zum eigenen Konto hinzufügen',
'listgrouprights-removegroup-self-all' => 'Kann alle Gruppen vom eigenen Konto entfernen',
-# E-mail user
+# Email user
'mailnologin' => 'Fehler beim E-Mail-Versand',
'mailnologintext' => 'Du musst [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in deinen [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.',
'emailuser' => 'E-Mail an diesen Benutzer',
'pageinfo-header-restrictions' => 'Seitenschutz',
'pageinfo-header-properties' => 'Seiteneigenschaften',
'pageinfo-display-title' => 'Anzeigetitel',
-'pageinfo-default-sort' => 'Standardsortierkriterium',
-'pageinfo-length' => 'Seitenlänge (in Byte)',
+'pageinfo-default-sort' => 'Standardsortierschlüssel',
+'pageinfo-length' => 'Seitenlänge (in Bytes)',
'pageinfo-article-id' => 'Seitenkennnummer',
'pageinfo-language' => 'Seiteninhaltssprache',
'pageinfo-robot-policy' => 'Suchmaschinenstatus',
'monthsall' => 'alle',
'limitall' => 'alle',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'E-Mail-Adresse bestätigen (Authentifizierung)',
'confirmemail_noemail' => 'Du hast keine gültige E-Mail-Adresse in deinen [[Special:Preferences|persönlichen Einstellungen]] eingetragen.',
'confirmemail_text' => '{{SITENAME}} erfordert, dass du deine E-Mail-Adresse bestätigst (authentifizieren), bevor du die erweiterten E-Mail-Funktionen benutzen kannst. Klicke bitte auf die unten stehende, mit „Bestätigungscode zuschicken“ beschriftete Schaltfläche, damit eine automatisch erstellte E-Mail an die angegebene Adresse geschickt wird. Diese E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem du diese Webseite in deinem Webbrowser öffnest, bestätigst du, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
'version-antispam' => 'Spamschutzerweiterungen',
'version-skins' => 'Benutzeroberflächen',
'version-api' => 'API-Erweiterungen',
-'version-other' => 'Andere Erweiterungen',
+'version-other' => 'Sonstige Erweiterungen',
'version-mediahandlers' => 'Mediennutzungserweiterungen',
'version-hooks' => "Schnittstellen ''(Hooks)''",
'version-extension-functions' => 'Funktionsaufrufe',
'duration-centuries' => '$1 {{PLURAL:$1|Jahrhundert|Jahrhunderte}}',
'duration-millennia' => '$1 {{PLURAL:$1|Jahrtausend|Jahrtausende}}',
+# Image rotation
+'rotate-comment' => 'Bild um $1 {{PLURAL:$1|Grad}} im Uhrzeigersinn gedreht',
+
);
* @author George Animal
* @author Kaganer
* @author Mirzali
+ * @author Nemo bis
* @author Olvörg
* @author Reedy
* @author Sahim
'viewsourcetext' => 'To şikinay çımey na pele bıvêne u kopya kerê:',
'viewyourtext' => "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
'protectedinterface' => 'Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.',
-'editinginterface' => "'''İqaz:''' Şıma hao jû pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.
+'editinginterface' => "'''İqaz:''' Şıma hayo yew pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.
Vurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.
Seba çarnayışi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
'sqlhidden' => '(SQL pers kerdışê nımıte)',
'loginlanguagelabel' => 'Zıwan: $1',
'suspicious-userlogout' => 'Waştişê tu ya veciyayişi kebul nibiya cunki ihtimal o ke waştiş yew browser ya zi proksiyê heripiyaye ra ameya.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "PHP's mail() fonksiyoni de xırabin vıcyê.",
'user-mail-no-addy' => 'Bê E-posta kerd ju e-posta bırşo cırê.',
'searchsubtitle' => 'Tı semedê \'\'\'[[:$1]]\'\'\' cıgeyra. ([[Special:Prefixindex/$1|pelê ke pêro be "$1" ra dest niyaê pıra]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|pelê ke pêro be "$1"\' ra gırê xo esto]])',
'searchsubtitleinvalid' => "Tı cıgeyra qe '''$1'''",
'toomanymatches' => 'Zêde teki (zewci) peyser çarnay, şıma rê zehmet, be persê do bin ra bıcerrebnên.',
-'titlematches' => 'tekê (zewcê) sernamey pele',
-'notitlematches' => 'Tekê (zewcê) sernamey pele çıniyê.',
+'titlematches' => 'Tekê (zewcê) sernameyê pele',
+'notitlematches' => 'Tekê (zewcê) sernameyê pele çıniyê.',
'textmatches' => 'Tekê (zewcê) nuştey pele',
'notextmatches' => 'tekê (zewcê) nuştey pele çıniyê',
'prevn' => '{{PLURAL:$1|$1}} verên',
'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
'prefs-diffs' => 'Ferqi',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'e-posta adresi raştayo',
'email-address-validity-invalid' => 'e-postayo raştay defiye de',
'filedelete-success-old' => "Versiyonê'''[[Media:$1|$1]]'''î $3, $2 esteriyayo.",
'filedelete-nofile' => "'''$1''' çin o.",
'filedelete-nofile-old' => "Versiyonê arşivi ye '''$1'''î pê enê detayanê xasî çin o.",
-'filedelete-otherreason' => 'Sebebê binî',
-'filedelete-reason-otherlist' => 'Sebebê binî',
+'filedelete-otherreason' => 'Sebebo bin/ilaweyın:',
+'filedelete-reason-otherlist' => 'Sebebo bin',
'filedelete-reason-dropdown' => '*sebebê hewna kerdışi
** ihlalê heqê telifi
** Çift/dosyaya kopyayın',
-'filedelete-edit-reasonlist' => 'Sebebê esterayîşî bivurne',
+'filedelete-edit-reasonlist' => 'Sebebanê esterıtışi bıvurne',
'filedelete-maintenance' => 'Esterayîş u resterasyonê dosyayî wextê texmirî de nibenê.',
'filedelete-maintenance-title' => 'Dosyaya nêbesterneyêna',
'listgrouprights-addgroup-self-all' => 'şıma eşkeni hesabê xo re heme gruban têare bıkerî',
'listgrouprights-removegroup-self-all' => 'şıma hesabê xo ra eşkeni heme gruban bıveci',
-# E-mail user
+# Email user
'mailnologin' => 'adresa erşawıtışi/ruşnayişi çina.',
'mailnologintext' => 'qey karberanê binan re e-posta erşawıtış de gani şıma [[Special:UserLogin|hesab aker]]ê [[Special:Preferences|pelê tercihani]] de gani yew e-postayo meqbul bıbo.',
'emailuser' => 'Ena karberi rê mesac bırse',
'sp-contributions-blocked-notice-anon' => 'Eno adresê IPi bloke biyo.
Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
'sp-contributions-search' => 'Dekerdena cı geyrê',
-'sp-contributions-username' => 'Adresa IP yana namey karberi:',
+'sp-contributions-username' => 'Adresa IPy ya zi nameyê karberi:',
'sp-contributions-toponly' => 'Tenya rewizyonanê tewr peyniyan bimocne',
'sp-contributions-submit' => 'Cı geyre',
'blockip-title' => 'Karberi kılit ke',
'blockip-legend' => 'Karber blok bike',
'blockiptext' => 'pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo).',
-'ipadressorusername' => 'Adresa IP yana namey karberi:',
+'ipadressorusername' => 'Adresa IPy ya zi nameyê karberi:',
'ipbexpiry' => 'Qedyayış:',
'ipbreason' => 'Sebeb:',
'ipbreasonotherlist' => 'Sebebê bini',
'ipb-blocklist' => 'Blokî ke hama estê ey bivîne',
'ipb-blocklist-contribs' => 'Ser $1 îştîrakî',
'unblockip' => 'Hesabê karberî a bike',
-'unblockiptext' => 'eke şıma qayili ê yê ke verniyê IPadesê inan geriyayê akeri formê cêrıni dekerê.',
-'ipusubmit' => 'Ena blok wedarne',
+'unblockiptext' => 'Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.',
+'ipusubmit' => 'Enê kılitkerdışi wedare',
'unblocked' => '[[User:$1|$1]] blok biyo',
'unblocked-range' => "Blokey $1'i wederya",
'unblocked-id' => 'Blokê $1î wedariyayo',
-'blocklist' => 'Karberê kılitbiyaey',
-'ipblocklist' => 'Karberê kılitbiyaey',
-'ipblocklist-legend' => 'Yew karberê blok biyaye bivîne',
-'blocklist-userblocks' => 'Wederneyanê hesaba bınımne',
-'blocklist-tempblocks' => 'Wederneyanê idaretan bınımne',
-'blocklist-addressblocks' => 'Nêverdışanê IP bınımne',
-'blocklist-rangeblocks' => 'Nêverdışanê gırda bınımne',
+'blocklist' => 'Karberê kılitbiyayey',
+'ipblocklist' => 'Karberê kılitbiyayey',
+'ipblocklist-legend' => 'Yew karberê kılitbiyayey bıvêne',
+'blocklist-userblocks' => 'Kılitkerdışê hesaban bınımne',
+'blocklist-tempblocks' => 'Kılitkerdışan mıweqet bınımne',
+'blocklist-addressblocks' => 'Tenya kılitkerdışanê IPy bınımne',
+'blocklist-rangeblocks' => 'Kılitkerdışanê rêzkiyan bınımne',
'blocklist-timestamp' => 'İmzay demi',
'blocklist-target' => 'Menzil',
'blocklist-expiry' => 'Wahdey qedyayışi',
'createaccountblock' => 'Hesab viraştîş blok biyo',
'emailblock' => 'e-mail blok biyo',
'blocklist-nousertalk' => 'ti nieşken pele minaqaşe xo bivurne',
-'ipblocklist-empty' => 'Listeyê blokî veng o.',
+'ipblocklist-empty' => 'Lista kılitkerdışi venga.',
'ipblocklist-no-results' => 'Adresa IPya waştiye ya zi namey karberi kılit nêbiyo.',
'blocklink' => 'kılit ke',
'unblocklink' => 'bloqi hewad',
'tooltip-summary' => 'Yew xulasaya kilm binuse',
# Scripts
-'common.js' => "/**
- * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally
- * loaded for all users on every wiki page. If possible create a gadget that is
- * enabled by default instead of adding it here (since gadgets are fully
- * optimized ResourceLoader modules with possibility to add dependencies etc.)
- *
- * Since common.js isn't a gadget, there is no place to declare its
- * dependencies, so we have to lazy load them with mw.loader.using on demand and
- * then execute the rest in the callback. In most cases these dependencies will
- * be loaded (or loading) already and the callback will not be delayed. In case a
- * dependency hasn't arrived yet it'll make sure those are loaded before this.
- */
-mw.loader.using( 'mediawiki.util', function() {
-/* Begin of mw.loader.using callback */
-
-/**
- * Redirect User:Name/skin.js and skin.css to the current skin's pages
- * (unless the 'skin' page really exists)
- * @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js
- * @rev: 2
- */
-if ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgNamespaceNumber' ) == 2 ) {
- var titleParts = mw.config.get( 'wgPageName' ).split( '/' );
- // Make sure there was a part before and after the slash
- // And that the latter is 'skin.js' or 'skin.css'
- if ( titleParts.length == 2 ) {
- var userSkinPage = titleParts.shift() + '/' + mw.config.get( 'skin' );
- if ( titleParts.slice(-1) == 'skin.js' ) {
- window.location.href = mw.util.wikiGetlink( userSkinPage + '.js' );
- } else if ( titleParts.slice(-1) == 'skin.css' ) {
- window.location.href = mw.util.wikiGetlink( userSkinPage + '.css' );
- }
- }
-}
-
-/** Map addPortletLink to mw.util
- */
-window.addPortletLink = function() {
- return mw.util.addPortletLink.apply( mw.util, arguments );
-};
-
-/** extract a URL parameter from the current URL **********
- *
- * @deprecated: Use mw.util.getParamValue with proper escaping
- */
-window.getURLParamValue = function() {
- return mw.util.getParamValue.apply( mw.util, arguments );
-};
-
-/** &withCSS= and &withJS= URL parameters *******
- * Allow to try custom scripts from MediaWiki space
- * without editing personal .css or .js files
- */
-var extraCSS = mw.util.getParamValue(\"withCSS\");
-if ( extraCSS && extraCSS.match(/^MediaWiki:[^&<>=%]*\\.css\$/) ) {
- importStylesheet(extraCSS);
-}
-var extraJS = mw.util.getParamValue(\"withJS\");
-if ( extraJS && extraJS.match(/^MediaWiki:[^&<>=%]*\\.js\$/) ) {
- importScript(extraJS);
-}
-
-
-/* Import more specific scripts if necessary */
-if (wgAction == 'edit' || wgAction == 'submit' || wgPageName == 'Special:Upload') { //scripts specific to editing pages
- importScript('MediaWiki:Common.js/edit.js');
-}
-else if (mw.config.get('wgPageName') == 'Special:Watchlist') { //watchlist scripts
- mw.loader.load(mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=MediaWiki:Common.js/watchlist.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');
-}
-
-if ( wgNamespaceNumber == 6 ) {
- importScript('MediaWiki:Common.js/file.js');
-}
-
-/**
- * WikiMiniAtlas
- *
- * Description: WikiMiniAtlas is a popup click and drag world map.
- * This script causes all of our coordinate links to display the WikiMiniAtlas popup button.
- * The script itself is located on meta because it is used by many projects.
- * See [[Meta:WikiMiniAtlas]] for more information.
- * Maintainers: [[User:Dschwen]]
- */
-
-mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');
-
-/* Scripts specific to Internet Explorer */
-if (\$.client.profile().name == 'msie') {
- /** Internet Explorer bug fix **************************************************
- *
- * Description: Fixes IE horizontal scrollbar bug
- * Maintainers: [[User:Tom-]]?
- */
-
- var oldWidth;
- var docEl = document.documentElement;
-
- var fixIEScroll = function() {
- if (!oldWidth || docEl.clientWidth > oldWidth) {
- doFixIEScroll();
- } else {
- setTimeout(doFixIEScroll, 1);
- }
-
- oldWidth = docEl.clientWidth;
- };
-
- var doFixIEScroll = function () {
- docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? \"hidden\" : \"\";
- };
-
- document.attachEvent(\"onreadystatechange\", fixIEScroll);
- document.attachEvent(\"onresize\", fixIEScroll);
-
- // In print IE (7?) does not like line-height
- mw.util.addCSS('@media print { sup, sub, p, .documentDescription { line-height: normal; } }');
-
- // IE overflow bug
- mw.util.addCSS('div.overflowbugx { overflow-x: scroll !important; overflow-y: hidden !important; } '
- + 'div.overflowbugy { overflow-y: scroll !important; overflow-x: hidden !important; }');
-
- // IE zoomfix
- // Use to fix right floating div/table inside tables
- mw.util.addCSS('.iezoomfix div, .iezoomfix table { zoom: 1; }');
-
- // Import scripts specific to Internet Explorer 6
- if (\$.client.profile().versionBase == '6') {
- importScript('MediaWiki:Common.js/IE60Fixes.js');
- }
-}
-
-/* Fixes for Windows XP font rendering */
-if (navigator.appVersion.search(/windows nt 5/i) != -1) {
- mw.util.addCSS('.IPA {font-family: \"Lucida Sans Unicode\", \"Arial Unicode MS\";} ' +
- '.Unicode {font-family: \"Arial Unicode MS\", \"Lucida Sans Unicode\";}');
-}
-
-/* Helper script for .hlist class in Common.css
- * Last updated: September 12, 2012
- * Maintainer: [[User:Edokter]]
- */
-
-if ( \$.client.profile().name == 'msie' ) {
- /* Add pseudo-selector class to last-child list items in IE 8 */
- if ( \$.client.profile().versionBase == '8' ) {
- \$( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )
- .addClass( 'hlist-last-child' );
- }
- /* Generate interpuncts and parens for IE < 8 */
- if ( \$.client.profile().versionBase < '8' ) {
- var hlists = \$( '.hlist' );
- hlists.find( 'dt:not(:last-child)' )
- .append( ': ' );
- hlists.find( 'dd:not(:last-child)' )
- .append( '<b>·</b> ' );
- hlists.find( 'li:not(:last-child)' )
- .append( '<b>·</b> ' );
- hlists.find( 'dl dl, ol ol, ul ul' )
- .prepend( '( ' ).append( ') ' );
- }
-}
-
-/* Test if an element has a certain class
- * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
- *
- * @deprecated: Use \$(element).hasClass() instead.
- */
-
-window.hasClass = ( function() {
- var reCache = {};
- return function (element, className) {
- return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp(\"(?:\\\\s|^)\" + className + \"(?:\\\\s|\$)\"))).test(element.className);
- };
-})();
-
-
-/** Interwiki links to featured articles ***************************************
- *
- * Description: Highlights interwiki links to featured articles (or
- * equivalents) by changing the bullet before the interwiki link
- * into a star.
- * Maintainers: [[User:R. Koot]]
- */
-
-function LinkFA() {
- if ( document.getElementById( \"p-lang\" ) ) {
- var InterwikiLinks = document.getElementById( \"p-lang\" ).getElementsByTagName( \"li\" );
-
- for ( var i = 0; i < InterwikiLinks.length; i++ ) {
- if ( document.getElementById( InterwikiLinks[i].className + \"-fa\" ) ) {
- InterwikiLinks[i].className += \" FA\";
- InterwikiLinks[i].title = \"This is a featured article in another language.\";
- } else if ( document.getElementById( InterwikiLinks[i].className + \"-ga\" ) ) {
- InterwikiLinks[i].className += \" GA\";
- InterwikiLinks[i].title = \"This is a good article in another language.\";
- }
- }
- }
-}
-
-\$( LinkFA );
-
-
-/** Collapsible tables *********************************************************
- *
- * Description: Allows tables to be collapsed, showing only the header. See
- * [[Wikipedia:NavFrame]].
- * Maintainers: [[User:R. Koot]]
- */
-
-var autoCollapse = 2;
-var collapseCaption = \"bınımne\";
-var expandCaption = \"bıvin\";
-
-window.collapseTable = function( tableIndex ){
- var Button = document.getElementById( \"collapseButton\" + tableIndex );
- var Table = document.getElementById( \"collapsibleTable\" + tableIndex );
-
- if ( !Table || !Button ) {
- return false;
- }
-
- var Rows = Table.rows;
-
- if ( Button.firstChild.data == collapseCaption ) {
- for ( var i = 1; i < Rows.length; i++ ) {
- Rows[i].style.display = \"none\";
- }
- Button.firstChild.data = expandCaption;
- } else {
- for ( var i = 1; i < Rows.length; i++ ) {
- Rows[i].style.display = Rows[0].style.display;
- }
- Button.firstChild.data = collapseCaption;
- }
-}
-
-function createCollapseButtons(){
- var tableIndex = 0;
- var NavigationBoxes = new Object();
- var Tables = document.getElementsByTagName( \"table\" );
-
- for ( var i = 0; i < Tables.length; i++ ) {
- if ( hasClass( Tables[i], \"collapsible\" ) ) {
-
- /* only add button and increment count if there is a header row to work with */
- var HeaderRow = Tables[i].getElementsByTagName( \"tr\" )[0];
- if (!HeaderRow) continue;
- var Header = HeaderRow.getElementsByTagName( \"th\" )[0];
- if (!Header) continue;
-
- NavigationBoxes[ tableIndex ] = Tables[i];
- Tables[i].setAttribute( \"id\", \"collapsibleTable\" + tableIndex );
-
- var Button = document.createElement( \"span\" );
- var ButtonLink = document.createElement( \"a\" );
- var ButtonText = document.createTextNode( collapseCaption );
-
- Button.className = \"collapseButton\"; //Styles are declared in Common.css
-
- ButtonLink.style.color = Header.style.color;
- ButtonLink.setAttribute( \"id\", \"collapseButton\" + tableIndex );
- ButtonLink.setAttribute( \"href\", \"#\" );
- addHandler( ButtonLink, \"click\", new Function( \"evt\", \"collapseTable(\" + tableIndex + \" ); return killEvt( evt );\") );
- ButtonLink.appendChild( ButtonText );
-
- Button.appendChild( document.createTextNode( \"[\" ) );
- Button.appendChild( ButtonLink );
- Button.appendChild( document.createTextNode( \"]\" ) );
-
- Header.insertBefore( Button, Header.firstChild );
- tableIndex++;
- }
- }
-
- for ( var i = 0; i < tableIndex; i++ ) {
- if ( hasClass( NavigationBoxes[i], \"collapsed\" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], \"autocollapse\" ) ) ) {
- collapseTable( i );
- }
- else if ( hasClass( NavigationBoxes[i], \"innercollapse\" ) ) {
- var element = NavigationBoxes[i];
- while (element = element.parentNode) {
- if ( hasClass( element, \"outercollapse\" ) ) {
- collapseTable ( i );
- break;
- }
- }
- }
- }
-}
-
-\$( createCollapseButtons );
-
-
-/** Dynamic Navigation Bars (experimental) *************************************
- *
- * Description: See [[Wikipedia:NavFrame]].
- * Maintainers: UNMAINTAINED
- */
-
-// set up the words in your language
-var NavigationBarHide = '[' + collapseCaption + ']';
-var NavigationBarShow = '[' + expandCaption + ']';
-
-// shows and hides content and picture (if available) of navigation bars
-// Parameters:
-// indexNavigationBar: the index of navigation bar to be toggled
-window.toggleNavigationBar = function(indexNavigationBar){
- var NavToggle = document.getElementById(\"NavToggle\" + indexNavigationBar);
- var NavFrame = document.getElementById(\"NavFrame\" + indexNavigationBar);
-
- if (!NavFrame || !NavToggle) {
- return false;
- }
-
- // if shown now
- if (NavToggle.firstChild.data == NavigationBarHide) {
- for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
- if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
- NavChild.style.display = 'none';
- }
- }
- NavToggle.firstChild.data = NavigationBarShow;
-
- // if hidden now
- } else if (NavToggle.firstChild.data == NavigationBarShow) {
- for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
- if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
- NavChild.style.display = 'block';
- }
- }
- NavToggle.firstChild.data = NavigationBarHide;
- }
-}
-
-// adds show/hide-button to navigation bars
-function createNavigationBarToggleButton(){
- var indexNavigationBar = 0;
- // iterate over all < div >-elements
- var divs = document.getElementsByTagName(\"div\");
- for (var i = 0; NavFrame = divs[i]; i++) {
- // if found a navigation bar
- if (hasClass(NavFrame, \"NavFrame\")) {
-
- indexNavigationBar++;
- var NavToggle = document.createElement(\"a\");
- NavToggle.className = 'NavToggle';
- NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
- NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
-
- var isCollapsed = hasClass( NavFrame, \"collapsed\" );
- /*
- * Check if any children are already hidden. This loop is here for backwards compatibility:
- * the old way of making NavFrames start out collapsed was to manually add style=\"display:none\"
- * to all the NavPic/NavContent elements. Since this was bad for accessibility (no way to make
- * the content visible without JavaScript support), the new recommended way is to add the class
- * \"collapsed\" to the NavFrame itself, just like with collapsible tables.
- */
- for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
- if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
- if ( NavChild.style.display == 'none' ) {
- isCollapsed = true;
- }
- }
- }
- if (isCollapsed) {
- for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
- if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
- NavChild.style.display = 'none';
- }
- }
- }
- var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
- NavToggle.appendChild(NavToggleText);
-
- // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
- for(var j=0; j < NavFrame.childNodes.length; j++) {
- if (hasClass(NavFrame.childNodes[j], \"NavHead\")) {
- NavToggle.style.color = NavFrame.childNodes[j].style.color;
- NavFrame.childNodes[j].appendChild(NavToggle);
- }
- }
- NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
- }
- }
-}
-
-\$( createNavigationBarToggleButton );
-
-
-/** Main Page layout fixes *********************************************************
- *
- * Description: Adds an additional link to the complete list of languages available.
- * Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]]
- */
-
-if (wgPageName == 'Main_Page' || wgPageName == 'Talk:Main_Page') {
- \$(function () {
- mw.util.addPortletLink('p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias',
- 'Complete list', 'interwiki-completelist', 'Complete list of Wikipedias');
- });
-}
-
-
-/** Table sorting fixes ************************************************
- *
- * Description: Disables code in table sorting routine to set classes on even/odd rows
- * Maintainers: [[User:Random832]]
- */
-ts_alternate_row_colors = false;
-
-
-/***** uploadwizard_newusers ********
- * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]
- *
- * Maintainers: [[User:Krimpet]]
- */
-function uploadwizard_newusers() {
- if (wgNamespaceNumber == 4 && wgTitle == \"Upload\" && wgAction == \"view\") {
- var oldDiv = document.getElementById(\"autoconfirmedusers\"),
- newDiv = document.getElementById(\"newusers\");
- if (oldDiv && newDiv) {
- if (typeof wgUserGroups == \"object\" && wgUserGroups) {
- for (i = 0; i < wgUserGroups.length; i++) {
- if (wgUserGroups[i] == \"autoconfirmed\") {
- oldDiv.style.display = \"block\";
- newDiv.style.display = \"none\";
- return;
- }
- }
- }
- oldDiv.style.display = \"none\";
- newDiv.style.display = \"block\";
- return;
- }
- }
-}
-\$(uploadwizard_newusers);
-
-
-/** IPv6 AAAA connectivity testing
-
-var __ipv6wwwtest_factor = 100;
-var __ipv6wwwtest_done = 0;
-if ((wgServer != \"https://secure.wikimedia.org\") && (Math.floor(Math.random()*__ipv6wwwtest_factor)==42)) {
- importScript(\"MediaWiki:Common.js/IPv6.js\");
-}
-**/
-
-/** Magic editintros ****************************************************
- *
- * Description: Adds editintros on disambiguation pages and BLP pages.
- * Maintainers: [[User:RockMFR]]
- */
-
-function addEditIntro( name ) {
- \$( '.editsection, #ca-edit' ).find( 'a' ).each( function( i, el ) {
- el.href = \$(this).attr(\"href\") + '&editintro=' + name;
- });
-}
-
-if (wgNamespaceNumber === 0) {
- \$(function(){
- if (document.getElementById('disambigbox')) {
- addEditIntro('Template:Disambig_editintro');
- }
- });
-
- \$(function(){
- var cats = document.getElementById('mw-normal-catlinks');
- if (!cats) {
- return;
- }
- cats = cats.getElementsByTagName('a');
- for (var i = 0; i < cats.length; i++) {
- if (cats[i].title == 'Category:Living people' || cats[i].title == 'Category:Possibly living people') {
- addEditIntro('Template:BLP_editintro');
- break;
- }
- }
- });
-}
-
-/**
- * Description: Stay on the secure server as much as possible
- * Maintainers: [[User:TheDJ]]
- */
-if ( mw.config.get('wgServer') == 'https://secure.wikimedia.org' ) {
- /* Old secure server */
- importScript( 'MediaWiki:Common.js/secure.js');
-} else if( document.location && document.location.protocol && document.location.protocol == \"https:\" ) {
- /* New secure servers */
- importScript('MediaWiki:Common.js/secure new.js');
-}
-
-/**
- * Description: Fix the toggle for Mobile view
- * https://bugzilla.wikimedia.org/show_bug.cgi?id=38009
- * Maintainer: [[User:TheDJ]]
- */
-mw.loader.using( 'jquery.cookie', function() {
- \$('a[href\$=\"toggle_view_mobile\"]').click(function(){
- document.cookie = 'stopMobileRedirect=false; domain=.wikipedia.org;'
- + 'path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT;'
- });
-});
-
-/* End of mw.loader.using callback */
-} );
-/* DO NOT ADD CODE BELOW THIS LINE */",
+'common.js' => '/* Any JavaScript here will be loaded for all users on every page load. */',
# Metadata
'notacceptable' => "formatê ma'lumati no peşkeşwanê wikiyi nêweniyeno.",
'minutes' => 'verdê {{PLURAL:$1|$1 daka|$1 daka}}',
'hours' => 'Verdê {{PLURAL:$1|$1 seata|$1 seata}}',
'days' => 'Verdê {{PLURAL:$1|$1 rocan|$1 rocan}}',
+'months' => '{{PLURAL:$1|aşme|$1 aşmi}}',
+'years' => '{{PLURAL:$1|$1 serre|$1 serri}}',
'ago' => 'Verdê $1',
'just-now' => 'Hema newke',
'monthsall' => 'pêro',
'limitall' => 'pêro',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Adresê e-posta tesdiq ker',
'confirmemail_noemail' => 'Yew emaîlê tu raştîyê çin o ke [[Special:Preferences|tercihê karberî]] ayar bike.',
'confirmemail_text' => 'Qey gurweyayışê e-postayê wikiyi gani veror e-postayê şıma araşt bıbo.
'loginlanguagelabel' => 'Rěc: $1',
'suspicious-userlogout' => 'Twójo póžedanje za wótzjawjenim jo se wótpokazało, dokulaž zda se, až jo se pósłało pśez wobškóźony wobglědowak abo pufrowański proksy',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Njeznata zmólka w PHP-funkciji mail()',
'user-mail-no-addy' => 'Jo se wopytało, e-mail bźez e-mailoweje adrese pósłaś',
'user-mail-no-body' => 'Jo se wopytało, e-mail bźez teksta abo z pśekrotkim tekstom pósłaś',
'prefs-displaywatchlist' => 'Zwobraznjowańske opcije',
'prefs-diffs' => 'Rozdźěle',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Zda se, až e-mailowa adresa jo płaśiwa',
'email-address-validity-invalid' => 'Zapódaj płaśiwu e-mailowu adresu',
'disambiguations-text' => 'Slědujuce boki wopśimuju nanejmjenjej jaden wótkaz k bokoju rozjasnjenja zapśimjeśow. Wóne by dejali město togo ku gódnjejšemu bokoju wótkazaś.<br />
Maju bok za bok rozjasnjenja zapśimjeśow, gaž wužywa pśedłogu, na kótaruž wótkazujo se wót [[MediaWiki:Disambiguationspage]].',
+'pageswithprop' => 'Boki z kakosću boka',
+'pageswithprop-text' => 'Toś ten bok nalicyjo boki, kótarež wužywaju wěstu kakosć boka.',
+'pageswithprop-prop' => 'Mě kakosći:',
+
'doubleredirects' => 'Dwójne dalejpósrědnjenja',
'doubleredirectstext' => 'Toś ten bok nalicujo boki, kótarež dalej pósrědnjaju na druge dalejpósrědnjenja.
Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a teke na cel drugego dalejpósrědnjenja, což jo w normalnem paźe "napšawdny" celowy bok, na kótaryž by mógło prědne dalejpósrědnjenje pokazaś. <del>Pśešmarnjone</del> zapiski su južo wobstarane.',
'listgrouprights-addgroup-self-all' => 'Móžo wše kupki swójskemu kontoju pśidaś',
'listgrouprights-removegroup-self-all' => 'Móžo wše kupki ze swójskego konta wótpóraś',
-# E-mail user
+# Email user
'mailnologin' => 'Njejo móžno e-mailku pósłaś.',
'mailnologintext' => 'Dejš [[Special:UserLogin|pśizjawjony]] byś a płaśiwu e-mailowu adresu w swójich [[Special:Preferences|nastajenjach]] měś, aby drugim wužywarjam e-mail pósłał.',
'emailuser' => 'Toś tomu wužywarjeju e-mail pósłaś',
'monthsall' => 'wšykne',
'limitall' => 'wšykne',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'E-mailowu adresu wobkšuśiś.',
'confirmemail_noemail' => 'W swójich [[Special:Preferences|nastajenjach]] njejsy płaśecu e-mailowu adresu zapódał.',
'confirmemail_text' => '{{SITENAME}} pomina, až wobkšuśijoš swóju e-mailowu adresu, nježlic až móžoš e-mailowe funkcije wužywaś. Tłocyš-lic na tłocatko, dostanjoš e-mailku, w kótarejž jo wótkaz z wobkšuśenskim gronidłom. Tłocenje na wótkaz wobkšuśijo, až twója e-mailowa adresa jo korektna.',
'duration-centuries' => '$1 {{PLURAL:$1|stolěśe|stolěśi|stolěśa|stolěśow}}',
'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysaca|lěttysace|lěttysacow}}',
+# Unknown messages
+'pageswithprop-legend' => 'Boki z kakosću boka',
+'pageswithprop-submit' => 'Wótpósłaś',
);
*/
/**
- * Fallback language, used for all unspecified messages and behaviour. This
+ * Fallback language, used for all unspecified messages and behavior. This
* is English by default, for all files other than this one.
*
* Do NOT set this to false in any other message file! Leave the line out to
/**
* Magic words
- * Customisable syntax for wikitext and elsewhere.
+ * Customizable syntax for wikitext and elsewhere.
*
* IDs must be valid identifiers, they cannot contain hyphens.
* CASE is 0 to match all case variants, 1 for case-sensitive
'raw' => array( 0, 'RAW:' ),
'displaytitle' => array( 1, 'DISPLAYTITLE' ),
'rawsuffix' => array( 1, 'R' ),
+ 'nocommafysuffix' => array( 0, 'NOSEP' ),
'newsectionlink' => array( 1, '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( 1, '__NONEWSECTIONLINK__' ),
'currentversion' => array( 1, 'CURRENTVERSION' ),
'Myuploads' => array( 'MyUploads' ),
'Newimages' => array( 'NewFiles', 'NewImages' ),
'Newpages' => array( 'NewPages' ),
+ 'PagesWithProp' => array( 'PagesWithProp', 'Pageswithprop', 'PagesByProp', 'Pagesbyprop' ),
'PasswordReset' => array( 'PasswordReset' ),
'PermanentLink' => array( 'PermanentLink', 'PermaLink' ),
'Popularpages' => array( 'PopularPages' ),
/*
The sidebar for MonoBook is generated from this message, lines that do not
begin with * or ** are discarded, furthermore lines that do begin with ** and
-do not contain | are also discarded, but do not depend on this behaviour for
+do not contain | are also discarded, but do not depend on this behavior for
future releases. Also note that since each list value is wrapped in a unique
XHTML id it should only appear once and include characters that are legal
XHTML id names.
'tog-previewontop' => 'Show preview before edit box',
'tog-previewonfirst' => 'Show preview on first edit',
'tog-nocache' => 'Disable browser page caching',
-'tog-enotifwatchlistpages' => 'E-mail me when a page or file on my watchlist is changed',
-'tog-enotifusertalkpages' => 'E-mail me when my user talk page is changed',
-'tog-enotifminoredits' => 'E-mail me also for minor edits of pages and files',
-'tog-enotifrevealaddr' => 'Reveal my e-mail address in notification e-mails',
+'tog-enotifwatchlistpages' => 'Email me when a page or file on my watchlist is changed',
+'tog-enotifusertalkpages' => 'Email me when my user talk page is changed',
+'tog-enotifminoredits' => 'Email me also for minor edits of pages and files',
+'tog-enotifrevealaddr' => 'Reveal my email address in notification emails',
'tog-shownumberswatching' => 'Show the number of watching users',
'tog-oldsig' => 'Existing signature:',
'tog-fancysig' => 'Treat signature as wikitext (without an automatic link)',
'tog-watchlisthideliu' => 'Hide edits by logged in users from the watchlist',
'tog-watchlisthideanons' => 'Hide edits by anonymous users from the watchlist',
'tog-watchlisthidepatrolled' => 'Hide patrolled edits from the watchlist',
-'tog-ccmeonemails' => 'Send me copies of e-mails I send to other users',
+'tog-ccmeonemails' => 'Send me copies of emails I send to other users',
'tog-diffonly' => 'Do not show page content below diffs',
'tog-showhiddencats' => 'Show hidden categories',
'tog-noconvertlink' => 'Disable link title conversion', # only translate this message to other languages if you have to change it
'gotaccount' => 'Already have an account? $1.',
'gotaccountlink' => 'Log in',
'userlogin-resetlink' => 'Forgotten your login details?',
-'createaccountmail' => 'Use a temporary random password and send it to the e-mail address specified below',
+'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
'createaccountreason' => 'Reason:',
'badretype' => 'The passwords you entered do not match.',
'userexists' => 'Username entered already in use.
'passwordtooshort' => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
'password-name-match' => 'Your password must be different from your username.',
'password-login-forbidden' => 'The use of this username and password has been forbidden.',
-'mailmypassword' => 'E-mail new password',
+'mailmypassword' => 'Email new password',
'passwordremindertitle' => 'New temporary password for {{SITENAME}}',
'passwordremindertext' => 'Someone (probably you, from IP address $1) requested a new
password for {{SITENAME}} ($4). A temporary password for user
If someone else made this request, or if you have remembered your password,
and you no longer wish to change it, you may ignore this message and
continue using your old password.',
-'noemail' => 'There is no e-mail address recorded for user "$1".',
-'noemailcreate' => 'You need to provide a valid e-mail address',
-'passwordsent' => 'A new password has been sent to the e-mail address registered for "$1".
+'noemail' => 'There is no email address recorded for user "$1".',
+'noemailcreate' => 'You need to provide a valid email address',
+'passwordsent' => 'A new password has been sent to the email address registered for "$1".
Please log in again after you receive it.',
'blocked-mailpassword' => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
-'eauthentsent' => 'A confirmation e-mail has been sent to the nominated e-mail address.
-Before any other e-mail is sent to the account, you will have to follow the instructions in the e-mail, to confirm that the account is actually yours.',
+'eauthentsent' => 'A confirmation email has been sent to the nominated email address.
+Before any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.',
'throttled-mailpassword' => 'A password reminder has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
To prevent abuse, only one password reminder will be sent per {{PLURAL:$1|hour|$1 hours}}.',
'loginstart' => '', # do not translate or duplicate this message to other languages
'mailerror' => 'Error sending mail: $1',
'acct_creation_throttle_hit' => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
As a result, visitors using this IP address cannot create any more accounts at the moment.',
-'emailauthenticated' => 'Your e-mail address was authenticated on $2 at $3.',
-'emailnotauthenticated' => 'Your e-mail address is not yet authenticated.
-No e-mail will be sent for any of the following features.',
-'noemailprefs' => 'Specify an e-mail address in your preferences for these features to work.',
-'emailconfirmlink' => 'Confirm your e-mail address',
-'invalidemailaddress' => 'The e-mail address cannot be accepted as it appears to have an invalid format.
+'emailauthenticated' => 'Your email address was authenticated on $2 at $3.',
+'emailnotauthenticated' => 'Your email address is not yet authenticated.
+No email will be sent for any of the following features.',
+'noemailprefs' => 'Specify an email address in your preferences for these features to work.',
+'emailconfirmlink' => 'Confirm your email address',
+'invalidemailaddress' => 'The email address cannot be accepted as it appears to have an invalid format.
Please enter a well-formatted address or empty that field.',
-'cannotchangeemail' => 'Account e-mail addresses cannot be changed on this wiki.',
-'emaildisabled' => 'This site cannot send e-mails.',
+'cannotchangeemail' => 'Account email addresses cannot be changed on this wiki.',
+'emaildisabled' => 'This site cannot send emails.',
'accountcreated' => 'Account created',
'accountcreatedtext' => 'The user account for $1 has been created.',
'createaccount-title' => 'Account creation for {{SITENAME}}',
-'createaccount-text' => 'Someone created an account for your e-mail address on {{SITENAME}} ($4) named "$2", with password "$3".
+'createaccount-text' => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
You should log in and change your password now.
You may ignore this message, if this account was created in error.',
* {{#language:nl}}|nl', # do not translate or duplicate this message to other languages
'suspicious-userlogout' => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
-# E-mail sending
+# Email sending
'pear-mail-error' => '$1', # do not translate or duplicate this message to other languages
'php-mail-error' => '$1', # do not translate or duplicate this message to other languages
'php-mail-error-unknown' => "Unknown error in PHP's mail() function.",
-'user-mail-no-addy' => 'Tried to send e-mail without an e-mail address.',
-'user-mail-no-body' => 'Tried to send e-mail with an empty or unreasonably short body.',
+'user-mail-no-addy' => 'Tried to send email without an email address.',
+'user-mail-no-body' => 'Tried to send email with an empty or unreasonably short body.',
# Change password dialog
'resetpass' => 'Change password',
-'resetpass_announce' => 'You logged in with a temporary e-mailed code.
+'resetpass_announce' => 'You logged in with a temporary emailed code.
To finish logging in, you must set a new password here:',
'resetpass_text' => '<!-- Add text here -->', # only translate this message to other languages if you have to change it
'resetpass_header' => 'Change account password',
# Special:PasswordReset
'passwordreset' => 'Reset password',
-'passwordreset-text' => 'Complete this form to receive an e-mail reminder of your account details.',
+'passwordreset-text' => 'Complete this form to receive an email reminder of your account details.',
'passwordreset-legend' => 'Reset password',
'passwordreset-disabled' => 'Password resets have been disabled on this wiki.',
'passwordreset-pretext' => '{{PLURAL:$1||Enter one of the pieces of data below}}',
'passwordreset-username' => 'Username:',
'passwordreset-domain' => 'Domain:',
-'passwordreset-capture' => 'View the resulting e-mail?',
-'passwordreset-capture-help' => 'If you check this box, the e-mail (with the temporary password) will be shown to you as well as being sent to the user.',
-'passwordreset-email' => 'E-mail address:',
+'passwordreset-capture' => 'View the resulting email?',
+'passwordreset-capture-help' => 'If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.',
+'passwordreset-email' => 'Email address:',
'passwordreset-emailtitle' => 'Account details on {{SITENAME}}',
'passwordreset-emailtext-ip' => 'Someone (probably you, from IP address $1) requested a reminder of your
account details for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}
-associated with this e-mail address:
+associated with this email address:
$2
wish to change it, you may ignore this message and continue using your old
password.',
'passwordreset-emailtext-user' => 'User $1 on {{SITENAME}} requested a reminder of your account details for {{SITENAME}}
-($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this e-mail address:
+($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:
$2
password.',
'passwordreset-emailelement' => 'Username: $1
Temporary password: $2',
-'passwordreset-emailsent' => 'A reminder e-mail has been sent.',
-'passwordreset-emailsent-capture' => 'A reminder e-mail has been sent, which is shown below.',
-'passwordreset-emailerror-capture' => 'A reminder e-mail was generated, which is shown below, but sending it to the user failed: $1',
+'passwordreset-emailsent' => 'A reminder email has been sent.',
+'passwordreset-emailsent-capture' => 'A reminder email has been sent, which is shown below.',
+'passwordreset-emailerror-capture' => 'A reminder email was generated, which is shown below, but sending it to the user failed: $1',
# Special:ChangeEmail
-'changeemail' => 'Change e-mail address',
+'changeemail' => 'Change email address',
'changeemail-summary' => '', # do not translate or duplicate this message to other languages
-'changeemail-header' => 'Change account e-mail address',
-'changeemail-text' => 'Complete this form to change your e-mail address. You will need to enter your password to confirm this change.',
+'changeemail-header' => 'Change account email address',
+'changeemail-text' => 'Complete this form to change your email address. You will need to enter your password to confirm this change.',
'changeemail-no-info' => 'You must be logged in to access this page directly.',
-'changeemail-oldemail' => 'Current e-mail address:',
-'changeemail-newemail' => 'New e-mail address:',
+'changeemail-oldemail' => 'Current email address:',
+'changeemail-newemail' => 'New email address:',
'changeemail-none' => '(none)',
'changeemail-password' => 'Your {{SITENAME}} password:',
-'changeemail-submit' => 'Change e-mail',
+'changeemail-submit' => 'Change email',
'changeemail-cancel' => 'Cancel',
# Edit page toolbar
* Intended blockee: $7
You can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.
-You cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
+You cannot use the 'email this user' feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
Your current IP address is $3, and the block ID is #$5.
Please include all above details in any queries you make.",
'autoblockedtext' => 'Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.
You may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.
-Note that you may not use the "e-mail this user" feature unless you have a valid e-mail address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.
+Note that you may not use the "email this user" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.
Your current IP address is $3, and the block ID is #$5.
Please include all above details in any queries you make.',
'blockednoreason' => 'no reason given',
'whitelistedittext' => 'You have to $1 to edit pages.',
-'confirmedittext' => 'You must confirm your e-mail address before editing pages.
-Please set and validate your e-mail address through your [[Special:Preferences|user preferences]].',
+'confirmedittext' => 'You must confirm your email address before editing pages.
+Please set and validate your email address through your [[Special:Preferences|user preferences]].',
'nosuchsectiontitle' => 'Cannot find section',
'nosuchsectiontext' => 'You tried to edit a section that does not exist.
It may have been moved or deleted while you were viewing the page.',
'loginreqtitle' => 'Login required',
'loginreqlink' => 'log in',
'loginreqpagetext' => 'You must $1 to view other pages.',
-'accmailtitle' => 'Password sent.',
+'accmailtitle' => 'Password sent',
'accmailtext' => "A randomly generated password for [[User talk:$1|$1]] has been sent to $2.
The password for this new account can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
'showingresults' => "Showing below up to {{PLURAL:$1|'''1''' result|'''$1''' results}} starting with #'''$2'''.",
'showingresultsnum' => "Showing below {{PLURAL:$3|'''1''' result|'''$3''' results}} starting with #'''$2'''.",
'showingresultsheader' => "{{PLURAL:$5|Result '''$1''' of '''$3'''|Results '''$1 - $2''' of '''$3'''}} for '''$4'''",
-'nonefound' => "'''Note''': Only some namespaces are searched by default.
+'nonefound' => "'''Note:''' Only some namespaces are searched by default.
Try prefixing your query with ''all:'' to search all content (including talk pages, templates, etc), or use the desired namespace as prefix.",
'search-nonefound' => 'There were no results matching the query.',
'powersearch' => 'Advanced search',
'prefs-watchlist-token' => 'Watchlist token:',
'prefs-misc' => 'Misc',
'prefs-resetpass' => 'Change password',
-'prefs-changeemail' => 'Change e-mail address',
-'prefs-setemail' => 'Set an e-mail address',
-'prefs-email' => 'E-mail options',
+'prefs-changeemail' => 'Change email address',
+'prefs-setemail' => 'Set an email address',
+'prefs-email' => 'Email options',
'prefs-rendering' => 'Appearance',
'saveprefs' => 'Save',
'resetprefs' => 'Clear unsaved changes',
'timezoneregion-europe' => 'Europe',
'timezoneregion-indian' => 'Indian Ocean',
'timezoneregion-pacific' => 'Pacific Ocean',
-'allowemail' => 'Enable e-mail from other users',
+'allowemail' => 'Enable email from other users',
'prefs-searchoptions' => 'Search',
'prefs-namespaces' => 'Namespaces',
'defaultns' => 'Otherwise search in these namespaces:',
'prefs-common-css-js' => 'Shared CSS/JavaScript for all skins:',
'prefs-reset-intro' => 'You can use this page to reset your preferences to the site defaults.
This cannot be undone.',
-'prefs-emailconfirm-label' => 'E-mail confirmation:',
+'prefs-emailconfirm-label' => 'Email confirmation:',
'prefs-textboxsize' => 'Size of editing window',
-'youremail' => 'E-mail:',
+'youremail' => 'Email:',
'username' => '{{GENDER:$1|Username}}:',
'uid' => '{{GENDER:$1|User}} ID:',
'prefs-memberingroups' => '{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:',
'gender-female' => 'Female',
'prefs-help-gender' => 'Optional: Used for gender-correct addressing by the software.
This information will be public.',
-'email' => 'E-mail',
+'email' => 'Email',
'prefs-help-realname' => 'Real name is optional.
If you choose to provide it, this will be used for giving you attribution for your work.',
-'prefs-help-email' => 'E-mail address is optional, but is needed for password resets, should you forget your password.',
-'prefs-help-email-others' => 'You can also choose to let others contact you by e-mail through a link on your user or talk page.
-Your e-mail address is not revealed when other users contact you.',
-'prefs-help-email-required' => 'E-mail address is required.',
+'prefs-help-email' => 'Email address is optional, but is needed for password resets, should you forget your password.',
+'prefs-help-email-others' => 'You can also choose to let others contact you by email through a link on your user or talk page.
+Your email address is not revealed when other users contact you.',
+'prefs-help-email-required' => 'Email address is required.',
'prefs-info' => 'Basic information',
'prefs-i18n' => 'Internationalisation',
'prefs-signature' => 'Signature',
'prefs-displaywatchlist' => 'Display options',
'prefs-diffs' => 'Diffs',
-# User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'E-mail address appears valid',
-'email-address-validity-invalid' => 'Enter a valid e-mail address',
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Email address appears valid',
+'email-address-validity-invalid' => 'Enter a valid email address',
# User rights
'userrights' => 'User rights management',
'right-suppressrevision' => 'Review and restore revisions hidden from administrators',
'right-suppressionlog' => 'View private logs',
'right-block' => 'Block other users from editing',
-'right-blockemail' => 'Block a user from sending e-mail',
+'right-blockemail' => 'Block a user from sending email',
'right-hideuser' => 'Block a username, hiding it from the public',
'right-ipblock-exempt' => 'Bypass IP blocks, auto-blocks and range blocks',
'right-proxyunbannable' => 'Bypass automatic blocks of proxies',
'right-userrights-interwiki' => 'Edit user rights of users on other wikis',
'right-siteadmin' => 'Lock and unlock the database',
'right-override-export-depth' => 'Export pages including linked pages up to a depth of 5',
-'right-sendemail' => 'Send e-mail to other users',
-'right-passwordreset' => 'View password reset e-mails',
+'right-sendemail' => 'Send email to other users',
+'right-passwordreset' => 'View password reset emails',
# Special:Log/newusers
'newuserlogpage' => 'User creation log',
'action-userrights' => 'edit all user rights',
'action-userrights-interwiki' => 'edit user rights of users on other wikis',
'action-siteadmin' => 'lock or unlock the database',
-'action-sendemail' => 'send e-mails',
+'action-sendemail' => 'send emails',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|change|changes}}',
They may have to link to a more appropriate page instead.<br />
A page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pages with a page property',
+'pageswithprop-summary' => '', # do not translate or duplicate this message to other languages
+'pageswithprop-legend' => 'Pages with a page property',
+'pageswithprop-text' => 'This page lists pages that use a particular page property.',
+'pageswithprop-prop' => 'Property name:',
+'pageswithprop-submit' => 'Go',
+
'doubleredirects' => 'Double redirects',
'doubleredirects-summary' => '', # do not translate or duplicate this message to other languages
'doubleredirectstext' => 'This page lists pages that redirect to other redirect pages.
'listgrouprights-addgroup-self-all' => 'Add all groups to own account',
'listgrouprights-removegroup-self-all' => 'Remove all groups from own account',
-# E-mail user
+# Email user
'mailnologin' => 'No send address',
-'mailnologintext' => 'You must be [[Special:UserLogin|logged in]] and have a valid e-mail address in your [[Special:Preferences|preferences]] to send e-mail to other users.',
-'emailuser' => 'E-mail this user',
-'emailuser-title-target' => 'E-mail this {{GENDER:$1|user}}',
-'emailuser-title-notarget' => 'E-mail user',
+'mailnologintext' => 'You must be [[Special:UserLogin|logged in]] and have a valid email address in your [[Special:Preferences|preferences]] to send email to other users.',
+'emailuser' => 'Email this user',
+'emailuser-title-target' => 'Email this {{GENDER:$1|user}}',
+'emailuser-title-notarget' => 'Email user',
'emailuser-summary' => '', # do not translate or duplicate this message to other languages
-'emailpage' => 'E-mail user',
-'emailpagetext' => 'You can use the form below to send an e-mail message to this {{GENDER:$1|user}}.
-The e-mail address you entered in [[Special:Preferences|your user preferences]] will appear as the "From" address of the e-mail, so the recipient will be able to reply directly to you.',
+'emailpage' => 'Email user',
+'emailpagetext' => 'You can use the form below to send an email message to this {{GENDER:$1|user}}.
+The email address you entered in [[Special:Preferences|your user preferences]] will appear as the "From" address of the email, so the recipient will be able to reply directly to you.',
'usermailererror' => 'Mail object returned error:',
-'defemailsubject' => '{{SITENAME}} e-mail from user "$1"',
-'usermaildisabled' => 'User e-mail disabled',
-'usermaildisabledtext' => 'You cannot send e-mail to other users on this wiki',
-'noemailtitle' => 'No e-mail address',
-'noemailtext' => 'This user has not specified a valid e-mail address.',
-'nowikiemailtitle' => 'No e-mail allowed',
-'nowikiemailtext' => 'This user has chosen not to receive e-mail from other users.',
+'defemailsubject' => '{{SITENAME}} email from user "$1"',
+'usermaildisabled' => 'User email disabled',
+'usermaildisabledtext' => 'You cannot send email to other users on this wiki',
+'noemailtitle' => 'No email address',
+'noemailtext' => 'This user has not specified a valid email address.',
+'nowikiemailtitle' => 'No email allowed',
+'nowikiemailtext' => 'This user has chosen not to receive email from other users.',
'emailnotarget' => 'Non-existent or invalid username for recipient.',
'emailtarget' => 'Enter username of recipient',
'emailusername' => 'Username:',
'emailusernamesubmit' => 'Submit',
-'email-legend' => 'Send an e-mail to another {{SITENAME}} user',
+'email-legend' => 'Send an email to another {{SITENAME}} user',
'emailfrom' => 'From:',
'emailto' => 'To:',
'emailsubject' => 'Subject:',
'emailmessage' => 'Message:',
'emailsend' => 'Send',
-'emailccme' => 'E-mail me a copy of my message.',
+'emailccme' => 'Email me a copy of my message.',
'emailccsubject' => 'Copy of your message to $1: $2',
-'emailsent' => 'E-mail sent',
-'emailsenttext' => 'Your e-mail message has been sent.',
-'emailuserfooter' => 'This e-mail was sent by $1 to $2 by the "E-mail user" function at {{SITENAME}}.',
+'emailsent' => 'Email sent',
+'emailsenttext' => 'Your email message has been sent.',
+'emailuserfooter' => 'This email was sent by $1 to $2 by the "Email user" function at {{SITENAME}}.',
# User Messenger
'usermessage-summary' => 'Leaving system message.',
'notvisiblerev' => 'The last revision by a different user has been deleted',
'watchnochange' => 'None of your watched items were edited in the time period displayed.',
'watchlist-details' => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
-'wlheader-enotif' => '* E-mail notification is enabled.',
+'wlheader-enotif' => '* Email notification is enabled.',
'wlheader-showupdated' => "* Pages that have been changed since you last visited them are shown in '''bold'''",
'watchmethod-recent' => 'checking recent edits for watched pages',
'watchmethod-list' => 'checking watched pages for recent edits',
Your friendly {{SITENAME}} notification system
--
-To change your e-mail notification settings, visit
+To change your email notification settings, visit
{{canonicalurl:{{#special:Preferences}}}}
To change your watchlist settings, visit
** Removing content from pages
** Spamming links to external sites
** Inserting nonsense/gibberish into pages
-** Intimidating behaviour/harassment
+** Intimidating behavior/harassment
** Abusing multiple accounts
** Unacceptable username',
'ipb-hardblock' => 'Prevent logged-in users from editing from this IP address',
'ipbcreateaccount' => 'Prevent account creation',
-'ipbemailban' => 'Prevent user from sending e-mail',
+'ipbemailban' => 'Prevent user from sending email',
'ipbenableautoblock' => 'Automatically block the last IP address used by this user, and any subsequent IP addresses they try to edit from',
'ipbsubmit' => 'Block this user',
'ipbother' => 'Other time:',
'unblockip' => 'Unblock user',
'unblockiptext' => 'Use the form below to restore write access to a previously blocked IP address or username.',
'ipusubmit' => 'Remove this block',
-'unblocked' => '[[User:$1|$1]] has been unblocked',
-'unblocked-range' => '$1 has been unblocked',
-'unblocked-id' => 'Block $1 has been removed',
+'unblocked' => '[[User:$1|$1]] has been unblocked.',
+'unblocked-range' => '$1 has been unblocked.',
+'unblocked-id' => 'Block $1 has been removed.',
'blocklist' => 'Blocked users',
'ipblocklist' => 'Blocked users',
'ipblocklist-legend' => 'Find a blocked user',
'anononlyblock' => 'anon. only',
'noautoblockblock' => 'autoblock disabled',
'createaccountblock' => 'account creation disabled',
-'emailblock' => 'e-mail disabled',
+'emailblock' => 'email disabled',
'blocklist-nousertalk' => 'cannot edit own talk page',
'ipblocklist-empty' => 'The block list is empty.',
'ipblocklist-no-results' => 'The requested IP address or username is not blocked.',
'unblocklink' => 'unblock',
'change-blocklink' => 'change block',
'contribslink' => 'contribs',
-'emaillink' => 'send e-mail',
+'emaillink' => 'send email',
'autoblocker' => 'Autoblocked because your IP address has been recently used by "[[User:$1|$1]]".
The reason given for $1\'s block is "\'\'$2\'\'"',
'blocklogpage' => 'Block log',
'block-log-flags-anononly' => 'anonymous users only',
'block-log-flags-nocreate' => 'account creation disabled',
'block-log-flags-noautoblock' => 'autoblock disabled',
-'block-log-flags-noemail' => 'e-mail disabled',
+'block-log-flags-noemail' => 'email disabled',
'block-log-flags-nousertalk' => 'cannot edit own talk page',
'block-log-flags-angry-autoblock' => 'enhanced autoblock enabled',
'block-log-flags-hiddenname' => 'username hidden',
Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
'allmessagesnotsupportedDB' => "This page cannot be used because '''\$wgUseDatabaseMessages''' has been disabled.",
'allmessages-filter-legend' => 'Filter',
-'allmessages-filter' => 'Filter by customisation state:',
+'allmessages-filter' => 'Filter by customization state:',
'allmessages-filter-unmodified' => 'Unmodified',
'allmessages-filter-all' => 'All',
'allmessages-filter-modified' => 'Modified',
'tooltip-feed-rss' => 'RSS feed for this page',
'tooltip-feed-atom' => 'Atom feed for this page',
'tooltip-t-contributions' => 'A list of contributions of this user',
-'tooltip-t-emailuser' => 'Send an e-mail to this user',
+'tooltip-t-emailuser' => 'Send an email to this user',
'tooltip-t-upload' => 'Upload files',
'tooltip-t-specialpages' => 'A list of all special pages',
'tooltip-t-print' => 'Printable version of this page',
'nextdiff' => 'Newer edit →',
# Media information
-'mediawarning' => "'''Warning''': This file type may contain malicious code.
+'mediawarning' => "'''Warning:''' This file type may contain malicious code.
By executing it, your system may be compromised.",
'imagemaxsize' => "Image size limit:<br />''(for file description pages)''",
'thumbsize' => 'Thumbnail size:',
'exif-iimcategory-evn' => 'Environment',
'exif-iimcategory-hth' => 'Health',
'exif-iimcategory-hum' => 'Human interest',
-'exif-iimcategory-lab' => 'Labour',
+'exif-iimcategory-lab' => 'Labor',
'exif-iimcategory-lif' => 'Lifestyle and leisure',
'exif-iimcategory-pol' => 'Politics',
'exif-iimcategory-rel' => 'Religion and belief',
'monthsall' => 'all',
'limitall' => 'all',
-# E-mail address confirmation
-'confirmemail' => 'Confirm e-mail address',
-'confirmemail_noemail' => 'You do not have a valid e-mail address set in your [[Special:Preferences|user preferences]].',
-'confirmemail_text' => '{{SITENAME}} requires that you validate your e-mail address before using e-mail features.
+# Email address confirmation
+'confirmemail' => 'Confirm email address',
+'confirmemail_noemail' => 'You do not have a valid email address set in your [[Special:Preferences|user preferences]].',
+'confirmemail_text' => '{{SITENAME}} requires that you validate your email address before using email features.
Activate the button below to send a confirmation mail to your address.
The mail will include a link containing a code;
-load the link in your browser to confirm that your e-mail address is valid.',
-'confirmemail_pending' => 'A confirmation code has already been e-mailed to you;
+load the link in your browser to confirm that your email address is valid.',
+'confirmemail_pending' => 'A confirmation code has already been emailed to you;
if you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.',
'confirmemail_send' => 'Mail a confirmation code',
-'confirmemail_sent' => 'Confirmation e-mail sent.',
-'confirmemail_oncreate' => 'A confirmation code was sent to your e-mail address.
-This code is not required to log in, but you will need to provide it before enabling any e-mail-based features in the wiki.',
+'confirmemail_sent' => 'Confirmation email sent.',
+'confirmemail_oncreate' => 'A confirmation code was sent to your email address.
+This code is not required to log in, but you will need to provide it before enabling any email-based features in the wiki.',
'confirmemail_sendfailed' => '{{SITENAME}} could not send your confirmation mail.
-Please check your e-mail address for invalid characters.
+Please check your email address for invalid characters.
Mailer returned: $1',
'confirmemail_invalid' => 'Invalid confirmation code.
The code may have expired.',
-'confirmemail_needlogin' => 'You need to $1 to confirm your e-mail address.',
-'confirmemail_success' => 'Your e-mail address has been confirmed.
+'confirmemail_needlogin' => 'You need to $1 to confirm your email address.',
+'confirmemail_success' => 'Your email address has been confirmed.
You may now [[Special:UserLogin|log in]] and enjoy the wiki.',
-'confirmemail_loggedin' => 'Your e-mail address has now been confirmed.',
+'confirmemail_loggedin' => 'Your email address has now been confirmed.',
'confirmemail_error' => 'Something went wrong saving your confirmation.',
-'confirmemail_subject' => '{{SITENAME}} e-mail address confirmation',
+'confirmemail_subject' => '{{SITENAME}} email address confirmation',
'confirmemail_body' => 'Someone, probably you, from IP address $1,
-has registered an account "$2" with this e-mail address on {{SITENAME}}.
+has registered an account "$2" with this email address on {{SITENAME}}.
To confirm that this account really does belong to you and activate
-e-mail features on {{SITENAME}}, open this link in your browser:
+email features on {{SITENAME}}, open this link in your browser:
$3
If you did *not* register the account, follow this link
-to cancel the e-mail address confirmation:
+to cancel the email address confirmation:
$5
This confirmation code will expire at $4.',
'confirmemail_body_changed' => 'Someone, probably you, from IP address $1,
-has changed the e-mail address of the account "$2" to this address on {{SITENAME}}.
+has changed the email address of the account "$2" to this address on {{SITENAME}}.
To confirm that this account really does belong to you and reactivate
-e-mail features on {{SITENAME}}, open this link in your browser:
+email features on {{SITENAME}}, open this link in your browser:
$3
If the account does *not* belong to you, follow this link
-to cancel the e-mail address confirmation:
+to cancel the email address confirmation:
$5
This confirmation code will expire at $4.',
'confirmemail_body_set' => 'Someone, probably you, from IP address $1,
-has set the e-mail address of the account "$2" to this address on {{SITENAME}}.
+has set the email address of the account "$2" to this address on {{SITENAME}}.
To confirm that this account really does belong to you and reactivate
-e-mail features on {{SITENAME}}, open this link in your browser:
+email features on {{SITENAME}}, open this link in your browser:
$3
If the account does *not* belong to you, follow this link
-to cancel the e-mail address confirmation:
+to cancel the email address confirmation:
$5
This confirmation code will expire at $4.',
-'confirmemail_invalidated' => 'E-mail address confirmation canceled',
-'invalidateemail' => 'Cancel e-mail confirmation',
+'confirmemail_invalidated' => 'Email address confirmation canceled',
+'invalidateemail' => 'Cancel email confirmation',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki transcluding is disabled]',
'scarytranscludetoolong' => '[URL is too long]',
# Delete conflict
-'deletedwhileediting' => "'''Warning''': This page was deleted after you started editing!",
+'deletedwhileediting' => "'''Warning:''' This page was deleted after you started editing!",
'confirmrecreate' => "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:
: ''$2''
Please confirm that you really want to recreate this page.",
'logentry-newusers-newusers' => 'User account $1 was created',
'logentry-newusers-create' => 'User account $1 was created',
'logentry-newusers-create2' => 'User account $3 was created by $1',
-'logentry-newusers-byemail' => 'User account $3 was created by $1 and password was sent by e-mail',
+'logentry-newusers-byemail' => 'User account $3 was created by $1 and password was sent by email',
'logentry-newusers-autocreate' => 'User account $1 was created automatically',
'logentry-rights-rights' => '$1 changed group membership for $3 from $4 to $5',
'logentry-rights-rights-legacy' => '$1 changed group membership for $3',
'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+#Rotation
+'rotate-comment' => 'Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise',
+
);
'loginlanguagelabel' => 'Lingvo: $1',
'suspicious-userlogout' => 'Via peto por elsaluti estis malpermesita ĉar verŝajne ĝi estis sendita de trompita retumilo aŭ kaŝiganta proksima servilo.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Nekonata eraro en la funkcio mail() de PHP',
'user-mail-no-addy' => 'Provis sendi retpoŝton sen retpoŝtadreso.',
'prefs-displaywatchlist' => 'Montraj opcioj',
'prefs-diffs' => 'Diferencoj',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Ŝajnas ke la retpoŝtadreso estas valida',
'email-address-validity-invalid' => 'Tajpu validan retpoŝtadreson',
'hist' => 'historio',
'hide' => 'Kaŝi',
'show' => 'Montri',
-'minoreditletter' => 'E',
+'minoreditletter' => 'e',
'newpageletter' => 'N',
'boteditletter' => 'R',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|priatentanta uzanto|priatentantaj uzantoj}}]',
'listgrouprights-addgroup-self-all' => 'Povas aldoni ĉiujn grupojn al propra konto',
'listgrouprights-removegroup-self-all' => 'Povas forigi ĉiujn grupojn de propra konto',
-# E-mail user
+# Email user
'mailnologin' => 'Neniu alsendota adreso',
'mailnologintext' => 'Vi nepre estu [[Special:UserLogin|salutanta]] kaj havanta validan retpoŝtadreson en viaj [[Special:Preferences|preferoj]] por retpoŝti al aliaj uzantoj.',
'emailuser' => 'Retpoŝti ĉi tiun uzanton',
'monthsall' => 'ĉiuj',
'limitall' => 'ĉiuj',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Konfirmi retadreson',
'confirmemail_noemail' => 'Vi ne havas validan retpoŝtan adreson notitan en viaj [[Special:Preferences|Preferoj]].',
'confirmemail_text' => 'Ĉi tiu vikio postulas ke vi validigu vian retadreson antaŭ ol uzadi la retmesaĝpreferojn. Bonvolu alklaki la suban butonon por sendi konfirmesaĝon al via adreso. La mesaĝo entenos ligilon kun kodo; bonvolu alŝuti la ligilon en vian foliumilon por konfirmi ke via retadreso validas.',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Página',
-'nstab-user' => 'Usuario',
+'nstab-user' => 'Página de usuario',
'nstab-media' => 'Media',
'nstab-special' => 'Página especial',
'nstab-project' => 'Página del proyecto',
'loginlanguagelabel' => 'Idioma: $1',
'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP.',
'user-mail-no-addy' => 'Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.',
'user-mail-no-body' => 'Trató de enviar un correo electrónico con un cuerpo vacío o excesivamente corto.',
'prefs-displaywatchlist' => 'Opciones de visualización',
'prefs-diffs' => 'Diferencias',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'La dirección de correo electrónico parece ser válida',
'email-address-validity-invalid' => 'Introduce una dirección de correo válida',
'listgrouprights-addgroup-self-all' => 'Agregar todos los grupos a tu propia cuenta',
'listgrouprights-removegroup-self-all' => 'Eliminar todos los grupos de tu propia cuenta',
-# E-mail user
+# Email user
'mailnologin' => 'Ninguna dirección de envio',
'mailnologintext' => 'Debes [[Special:UserLogin|iniciar sesión]] y tener una dirección electrónica válida en tus [[Special:Preferences|preferencias]] para enviar un correo electrónico a otros usuarios.',
'emailuser' => 'Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}',
'emailuser-title-target' => 'Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}',
'emailuser-title-notarget' => 'Enviar un correo electrónico al usuario',
-'emailpage' => 'Correo electrónico a usuario',
+'emailpage' => 'Enviar un correo electrónico a un usuario',
'emailpagetext' => 'Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.
La dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo "Remitente" o "De" para que el destinatario pueda responderte.',
'usermailererror' => 'El sistema de correo devolvió un error:',
'emailccsubject' => 'Copia de tu mensaje a $1: $2',
'emailsent' => 'Correo electrónico enviado',
'emailsenttext' => 'Se ha enviado tu mensaje de correo electrónico.',
-'emailuserfooter' => 'Este correo electrónico fue enviado por $1 a $2 a través de la función «Enviar correo electrónico a este usuario» en {{SITENAME}}.',
+'emailuserfooter' => 'Este correo electrónico fue enviado por $1 a $2 a través de la función «Enviar un correo electrónico a este usuario» en {{SITENAME}}.',
# User Messenger
'usermessage-summary' => 'Dejando un mensaje de sistema.',
'proxyblocksuccess' => 'Hecho.',
'sorbsreason' => 'Su dirección IP está listada como proxy abierto en DNSBL.',
'sorbs_create_account_reason' => 'Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta',
-'cant-block-while-blocked' => 'No puedes bloquear a otros usuarios mientras estás bloqueado.',
+'cant-block-while-blocked' => 'No puedes bloquear a otros usuarios mientras estás bloquead{{GENDER:|o|a}}.',
'cant-see-hidden-user' => 'El usuario que está intentando bloquear ya ha sido bloqueado y oculto. Puesto que usted no tiene el derecho hideuser, usted no puede ver o editar los bloqueos del usuario.',
'ipbblocked' => 'No puedes bloquear o desbloquear a otros usuarios porque estás bloqueado',
'ipbnounblockself' => 'No puedes desbloquearte',
'monthsall' => 'todos',
'limitall' => 'Todos',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Confirmar dirección de correo electrónico',
'confirmemail_noemail' => 'No tienes una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]].',
'confirmemail_text' => '{{SITENAME}} requiere la validación de tu dirección de correo antes de usarlo. Pulsa el botón de abajo para enviar la confirmación.
'moredotdotdot' => 'Veel...',
'mypage' => 'Minu lehekülg',
'mytalk' => 'Arutelu',
-'anontalk' => 'Arutelu selle IP jaoks',
+'anontalk' => 'Selle IP-aadressi artuelu',
'navigation' => 'Navigeerimine',
'and' => ' ja',
Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võidakse mõni lehekülg endiselt nii kuvada nagu oleksid ikka sisse logitud.",
'welcomeuser' => 'Tere tulemast, $1!',
'welcomecreation-msg' => 'Sinu konto on loodud.
-Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Eri:Eelistused|eelistusi]].',
+Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]].',
'yourname' => 'Kasutajanimi:',
'yourpassword' => 'Parool:',
'yourpasswordagain' => 'Sisesta parool uuesti:',
'gotaccount' => "Kui sul on juba konto, '''$1'''.",
'gotaccountlink' => 'logi sisse',
'userlogin-resetlink' => 'Kas oled unustanud oma sisselogimisandmed?',
-'createaccountmail' => 'E-posti teel',
+'createaccountmail' => 'Kasuta juhuslikku parooli ja saada see allpool määratud e-posti aadressile',
'createaccountreason' => 'Põhjus:',
'badretype' => 'Sisestatud paroolid ei lange kokku.',
'userexists' => 'Sisestatud kasutajanimi on juba kasutusel.
'nosuchusershort' => 'Kasutajat nimega "$1" ei ole olemas. Kontrollige kirjapilti.',
'nouserspecified' => 'Kasutajanimi puudub.',
'login-userblocked' => 'See kasutaja on blokeeritud. Sisselogimine pole lubatud.',
-'wrongpassword' => 'Vale parool. Proovige uuesti.',
+'wrongpassword' => 'Vale parool. Proovi uuesti.',
'wrongpasswordempty' => 'Parool jäi sisestamata. Palun proovi uuesti.',
'passwordtooshort' => 'Parool peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.',
'password-name-match' => 'Parool peab kasutajanimest erinema.',
'loginlanguagelabel' => 'Keel: $1',
'suspicious-userlogout' => 'Sinu väljalogimiskatse nurjus, sest see näis olevat katkise veebilehitseja või puhverserveri saadetud.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
'user-mail-no-addy' => 'Püüdsid saata e-kirja ilma meiliaadressita.',
'prefs-displaywatchlist' => 'Kuvasätted',
'prefs-diffs' => 'Erinevused',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Sobiv e-posti aadress',
'email-address-validity-invalid' => 'Sisesta sobiv e-posti aadress.',
'ignorewarning' => 'Ignoreeri hoiatust ja salvesta fail hoiatusest hoolimata',
'ignorewarnings' => 'Ignoreeri hoiatusi',
'minlength1' => 'Faili nimes peab olema vähemalt üks kirjamärk.',
-'illegalfilename' => 'Faili "$1" nimi sisaldab sümboleid, mis pole pealkirjades lubatud. Palun nimetage fail ümber ja proovige uuesti.',
+'illegalfilename' => 'Failinimi "$1" sisaldab märke, mis pole pealkirjades lubatud. Palun nimeta fail ümber ja proovi uuesti.',
'filename-toolong' => 'Failinimed ei või olla pikemad kui 240 baiti.',
'badfilename' => 'Pildi nimi on muudetud. Uus nimi on "$1".',
'filetype-mime-mismatch' => 'Faililaiend ".$1" ei vasta faili ($2) MIME tüübile.',
'linksearch-ok' => 'Otsi',
'linksearch-text' => 'Metamärgina võib kasutada tärni, näiteks "*.wikipedia.org".
Otsingus peab olema vähemalt tipptaseme domeen, näiteks "*.org".<br />
-Toetatud protokollid: <code>$1</code> (määramata protokolli korral vaikimisi http://).',
+Toetatud {{PLURAL:$2|protokoll|protokollid}}: <code>$1</code> (määramata protokolli korral vaikimisi http://).',
'linksearch-line' => '$1 on lingitud leheküljelt $2',
'linksearch-error' => 'Metamärk võib olla ainult internetiaadressi alguses.',
# Special:ActiveUsers
'activeusers' => 'Aktiivsete kasutajate nimekiri',
'activeusers-intro' => 'See on loetelu kasutajatest, kes on viimase $1 {{PLURAL:$1|päev|päeva}} jooksul midagi teinud.',
-'activeusers-count' => '$1 {{PLURAL:$1|muudatus|muudatust}} viimase {{PLURAL:$3|päeva|$3 päeva}} jooksul',
+'activeusers-count' => '$1 {{PLURAL:$1|toiming|toimingut}} viimase {{PLURAL:$3|päeva|$3 päeva}} jooksul',
'activeusers-from' => 'Näita kasutajaid alates:',
'activeusers-hidebots' => 'Peida robotid',
'activeusers-hidesysops' => 'Peida administraatorid',
'listgrouprights-addgroup-self-all' => 'Oma konto kõigisse rühmadesse lisada',
'listgrouprights-removegroup-self-all' => 'Eemaldada ennast kõigist rühmadest',
-# E-mail user
+# Email user
'mailnologin' => 'Saatja aadress puudub',
'mailnologintext' => 'Pead olema [[Special:UserLogin|sisse logitud]] ja sul peab [[Special:Preferences|eelistustes]] olema kehtiv e-posti aadress, et saata teistele kasutajatele e-kirju.',
'emailuser' => 'Saada sellele kasutajale e-kiri',
'protect-cascadeon' => 'See lehekülg on kaitstud, kuna ta on kasutusel {{PLURAL:$1|järgmisel leheküljel|järgmistel lehekülgedel}}, mis on omakorda kaskaadkaitse all.
Sa saad muuta selle lehekülje kaitse staatust, kuid see ei mõjuta kaskaadkaitset.',
'protect-default' => 'Luba kõigile kasutajatele',
-'protect-fallback' => 'Nõuab "$1" õiguseid',
-'protect-level-autoconfirmed' => 'Blokeeri uued ja registreerimata kasutajad',
-'protect-level-sysop' => 'Ainult administraatorid',
+'protect-fallback' => 'Lubatud vaid kasutajatele õigusega "$1"',
+'protect-level-autoconfirmed' => 'Lubatud vaid automaatselt kinnitatud kasutajatele',
+'protect-level-sysop' => 'Lubatud vaid administraatoritele',
'protect-summary-cascade' => 'kaskaad',
'protect-expiring' => 'aegub $1 (UTC)',
'protect-expiring-local' => 'aegub $1',
Kui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].
Sinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.
-Pane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.
+Pane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.
See tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.
'''Hoiatus!'''
'pageinfo-robot-noindex' => 'Indekseerimatu',
'pageinfo-views' => 'Vaatamiste arv',
'pageinfo-watchers' => 'Lehekülje jälgijate arv',
+'pageinfo-few-watchers' => 'Alla {{PLURAL:$1|ühe jälgija|$1 jälgija}}',
'pageinfo-redirects-name' => 'Ümbersuunamisi sellele leheküljele',
'pageinfo-subpages-name' => 'Selle lehekülje alamlehekülgi',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ümbersuunamine|ümbersuunamist}}; $3 {{PLURAL:$3|mitteümbersuunamine|mitteümbersuunamist}})',
'pageinfo-protect-cascading' => 'Siit lähtub kaskaadkaitse',
'pageinfo-protect-cascading-yes' => 'Jah',
'pageinfo-protect-cascading-from' => 'Kaskaadkaitse lähtub lehekülgedelt',
+'pageinfo-category-info' => 'Kategooria teave',
+'pageinfo-category-pages' => 'Lehekülgede arv',
+'pageinfo-category-subcats' => 'Alamkategooriate arv',
+'pageinfo-category-files' => 'Failide arv',
# Skin names
'skinname-standard' => 'Algeline',
'monthsall' => 'kõik',
'limitall' => 'iga',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'E-posti aadressi kinnitamine',
'confirmemail_noemail' => 'Sul pole [[Special:Preferences|eelistuste leheküljel]] e-posti aadressi määranud.',
'confirmemail_text' => 'Enne kui saad e-postiga seotud teenuseid kasutada, pead oma e-posti aadressi õigsust kinnitama. Allpool olevat nuppu klõpsates saadetakse sulle e-posti teel kinnituskood. Aadressi kinnitamiseks klõpsa e-kirjas olevat linki.',
'specialpages-group-highuse' => 'Tihti kasutatud leheküljed',
'specialpages-group-pages' => 'Lehekülgede loendid',
'specialpages-group-pagetools' => 'Töö lehekülgedega',
-'specialpages-group-wiki' => 'Viki andmed ja tööriistad',
+'specialpages-group-wiki' => 'Andmed ja tööriistad',
'specialpages-group-redirects' => 'Ümbersuunavad erilehed',
'specialpages-group-spam' => 'Töö spämmiga',
'hidden-category-category' => 'Kategoria ezkutuak',
'category-subcat-count' => '{{PLURAL:$2|Kategoria honek beste honako azpikategoria baino ez du.|Kategoria honek honako {{PLURAL:$1|azpikategoria du|$1 azpikategoriak ditu}}, guztira dauden $2tik.}}',
'category-subcat-count-limited' => 'Kategoria honek {{PLURAL:$1|azpikategoria hau du|$1 azpikategoria hauek ditu}}.',
-'category-article-count' => '{{PLURAL:$2|Kategoria honek ondorengo orri hau baino ez du.|Ondorengo {{PLURAL:$1|orria kategoria honetan dago|$1 orriak kategoria honetan daude}}; eta kategoria honetan, guztira, $2 orri daude.}}',
+'category-article-count' => '{{PLURAL:$2|Kategoria honek ondorengo orri hau baino ez du.|Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago|$1 orriak kategoria honetan daude}}. Guztira $2 orri dira kategoria honetan.}}',
'category-article-count-limited' => 'Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago.|$1 orri hauek kategoria honetan daude.}}',
-'category-file-count' => '{{PLURAL:$2|Kategoria honek fitxategi hau baino ez du.|Ondorengo {{PLURAL:$1|fitxategia kategoria honetan dago|$1 fitxategiak kategoria honetan daude}}. Eta kategoria honetan, guztira, $2 fitxategi daude.}}',
+'category-file-count' => '{{PLURAL:$2|Kategoria honek ondorengo fitxategi hau baino ez du.|Ondorengo {{PLURAL:$1|fitxategi hau kategoria honetan dago|$1 fitxategiak kategoria honetan daude}}. Guztira $2 fitxategi dira kategoria honetan.}}',
'category-file-count-limited' => 'Ondorengo {{PLURAL:$1|fitxategia kategoria honetan dago.|$1 fitxategiak kategoria honetan daude.}}',
'listingcontinuesabbrev' => 'jarr.',
'index-category' => 'Indexatutako orrialdeak',
'newwindow' => '(leiho berrian irekitzen da)',
'cancel' => 'Utzi',
'moredotdotdot' => 'Gehiago...',
+'morenotlisted' => 'Zerrendatu gabeko gehiago...',
'mypage' => 'Orrialdea',
'mytalk' => 'Eztabaida',
'anontalk' => 'IP honen eztabaida',
'view' => 'Ikusi',
'edit' => 'Aldatu',
'create' => 'Sortu',
-'editthispage' => 'Orrialde hau aldatu',
+'editthispage' => 'Orri hau aldatu',
'create-this-page' => 'Orrialde hau sortu',
'delete' => 'Ezabatu',
-'deletethispage' => 'Orrialde hau ezabatu',
+'deletethispage' => 'Ezabatu orri hau',
'undelete_short' => 'Berreskuratu {{PLURAL:$1|aldaketa bat|$1 aldaketa}}',
'viewdeleted_short' => 'Ikusi ezabatutako {{PLURAL:$1|bidalketa bat|$1 bidalketa}}',
'protect' => 'Babestu',
'youhavenewmessages' => '$1 dauzkazu ($2).',
'newmessageslink' => 'Mezu berriak',
'newmessagesdifflink' => 'azken aldaketa ikusi',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|Beste erabiltzaile baten|$3 erabiltzaileren}} $1 ($2).',
+'youhavenewmessagesmanyusers' => 'Hainbat erabiltzaileren $1 ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|Mezu berri bat duzu|Mezu berriak dituzu}}',
'newmessagesdifflinkplural' => 'azken {{PLURAL:$1|aldaketa|aldaketak}}',
'youhavenewmessagesmulti' => 'Mezu berriak dituzu $1(e)n',
'editsection' => 'aldatu',
'cannotdelete' => 'Ezin izan da «$1» orria edo fitxategia ezabatu.
Baliteke beste norbaitek ezabatu izana.',
'cannotdelete-title' => 'Ezin da "$1" orrialdea ezabatu',
+'delete-hook-aborted' => 'Ezabatzea hook batek gelditu du.
+Ez du arrazoirik eman.',
'badtitle' => 'Izenburu ezegokia',
'badtitletext' => 'Eskatutako orrialde izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat izatea.',
'perfcached' => 'Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea. Gehienez {{PLURAL:$1|emaitza 1 dago|$1 emaitza daude}} eskuragarri katxean.',
'cascadeprotected' => "Orrialde hau aldaketen aurka babestua dago, ''kaskada'' aukerarekin babestu {{PLURAL:$1|duten orrialde honetan|dituzten orrialde hauetan}} txertaturik dagoelako:
$2",
'namespaceprotected' => "Ez daukazu '''$1''' izen-tarteko orrialdeak aldatzeko baimenik.",
+'customcssprotected' => 'Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
+'customjsprotected' => 'Ez duzu baimenik JavaScript orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
'ns-specialprotected' => 'Ezin dira {{ns:special}} izen-tarteko orrialdeak editatu.',
'titleprotected' => "[[User:$1|$1]]ek izenburu hau sortzea ekidin zuen.
Emandako arrazoia ''$2'' izan zen.",
+'filereadonlyerror' => 'Ezin izan da "$1" fitxategia aldatu, "$2" fitxategi bilduma irakrutzeko-bakarrik moduan dagoelako.
+
+Blokeoa ezarri zuen administratzaileak honako arrazoia eman zuen: "$3".',
+'invalidtitle-knownnamespace' => 'Izenburua gaizki dago "$2" izen eremuan eta "$3" testuan',
+'invalidtitle-unknownnamespace' => 'Izenburua gaizki dago "$1" izen eremuan ezezagunean eta "$2" testuan',
'exception-nologin' => 'Saioa hasi gabe',
# Virus scanner
'gotaccount' => "Baduzu erabiltzaile kontua? '''$1'''.",
'gotaccountlink' => 'Saioa hasi',
'userlogin-resetlink' => 'Saioa hasteko datuak ahaztu dituzu?',
-'createaccountmail' => 'e-postaz',
+'createaccountmail' => 'Erabili behin-behineko pasahitz ausazko bat eta bidali behean agertzeko den e-posta helbidera',
'createaccountreason' => 'Arrazoia:',
'badretype' => 'Idatzitako pasahitzak ez dira berdinak.',
'userexists' => 'Aukeratutako erabiltzaile izena hartuta dago.
'loginlanguagelabel' => 'Hizkuntza: $1',
'suspicious-userlogout' => 'Saioa amaitzeko egin duzun eskaria ukatu da. Izan ere, ematen du eskari hori gaizki dabilen nabigatzaile edo cache proxy batek bidali duela.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'PHPren mail() funtzioan arazo ezezagun bat egon da.',
# Change password dialog
'changeemail-cancel' => 'Utzi',
# Edit page toolbar
-'bold_sample' => 'Testu beltza',
-'bold_tip' => 'Testu beltza',
+'bold_sample' => 'Letra lodiko testua',
+'bold_tip' => 'Letra lodiko testua',
'italic_sample' => 'Testu etzana',
'italic_tip' => 'Testu etzana',
'link_sample' => 'Loturaren izenburua',
'nonunicodebrowser' => "'''OHARRA: Zure nabigatzailea ez dator Unicode arauarekin bat. Artikuluak modu seguruan aldatu ahal izateko beste sistema bat gaitu da: ASCII ez diren karaktereak kode hamaseitar bezala agertuko dira aldaketa koadroan.'''",
'editingold' => "'''KONTUZ: Artikulu honen bertsio zahar bat aldatzen ari zara. Gorde egiten baduzu, azkenengo aldaketa baino lehenagoko aldakuntzak, ezabatuak izango dira.'''",
'yourdiff' => 'Ezberdintasunak',
-'copyrightwarning' => "Kontuan izan {{SITENAME}}(e)n egindako ekarpen guztiak $2 baldintzapean argitaratzen direla (ikus $1 informazio gehiagorako). Zure testua banatzeko baldintza hauekin ados ez bazaude, ez ezazu bidali.<br />
-Era berean, bidaltzen ari zaren edukia zuk zeuk idatzitakoa dela edo jabetza publikoko edo baliabide aske batetik kopiatu duzula zin egin ari zara.
-'''EZ BIDALI BAIMENIK GABEKO COPYRIGHTDUN EDUKIRIK!'''",
-'copyrightwarning2' => "Mesedez, kontuan izan {{SITENAME}}(e)n egindako ekarpen guztiak besteek aldatu edo ezabatu ditzaketela. Ez baduzu besteek aldaketak egitea nahi, ez ezazu bidali.<br />
-Era berean, bidaltzen ari zaren edukia zuk zeuk idatzitakoa dela edo jabetza publikoko edo baliabide aske batetik kopiatu duzula zin egin ari zara (ikus $1 informazio gehiagorako).
-'''EZ BIDALI BAIMENIK GABEKO COPYRIGHTDUN EDUKIRIK!'''",
+'copyrightwarning' => "Kontuan izan ezazu {{SITENAME}} webgunean egindako ekarpen guztiak $2 lizentziaren pean argitaratzen direla (xehetasunetarako, ikus $1). Zuk idatzitakoa libreki aldatua eta banatua izatea nahi ez baduzu, ez ezazu hemen jarri.<br />
+Era berean, hitzematen ari zara hau zuk zeuk idatzia dela, edo jabari publikotik nahiz askea den beste ituri batetik kopiatu duzula.
+'''Ez erabili copyright eskubideek babestutako lanik, baimenik gabe!'''",
+'copyrightwarning2' => "Mesedez, kontuan izan ezazu {{SITENAME}} webgunean egindako ekarpen guztiak beste erabiltzaileek aldatu edo ezabatu ditzaketela. Zuk idatzitakoa libreki aldatua izatea nahi ez baduzu, ez ezazu hemen jarri.<br />
+Era berean, hitzematen ari zara hau zuk zeuk idatzia dela, edo jabari publikotik nahiz askea den beste ituri batetik kopiatu duzula (xehetasunetarako, ikus $1).
+'''Ez erabili copyright eskubideek babestutako lanik, baimenik gabe!'''",
'longpageerror' => "'''Errorea: Bidali duzun testuak {{PLURAL:$1|kilobyte 1eko|$1 kilobyteko}} luzera du, eta {{PLURAL:$2|kilobyte 1eko|$2 kilobyteko}} maximoa baino luzeagoa da.'''
Ezin da gorde.",
'readonlywarning' => "'''Oharra: Datu-basea blokeatu egin da mantenu lanak burutzeko, beraz ezingo dituzu orain zure aldaketak gorde.'''
'sectioneditnotsupported-text' => 'Ezin dira atalak aldatu orrialde honetan.',
'permissionserrors' => 'Baimen erroreak',
'permissionserrorstext' => 'Ez duzu hori egiteko baimenik, hurrengo {{PLURAL:$1|arrazoia dela eta|arrazoiak direla eta}}:',
-'permissionserrorstext-withaction' => 'Ez duzu $2 egiteko eskumenik, honako {{PLURAL:$1|arrazoia dela eta:|arrazoiak direla eta:}}',
+'permissionserrorstext-withaction' => 'Ezin duzu $2, ondorengo {{PLURAL:$1|arrazoi hau dela eta:|arrazoi hauek direla eta:}}',
'recreate-moveddeleted-warn' => "'''Oharra: Lehenago ezabatutako orri bat berriz sortzen ari zara.'''
Pentsatu ea orri hau editatzen jarraitzeak zentzurik baduen.
Mesedez beheko alderaketa egiaztatu, egin nahi duzuna hori dela frogatzeko, eta ondoren azpiko aldaketak gorde, aldaketa desegiten amaitzeko.',
'undo-failure' => 'Ezin izan da aldaketa desegin tarteko aldaketekin gatazkak direla-eta.',
'undo-norev' => 'Aldaketa ezin da desegin ez delako existitzen edo ezabatu zutelako.',
-'undo-summary' => '[[Special:Contributions/$2|$2(r)en]] $1 berrikuspena desegin da ([[User talk:$2|Eztabaida]])',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|eztabaida]]) wikilariaren $1 berrikuspena desegin da',
# Account creation failure
'cantcreateaccounttitle' => 'Ezin izan da kontua sortu',
'revdelete-concurrent-change' => 'Errorea, $1 $2 data duen elementua aldatzean: badirudi haren egoera aldatu duela nor edo nork, zu aldatzen saiatzen ari zinela.
Begira itzazu erregistroak.',
'revdelete-reason-dropdown' => '*Ezabatzeko ohiko arrazoiak
-** Egile eskubideen urraketa
+** Egile eskubideak urratzea
** Informazio pertsonal edo iruzkin desegokia
** Lankide izen desegokia
-** Iraingarria izan daitekeen informazioa',
+** Kalumnia edo iraintzat jo daiteke',
'revdelete-otherreason' => 'Bestelako arrazoia:',
'revdelete-reasonotherlist' => 'Beste arrazoi bat',
'revdelete-edit-reasonlist' => 'Ezabaketa arrazoiak aldatu',
'prefs-emailconfirm-label' => 'E-posta baieztapena:',
'prefs-textboxsize' => 'Editatze lehioaren tamaina',
'youremail' => 'E-posta:',
-'username' => 'Erabiltzaile izena:',
-'uid' => 'Erabiltzaile zenbakia:',
-'prefs-memberingroups' => '{{PLURAL:$1|Taldeko|taldeetako}} kidea:',
+'username' => '{{GENDER:$1|Erabiltzaile izena}}:',
+'uid' => '{{GENDER:$1|Erabiltzaile}} zenbakia:',
+'prefs-memberingroups' => '{{PLURAL:$1|Taldeko|taldeetako}} {{GENDER:$2|kidea}}:',
'prefs-registration' => 'Erregistratzeko unea:',
'yourrealname' => 'Benetako izena:',
'yourlanguage' => 'Hizkuntza:',
'prefs-displaywatchlist' => 'Aukerak erakutsi',
'prefs-diffs' => 'Ezberdintasunak',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-posta helbidea zuzena dela dirudi',
'email-address-validity-invalid' => 'E-posta helbide zuzena idatzi',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'orrialde hau irakurri',
-'action-edit' => 'orrialde hau aldatu',
+'action-edit' => 'orri hau aldatu',
'action-createpage' => 'orrialdeak sortu',
'action-createtalk' => 'eztabaida orrialdeak sortu',
'action-createaccount' => 'lankide hau sortu',
'action-minoredit' => 'aldaketa hau txiki gisa markatu',
-'action-move' => 'orrialde hau mugitu',
-'action-move-subpages' => 'orrialde hau eta bere azpiorrialdeak mugitu',
+'action-move' => 'orri hau mugitu',
+'action-move-subpages' => 'orri hau eta haren azpiorriak mugitu',
'action-move-rootuserpages' => 'mugitu lankidearen oinarri orrialdeak',
'action-movefile' => 'fitxategi hau mugitu',
'action-upload' => 'fitxategi hau igo',
'nchanges' => '{{PLURAL:$1|aldaketa 1|$1 aldaketa}}',
'recentchanges' => 'Aldaketa berriak',
'recentchanges-legend' => 'Azken aldaketen aukerak',
-'recentchanges-summary' => 'Orrialde honetan wiki honetan egindako azken aldaketak erakusten dira.',
+'recentchanges-summary' => 'Orri honetan ikuska ditzakezu wiki honetan egindako azken aldaketak.',
'recentchanges-feed-description' => 'Sindikazio honetan wikian eginiko azkeneko aldaketak jarrai daitezke.',
'recentchanges-label-newpage' => 'Aldaketa honek orrialde berri bat sortu du',
'recentchanges-label-minor' => 'Hau aldaketa txikia da',
'listusers-editsonly' => 'Aldaketak egin dituzten erabiltzaileak soilik erakutsi',
'listusers-creationsort' => 'Sorrera dataren arabera sailkatu',
'usereditcount' => '{{PLURAL:$1|aldaketa $1|$1 aldaketa}}',
-'usercreated' => '$2-(e)tan $1-(a)n {{GENDER:$3|sortua}},',
+'usercreated' => '{{GENDER:$3|Sortze data}}: $1, $2',
'newpages' => 'Orrialde berriak',
'newpages-username' => 'Erabiltzaile izena:',
'ancientpages' => 'Orrialde zaharrenak',
'move' => 'Mugitu',
-'movethispage' => 'Orrialde hau mugitu',
+'movethispage' => 'Orri hau mugitu',
'unusedimagestext' => 'Ondorengo fitxategiak existizen dira baina ez daude inongo orrietatik lotuta.
Mesedez, kontuan izan beste webgune batzutatik URL zuzena erabiliz lotura izan dezaketela irudira, eta kasu horretan ez lirateke hemengo zerrendetan azalduko.',
'unusedcategoriestext' => 'Hurrengo kategoria orrialde guztiak datu-basean existitzen dira, baina ez du inongo orrialde edo kategoriak erabiltzen.',
'notargettitle' => 'Helburu orrialderik ez',
-'notargettext' => 'Ez duzu eragiketa hau burutzeko helburu orrialde edo erabiltzaile bat zehaztu.',
+'notargettext' => 'Ez duzu zehaztu eragiketa hau zein orri edo erabiltzaileri egin behar zaion.',
'nopagetitle' => 'Ez dago horrelako helburu orrialderik',
'nopagetext' => 'Zuk ezarri duzun helburuko orrialdea ez da existitzen.',
'pager-newer-n' => '{{PLURAL:$1|berriago den 1|berriagoak diren $1}}',
'linksearch-error' => 'Komodinak izenaren hasieran bakarrik agertu beharko lirateke.',
# Special:ListUsers
-'listusersfrom' => 'Hemendik aurrerako erabiltzaileak bistaratu:',
+'listusersfrom' => 'Honela hasten diren erabiltzaileak bistaratu:',
'listusers-submit' => 'Erakutsi',
'listusers-noresult' => 'Ez da erabiltzailerik aurkitu.',
'listusers-blocked' => '(blokeatua)',
'listgrouprights-addgroup-self-all' => 'Talde guztiak norbere kontura gehitu',
'listgrouprights-removegroup-self-all' => 'Talde guztiak norbere kontutik ezabatu',
-# E-mail user
+# Email user
'mailnologin' => 'Bidalketa helbiderik ez',
'mailnologintext' => 'Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].',
'emailuser' => 'Erabiltzaile honi e-posta bidali',
'blanknamespace' => '(Nagusia)',
# Contributions
-'contributions' => 'Lankidearen ekarpenak',
+'contributions' => '{{GENDER:$1|Lankidearen}} ekarpenak',
'contributions-title' => '$1(r)entzat lankidearen ekarpenak',
'mycontris' => 'Ekarpenak',
'contribsub2' => '$1 ($2)',
# What links here
'whatlinkshere' => 'Honanzko lotura duten orriak',
'whatlinkshere-title' => '$1(e)ra lotura duten orriak',
-'whatlinkshere-page' => 'Orrialdea:',
+'whatlinkshere-page' => 'Orria:',
'linkshere' => "Hauek dute '''[[:$1]]''' orrialderako lotura:",
'nolinkshere' => "Ez dago '''[[:$1]]''' lotura duen orrialderik.",
'nolinkshere-ns' => "Hautatutako izen-tartean ez dago '''[[:$1]]''' orrialderako lotura duenik.",
'blocklist' => 'Blokeatutako erabiltzaileak',
'ipblocklist' => 'Blokeatutako erabiltzaileak',
'ipblocklist-legend' => 'Blokeatutako erabiltzaile bat bilatu',
+'blocklist-timestamp' => 'Eguna eta ordua',
'blocklist-target' => 'Helburua',
+'blocklist-by' => 'Blokeoa ezarri duen administratzailea',
'blocklist-reason' => 'Arrazoia',
'ipblocklist-submit' => 'Bilatu',
'ipblocklist-localblock' => 'Tokiko blokeoa',
Blokeo erregistroa ematen da azpian erreferentziarako:',
'blocklog-showsuppresslog' => 'Lankide hau aurretik blokeatua eta ezkutatua izan da.
Erregistroa ematen da azpian erreferentziarako:',
-'blocklogentry' => '"[[$1]]" wikilariari blokeoa ezarri zaio. Blokeoaldia: $2 $3',
+'blocklogentry' => 'wikilariak [[$1]] erabiltzailea blokeatu du. Blokeoaldia: $2 $3',
'reblock-logentry' => '[[$1]] wikilariari blokeoaldia aldatu diogu. Blokeoaldi berria: $2 $3',
'blocklogtext' => 'Erabiltzaileen blokeoen ezarpen eta ezabaketen erregistroa da hau.
Automatikoki blokeatutako IP helbideak ez dira zerrendatzen.
'seconds-abbrev' => '$1s',
'minutes-abbrev' => '$1m',
'hours-abbrev' => '$1o',
+'seconds' => '{{PLURAL:$1|segundu $1|$1 segundu}}',
+'minutes' => '{{PLURAL:$1|minutu $1|$1 minutu}}',
+'hours' => '{{PLURAL:$1|ordu $1|$1 ordu}}',
+'days' => '{{PLURAL:$1|egun $1|$1 egun}}',
'ago' => 'Duela $1',
# Bad image list
'exif-gpsdifferential' => 'GPSaren zuzenketa diferentziala',
'exif-jpegfilecomment' => 'JPEG fitxategiaren iruzkina',
'exif-keywords' => 'Hitz gakoak',
+'exif-worldregioncreated' => 'Munduko zein eskualdetan egin den argazki hau',
+'exif-countrycreated' => 'Argazkia egin den herrialdea',
+'exif-countrycodecreated' => 'Argazkia egin deneko herrialdearen kodea',
+'exif-provinceorstatecreated' => 'Argazkia egin deneko probintzia edo estatua',
+'exif-citycreated' => 'Argazkia egin deneko hiria',
+'exif-sublocationcreated' => 'Argazkia egin deneko hiriaren azpieremua',
+'exif-worldregiondest' => 'Munduko eskualdea erakusten da',
'exif-countrydest' => 'Erakutsitako herrialdea',
+'exif-countrycodedest' => 'Herrialdearen kodea erakusten da',
+'exif-provinceorstatedest' => 'Pronbitzia edo estatua erakusten da',
+'exif-citydest' => 'Hiria erakusten da',
+'exif-sublocationdest' => 'Hiriaren azpikokapena erakusten da',
'exif-objectname' => 'Izenburua laburra',
+'exif-specialinstructions' => 'Agindu bereziak',
'exif-headline' => 'Goiburua',
+'exif-credit' => 'Kreditua/Emalea',
'exif-source' => 'Jatorria',
'exif-urgency' => 'Larrialdia',
'exif-writer' => 'Idazlea',
'monthsall' => 'guztiak',
'limitall' => 'guztiak',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'E-posta helbidea egiaztatu',
'confirmemail_noemail' => 'Ez daukazu e-posta helbiderik zehaztuta zure [[Special:Preferences|hobespenetan]].',
'confirmemail_text' => 'Wiki honetan zure e-posta helbidea egiaztatzea beharrezkoa da e-postarekin zerikusia duten ezaugarriak erabili aurretik. Beheko botoia jo zure helbidera egiaztapen mezu bat bidaltzeko. Mezuan kode bat duen lotura bat joango da atxikita; lotura hori zure nabigatzailean ireki ezazu e-posta helbidea egiaztatzeko.',
'htmlform-selectorother-other' => 'Beste bat',
# New logging system
-'logentry-delete-delete' => '$1 wikilariak $3 orria ezabatu du',
+'logentry-delete-delete' => '$1 wikilariak «$3» orria ezabatu du',
+'logentry-delete-event' => '$1 wikilariak ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
+'logentry-suppress-event' => '$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
'logentry-move-move' => '$1 wikilariak «$3» orria «$4» izenera aldatu du',
'logentry-move-move-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe',
'logentry-move-move_redir' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik',
'logentry-move-move_redir-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe',
-'logentry-newusers-newusers' => '$1 wikilariak erabiltzaile kontu bat sortu du',
-'logentry-newusers-create' => '$1 wikilariak erabiltzaile kontu bat sortu du',
-'logentry-newusers-create2' => '$1 wikilariak $3 erabiltzaile kontu bat sortu du',
+'logentry-newusers-newusers' => '$1 erabiltzaile kontua sortu da',
+'logentry-newusers-create' => '$1 erabiltzaile kontua sortu da',
+'logentry-newusers-create2' => '$1 wikilariak $3 erabiltzaile kontua sortu du',
'rightsnone' => '(bat ere ez)',
# Feedback
'vector-action-protect' => 'محافظت',
'vector-action-undelete' => 'احیا',
'vector-action-unprotect' => 'تغییر سطح حفاظت',
-'vector-simplesearch-preference' => 'فعال کردن جستجوی ساده (فقط در پوستهٔ برداری)',
+'vector-simplesearch-preference' => 'فعال کردن نوار جستجوی سادهشده (فقط در پوستهٔ برداری)',
'vector-view-create' => 'ایجاد',
'vector-view-edit' => 'ویرایش',
'vector-view-history' => 'نمایش تاریخچه',
'loginlanguagelabel' => 'زبان: $1',
'suspicious-userlogout' => 'درخواست شما برای خروج از سامانه رد شد زیرا به نظر میرسد که این درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر ارسال شده باشد.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'خطای ناشناخته در تابع mail() پیاچپی',
'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
'user-mail-no-body' => 'تلاش برای فرستادن پستالکترونیک بیدلیل کوتاه یا خالی',
'prefs-displaywatchlist' => 'گزینههای نمایش',
'prefs-diffs' => 'تفاوتها',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می رسد',
'email-address-validity-invalid' => 'نشانی رایانامهٔ معتبر وارد کنید',
این صفحهها شاید در عوض به موضوعات مرتبط پیوند داده شوند.<br />
یک صفحه هنگامی صفحهٔ ابهامزدایی در نظر گرفته میشود که در آن از الگویی که به [[MediaWiki:Disambiguationspage]] پیوند دارد استفاده شده باشد.",
+'pageswithprop' => 'صفحههای دارای خاصیت صفحه',
+'pageswithprop-legend' => 'صفحههای دارای خاصیت صفحه',
+'pageswithprop-text' => 'این صفحه فهرستی است از صفحههایی که از یک خاصیت صفحهٔ خاص استفاده میکنند.',
+'pageswithprop-prop' => 'نام خاصیت:',
+'pageswithprop-submit' => 'برو',
+
'doubleredirects' => 'تغییرمسیرهای دوتایی',
'doubleredirectstext' => 'این صفحه فهرستی از صفحههای تغییرمسیری را ارائه میکند که به صفحهٔ تغییرمسیر دیگری اشاره میکنند.
هر سطر دربردارندهٔ پیوندهایی به تغییرمسیر اول و دوم و همچنین مقصد تغییرمسیر دوم است، که معمولاً صفحهٔ مقصد واقعی است و نخستین تغییرمسیر باید به آن اشاره کند.
'listgrouprights-addgroup-self-all' => 'میتواند حساب خود را به تمام گروهها اضافه کند',
'listgrouprights-removegroup-self-all' => 'میتواند حساب خود را از تمام گروهها حذف کند',
-# E-mail user
+# Email user
'mailnologin' => 'نشانیای از فرستنده موجود نیست',
'mailnologintext' => 'برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
'emailuser' => 'فرستادن نامه به این کاربر',
شما میتوانید سطح محافظت این صفحه را تغییر بدهید اما این کار تاثیری بر محافظت آبشاری صفحه نخواهد گذاشت.',
'protect-default' => 'همهٔ کاربرها',
'protect-fallback' => 'فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده میشود',
-'protect-level-autoconfirmed' => 'فقط به کاربرهای تائیدشده اجازه بده',
+'protect-level-autoconfirmed' => 'اجازه فقط برای به کاربرهای تائیدشده',
'protect-level-sysop' => 'فقط مدیران',
'protect-summary-cascade' => 'آبشاری',
'protect-expiring' => 'زمان سرآمدن $1 (UTC)',
'monthsall' => 'همهٔ ماهها',
'limitall' => 'همه',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'تأیید نشانی رایانامه',
'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی رایانامه معتبری وارد نکردهاید.',
'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار رایانامه خود، پیش از استفاده از خدمات رایانامه در اینجا میکند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی رایانامهٔ شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی رایانامهٔ شما تایید شود.',
'duration-centuries' => '$1 قرن',
'duration-millennia' => '{{PLURAL:$1|هزار سال |$1 هزار سال}}',
+# Image rotation
+'rotate-comment' => 'تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعتگرد چرخانده شد',
+
);
'loginlanguagelabel' => 'Kieli: $1',
'suspicious-userlogout' => 'Pyyntösi kirjautua ulos evättiin, koska se näytti rikkinäisen selaimen tai välimuistipalvelimen lähettämältä.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
'user-mail-no-addy' => 'Yritit lähettää sähköpostia ilman sähköpostiosoitetta.',
'user-mail-no-body' => 'Sähköpostin sisältö ei ole tarpeeksi pitkä.',
'revdelete-radio-set' => 'Kyllä',
'revdelete-radio-unset' => 'Ei',
'revdelete-suppress' => 'Häivytä tiedot myös ylläpitäjien näkyviltä samalla kun piilotat ne muilta käyttäjiltä',
-'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versiolta',
+'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versioilta',
'revdelete-log' => 'Syy',
'revdelete-submit' => 'Toteuta {{PLURAL:$1|valittuun versioon|valittuihin versioihin}}',
'revdelete-success' => "'''Version näkyvyys päivitetty.'''",
'revdelete-failure' => "'''Version näkyvyyttä ei voitu päivittää:'''
$1",
-'logdelete-success' => 'Tapahtuman näkyvyys asetettu.',
+'logdelete-success' => "'''Lokitapahtuman näkyvyyttä on muutettu.'''",
'logdelete-failure' => "'''Lokin näkyvyyttä ei voitu asettaa:'''
$1",
'revdel-restore' => 'muuta näkyvyyttä',
-'revdel-restore-deleted' => 'poistetut muutokset',
-'revdel-restore-visible' => 'näkyvät muutokset',
+'revdel-restore-deleted' => 'poistetut versiot',
+'revdel-restore-visible' => 'näkyvät versiot',
'pagehist' => 'Sivun muutoshistoria',
'deletedhist' => 'Poistettujen versioiden historia',
'revdelete-hide-current' => 'Virhe tapahtui $2, $1 päivätyn kohteen piilottamisessa: tämä on nykyinen versio. Sitä ei voi piilottaa.',
Sinulla ei ole oikeutta siihen.',
'revdelete-modify-no-access' => 'Virhe tapahtui $2, $1 kohteen muokkauksessa: tämä kohde on merkitty "rajoitetuksi". Sinulla ei ole oikeuksia sen muokkaukseen.',
'revdelete-modify-missing' => 'Virhe muuttaessa kohdetta, jonka tunnus on $1: Se puuttuu tietokannasta.',
-'revdelete-no-change' => "'''Varoitus:''' kohdalle $2 kello $1 on asetettu valmiiksi näkyvyysasetuksia.",
+'revdelete-no-change' => "'''Varoitus:''' kohteessa $2 kello $1 on jo valmiiksi haluamasi näkyvyysasetukset.",
'revdelete-concurrent-change' => 'Virhe $2, $1 päivätyn kohteen muokkauksessa: sen tilan on näköjään muuttanut joku sillä aikaa kun yritit muokata sitä. Ole hyvä ja tarkista lokit.',
'revdelete-only-restricted' => 'Virhe piilotettaessa $1 kello $2 päivättyä kohdetta: Et voi poistaa kohteita ylläpitäjien näkyviltä valitsematta myös jotain muuta näkyvyysasetusta.',
'revdelete-reason-dropdown' => '*Yleiset poistosyyt
'prefs-displaywatchlist' => 'Näyttöasetukset',
'prefs-diffs' => 'Erot',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Sähköpostiosoite vaikuttaa kelvolliselta',
'email-address-validity-invalid' => 'Virheellinen sähköpostiosoite',
Täsmennyssivun sijaan ne voisivat linkittää suoraan asianomaiseen aiheeseen.<br />
Sivua kohdellaan täsmennyssivuna, jos se käyttää mallinetta, johon on linkki sivulta [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sivut sivun ominaisuuden mukaan',
+'pageswithprop-legend' => 'Sivut sivun ominaisuuden mukaan',
+'pageswithprop-text' => 'Tällä sivulla on lueteltu sivut, jotka käyttävät erityistä sivun ominaisuutta.',
+'pageswithprop-submit' => 'Siirry',
+
'doubleredirects' => 'Kaksinkertaiset ohjaukset',
'doubleredirectstext' => 'Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.
Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteen ensimmäiseen riviin, eli yleensä ”oikeaan” kohteeseen, johon ensimmäisen ohjauksen pitäisi osoittaa.
'listgrouprights-addgroup-self-all' => 'Voi lisätä itsensä kaikkiin ryhmiin',
'listgrouprights-removegroup-self-all' => 'Voi poistaa itsensä kaikista ryhmistä',
-# E-mail user
+# Email user
'mailnologin' => 'Lähettäjän osoite puuttuu',
'mailnologintext' => 'Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]] ja [[Special:Preferences|asetuksissasi]] pitää olla toimiva ja <strong>varmennettu</strong> sähköpostiosoite, jotta voit lähettää sähköpostia muille käyttäjille.',
'emailuser' => 'Lähetä sähköpostia tälle käyttäjälle',
'monthsall' => 'kaikki',
'limitall' => 'kaikki',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Varmenna sähköpostiosoite',
'confirmemail_noemail' => 'Sinulla ei ole kelvollista sähköpostiosoitetta [[Special:Preferences|asetuksissasi]].',
'confirmemail_text' => 'Tämä wiki vaatii sähköpostiosoitteen varmentamisen, ennen kuin voit käyttää sähköpostitoimintoja. Lähetä alla olevasta painikkeesta varmennusviesti osoitteeseesi. Viesti sisältää linkin, jonka avaamalla varmennat sähköpostiosoitteesi.',
* @author McDutchie
* @author Meithal
* @author Moyg
+ * @author Nicolas NALLET
* @author Nicolas Raoul
* @author Nnemo
* @author Od1n
'loginlanguagelabel' => 'Langue : $1',
'suspicious-userlogout' => "Votre demande de déconnexion a été refusée car il semble qu'elle a été envoyée par un navigateur cassé ou la mise en cache d'un proxy.",
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Erreur inconnue dans la fonction mail() de PHP.',
'user-mail-no-addy' => "Tenté d'envoyer un courriel sans adresse de courriel",
'user-mail-no-body' => "Essai d'envoi d'un courriel avec un corps vide ou déraisonnablement court.",
'prefs-edit-boxsize' => 'Taille de la fenêtre de modification.',
'rows' => 'Rangées :',
'columns' => 'Colonnes :',
-'searchresultshead' => 'Recherches',
+'searchresultshead' => 'Filtrer avec cette valeur',
'resultsperpage' => 'Nombre de réponses par page :',
'stub-threshold' => 'Limite supérieure pour les <a href="#" class="stub">liens vers les ébauches</a> (octets) :',
'stub-threshold-disabled' => 'Désactivé',
'prefs-displaywatchlist' => "Options d'affichage",
'prefs-diffs' => 'Différences',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Semble valide',
'email-address-validity-invalid' => 'Une adresse valide est nécessaire !',
Elles devraient plutôt pointer vers le bon article.<br />
Une page est considérée comme une page d'homonymie si elle utilise un modèle lié à [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Pages avec une propriété de page',
+'pageswithprop-legend' => 'Pages avec une propriété de page',
+'pageswithprop-text' => 'Cette page liste les pages qui utilisent une propriété de page particulière.',
+'pageswithprop-prop' => 'Nom de la propriété:',
+'pageswithprop-submit' => 'Aller',
+
'doubleredirects' => 'Doubles redirections',
'doubleredirectstext' => 'Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.
Chaque entrée contient des liens vers la première et la seconde redirections, ainsi que la première ligne de texte de la seconde page, ce qui fournit habituellement la « vraie » page cible, vers laquelle la première redirection devrait rediriger.
'listgrouprights-addgroup-self-all' => "Peut s'ajouter tous les groupes à son propre compte",
'listgrouprights-removegroup-self-all' => 'Peut se retirer tous les groupes de son propre compte',
-# E-mail user
+# Email user
'mailnologin' => "Pas d'adresse d'expéditeur",
'mailnologintext' => "Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d'autres utilisateurs.",
'emailuser' => 'Lui envoyer un courriel',
'monthsall' => 'tous',
'limitall' => 'tous',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => "Confirmer l'adresse de courriel",
'confirmemail_noemail' => "Vous n'avez pas défini une adresse de courriel valide dans vos [[Special:Preferences|préférences]].",
'confirmemail_text' => 'Ce wiki nécessite la vérification de votre adresse de courriel avant de pouvoir utiliser toute fonction de messagerie.
'duration-centuries' => '$1 siècle{{PLURAL:$1||s}}',
'duration-millennia' => '$1 millénaire{{PLURAL:$1||s}}',
+# Image rotation
+'rotate-comment' => 'Image pivotée de $1 {{PLURAL:$1|degré|degrés}} dans le sens des aiguilles d’une montre',
+
);
'tog-hidepatrolled' => 'Cachiér los changements gouardâs dedens los dèrriérs changements',
'tog-newpageshidepatrolled' => 'Cachiér les pâges gouardâyes entre-mié la lista de les pâges novèles',
'tog-extendwatchlist' => 'Ètendre la lista de siuvu por montrar tôs los changements et pas ren que los ples novéls',
-'tog-usenewrc' => 'Rassemblar los changements per pâge dedens los dèrriérs changements et la lista de siuvu (il at fôta de JavaScript)',
+'tog-usenewrc' => 'Rassemblar los changements per pâge dedens los dèrriérs changements et la lista de siuvu (at fôta de JavaScript)',
'tog-numberheadings' => 'Numerotar ôtomaticament los titros de sèccion',
-'tog-showtoolbar' => 'Montrar la bârra d’outils de changement (il at fôta de JavaScript)',
-'tog-editondblclick' => 'Changiér des pâges sur doblo-clic (il at fôta de JavaScript)',
+'tog-showtoolbar' => 'Montrar la bârra d’outils de changement (at fôta de JavaScript)',
+'tog-editondblclick' => 'Changiér des pâges sur doblo-clic (at fôta de JavaScript)',
'tog-editsection' => 'Activar lo changement de sèccions avouéc los lims « [changiér] »',
-'tog-editsectiononrightclick' => 'Activar lo changement de sèccions per clic drêt sur lors titros (il at fôta de JavaScript)',
-'tog-showtoc' => 'Montrar la trâbla de les matiéres (por les pâges qu’ont més de 3 sèccions)',
+'tog-editsectiononrightclick' => 'Activar lo changement de sèccions per clic drêt sur lors titros (at fôta de JavaScript)',
+'tog-showtoc' => 'Montrar la trâbla de les matiéres (por les pâges qu’ant més de 3 sèccions)',
'tog-rememberpassword' => 'Sè rapelar de mon contresegno sur ceti navigator (por lo més $1 jorn{{PLURAL:$1||s}})',
'tog-watchcreations' => 'Apondre les pâges que fé et pués los fichiérs que tèlèchârjo a ma lista de siuvu',
'tog-watchdefault' => 'Apondre les pâges et los fichiérs que chanjo a ma lista de siuvu',
'tog-shownumberswatching' => 'Montrar lo nombro d’utilisators que siuvont na pâge',
'tog-oldsig' => 'Signatura ègzistenta :',
'tog-fancysig' => 'Trètar la signatura coment de vouiquitèxto (sen lim ôtomatico)',
-'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, il at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
-'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, il at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
+'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
+'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
'tog-showjumplinks' => 'Activar los lims d’accèssibilitât « {{int:jumpto}} »',
-'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (il at fôta de JavaScript) (èxpèrimentâl)',
+'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (at fôta de JavaScript) (èxpèrimentâl)',
'tog-forceeditsummary' => 'Mè balyér na semonce quand j’é pas buchiê de rèsumâ de changement',
'tog-watchlisthideown' => 'Cachiér los mins changements dedens la lista de siuvu',
'tog-watchlisthidebots' => 'Cachiér los changements fêts per des robots dedens la lista de siuvu',
# General errors
'error' => 'Fôta',
-'databaseerror' => 'Fôta de la bâsa de donâs',
-'dberrortext' => 'Na fôta de sintaxa de la demanda dens la bâsa de donâs est arrevâye.
+'databaseerror' => 'Fôta de la bâsa de balyês',
+'dberrortext' => 'Na fôta de sintaxa de la demanda dens la bâsa de balyês est arrevâye.
Cen pôt endicar na cofierie dedens la programeria.
-La dèrriére demanda trètâye per la bâsa de donâs ére :
+La dèrriére demanda trètâye per la bâsa de balyês ére :
<blockquote><code>$1</code></blockquote>
dês la fonccion « <code>$2</code> ».
-La bâsa de donâs at retornâ la fôta « <samp>$3 : $4</samp> ».',
-'dberrortextcl' => 'Na fôta de sintaxa de la demanda dens la bâsa de donâs est arrevâye.
-La dèrriére demanda trètâye per la bâsa de donâs ére :
+La bâsa de balyês at retornâ la fôta « <samp>$3 : $4</samp> ».',
+'dberrortextcl' => 'Na fôta de sintaxa de la demanda dens la bâsa de balyês est arrevâye.
+La dèrriére demanda trètâye per la bâsa de balyês ére :
« $1 »
dês la fonccion « $2 ».
-La bâsa de donâs at retornâ la fôta « $3 : $4 ».',
+La bâsa de balyês at retornâ la fôta « $3 : $4 ».',
'laggedslavemode' => "'''Atencion :''' cela pâge pôt pas contegnir tôs los dèrriérs changements fêts.",
-'readonly' => 'Bâsa de donâs vèrrolyêe',
-'enterlockreason' => 'Buchiéd na rêson du vèrroly et pués n’èstimacion de la sina durâ',
-'readonlytext' => 'Ora la bâsa de donâs est vèrrolyêe por les entrâs novèles et los ôtros changements, de sûr por pèrmetre la sina mantegnence, dês cen tot tornerat en ôrdre.
+'readonly' => 'Bâsa de balyês vèrrolyêe',
+'enterlockreason' => 'Buchiéd na rêson du vèrroly et pués un’èstimacion de la sina durâ',
+'readonlytext' => 'Ora la bâsa de balyês est vèrrolyêe por les entrâs novèles et los ôtros changements, de sûr por pèrmetre la sina mantegnence, dês cen tot tornerat en ôrdre.
L’administrator que l’at vèrrolyê at balyê cet’èxplicacion : $1',
-'missing-article' => 'La bâsa de donâs at pas trovâ lo tèxto d’una pâge qu’el arêt diu trovar, apelâye « $1 » $2.
+'missing-article' => 'La bâsa de balyês at pas trovâ lo tèxto d’una pâge qu’el arêt diu trovar, apelâye « $1 » $2.
En g·ènèral cen arreve en siuvent un lim d’una dif d’un historico dèpassâ(ye) de vers na pâge qu’est étâye suprimâye.
Se vos plét, signalâd-la a un [[Special:ListUsers/sysop|administrator]] sen oubliar de lui endicar l’URL du lim.',
'missingarticle-rev' => '(numerô de vèrsion : $1)',
'missingarticle-diff' => '(dif : $1, $2)',
-'readonly_lag' => 'La bâsa de donâs est étâye vèrrolyêe ôtomaticament pendent que los sèrviors secondèros ratrapont lor retârd sur lo sèrvior principâl.',
+'readonly_lag' => 'La bâsa de balyês est étâye vèrrolyêe ôtomaticament pendent que los sèrviors secondèros ratrapont lor retârd sur lo sèrvior principâl.',
'internalerror' => 'Fôta de dedens',
'internalerror_info' => 'Fôta de dedens : $1',
'fileappenderrorread' => 'Y at pas moyen de liére « $1 » pendent l’aponsa.',
'badtitle' => 'Crouyo titro',
'badtitletext' => 'Lo titro de la pâge demandâye est pas justo, vouedo ou ben o est un titro entèrlengoua ou entèrvouiqui mâl-liyê.
Contint de sûr yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.',
-'perfcached' => 'Cetes donâs sont en cacho et pôvont pas étre a jorn. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
-'perfcachedts' => 'Cetes donâs sont en cacho et sont étâyes betâyes a jorn por lo dèrriér côp a $1. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
-'querypage-no-updates' => 'Ora les mises a jorn por ceta pâge sont dèsactivâyes.
-Les donâs ique seront pas betâyes a jorn.',
+'perfcached' => 'Cetes balyês sont en cacho et pôvont pas étre a jorn. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
+'perfcachedts' => 'Cetes balyês sont en cacho et sont étâyes betâyes a jorn por lo dèrriér côp a $1. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
+'querypage-no-updates' => 'Ora les mêses a jorn por ceta pâge sont dèsactivâyes.
+Les balyês ique seront pas betâyes a jorn.',
'wrong_wfQuery_params' => 'Paramètros fôx dessus wfQuery()<br />
Fonccion : $1<br />
Demanda : $2',
'protectedpagetext' => 'Ceta pâge est étâye protègiêe por empachiér son changement ou ben d’ôtres accions.',
'viewsourcetext' => 'Vos pouede vêre et copiyér lo tèxto sôrsa de ceta pâge :',
'viewyourtext' => "Vos pouede vêre et copiyér lo tèxto sôrsa de '''voutros changements''' a ceta pâge :",
-'protectedinterface' => 'Cela pâge-que balye de tèxto d’entèrface por la programeria sur ceti vouiqui, et el est vêr protègiêe por èvitar los abus.
+'protectedinterface' => 'Cela pâge-que balye de tèxto d’entèrface por la programeria sur ceti vouiqui et est vêr protègiêe por èvitar los abus.
Por apondre ou ben changiér des traduccions sur tôs los vouiquis, se vos plét empleyéd [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.',
'editinginterface' => "'''Atencion :''' vos éte aprés changiér na pâge empleyêe por fâre lo tèxto d’entèrface de la programeria.
Los changements sè cognetront sur l’aparence de l’entèrface utilisator por los ôtros utilisators de ceti vouiqui.
'securelogin-stick-https' => 'Réstar branchiê en HTTPS aprés lo branchement',
'yourdomainname' => 'Voutron domêno :',
'password-change-forbidden' => 'Vos pouede pas changiér los contresegnos sur ceti vouiqui.',
-'externaldberror' => 'Ou ben na fôta est arrevâye avouéc la bâsa de donâs d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye|(ye)}} a betar a jorn voutron compto de defôr.',
+'externaldberror' => 'Ou ben na fôta est arrevâye avouéc la bâsa de balyês d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye|(ye)}} a betar a jorn voutron compto de defôr.',
'login' => 'Branchement',
'nav-login-createaccount' => 'Sè branchiér / fâre un compto',
'loginprompt' => "Vos dête activar los tèmouens (''cookies'') por vos branchiér a {{SITENAME}}.",
'passwordremindertitle' => 'Contresegno temporèro novél por {{SITENAME}}',
'passwordremindertext' => 'Yon (probâblament vos, dês l’adrèce IP $1) at demandâ un contresegno
novél por {{SITENAME}} ($4). Un contresegno temporèro est étâ fêt por
-l’utilisator « $2 » et il est « $3 ». S’o ére voutra entencion, vos vos devréd
+l’utilisator « $2 » et est « $3 ». S’o ére voutron entencion, vos vos devréd
branchiér et pués chouèsir un contresegno novél.
Voutron contresegno temporèro èxpirerat dens {{PLURAL:$5|un jorn|$5 jorns}}.
de voutron contresegno et que vos souhètâd pas més lo changiér, vos
pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contresegno.',
'noemail' => 'Nion’adrèce èlèctronica est étâye encartâye por l’utilisator « $1 ».',
-'noemailcreate' => 'Vos dête balyér n’adrèce èlèctronica justa',
+'noemailcreate' => 'Vos dête balyér un’adrèce èlèctronica justa',
'passwordsent' => 'Un contresegno novél est étâ mandâ a l’adrèce èlèctronica de l’utilisator « $1 ».
Se vos plét, tornâd-vos branchiér aprés l’avêr reçu.',
'blocked-mailpassword' => 'Voutron adrèce IP est blocâye en ècritura, la fonccion de sovegnence du contresegno est vêr dèsactivâye por èvitar los abus.',
'throttled-mailpassword' => 'Un mèssâjo de sovegnence de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.
Por èvitar los abus, ren que yon serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.',
'mailerror' => 'Fôta pendent l’èxpèdicion du mèssâjo : $1',
-'acct_creation_throttle_hit' => 'Des visitors de cél vouiqui-que qu’emplèyont voutron adrèce IP ont fêt $1 compto{{PLURAL:$1||s}} pendent lo jorn passâ, cen qu’est lo més ôtorisâ dens ceti temps.
+'acct_creation_throttle_hit' => 'Des visitors de cél vouiqui-que qu’emplèyont voutron adrèce IP ant fêt $1 compto{{PLURAL:$1||s}} pendent lo jorn passâ, cen qu’est lo més ôtorisâ dens ceti temps.
Du côp los visitors qu’emplèyont cel’adrèce IP pôvont fâre gins de compto por lo moment.',
'emailauthenticated' => 'Voutron adrèce èlèctronica est étâye ôtentifiâye lo $2 a $3.',
'emailnotauthenticated' => 'Voutron adrèce èlèctronica est p’oncor ôtentifiâye.
Nion mèssâjo serat mandâ por châcuna de cetes fonccionalitâts.',
-'noemailprefs' => 'Spècifiâd n’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccionalitâts.',
+'noemailprefs' => 'Spècifiâd un’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccionalitâts.',
'emailconfirmlink' => 'Confirmâd voutron adrèce èlèctronica',
'invalidemailaddress' => 'Cet’adrèce èlèctronica pôt pas étre accèptâye, semble avêr un format pas justo.
-Se vos plét, buchiéd n’adrèce bien formatâye ou ben lèssiéd cél champ vouedo.',
+Se vos plét, buchiéd un’adrèce bien formatâye ou ben lèssiéd cél champ vouedo.',
'cannotchangeemail' => 'Les adrèces èlèctroniques des comptos pôvont pas étre changiêes sur ceti vouiqui.',
'emaildisabled' => 'Ceti seto pôt pas mandar des mèssâjos.',
'accountcreated' => 'Compto fêt',
Se vos plét, atende devant que tornar èprovar.',
'login-abort-generic' => 'Voutra tentativa de branchement at pas reussi - Anulâye',
'loginlanguagelabel' => 'Lengoua : $1',
-'suspicious-userlogout' => 'Voutra demanda de dèbranchement est étâye refusâye, semble qu’el est étâye mandâye per un navigator câsso ou ben la misa en cacho d’un proxi.',
+'suspicious-userlogout' => 'Voutra demanda de dèbranchement est étâye refusâye, semble qu’el est étâye mandâye per un navigator câsso ou ben la mêsa en cacho d’un proxi.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Fôta encognua dens la fonccion mail() de PHP.',
-'user-mail-no-addy' => 'Il at èprovâ de mandar un mèssâjo sen adrèce èlèctronica.',
-'user-mail-no-body' => 'Il at èprovâ de mandar un mèssâjo avouéc un côrp vouedo ou ben dèrêsonâblament côrt.',
+'user-mail-no-addy' => 'Èprôva de mandar un mèssâjo sen adrèce èlèctronica.',
+'user-mail-no-body' => 'Èprôva de mandar un mèssâjo avouéc un côrp vouedo ou ben dèrêsonâblament côrt.',
# Change password dialog
'resetpass' => 'Changiér lo contresegno',
'resetpass-temp-password' => 'Contresegno temporèro :',
# Special:PasswordReset
-'passwordreset' => 'Remisa a zérô du contresegno',
+'passwordreset' => 'Remês’a zérô du contresegno',
'passwordreset-text' => 'Rempléd ceti formulèro por recêvre un mèssâjo de sovegnence des dètalys de voutron compto.',
-'passwordreset-legend' => 'Remetre a zérô lo contresegno',
-'passwordreset-disabled' => 'La remisa a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yona de les piéces de donâs ce-desot}}',
+'passwordreset-legend' => 'Rebetar a zérô lo contresegno',
+'passwordreset-disabled' => 'La remês’a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
+'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yona de les piéces de balyês ce-desot}}',
'passwordreset-username' => 'Nom d’utilisator :',
'passwordreset-domain' => 'Domêno :',
'passwordreset-capture' => 'Est-o que vos voléd vêre lo mèssâjo que rèsulte ?',
Vos vos pouede veriér vers $1 ou ben yon des ôtros [[{{MediaWiki:Grouppage-sysop}}|administrators]] por nen discutar.
-Notâd que vos porréd pas empleyér la fonccionalitât « Lui mandar un mèssâjo » du muens que vos èyâd n’adrèce èlèctronica justa encartâye dens voutres [[Special:Preferences|prèferences]] et que vos seyâd pas étâ blocâ de l’empleyér.
+Notâd que vos porréd pas empleyér la fonccionalitât « Lui mandar un mèssâjo » du muens que vos èyâd un’adrèce èlèctronica justa encartâye dens voutres [[Special:Preferences|prèferences]] et que vos seyâd pas étâ blocâ de l’empleyér.
Voutron adrèce IP d’ora est $3, et l’identifient de blocâjo est $5.
Se vos plét, entrebetâd tôs los dètalys ce-dessus dedens na demanda la quinta que seye que vos faréd.",
Se vos éte arrevâ{{GENDER:||ye|(ye)}} ice per fôta, clicâd sur lo boton '''Devant''' de voutron navigator.",
'anontalkpagetext' => "----''O est la pâge de discussion d’un utilisator anonimo qu’at p’oncor fêt un compto ou ben que nen emplèye pas.
Por cen nos devens empleyér la sin’adrèce IP numerica por lo recognetre.
-N’adrèce IP d’ense pôt étre partagiêe per un mouél d’utilisators.
-Se vos éte {{GENDER:|un utilisator|n’utilisatrice|un utilisator}} anonim{{GENDER:|o|a|o}} et pués se vos constatâd que des comentèros que vos regârdont pas vos sont étâs adrèciês, se vos plét [[Special:UserLogin/signup|féte un compto]] ou ben [[Special:UserLogin|branchiéd-vos]] por èvitar tota confusion que vint avouéc d’ôtros utilisators anonimos.''",
+Un’adrèce IP d’ense pôt étre partagiêe per un mouél d’utilisators.
+Se vos éte {{GENDER:|un utilisator|un’utilisatrice|un utilisator}} anonim{{GENDER:|o|a|o}} et pués se vos constatâd que des comentèros que vos regârdont pas vos sont étâs adrèciês, se vos plét [[Special:UserLogin/signup|féte un compto]] ou ben [[Special:UserLogin|branchiéd-vos]] por èvitar tota confusion que vint avouéc d’ôtros utilisators anonimos.''",
'noarticletext' => 'Ora y at gins de tèxto dedens cela pâge.
Vos pouede [[Special:Search/{{PAGENAME}}|fâre na rechèrche sur cél titro]] dedens les ôtres pâges,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechèrchiér dedens los jornals liyês]
'token_suffix_mismatch' => "'''Voutron changement est pas étâ accèptâ, voutron cliant at mècllâ los caractèros de ponctuacion dedens lo jeton de changement.'''
Lo changement est étâ refusâ por empachiér la corrupcion du tèxto de la pâge.
Des côps ceti problèmo arreve quand vos empleyéd un sèrviço de proxi Vouèbe anonimo qu’est pas de sûr.",
-'edit_form_incomplete' => "'''Quârques parties du formulèro de changement ont pas avengiê lo sèrvior ; controlâd que voutros changements sont entiérs et pués tornâd èprovar.'''",
+'edit_form_incomplete' => "'''Quârques parties du formulèro de changement ant pas avengiê lo sèrvior ; controlâd que voutros changements sont entiérs et pués tornâd èprovar.'''",
'editing' => 'Changement de $1',
'creating' => 'Crèacion de $1',
'editingsection' => 'Changement de $1 (sèccion)',
'''Empleyéd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !'''",
'longpageerror' => "'''Fôta : lo tèxto que vos éd mandâ fât {{PLURAL:$1|un Kio|$1 Kio}}, cen que dèpâsse la limita fixâye a {{PLURAL:$2|un Kio|$2 Kio}}.'''
Pôt pas étre encartâ.",
-'readonlywarning' => "'''Atencion : la bâsa de donâs est étâye vèrrolyêe por mantegnence, vos porréd vêr pas encartar voutros changements d’abôrd.'''
+'readonlywarning' => "'''Atencion : la bâsa de balyês est étâye vèrrolyêe por mantegnence, vos porréd vêr pas encartar voutros changements d’abôrd.'''
Vos pouede copiyér et côlar voutron tèxto dedens un fichiér tèxto et pués l’encartar por ples târd.
-L’administrator qu’at vèrrolyê la bâsa de donâs at balyê cet’èxplicacion : $1",
-'protectedpagewarning' => "'''Atencion : ceta pâge est étâye protègiêe de façon que solament los utilisators qu’ont lo statut d’administrator la pouessont changiér.'''
+L’administrator qu’at vèrrolyê la bâsa de balyês at balyê cet’èxplicacion : $1",
+'protectedpagewarning' => "'''Atencion : ceta pâge est étâye protègiêe de façon que solament los utilisators qu’ant lo statut d’administrator la pouessont changiér.'''
Por refèrence, la dèrriére entrâ du jornal est balyêe ce-desot :",
'semiprotectedpagewarning' => "'''Nota :''' ceta pâge est étâye protègiêe de façon que solament los utilisators encartâs la pouessont changiér.
Por refèrence, la dèrriére entrâ du jornal est balyêe ce-desot :",
-'cascadeprotectedwarning' => "'''Atencion :''' cela pâge-que est étâye protègiêe de façon que solament los utilisators qu’ont lo statut d’administrator la pouessont changiér, perce qu’el est entrebetâye dedens {{PLURAL:$1|ceta pâge protègiêe|cetes pâges protègiêes}} avouéc la « protèccion en cascâda » activâye :",
+'cascadeprotectedwarning' => "'''Atencion :''' cela pâge-que est étâye protègiêe de façon que solament los utilisators qu’ant lo statut d’administrator la pouessont changiér, perce qu’el est entrebetâye dedens {{PLURAL:$1|ceta pâge protègiêe|cetes pâges protègiêes}} avouéc la « protèccion en cascâda » activâye :",
'titleprotectedwarning' => "'''Atencion : ceta pâge est étâye protègiêe de façon que des [[Special:ListGroupRights|drêts spècificos]] sont nècèssèros por la povêr fâre.'''
Por refèrence, la dèrriére entrâ du jornal est balyêe ce-desot :",
'templatesused' => '{{PLURAL:$1|Modèlo empleyê|Modèlos empleyês}} per ceta pâge :',
Ègziste ja.',
'defaultmessagetext' => 'Mèssâjo per dèfôt',
'content-failed-to-parse' => 'Falyita de l’analisa du contegnu de $2 por lo modèlo $1 : $3',
-'invalid-content-data' => 'Donâs du contegnu pas justes',
+'invalid-content-data' => 'Balyês du contegnu pas justes',
'content-not-allowed-here' => 'Lo contegnu « $1 » est pas ôtorisâ sur la pâge [[$2]]',
# Content models
'cur' => 'd’ora',
'next' => 'aprés',
'last' => 'devant',
-'page_first' => 'Premiére',
+'page_first' => 'premiére',
'page_last' => 'dèrriére',
'histlegend' => "Chouèx de difs : pouentâd les câses de les vèrsions a comparar et pués apoyéd dessus « Entrâ » ou ben lo boton d’avâl.<br />
Lègenda : '''({{int:cur}})''' = difèrence avouéc la vèrsion d’ora, '''({{int:last}})''' = difèrence avouéc la vèrsion devant, '''{{int:minoreditletter}}''' = petiôt changement.",
'history-feed-item-nocomment' => '$1 lo $3 a $4',
'history-feed-empty' => 'La pâge demandâye ègziste pas.
Pôt-étre el est étâye suprimâye du vouiqui ou ben renomâye.
-Èprovâd de [[Special:Search|rechèrchiér sur lo vouiqui]] por trovar des pâges novèles que vont avouéc.',
+Èprovâd de [[Special:Search|rechèrchiér sur lo vouiqui]] por trovar des pâges novèles que vant avouéc.',
# Revision deletion
'rev-deleted-comment' => '(rèsumâ de changement enlevâ)',
'revdelete-confirm' => 'Se vos plét, confirmâd qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences et pués que vos o féte en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].',
'revdelete-suppress-text' => "La rèprèssion dêt étre empleyêe '''ren que''' dens cetos câs :
* Enformacions que pôvont étre difamatouères
-* Enformacions a sè que vont pas avouéc
+* Enformacions a sè que vant pas avouéc
*: ''adrèces et numerôs de tèlèfono, numerôs de sècuritât sociâla, et tot cen que vat avouéc''",
'revdelete-legend' => 'Dèfenir des rèstriccions de visibilitât',
'revdelete-hide-text' => 'Cachiér lo tèxto de la vèrsion',
'revdelete-hide-name' => 'Cachiér l’accion et la ciba',
'revdelete-hide-comment' => 'Cachiér lo rèsumâ de changement',
'revdelete-hide-user' => 'Cachiér lo nom d’utilisator / l’adrèce IP du contributor',
-'revdelete-hide-restricted' => 'Rèprimar celes donâs ux administrators et pués ux ôtros',
+'revdelete-hide-restricted' => 'Rèprimar celes balyês ux administrators et pués ux ôtros',
'revdelete-radio-same' => '(pas changiér)',
'revdelete-radio-set' => 'Ouè',
'revdelete-radio-unset' => 'Nan',
-'revdelete-suppress' => 'Rèprimar celes donâs ux administrators et pués ux ôtros',
+'revdelete-suppress' => 'Rèprimar celes balyês ux administrators et pués ux ôtros',
'revdelete-unsuppress' => 'Enlevar les rèstriccions sur les vèrsions refêtes',
'revdelete-log' => 'Rêson :',
'revdelete-submit' => 'Aplicar a {{PLURAL:$1|la vèrsion chouèsia|les vèrsions chouèsies}}',
Vos y éd pas accès.',
'revdelete-modify-no-access' => 'Fôta en changient la piéce datâye du $1 a $2 : el est marcâye coment « rètrenta ».
Vos y éd pas accès.',
-'revdelete-modify-missing' => 'Fôta en changient la piéce avouéc l’identifient $1 : el est manquenta dedens la bâsa de donâs !',
+'revdelete-modify-missing' => 'Fôta en changient la piéce avouéc l’identifient $1 : el est manquenta dedens la bâsa de balyês !',
'revdelete-no-change' => "'''Atencion :''' la piéce datâye du $1 a $2 at ja la configuracion de visibilitât demandâye.",
'revdelete-concurrent-change' => 'Fôta en changient la piéce datâye du $1 a $2 : lo sin statut semble étre étâ changiê per un ôtro justo que vos èprovâvâd d’o changiér.
Se vos plét, controlâd los jornals.',
'revdelete-only-restricted' => 'Fôta en cachient la piéce datâye du $1 a $2 : vos pouede pas rèprimar celes piéces de la vua ux administrators sen chouèsir avouéc des ôtros chouèx de visibilitât.',
'revdelete-reason-dropdown' => '*Rêsons corentes de suprèssion
** Violacion du drêt d’ôtor
-** Comentèros ou ben enformacions a sè que vont pas avouéc
+** Comentèros ou ben enformacions a sè que vant pas avouéc
** Nom d’utilisator que vat pas avouéc
** Enformacions que pôvont étre difamatouères',
'revdelete-otherreason' => 'Ôtra rêson / rêson de ples :',
# Suppression log
'suppressionlog' => 'Jornal de les suprèssions',
-'suppressionlogtext' => 'Vê-que na lista de les suprèssions et des blocâjos qu’ont de contegnu cachiê ux administrators.
+'suppressionlogtext' => 'Vê-que na lista de les suprèssions et des blocâjos qu’ant de contegnu cachiê ux administrators.
Vêde la [[Special:BlockList|lista des blocâjos]] por la lista des banissements et des blocâjos que sont ora actifs.',
# History merging
'mergehistory-list' => 'Historico des changements que pôvont étre fusionâs',
'mergehistory-merge' => 'Cetes vèrsions de [[:$1]] pôvont étre fusionâyes dedens [[:$2]].
Empleyéd la colona de botons de chouèx por fusionar ren que les vèrsions fêtes du comencement tant qu’a la dâta spècifiâye.
-Notâd que l’usâjo des lims de navigacion remetrat a zérô cela colona.',
+Notâd que l’usâjo des lims de navigacion rebeterat a zérô cela colona.',
'mergehistory-go' => 'Montrar los changements que pôvont étre fusionâs',
'mergehistory-submit' => 'Fusionar les vèrsions',
'mergehistory-empty' => 'Niona vèrsion pôt étre fusionâye.',
'searchresults' => 'Rèsultats de la rechèrche',
'searchresults-title' => 'Rèsultats de la rechèrche por « $1 »',
'searchresulttext' => 'Por més d’enformacions sur la rechèrche dedens {{SITENAME}}, vêde [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => "Vos éd rechèrchiê « '''[[:$1]]''' » ([[Special:Prefixindex/$1|totes les pâges que començont per « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|totes les pâges qu’ont un lim de vers « $1 »]])",
+'searchsubtitle' => "Vos éd rechèrchiê « '''[[:$1]]''' » ([[Special:Prefixindex/$1|totes les pâges que començont per « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|totes les pâges qu’ant un lim de vers « $1 »]])",
'searchsubtitleinvalid' => "Vos éd rechèrchiê « '''$1''' »",
'toomanymatches' => 'Un mouél de corrèspondances est étâ retornâ, se vos plét èprovâd na rechèrche difèrenta',
'titlematches' => 'Corrèspondances dedens los titros de les pâges',
# Quickbar
'qbsettings' => 'Bârra rapida',
'qbsettings-none' => 'Pas yona',
-'qbsettings-fixedleft' => 'Fixa a gôche',
-'qbsettings-fixedright' => 'Fixa a drêta',
-'qbsettings-floatingleft' => 'Fllotenta a gôche',
-'qbsettings-floatingright' => 'Fllotenta a drêta',
+'qbsettings-fixedleft' => 'Fix’a gôche',
+'qbsettings-fixedright' => 'Fix’a drêta',
+'qbsettings-floatingleft' => 'Fllotent’a gôche',
+'qbsettings-floatingright' => 'Fllotent’a drêta',
'qbsettings-directionality' => 'Fixa, d’aprés la dirèccionalitât d’ècritura de voutra lengoua',
# Preferences page
'prefs-misc' => 'De totes sôrtes',
'prefs-resetpass' => 'Changiér lo contresegno',
'prefs-changeemail' => 'Changiér l’adrèce èlèctronica',
-'prefs-setemail' => 'Dèfenir n’adrèce èlèctronica',
+'prefs-setemail' => 'Dèfenir un’adrèce èlèctronica',
'prefs-email' => 'Chouèx de mèssageria èlèctronica',
'prefs-rendering' => 'Aparence',
'saveprefs' => 'Encartar',
Vê-que na valor fêta per hasârd que vos pouede empleyér : $1',
'savedprefs' => 'Voutres prèferences sont étâyes encartâyes.',
'timezonelegend' => 'Fus horèro :',
-'localtime' => 'Hora locala :',
+'localtime' => 'Hora locâla :',
'timezoneuseserverdefault' => 'Empleyér la valor du vouiqui per dèfôt ($1)',
'timezoneuseoffset' => 'Ôtro (spècifiar lo dècalâjo)',
'timezoneoffset' => 'Dècalâjo horèro¹ :',
Cel’enformacion serat publica.',
'email' => 'Mèssageria èlèctronica',
'prefs-help-realname' => 'U chouèx : se vos lo balyéd, serat empleyê por vos atribuar voutres ôvres.',
-'prefs-help-email' => 'U chouèx : mas el est nècèssèra por remetre a zérô voutron contresegno, se vos vegnévâd a l’oubliar.',
+'prefs-help-email' => 'L’adrèce èlèctronica est u chouèx, mas el est nècèssèra por rebetar a zérô voutron contresegno, se vos vegnévâd a l’oubliar.',
'prefs-help-email-others' => 'Vos porriâd asse-ben chouèsir de lèssiér los ôtros sè veriér vers vos per mèssageria èlèctronica avouéc un lim sur voutra pâge utilisator ou ben de discussion sen que seye nècèssèro de rèvèlar voutron identitât.',
-'prefs-help-email-required' => 'N’adrèce èlèctronica est nècèssèra.',
+'prefs-help-email-required' => 'Un’adrèce èlèctronica est nècèssèra.',
'prefs-info' => 'Enformacions de bâsa',
'prefs-i18n' => 'Entèrnacionalisacion',
'prefs-signature' => 'Signatura',
'prefs-displaywatchlist' => 'Chouèx de vua',
'prefs-diffs' => 'Difèrences',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'L’adrèce èlèctronica semble justa',
-'email-address-validity-invalid' => 'Buchiéd n’adrèce èlèctronica justa',
+'email-address-validity-invalid' => 'Buchiéd un’adrèce èlèctronica justa',
# User rights
'userrights' => 'Administracion des drêts d’utilisator',
* Na petiôt’ètêla (*) endique que vos pouede pas enlevar cela tropa setout que vos l’éd apondua ou ben l’una l’ôtra.',
'userrights-reason' => 'Rêson :',
'userrights-no-interwiki' => 'Vos éd pas la pèrmission de changiér des drêts d’utilisator dessus d’ôtros vouiquis.',
-'userrights-nodatabase' => 'La bâsa de donâs « $1 » ègziste pas ou ben el est pas locala.',
+'userrights-nodatabase' => 'La bâsa de balyês « $1 » ègziste pas ou ben est pas locâla.',
'userrights-nologin' => 'Vos vos dête [[Special:UserLogin|branchiér]] avouéc un compto d’administrator por balyér des drêts d’utilisator.',
'userrights-notallowed' => 'Voutron compto at pas la pèrmission de balyér ou ben enlevar des drêts d’utilisator.',
'userrights-changeable-col' => 'Les tropes que vos pouede changiér',
'right-reupload' => 'Ècllafar un fichiér ègzistent',
'right-reupload-own' => 'Ècllafar un fichiér ègzistent tèlèchargiê per sè-mémo',
'right-reupload-shared' => 'Ècllafar localament un fichiér present sur un dèpôt de fichiérs mèdia partagiê',
-'right-upload_by_url' => 'Tèlèchargiér un fichiér dês n’URL',
+'right-upload_by_url' => 'Tèlèchargiér un fichiér dês un’URL',
'right-purge' => 'Purgiér lo cacho du seto d’una pâge sen confirmacion',
'right-autoconfirmed' => 'Changiér les pâges mié-protègiêes',
'right-bot' => 'Étre trètâ coment na mètoda ôtomatisâye',
-'right-nominornewtalk' => 'Pas dècllenchiér la notificacion de mèssâjo novél quand font un petiôt changement sur la pâge de discussion d’un utilisator',
+'right-nominornewtalk' => 'Pas dècllenchiér la notificacion de mèssâjo novél quand fant un petiôt changement sur la pâge de discussion d’un utilisator',
'right-apihighlimits' => 'Empleyér des limites ples hôtes dedens les demandes API',
'right-writeapi' => 'Empleyér l’API d’ècritura',
'right-delete' => 'Suprimar des pâges',
-'right-bigdelete' => 'Suprimar des pâges qu’ont un grôs historico',
-'right-deletelogentry' => 'Suprimar et refâre n’entrâ spècifica du jornal',
+'right-bigdelete' => 'Suprimar des pâges qu’ant un grôs historico',
+'right-deletelogentry' => 'Suprimar et refâre un’entrâ spècifica du jornal',
'right-deleterevision' => 'Suprimar et refâre na vèrsion spècifica d’una pâge',
'right-deletedhistory' => 'Vêre les entrâs suprimâyes de l’historico sen lor tèxto',
'right-deletedtext' => 'Vêre lo tèxto suprimâ et los changements entre les vèrsions suprimâyes',
'right-mergehistory' => 'Fusionar los historicos de les pâges',
'right-userrights' => 'Changiér tôs los drêts d’un utilisator',
'right-userrights-interwiki' => 'Changiér los drêts d’utilisator des utilisators que sont sur un ôtro vouiqui',
-'right-siteadmin' => 'Vèrrolyér et dèvèrrolyér la bâsa de donâs',
+'right-siteadmin' => 'Vèrrolyér et dèvèrrolyér la bâsa de balyês',
'right-override-export-depth' => 'Èxportar les pâges avouéc les pâges liyêes tant qu’a na provondior de 5 nivéls',
'right-sendemail' => 'Mandar un mèssâjo ux ôtros utilisators',
-'right-passwordreset' => 'Vêre los mèssâjos de remisa a zérô des contresegnos',
+'right-passwordreset' => 'Vêre los mèssâjos de remês’a zérô des contresegnos',
# Special:Log/newusers
'newuserlogpage' => 'Jornal de les crèacions d’utilisators',
'action-upload' => 'tèlèchargiér cél fichiér',
'action-reupload' => 'ècllafar cél fichiér ègzistent',
'action-reupload-shared' => 'ècllafar localament cél fichiér present sur un dèpôt partagiê',
-'action-upload_by_url' => 'tèlèchargiér cél fichiér dês n’URL',
+'action-upload_by_url' => 'tèlèchargiér cél fichiér dês un’URL',
'action-writeapi' => 'empleyér l’API d’ècritura',
'action-delete' => 'suprimar cela pâge',
'action-deleterevision' => 'suprimar cela vèrsion',
'action-mergehistory' => 'fusionar l’historico de cela pâge',
'action-userrights' => 'changiér tôs los drêts d’utilisator',
'action-userrights-interwiki' => 'changiér los drêts d’utilisator des utilisators que sont sur un ôtro vouiqui',
-'action-siteadmin' => 'vèrrolyér ou ben dèvèrrolyér la bâsa de donâs',
+'action-siteadmin' => 'vèrrolyér ou ben dèvèrrolyér la bâsa de balyês',
'action-sendemail' => 'mandar des mèssâjos',
# Recent changes
'rc_categories_any' => 'Totes',
'rc-change-size-new' => '$1 octèt{{PLURAL:$1||s}} aprés changement',
'newsectionsummary' => '/* $1 */ novèla sèccion',
-'rc-enhanced-expand' => 'Montrar los dètalys (il at fôta de JavaScript)',
+'rc-enhanced-expand' => 'Montrar los dètalys (at fôta de JavaScript)',
'rc-enhanced-hide' => 'Cachiér los dètalys',
'rc-old-title' => 'fêta avouéc lo titro originâl « $1 »',
'upload-tryagain' => 'Mandar la dèscripcion du fichiér changiê',
'uploadnologin' => 'Pas branchiê(ye)',
'uploadnologintext' => 'Vos dête étre [[Special:UserLogin|branchiê(ye)]] por povêr tèlèchargiér des fichiérs.',
-'upload_directory_missing' => 'Lo rèpèrtouèro de tèlèchargement ($1) est manquent et il at pas possu étre fêt per lo sèrvior Vouèbe.',
+'upload_directory_missing' => 'Lo rèpèrtouèro de tèlèchargement ($1) est manquent et at pas possu étre fêt per lo sèrvior Vouèbe.',
'upload_directory_read_only' => 'Lo rèpèrtouèro de tèlèchargement ($1) est pas accèssiblo en ècritura dês lo sèrvior Vouèbe.',
'uploaderror' => 'Fôta pendent lo tèlèchargement',
'upload-recreate-warning' => "'''Atencion : un fichiér avouéc cél nom est étâ suprimâ ou ben dèplaciê.'''
'filename-tooshort' => 'Lo nom du fichiér est trop côrt.',
'filetype-banned' => 'Cél tipo de fichiér est dèfendu.',
'verification-error' => 'Cél fichiér pâsse pas lo contrôlo des fichiérs.',
-'hookaborted' => 'Lo changement que vos éd èprovâ de fâre est étâ anulâ per n’èxtension.',
+'hookaborted' => 'Lo changement que vos éd èprovâ de fâre est étâ anulâ per un’èxtension.',
'illegal-filename' => 'Lo nom du fichiér est pas ôtorisâ.',
'overwrite' => 'Ècllafar un fichiér ègzistent est pas ôtorisâ.',
'unknown-error' => 'Na fôta encognua est arrevâ.',
* Nom du fichiér a tèlèchargiér : <strong>[[:$1]]</strong>
* Nom du fichiér ègzistent : <strong>[[:$2]]</strong>
Se vos plét, chouèsésséd-nen un ôtro.',
-'fileexists-thumbnail-yes' => "Lo fichiér semble étre n’émâge en talye rèduita ''(figura)''.
+'fileexists-thumbnail-yes' => "Lo fichiér semble étre un’émâge en talye rèduita ''(figura)''.
[[$1|thumb]]
Se vos plét, controlâd lo fichiér <strong>[[:$1]]</strong>.
Se lo fichiér controlâ est la mém’émâge avouéc la talye originâla, y at pas fôta de tèlèchargiér na figura.",
'file-thumbnail-no' => "Lo nom du fichiér comence per <strong>$1</strong>.
-Semble étre n’émâge en talye rèduita ''(figura)''.
+Semble étre un’émâge en talye rèduita ''(figura)''.
Se vos éd cel’émâge en plêna rèsolucion, tèlèchargiéd-la, ôtrament changiéd lo sin nom, se vos plét.",
'fileexists-forbidden' => 'Un fichiér avouéc cél nom ègziste ja et pôt pas étre ècllafâ.
Se vos voléd adés tèlèchargiér voutron fichiér, se vos plét tornâd arriér et pués empleyéd un novél nom.
'backend-fail-notsame' => 'Un fichiér pas pariér ègziste ja a « $1 ».',
'backend-fail-invalidpath' => '« $1 » est pas un chemin de stocâjo justo.',
'backend-fail-delete' => 'Y at pas moyen de suprimar lo fichiér « $1 ».',
-'backend-fail-describe' => 'Y at pas moyen de changiér les mètadonâs du fichiér « $1 ».',
+'backend-fail-describe' => 'Y at pas moyen de changiér les mètabalyês du fichiér « $1 ».',
'backend-fail-alreadyexists' => 'Lo fichiér « $1 » ègziste ja.',
'backend-fail-store' => 'Y at pas moyen de stocar lo fichiér « $1 » dedens « $2 ».',
'backend-fail-copy' => 'Y at pas moyen de copiyér lo fichiér « $1 » vers « $2 ».',
'backend-fail-usable' => 'Y at pas moyen de liére d’ècrire lo fichiér « $1 » a côsa de pèrmissions ensufisentes ou ben de rèpèrtouèros / conteniors manquents.',
# File journal errors
-'filejournal-fail-dbconnect' => 'Y at pas moyen de sè branchiér a la bâsa de donâs du jornal por lo sistèmo de stocâjo « $1 ».',
-'filejournal-fail-dbquery' => 'Y at pas moyen de betar a jorn la bâsa de donâs du jornal por lo sistèmo de stocâjo « $1 ».',
+'filejournal-fail-dbconnect' => 'Y at pas moyen de sè branchiér a la bâsa de balyês du jornal por lo sistèmo de stocâjo « $1 ».',
+'filejournal-fail-dbquery' => 'Y at pas moyen de betar a jorn la bâsa de balyês du jornal por lo sistèmo de stocâjo « $1 ».',
# Lock manager
'lockmanager-notlocked' => 'Y at pas moyen de dèvèrrolyér « $1 » ; il est pas vèrrolyê.',
'lockmanager-fail-acquirelock' => 'Y at pas moyen d’avêr lo vèrroly por « $1 ».',
'lockmanager-fail-openlock' => 'Y at pas moyen d’uvrir lo fichiér de vèrroly por « $1 ».',
'lockmanager-fail-releaselock' => 'Y at pas moyen de relâchiér lo vèrroly por « $1 ».',
-'lockmanager-fail-db-bucket' => 'Y at pas moyen de sè veriér vers prod de bâses de donâs de vèrroly dedens la sèlye $1.',
-'lockmanager-fail-db-release' => 'Y at pas moyen de relâchiér los vèrrolys sur la bâsa de donâs $1.',
+'lockmanager-fail-db-bucket' => 'Y at pas moyen de sè veriér vers prod de bâses de balyês de vèrroly dedens la sèlye $1.',
+'lockmanager-fail-db-release' => 'Y at pas moyen de relâchiér los vèrrolys sur la bâsa de balyês $1.',
'lockmanager-fail-svr-acquire' => 'Y at pas moyen d’avêr des vèrrolys sur lo sèrvior $1.',
'lockmanager-fail-svr-release' => 'Y at pas moyen de relâchiér los vèrrolys sur lo sèrvior $1.',
'uploadstash-summary' => 'Ceta pâge balye accès ux fichiérs que sont tèlèchargiês ou ben en côrs de tèlèchargement, mas sont p’oncor publeyês dedens lo vouiqui. Celos fichiérs sont p’oncor visiblos, solament por l’utilisator que los at tèlèchargiês.',
'uploadstash-clear' => 'Èfaciér los fichiérs en cacho',
'uploadstash-nofiles' => 'Vos éd gins de fichiér en cacho.',
-'uploadstash-badtoken' => 'L’ègzécucion de cel’accion at pas reussi, pôt-étre perce que voutros identifients de changement ont èxpirâ. Tornâd èprovar.',
+'uploadstash-badtoken' => 'L’ègzécucion de cel’accion at pas reussi, pôt-étre perce que voutros identifients de changement ant èxpirâ. Tornâd èprovar.',
'uploadstash-errclear' => 'L’èfacement des fichiérs at pas reussi.',
'uploadstash-refresh' => 'Rafrèchir la lista des fichiérs',
'invalid-chunk-offset' => 'Dèplacement de bocon pas justo',
'upload-curl-error28' => 'Dèlê dèpassâ pendent lo tèlèchargement',
'upload-curl-error28-text' => 'Lo seto at tardâ bien a rèpondre.
Se vos plét, controlâd que lo seto est en legne, atende un pou et pués tornâd èprovar.
-Vos pouede asse-ben èprovar a n’hora de muendra afluence.',
+Vos pouede asse-ben èprovar a un’hora de muendra afluence.',
'license' => 'Licence :',
'license-header' => 'Licence',
'nolicense' => 'Pas yona chouèsia',
'license-nopreview' => '(Apèrçu pas disponiblo)',
-'upload_source_url' => ' (n’URL justa et accèssibla publicament)',
+'upload_source_url' => ' (un’URL justa et accèssibla publicament)',
'upload_source_file' => ' (un fichiér sur voutron ordenator)',
# Special:ListFiles
'filerevert-defaultcomment' => 'Rèvocâ a la vèrsion du $1 a $2',
'filerevert-submit' => 'Rèvocar',
'filerevert-success' => "'''[[Media:$1|$1]]''' est étâ rèvocâ a la [$4 vèrsion du $2 a $3].",
-'filerevert-badversion' => 'Y at gins de vèrsion locala devant de cél fichiér avouéc l’horodatâjo balyê.',
+'filerevert-badversion' => 'Y at gins de vèrsion locâla devant de cél fichiér avouéc l’horodatâjo balyê.',
# File deletion
'filedelete' => 'Suprimar $1',
'statistics-views-peredit' => 'Vues per changement',
'statistics-users' => '[[Special:ListUsers|Utilisators]] encartâs',
'statistics-users-active' => 'Utilisators actifs',
-'statistics-users-active-desc' => 'Utilisators qu’ont fêt por lo muens n’accion pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}',
+'statistics-users-active-desc' => 'Utilisators qu’ant fêt por lo muens un’accion pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}',
'statistics-mostpopular' => 'Pâges les ples vues',
-'disambiguations' => 'Pâges qu’ont des lims de vers des pâges d’homonimia',
+'disambiguations' => 'Pâges qu’ant des lims de vers des pâges d’homonimia',
'disambiguationspage' => 'Template:Homonimia',
-'disambiguations-text' => "Cetes pâges ont por lo muens un lim de vers na '''pâge d’homonimia'''.
+'disambiguations-text' => "Cetes pâges ant por lo muens un lim de vers na '''pâge d’homonimia'''.
Devriant pletout pouentar vers na pâge que vat avouéc.<br />
Na pâge est trètâye coment na pâge d’homonimia s’emplèye un modèlo liyê a [[MediaWiki:Disambiguationspage]].",
'brokenredirects-delete' => 'suprimar',
'withoutinterwiki' => 'Pâges sen lims entèrlengoues',
-'withoutinterwiki-summary' => 'Cetes pâges ont gins de lim de vers d’ôtres lengoues.',
+'withoutinterwiki-summary' => 'Cetes pâges ant gins de lim de vers d’ôtres lengoues.',
'withoutinterwiki-legend' => 'Prèfixo',
'withoutinterwiki-submit' => 'Montrar',
'move' => 'Dèplaciér',
'movethispage' => 'Dèplaciér ceta pâge',
'unusedimagestext' => 'Cetos fichiérs ègzistont, mas sont pas entrebetâs dedens niona pâge.
-Se vos plét, notâd que d’ôtros setos Vouèbe pôvont avêr un lim de vers un fichiér avouéc n’URL drêta, donc un fichiér pôt adés étre listâ ique pendent qu’il est en usâjo actif.',
+Se vos plét, notâd que d’ôtros setos Vouèbe pôvont avêr un lim de vers un fichiér avouéc un’URL drêta, donc un fichiér pôt adés étre listâ ique pendent qu’il est en usâjo actif.',
'unusedcategoriestext' => 'Cetes catègories ègzistont, mas nion’ôtra pâge niona catègorie les emplèye.',
'notargettitle' => 'Niona ciba',
'notargettext' => 'Vos éd pas spècifiâ na pâge un utilisator ciba sur laquinta / loquint vos souhètâd fâre cel’accion.',
'allpagesnext' => 'Aprés',
'allpagessubmit' => 'Listar',
'allpagesprefix' => 'Fâre vêre les pâges que començont per lo prèfixo :',
-'allpagesbadtitle' => 'Lo titro de la pâge balyêe est pas justo ou ben il at un prèfixo entèrlengoua ou entèrvouiqui resèrvâ.
+'allpagesbadtitle' => 'Lo titro de la pâge balyêe est pas justo ou ben contint un prèfixo entèrlengoua ou entèrvouiqui resèrvâ.
Contint de sûr yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.',
'allpages-bad-ns' => '{{SITENAME}} at gins d’èspâço de noms « $1 ».',
'allpages-hide-redirects' => 'Cachiér les redirèccions',
'linksearch-ns' => 'Èspâço de noms :',
'linksearch-ok' => 'Rechèrchiér',
'linksearch-text' => 'Des caractèros j·oquères coment « *.wikipedia.org » pôvont étre empleyês.
-Ils ont fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />
+Ils ant fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />
{{PLURAL:$2|Protocolo recognu|Protocolos recognus}} : <code>$1</code> (http:// per dèfôt se nion protocolo est spècifiâ).',
'linksearch-line' => '$1 est liyê dês $2',
'linksearch-error' => 'Los caractèros j·oquères pôvont étre empleyês ren qu’u comencement du nom de domêno de l’hôto.',
# Special:ActiveUsers
'activeusers' => 'Lista des utilisators actifs',
-'activeusers-intro' => 'O est na lista des utilisators qu’ont ègzèrciê n’activitât la quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.',
+'activeusers-intro' => 'O est na lista des utilisators qu’ant ègzèrciê un’activitât la quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.',
'activeusers-count' => '$1 accion{{PLURAL:$1||s}} pendent {{PLURAL:$3|lo jorn passâ|los $3 jorns passâs}}',
'activeusers-from' => 'Fâre vêre los utilisators dês :',
'activeusers-hidebots' => 'Cachiér los robots',
'listgrouprights-addgroup-self-all' => 'Sè pôt apondre totes les tropes a son prôpro compto',
'listgrouprights-removegroup-self-all' => 'Sè pôt enlevar totes les tropes de son prôpro compto',
-# E-mail user
+# Email user
'mailnologin' => 'Nion’adrèce d’èxpèdior',
-'mailnologintext' => 'Vos dête étre [[Special:UserLogin|branchiê]] et avêr spècifiâ n’adrèce èlèctronica justa dens voutres [[Special:Preferences|prèferences]] por povêr mandar des mèssâjos a d’ôtros utilisators.',
+'mailnologintext' => 'Vos dête étre [[Special:UserLogin|branchiê]] et avêr spècifiâ un’adrèce èlèctronica justa dens voutres [[Special:Preferences|prèferences]] por povêr mandar des mèssâjos a d’ôtros utilisators.',
'emailuser' => 'Lui mandar un mèssâjo',
'emailuser-title-target' => 'Mandar un mèssâjo a cet’utilisat{{GENDER:$1|or|rice}}',
'emailuser-title-notarget' => 'Mandar un mèssâjo a l’utilisator',
'usermaildisabled' => 'L’èxpèdicion de mèssâjos entre utilisators est dèsactivâye',
'usermaildisabledtext' => 'Vos pouede pas mandar de mèssâjos a d’ôtros utilisators sur ceti vouiqui',
'noemailtitle' => 'Nion’adrèce èlèctronica',
-'noemailtext' => 'Cet’utilisator at pas spècifiâ n’adrèce èlèctronica justa.',
+'noemailtext' => 'Cet’utilisator at pas spècifiâ un’adrèce èlèctronica justa.',
'nowikiemailtitle' => 'Niona mèssageria èlèctronica ôtorisâye',
'nowikiemailtext' => 'Cél utilisator at chouèsi de pas recêvre de mèssâjos de la pârt d’ôtros utilisators.',
'emailnotarget' => 'Nom d’utilisator du dèstinatèro pas ègzistent pas justo.',
'emailuserfooter' => 'Ceti mèssâjo est étâ mandâ per « $1 » a « $2 » per la fonccion « Lui mandar un mèssâjo » de {{SITENAME}}.',
# User Messenger
-'usermessage-summary' => 'Il at lèssiê un mèssâjo sistèmo.',
+'usermessage-summary' => 'At lèssiê un mèssâjo sistèmo.',
'usermessage-editor' => 'Mèssagiér du sistèmo',
'usermessage-template' => 'MediaWiki:MèssâjoUtilisator',
'blocklist-params' => 'Paramètres de blocâjo',
'blocklist-reason' => 'Rêson',
'ipblocklist-submit' => 'Rechèrchiér',
-'ipblocklist-localblock' => 'Blocâjo local',
+'ipblocklist-localblock' => 'Blocâjo locâl',
'ipblocklist-otherblocks' => '{{PLURAL:$1|Ôtro blocâjo|Ôtros blocâjos}}',
'infiniteblock' => 'sen fin',
'expiringblock' => 'èxpire lo $1 a $2',
'monthsall' => 'tôs',
'limitall' => 'tôs',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Confirmar l’adrèce èlèctronica',
'confirmemail_noemail' => 'Vos éd pas dèfeni una adrèce èlèctronica valida dens voutres [[Special:Preferences|prèferences]].',
'confirmemail_text' => '{{SITENAME}} at fôta du contrôlo de voutra adrèce èlèctronica devant que povêr utilisar tota fonccion de mèssageria.
'loginlanguagelabel' => 'Spräke: $1',
'suspicious-userlogout' => 'Dan Oufmäldönjfrååge wörd ferwaigred, deer ja fermouslik foon en defäkte browser unti en cache-proxy sånd wörd.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
'user-mail-no-addy' => 'Köö niinj e-mail schake suner e-mail-adres.',
'user-mail-no-body' => 'Dü wulst en e-mail saner tekst wechsjüür.',
'search-interwiki-default' => '$1 resultoote:',
'search-interwiki-more' => '(widere)',
'search-relatedarticle' => 'früne',
-'mwsuggest-disable' => 'forsliike per Ajax deaktiviire',
+'mwsuggest-disable' => "Föörslacher för't sjüken deaktiwiare",
'searcheverything-enable' => 'Onj ål noomerüme säke',
'searchrelated' => 'früne',
'searchall' => 'åle',
'prefs-displaywatchlist' => "Mögelkhaiden för't uunwisin",
'prefs-diffs' => 'Ferskeel',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Detdiar E-Mail-adres schocht gud ütj.',
'email-address-validity-invalid' => 'Du en echt E-Mail-adres uun.',
# Special:ListGroupRights
'listgrouprights-members' => '(lasmoote-list)',
-# E-mail user
+# Email user
'emailuser' => 'E-mail tu dideere brüker',
# Watchlist
'tog-editsection' => 'Cuir am comas deasachadh earainn le ceanglaichean [deasaich]',
'tog-editsectiononrightclick' => "Cuir an comas deasachadh earainn le briogadh deas air tiotal de dh'earrainn (feumaidh seo JavaScript)",
'tog-showtoc' => 'Seall an clàr-innse (air duilleagan air a bheil barrachd air 3 ceann-sgrìobhaidhean)',
-'tog-rememberpassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|latha|latha|làithean|latha}})",
+'tog-rememberpassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
'tog-watchcreations' => "Cuir duilleagan a chruthaicheas mi air a' chlàr-fhaire agam",
'tog-watchdefault' => "Cuir duilleagan a dheasaicheas mi air a' chlàr-fhaire agam",
'tog-watchmoves' => "Cuir duilleagan a ghluaiseas mi air a' chlàr-fhaire agam",
'dec' => 'Dùbh',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}',
+'pagecategories' => '{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}',
'category_header' => 'Duilleagan sa roinn "$1"',
'subcategories' => 'Fo-roinnean',
'category-media-header' => 'Meadhanan sa roinn "$1"',
'category-empty' => "''Chan eil duilleagan no meadhanan san roinn seo an-dràsta.''",
-'hidden-categories' => '{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}',
+'hidden-categories' => '{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}',
'hidden-category-category' => 'Roinnean falaichte',
-'category-subcat-count' => '{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}',
-'category-subcat-count-limited' => 'Tha {{PLURAL:$1|am fo-roinn-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.',
-'category-article-count' => '{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
-'category-article-count-limited' => 'Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag| an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.',
-'category-file-count' => '{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
-'category-file-count-limited' => 'Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle| an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.',
+'category-subcat-count' => '{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}',
+'category-subcat-count-limited' => 'Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.',
+'category-article-count' => '{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
+'category-article-count-limited' => 'Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.',
+'category-file-count' => '{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
+'category-file-count-limited' => 'Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.',
'listingcontinuesabbrev' => 'leant.',
'index-category' => "Duilleagan air a' chlàr-innse",
'noindex-category' => "Duilleagan nach eil air a' chlàr-innse",
'create-this-page' => 'Cruthaich an duilleag seo',
'delete' => 'Sguab às',
'deletethispage' => 'Sguab às an duilleag seo',
-'undelete_short' => "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
-'viewdeleted_short' => 'Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
+'undelete_short' => "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
+'viewdeleted_short' => 'Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
'protect' => 'Dìon',
'protect_change' => 'mùth',
'protectthispage' => 'Dìon an duilleag seo',
'redirectedfrom' => '(Air ath-sheòladh o $1)',
'redirectpagesub' => 'Ath-sheòl an duilleag',
'lastmodifiedat' => 'Chaidh an duilleag seo a mhùthadh $1 aig $2 turas mu dheireadh.',
-'viewcount' => 'Chaidh inntrigeadh a dhèanam dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turas|$1 turais|$1 turas}}.',
+'viewcount' => 'Chaidh inntrigeadh a dhèanamh dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turais|$1 turas}}.',
'protectedpage' => 'Duilleag fo dhìon',
'jumpto' => 'Gearr leum gu:',
'jumptonavigation' => 'seòladh',
'youhavenewmessages' => 'Tha $1 ($2) agad.',
'newmessageslink' => 'teachdaireachdan ùra',
'newmessagesdifflink' => 'mùthadh mu dheireadh',
-'youhavenewmessagesfromusers' => 'Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).',
+'youhavenewmessagesfromusers' => 'Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).',
'youhavenewmessagesmanyusers' => 'Tha $1 agad o iomadh cleachdaiche ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|aon teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachdan ùra|$1 teachdaireachd ùr}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|am mùthadh|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh',
+'newmessageslinkplural' => '{{PLURAL:$1|aon teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachdan ùra|$1 teachdaireachd ùr}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|am mùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh',
'youhavenewmessagesmulti' => 'Tha teachdaireachdan ùra agad ann an $1',
'editsection' => 'deasaich',
'editold' => 'deasaich',
'collapsible-expand' => 'Leudaich',
'thisisdeleted' => 'Seall no aisig $1?',
'viewdeleted' => 'Seall $1?',
-'restorelink' => '{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
+'restorelink' => '{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
'feedlinks' => 'Inbhir:',
'feed-invalid' => "Seòrsa mì-dhligheach de dh'fho-sgrìobhadh inbhir.",
'feed-unavailable' => 'Chan eil inbhirean co-bhanntachd ri fhaighinn',
'badtitle' => 'Droch thiotal',
'badtitletext' => "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uici air a dhroch cheangal.
Faodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
-'perfcached' => "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
-'perfcachedts' => "Chaidh an dàta a leanas a thasgadh agus chaidh ùradhadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
+'perfcached' => "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
+'perfcachedts' => "Chaidh an dàta a leanas a thasgadh agus chaidh ùrachadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
'querypage-no-updates' => 'Tha ùrachadh air a chur à comas air an duilleag seo an-dràsta.
Cha dèid an dàta an-seo ùrachadh aig an àm seo.',
'wrong_wfQuery_params' => 'Paramatairean mì-cheart airson wfQuery()<br />
'yourname' => 'Ainm-cleachdaiche:',
'yourpassword' => 'Am facal-faire agad',
'yourpasswordagain' => 'Ath-sgrìobh facal-faire',
-'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|làithean}})",
+'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
'securelogin-stick-https' => 'Glèidh an ceangal ri HTTPS as dèidh logadh a-steach',
'yourdomainname' => 'An àrainn-lìn agad:',
'password-change-forbidden' => 'Chan urrainn dhut faclan-faire atharrachadh air an uicipeid seo.',
Am feuch thu ris a-rithist?',
'wrongpasswordempty' => 'Cha do chuir thu a-steach facal-faire.
Feuch ris a-rithist.',
-'passwordtooshort' => "Feumaidh faclan-faire a bhith {{PLURAL:$1|$1 charactar|$1 charactar|$1 caractaran|$1 charactar|$1 charactar|$1 caractaran|$1 caractar}} a dh'fhaid air a' char as lugha.",
+'passwordtooshort' => "Feumaidh faclan-faire a bhith {{PLURAL:$1|$1 charactar|$1 charactar|$1 caractaran|$1 caractar}} a dh'fhaid air a' char as lugha.",
'password-name-match' => "Chan fhaod am facal-faire 's an t-ainm-cleachdaiche agad a bhith co-ionnann.",
'password-login-forbidden' => "Tha an t-ainm-cleachdaiche 's am facal-faire seo toirmisgte.",
'mailmypassword' => "Cuir facal-faire ùr thugam air a' phost-dealain",
'passwordremindertitle' => 'Facal-faire sealach ùr airson {{SITENAME}}',
-'passwordremindertext' => 'Dh\'iarr cuideigin (\'s mathaid gun do dh\'iarr thusa seo on t-seòladh IP $1) facal-fair ùr airson
-{{SITENAME}} ($4). Chaidh facal-faire sealach a chruthachadh airson "$2" a tha \'na "$3".
+'passwordremindertext' => 'Dh\'iarr cuideigin (\'s mathaid gun do dh\'iarr thusa seo on t-seòladh IP $1) facal-faire ùr airson {{SITENAME}} ($4). Chaidh facal-faire sealach a chruthachadh airson "$2" a tha \'na "$3".
Ma bha sin fa-near dhut, bidh agad ri clàradh a-steach agus facal-faire ùr a thaghadh
-an-dràsta fhèin. Falbhaidh an ùine air an fhacal-fhaire sealach agad ann an {{PLURAL:$5|$5 latha|$5 latha|$5 làithean|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+an-dràsta fhèin. Falbhaidh an ùine air an fhacal-fhaire sealach agad ann an {{PLURAL:$5|$5 latha|$5 latha|$5 làithean|$5 latha}}.
Ma dh\'iarr cuideigin eile seo no ma chuimhnich thu am facal-faire agad \'s mur eil thu
airson atharrachadh tuilleadh, \'s urrainn dhut an teachdaireachd seo a leigeil seachad
'blocked-mailpassword' => "Chaidh bacadh a chur air an t-seòladh IP agad 's chan eil cead deasachaidh agad agus chan urrainn dhut an gleus a chum aiseag an fhacail-fhaire a chleachdadh gus casg a chur air mì-ghnàthachadh.",
'eauthentsent' => 'Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.
Mus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an treòrachadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.',
-'throttled-mailpassword' => 'Chaidh cuimhneachan facail-fhaire a chur mu thràth san {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair|$1 uair|$1 uairean|$1 uair}} a thìde.
-Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
+'throttled-mailpassword' => 'Chaidh cuimhneachan facail-fhaire a chur mu thràth san {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.
+Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
'mailerror' => "Mearachd a' cur post: $1",
-'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|chunntas|chunntas|chunntas|chunntas|cunntasan|cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
+'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
'emailauthenticated' => 'Chaidh an seòladh puist-dhealain agad a dhearbhadh $2 aig $3.',
'emailnotauthenticated' => 'Cha deach am post-d agad a dhearbhadh fhathast.
Cha dèid post-d a chur airson gin dhe na feartan a leanas.',
'loginlanguagelabel' => 'Cànan: $1',
'suspicious-userlogout' => "Chaidh d' iarrtas airson clàradh a-mach a dhiùltadh a chionn 's gu bheil coltas gun deach a chur le brabhsair briste no le progsaidh tasglannaidh.",
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Mearachd neo-aithichte san fheart mail() aig PHP.',
'user-mail-no-addy' => 'Cha do ghabh am post-d a chur leis nach robh seòladh puist-d ann.',
'user-mail-no-body' => 'Bha bodhaig na teachdaireachd bàn no air leth goirid.',
'passwordreset-capture-help' => 'Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.',
'passwordreset-email' => 'Seòladh puist-d:',
'passwordreset-emailtitle' => "Dàta a' chunntais air {{SITENAME}}",
-'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas|an dà chunntas|na cunntasan|na cunntasan|na cunntasan|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:
$2
-Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an dà fhacal-faire|na faclan-faire|na faclan-faire|na faclan-faire|na faclan-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.
Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
-'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas agad air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an dà chunntas-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas agad air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
$2
-Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an dà fhacal-faire|na faclan-faire|na faclan-faire|na faclan-faire|na faclan-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.
Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
'passwordreset-emailelement' => 'Ainm-cleachdaiche: $1
Facal-faire sealach: $2',
Mur eil thu ag iarraidh an sgrìobhaidh agad a dheasaichear is a sgaoilear le càch, na cuir e.<br />
Ma dh'fhoilleachas tu rudeigin an seo, bidh tu a' dearbhadh gun do sgrìobh thu fhèin e, no gur ann às an raon phòballach a thàinig e; thoir aire '''nach eil''' sin a' gabhail a-staigh duilleagan-lìn mar as àbhaist (seall $1 airson barrachd fiosrachaidh). <br />
'''NA CLEACHDAIBH SAOTHAIR FO DHLIGHE-SGRÌOBHAIDH GUN CHEAD!'''",
-'longpageerror' => "'''Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$1 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|}}).'''
+'longpageerror' => "Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobytes}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$2 kilobyte|$2 kilobytes}}).'''
Cha ghabh a shàbhaladh.",
'readonlywarning' => "'''Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.'''
'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.
'cascadeprotectedwarning' => "'''Rabhadh:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha cascade-protected.",
'titleprotectedwarning' => "'''Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.'''
Seo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-'templatesused' => "Tha {{PLURAL:$1|teamplaid|theamplaid||teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
-'templatesusedpreview' => "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh}} san ro-shealladh seo:",
-'templatesusedsection' => "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh}} san earrann seo:",
+'templatesused' => "Tha {{PLURAL:$1|teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
+'templatesusedpreview' => "Tha {{PLURAL:$1|1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san ro-shealladh seo:",
+'templatesusedsection' => "Tha {{PLURAL:$1|$1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san earrann seo:",
'template-protected' => '(air a dhìon)',
'template-semiprotected' => '(air a leth-dhìon)',
-'hiddencategories' => "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+'hiddencategories' => "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
'nocreatetext' => "Chuir {{SITENAME}} bacadh air cruthachadh de dhuilleagan ùra.
'S urrainn dhut tilleadh is duilleag a tha ann mu thràth a dheasachadh no [[Special:UserLogin|clàradh a-steach no cunntas a chruthachadh]].",
'nocreate-loggedin' => 'Chan eil cead agad duilleagan ùra a chruthachadh.',
'sectioneditnotsupported-title' => 'Chan eil taic ri deasachadh earrannan',
'sectioneditnotsupported-text' => 'Chan eil taic ri deasachadh earrannan air an duilleag seo.',
'permissionserrors' => "Meareachd leis a' chead",
-'permissionserrorstext' => 'Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan|an adhbhair|nan adhbharan|nan adhbharan}} a leanas:',
-'permissionserrorstext-withaction' => 'Chan eil cead agad airson "$2" air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan|an adhbhair|nan adhbharan|nan adhbharan}} a leanas:',
+'permissionserrorstext' => 'Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:',
+'permissionserrorstext-withaction' => 'Chan eil cead agad airson "$2" air sgàth {{PLURAL:$1|an $1 adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:',
'recreate-moveddeleted-warn' => "'''Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.'''
Saoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.
'history-show-deleted' => 'Na chaidh sguabadh às a-mhàin',
'histfirst' => 'As sine',
'histlast' => 'As ùire',
-'historysize' => '({{PLURAL:$1|1 bhaidt|$1 bhaidht|$1 bhaidht|$1 bhaidht|$1 baidhtichean|$1 baidht}})',
+'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
'historyempty' => '(falamh)',
# Revision feed
'lineno' => 'Loidhne $1:',
'compareselectedversions' => 'Dèan coimeas eadar na mùthaidhean a thagh thu',
'editundo' => 'neo-dhèan',
-'diff-multi' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
+'diff-multi' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
# Search results
'searchresults' => 'Toraidhean rannsachaidh',
'titlematches' => "Tiotalan dhuilleagan a tha a' maidseadh",
'notitlematches' => "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
'notextmatches' => "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
-'prevn' => 'an {{PLURAL:$1|$1}} mu dheireadh',
+'prevn' => 'an {{PLURAL:$1|$1}} roimhe',
'nextn' => 'an ath {{PLURAL:$1|$1}}',
-'prevn-title' => '$1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} roimhe',
-'nextn-title' => 'An ath $1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}}',
-'shown-title' => 'Seall $1 {{PLURAL:$1|toradh|thoradh|thoradh|toradh|toraidhean|toradh}} air gach duilleag',
+'prevn-title' => '$1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} roimhe',
+'nextn-title' => 'An ath $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}}',
+'shown-title' => 'Seall $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} air gach duilleag',
'viewprevnext' => 'Seall ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''Tha duilleag air a bheil \"[[:\$1]]\" air an uicipeid seo.'''",
'searchmenu-new' => "'''Cruthaich an duilleag \"[[:\$1]]\" air an uicipeid seo!'''",
'searchprofile-images-tooltip' => 'Lorg faidhlichean',
'searchprofile-everything-tooltip' => "Lorg am broinn susbaint sam bith (a' gabhail a-steach nan duilleagan deasbaireachd)",
'searchprofile-advanced-tooltip' => 'Lorg am broinn ainm-spàsan gnàthaichte',
-'search-result-size' => '$1 ({{PLURAL:$2|1 fhacal|$2 fhacal|1 fhacal|$2 fhacal|$2 faclan|$2 facal}})',
-'search-result-category-size' => '{{PLURAL:$1|1 bhall|$1 bhall|$1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})',
+'search-result-size' => '$1 ({{PLURAL:$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})',
+'search-result-category-size' => '{{PLURAL:$1|1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})',
'search-result-score' => 'Buntainneas: $1%',
'search-redirect' => '(ag ath-sheòladh $1)',
'search-section' => '(earrann $1)',
'search-relatedarticle' => 'Co-cheangailte',
'searchrelated' => 'co-cheangailte',
'searchall' => 'a h-uile',
-'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
-'showingresultsnum' => "A' nochdadh '''$3''' {{PLURAL:$3|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
+'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
+'showingresultsnum' => "A' nochdadh '''$3''' {{PLURAL:$3|$3 toradh|$3 thoradh|$3 toraidhean|$3 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
'showingresultsheader' => "{{PLURAL:$5|Toradh '''$1''' à '''$3'''|Toraidhean '''$1 - $2''' of '''$3'''}} airson '''$4'''",
'nonefound' => "'''Aire''': Chan dèid ach cuid dhe na namespaces a lorg a ghnàth.
Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèanamh am broinn na susbainte gu lèir (a' gabhail a-steach nan duilleagan conaltraidh, teamplaidean is msaa), no cleachd an namespace a bha thu ag iarraidh mar ro-leasachan.",
'default' => 'an roghainn bhunaiteach',
'prefs-custom-css' => 'CSS gnàthaichte',
'youremail' => 'Post-dealain:',
-'username' => 'Ainm-cleachdaiche:',
+'username' => '{{GENDER:$1|Ainm-cleachdaiche}}:',
'yourrealname' => "An dearbh ainm a th' ort:",
'yourlanguage' => 'Cànan:',
'yournick' => 'Earr-sgrìobhadh ùr:',
'action-move' => 'gluais an duilleag seo',
# Recent changes
-'nchanges' => '{{PLURAL:$1|mhùthadh|mhùthadh|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}',
+'nchanges' => '{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}',
'recentchanges' => 'Mùthaidhean ùra',
'recentchanges-legend' => 'Roghainnean nam mùthaidhean ùra',
'recentchanges-summary' => 'Cum sùil air na mùthaidhean as ùire a nithear air an uici air an duilleag seo.',
'recentchanges-label-minor' => 'Seo mùthadh beag',
'recentchanges-label-bot' => "'S e bot a rinn an deasachadh seo",
'recentchanges-label-unpatrolled' => 'Cha deach freiceadan tron deasachadh seo fhathast',
-'rcnote' => 'Tha {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh anns na $2 {{PLURAL:$2|latha|latha|latha|latha|làithean|latha}} mu dheireadh, mar a bha iad $5, $4.',
+'rcnote' => 'Tha {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh anns na $2 {{PLURAL:$2|latha|latha|làithean|latha}} mu dheireadh, mar a bha iad $5, $4.',
'rcnotefrom' => "Gheibhear na mùthaidhean a-mach o '''$2''' (gu ruige '''$1''') gu h-ìosal.",
'rclistfrom' => 'Seall na mùthaidhean ùra a-mach o $1',
'rcshowhideminor' => '$1 mùthaidhean beaga',
'filehist-dimensions' => 'Meud',
'filehist-comment' => 'Beachd',
'imagelinks' => 'Cleachdadh an fhaidhle',
-'linkstoimage' => "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
+'linkstoimage' => "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
'nolinkstoimage' => "Chan eil duilleag sam bith a' ceangal an-seo.",
'sharedupload' => 'Tha am faidhle seo o $1 agus faodaidh pròiseactan eile a chleachdadh.',
'sharedupload-desc-here' => "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.
'brokenredirects' => 'Ath-stiùireidhean briste',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|bhaidht|bhaidht|bhaidht|bhaidht|baidht|baidht}}',
-'nmembers' => '$1 {{PLURAL:$1|bhall|bhall|bhall|bhall|buill|ball}}',
-'nviews' => '$1 {{PLURAL:$1|sealladh|shealladh|sealladh|shealladh|seallaidhean|sealladh}}',
+'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
+'nmembers' => '$1 {{PLURAL:$1|bhall|bhall|buill|ball}}',
+'nviews' => '$1 {{PLURAL:$1|sealladh|shealladh|seallaidhean|sealladh}}',
'uncategorizedpages' => 'Duilleagan gun roinn-seòrsa',
'uncategorizedcategories' => 'Roinnean-seòrsa gun roinn-seòrsa',
'unusedimages' => 'Faidhlichean gun chleachdadh',
'ancientpages' => 'Duilleagan as sìne',
'move' => 'Gluais',
'movethispage' => 'Gluais an duilleag seo',
-'pager-newer-n' => '{{PLURAL:$1|1 nas ùire|$1 nas ùire|1 nas ùire|$1 nas ùire|$1 nas ùire|$1 nas ùire}}',
-'pager-older-n' => '{{PLURAL:$1|1 nas sine|$1 nas sine|1 nas sine|$1 nas sine|$1 nas sine|$1 nas sine}}',
+'pager-newer-n' => '{{PLURAL:$1|1 nas ùire|$1 nas ùire}}',
+'pager-older-n' => '{{PLURAL:$1|1 nas sine|$1 nas sine}}',
# Book sources
'booksources' => "Tùsan a tha 'nan leabhraichean",
# Special:Categories
'categories' => 'Roinnean-seòrsa',
-'categoriespagetext' => "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|san roinn-seòrsa|san roinn-seòrsa|san roinn-seòrsa|sna roinntean-seòrsa|san roinn-seòrsa}} a leanas.
+'categoriespagetext' => "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinntean-seòrsa|}} a leanas.
Chan fhaicear [[Special:UnusedCategories|roinntean-seòrsa gun chleachdadh an-seo]].
Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan iarraidh cuideachd]].",
# Special:LinkSearch
-'linksearch' => 'Ceanglaichean dhan taobh a-muigh',
+'linksearch' => 'Lorg sna ceanglaichean dhan taobh a-muigh',
'linksearch-line' => "Tha $1 a' ceangal an-seo o $2",
# Special:ListGroupRights
'listgrouprights-members' => '(liosta de bhuill)',
-# E-mail user
+# Email user
'emailuser' => 'Cuir post-dealain dhan chleachdaiche seo',
'emailfrom' => 'O:',
'emailto' => 'Gu:',
'mywatchlist' => 'An clàr-faire',
'watchlistfor2' => 'Do $1 $2',
'nowatchlist' => "Chan eil rud sam bith air a' chlàr-fhaire agad.",
-'addedwatchtext' => "Chaidh an duilleag \"[[:\$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].
-Nochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd agus nochdaidh an duilleag ann an litrichean '''troma''' ann an [[Special:RecentChanges|liosta nam mùthaidhean ùra]] gum bi e furasta ri fhaicinn.",
+'addedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a chur ri [[Special:Watchlist|do chlàr-faire]].
+Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.',
'removedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].',
'watch' => 'Cum sùil air',
'watchthispage' => 'Cum sùil air an duilleag seo',
'unwatch' => 'Na cum sùil tuilleadh',
'watchnochange' => "Cha deach na duilleagan air d' fhaire a dheasachadh anns a' chuairt ùine taisbeanta.",
-'watchlist-details' => 'Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag||$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.',
+'watchlist-details' => 'Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.',
'watchmethod-recent' => "A' sgrùdadh deasachaidhean ùra airson duilleagan air d' fhaire",
'watchmethod-list' => "A' sgrùdadh duilleagan air d' fhaire airson deasachaidhean ùra",
-'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
-'wlnote' => 'Seo $1 {{PLURAL:$1|mhùthadh mu dheireadh|mhùthadh mu dheireadh|na mùthaidhean mu dheireadh|mùthadh mu dheireadh}} anns na $2 {{PLURAL:$2|uair|uair|uairean|uair}} mu dheireadh.',
+'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
+'wlnote' => 'Seo {{PLURAL:$1|an $1 mhùthadh|$1 mhùthadh|na $1 mùthaidhean|$1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.',
'wlshowlast' => 'Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3',
'watchlist-options' => 'Roghainnean mo chlàir-faire',
# Protect
'protectlogpage' => 'Loga an dìon',
-'protectlogtext' => "Tha liosta na chaidh a dhìon 's a neo-dhìon gu h-ìosal.
-Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.",
+'protectlogtext' => 'Tha liosta na chaidh a dhìon gu h-ìosal.
+Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.',
'protectedarticle' => '"[[$1]]" air a dhìon',
'modifiedarticleprotection' => 'a dh\'atharraich an ìre dìon de "[[$1]]"',
'unprotectedarticle' => 'a neo-dhìon "[[$1]]"',
'protect-text' => "Chì thu an ìre dìon dhen duilleag '''$1''' an-seo agus is urrainn dhut atharrachadh an-seo.",
'protect-locked-access' => "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.
Seo roghainnean làithreach na duilleige '''$1''':",
-'protect-cascadeon' => "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|san duilleag|sna duilleagan|san duilleag|sna duilleagan|san duilleag|sna duilleagan}} a leanas aig a bheil dìon easach air.
+'protect-cascadeon' => "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon easach air.
'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon easach.",
'protect-default' => 'Ceadaich a h-uile cleachdaiche',
-'protect-fallback' => 'Iarr cead "$1"',
-'protect-level-autoconfirmed' => 'Cuir bacadh air cleachdaichean ùra is feadhainn gun chlàrachadh',
-'protect-level-sysop' => 'Rianadairean a-mhàin',
+'protect-fallback' => 'Na ceadaich ach do chleachdaichean aig a bheil cead "$1"',
+'protect-level-autoconfirmed' => 'Na ceadaich ach cleachdaichean a chaidh an dearbhadh gu fèin-obrachail',
+'protect-level-sysop' => 'Na ceadaich ach rianadairean',
'protect-summary-cascade' => 'mar eas',
'protect-expiring' => 'falbhaidh an ùine air $1 (UTC)',
'protect-cascade' => "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon mar eas)",
'restriction-level' => 'Ìre bacaidh:',
# Undelete
-'undeleterevisions' => 'Chaidh $1 {{PLURAL:$1|leth-bhreac|leth-bhreac|leth-bhreac|leth-bhreac|leth-bhreacan|leth-bhreac}} a chur san tasg-lann',
+'undeleterevisions' => 'Chaidh {{PLURAL:$1|$1 leth-bhreac|$1 leth-bhreac|$1 leth-bhreacan|$1 leth-bhreac}} a chur san tasg-lann',
'undeletelink' => 'seall/aisig',
'undeleteviewlink' => 'seall',
'isredirect' => 'duilleag ath-sheòlaidh',
'istemplate' => 'transclusion',
'isimage' => 'ceangal faidhle',
-'whatlinkshere-prev' => '{{PLURAL:$1|roimhe|$1 roimhe|roimhe|$1 roimhe|$1 roimhe|$1 roimhe}}',
-'whatlinkshere-next' => '{{PLURAL:$1|an ath|an ath $1|an ath|an ath $1|an ath $1|an ath $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|roimhe|$1 roimhe}}',
+'whatlinkshere-next' => '{{PLURAL:$1|an ath|an ath $1|na ath $1|an ath $1}}',
'whatlinkshere-links' => '← ceanglaichean',
'whatlinkshere-hideredirs' => '$1 ath-sheòlaidhean',
'whatlinkshere-hidetrans' => '$1 transclusions',
'ipboptions' => '2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,neo-chrìochnach:infinite',
'badipaddress' => "Chan eil an seòladh IP aig a' cleachdair seo iomchaidh",
'blockipsuccesssub' => "Shoirbhich leat leis a' bhacadh",
-'blockipsuccesstext' => "Tha [[Special:Contributions/$1|$1]] air a bhacadh.
-<br />Faic [[Special:BlockList|Liosta nan IP baicte]] na bacaidhean a dh'ath-sgrùdadh.",
+'blockipsuccesstext' => 'Chaidh [[Special:Contributions/$1|$1]] a bhacadh.
+<br />Faic [[Special:BlockList|liosta nan IP bacte]] gus sùile a thoirt air na bacaidhean.',
'unblockip' => 'Neo-bhac an cleachdaiche',
'ipusubmit' => 'Thoir air falbh am bacadh seo',
'ipblocklist' => 'Cleachdaichean a chaidh a bhacadh',
'movepagetext' => "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.
Bidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.
'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.
-Mura dèan thu sin, dèan cinntach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.
+Mura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.
'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.
Thoir an aire '''nach dèid''' an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.
'''Rabhadh!'''
Faodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;
-dèan cinntach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+dèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
'movepagetalktext' => "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois '''ach:'''
*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no
*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal
'tooltip-summary' => 'Cuir a-steach gearr-chunntas',
# Attribution
-'anonymous' => '{{PLURAL:$1|Cleachdaiche|Cleachdaichean|Cleachdaichean|Cleachdaichean|Cleachdaichean|Cleachdaichean}} gun ainm o {{SITENAME}}',
+'anonymous' => '{{PLURAL:$1|cleachdaiche|cleachdaichean}} gun ainm o {{SITENAME}}',
'siteuser' => 'cleachdaiche {{SITENAME}} $1',
'othercontribs' => 'Stèidhichte air obair le $1.',
'others' => 'eile',
-'siteusers' => '{{PLURAL:$2|chleachdaiche|chleachdaiche|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} {{SITENAME}} $1',
+'siteusers' => '{{PLURAL:$2|cleachdaiche|cleachdaichean}} {{SITENAME}} $1',
# Browsing diffs
'previousdiff' => '← Mùthadh nas sine',
'helppage' => 'Help:Axuda',
'mainpage' => 'Portada',
'mainpage-description' => 'Portada',
-'policy-url' => 'Project:Política e normas',
+'policy-url' => 'Project:Políticas e normas',
'portal' => 'Portal da comunidade',
'portal-url' => 'Project:Portal da comunidade',
'privacy' => 'Política de protección de datos',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Páxina',
-'nstab-user' => 'Páxina de {{GENDER:{{BASEPAGENAME}}|usuario|usuaria}}',
+'nstab-user' => 'Páxina de {{GENDER:{{#titleparts:{{BASEPAGENAME}}|1}}|usuario|usuaria}}',
'nstab-media' => 'Páxina multimedia',
'nstab-special' => 'Páxina especial',
'nstab-project' => 'Páxina do proxecto',
'loginlanguagelabel' => 'Lingua: $1',
'suspicious-userlogout' => 'Rexeitouse a súa petición de saír do sistema porque semella que a enviou un navegador roto ou a caché dun proxy.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP.',
'user-mail-no-addy' => 'Intentou enviar un correo sen enderezo de correo electrónico.',
'user-mail-no-body' => 'Intentou enviar un correo baleiro ou cun corpo curto de máis.',
'prefs-displaywatchlist' => 'Opcións de visualización',
'prefs-diffs' => 'Diferenzas',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'O enderezo de correo electrónico semella válido',
'email-address-validity-invalid' => 'Escriba un enderezo de correo electrónico válido',
No canto de ligar cos homónimos deben apuntar cara á páxina apropiada.<br />
Unha páxina trátase como páxina de homónimos cando nela se usa un modelo que está ligado desde [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Páxinas cunha propiedade de páxina',
+'pageswithprop-legend' => 'Páxinas cunha propiedade de páxina',
+'pageswithprop-text' => 'Esta páxina lista aquelas páxinas que utilizan unha propiedade de páxina determinada.',
+'pageswithprop-prop' => 'Nome da propiedade:',
+'pageswithprop-submit' => 'Mostrar',
+
'doubleredirects' => 'Redireccións dobres',
'doubleredirectstext' => 'Esta lista contén as páxinas que redirixen cara a outras páxinas de redirección.
Cada ringleira contén ligazóns cara á primeira e segunda redireccións, así como a primeira liña de texto da segunda páxina, que é frecuentemente o artigo "real", á que a primeira redirección debera apuntar.
'listgrouprights-addgroup-self-all' => 'Pode engadir todos os grupos pola súa propia conta',
'listgrouprights-removegroup-self-all' => 'Pode eliminar todos os grupos pola súa propia conta',
-# E-mail user
+# Email user
'mailnologin' => 'Non existe enderezo para o envío',
'mailnologintext' => 'Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios.',
'emailuser' => 'Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}',
'monthsall' => 'todos',
'limitall' => 'todas',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Confirmar o enderezo de correo electrónico',
'confirmemail_noemail' => 'Non ten rexistrado ningún enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias de usuario]].',
'confirmemail_text' => '{{SITENAME}} require que lle dea validez ao seu enderezo de correo electrónico antes de utilizar as funcións relacionadas con el.
'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
+# Image rotation
+'rotate-comment' => 'Imaxe rotada $1 {{PLURAL:$1|grao|graos}} en sentido horario',
+
);
'listgrouprights-helppage' => 'Help:Kiartyn y phossan',
'listgrouprights-members' => '(rolley olteynyn)',
-# E-mail user
+# Email user
'emailuser' => "Cur post-L da'n ymmydeyr shoh",
'emailfrom' => 'Veih:',
'emailto' => 'Da:',
** Removing content from pages
** Spamming links to external sites
** Inserting nonsense/gibberish into pages
-** Intimidating behaviour/harassment
+** Intimidating behavior/harassment
** Abusing multiple accounts
* Oyr elley
** Ennym ymmydeyryn neuchooie
'loginlanguagelabel' => 'שפה: $1',
'suspicious-userlogout' => 'בקשתכם לצאת מהחשבון נדחתה כיוון שנראה שהיא נשלחה על ידי דפדפן שבור או שרת פרוקסי עם זיכרון מטמון.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'שגיאה לא ידועה בפונקציה mail() של PHP',
'user-mail-no-addy' => 'ניסיון לשלוח דוא"ל ללא כתובת דוא"ל.',
'user-mail-no-body' => 'ניסיון לשלוח דוא"ל עם תוכן ריק או קצר מאוד.',
'''הוא טרם נשמר!'''",
'sitejspreview' => "'''זכרו שזו רק תצוגה מקדימה של קוד ה־JavaScript הזה.'''
'''הוא טרם נשמר!'''",
-'userinvalidcssjstitle' => "'''אזהרה''': העיצוב \"\$1\" אינו קיים.
+'userinvalidcssjstitle' => "'''אזהרה:''' העיצוב \"\$1\" אינו קיים.
דפי .css ו־.js מותאמים אישית משתמשים בכותרת עם אותיות קטנות – למשל, {{ns:user}}:דוגמה/vector.css ולא {{ns:user}}:דוגמה/Vector.css.",
'updated' => '(מעודכן)',
'note' => "'''הערה:'''",
'showingresults' => "{{PLURAL:$1|מוצגת תוצאה '''אחת'''|מוצגות עד '''$1''' תוצאות}} החל ממספר '''$2''':",
'showingresultsnum' => "{{PLURAL:$3|מוצגת תוצאה '''אחת'''|מוצגות '''$3''' תוצאות}} החל ממספר '''$2''':",
'showingresultsheader' => "{{PLURAL:$5|תוצאה '''$1''' מתוך '''$3'''|תוצאות '''$1 - $2''' מתוך '''$3'''}} עבור '''$4'''",
-'nonefound' => "'''הערה''': כברירת מחדל, החיפוש מבוצע במספר מרחבי שם בלבד. באפשרותכם לכתוב '''all:''' לפני מונח החיפוש כדי לחפש בכל הדפים (כולל דפי שיחה, תבניות, ועוד), או לכתוב לפני מונח החיפוש את מרחב השם שאתם מעוניינים בו.",
+'nonefound' => "'''הערה:''' כברירת מחדל, החיפוש מבוצע במספר מרחבי שם בלבד. באפשרותכם לכתוב '''all:''' לפני מונח החיפוש כדי לחפש בכל הדפים (כולל דפי שיחה, תבניות, ועוד), או לכתוב לפני מונח החיפוש את מרחב השם שאתם מעוניינים בו.",
'search-nonefound' => 'לא נמצאו תוצאות המתאימות לחיפוש.',
'powersearch' => 'חיפוש מתקדם',
'powersearch-legend' => 'חיפוש מתקדם',
'prefs-displaywatchlist' => 'אפשרויות תצוגה',
'prefs-diffs' => 'הבדלים בין גרסאות',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'כתובת הדואר האלקטרוני נראית תקינה',
'email-address-validity-invalid' => 'יש להקליד כתובת דואר אלקטרוני תקינה',
ייתכן שעליהם לקשר במקום זאת לדף מתאים יותר.<br />
דף נחשב לדף פירושונים אם הוא משתמש בתבנית המקושרת מהדף [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'דפים עם מאפיין דף',
+'pageswithprop-legend' => 'דפים עם מאפיין דף',
+'pageswithprop-text' => 'בדף זה מופיעה רשימת דפים שמשתמשים במאפיין דף מסוים.',
+'pageswithprop-prop' => 'שם המאפיין:',
+'pageswithprop-submit' => 'הצגה',
+
'doubleredirects' => 'הפניות כפולות',
'doubleredirectstext' => 'בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.
כל שורה מכילה קישור לשתי ההפניות הראשונות, וכן את היעד של ההפניה השנייה, שהיא לרוב היעד ה"אמיתי" של ההפניה, שההפניה הראשונה אמורה להצביע אליו.
'listgrouprights-addgroup-self-all' => 'הוספת כל הקבוצות לחשבון האישי',
'listgrouprights-removegroup-self-all' => 'הסרת כל הקבוצות מהחשבון האישי',
-# E-mail user
+# Email user
'mailnologin' => 'אין כתובת לשליחה',
'mailnologintext' => 'עליכם [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר לעצמכם כתובת דואר אלקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] שלכם כדי לשלוח דואר למשתמש אחר.',
'emailuser' => 'שליחת דואר אלקטרוני למשתמש זה',
'unblockiptext' => 'השתמשו בטופס שלהלן כדי להחזיר את הרשאות הכתיבה למשתמש או כתובת IP חסומים.',
'ipusubmit' => 'שחרור חסימה',
'unblocked' => 'המשתמש [[User:$1|$1]] שוחרר מחסימתו.',
-'unblocked-range' => '$1 שוחרר מחסימתו',
+'unblocked-range' => '$1 שוחרר מחסימתו.',
'unblocked-id' => 'חסימה מספר $1 שוחררה.',
'blocklist' => 'משתמשים חסומים',
'ipblocklist' => 'משתמשים חסומים',
'monthsall' => 'הכול',
'limitall' => 'הכול',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'אימות כתובת דוא"ל',
'confirmemail_noemail' => 'אין לכם כתובת דוא"ל תקפה המוגדרת ב[[Special:Preferences|העדפות המשתמש]] שלכם.',
'confirmemail_text' => 'אתר זה דורש שתאמתו את כתובת הדוא"ל שלכם לפני שתשתמשו בשירותי הדוא"ל. לחצו על הכפתור למטה כדי לשלוח דוא"ל עם קוד אימות לכתובת הדוא"ל שהזנתם. טענו את הקישור בדפדפן שלכם כדי לאשר שכתובת הדוא"ל תקפה.',
'scarytranscludetoolong' => '[כתובת ה־URL ארוכה מדי]',
# Delete conflict
-'deletedwhileediting' => "'''אזהרה''': דף זה נמחק לאחר שהתחלתם לערוך!",
+'deletedwhileediting' => "'''אזהרה:''' דף זה נמחק לאחר שהתחלתם לערוך!",
'confirmrecreate' => "הדף נמחק על ידי המשתמש [[User:$1|$1]] ([[User talk:$1|שיחה]]) לאחר שהתחלתם לערוך אותו, מסיבה זו:
:'''$2'''
אנא אשרו שאתם אכן רוצים ליצור מחדש את הדף.",
'duration-centuries' => '{{PLURAL:$1|מאה שנה|מאתיים שנה|$1 מאות שנים}}',
'duration-millennia' => '{{PLURAL:$1|אלף שנה|אלפיים שנה|$1 אלפי שנים}}',
+# Image rotation
+'rotate-comment' => 'התמונה סובבה {{PLURAL:$1|במעלה אחת|ב֫־$1 מעלות}} בכיוון השעון',
+
);
* @author Dineshjk
* @author Hemant wikikosh1
* @author Htt
+ * @author InfinityO O
* @author Kaganer
* @author Kamal
* @author Kannankumar
'youhavenewmessagesfromusers' => 'आपके लिये {{PLURAL:$3|एक अन्य सदस्य का सन्देश है|$3 अन्य सदस्यों के सन्देश हैं}}। ($2)',
'youhavenewmessagesmanyusers' => 'आपके लिये $1 हैं। ($2)',
'newmessageslinkplural' => '{{PLURAL:$1|एक नया सन्देश|नये सन्देश}}',
-'newmessagesdifflinkplural' => 'à¤\85à¤\82तिम {{PLURAL:$1|परिवर्तन}}',
+'newmessagesdifflinkplural' => 'पिà¤\9bलà¥\87 {{PLURAL:$1|परिवर्तन}}',
'youhavenewmessagesmulti' => '$1 पर आपके लिए नया संदेश है',
'editsection' => 'सम्पादन',
'editold' => 'सम्पादन',
* @file
*
* @author Anjoeli9806
+ * @author Berniemack
* @author Erythrii
* @author Jose77
* @author Kguirnela
'underline-always' => 'Pirmi',
'underline-never' => 'Indi',
-'underline-default' => 'Human na nga iya sang brawser',
+'underline-default' => 'Gintakda sang browser ukon panit',
# Font style option in Special:Preferences
'editfont-style' => 'Ilisan ang laragway sang font sa lugar:',
'newwindow' => '(gabukas sa bag-o nga bintana)',
'cancel' => 'Kanselahon',
'moredotdotdot' => 'Madamo pa...',
-'mypage' => 'Akon panid',
-'mytalk' => 'Akon paghisayranay',
+'morenotlisted' => 'Madamu pa ang wala nalista...',
+'mypage' => 'Akon Panid',
+'mytalk' => 'Paghisayranay',
'anontalk' => 'Paghisayranay sang sining IP address',
'navigation' => 'Nabigayson',
'and' => ' kag',
'vector-action-protect' => 'Pangapinan',
'vector-action-undelete' => 'Dulaon ang pagpanas',
'vector-action-unprotect' => 'Ilisan ang pagpangapin',
-'vector-simplesearch-preference' => 'Sugtan ang mas ginpamaayo nga suhestiyon sa pagpangita (Para sa vector nga panit lamang)',
+'vector-simplesearch-preference' => 'Sugdan ang mas ginpamaayo nga suhestiyon sa pagpangita (Para sa vector nga panit lamang)',
'vector-view-create' => 'Himuon',
'vector-view-edit' => 'Ilisan',
'vector-view-history' => 'Lantawon ang kasaysayan',
'namespaces' => 'Ngalan-espasyo',
'variants' => 'Mga nagkalain-lain',
+'navigation-heading' => 'Menu sang nabigasyon',
'errorpagetitle' => 'Sala/Eror',
'returnto' => 'Balik sa $1.',
'tagline' => 'Halin sa {{SITENAME}}',
'actionthrottled' => 'Ang paghulag ginpunggan',
'actionthrottledtext' => 'Bilang pagpangontra sa span, ginalimitahan ka sa pagbuhat sang sini nga paghulag sa tuman ka damo nga beses sa malip-ot nga tinion, kag naglapaw ka na sa sini nga patakaran.
Palihog tilawan mo liwat pagkatapos sang malip-ot nga tinion.',
-'protectedpagetext' => 'Ang ini nga panid ginpangapinan agod to mapunggan ang pag-ilis sini.',
+'protectedpagetext' => 'Ang ini nga panid ginprotektaran agud mapunggan ang pag-ilis sini.',
'viewsourcetext' => 'Mahimo mo nga makita kag makopya ang ginhalinan sang sini nga panid:',
'viewyourtext' => "Mahimo mo nga makita kag makopya ang ginhalinan sang '''imo mga pagbag-o''' sa sini nga panid:",
'protectedinterface' => 'Ang ini nga panid nagahatag sang mga teksto sang interface para sa software, kag ginapangapinan agod indi maabuso.',
Makapadayon ka sa gihapon sa paggamit sang {{SITENAME}} nga indi makilal-an, ukon mahimo ka man <span class='plainlinks'>[$1 magsulod liwat]</span> bilang amo sa gihapon ukon lain nga nga manug-gamit.
Tandaan nga may mga panid nga mahimo ma-display sa gihapon nga daw nakasulod ka sa gihapon, hasta mapanas mo na ang tinago sang imo brawser.",
+'welcomeuser' => 'Malipayon nga pag-abot. $1!',
+'welcomecreation-msg' => 'Nahimo na ang imo nga account.
+Indi pagkalimtan ang pag-ilis sa imo nga [[Special:Preferences|{{SITENAME}} pagpasulabi]].',
'yourname' => 'Ngalan sang Manog-gamit:',
'yourpassword' => 'Kontra-senyas:',
'yourpasswordagain' => 'Suliton ang kontra-senyas:',
'loginlanguagelabel' => 'Hambalanon: $1',
'suspicious-userlogout' => 'Ang imo pagpangabay nga mag-guha ginpungga bangud nga ini mahimo nga ginpadala sang guba nga brawser ukon sang proksy nga nagapang-tago.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Wala nahibaluan nga sala sa kapuslanan nga sulat() sang PHP.',
'user-mail-no-addy' => 'Gintilawan nga magpadala sang e-mail biskan wala sang e-mail adres.',
+'user-mail-no-body' => 'Nakatilaw magpadala sang email nga waay unod ukon malip-ot katama ang unod sang mensahe.',
# Change password dialog
'resetpass' => 'Ilisan ang pasword',
'changeemail-oldemail' => 'E-mail adres sa subong:',
'changeemail-newemail' => 'Bag-o nga e-mail adres:',
'changeemail-none' => '(wala)',
+'changeemail-password' => 'Ang imong {{SITENAME}} nga password:',
'changeemail-submit' => 'Ilisan and E-mail',
'changeemail-cancel' => 'Kanselahon',
Pwede ka [[Special:Search/{{PAGENAME}}|mangita para sa titulo sang ini nga pahina]] sa iban man nga pahina,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mangita ka sang kaparehas nga logs],
o [{{fullurl:{{FULLPAGENAME}}|action=edit}} islan ini nga pahina]</span>.',
-'noarticletext-nopermission' => 'Wala subong sang teksto ang ini nga panid.
+'noarticletext-nopermission' => 'Wala subong sang teksto ang sini nga panid.
Pwede ka [[Special:Search/{{PAGENAME}}|mangita para sa titulo sang ini nga panid]] sa iban man nga panid,
ukon <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mangita ka sang kaparehas nga logs]</span>.',
'missing-revision' => 'Ang ini nga pag-ilis nga #$1 sang panid nga ginhinanglan nga "{{PAGENAME}}" wala naga-eksister.
'edit-already-exists' => 'Indi mahimo ang bag-o nga panid.
Naga-eksister na ini.',
'defaultmessagetext' => 'Teksto sang mensahe nga wala pa ma-ilisan',
+'content-failed-to-parse' => 'Di matuman ang pag-parse $2 nga unod para sa $1 nga modelo: $3',
+'invalid-content-data' => 'May ara sala sa data.',
+'content-not-allowed-here' => '"$1" nga sulod indi pwede sa panid [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'tekstong wiki',
+'content-model-text' => 'tekstong ordinaryo',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Pahibalo:''' Ang ini nga panid may yara sang madamo nga mahal nga pagtawag sang kapusalanan parser.
# Preferences page
'preferences' => 'Mga Ginabasehan',
-'mypreferences' => 'Akon pagpalabi',
+'mypreferences' => 'Mga Ginabasehan',
'prefs-edits' => 'Numero sang mga gin-ilisan:',
'prefsnologin' => 'Wala naka-sulod',
'prefsnologintext' => 'Kinahanglan nga ikaw <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nakasulod]</span> agod nga mabuhat ang pag-ilis sang mga ginapalabi.',
'prefs-help-email-others' => 'Mahimo mo man pilion nga ma-kontak ka sang iban paagi sa e-mail paagi sa isa ka link sa imo manuggamit ukon gina-hisayranay nga panid.
Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
'prefs-help-email-required' => 'Kinahanglan ang imo e-mail',
+'prefs-info' => 'Tig-una nga impormasyon',
+'prefs-i18n' => 'nternasyonalisasyon',
'prefs-signature' => 'pirma',
+'prefs-dateformat' => 'Porma sang petsa ukon adlaw',
+'prefs-timeoffset' => 'Pagintsakto sa oras',
+'prefs-advancedediting' => 'Mas progresibo nga pilian',
+'prefs-advancedrc' => 'Mas progresibo nga pilian',
+'prefs-advancedrendering' => 'Mas progresibo nga pilian',
+'prefs-advancedsearchoptions' => 'Mas progresibo nga pilian',
+'prefs-advancedwatchlist' => 'Mas progresibo nga pilian',
+'prefs-displayrc' => 'Ipagwa ang mga pagpilian',
+'prefs-displaysearchoptions' => 'Ipagwa ang mga pagpilian',
+'prefs-displaywatchlist' => 'Ipagwa ang mga pagpilian',
+'prefs-diffs' => 'Mga ginalainan',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Ang nasambit nga e-mail pwede batunon',
+'email-address-validity-invalid' => 'Magsulod sang isa ka mabaton nga e-mail address.',
+
+# User rights
+'userrights' => 'Tagdumala sang mga derecho sang mga tig-gamit',
+'userrights-lookup-user' => 'Tagdumalaon ang mga grupo sang tiggamit',
+'userrights-user-editname' => 'Mag-intra sang isa ka pangalan sang tiggamit:',
+'editusergroup' => 'Lainon ang mga grupo sang tiggamit',
+'editinguser' => "Guinabag-o ang kinamatarong sang naga-usar '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Lainon ang mga grupo sang tiggamit',
+'saveusergroups' => 'Luwason ang mga grupo sang tiggamit',
+'userrights-groupsmember' => 'Kaupod sang:',
+'userrights-groupsmember-auto' => 'Kaupod sang:',
+'userrights-groups-help' => 'Pwede nyo lainon ang mga grupo sang tiggamit sini sa:
+* Kahon nga may ara check nga nagasiling ang tiggamit amo nga kaupod sa grupo.
+* Kahot nga wala sing check nagasiling nga indi kaupod ang tiggamit sa grupo.
+* Ginaindikar sang * nga ginadilian na ang pagpanas sa grupo kon imo na ni nga gindugang, ukon ang suli sini.',
+'userrights-reason' => 'Rason:',
+'userrights-no-interwiki' => 'Wala ka permiso nga lainon ang layi sang tiggamit sa iban nga mga wiki.',
+'userrights-nodatabase' => 'Wala nagagwa ang datos $1 ukon indi ini lokal.',
+'userrights-nologin' => 'Kinahanglang [[Special:UserLogin|log in]] pinaagi sa isa account nga tagdumala para matagaan sang derecho sang tiggamit.',
+'userrights-notallowed' => 'Ang imo nga account waay sing permiso para magdugang ukon magpanas sang kinamatarong sang mga naga-usar.',
+'userrights-changeable-col' => 'Mga grupo nga pwede mong baguhon.',
+'userrights-unchangeable-col' => 'Mga grupo nga indi mo pwede baguhon.',
# Groups
'group' => 'Grupo:',
+'group-user' => 'Mga Naga-usar',
+'group-autoconfirmed' => 'Mga naga-usar nga awtomatikong guinkompirma',
+'group-bot' => 'Mga bot',
'group-sysop' => 'Mga Administrador',
-
+'group-bureaucrat' => 'Mga byurokratiko',
+'group-all' => '(tanan)',
+
+'group-user-member' => '{{GENDER:$1|naga-usar}}',
+'group-autoconfirmed-member' => '{GENDER:$1|naga-usar nga awtomatikong nakompirma}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|tagdumala}}',
+'group-bureaucrat-member' => '{{GENDER:$1|byurokratiko}}',
+'group-suppress-member' => '{{GENDER:$1|oversight}}',
+
+'grouppage-user' => '{{ns:project}}:Mga Naga-usar',
+'grouppage-autoconfirmed' => '{{ns:project}}:Mga naga-usar nga awtomatikong nakompirma.',
+'grouppage-bot' => '{{ns:project}}:Bots',
'grouppage-sysop' => '{{ns:project}}:Mga Administrador',
+'grouppage-bureaucrat' => '{{ns:project}}:Mga Byurokratiko',
# Rights
'right-read' => 'Basahan ang panid',
'right-edit' => 'Ilisan ang panid',
+'right-createpage' => 'Maghimo sang mga panid (nga indi mga panid sang diskusyon)',
+'right-createtalk' => 'Maghimu sang mga panid para sa diskusyon.',
+'right-createaccount' => 'Maghimu sang bag-o nga mga accounts para sa mga naga-usar',
+'right-minoredit' => 'Markahan kon gamay ukon dyutay lang ang guinbag-o sa unod.',
+'right-move' => 'Saylohon ining panid:',
+'right-move-subpages' => 'Saylohon ang mga panid lakip sa mga panid nga kaupod sini',
+'right-move-rootuserpages' => 'Saylohon ang mga panid nga gingikanan.',
+'right-movefile' => 'Isaylo ang mga dokumento ukon files.',
+'right-suppressredirect' => 'Indi makahimu sang isa ka pagsaylo halin sa mga daan nga nalan kon ginasaylo na sa isa ka panid.',
+'right-upload' => 'Magkarga sang mga files',
+'right-reupload' => 'Islan ang mga naga-eksistar nga mga files.',
+'right-reupload-own' => 'Islan ang mga files nga ginkarga sang iya kaugalingon.',
+'right-reupload-shared' => 'Islan ang mga files sa ginabahin nga bulutangan sang midya sa lokal.',
+'right-upload_by_url' => 'Magkarga sang mga files ukon dokumento halin sa isa ka URL address.',
+'right-purge' => 'Limpyuha ang bulutangan sang site para sa isa ka panid nga waay sing kumpirmasyon',
+'right-autoconfirmed' => 'Islan ang mga panid nga ginprotektar dyutay.',
+'right-bot' => 'Mahimo nga isa ka proseso nga awtomatiko',
+'right-nominornewtalk' => 'Wala nga dyutay nga pagbag-o sa mga panid sang diskusyon para makasugod sang isa ka abiso nagasiling nga may bag-ong mensahe.',
+'right-apihighlimits' => 'Mag-usar sang mas mataas nga limitasyon para sa mga pamangkot sa API.',
+'right-writeapi' => 'Pag-usar sang ginsulat nga API',
+'right-delete' => 'Panason ang panid',
+'right-bigdelete' => 'Panason ang mga panid nga may daku nga maragtas',
+'right-deletelogentry' => 'Panason kag indi panason ang mga partikular nga mga log entries',
+'right-deleterevision' => 'Panason kag indi panason ang mga partikular nga mga pagbag-o sang mga panid.',
+'right-deletedhistory' => 'Tan-awa ang mga ginpanas nga mga entries nga waay kaupod nga teksto.',
+'right-deletedtext' => 'Tan-awa ang napanas nga mga teksto kag pagbag-o sa tunga sang duha ka rebisyon.',
+'right-browsearchive' => 'Pangitaa ang mga ginpanas nga mga panid',
+'right-undelete' => 'Buhion liwat ang isa ka panid.',
+'right-suppressrevision' => 'Liwaton kag ibalik ang mga pagbag-o nga gintago halin sa mga tagdumala.',
+'right-suppressionlog' => 'Tan-awon ang mga pribadong log.',
+'right-block' => 'Indi pasugtan ang iban nga mga naga-usar sa pagbag-o',
+'right-blockemail' => 'Indi pasugtan ang isa ka naga-usar para magpadala sang email.',
+'right-hideuser' => 'Indi pasugta ang ang isa ka naga-usar kag itago ini halin sa publiko.',
+'right-ipblock-exempt' => 'Indi pag-agihan ang mga indi ginpasugtan nga mga IP blocks, auto blocks kag range blocks.',
+'right-proxyunbannable' => 'Indi pagagihan ang mga awtomatiko nga pagharang sang mga proxies.',
+'right-unblockself' => 'Panason ang pagkaharang sa ila kaugalingon',
+'right-protect' => 'Islan ang grado sang proteksyon kag baguhon ang mga ginprotektar nga mga panid',
+'right-editprotected' => 'Baguhon ang mga panid nga ginprotekta (waay sing proteksyon nga de-grado)',
+'right-editinterface' => 'Baguhon ang user interface.',
+'right-editusercssjs' => 'Baguhon ang mga CSS kag Javascript nga files sang iban nga naga-usar.',
+'right-editusercss' => 'Baguhon ang mga CSS files sang iban nga naga-usar.',
+'right-edituserjs' => 'Baguhon ang mga Javascript files sang iban nga mga naga-usar.',
+'right-rollback' => 'Dasigay nga ibalik sa nahauna nga estado ang mga pagbag-o sang ulihi nga naga-usar nga nabag-o sa isa ka partikular nga panid.',
+'right-markbotedits' => 'Markahan ang mga rolled back nga mga ginbag-o bilang mga ginbag-o sang mga bot.',
+'right-noratelimit' => 'Indi maapektuhan sang mga limitasyon.',
+'right-import' => 'Mag-importe sang mga panid halin sa iban nga wikis',
+'right-importupload' => 'Mag-importe sang mga panid halin sa pagkarga sang files',
+'right-patrol' => 'Markahan bilang "ginabantayan" ang mga pagbag-o sang iban.',
+'right-autopatrol' => 'Awtomatikong markahan nga ginabantayan ang mga pagbag-o sa sarili.',
+'right-patrolmarks' => 'Tan-awa ang mga sining karon lamang nga mga ginbag-o kag markahan ini nga ginabantayan',
+'right-unwatchedpages' => 'Tan-awa ang listahan sang mga indi ginabantayan nga mga panid',
+'right-mergehistory' => 'Tingbon ang mga maragtas sang mga panid',
+'right-userrights' => 'Baguhon ang tanan nga kinamatarong sang mga naga-usar',
+'right-userrights-interwiki' => 'Bagohon ang kinamatarong sang mga naga-usar sa iban nga mga wiki.',
+'right-siteadmin' => 'Isira kag abrihan ang bulutangan sang mga impormasyon',
+'right-override-export-depth' => 'Ipagwa ang mga panid kaupod ang mga sugpon nga mga panid tubtub isa idalum nga 5.',
+'right-sendemail' => 'Magpadala sang email sa iban nga naga-usar',
+'right-passwordreset' => 'Tan-awa ang mga email sang password reset',
# Special:Log/newusers
'newuserlogpage' => 'Naga-usar nga ginhimo log',
+'newuserlogpagetext' => 'Ini ang isa ka log sang mga ginhimo sang naga-usar',
# User rights log
'rightslog' => 'Karapatan sang naga-usar log',
+'rightslogtext' => 'Ini ang lista sang mga ginbag-o nga mga kinamatarong sang naga-usar.',
# Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'Basahon ang ini nga panid',
'action-edit' => 'islan ini nga pahina',
+'action-createpage' => 'Maghimo sang mga panid',
+'action-createtalk' => 'Maghimo sang mga panid sang mga diskusyon.',
+'action-createaccount' => 'Himuon ini sang account sang naga-gamit.',
+'action-minoredit' => 'Markahan ang sini nga pagbag-o nga dyutay ukon gamay lang',
+'action-move' => 'Isaylo ang sini nga panid',
+'action-move-subpages' => 'Isaylo ang sini nga panid, lakip na sa mga panid nga kaupod sini',
+'action-move-rootuserpages' => 'Isaylo ang mga panid nga guingikanan',
+'action-movefile' => 'Isaylo sini nga file',
+'action-upload' => 'Kargahon sini nga file',
+'action-reupload' => 'Lainon ang naga-eksistar na nga file',
+'action-reupload-shared' => 'Lainon ang mga file sa bulutangan nga ginabahin',
+'action-upload_by_url' => 'Ikarga sini nga file halin sa isa ka URL',
+'action-writeapi' => 'Pag-usar sang ginsulat nga API',
+'action-delete' => 'Panason ini nga pahina',
+'action-deleterevision' => 'Panason ang sini nga pagbag-o',
+'action-deletedhistory' => 'Tan-awon ang ginpanas nga maragtas sang sini nga panid',
+'action-browsearchive' => 'Pangitaa ang mga ginpanas nga mga panid',
+'action-undelete' => 'Indi panason ang sini nga panid',
+'action-suppressrevision' => 'Ireview kag ibalik ang mga gintago nga mga rebisyon',
+'action-suppressionlog' => 'Tan-awa ang sini nga pribado nga log.',
+'action-block' => 'Indi pasugtan ang iban nga mga naga-usar sa pagbag-o',
+'action-protect' => 'Baguhon ang nibel sang proteksyon para sa sini nga panid',
+'action-rollback' => 'Dasigay nga ibalik sa nahauna nga estado ang mga pagbag-o sang ulihi nga naga-usar nga nabag-o sa isa ka partikular nga panid.',
+'action-import' => 'Importehon ang sini nga panid halin sa iban nga wiki',
+'action-importupload' => 'Importehon ang sini nga panid halin sa ginkarga nga file',
+'action-patrol' => 'Markahan bilang "ginabantayan" ang mga pagbag-o sang iban.',
+'action-autopatrol' => 'Markahan bilang "ginabantayan" ang imo nga mga ginhimo nga pagbag-o',
+'action-mergehistory' => 'Tingbon ang mga maragtas sang mga panid',
+'action-userrights' => 'Baguhon ang tanan nga kinamatarong sang mga naga-usar',
+'action-userrights-interwiki' => 'Bagohon ang kinamatarong sang mga naga-usar sa iban nga mga wiki.',
+'action-siteadmin' => 'Isira kag abrihan ang bulutangan sang mga impormasyon',
+'action-sendemail' => 'Magpadala sang mga email',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|bag-ohon|mga ginbag-o}}',
'recentchanges' => 'Mga Bag-o nga Inislan',
'recentchanges-legend' => 'Mga pililian sa bag-o lang na himo',
+'recentchanges-summary' => 'La-uton ang pina gid ka bag-o nga nahimo sa may wiki sa ini nga feed',
'recentchanges-feed-description' => 'La-uton ang pina gid ka bag-o nga nahimo sa may wiki sa ini nga feed.',
+'recentchanges-label-newpage' => 'Ang sini nga pagbag-o nakahimo sang bag-o nga panid',
'recentchanges-label-minor' => 'Diotay ilis ini',
+'recentchanges-label-bot' => 'Ang sini nga pagbag-o ginubra sang isa ka bot',
+'recentchanges-label-unpatrolled' => 'Ang sini nga pagbag-o indi pa ginbantayan',
'rcnote' => "Diri sa idalum {{PLURAL:$1|ay '''1''' na bag-o|sang nagligad '''$1''' mga nabag-o}} sa naligad {{PLURAL:$2|adlaw|'''$2''' adlaw}}, sang mga $5, $4.",
+'rcnotefrom' => "Yara sa idalum ang mga guinbag-o halin '''$2''' (tubtub '''$1''' ang ginpagwa).",
'rclistfrom' => 'Ipakita ang bag-o lang nahimo halin sa $1',
'rcshowhideminor' => '$1 menor nga mga inislan',
'rcshowhidebots' => '$1 bots',
'rcshowhideliu' => '$1 mga ga-usar nga naka sulod',
'rcshowhideanons' => '$1 di nagpakilala nga mga ga-usar',
+'rcshowhidepatr' => '$1 ginabantyan nga pagbag-o',
'rcshowhidemine' => '$1 akon mga inislan',
'rclinks' => 'Ipakita ang nagligad $1 nga nabag-o lang sang $2 adlaw<br />$3',
'diff' => 'diff',
'minoreditletter' => 'm',
'newpageletter' => 'B',
'boteditletter' => 'b',
+'number_of_watching_users_pageview' => '[$1 ginabantayan {{PLURAL:$1|naga-usar|mga naga-usar}}]',
+'rc_categories' => 'Limitahan ang mga kategorya (ibulag lakip sang "|")',
+'rc_categories_any' => 'Bisan ano',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|mga bytes}} despues sang pagbag-o',
+'newsectionsummary' => '/* $1 */ bag-o nga seksyon',
'rc-enhanced-expand' => 'Ipakita ang mga detalye (nagakilanlan sang JavaScript)',
'rc-enhanced-hide' => 'Tagu-on ang mga detalye',
+'rc-old-title' => 'orihinal nga ginhimo bilang "$1"',
# Recent changes linked
'recentchangeslinked' => 'May labot nga pag-ilis',
'recentchangeslinked-feed' => 'May labot nga pag-ilis',
'recentchangeslinked-toolbox' => 'May labot nga pag-ilis',
'recentchangeslinked-title' => 'Mga ginlain nga kapareho kay "$1"',
+'recentchangeslinked-noresult' => 'Wala mga pagbag-o sa mga sugpon nga mga panid sa ginhatag nga tiempo.',
'recentchangeslinked-summary' => "Ini ang mga lista sang mga bag-o lang gid nga nahimo nga mga pahina nga gintabid halin sa gin klaro nga pahina (o mga katapo sa mga kategorya nga gin klaro).
Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
'recentchangeslinked-page' => 'Ngalan ka Pahina:',
# Upload
'upload' => 'Uplod file',
'uploadbtn' => 'Karga file',
+'reuploaddesc' => 'Kanselahon ang pag-karga kag magbalik sa porma sang pag-karga.',
+'upload-tryagain' => 'Ipasa ang ginlarawan nga ginbag-o nga file',
'uploadnologin' => 'Wala naka-sulod',
+'uploadnologintext' => 'Kinahanglan [[Special:UserLogin|nakalagda]] para makarga ang mga files.',
+'upload_directory_missing' => 'Nadula ang direktoryo sang pag-karga ($1) kag indi na ini mahimo sang webserver.',
+'upload_directory_read_only' => 'Ang direktoryo sang pag-karga ($1) indi pwede masulat sang webserver.',
+'uploaderror' => 'May sala sa pag-karga',
+'upload-recreate-warning' => "'''Abiso: Ang isa ka file nga amo ang iya ngalan ginpanas na ukon ginsaylo'''
+
+Ang log sang pagpanas kag pagsaylo para sa sini nga panid ginahatag diri para sa imo nga kombinyensya.",
+'uploadtext' => "Usaron ang porma sa idalum para makakarga sang mga file. Para matan-aw ukon mapangita ang mga file nga ginkarga na, kadto sa:[Special:FileList|lista sang mga files nga ginkarga]], ang mga ginkarga liwat nakalista sa: [[Special:Log/upload|lista sang mga ginkarga]], ang mga ginpanas [[Special:Log/delete|lista sang mga ginpanas]].
+
+Para maupod ang isa ka file sa isa ka panid, usaron ang sini nga sugpon sa mga masunod nga mga porma:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' para mausar ang bilog nga bersyon sang file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' para mausar ang isa ka 200 ka pixel nga mas pinalapad nga bersyon sa isa ka karton sa wala nga bahin lakip ang 'alt teksto' bilang paglarawan
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para direkta nga masugpunan ang file, bisan indi na ini ipagwa.",
+'upload-permitted' => 'Mga ginpasugtan nga mga tipo sang files: $1',
+'upload-preferred' => 'Mga mas gusto nga mga tipo sang mga file: $1',
+'upload-prohibited' => 'Mga ginadilian nga mga tipo sang mga files: $1',
+'uploadlog' => 'Lista sang mga ginkarga',
'uploadlogpage' => 'Uplod log',
+'uploadlogpagetext' => 'Ara sa idalum ang listahan sang pinakaulihi nga mga ginkarnga nga mga files: [[Special:NewFiles|gallery of new files]] para sa mas biswal nga pagtan-aw.',
+'filename' => 'Ngalan sang file',
'filedesc' => 'Kabilogan',
'fileuploadsummary' => 'Kabilogan:',
+'filereuploadsummary' => 'Mga pagbag-o sang file:',
+'filestatus' => 'Ang estado sang copyright:',
+'filesource' => 'Guinghalinan:',
+'uploadedfiles' => 'Mga ginkarga nga file',
+'ignorewarning' => 'Indi pagsapaka ang abiso kag basta luwason lang ang file',
+'ignorewarnings' => 'Indi pagsapaka ang tanan nga mga abiso',
+'minlength1' => 'Kinahanglan may ara isa ka letra para sa ngalan sang file.',
+'illegalfilename' => 'Ang ngalan sang file "$1" may ara nga mga karakter nga ginadilian sa mga titulo sang mga panid. Palihug maghatag sang iban nga ngalan sa file kag kargahon ini liwat.',
+'filename-toolong' => 'Ang mga ngalan sang files indi pwede masubra sa 240 ka bytes.',
+'badfilename' => 'Ang ngalan sang file ginbag-o bilang "$1".',
+'filetype-mime-mismatch' => 'Ang sugpon sang file ".$1" indi nagaparehas sa na nabal-an nga tipo nga MIME sang file ($2).',
+'filetype-badmime' => 'Ginadilian ang pagkarga sang mga files nga may tipo nga MIME "$1"',
+'filetype-bad-ie-mime' => 'Indi makarga ang sini nga file tungod ang Internet Explorer gindetect ini bilang "$1", nga ginadilian kag isa ka potensyal nga file nga makahalit.',
+'filetype-unwanted-type' => "Isa ka indi gusto nga tipo sang file ang '''\".\$1\"'''
+Ang gusto nga {{PLURAL:\$3|tipo sang file amo|mga tipo sang file amo ang}} \$2.",
'empty-file' => 'Ang dokumeto ginapadala mo wala unod.',
'file-too-large' => 'Ang dokumeto ginapadala mo madako gid.',
'filename-tooshort' => 'Ang ngalan sang dokumento malipot gid.',
'uploadedimage' => 'na-uplod "[[$1]]"',
'watchthisupload' => 'Bantayan ining panid',
+'license' => 'Pagpanglisensya',
'license-header' => 'Pagpanglisensya',
# File description page
+'file-anchor-link' => 'File',
'filehist' => 'Historya file',
'filehist-help' => 'I-klik sa may petsa/oras para makita ang file sa ina nga oras.',
+'filehist-revert' => 'Ibalik',
'filehist-current' => 'subong',
'filehist-datetime' => 'Petsa/Oras',
'filehist-thumb' => 'Thumbnail',
'filehist-user' => 'Naga-usar',
'filehist-dimensions' => 'Mga Takus',
'filehist-comment' => 'Komentar',
-'imagelinks' => 'File Tabid',
+'imagelinks' => 'Pagusar sang file',
'linkstoimage' => 'Ang nagakasunod {{PLURAL:$1|pahina nga mga tabid|$1 mga pahina mga tabid}} sa sini nga file:',
+'nolinkstoimage' => 'Waay sing panid nga nakasugpon sa sini nga file.',
'sharedupload' => 'Ini nga file gikan sa $1 kag pwede ma usar sang iban nga mga proyekto.',
+'sharedupload-desc-here' => 'Ang sini nga file amo halin sa $1 kag pwede ini mausar sa lain nga mga proyekto. Ang ginalarawan sang iya nga [$2 panid sang paglarawan sang file] amo ang ginpagwa sa idalum.',
'uploadnewversion-linktext' => 'Uplod sang bag-o nga bersiyon sang sini nga file',
# File deletion
# Statistics
'statistics' => 'Mga Statistik',
+'disambiguationspage' => 'Template:disambig',
+
'brokenredirects-edit' => 'ilisan',
'brokenredirects-delete' => 'panason',
'nmembers' => '$1 {{PLURAL:$1|membro|mga membro}}',
'popularpages' => 'Ang panid nagakilala gid',
'prefixindex' => 'Tanan nga mga pahina nga may-ara prefiks',
+'usercreated' => '{{GENDER:$3|Ginhimo}} sa $1 kag $2',
'newpages' => 'Mga Bag-o nga Pahina',
'newpages-username' => 'Ngalan sang Manog-gamit:',
'move' => 'Saylohon',
'allpagesnext' => 'Dason',
'allpagessubmit' => 'Sige',
+# Special:Categories
+'categories' => 'Mga kategorya',
+
# Special:LinkSearch
'linksearch' => 'Eksternal na mga tabid',
'linksearch-ok' => 'Pangita-a',
+'linksearch-line' => '$1 amo nakasugpon sa $2',
# Special:ListGroupRights
'listgrouprights-group' => 'Grupo',
'listgrouprights-members' => '(lista sang mga membro)',
-# E-mail user
+# Email user
'emailuser' => 'I-email ini nga naga-usar',
# Watchlist
-'watchlist' => 'Akon Ginabantayan',
-'mywatchlist' => 'Akon Ginabantayan',
+'watchlist' => 'Ginabantayan',
+'mywatchlist' => 'Ginabantayan',
+'watchlistfor2' => 'Para sa $1 $2',
'watchnologin' => 'Wala naka-sulod',
'addedwatchtext' => "Ang pahina \"[[:\$1]]\" ay nadugang sa imo [[Special:Watchlist|lista sang pagtan-aw]].
Buwas-damlag nga pagbag-o sang pahina kag ang iya upod na hisayrany pahina ay ipagalista didto, kag ang pahina magapakita balang '''dukot''' sa may [[Special:RecentChanges|lista sang mga bag-o lang na-islan]] para mahapos lang ini kuhaon.",
'confirmdeletetext' => 'Ikaw ay magapanas sang pahina upod sang tanan niya nga historya.
Palihog lang nga sigurado nga kinagusto mo ini nga himuon, nga na-intindihan mo ang resulta sang ginahimo mo, kag ang gina obra mo ga santo upod sa [[{{MediaWiki:Policy-url}}|polisiya]].',
'actioncomplete' => 'Kompleto nga aksiyon',
+'actionfailed' => 'Indi madinalag-on ang paghulag',
'deletedtext' => '"$1" ay nakakas na.
Lantawa $2 para sa mga lista sang mga bag-o lang ginkakas.',
'dellogpage' => 'Ginkakas na log',
# Undelete
'undeletelink' => 'tan-aw/ginbalik',
+'undeleteviewlink' => 'Tan-awa',
'undelete-search-submit' => 'Pangita-a',
# Namespace form on various pages
'blanknamespace' => '(Mayor)',
# Contributions
-'contributions' => 'Naga-usar nga mga kontribusyon',
+'contributions' => 'Mga kontribusyon sang {{GENDER:$1|naga-usar}}',
'contributions-title' => 'Mga Kontribusyon sang Naga-Usar para $1',
-'mycontris' => 'Akon contribusyon',
+'mycontris' => 'Kontribusyon',
'contribsub2' => 'Para $1 ($2)',
'uctop' => '(ibabaw)',
'month' => 'Halin sa bulan (kag sang timprano):',
'sp-contributions-newbies' => 'Ipakita ang mga kontribusyon sang mga bag-o nga akawnts lamang',
'sp-contributions-blocklog' => 'pugong log',
+'sp-contributions-uploads' => 'Mga ginkarga',
+'sp-contributions-logs' => 'Mga lista',
'sp-contributions-talk' => 'Hisayranay',
'sp-contributions-search' => 'Mangita para sa mga knotribusyon',
'sp-contributions-username' => 'IP Adres ukon ngalan sang naga-user:',
+'sp-contributions-toponly' => 'Ipagwa lang ang mga ginbag-o nga mga ulihi nga rebisyon',
'sp-contributions-submit' => 'Pangita-a',
# What links here
'whatlinkshere-title' => 'Mga pahina nga naga tabid sa $1',
'whatlinkshere-page' => 'Pahina:',
'linkshere' => "Ang mga sumunod nga pahina ay nagatabid sa '''[[:$1]]''':",
+'nolinkshere' => "Waay panid nga nakasugpon sa '''[[:$1]]'''.",
'isredirect' => 'pahina sa ginadirekta liwat',
'istemplate' => 'transklusyon',
-'isimage' => 'laragway tabid',
+'isimage' => 'Ang sugpon sang file',
'whatlinkshere-prev' => '{{PLURAL:$1|antes|antes $1}}',
'whatlinkshere-next' => '{{PLURAL:$1|dasun|dasun $1}}',
'whatlinkshere-links' => '← mga tabid',
'whatlinkshere-hideredirs' => '$1 mga gin direkta liwat',
'whatlinkshere-hidetrans' => '$1 mga transklusyon',
'whatlinkshere-hidelinks' => '$1 mga tabid',
+'whatlinkshere-hideimages' => '$1 sugpon sang file',
'whatlinkshere-filters' => 'Mga Sala-an',
# Block/unblock
'blockip' => 'i-Pugong ang naga-usar',
'ipbreason' => 'Rason:',
+'ipbother' => 'Iban nga oras:',
'ipboptions' => '2 oras:2 hours,1 adlaw:1 day,3 adlaw:3 days,1 semana:1 week,2 semana:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tu-ig:1 year,wala katapusan:infinite',
+'ipbotheroption' => 'lain',
+'ipbotherreason' => 'Iban ukon dugang nga rason:',
+'ipbhidename' => 'Itago ang ngalan sang tiggamit sa mga pagbag-o kag mga listahan.',
'ipblocklist' => 'Napunggan nga mga manug-usar',
+'blocklist-rangeblocks' => 'Itago ang mga bloke sang ginasakupan',
+'blocklist-reason' => 'Rason:',
'ipblocklist-submit' => 'Pangita-a',
+'emailblock' => 'Gintapna ang e-mail',
'blocklink' => 'harang',
'unblocklink' => 'di pagpugong',
'change-blocklink' => 'pagbag-o sang pugong',
'unblocklogentry' => 'di pagpugong $1',
'block-log-flags-nocreate' => 'paghimo sang akawnt ay gin untat',
+# Developer tools
+'lockconfirm' => 'Huo, gusto ko gid isirado ang bulutangan sang impormasyon.',
+'unlockconfirm' => 'Huo, gusto ko gid abrihon ang bulutangan sang impormasyon.',
+'lockbtn' => 'Isira ang bulutangan sang impormasyon.',
+'unlockbtn' => 'Abrihon ang bulutangan sang impormasyon.',
+
# Move page
'move-page-legend' => 'Saylohon ining panid',
'movepagetext' => "Sa pagamit sang lista sa idalum ay magahatag ini sang bag-o na ngalan, pagasaylohon niya ang tanan nga historya sa bag-o nga ngalan.
# Export
'export' => 'Eksport sa mga pahina',
+'exporttext' => 'Pwede mo ipagwa ang isa ka teksto kag lainon ang maragtas sang isa ka partikular nga panid ukon grupo sang mga panid nga nakabutang sa XML. Pwede ini ipagwa sa iban nga wiki pinaagi sa MediaWiki [[Special:Import|pahinang angkat]].
+
+Para magwa ang mga panid, isulod ang titulo sa text box sa idalum, isa ka titulo tagsa kurit, kag pilion kon gusto mo ang subong nga bersyon ukon ang mga daan nga bersyon, kaupod ang mga panid sang maragtas, ukon ang subong nga bersyon kaupod ang impormasyon sang mga pinakaulihi nga guinbag-o.
+
+Sa ulihi nga kaso, pwede ka magusar sang isa ka sugpon, tulad sa [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para sa panid "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Ipagwa tanan nga mga panid',
# Namespace 8 related
'allmessages' => 'Mga mensahe sang sistema',
+'allmessagesname' => 'Ngalan',
+'allmessagesdefault' => 'Ang gindestino nga teksto',
# Thumbnails
'thumbnail-more' => 'Padaku-on',
+'thumbnail_error' => 'May ara sala sa paghimo sang thumbnail: $1',
+
+# Special:Import
+'import-options-wrong' => 'Sala {{PLURAL:$2|pili|mga pagpilian}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Ang ginhatag nga gingikanan nga panid indi mabaton ang iya nga titulo.',
+'import-rootpage-nosubpage' => 'Ang espasyo sang ngalan nga "$1" nga gingikanang panid indi ginapasugtan ang kaupod nga mga panid.',
+
+# Import log
+'importlogpage' => 'Listahan sang mga importe',
+'importlogpagetext' => 'Mga importeng administratibo sang mga panid nga may maragtas sang pagbag-o halin sa iban nga wiki.',
+
+# JavaScriptTest
+'javascripttest-pagetext-frameworks' => 'Palihug pilion ang isa sa mga masunod nga mga testing frameworks: $1',
+'javascripttest-pagetext-skins' => 'Pilion ang isa ka panit para magdalagan sa imo nga eksamin:',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Ang imo kaugalingon nga pahina',
+'tooltip-pt-anonuserpage' => 'Ang panid sang tiggamit para sa IP address imo ginbag-o bilang',
'tooltip-pt-mytalk' => 'Ang imo pahina sang paghisayranay',
+'tooltip-pt-anontalk' => 'Istorya kapin sa mga pagbag-o nga ginhimo sa ip address nga ini',
'tooltip-pt-preferences' => 'Akon pagpalabi',
'tooltip-pt-watchlist' => 'Ang lista sang mga pahina nga imo ginabantayan para bag-ohon',
'tooltip-pt-mycontris' => 'Lista sang imo kontribusyon',
'tooltip-pt-login' => 'Gina-abi-abi ikaw nga man magsulod paagi sa pag log-in, apang indi ini kinahanglan gid buhaton',
+'tooltip-pt-anonlogin' => 'Ginasuportahan ka nga magsulod, ugaling indi ini kinahanglan.',
'tooltip-pt-logout' => 'Mag guha',
'tooltip-ca-talk' => 'Paghisayranay nahanungod sini nga panid',
'tooltip-ca-edit' => 'Puede nimo islan ang unod sang sini nga panid. Palihog gamit sang preview button antes permanentehon ang gin ilisan.',
Pwede mo matan-aw ang iya ginhalinan',
'tooltip-ca-history' => 'Nagligad nga rebisyon sa sini nga pahina',
'tooltip-ca-protect' => 'Protektahan ini nga pahina',
+'tooltip-ca-unprotect' => 'Ilisan ang pagpangapin sa sini nga panid',
'tooltip-ca-delete' => 'Panason ini nga pahina',
+'tooltip-ca-undelete' => 'Ibalik ang mga paglain nga ginhimo sa panid nga ini antes nga ini ginpanas.',
'tooltip-ca-move' => 'Saylohon ining panid',
'tooltip-ca-watch' => 'I-dugang ini nga pahina sa imo listahan sang palangitaon',
'tooltip-ca-unwatch' => 'Kuhaon ini nga pahina sa imo lista sang ginabantayan',
'tooltip-t-permalink' => 'Permanente nga tabid sa sini nga rebisyon sang pahina',
'tooltip-ca-nstab-main' => 'Tan-awon ang unod sang pahina',
'tooltip-ca-nstab-user' => 'Tan-awon ang pahina sang naga-usar',
+'tooltip-ca-nstab-media' => 'Tan-awon ang panid sang midya.',
'tooltip-ca-nstab-special' => 'Espesyal ini nga pahina, indi mo ini ma islan sang iya kaugalingon nga pahina',
'tooltip-ca-nstab-project' => 'Tan-awon ang pahina ka proyekto',
'tooltip-ca-nstab-image' => 'Tan-awon ang pahina sang file',
+'tooltip-ca-nstab-mediawiki' => 'Tan-awon ang mensahe sang sistema',
'tooltip-ca-nstab-template' => 'Tan-awon ang templeyt',
+'tooltip-ca-nstab-help' => 'Tan-awon ang panid sang bulig',
'tooltip-ca-nstab-category' => 'Tan-awon ang pahina nga kategorya',
'tooltip-minoredit' => 'Markahan ini bilang menor nga pag-ilis',
'tooltip-save' => 'Permanentehon ang imo gin islan',
'tooltip-diff' => 'Ipakita ang mga bag-o nga nahimo mo sa teksto',
'tooltip-compareselectedversions' => 'Lantawa ang ginalian sang duwa ka napilian nga rebisyon sa sini nga pahina',
'tooltip-watch' => 'Idugang ini nga pahina sa imo lista nga ginabantayan',
+'tooltip-watchlistedit-normal-submit' => 'Pagpanason ang mga titulo',
+'tooltip-watchlistedit-raw-submit' => 'Iupdate ang listahan sang mga ginatan-aw.',
+'tooltip-recreate' => 'Liwat nga himuon ang panid bisan ini napanas na',
+'tooltip-upload' => 'Sugdan ang pagkarga',
'tooltip-rollback' => '"Panumbalik" ginabalik ang (mga) na-islan sa sini nga pahina sa pinaka ulihi nga kontributor sa isa lang ka klik',
'tooltip-undo' => '"Indi pag-obrahon" ginabalik ang gin-islan kag gabukas sa isaln form sa may prebyu mode.
Gapasugot sa pagdugang sang rason sa kabilugan.',
+'tooltip-preferences-save' => 'kon pagpalabi',
'tooltip-summary' => 'Maghatag sing diutay nga eksplikasyon',
+# Metadata
+'notacceptable' => 'Indi makahatag sang impormasyon ang serbidor sang wiki sa porma nga mabasahan sang imo nga kliyente.',
+
+# Attribution
+'anonymous' => 'Indi kilala {{PLURAL:$1|tagagamit|mga tagagamit}} sang {{SITENAME}}',
+'siteuser' => 'Tiggamit {{SITENAME}} sang $1',
+
# Browsing diffs
'previousdiff' => '← Mas daan nga na-islan',
'nextdiff' => 'Mas bag-o nga gin-islan →',
Kung ang ini nga file ginliwat halin sa orihinal nga porma, basi indi gina pakita ang naliwat nga file sang iban nga mga detalye.',
'metadata-expand' => 'Ipakita ang mga dugang nga detalye',
'metadata-collapse' => 'Tagu-on ang mga dugang nga detalye',
-'metadata-fields' => 'EXIF metadata fields nga nalista sa ini nga mensahe ay pagadal-on sa mga laragway nga gina pakita sa pahina kun ang metadata table ay narumpag.
+'metadata-fields' => 'Ang mga imahen sang EXIF metadata fields nga nalista sa ini nga mensahe ay pagadal-on sa mga laragway nga gina pakita sa pahina kun ang metadata table ay narumpag.
Ang iban ay pagataguon sang default.
-* make
-* model
+* himo
+* modelo
* datetimeoriginal
-* exposuretime
+* tyempo sang exposure
* fnumber
* isospeedratings
* focallength
-* artist
+* artista
* copyright
* imagedescription
* gpslatitude
* gpslongitude
* gpsaltitude',
+# EXIF tags
+'exif-lightsource' => 'Ginghalinan sang sanag',
+'exif-flash' => 'Igpat',
+'exif-subjectarea' => 'Subject area',
+'exif-flashenergy' => 'Kabaskug sang igpat',
+'exif-focalplaneyresolution' => 'Resolusyong Y sa focal plane',
+'exif-focalplaneresolutionunit' => 'Yunit sang resolusyon sang focal plane',
+'exif-subjectlocation' => 'Lokasyon sang tuyo',
+'exif-exposureindex' => 'Antas sang exposure',
+'exif-sensingmethod' => 'Pamaagi sang pagpabatyag',
+'exif-filesource' => 'Ginhalinan sang file',
+'exif-scenetype' => 'Tipo sang larawan',
+'exif-customrendered' => 'Ginaproseso ang ginpersonalisado nga imahen',
+'exif-exposuremode' => 'Tipo sang exposure',
+'exif-whitebalance' => 'Balanse sang kaputian',
+'exif-digitalzoomratio' => 'Antas sang digital zoom',
+'exif-focallengthin35mmfilm' => 'Laba sang pokus sang film nga 35 mm',
+'exif-scenecapturetype' => 'Tipo sang pag-kuha sang litrato',
+
# External editor support
'edit-externally' => 'Islan ini nga file gamit ang eksternal nga aplikasyon',
'edit-externally-help' => '(Lantawa ang [//www.mediawiki.org/wiki/Manual:External_editors tudlo sa pag panugod] para sa mga dugang nga impormasyon)',
'watchlisttools-edit' => 'Tan-awon kag islan ang listahan nga ginalantaw',
'watchlisttools-raw' => 'Islan ang hindi pa tapos na listahan sang nagalantaw',
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Abiso:\'\'\' Ang default sort key nga "$2" ginabag-o sang nauna nga default sort key nga "$1".',
+
# Special:Version
'version-specialpages' => 'Pinasahi nga mga panid',
# Special:SpecialPages
'specialpages' => 'Espesyal nga mga panid',
+# External image whitelist
+'external_image_whitelist' => ' #Pabay-an lang ang ini nga linya nga amu ni<pre>
+#Ibutang ang mga piraso sang mga regular nga expressions (amo lang nga parte nga yara sa tunga sang //) sa idalum
+#Ini ibagay sa mga URLs sang mga imahen (hotlinked ukon ginsugpon) sa gwa.
+#Ang mga nagakabagay nga mga imahen ini igapagwa, kon indi ang sugpon ukon link lang sang imahen ang igapagwa.
+#Mga linya nga nagasugod sa # tratuhon bilang komento.
+#Ini indi sensitibo sa kapitalisasyon
+
+#Ibutang ang tanan nga regex fragments sa babaw sang linya. Pabay-i lang ang linya nga amu ina</pre>',
+
+# Special:Tags
+'tag-filter' => 'Ginpangsala sa [[Special:Tags|marka]]:',
+
# New logging system
'revdelete-restricted' => 'ginapatuman nga pagbawal sa mga administrador',
'revdelete-unrestricted' => 'ginkakas nga pagbawal sa mga administrador',
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer to izgleda kao da je poslan preko pokvarenog preglednika ili keširanog posrednika (proxyja).',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Nepoznata pogreška u PHP-mail() funkciji',
'user-mail-no-addy' => 'Pokušaj slanja e-maila bez e-mail adrese.',
'prefs-displaywatchlist' => 'Opcije prikaza',
'prefs-diffs' => 'razl',
-# User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'E-mail adresa se pokazuje ispravnom',
-'email-address-validity-invalid' => 'Unesite valjanu e-mail adresu',
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Adresa e-pošte pokazuje se ispravnom',
+'email-address-validity-invalid' => 'Unesite valjanu adresu e-pošte',
# User rights
'userrights' => 'Upravljanje suradničkim pravima',
'listgrouprights-addgroup-self-all' => 'Dodaj sve skupine vlastitom računu',
'listgrouprights-removegroup-self-all' => 'Uklonite sve skupine iz vlastitog računa',
-# E-mail user
+# Email user
'mailnologin' => 'Nema adrese pošiljaoca',
'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]]
i imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]
'anononlyblock' => 'samo IP adrese',
'noautoblockblock' => 'blokiranje samoga sebe je onemogućeno',
'createaccountblock' => 'blokirano stvaranje suradničkog računa',
-'emailblock' => 'e-mail je blokiran',
+'emailblock' => 'e-pošta je blokirana',
'blocklist-nousertalk' => 'bez uređivanja vlastite stranice za razgovor',
'ipblocklist-empty' => 'Popis blokiranja je prazan.',
'ipblocklist-no-results' => 'Tražena IP adresa ili suradničko ime nije blokirano.',
'unblocklink' => 'deblokiraj',
'change-blocklink' => 'promijeni blokiranje',
'contribslink' => 'doprinosi',
-'emaillink' => 'pošalji e-mail',
+'emaillink' => 'pošalji e-poruku',
'autoblocker' => 'Automatski ste blokirani jer je Vašu IP adresu nedavno koristio "[[User:$1|$1]]" koji je blokiran zbog: "$2".',
'blocklogpage' => 'Evidencija blokiranja',
'blocklog-showlog' => 'Ovaj suradnik je ranije blokiran.
'monthsall' => 'sve',
'limitall' => 'sve',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Potvrda e-mail adrese',
'confirmemail_noemail' => 'Niste unijeli važeću e-mail adresu u Vaše [[Special:Preferences|suradničke postavke]].',
'confirmemail_text' => 'U ovom wikiju morate prije korištenja e-mail naredbi potvrditi svoju e-mail adresu. Kliknite na gumb ispod kako biste poslali poruku s potvrdom na Vašu adresu. U poruci će biti poveznica koju morate otvoriti u svom web pregledniku i time potvrditi svoju e-mail adresu.',
* @author J budissin
* @author Kaganer
* @author Michawiki
+ * @author Shirayuki
* @author Tchoř
* @author Tlustulimu
* @author לערי ריינהארט
'newmessagesdifflink' => 'poslednja změna',
'youhavenewmessagesfromusers' => 'Maš $1 wot {{PLURAL:$3|druheho wužiwarja|$3 wužiwarjow|$3 wužiwarjow|$3 wužiwarjow}} ($2).',
'youhavenewmessagesmanyusers' => 'Maš $1 wot wjele wužiwarjow ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|nowa powěsć|nowej powěsći|nowe powěsće|nowe powěsće}}',
+'newmessageslinkplural' => '{{PLURAL:$1|nowu powěsć|nowej powěsći|nowe powěsće}}',
'newmessagesdifflinkplural' => '{{PLURAL:$1|poslednja změna|poslednjej změnje|poslednje změny|poslednje změny}}',
'youhavenewmessagesmulti' => 'Maš nowe powěsće: $1',
'editsection' => 'wobdźěłać',
'loginlanguagelabel' => 'Rěč: $1',
'suspicious-userlogout' => 'Twoje naprašowanje za wotzjewjenje bu wotpokazane, dokelž zda so, jako by so přez wobškodźeny wobhladowak abo pufrowacy proksy pósłało',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Njeznaty zmylk w PHP-funkciji mail()',
'user-mail-no-addy' => 'Je so spytało e-mejl bjez e-mejloweje adresy słać.',
'user-mail-no-body' => 'Je so spytało, e-mejl bjez teksta abo z překrótkim tekstom pósłać',
'prefs-displaywatchlist' => 'Zwobraznjenske opcije',
'prefs-diffs' => 'Rozdźěle',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Zda so, zo e-mejlowa adresa je płaćiwa',
'email-address-validity-invalid' => 'Zapodaj płaćiwu e-mejlowu adresu',
'disambiguationspage' => 'Template:Wjacezmyslnosć',
'disambiguations-text' => "Slědowace strony wobsahuja znajmjeńša jedyn wotkaz k stronje '''rozjasnjenja wjacezmyslnosće'''. Měli město toho na poprawnu stronu wotkazać.<br />Maja stronu za stronu rozjasnjenja wjacezmyslnosće, jeli předłohu wužiwa, na kotruž so wot [[MediaWiki:Disambiguationspage]] wotkazuje.",
+'pageswithprop' => 'Strony z kajkosću strony',
+'pageswithprop-text' => 'Tuta strona nalistuje strony, kotrež wěstu kajkosć strony wužiwaja.',
+'pageswithprop-prop' => 'Mjeno kajkosće:',
+
'doubleredirects' => 'Dwójne daleposrědkowanja',
'doubleredirectstext' => 'Tuta strona nalistuje strony, kotrež k druhim daleposrědkowanskim stronam dale posrědkuja.
Kóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž tež cil druheho daleposrědkowanja, kotryž je zwjetša "woprawdźita" cilowa strona, na kotruž prěnje daleposrědkowanje měło pokazać. <del>Přešmórnjene</del> zapiski su hižo sčinjene.',
'listgrouprights-addgroup-self-all' => 'Móže wšě skupiny swójskemu kontu přidać',
'listgrouprights-removegroup-self-all' => 'Móže wšě skupiny ze swójskeho konta wotstronić',
-# E-mail user
+# Email user
'mailnologin' => 'Njejsy přizjewjeny.',
'mailnologintext' => 'Dyrbiš [[Special:UserLogin|přizjewjeny]] być a płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] měć, zo by druhim wužiwarjam mejlki pósłać móhł.',
'emailuser' => 'Wužiwarjej mejlku pósłać',
'monthsall' => 'wšě',
'limitall' => 'wšě',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Emailowu adresu wobkrućić',
'confirmemail_noemail' => 'Njejsy płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] podał.',
'confirmemail_text' => 'Tutón wiki žada, zo swoju e-mejlowu adresu wobkrućiš, prjedy hač e-mejlowe funkcije wužiješ. Zaktiwuzij tłóčatko deleka, zo by swojej adresy wobkrućensku mejlku pósłał. Mejlka zapřijmje wotkaz, kotryž kod wobsahuje; wočiń wotkaz we swojim wobhladowaku, zo by wobkrućił, zo twoja e-mejlowa adresa je płaćiwa.',
Tute wobkrućenski kod spadnje $4.',
'confirmemail_body_set' => 'Něchtó, najskerje ty, wot IP-adresy $1,
-je e-mejlowu adresu konta "$2" na {{GRAMMAR:lokatiw|{{STENAME}}}} na tutu adresu stajił.
+je e-mejlowu adresu konta "$2" na {{GRAMMAR:lokatiw|{{SITENAME}}}} na tutu adresu stajił.
-Zo by wobkrućił, zo tute konto ći woprawdźe słuša a zo bychu so e-mejlowe funkcije na {{GRAMMAR:lokatiw|{{STENAME}}}} znowa aktiwizowali, wočiń tutón wotkaz w swojim wobhladowaku:
+Zo by wobkrućił, zo tute konto ći woprawdźe słuša a zo bychu so e-mejlowe funkcije na {{GRAMMAR:lokatiw|{{SITENAME}}}} znowa aktiwizowali, wočiń tutón wotkaz w swojim wobhladowaku:
$3
'duration-centuries' => '$1 {{PLURAL:$1|lětstotk|lětstotkaj|lětstotki|lětstotkow}}',
'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysacaj|lěttysacy|lěttysacow}}',
+# Unknown messages
+'pageswithprop-legend' => 'Strony z kajkosću strony',
+'pageswithprop-submit' => 'Wotpósłać',
);
'newwindow' => '(új ablakban nyílik meg)',
'cancel' => 'Mégse',
'moredotdotdot' => 'Tovább…',
+'morenotlisted' => 'Tovább…',
'mypage' => 'Lapom',
'mytalk' => 'Vitalap',
'anontalk' => 'Az IP-címhez tartozó vitalap',
'gotaccount' => "Ha már korábban regisztráltál, '''$1'''!",
'gotaccountlink' => 'Bejelentkezés',
'userlogin-resetlink' => 'Elfelejtetted a bejelentkezési adataidat?',
-'createaccountmail' => 'e-mailben',
+'createaccountmail' => 'Átmeneti, véletlenszerű jelszó használata és kiküldése az alábbi e-mail címre',
'createaccountreason' => 'Indoklás:',
'badretype' => 'A megadott jelszavak nem egyeznek.',
'userexists' => 'A megadott felhasználónév már foglalt.
'loginlanguagelabel' => 'Nyelv: $1',
'suspicious-userlogout' => 'A kijelentkezési kérésed vissza lett utasítva, mert úgy tűnik, hogy egy hibás böngésző vagy gyorsítótárazó proxy küldte.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Ismeretlen hiba a PHP mail() függvényében',
'user-mail-no-addy' => 'E-mail üzenetet próbáltál küldeni e-mail cím megadása nélkül.',
+'user-mail-no-body' => 'Üres vagy nagyon rövid email-t próbáltál küldeni.',
# Change password dialog
'resetpass' => 'Jelszó módosítása',
'''NE KÜLDJ BE JOGVÉDETT MUNKÁT ENGEDÉLY NÉLKÜL!'''",
'longpageerror' => "'''HIBA: Az általad beküldött szöveg {{PLURAL:$1|egy kilobájt|$1 kilobájt}} hosszú, ami több az engedélyezett {{PLURAL:$2|egy kilobájtnál|$2 kilobájtnál}}.
A szerkesztést nem lehet elmenteni.'''",
-'readonlywarning' => "'''FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet.
-A lap szöveget kimásolhatod egy szövegfájlba, amit elmenthetsz későbbre.'''
+'readonlywarning' => "FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet!
+A lap szövegét másold egy szövegfájlba, amit később felhasználhatsz!'''
Az adatbázist lezáró adminisztrátor az alábbi magyarázatot adta: $1",
'protectedpagewarning' => "'''Figyelem: Ez a lap le van védve, így csak adminisztrátori jogosultságokkal rendelkező szerkesztők módosíthatják.'''
'prefs-displaywatchlist' => 'Megjelenítési beállítások',
'prefs-diffs' => 'Eltérések (diffek)',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Az e-mail cím érvényesnek tűnik',
'email-address-validity-invalid' => 'Írj be egy érvényes e-mail címet',
# Special:ActiveUsers
'activeusers' => 'Aktív szerkesztők listája',
'activeusers-intro' => 'Ez a lap azon felhasználók listáját tartalmazza, akik csináltak valamilyen tevékenységet az elmúlt {{PLURAL:$1|egy|$1}} napban.',
-'activeusers-count' => '{{PLURAL:$1|egy|$1}} szerkesztés az utolsó {{PLURAL:$3|egy|$3}} napban',
+'activeusers-count' => '$1 szerkesztés az utolsó $3 napban',
'activeusers-from' => 'Szerkesztők listázása a következő névtől kezdve:',
'activeusers-hidebots' => 'Botok elrejtése',
'activeusers-hidesysops' => 'Adminisztrátorok elrejtése',
'listgrouprights-addgroup-self-all' => 'az összes csoportot hozzáadhatja a saját fiókjához',
'listgrouprights-removegroup-self-all' => 'az összes csoporból eltávolíthatja a saját fiókját',
-# E-mail user
+# Email user
'mailnologin' => 'Nincs feladó',
'mailnologintext' => 'Ahhoz hogy másoknak e-mailt küldhess, [[Special:UserLogin|be kell jelentkezned]] és meg kell adnod egy érvényes e-mail címet a [[Special:Preferences|beállításaidban]].',
'emailuser' => 'E-mail küldése ezen szerkesztőnek',
Neked kell biztosítanod, hogy a linkek továbbra is oda mutassanak, ahová mutatniuk kell.
A lap '''nem''' nevezhető át, ha már van egy ugyanilyen című lap, hacsak nem üres vagy átirányítás, és nincs laptörténete.
-Ez azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, és nem tudsz egy már létező lapot véletlenül felülírni.
+Ez azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, és nem tudsz létező lapot véletlenül felülírni.
'''FIGYELEM!'''
Népszerű oldalak esetén ez drasztikus és nem várt változtatás lehet;
-győződj meg a folytatás előtt arról, hogy tisztában vagy-e a következményekkel.",
+győződj meg a folytatás előtt arról, hogy tisztában vagy a következményekkel.",
'movepagetext-noredirectfixer' => "Az alábbi űrlap használatával nevezhetsz át egy lapot, és helyezheted át teljes laptörténetét az új nevére.
A régi cím az új címre való átirányítás lesz.
Ellenőrizd a [[Special:DoubleRedirects|dupla]] és a [[Special:BrokenRedirects|hibás átirányításoknál]], hogy a linkek továbbra is oda mutatnak, ahová mutatniuk kell.
'pageinfo-robot-noindex' => 'Nem indexelhető',
'pageinfo-views' => 'Megtekintések száma',
'pageinfo-watchers' => 'Figyelők száma',
+'pageinfo-few-watchers' => 'Kevesebb mint $1 szerkesztő figyeli',
'pageinfo-redirects-name' => 'Átirányítások erre a lapra',
'pageinfo-subpages-name' => 'Az lap allapjai',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|átirányítás}}; $3 {{PLURAL:$3|nem átirányítás}})',
'pageinfo-contentpage' => 'Tartalmi lapnak számít',
'pageinfo-contentpage-yes' => 'Igen',
'pageinfo-protect-cascading-yes' => 'Igen',
+'pageinfo-category-info' => 'Kategória információk',
'pageinfo-category-pages' => 'Lapok száma',
'pageinfo-category-subcats' => 'Alkategóriák száma',
'pageinfo-category-files' => 'Fájlok száma',
'monthsall' => 'mind',
'limitall' => 'mind',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'E-mail cím megerősítése',
'confirmemail_noemail' => 'Nincs érvényes e-mail cím megadva a [[Special:Preferences|beállításaidnál]].',
'confirmemail_text' => 'Meg kell erősítened az e-mail címed, mielőtt használhatnád a(z) {{SITENAME}} levelezési rendszerét. Nyomd meg az alsó gombot, hogy kaphass egy e-mailt, melyben megtalálod a megerősítéshez szükséges kódot. Töltsd be a kódot a böngésződbe, hogy aktiválhasd az e-mail címedet.',
'logentry-newusers-newusers' => '$1 felhasználói fiók létrehozva',
'logentry-newusers-create' => '$1 felhasználói fiók létrehozva',
'logentry-newusers-create2' => '$1 létrehozta $3 felhasználói fiókját',
+'logentry-newusers-byemail' => 'Szerkesztői lap $3 néven létrehozva $1 által, jelszó kiküldve emailben.',
'logentry-newusers-autocreate' => '$1 fiók automatikusan létrehozva',
-'logentry-rights-rights' => '$1 megváltoztatta $3 csoport tagságát erről: $4 erre: $5',
-'logentry-rights-rights-legacy' => '$1 megváltoztatta $3 csoport tagságát',
+'logentry-rights-rights' => '$1 megváltoztatta $3 csoporttagságát erről: $4 erre: $5',
+'logentry-rights-rights-legacy' => '$1 megváltoztatta $3 csoporttagságát',
'logentry-rights-autopromote' => '$1 automatikusan előléptetve erről: $4 erre: $5',
'rightsnone' => '(semmi)',
'api-error-ok-but-empty' => 'Belső hiba: nem érkezett válasz a kiszolgálótól.',
'api-error-overwrite' => 'Létező fájlok felülírására nem engedélyezett.',
'api-error-stashfailed' => 'Belső hiba: a kiszolgálünak nem sikerült eltárolni az ideiglenes fájlt.',
+'api-error-publishfailed' => 'Belső hiba: a kiszolgálónak nem sikerült közzétennie az ideiglenes fájlt.',
'api-error-timeout' => 'A kiszolgáló nem adott választ a várt időn belül.',
'api-error-unclassified' => 'Ismeretlen hiba történt',
'api-error-unknown-code' => 'Ismeretlen hiba: „$1”',
# Vector skin
'vector-action-addsection' => 'Ավելացնել քննարկում',
'vector-action-delete' => 'Ջնջել',
-'vector-action-move' => 'Õ\8eÕ¥Ö\80Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬',
+'vector-action-move' => 'Õ\8fÕ¥Õ²Õ¡Ö\83Õ¸ÕÕ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¨',
'vector-action-protect' => 'Պաշտպանել',
'vector-action-undelete' => 'Վերականգնել',
'vector-action-unprotect' => 'Հանել պաշտպանումից',
'categorypage' => 'Դիտել կատեգորիայի էջը',
'viewtalkpage' => 'Դիտել քննարկումը',
'otherlanguages' => 'Այլ լեզուներով',
-'redirectedfrom' => '(Վերահղված է $1-ից)',
+'redirectedfrom' => '(Վերահղված է $1ից)',
'redirectpagesub' => 'Վերահղման էջ',
'lastmodifiedat' => 'Այս էջը վերջին անգամ փոփոխվել է $2, $1։',
'viewcount' => 'Այս էջին դիմել են {{PLURAL:$1|մեկ անգամ|$1 անգամ}}։',
'pool-errorunknown' => 'Անհայտ սխալ',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => '{{grammar:genitive|{{SITENAME}}}}ի մասին',
+'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} մասին',
'aboutpage' => 'Project:Էությունը',
'copyright' => 'Կայքի բովանդակությունը գտնվում է «$1» արտոնագրի տակ։',
'copyrightpage' => '{{ns:project}}:Հեղինակային իրավունքներ',
'youhavenewmessagesmulti' => 'Դուք նոր ուղերձներ եք ստացել $1 վրա',
'editsection' => 'խմբագրել',
'editold' => 'խմբագրել',
-'viewsourceold' => 'Õ¤Õ«Õ¿Õ¥Õ¬ Õ¥Õ¬Õ¡Õ¿Õ¥Ö\84Õ½Õ¿ը',
+'viewsourceold' => 'Õ¤Õ«Õ¿Õ¥Õ¬ Õ¾Õ«Ö\84Õ«Õ¯Õ¸Õ¤Õ¥Ö\80ը',
'editlink' => 'խմբագրել',
'viewsourcelink' => 'դիտել ելատեքստը',
'editsectionhint' => 'Խմբագրել բաժինը. $1',
'missingarticle-diff' => '(Տարբ. $1, $2)',
'readonly_lag' => 'Տվյալների բազան ավտոմատիկ կողպվել է ժամանակավորապես՝ մինչև ՏԲ-ի երկրորդական սերվերը չհամաժամանակեցվի առաջնայինի հետ։',
'internalerror' => 'Ներքին սխալ',
-'internalerror_info' => 'Ներքին սխալ. $1',
+'internalerror_info' => 'Ներքին սխալ՝ $1',
'fileappenderror' => 'Չհաջողվեց ավելացնել «$1» «$2»-ին։',
'filecopyerror' => 'Չհաջողվեց պատճենել «$1» նիշքը «$2» նիշքի մեջ։',
'filerenameerror' => 'Չհաջողվեց «$1» նիշքը վերանվանել «$2»։',
'perfcachedts' => 'Հետևյալ տվյալները վերցված են քեշից և վերջին անգամ թարմացվել են $1։ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Այս էջի փոփոխությունները ներկայումս արգելված են։ Այստեղի տվյալները այժմ չեն թարմացվի։',
'wrong_wfQuery_params' => 'Անթույլատրելի պարամետրեր wfQuery() ֆունկցիայի համար<br />
-Ֆունկցիա. $1<br />
-Հայցում. $2',
-'viewsource' => 'Ô´Õ«Õ¿Õ¥Õ¬ Õ¥Õ¬Õ¡Õ¿Õ¥Ö\84Õ½Õ¿ը',
+Ֆունկցիա՝ $1<br />
+Հայցում՝ $2',
+'viewsource' => 'Ô´Õ«Õ¿Õ¥Õ¬ Õ¾Õ«Ö\84Õ«Õ¯Õ¸Õ¤Õ¥Ö\80ը',
'viewsource-title' => 'Դիտել $1 էջի աղբյուրը',
'actionthrottled' => 'Գործողությունը արգելափակվեց',
'actionthrottledtext' => 'Որպես հակա-սպամային միջոց, այս գործողության չափից շատ կատարումը կարճ ժամանակահատվածի ընթացքում սահմանափակված է։ Խնդրում ենք փորձել կրկին մի քանի րոպե անց։',
'viewsourcetext' => 'Դուք կարող եք դիտել և պատճենել այս էջի ելատեքստը.',
'viewyourtext' => 'Դուք կարող եք դիտել «ձեր ներդրումների» աղբյուրը և պատճենել այս էջ',
'protectedinterface' => 'Այս էջը պարունակում է ծրագրային ապահովման ինտերֆեյսի ուզերձ և կողպված է չարաշահումների կանխարգելման նպատակով։.',
-'editinginterface' => "'''Զգուշացում.''' Դուք խմբագրում եք ծրագրային ապահովման ինտերֆեյսի տեքստ պարունակող էջ։ Այս էջի փոփոխությունը կանդրադառնա այլ մասնակիցներին տեսանելի ինտերֆեյսի տեսքի վրա։
-Թարգմանությունների համար նախընտրելի է օգտագործել [//translatewiki.net/wiki/Main_Page?setlang=hy translatewiki.net]՝ MediaWiki ծրագրի տեղայնացման նախագիծը։",
+'editinginterface' => "'''Զգուշացում՝''' Դուք խմբագրում եք ծրագրային ապահովման ինտերֆեյսի տեքստ պարունակող էջ։ Այս էջի փոփոխությունը կանդրադառնա այլ մասնակիցներին տեսանելի ինտերֆեյսի տեսքի վրա։
+Թարգմանությունների համար նախընտրելի է օգտագործել [//translatewiki.net/wiki/Main_Page?setlang=hy translatewiki.net]՝ Մեդիավիքի ծրագրի տեղայնացման նախագիծը։",
'sqlhidden' => '(SQL հայցումը թաքցված է)',
'cascadeprotected' => 'Այս էջը պաշտպանված է խմբագրումից, քանի որ ընդգրկված է հետևյալ {{PLURAL:$1|էջի|էջերի}} տեքստում, {{PLURAL:$1|որը|որոնք}} պաշտպանվել {{PLURAL:$1|է|են}} կասկադային հնարավորությամբ.
$2',
# Virus scanner
'virus-badscanner' => "Սխալ կարգավորւմ։ Անծանոթ վիրուսների զննիչ. ''$1''",
'virus-scanfailed' => 'զննման սխալ (կոդ $1)',
-'virus-unknownscanner' => 'անծանոթ հակավիրուս.',
+'virus-unknownscanner' => 'անծանոթ հակավիրուս՝',
# Login and logout pages
'logouttext' => "'''Դուք դուրս եկաք համակարգից։'''
'welcomeuser' => 'Բարի գալո՜ւստ, $1',
'welcomecreation-msg' => 'Ձեր հաշիվն ստեղծված է։
Չմոռանաք փոփոխել ձեր [[Special:Preferences|նախընտրությունները]]։',
-'yourname' => 'Մասնակցի անուն.',
-'yourpassword' => 'Գաղտնաբառ.',
-'yourpasswordagain' => 'Կրկնեք գաղտնաբառը.',
+'yourname' => 'Մասնակցի անուն՝',
+'yourpassword' => 'Գաղտնաբառ՝',
+'yourpasswordagain' => 'Կրկնեք գաղտնաբառը',
'remembermypassword' => 'Հիշել իմ մուտքագրված տվյալները այս համակարգչում ($1 {{PLURAL:$1|օրից|օրից}} ոչ ավել ժամկետով)',
-'yourdomainname' => 'Ձեր դոմենը.',
+'yourdomainname' => 'Ձեր դոմենը՝',
'password-change-forbidden' => 'Այս վիքիում չեք կարող փոխել գաղտնաբառ։',
'externaldberror' => 'Տեղի է ունեցել վավերացման արտաքին տվյալների բազայի սխալ, կամ դուք չունեք բավարար իրավունքներ ձեր արտաքին հաշվի փոփոխման համար։',
'login' => 'Մտնել համակարգ',
'gotaccountlink' => 'Մուտք գործեք համակարգ',
'userlogin-resetlink' => 'Մոռացե՞լ եք Ձեր լոգին տվյալները։',
'createaccountmail' => 'էլ-փոստով',
-'createaccountreason' => 'Պատճառ.',
+'createaccountreason' => 'Պատճառը՝',
'badretype' => 'Ձեր մուտքագրած գաղտնաբառերը չեն համընկնում։',
'userexists' => 'Այս մասնակցի անունը արդեն զբաղված է։ Խնդրում ենք ընտրել մեկ այլ անուն։',
'loginerror' => 'Մուտքի սխալ',
'eauthentsent' => 'Նոր էլ-հասցեին ուղարկվել է վավերացման նամակ։
Հետևե՛ք նամակի ցուցումներին՝ հաստատելու համար, որ այդ հասցեն ձեզ է պատկանում։ Մինչ այդ նոր հասցեին այլ նամակներ չեն կարող ուղարկվել։',
'throttled-mailpassword' => 'Գաղտնաբառի հիշեցման ուղերձ արդեն ուղարկվել է վերջին {{PLURAL:$1|ժամվա|$1 ժամվա}} ընթացքում։ Չարաշահման կանխարգելման նպատակով թույլատրվում է միայն մեկ գաղտնաբառի հիշեցում ամեն {{PLURAL:$1|ժամվա|$1 ժամվա}} ընթացքում։',
-'mailerror' => 'Փոստի ուղարկման սխալ. $1',
+'mailerror' => 'Փոստի ուղարկման սխալ՝ $1',
'acct_creation_throttle_hit' => 'Վերջին օրվա ընթացքում ձեր IP-հասցեից ստեղծվել է {{PLURAL:$1|1 մասնակցի հաշվիվ|$1 մասնակցի հաշվիվ}}, ինչը այս ժամանակաշրջանում առավելագույն թույլատրելի քանակն է։
Այս պատճառով այդ IP-հասցեից այցելուները չեն կարող այլևս հաշիվ ստեղծել այս պահին։',
'emailauthenticated' => 'Ձեր էլ-փոստի հասցեն վավերացվել է $2, $3-ին։',
'usernamehasherror' => 'Մասնակցի անունը չի կարող պարունակել «#» նիշը։',
'login-throttled' => 'Դուք կատարել եք չափից շատ մուտքի փորձ։
Խնդրում ենք սպասել որոշ ժամանակ կրկին փորձելուց առաջ։',
-'loginlanguagelabel' => 'Լեզու $1',
+'loginlanguagelabel' => 'Լեզու՝ $1',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Անհայտ սխալ PHP-ի mail() ֆունկցիայում',
'user-mail-no-addy' => 'Փորձվեց ուղարկել էլ․ նամակ առանց էլ․ հասցեի։',
'passwordreset-text' => 'Լրացրեք ձևը՝ էլ-փոստով ձեր տվյալների մասին հիշեցում ստանալու համար։',
'passwordreset-legend' => 'Վերականգնել գաղտնաբառը',
'passwordreset-disabled' => 'Գաղտնաբառի վերականգնումը այս վիքիում թույլատրված չէ։',
-'passwordreset-username' => 'Մասնակցի անուն.',
+'passwordreset-username' => 'Մասնակցի անուն՝',
'passwordreset-email' => 'Էլ-փոստի հասցեն՝',
-'passwordreset-emailelement' => 'Մասնակցային անուն. $1
-Ժամանակավոր գաղտնաբառ. $2',
+'passwordreset-emailelement' => 'Մասնակցային անունը՝ $1
+Ժամանակավոր գաղտնաբառը՝ $2',
'passwordreset-emailsent' => 'Ուղարկվեց հիշեցնող էլ․ նամակ։',
'passwordreset-emailsent-capture' => 'Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։',
'passwordreset-emailerror-capture' => 'Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։ Սակայն մասնակցին ուղարկելը չհաջողվեց․',
'changeemail-oldemail' => 'Ներկա էլ․ հասցե․',
'changeemail-newemail' => 'Նոր էլ․ հասցե․',
'changeemail-none' => '(ոչ մի)',
+'changeemail-password' => 'Քո {{SITENAME}} գաղտնաբառը՝',
'changeemail-submit' => 'Փոխել էլ․ հասցեն',
'changeemail-cancel' => 'Չեղարկել',
'''Եթե սա բարեխիղճ խմբագրման փորձ է, խնդրում ենք փորձել կրկին։ Սխալի կրկնման դեպքում՝ փորձեք [[Special:UserLogout|դուրս գալ]], ապա կրկին մտնել համակարգ։'''",
'token_suffix_mismatch' => "'''Ձեր խմբագրումը մերժվել է, քանի որ ձեր օգտագործած ծրագիրը աղավաղել է կետադրության նշանները խմբագրման դաշտում։ Խմբագրումը մերժվել է էջի տեքստի խաթարումը կանխելու նպատակով։ Սա երբեմն պայմանավորված է սխալներ պարունակող անանվանեցնող վեբ-փոխարինորդ (proxy) ծառայության օգտագործմամբ։'''",
-'editing' => 'Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´ $1',
-'creating' => 'Õ\8dÕ¿Õ¥Õ²Õ®Õ¸Ö\82Õ´ $1',
-'editingsection' => 'Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ\9d $1 (Õ¢Õ¡ÕªÕ«Õ¶)',
-'editingcomment' => 'Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ\9d $1 (Õ¶Õ¸Ö\80 Õ¢Õ¡ÕªÕ«Õ¶)',
+'editing' => 'Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¾Õ¸Ö\82Õ´ Õ§Õ\9d $1 Õ§Õ»Õ¨',
+'creating' => 'Õ\8dÕ¿Õ¥Õ²Õ®Õ¾Õ¸Ö\82Õ´ Õ§Õ\9d $1 Õ§Õ»Õ¨',
+'editingsection' => 'Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¾Õ¸Ö\82Õ´ Õ§Õ\9d $1 Õ§Õ»Õ« (Õ¢Õ¡ÕªÕ«Õ¶Õ¨)',
+'editingcomment' => 'Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¾Õ¸Ö\82Õ´ Õ§Õ\9d $1 Õ§Õ»Õ« (Õ¶Õ¸Ö\80 Õ¢Õ¡ÕªÕ«Õ¶Õ¨)',
'editconflict' => 'Խմբագրման ընդհարում. $1',
'explainconflict' => "Մեկ այլ մասնակից փոփոխել է այս տեքստը ձեր խմբագրման ընթացքում։
Վերին խմբագրման դաշտում ընդգրկված է ընթացիկ տեքստը, որն ենթակա է հիշման։
'templatesused' => 'Այս էջում օգտագործված {{PLURAL:$1|կաղապարը|կաղապարները}}.',
'templatesusedpreview' => 'Այս նախադիտման մեջ օգտագործված {{PLURAL:$1|կաղապարը|կաղապարները}}.',
'templatesusedsection' => 'Այս բաժնում օգտագործված {{PLURAL:$1|կաղապարը|կաղապարները}}.',
-'template-protected' => '(պաշտպանված)',
-'template-semiprotected' => '(կիսապաշտպանված)',
+'template-protected' => '(պաշտպանված է)',
+'template-semiprotected' => '(կիսա-պաշտպանված է)',
'hiddencategories' => 'Այս էջը պատկանում է հետևյալ {{PLURAL:$1|1 թաքնված կատեգորիային|$1 թաքնված կատեգորիաներին}}.',
'edittools' => '<!-- Այստեղ տեղադրված տեքստը կցուցադրվի խմբագրման և բեռնման ձևերի տակ։ -->
<div id="Հատուկ նիշ:" class="toccolours specialchars" style="margin-top:.5em; padding: .3em .5em; font-size: 100%; color:#aaa; text-align:left;" title="{{int:bw-edittools-tooltip}}">
'edit-no-change' => 'Ձեր խմբագրումը անտեսվել է, քանի որ ոչ մի փոփոխություն չի կատարվել տեքստի մեջ։',
'defaultmessagetext' => 'Լռելյան տեքստը',
+# Content models
+'content-model-wikitext' => 'վիքիտեքստ',
+'content-model-javascript' => 'ՋավաՍկրիպտ',
+
# "Undo" feature
'undo-success' => 'Խմբագրումը կարող է հետ շրջվել։ Ստուգեք տարբերակների համեմատությունը ստորև, որպեսզի համոզվեք, որ դա է ձեզ հետաքրքրող փոփոխությունը և մատնահարեք «Հիշել էջը»՝ գործողությունն ավարտելու համար։',
'undo-failure' => 'Խմբագրումը չի կարող հետ շրջվել միջանկյալ խմբագրումների ընդհարման պատճառով։',
-'undo-summary' => 'Հետ է շրջվում $1 խմբագրումը, որի հեղինակն է՝ [[Special:Contributions/$2|$2]] ([[User talk:$2|քննարկում]])',
+'undo-summary' => 'Հետ է շրջվում $1 խմբագրումը, որի հեղինակն է՝ [[Special:Contributions/$2|$2]] ([[User talk:$2|քննարկում]]) {{GENDER:$2|մասնակիցը|մասնակցուհին}}',
# Account creation failure
'cantcreateaccounttitle' => 'Չհաջողվեց ստեղծել մասնակցային հաշիվ',
'histfirst' => 'Առաջին',
'histlast' => 'Վերջին',
'historysize' => '({{PLURAL:$1|1 բայթ|$1 բայթ}})',
-'historyempty' => '(դատարկ)',
+'historyempty' => '(դատարկ է)',
# Revision feed
'history-feed-title' => 'Փոփոխությունների պատմություն',
'prefs-emailconfirm-label' => 'Էլ-փոստի վավերացում․',
'prefs-textboxsize' => 'Խմբագրման պատուհանի չափը',
'youremail' => 'Էլեկտրոնային փոստ.',
-'username' => 'Մասնակցի անուն.',
+'username' => '{{GENDER:$1|Մասնակցի անուն}}՝',
'uid' => 'Մասնակցի իդենտիֆիկատոր.',
'prefs-memberingroups' => 'Անդամակցության {{PLURAL:$1|խումբ|խմբեր}}.',
'prefs-registration' => 'Գրանցման ամսաթիվը․',
'prefs-displaywatchlist' => 'Ցուցադրման ընտրանքներ',
'prefs-diffs' => 'Տարբերություններ',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Էլ. հասցեն վավերական է',
'email-address-validity-invalid' => 'Մուտքագրեք վավերական էլ. հասցե',
'editinguser' => '<b>$1</b> մասնակցի համար ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])',
'userrights-editusergroup' => 'Խմբագրել մասնակցի խմբերը',
'saveusergroups' => 'Հիշել մասնակցի խմբերը',
-'userrights-groupsmember' => 'Անդամ է.',
+'userrights-groupsmember' => 'Անդամ է՝ $2-ին',
'userrights-reason' => 'Պատճառ.',
'userrights-changeable-col' => 'Խմբեր, որոնք դուք կարող եք ձևափոխել',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'խմբագրել այս էջը',
'action-createpage' => 'Ստեղծել էջ',
+'action-move-rootuserpages' => 'տեղափոխել մասնակցի էջի արմատը',
+'action-movefile' => 'տեղափոխել այս ֆայլը',
'action-upload' => 'Բեռնել այս ֆայլը',
'action-upload_by_url' => 'Բեռնել այս ֆայլը URL-ից',
'action-delete' => 'Ջնջել այս էջը',
'uploadvirus' => 'Նիշքը պարունակում է վիրո՜ւս։ Տես $1',
'upload-source' => 'Աղբյուրը ֆայլի',
'sourcefilename' => 'Սկզբնական նիշք՝',
+'sourceurl' => 'Այդ Տեղի URL-ն՝',
'destfilename' => 'Նիշքի նոր անվանում՝',
'upload-description' => 'Ֆայլի մեկնաբանություն',
'upload-options' => 'Բեռնման ընտրանքներ',
'filewasdeleted' => 'Այս անվանմամբ նիշք նախկինում բեռնվել է և հետագայում ջնջվել։ Այն կրկին բեռնելուց առաջ խնդրում ենք ստուգել $1։',
'filename-bad-prefix' => "Բեռնվող նիշքի անվանումը սկսվում է '''<tt>«$1»</tt>''' արտահայտությամբ, որը ոչ-նկարագրական է և սովորաբար տրվում է թվային լուսանկարչական ապարատների կողմից։ Խնդրում ենք ընտրել ավելի նկարագրական անվանում ձեր նիշքի համար։",
'upload-success-subj' => 'Բեռնումը կատարված է',
+'upload-failure-subj' => 'Ներբեռնման սխալ',
+'upload-warning-subj' => 'Ներբեռնման զգուշացում',
'upload-proto-error' => 'Սխալ պրոտոկոլ',
'upload-proto-error-text' => 'Հեռավոր բեռնումը պահանջում է URL-հասցե, որը սկսվում է <code>http://</code> կամ <code>ftp://</code> նախածանցով։',
'upload-file-error-text' => 'Տեղի ունեցավ ներքին սխալ՝ սերվերի վրա ժամանակավոր նիշք ստեղծելիս։ Խնդրում ենք կապվել համակարգային [[Special:ListUsers/sysop|ադմինիստրատորի]] հետ։',
'upload-misc-error' => 'Բեռնման անհայտ սխալ',
'upload-misc-error-text' => 'Տեղի ունեցավ անհայտ սխալ բեռնման ընթացքում։ Խնդրում ենք ստուգել URL-հասցեի ճշտությունն ու հասանելիությունը և փորձել կրկին։ Սխալի կրկնման դեպքում կապնվեք համակարգային ադմինիստրատորի հետ։',
+'upload-unknown-size' => 'Անհնար չափս',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URL-հասցեն անհասանելի է',
'filepage-nofile' => 'Այս անունով նիշք գոյություն չունի։',
'filepage-nofile-link' => 'Այս անունով նիշք գոյություն չունի, դուք կարող եք [$1 բեռնել այն]:',
'uploadnewversion-linktext' => 'Բեռնել այս նիշքի նոր տարբերակ',
+'shared-repo-from' => '$1-ից',
# File reversion
-'filerevert' => 'Հետ շրջել $1',
-'filerevert-legend' => 'Հետ շրջել նիշք',
+'filerevert' => 'Հետ շրջել $1-ը',
+'filerevert-legend' => 'Հետ շրջել նիշքը',
'filerevert-intro' => "Դուք հետ եք շրջում '''[[Media:$1|$1]]''' նիշքը [$4 տարբերակի՝ $3, $2 պահով]։",
'filerevert-comment' => 'Մեկնաբանություն.',
'filerevert-defaultcomment' => 'Հետ է շրջվում հին տարբերակին՝ $2, $1 պահով',
Փոխարենը նրանք, հավանաբար, պետք է հղեն համապատասխան թեմային։<br />
Էջը համարվում է երկիմաստության փարատման էջ, եթե այն պարունակում է [[MediaWiki:Disambiguationspage]] էջում ընդգրկված կաղապարներից որևէ մեկը։',
+'pageswithprop-submit' => 'Անցնել',
+
'doubleredirects' => 'Կրկնակի վերահղումներ',
'doubleredirectstext' => 'Այս էջում բերված են վերահղման էջերին վերահղող էջերը։ Յուրաքանչյուր տող պարունակում է հղումներ դեպի առաջին և երկրորդ վերահղումները, ինչպես նաև երկրորդ վերահղման նպատակային էջի առաջին տողը, որում սովորաբար նշված է էջի անվանումը, որին պետք է հղի նաև առաջին վերահղումը։',
'double-redirect-fixed-move' => '«[[$1]]» էջը վերանվանված է և այժմ վերահղում է «[[$2]]» էջին։',
'ncategories' => '$1 {{PLURAL:$1|կատեգորիա|կատեգորիաներ}}',
'ninterwikis' => '$1 {{PLURAL:$1|ինտերվիքի|ինտերվիքիներ}}',
'nlinks' => '$1 {{PLURAL:$1|հղում|հղումներ}}',
-'nmembers' => '$1 {{PLURAL:$1|անդամ|անդամ}}',
+'nmembers' => '$1 {{PLURAL:$1|անդամ|անդամներ}}',
'nrevisions' => '$1 {{PLURAL:$1|տարբերակ|տարբերակներ}}',
'nviews' => '$1 {{PLURAL:$1|դիտում|դիտումներ}}',
'nimagelinks' => 'օգտագործվում է $1 {{PLURAL:$1|էջ|էջեր}}',
'protectedpagesempty' => 'Ներկայումս չկան պաշտպանված էջեր նշված պարամետրերով։',
'protectedtitles' => 'Պաշտպանված անվանումներ',
'listusers' => 'Մասնակիցների ցանկ',
+'usereditcount' => '
+$1 {{PLURAL:$1|խմբագրում|խմբագրումներ}}',
+'usercreated' => '{{GENDER:$3|Ստեղծվել է}} $1-ին, ժամը $2-ին',
'newpages' => 'Նոր էջեր',
'newpages-username' => 'Մասնակից՝',
'ancientpages' => 'Ամենահին էջերը',
# Special:LinkSearch
'linksearch' => 'Արտաքին հղումներ',
'linksearch-ok' => 'Որոնել',
+'linksearch-line' => '
+$1-ը հղվել է $2 ից',
# Special:ListUsers
'listusersfrom' => 'Ցուցադրել մասնակիցներին՝ սկսած.',
# Special:ActiveUsers
'activeusers' => 'Ակտիվ մասնակիցների ցանկ',
+'activeusers-noresult' => 'Այդպիսի մասնակիցներ չեն գտնվել։',
# Special:ListGroupRights
'listgrouprights-members' => '(անդամների ցանկ)',
+'listgrouprights-addgroup' => 'Ավելացնեել {{PLURAL:$2|խումբ|խմբեր}}՝ $1',
-# E-mail user
+# Email user
'mailnologin' => 'Ուղարկման հասցե չկա',
'mailnologintext' => 'Անհրաժեշտ է [[Special:UserLogin|մտնել համակարգ]] և ունենալ գործող էլ-փոստի հասցե ձեր [[Special:Preferences|նախընտրություններում]]՝ ուրիշ մասնակիցներին էլեկտրոնային նամակներ ուղարկելու համար։',
'emailuser' => 'էլ-նամակ ուղարկել այս մասնակցին',
'noemailtitle' => 'Չկա էլ-փոստի հասցե',
'noemailtext' => 'Այս մասնակիցը չի նշել էլ-փոստի հասցե կամ նախընտրել է չստանալ էլ-նամակներ այլ մասնակիցներից։',
'emailusername' => 'Մասնակցի անուն՝',
+'emailusernamesubmit' => 'Հաշվել',
'email-legend' => 'Ուղարկել էլ․ նամակ {{SITENAME}}յի այլ մասնակցի',
-'emailfrom' => 'Ումից.',
+'emailfrom' => 'Ումից',
'emailto' => 'Ում.',
'emailsubject' => 'Թեմա.',
'emailmessage' => 'Ուղերձ.',
# Watchlist
'watchlist' => 'Իմ հսկողության ցանկը',
'mywatchlist' => 'Հսկացանկ',
+'watchlistfor2' => '$1 $2-ի համար',
'nowatchlist' => 'Ձեր հսկողության ցանկը դատարկ է։',
'watchlistanontext' => 'Անհրաժեշտ է $1՝ հսկացանկը դիտելու կամ խմբագրելու համար։',
'watchnologin' => 'Չեք մտել համակարգ',
'enotif_mailer' => '{{grammar:genitive|{{SITENAME}}}} Տեղեկացման ծառայություն',
'enotif_reset' => 'Նշել բոլոր էջերը այցելված',
'enotif_impersonal_salutation' => '{{grammar:genitive|{{SITENAME}}}} մասնակից',
+'enotif_subject_deleted' => '{{SITENAME}} էջը $1 {{GENDER:$2|ջնջվել է}} $2-ի կողմից',
+'enotif_subject_created' => '{{SITENAME}} էջը $1 {{GENDER:$2|ստեղծվել է}} $2-ի կողմից',
+'enotif_subject_moved' => '{{SITENAME}} էջը $1 {{GENDER:$2|վերահղվել է}} $2-ի կողմից',
+'enotif_body_intro_created' => '{{SITENAME}} էջը $1 {{GENDER:$2|ստեղծվել է}} ժամը $PAGEEDITDATE-ին $2-ի կողմից, նայիր $3 ընդացիկ տարբերակը:',
'enotif_lastvisited' => 'Տես $1՝ ձեր վերջին այցից ի վեր կատարված փոփոխությունների համար։',
'enotif_lastdiff' => 'Տես $1՝ այս փոփոխությունը դիտելու համար։',
'enotif_anon_editor' => 'անանուն մասնակից $1',
# Restrictions (nouns)
'restriction-edit' => 'Խմբագրում',
-'restriction-move' => 'Õ\8fÕ¥Õ²Õ¡Ö\83Õ¸ÕÕ¸Ö\82Õ´',
+'restriction-move' => 'Õ\8fÕ¥Õ²Õ¡Ö\83Õ¸ÕÕ¥Õ¬',
'restriction-create' => 'Ստեղծում',
-'restriction-upload' => 'Ô²Õ¥Õ¼Õ¶Õ¸Ö\82Õ´',
+'restriction-upload' => 'Ô²Õ¥Õ¼Õ¶Õ¥Õ¬',
# Restriction levels
'restriction-level-sysop' => 'լրիվ պաշտպանված',
'blanknamespace' => '(Գլխավոր)',
# Contributions
-'contributions' => 'Մասնակցի ներդրում',
+'contributions' => ' {{GENDER:$1|Մասնակցի}} ներդրում',
'contributions-title' => '$1 մասնակցի ներդրումը',
'mycontris' => 'Ներդրում',
'contribsub2' => '$1-ի ներդրումները ($2)',
Այսպիսի դեպքերում հարկավոր է տեղափոխել կամ միաձուլել էջերը ձեռքով, եթե դա ցանկանաք։",
'movearticle' => 'Տեղափոխել էջը',
+'moveuserpage-warning' => "'''Զգուշացո՜ւմ՝ '''You are about to move a user page. Please note that only the page will be moved and the user will ''not'' be renamed.",
'movenologin' => 'Դուք չեք մտել համակարգ',
'movenologintext' => 'Անհրաժեշտ է [[Special:UserLogin|մտնել համակարգ]]՝ էջը տեղափոխելու համար։',
'movenotallowed' => 'Դուք չունեք էջերի տեղափոխման իրավունք։',
'importhistoryconflict' => 'Գոյություն ունեցող տարբերակների ընդհարում (հավանաբար այս էջն արդեն ներմուծվել է նախկինում)',
'importnosources' => 'Միջվիքի ներմուծման աղբյուր ընտրված չէ, իսկ փոփոխումների պատմության ուղիղ ներմուծումը անջատված է։',
'importnofile' => 'Ներմուծման նիշք չի բեռնվել։',
+'import-upload' => 'Բեռնված է XML-ի դատան',
# Import log
'importlogpage' => 'Ներմուծման տեղեկամատյան',
'tooltip-ca-protect' => 'Պաշտպանել այս էջը',
'tooltip-ca-delete' => 'Ջնջել այս էջը',
'tooltip-ca-undelete' => 'Վերականգնել այս էջի խմբագրումները՝ կատարված ջնջումից առաջ',
-'tooltip-ca-move' => 'Õ\8eÕ¥Ö\80Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬ էջը',
+'tooltip-ca-move' => 'Õ\8fÕ¥Õ²Õ¡Ö\83Õ¸ÕÕ¥Õ¬ Õ¡ÕµÕ½ էջը',
'tooltip-ca-watch' => 'Ավելացնել այս էջը ձեր հսկողության ցանկին',
'tooltip-ca-unwatch' => 'Հանել այս էջը ձեր հսկողության ցանկից',
'tooltip-search' => 'Որոնել {{SITENAME}} կայքում',
'tooltip-search-go' => 'Անցնել այս ճշգրիտ անվանումով էջին',
'tooltip-search-fulltext' => 'Գտնել այս տեքստով էջերը',
-'tooltip-p-logo' => 'Ô³Õ¬ÕÕ¡Õ¾Õ¸Ö\80 Õ§Õ»',
+'tooltip-p-logo' => 'Ô±ÕµÖ\81Õ¥Õ¬Õ¥Ö\84 Ô³Õ¬ÕÕ¡Õ¾Õ¸Ö\80 Ô·Õ»Õ¨',
'tooltip-n-mainpage' => 'Այցելեք Գլխավոր Էջը',
'tooltip-n-mainpage-description' => 'Անցնել գլխավոր էջ',
'tooltip-n-portal' => 'Նախագծի մասին, որտեղ գտնել ինչը, ինչով կարող եք օգնել',
'skinname-myskin' => 'ԻմՏեսք',
'skinname-chick' => 'Ծիտ',
'skinname-simple' => 'Պարզ',
+'skinname-modern' => 'Մոդերն',
+'skinname-vector' => 'Սովորական',
# Patrolling
'markaspatrolleddiff' => 'Նշել որպես ստուգված',
'mediawarning' => "'''Զգուշացում'''. այս նիշքի տեսակը կարող է պարունակել վնասակար ծրագրային կոդ։ Այն կիրարկելը կարող է վտանգել ձեր համակարգը։",
'imagemaxsize' => 'Պատկերի էջում պատկերի չափի սահմանափակում.',
'thumbsize' => 'Պատկերների փոքրացված չափ.',
+'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, $3 էջեր',
'file-info' => 'նիշքի չափ՝ $1, MIME-տեսակ՝ $2',
'file-info-size' => '$1 × $2 փիքսել, նիշքի չափը՝ $3, MIME-տեսակը՝ $4',
'exif-componentsconfiguration-0' => 'գոյություն չունի',
+'exif-urgency-normal' => 'Նորմալ ($1)',
+'exif-urgency-low' => 'Թույլ ($1)',
+'exif-urgency-high' => 'Ուժեղ ($1)',
+
# External editor support
'edit-externally' => 'Խմբագրել այս նիշքը արտաքին խմբագրիչով',
'edit-externally-help' => '(Մանրամասնությունների համար տես [//www.mediawiki.org/wiki/Manual:External_editors տեղակայման հրահանգները])',
'monthsall' => 'բոլոր',
'limitall' => 'բոլոր',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Էլ-հասցեի վավերացում',
'confirmemail_noemail' => 'Դուք չեք նշել գործող էլ-հասցե ձեր [[Special:Preferences|նախընտրություններում]]։',
'confirmemail_text' => 'Այս վիքիում անհրաժեշտ է վավերացնել էլ-հասցեն մինչև էլ-փոստի վրա հիմնված հնարավորությունների օգտագործելը։ Մատնահարեք ստորև կոճակին՝ ձեր հասցեին վավերացման նամակ ուղարկելու համար։ Ուղերձում կգտնեք վավերացման կոդով հղում, որին հետևելով կվավերացնեք ձեր էլ-հասցեն։',
'dberr-problems' => 'Այս կայքում առաջացել են տեխնիկական խնդիրներ։ Հայցում ենք ձեր ներողությունը։',
'dberr-again' => 'Փորձեք մի քանի րոպե սպասել և վերաբեռնել էջը։',
+# HTML forms
+'htmlform-submit' => '
+Հաշվել',
+
# New logging system
'logentry-delete-delete' => '$1 ջնջեց էջը $3',
'logentry-delete-restore' => '$1 վերականգնեց էջը $3',
'tog-previewonfirst' => 'Monstrar previsualisation al prime modification',
'tog-nocache' => "Disactivar le ''cache'' de paginas in le navigator",
'tog-enotifwatchlistpages' => 'Notificar me per e-mail quando un pagina o file in mi observatorio es modificate',
-'tog-enotifusertalkpages' => 'Notificar me via e-mail quando mi pagina de discussion es modificate',
+'tog-enotifusertalkpages' => 'Notificar me per e-mail quando mi pagina de discussion es modificate',
'tog-enotifminoredits' => 'Notificar me etiam de modificationes minor de paginas e files',
'tog-enotifrevealaddr' => 'Revelar mi adresse de e-mail in messages de notification',
'tog-shownumberswatching' => 'Monstrar le numero de usatores que observa le pagina',
'passwordsent' => 'Un nove contrasigno ha essite inviate al adresse de e-mail registrate pro "$1".
Per favor aperi session de novo post reciper lo.',
'blocked-mailpassword' => 'Tu adresse IP es blocate de facer modificationes, e pro impedir le abuso, le uso del function pro recuperar contrasignos es equalmente blocate.',
-'eauthentsent' => 'Un e-mail de confirmation ha essite inviate al adresse de e-mail nominate.
-Ante que alcun altere e-mail se invia al conto, tu debera sequer le instructiones in le e-mail, pro confirmar que le conto es de facto tue.',
+'eauthentsent' => 'Un e-mail de confirmation ha essite inviate al adresse de e-mail specificate.
+Pro poter reciper altere e-mail a iste conto, tu debe sequer le instructiones in iste e-mail pro confirmar que le conto es realmente tue.',
'throttled-mailpassword' => 'Un rememoration del contrasigno ha jam essite inviate intra le ultime {{PLURAL:$1|hora|$1 horas}}.
Pro prevenir le abuso, solmente un rememoration de contrasigno essera inviate per {{PLURAL:$1|hora|$1 horas}}.',
'mailerror' => 'Error de inviar e-mail: $1',
'acct_creation_throttle_hit' => 'Le visitatores de iste wiki usante tu adresse IP ha create {{PLURAL:$1|1 conto|$1 contos}} durante le ultime die, e isto es le maximo permittite in iste periodo de tempore.
A causa de isto, le visitatores usante iste adresse IP non pote crear nove contos al momento.',
-'emailauthenticated' => 'Tu adresse de e-mail esseva authentificate le $2 a $3.',
-'emailnotauthenticated' => 'Tu adresse de e-mail non ha essite authentificate ancora.
-Nos non inviara e-mail pro alcun del sequente functiones.',
+'emailauthenticated' => 'Tu adresse de e-mail ha essite confirmate le $2 a $3.',
+'emailnotauthenticated' => 'Tu non ha ancora confirmate tu adresse de e-mail.
+Nulle e-mail essera inviate pro le sequente functiones.',
'noemailprefs' => 'Es necessari specificar un adresse de e-mail in tu preferentias pro poter executar iste functiones.',
'emailconfirmlink' => 'Confirmar tu adresse de e-mail',
'invalidemailaddress' => 'Le adresse de e-mail ha un formato invalide e non pote esser acceptate.
'loginlanguagelabel' => 'Lingua: $1',
'suspicious-userlogout' => 'Le requesta de clauder le session ha essite refusate proque illo pare haber essite inviate per un navigator o proxy de cache defectuose.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Error incognite in le function mail() de PHP',
'user-mail-no-addy' => 'Tentava inviar e-mail sin adresse de e-mail.',
'user-mail-no-body' => 'Tentava inviar e-mail con texto vacue o multo curte.',
'search-interwiki-default' => 'Resultatos de $1:',
'search-interwiki-more' => '(plus)',
'search-relatedarticle' => 'Connexe',
-'mwsuggest-disable' => 'Disactivar suggestiones via AJAX',
+'mwsuggest-disable' => 'Disactivar suggestiones de recerca',
'searcheverything-enable' => 'Cercar in tote le spatios de nomines',
'searchrelated' => 'connexe',
'searchall' => 'totes',
'prefs-misc' => 'Misc',
'prefs-resetpass' => 'Cambiar contrasigno',
'prefs-changeemail' => 'Cambiar e-mail',
-'prefs-setemail' => 'Definir un adresse de e-mail',
+'prefs-setemail' => 'Specificar un adresse de e-mail',
'prefs-email' => 'Optiones de e-mail',
'prefs-rendering' => 'Apparentia',
'saveprefs' => 'Confirmar',
Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contributiones.',
'prefs-help-email' => 'Le adresse de e-mail es optional, ma es necessari pro le reinitialisation de tu contrasigno, in caso que tu lo oblida.',
'prefs-help-email-others' => 'Tu pote etiam optar pro permitter que altere personas te contacta via tu pagina de usator o de discussion, sin necessitate de revelar tu identitate.',
-'prefs-help-email-required' => 'Le adresse de e-mail es requirite.',
+'prefs-help-email-required' => 'Un adresse de e-mail es obligatori.',
'prefs-info' => 'Informationes de base',
'prefs-i18n' => 'Internationalisation',
'prefs-signature' => 'Signatura',
'prefs-displaywatchlist' => 'Optiones de presentation',
'prefs-diffs' => 'Differentias',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Sembla valide',
'email-address-validity-invalid' => 'Un adresse valide es obligatori!',
Istes debe forsan ligar directemente al articulo sur le thema in question.<br />
Un pagina se tracta como pagina de disambiguation si illo usa un patrono que es ligate ab [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Paginas con un proprietate de pagina',
+'pageswithprop-legend' => 'Paginas con un proprietate de pagina',
+'pageswithprop-text' => 'Iste pagina lista le paginas que usa un certe proprietate de pagina.',
+'pageswithprop-prop' => 'Nomine del proprietate:',
+'pageswithprop-submit' => 'Va',
+
'doubleredirects' => 'Redirectiones duple',
'doubleredirectstext' => 'Iste pagina lista paginas de redirection verso altere paginas de redirection.
Cata linea contine ligamines al prime e al secunde redirection, con le destination del secunde redirection. Iste es normalmente le "ver" pagina de destination, al qual le prime redirection tamben deberea punctar.
'listgrouprights-addgroup-self-all' => 'Pote adder tote le gruppos al proprie conto',
'listgrouprights-removegroup-self-all' => 'Pote remover tote le gruppos del proprie conto',
-# E-mail user
+# Email user
'mailnologin' => 'Necun adresse de invio',
'mailnologintext' => 'Tu debe [[Special:UserLogin|aperir un session]]
e haber un adresse de e-mail valide in tu [[Special:Preferences|preferentias]]
'enotif_subject_moved' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|renominate}} per $2',
'enotif_subject_restored' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|restaurate}} per $2',
'enotif_subject_changed' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|modificate}} per $2',
+'enotif_body_intro_deleted' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|delite}} le $PAGEEDITDATE per $2, vide $3.',
+'enotif_body_intro_created' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|create}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_moved' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|renominate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_restored' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|restaurate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_changed' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|modificate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
'enotif_lastvisited' => 'Vide $1 pro tote le modificationes depost tu ultime visita.',
'enotif_lastdiff' => 'Vide $1 pro revider iste modification.',
'enotif_anon_editor' => 'usator anonyme $1',
'enotif_body' => 'Car $WATCHINGUSERNAME,
-
-Le pagina de {{SITENAME}} titulate $PAGETITLE ha essite $CHANGEDORCREATED le $PAGEEDITDATE per $PAGEEDITOR. Vide $PAGETITLE_URL pro le version actual.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Summario del redactor: $PAGESUMMARY $PAGEMINOREDIT
Pro contactar le redactor:
-e-mail: $PAGEEDITOR_EMAIL
+mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Si tu non visita iste pagina, tu non recipera altere notificationes in caso de modificationes ulterior.
-Como alternativa tu pote reinitialisar le optiones de notification pro tote le paginas in tu observatorio.
+Tu non recipera altere notificationes de activitate si tu non visita iste pagina. Tu pote anque reinitialisar le optiones de notification pro tote le paginas in tu observatorio.
- Le systema de notification de {{SITENAME}}, a tu servicio
+Le systema de notification de {{SITENAME}}, a tu servicio
--
Pro configurar le notification per e-mail, visita
'prot_1movedto2' => 'displaciava [[$1]] verso [[$2]]',
'protect-badnamespace-title' => 'Spatio de nomines non protegibile',
'protect-badnamespace-text' => 'Le paginas in iste spatio de nomines non pote esser protegite.',
+'protect-norestrictiontypes-text' => 'Iste pagina non pote esser protegite perque il non ha alcun typo de restriction disponibile.',
+'protect-norestrictiontypes-title' => 'Pagina non protegibile',
'protect-legend' => 'Confirmar protection',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Expiration:',
'move-page' => 'Renominar $1',
'move-page-legend' => 'Renominar pagina',
'movepagetext' => "Per medio del formulario hic infra tu pote renominar un pagina, transferente tote su historia al nove nomine.
-Le titulo anterior devenira un pagina de redirection verso le nove titulo.
+Le ancian titulo devenira un pagina de redirection verso le nove titulo.
Tu pote actualisar automaticamente le redirectiones que puncta verso le titulo original.
Si tu prefere non facer isto, non oblida de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].
Tu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.
Isto pote esser un cambio drastic e inexpectate pro un pagina popular;
per favor assecura te de haber comprendite le consequentias de isto ante de continuar.",
'movepagetext-noredirectfixer' => "Per medio del formulario infra tu pote renominar un pagina, transferente tote su historia al nove nomine.
-Le titulo anterior devenira un pagina de redirection verso le nove titulo.
-Assecura te de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].
+Le ancian titulo devenira un pagina de redirection verso le nove titulo.
+Non oblida de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].
Tu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.
-Nota que le pagina '''non''' essera renominate si existe ja un pagina sub le nove titulo, salvo si illo es vacue o un redirection e non ha un historia de modificationes passate.
-Isto vole dicer que tu pote renominar un pagina retro a su titulo original si tu ha committite un error, ben que tu non pote superscriber un pagina existente.
+Nota que le pagina '''non''' essera renominate si existe jam un pagina sub le nove titulo, excepte si iste es un redirection sin historia de modificationes passate.
+Isto te lassa le possibilitate de restaurar le titulo original de un pagina si tu ha committite un error, sin permitter te de supplantar un pagina existente.
'''Attention!'''
Isto pote esser un cambio drastic e inexpectate pro un pagina popular;
'import-error-interwiki' => 'Le pagina "$1" non es importate perque su nomine es reservate pro ligation externe (interwiki).',
'import-error-special' => 'Le pagina "$1" non es importate perque illo pertine a un spatio de nomines special que non permitte paginas.',
'import-error-invalid' => 'Le pagina "$1" non es importate perque su nomine es invalide.',
+'import-error-unserialize' => 'Le version $2 del pagina "$1" non pote esser disserialisate. Il ha essite reportate que iste version usa le modello de contento $3 serialisate como $4.',
'import-options-wrong' => 'Mal {{PLURAL:$2|option|optiones}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Le pagina radice specificate es un titulo invalide.',
'import-rootpage-nosubpage' => 'Le spatio de nomines "$1" del pagina radice non permitte subpaginas.',
'pageinfo-robot-noindex' => 'Non indexabile',
'pageinfo-views' => 'Numero de visitas',
'pageinfo-watchers' => 'Numero de observatores del pagina',
+'pageinfo-few-watchers' => 'Minus de $1 {{PLURAL:$1|observator|observatores}}',
'pageinfo-redirects-name' => 'Redirectiones verso iste pagina',
'pageinfo-subpages-name' => 'Subpaginas de iste pagina',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirection|redirectiones}}; $3 {{PLURAL:$3|non-redirection|non-redirectiones}})',
'pageinfo-magic-words' => '{{PLURAL:$1|Parola|Parolas}} magic ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria|Categorias}} celate ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Patrono|Patronos}} transcludite ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pagina|Paginas}} in que iste pagina es transcludite ($1)',
'pageinfo-toolboxlink' => 'Information sur le pagina',
'pageinfo-redirectsto' => 'Redirige a',
'pageinfo-redirectsto-info' => 'info',
'pageinfo-protect-cascading' => 'Protection in cascada a partir de hic',
'pageinfo-protect-cascading-yes' => 'Si',
'pageinfo-protect-cascading-from' => 'Protection in cascada a partir de',
+'pageinfo-category-info' => 'Information de categoria',
+'pageinfo-category-pages' => 'Numero de paginas',
+'pageinfo-category-subcats' => 'Numero de subcategorias',
+'pageinfo-category-files' => 'Numero de files',
# Skin names
'skinname-standard' => 'Classic',
'file-nohires' => 'Non disponibile in resolution plus alte.',
'svg-long-desc' => 'File SVG, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
'svg-long-desc-animated' => 'File SVG animate, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
+'svg-long-error' => 'File SVG invalide: $1',
'show-big-image' => 'Plen resolution',
'show-big-image-preview' => ' Dimension de iste previsualisation: $1.',
'show-big-image-other' => 'Altere {{PLURAL:$2|resolution|resolutiones}}: $1.',
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
'days' => '{{PLURAL:$1|$1 die|$1 dies}}',
+'months' => '{{PLURAL:$1|$1 mense|$1 menses}}',
+'years' => '{{PLURAL:$1|$1 anno|$1 annos}}',
'ago' => '$1 retro',
'just-now' => 'Justo nunc',
'monthsall' => 'totes',
'limitall' => 'totes',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Confirmar adresse de e-mail',
'confirmemail_noemail' => 'Tu non ha configurate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]].',
'confirmemail_text' => '{{SITENAME}} require que tu valida tu adresse de e-mail ante que tu usa functiones involvente e-mail.
Activa le button infra pro inviar un message de confirmation a tu adresse.
Le message includera un ligamine continente un codice;
visita le ligamine in tu navigator pro confirmar que tu adresse de e-mail es valide.',
-'confirmemail_pending' => 'Un codice de confirmation ha ja essite inviate a te;
-si tu ha recentemente create tu conto, es recommendate attender le arrivata de illo durante alcun minutas ante de provar requestar un nove codice.',
+'confirmemail_pending' => 'Un codice de confirmation ha jam essite inviate a te per e-mail;
+si tu ha create tu conto recentemente, per favor attende alcun minutas que le message de confirmation arriva ante de requestar un nove codice.',
'confirmemail_send' => 'Inviar un codice de confirmation',
'confirmemail_sent' => 'Message de confirmation inviate.',
'confirmemail_oncreate' => 'Un codice de confirmation ha essite inviate a tu adresse de e-mail.
'confirmemail_error' => 'Un problema occurreva durante le salveguarda de tu confirmation.',
'confirmemail_subject' => 'Confirmation del adresse de e-mail pro {{SITENAME}}',
'confirmemail_body' => 'Un persona, probabilemente tu, usante le adresse IP $1,
-ha registrate un conto "$2" con iste adresse de e-mail in {{SITENAME}}.
+ha create un conto "$2" con iste adresse de e-mail in {{SITENAME}}.
-Pro confirmar que iste conto es de facto tue, e pro activar le functiones
+Pro confirmar que iste conto es realmente tue, e pro activar le functiones
de e-mail in {{SITENAME}}, visita iste ligamine in tu navigator:
$3
-Si tu *non* ha registrate le conto, seque iste ligamine
+Si tu *non* ha create iste conto, seque le sequente ligamine
pro cancellar le confirmation del adresse de e-mail:
$5
'confirmemail_body_changed' => 'Un persona, probabilemente tu, usante le adresse IP $1,
ha cambiate le adresse de e-mail del conto "$2" a iste adresse in {{SITENAME}}.
-Pro confirmar que iste conto es de facto tue, e pro reactivar le functiones
+Pro confirmar que iste conto es realmente tue, e pro reactivar le functiones
de e-mail in {{SITENAME}}, visita iste ligamine in tu navigator:
$3
'confirmemail_body_set' => 'Un persona, probabilemente tu, usante le adresse IP $1,
ha specificate que iste adresse de e-mail pertine al conto "$2" in {{SITENAME}}.
-Pro confirmar que iste conto es de facto tue, e pro reactivar le functiones
+Pro confirmar que iste conto es realmente tue, e pro activar le functiones
de e-mail in {{SITENAME}}, visita iste ligamine in tu navigator:
$3
'specialpages-group-highuse' => 'Paginas multo usate',
'specialpages-group-pages' => 'Listas de paginas',
'specialpages-group-pagetools' => 'Instrumentos pro paginas',
-'specialpages-group-wiki' => 'Datos e instrumentos pro Wiki',
+'specialpages-group-wiki' => 'Datos e instrumentos',
'specialpages-group-redirects' => 'Redirection de paginas special',
'specialpages-group-spam' => 'Instrumentos antispam',
'logentry-newusers-newusers' => 'Le conto de usator $1 ha essite create',
'logentry-newusers-create' => 'Le conto de usator $1 ha essite create',
'logentry-newusers-create2' => 'Le conto de usator $3 ha essite create per $1',
+'logentry-newusers-byemail' => 'Le conto de usator $3 ha essite create per $1 e le contrasigno ha essite inviate per e-mail',
'logentry-newusers-autocreate' => 'Le conto $1 ha essite create automaticamente',
'logentry-rights-rights' => '$1 cambiava le appertinentia a gruppos pro $3 de $4 a $5',
'logentry-rights-rights-legacy' => '$1 cambiava le appertinentia a gruppos pro $3',
'api-error-ok-but-empty' => 'Error interne: nulle responsa del servitor.',
'api-error-overwrite' => 'Superscriber un file existente non es permittite.',
'api-error-stashfailed' => 'Error interne: le servitor non poteva immagazinar le file temporari.',
+'api-error-publishfailed' => 'Error interne: le servitor non poteva publicar le file temporari.',
'api-error-timeout' => 'Le servitor non ha respondite intra le tempore expectate.',
'api-error-unclassified' => 'Un error incognite ha occurrite.',
'api-error-unknown-code' => 'Error incognite: "$1"',
'duration-centuries' => '$1 {{PLURAL:$1|seculo|seculos}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennio|millennios}}',
+# Image rotation
+'rotate-comment' => 'Imagine rotate de $1 {{PLURAL:$1|grado|grados}} in senso horologic',
+
);
'loginlanguagelabel' => 'Bahasa: $1',
'suspicious-userlogout' => 'Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
'user-mail-no-addy' => 'Mencoba mengirimkan surel tanpa alamat surel.',
'user-mail-no-body' => 'Mencoba untuk mengirim surel kosong atau terlalu pendek.',
'converter-manual-rule-error' => 'Kesalahan terdeteksi di aturan manual konversi bahasa',
# "Undo" feature
-'undo-success' => 'Suntingan ini dapat dibatalkan. Tolong cek perbandingan di bawah untuk meyakinkan bahwa benar itu yang Anda ingin lakukan, lalu simpan perubahan tersebut untuk menyelesaikan pembatalan suntingan.',
-'undo-failure' => 'Suntingan ini tidak dapat dibatalkan karena konflik penyuntingan antara.',
-'undo-norev' => 'Suntingan ini tidak dapat dibatalkan karena halaman tidak ditemukan atau telah dihapuskan.',
-'undo-summary' => 'Membatalkan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]])',
+'undo-success' => 'Suntingan ini dapat dibalikkan. Silakan periksa perbandingan di bawah untuk meyakinkan bahwa benar itu yang Anda ingin lakukan, lalu simpan perubahan tersebut untuk menyelesaikan pembalikkan suntingan.',
+'undo-failure' => 'Suntingan ini tidak dapat dibalikkan karena konflik penyuntingan antara.',
+'undo-norev' => 'Suntingan ini tidak dapat dibalikkan karena halaman tidak ditemukan atau telah dihapuskan.',
+'undo-summary' => 'Membalikkan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]])',
# Account creation failure
'cantcreateaccounttitle' => 'Akun tak dapat dibuat',
'lineno' => 'Baris $1:',
'compareselectedversions' => 'Bandingkan versi terpilih',
'showhideselectedversions' => 'Tampilkan/sembunyikan versi terpilih',
-'editundo' => 'batalkan',
+'editundo' => 'balikkan',
'diff-multi' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)',
'diff-multi-manyusers' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh lebih dari $2 {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)',
'difference-missing-revision' => '{{PLURAL:$2|Satu revisi|$2 revisi}} dari perbedaan ini ($1) {{PLURAL:$2|tidak|tidak}} ditemukan.
'prefs-displaywatchlist' => 'Pilihan tampilan',
'prefs-diffs' => 'Beda',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Alamat surel tampaknya sah',
'email-address-validity-invalid' => 'Masukkan alamat surel yang sah',
'filehist-help' => 'Klik pada tanggal/waktu untuk melihat berkas ini pada saat tersebut.',
'filehist-deleteall' => 'hapus semua',
'filehist-deleteone' => 'hapus',
-'filehist-revert' => 'kembalikan',
+'filehist-revert' => 'batalkan',
'filehist-current' => 'terkini',
'filehist-datetime' => 'Tanggal/Waktu',
'filehist-thumb' => 'Miniatur',
'upload-disallowed-here' => 'Anda tidak bisa menimpa berkas ini.',
# File reversion
-'filerevert' => 'Kembalikan $1',
-'filerevert-legend' => 'Kembalikan berkas',
-'filerevert-intro' => "Anda mengembalikan '''[[Media:$1|$1]]''' ke versi [$4 pada $3, $2].",
+'filerevert' => 'Batalkan $1',
+'filerevert-legend' => 'Batalkan berkas',
+'filerevert-intro' => "Anda membatalkan '''[[Media:$1|$1]]''' ke versi [$4 pada $3, $2].",
'filerevert-comment' => 'Alasan:',
-'filerevert-defaultcomment' => 'Dikembalikan ke versi pada $2, $1',
-'filerevert-submit' => 'Kembalikan',
-'filerevert-success' => "'''[[Media:$1|$1]]''' telah dikembalikan ke versi [$4 pada $3, $2]",
+'filerevert-defaultcomment' => 'Dibatalkan ke versi pada $2, $1',
+'filerevert-submit' => 'Batalkan',
+'filerevert-success' => "'''[[Media:$1|$1]]''' telah dibatalkan ke versi [$4 pada $3, $2]",
'filerevert-badversion' => 'Tidak ada versi lokal terdahulu dari berkas ini dengan stempel waktu yang dimaksud.',
# File deletion
Halaman-halaman tersebut seharusnya berpaut ke topik-topik yang sesuai.<br />
Suatu halaman dianggap sebagai halaman disambiguasi apabila halaman tersebut menggunakan templat yang terhubung ke [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Halaman dengan halaman properti',
+'pageswithprop-legend' => 'Halaman dengan halaman properti',
+'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
+'pageswithprop-prop' => 'Nama properti:',
+'pageswithprop-submit' => 'Pergi',
+
'doubleredirects' => 'Pengalihan ganda',
'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
Setiap baris memuat pranala ke pengalihan pertama dan pengalihan kedua serta target dari pengalihan kedua yang umumnya adalah halaman yang "sebenarnya". Halaman peralihan pertama seharusnya dialihkan ke halaman yang bukan merupakan halaman peralihan.
'listgrouprights-addgroup-self-all' => 'Dapat menambahkan semua grup ke akun sendiri',
'listgrouprights-removegroup-self-all' => 'Menghapus semua kelompok dari akun sendiri',
-# E-mail user
+# Email user
'mailnologin' => 'Tidak ada alamat surel',
'mailnologintext' => 'Anda harus [[Special:UserLogin|masuk log]] dan mempunyai alamat surel yang sah di dalam [[Special:Preferences|preferensi]] untuk mengirimkan surel kepada pengguna lain.',
'emailuser' => 'Surel pengguna',
'dellogpage' => 'Log penghapusan',
'dellogpagetext' => 'Di bawah ini adalah log penghapusan halaman. Semua waktu yang ditunjukkan adalah waktu server.',
'deletionlog' => 'log penghapusan',
-'reverted' => 'Dikembalikan ke revisi sebelumnya',
+'reverted' => 'Dibatalkan ke revisi sebelumnya',
'deletecomment' => 'Alasan:',
'deleteotherreason' => 'Alasan lain/tambahan:',
'deletereasonotherlist' => 'Alasan lain',
'rollbacklinkcount' => 'kembalikan $1 {{PLURAL:$1|suntingan|suntingan}}',
'rollbacklinkcount-morethan' => 'kembalikan lebih dari $1 {{PLURAL:$1|suntingan|suntingan}}',
'rollbackfailed' => 'Pengembalian gagal dilakukan',
-'cantrollback' => 'Tidak dapat mengembalikan suntingan;
+'cantrollback' => 'Tidak dapat membatalkan suntingan;
kontributor terakhir adalah satu-satunya penulis halaman ini.',
'alreadyrolled' => 'Tidak dapat melakukan pengembalian ke revisi terakhir [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|bicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
pengguna lain telah menyunting atau melakukan pengembalian terhadap halaman ini.
Suntingan terakhir dilakukan oleh [[User:$3|$3]] ([[User talk:$3|bicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
'editcomment' => "Komentar penyuntingan adalah: \"''\$1''\".",
-'revertpage' => '←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dikembalikan ke versi terakhir oleh [[User:$1|$1]]',
+'revertpage' => '←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]',
'revertpage-nouser' => 'Pengembalian suntingan oleh (pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]',
-'rollback-success' => 'Pengembalian suntingan oleh $1; dikembalikan ke versi terakhir oleh $2.',
+'rollback-success' => 'Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.',
# Edit tokens
'sessionfailure-title' => 'Kegagalan sesi',
Judul lama akan menjadi halaman pengalihan ke judul baru.
Anda dapat memperbarui pengalihan yang menuju ke judul asli secara otomatis.
Jika Anda memilih tidak, pastikan untuk memeriksa
-[[Special:DoubleRedirects|double]] atau [[Special:BrokenRedirects|broken redirects]].
+[[Special:DoubleRedirects|pengalihan ganda]] atau [[Special:BrokenRedirects|pengalihan rusak]].
Anda bertanggung jawab untuk memastikan bahwa pranala terhubung ke tempat seharusnya.
Perhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman pada judul yang baru, kecuali bila halaman peralihan dan tidak mempunyai sejarah penyuntingan.
'movesubpagetext' => 'Halaman ini memiliki $1 {{PLURAL:$1|subhalaman|subhalaman}} seperti ditampilkan berikut.',
'movenosubpage' => 'Halaman ini tak memiliki subhalaman.',
'movereason' => 'Alasan:',
-'revertmove' => 'kembalikan',
+'revertmove' => 'batalkan',
'delete_and_move' => 'Hapus dan pindahkan',
'delete_and_move_text' => '==Penghapusan diperlukan==
Halaman yang dituju, "[[:$1]]", telah mempunyai isi. Apakah Anda hendak menghapusnya untuk memberikan ruang bagi pemindahan?',
'tooltip-watchlistedit-raw-submit' => 'Perbarui daftar pantauan',
'tooltip-recreate' => 'Buat ulang halaman walaupun sebenarnya telah dihapus',
'tooltip-upload' => 'Mulai pemuatan',
-'tooltip-rollback' => 'Mengembalikan suntingan-suntingan di halaman ini ke kontributor terakhir dalam satu kali klik.',
-'tooltip-undo' => 'Mengembalikan revisi ini dan membuka kotak penyuntingan dengan mode pratayang. Alasan dapat ditambahkan di kotak ringkasan.',
+'tooltip-rollback' => '"Kembalikan" membatalkan suntingan-suntingan di halaman ini ke kontributor terakhir dalam satu kali klik.',
+'tooltip-undo' => '"Balikkan" membatalkan revisi ini dan membuka kotak penyuntingan dengan mode pratayang. Alasan dapat ditambahkan di kotak ringkasan.',
'tooltip-preferences-save' => 'Simpan preferensi',
'tooltip-summary' => 'Masukkan sebuah ringkasan pendek',
Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hitam.',
'spamprotectionmatch' => 'Teks berikut ini memancing filter spam kami: $1',
'spambot_username' => 'Pembersihan span MediaWiki',
-'spam_reverting' => 'Mengembalikan ke versi terakhir yang tak memiliki pranala ke $1',
+'spam_reverting' => 'Membatalkan ke versi terakhir yang tak memiliki pranala ke $1',
'spam_blanking' => 'Semua revisi yang memiliki pranala ke $1, pengosongan',
'spam_deleting' => 'Semua revisi yang memiliki pranala ke $1, penghapusan',
'pageinfo-robot-noindex' => 'Tidak dapat diindeks',
'pageinfo-views' => 'Jumlah penampilan',
'pageinfo-watchers' => 'Jumlah pemantau halaman',
+'pageinfo-few-watchers' => 'Kurang dari $1 {{PLURAL:$1|pengunjung}}',
'pageinfo-redirects-name' => 'Pengalihan ke halaman ini',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Subhalaman halaman ini',
'monthsall' => 'semua',
'limitall' => 'semua',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Konfirmasi alamat surel',
'confirmemail_noemail' => 'Anda tidak memberikan alamat surel yang sah di [[Special:Preferences|preferensi pengguna]] Anda.',
'confirmemail_text' => '{{SITENAME}} mengharuskan Anda untuk melakukan konfirmasi atas alamat surel Anda sebelum fitur-fitur surel dapat digunakan.
'htmlform-int-toohigh' => 'Nilai yang Anda masukkan melebihi nilai maksimum $1',
'htmlform-required' => 'Nilai ini diperlukan',
'htmlform-submit' => 'Kirim',
-'htmlform-reset' => 'Batalkan perubahan',
+'htmlform-reset' => 'Balikkan perubahan',
'htmlform-selectorother-other' => 'Lain-lain',
# SQLite database support
'duration-centuries' => '{{PLURAL:$1||}}$1 abad',
'duration-millennia' => '{{PLURAL:$1||}}$1 milenium',
+# Image rotation
+'rotate-comment' => 'Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam',
+
);
'category-empty' => "''Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.''",
'hidden-categories' => '{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}',
'hidden-category-category' => 'Nailemmeng a katkategoria',
-'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad nga {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}, manipud ti dagup nga $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad a subkategoria.|Daytoy a kategoria ket adda ti sumaganad {{PLURAL:$1|a subkategoria|$1 a dagiti subkategoria}}, manipud ti dagup nga $2.}}',
'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}.',
'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti dagup nga $2.}}',
'category-article-count-limited' => 'Ti sumaganad {{PLURAL:$1|a panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
'newwindow' => '(aglukat iti sabali a tawa)',
'cancel' => 'Ukasen',
'moredotdotdot' => 'Adu pay...',
+'morenotlisted' => 'Adu a saan a nailista...',
'mypage' => 'Panid',
'mytalk' => 'Tungtungan',
'anontalk' => 'Tungtungan para iti daytoy a pagtaengan ti IP',
'gotaccount' => "Addaanka kadin ti pakabilangam? '''$1'''.",
'gotaccountlink' => 'Sumrek',
'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrek mo?',
-'createaccountmail' => 'Babaen ti e-surat',
+'createaccountmail' => 'Agusar ti maysa a temporario a pugto a kontrasenias ken ipatulod idiay e-surat a pagtaengan a nainganan dita baba',
'createaccountreason' => 'Rason:',
'badretype' => 'Saan nga agpada dagiti impanmo a kontrasenias.',
'userexists' => 'Maus-usaren ti nagan a kayatmo.
'loginlanguagelabel' => 'Pagsasao: $1',
'suspicious-userlogout' => 'Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod ti nadadael a "panagbasabasa" wenno "caching proxy".',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Di am-ammo a biddut iti surat ti PHP () a pamay-an.',
'user-mail-no-addy' => 'Pinadas nga impatulod ti e-surat nga awan ti e-surat a pagtaengan.',
+'user-mail-no-body' => 'Nangpadaska a nangipatulod ti e-surat nga awan linaonna wenno ababa laeng a bagi.',
# Change password dialog
'resetpass' => 'Sukatan ti kontrasenias',
'changeemail-oldemail' => 'Agdama nga E-surat a pagtaengam:',
'changeemail-newemail' => 'Baro nga e-surat a pagtaengan:',
'changeemail-none' => '(awan)',
+'changeemail-password' => 'Ti bukodmo a kontrasenias ti {{SITENAME}}:',
'changeemail-submit' => 'Sukatan ti e-surat',
'changeemail-cancel' => 'Ukasen',
'search-interwiki-default' => '$1 dagiti nagbanagan:',
'search-interwiki-more' => '(adu pay)',
'search-relatedarticle' => 'Mainaig',
-'mwsuggest-disable' => 'Pagsardengen dagiti AJAX a naisingasing',
+'mwsuggest-disable' => 'Ibaldado dagiti singasing ti panagbiruk',
'searcheverything-enable' => 'Agbirukka kadagiti amin a nagan ti lugar',
'searchrelated' => 'mainaig',
'searchall' => 'amin',
'prefs-emailconfirm-label' => 'Pagsingkedan ti e-surat:',
'prefs-textboxsize' => 'Ti kadakkel ti pagurnosan a tawa',
'youremail' => 'E-surat:',
-'username' => 'Nagan ti agar-aramat:',
-'uid' => 'ID ti agar-aramat:',
-'prefs-memberingroups' => 'Kameng {{PLURAL:$1|ti grupo|dagiti grupo}}:',
+'username' => '{{GENDER:$1|Nagan ti agar-aramat}}:',
+'uid' => 'ID ti {{GENDER:$1|Agar-aramat}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Kameng}} ti {{PLURAL:$1|a grupo|a grupgrupo}}:',
'prefs-registration' => 'Oras a nagrehistro:',
'yourrealname' => 'Pudno a nagan:',
'yourlanguage' => 'Pagsasao:',
'prefs-displaywatchlist' => 'Ipakita dagiti pagpilian',
'prefs-diffs' => 'Sabali',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Ti e-surat a pagtaengan ket kasla umiso',
'email-address-validity-invalid' => 'Ikabil ti umiso nga e-surat a pagtaengan',
Dagitoy ket embes a nasken a maisilpoda kadagiti maitutop a panid.<br />
Ti panid ket matrato a kas panangilawlawag a panid no agusar ti plantilia a nakasilpo manipud idiay [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pampanid nga adda maysa a tagikua ti panid',
+'pageswithprop-legend' => 'Pampanid nga adda maysa a tagikua ti panid',
+'pageswithprop-text' => 'Daytoy a panid ket ilistana ti pampanid nga agus-usar ti naisangayan a tagikua ti panid.',
+'pageswithprop-prop' => 'Nagan ti tagikua:',
+'pageswithprop-submit' => 'Inkan',
+
'doubleredirects' => 'Dagiti namindua a naibaw-ing',
'doubleredirectstext' => 'Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.
Iti tunggal maysa nga aray ket adda nagyanna kadagiti panilpo iti umuna ken maikadua a baw-ing, ken iti puntaan iti maikadua a baw-ing, nga isu ti "pudno" a puntaan ti panid, nga ti umuna a baw-ing ket isu ti ipatudona.
'linksearch-ok' => 'Biruken',
'linksearch-text' => 'Ti naataap a tarheta a kas ti "*.wikipedia.org" ket mabalin nga usaren.
Masapul ti kangatuan a pagturayan, a kaspagarigan "*.org".<br />
-{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: <code>$1</code> (naipakasigud ti http:// no awan ti protokol a nainaganan).',
+{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: <code>$1</code> (naipakasigud ti http:// no awan ti protokol a nainaganan).',
'linksearch-line' => 'Ti $1 ket nakasilpo idiay $2',
'linksearch-error' => 'Ti naatap a tarheta ket agparang laeng iti pinagrugi ti nagan ti agsangaili.',
'listgrouprights-addgroup-self-all' => 'Inayon amin dagiti bunggoy ti bukodmo a pakabilangan',
'listgrouprights-removegroup-self-all' => 'Ikkatem amin dagiti bunggoy ti bukod a pakabilangan',
-# E-mail user
+# Email user
'mailnologin' => 'Awan ti pagipatulodan a pagtaengan',
'mailnologintext' => 'Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga e-surat a pagtaengan idiay [[Special:Preferences|kaykayatmo]] ti agipatulod ti e-surat kadagiti sabsabali nga agar-aramat.',
'emailuser' => 'E-suratan daytoy nga agar-aramat',
'enotif_subject_moved' => 'Ti {{SITENAME}} panid ti $1 ket naiyalis idin babaen ni {{gender:$2|$2}}',
'enotif_subject_restored' => 'Ti {{SITENAME}} a panid ti $1 ket naipasubli idin babaen ni {{gender:$2|$2}}',
'enotif_subject_changed' => 'Ti {{SITENAME}} a panid ti $1 ket nasukatan idin babaen ni {{gender:$2|$2}}',
-'enotif_body_intro_deleted' => 'Ti {{SITENAME}} a panid ti $1 ket naikkat idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_deleted' => 'Ti {{SITENAME}} a panid tie $1 ket {{GENDER:$2|naikkaten}} idiay $PAGEEDITDATE babaen ni $2, kitaen ti $3.',
'enotif_body_intro_created' => 'Ti {{SITENAME}} a panid ti $1 ket napartuat idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
'enotif_body_intro_moved' => 'Ti {{SITENAME}} a panid ti $1 ket naiyalis idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
'enotif_body_intro_restored' => 'Ti {{SITENAME}} a panid ti $1 ket naipasubli idi idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
'prot_1movedto2' => '[[$1]] naiyalis iti [[$2]]',
'protect-badnamespace-title' => 'Saan a mabalin a salakniban a nagan ti lugar',
'protect-badnamespace-text' => 'Dagiti panid ditoy a nagan ti lugar ket saan a mabalin a masalakniban.',
+'protect-norestrictiontypes-text' => 'Daytoy a panid ket saan a mabalin a masalakniban gaputa awan dagiti maiparit a kita a magun-od.',
+'protect-norestrictiontypes-title' => 'Di masalakniban a panid',
'protect-legend' => 'Pasingkedan ti panagsalaknib',
'protectcomment' => 'Rason:',
'protectexpiry' => 'Agpaso:',
No agpilika a saanmo a kayat, pasaraduam a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].
Renbbengmo ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.
-Laglagipen a ti panid ket '''saan''' a maiyalis no addan sigud a panid iti baro a titulo, malaksid no daytoy ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos.
+Laglagipen a ti panid ket '''saan''' a maiyalis no addan sigud a panid iti baro a titulo, malaksid no ti kinaudi ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos.
Kayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saan mo a mabalin a suratan manen ti addaan a panid.
'''Ballaag!'''
'import-error-interwiki' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).',
'import-error-special' => 'Ti panid ti "$1" ket saan a naala ngamin ket bukod ti espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
'import-error-invalid' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
+'import-error-unserialize' => 'Ti panagbaliw ti $2 iti panid ti "$1" ket di maipagsasaruno. Ti panagbalbaliw ket naireporta idi nga agus-usar ti modelo ti $3 a naipagsasaruno a kas $4.',
'import-options-wrong' => 'Saan nga husto {{PLURAL:$2|a pagpilian|a pagpilpilian}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Ti naited a ramut ti panid ket imbalido a titulo.',
'import-rootpage-nosubpage' => 'Ti nagan ti lugar ti "$1" iti ramut ti panid ket saan amangpalubos kadagiti apo ti panid.',
'pageinfo-robot-noindex' => 'Saan a mabalin a maipasurotan',
'pageinfo-views' => 'Bilang dagiti panagkita',
'pageinfo-watchers' => 'Bilang dagiti agbuybuya ti panid',
+'pageinfo-few-watchers' => 'Basbassit ngem $1 {{PLURAL:$1|ti agbuybuya|dagiti agbuybuya}}',
'pageinfo-redirects-name' => 'Maibaw-ing ti daytoy a panid',
'pageinfo-subpages-name' => 'Apo dagiti panid ti daytoy a panid',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|baw-ing|bawbaw-ing}}; $3 {{PLURAL:$3|saan a baw-ing|saan a bawbaw-ing}})',
'pageinfo-magic-words' => 'Salamangka {{PLURAL:$1|a balikas|a balbalikas}} ($1)',
'pageinfo-hidden-categories' => 'Nailemmeng {{PLURAL:$1|a kategoria|a katkategoria}} ($1)',
'pageinfo-templates' => 'Nailak-am {{PLURAL:$1|a plantilia|a planplantilia}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|A panid|A pampanid}} ti nailak-an=m idiay ($1)',
'pageinfo-toolboxlink' => 'Pakaammo ti panid',
'pageinfo-redirectsto' => 'Maibaw-ing idiay',
'pageinfo-redirectsto-info' => 'pakaammo',
'pageinfo-protect-cascading' => 'Dagiti panagsalaknib ket agsariap manipud ditoy',
'pageinfo-protect-cascading-yes' => 'Wen',
'pageinfo-protect-cascading-from' => 'Dagiti panagsalaknib ket agsariap manipud idiay',
+'pageinfo-category-info' => 'Pakaammo ti kategoria',
+'pageinfo-category-pages' => 'Bilang dagiti panid',
+'pageinfo-category-subcats' => 'Bilang dagiti subkategoria',
+'pageinfo-category-files' => 'Bilang dagiti papeles',
# Patrolling
'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 oras$1 oras}}',
'days' => '{{PLURAL:$1|$1 aldaw|$1 al-aldaw}}',
+'months' => '{{PLURAL:$1|$1 a bulan|$1 a bulbulan}}',
+'years' => '{{PLURAL:$1|$1 a tawen|$1 a tawtawen}}',
'ago' => '$1 nagtapos',
'just-now' => 'tatta laeng',
'monthsall' => 'amin',
'limitall' => 'amin',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Pasingkedan ti e-surat a pagtaengam',
'confirmemail_noemail' => 'Awan ti umisu nga e-surat a pagtaengam a naikabil idiay [[Special:Preferences|kaykayat ti agar-aramat]].',
'confirmemail_text' => 'Ti {{SITNAME}} ket masapulna a pasingkedam ti e-surat a pagtaengam sakbay nga agusar ti -surat a langa.
'logentry-newusers-newusers' => 'Nagpartuat idi ti $1 a pakabilangan ti agar-aramat',
'logentry-newusers-create' => 'Nagpartuat idi ti $1 a pakabilangan ti agar-aramat',
'logentry-newusers-create2' => 'Nagpartuat ni ti $3 a pakabilangan ti agar-aramat babaen ni $1',
+'logentry-newusers-byemail' => 'Ti pakabilangan a $3 ket pinartuat idi babaen ni $1 ken ti kontrasenias ket naipatulod idi babaen ti e-surat',
'logentry-newusers-autocreate' => 'Ti pakabilangan ni $1 ket automatiko a napartuat',
'logentry-rights-rights' => 'Ni $1 ket nangbaliw ti grupo a panakaikameng para kenni $3 manipud ti $4 iti $5',
'logentry-rights-rights-legacy' => 'Ni $1 ket nangbaliw ti grupo a panakaikameng para kenni $3',
'api-error-ok-but-empty' => 'Kinauneg a biddut: Awan ti sungbat manipud idiay server.',
'api-error-overwrite' => 'Saan a mabalin a suratan manen iti papeles nga adda ditan.',
'api-error-stashfailed' => 'Kinauneg a biddut: Napaay ti server ti agidulin ti temporario a papeles',
+'api-error-publishfailed' => 'Kinauneg a biddut: Napaay ti server a nagipablaak ti temporario a papeles.',
'api-error-timeout' => 'Saan a simmungbat ti server iti nanamnama nga oras.',
'api-error-unclassified' => 'Adda di amammo a biddut a rumsua.',
'api-error-unknown-code' => 'Di amamo a biddut: "$1"',
'duration-centuries' => '$1 {{PLURAL:$1|siglo|sig-siglo}}',
'duration-millennia' => '$1 {{PLURAL:$1|milenio|mil-milenio}}',
+# Image rotation
+'rotate-comment' => 'Ti ladawan ket napusipos babaen ti $1 {{PLURAL:$1|a degrado|a degdegrado}} nga agpakanawan',
+
);
'tog-enotifrevealaddr' => 'Gefa upp netfang mitt í tilkynningarpóstum',
'tog-shownumberswatching' => 'Sýna fjölda vaktandi notenda',
'tog-oldsig' => 'Núverandi undirskrift:',
-'tog-fancysig' => 'Meðhöndla undirskrift sem wikitexti (án sjálfvirks tengils)',
-'tog-externaleditor' => 'Nota utanaðkomandi ritil sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni)',
-'tog-externaldiff' => 'Nota utanaðkomandi mismun sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni)',
+'tog-fancysig' => 'Meðhöndla undirskrift sem wikimál (án sjálfvirks tengils)',
+'tog-externaleditor' => 'Nota utanaðkomandi ritil sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
+'tog-externaldiff' => 'Nota utanaðkomandi mismun sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
'tog-showjumplinks' => 'Virkja „stökkva á“ aðgengitengla',
'tog-uselivepreview' => 'Nota beina forskoðun (JavaScript) (Á tilraunastigi)',
'tog-forceeditsummary' => 'Birta áminningu þegar breytingarágripið er tómt',
'october' => 'október',
'november' => 'nóvember',
'december' => 'desember',
-'january-gen' => 'janúar',
-'february-gen' => 'febrúar',
+'january-gen' => 'janúars',
+'february-gen' => 'febrúars',
'march-gen' => 'mars',
-'april-gen' => 'apríl',
+'april-gen' => 'apríls',
'may-gen' => 'maí',
'june-gen' => 'júní',
'july-gen' => 'júlí',
'category-subcat-count' => '{{PLURAL:$2|Þessi flokkur hefur einungis eftirfarandi undirflokk.|Þessi flokkur hefur eftirfarandi {{PLURAL:$1|undirflokk|$1 undirflokka}}, af alls $2.}}',
'category-subcat-count-limited' => 'Þessi flokkur hefur eftirfarandi {{PLURAL:$1|undirflokk|$1 undirflokka}}.',
'category-article-count' => '{{PLURAL:$2|Þessi flokkur inniheldur aðeins eftirfarandi síðu.|Eftirfarandi {{PLURAL:$1|síða er|síður eru}} í þessum flokki, af alls $1.}}',
-'category-article-count-limited' => 'Eftirfarndi {{PLURAL:$1|síða er|$1 síður eru}} í þessum flokki.',
+'category-article-count-limited' => 'Eftirfarandi {{PLURAL:$1|síða er|$1 síður eru}} í þessum flokki.',
'category-file-count' => '{{PLURAL:$2|Þessi flokkur inniheldur einungis eftirfarandi skrá.|Eftirfarandi {{PLURAL:$1|skrá er|$1 skrár eru}} í þessum flokki, af alls $2.}}',
'category-file-count-limited' => 'Eftirfarandi {{PLURAL:$1|skrá er|$1 skrár eru}} í þessum flokki.',
'listingcontinuesabbrev' => 'frh.',
'gotaccount' => "Nú þegar með notandanafn? '''$1'''.",
'gotaccountlink' => 'Skráðu þig inn',
'userlogin-resetlink' => 'Gleymdir þú notendaupplýsingunum þínum?',
-'createaccountmail' => 'Nota tímabundið handahófsvalið lykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan',
+'createaccountmail' => 'Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan',
'createaccountreason' => 'Ástæða:',
'badretype' => 'Lykilorðin sem þú skrifaðir eru ekki eins.',
'userexists' => 'Þetta notandanafn er þegar í notkun.
{{SITENAME}} notar vefkökur til að skrá inn notendur.
Þú hefur lokað fyrir vefkökur.
Gjörðu svo vel og opnaðu fyrir þær, skráðu þig svo inn með notandanafni og lykilorði.',
-'nocookieslogin' => '{{SITENAME}} notar vefkökur til innskráningar. Vafrinn þinn er ekki að taka á móti þeim sem gerir það ókleyft að innskrá þig. Vinsamlegast virkjaðu móttöku kakna í vafranum þínum til að geta skráð þig inn.',
+'nocookieslogin' => '{{SITENAME}} notar vefkökur til innskráningar. Vafrinn þinn er ekki að taka á móti þeim. Vinsamlegast virkjaðu móttöku kakna í vafranum þínum til að geta skráð þig inn.',
'nocookiesfornew' => 'Notenda aðgangurinn var ekki stofnaður, því ekki fannst uppruni beiðnarinnar.
Gakktu úr skugga um að vefkökur séu virkar, endurhladdu þessari síðu og reyndu aftur.',
'noname' => 'Þú hefur ekki tilgreint gilt notandanafn.',
'loginlanguagelabel' => 'Tungumál: $1',
'suspicious-userlogout' => 'Beiðni um útskráningu hafnað því hún var líklegast send frá biluðum vafra eða vefseli sem hefur vistað vefsíðuna í flýtiminni.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Óþekkt villa í PHP mail() aðgerð.',
'user-mail-no-addy' => 'Gat ekki sent tölvupóst því ekkert tölvupóstfang fannst.',
+'user-mail-no-body' => 'Reyndi að senda tölvupóst með engu eða verulega stuttu meginmáli.',
# Change password dialog
'resetpass' => 'Breyta lykilorði',
Núverandi vistfang þitt er $3, og bönnunarnúmerið er #$5.
Vinsamlegast tilgreindu allt að ofanverðu í fyrirspurnum þínum.",
'blockednoreason' => 'engin ástæða gefin',
-'whitelistedittext' => 'Þú þarft að $1 til að breyta síðum.',
+'whitelistedittext' => 'Þú þarft að $1 þig til að breyta síðum.',
'confirmedittext' => 'Þú verður að staðfesta netfangið þitt áður en þú getur breytt síðum. Vinsamlegast stilltu og staðfestu netfangið þitt í gegnum [[Special:Preferences|stillingarnar]].',
'nosuchsectiontitle' => 'Hluti ekki til',
'nosuchsectiontext' => 'Þú reyndir að breyta hluta sem er ekki til.
Hlutinn gæti hafa verið fluttur til eða hent á meðan þú varst að skoða síðuna.',
'loginreqtitle' => 'Innskráningar krafist',
'loginreqlink' => 'innskrá',
-'loginreqpagetext' => 'Þú þarft að $1 til að geta séð aðrar síður.',
+'loginreqpagetext' => 'Þú þarft að $1 þig til að geta séð aðrar síður.',
'accmailtitle' => 'Lykilorð sent.',
'accmailtext' => "Lykilorðið fyrir [[User talk:$1|$1]] hefur verið sent á $2.
Þú lofar okkur einnig að þú hafir skrifað þetta sjálfur, að efnið sé í almannaeigu eða að það heyri undir frjálst leyfi. (sjá $1).
'''EKKI SENDA INN HÖFUNDARRÉTTARVARIÐ EFNI ÁN LEYFIS RÉTTHAFA!'''",
'longpageerror' => "'''VILLA: Textinn sem þú sendir inn er {{PLURAL:$1|eitt kílóbæti|$1 kílóbæti}} að lengd, en hámarkið er {{PLURAL:$2|eitt kílóbæti|$2 kílóbæti}}. Ekki er hægt að vista textann.'''",
-'readonlywarning' => "'''AÐVÖRUN: Gagnagrunninum hefur verið læst til að unnt sé að framkvæma viðhaldsaðgerðir, svo þú getur ekki vistað breytingar þínar núna.
-Þú kannt að vilja að klippa og líma textann í textaskjal og vista hann fyrir síðar.'''
+'readonlywarning' => "'''AÐVÖRUN: Gagnagrunninum hefur verið læst til að unnt sé að framkvæma viðhaldsaðgerðir, svo þú getur ekki vistað breytingar þínar núna.'''
+Þú ættir að klippa og líma textann yfir í textaskjal til þess að geyma hann til seinni tíma.
Stjórnandinn sem læsti honum gaf þessa skýringu: $1",
'protectedpagewarning' => "'''Viðvörun: Þessari síðu hefur verið læst svo aðeins notendur með möppudýraréttindi geti breytt henni.'''
'post-expand-template-argument-category' => 'Síður sem innihalda frumbreytur sniða sem hefur verið sleppt',
'parser-template-loop-warning' => 'Lykkja í sniði fundin: [[$1]]',
'parser-template-recursion-depth-warning' => 'Sniðið er sjálkveðið of mörgum sinnum ($1)',
-'node-count-exceeded-category' => 'Síður þar sem er umfram fjöldi hnúta',
+'language-converter-depth-warning' => 'Farið út fyrir dýptarmörk tungumálabreytara ($1)',
+'node-count-exceeded-category' => 'Síður þar sem er umframfjöldi hnúta',
+'node-count-exceeded-warning' => 'Síðan fór fram yfir nóðutölu',
+'expansion-depth-exceeded-category' => 'Þær síður þar sem farið er út fyrir leyfða dýpt útvíkkunar',
+'expansion-depth-exceeded-warning' => 'Síðan fer út fyrir leyfða dýpt útvíkkunar',
+'parser-unstrip-loop-warning' => '"Unstrip" lykkja fannst',
+'parser-unstrip-recursion-limit' => 'Farið út fyrir „unstrip“ endurkvæmnismörk ($1)',
+'converter-manual-rule-error' => 'Villa í reglu handvirks tungumálabreytis',
# "Undo" feature
'undo-success' => 'Breytingin hefur verið tekin tilbaka. Vinsamlegast staðfestu og vistaðu svo.',
'revisiondelete' => 'Eyða/endurvekja breytingar',
'revdelete-nooldid-title' => 'Ógild markbreyting',
'revdelete-nooldid-text' => 'Annaðhvort hefur útgáfan sem á að fela ekki verið tilgreind, þessi útgáfa ekki verið til, eða að þú sért að reyna að fela núverandi útgáfu.',
+'revdelete-nologtype-title' => 'Engin skráargerð uppgefin',
+'revdelete-nologtype-text' => 'Þú tilgreindir ekki skráargerð til þess að framkvæma þessa aðgerð á.',
'revdelete-nologid-title' => 'Ógild aðgerðarskráar færsla',
-'revdelete-nologid-text' => 'Þú hefur annaðhvort ekki tilgreint færslu í aðgerðarskrá til að framkvæma þessa aðgerð á, eða að færslan sé ekki til.',
+'revdelete-nologid-text' => 'Þú hefur annaðhvort ekki tilgreint færslu í aðgerðarskrá til að framkvæma þessa aðgerð á, eða færslan er ekki til.',
'revdelete-no-file' => 'Umbeðin skrá er ekki til.',
'revdelete-show-file-confirm' => 'Ertu viss um að þú viljir sjá eydda breytingu af síðunni "<nowiki>$1</nowiki>" frá $2 $3?',
'revdelete-show-file-submit' => 'Já',
'revdelete-success' => "'''Sýnileiki útgáfu er uppfærð.'''",
'revdelete-failure' => "'''Mistókst að uppfæra sýnileika útgáfu:'''
$1",
-'logdelete-success' => "'''Sýnleiki aðgerðarskráar uppfærð.'''",
+'logdelete-success' => "'''Sýnleiki aðgerðarskráar uppfærður.'''",
'logdelete-failure' => "'''Mistókst að uppfæra sýnileika aðgerðarskráar:'''
$1",
'revdel-restore' => 'Breyta sýn',
Þú hefur ekki aðgang að henni.',
'revdelete-modify-missing' => 'Mistókst að breyta hlut með auðkennið $1: Hann finnst ekki í gagnabankanum!',
'revdelete-no-change' => "'''Viðvörun:''' Breytingin frá $1 $2 hefur þegar umbeðnar sýnileika stillingar.",
-'revdelete-concurrent-change' => 'Mistókst að breyta hlut frá $1 $2: Staða hans virðist hafa verið breytt af einhverjum öðrum á meðan þú reyndir að breyta honum.
+'revdelete-concurrent-change' => 'Mistókst að breyta hlut frá $1 $2: Stöðu hans virðist hafa verið breytt af einhverjum öðrum á meðan þú reyndir að breyta honum.
Vinsamlegast athugaðu í aðgerðarskránum.',
'revdelete-only-restricted' => 'Mistókst að fela breytingu frá $1 $2: Þú getur ekki falið breytingu fyrir möppudýrum án þess að velja eina af hinum sýnileika stillingunum.',
'revdelete-reason-dropdown' => '*Algengar eyðingarástæður
'mergehistory-from' => 'Heimildsíða:',
'mergehistory-into' => 'Áætlunarsíða:',
'mergehistory-list' => 'Breytingarskrá sem hægt er að sameina',
+'mergehistory-merge' => 'Eftirtaldar útgáfur [[:$1]] má sameina [[:$2]].
+Notaðu valtakkadálkinn til þess að sameina aðeins þær útgáfur sem stofnaðar voru fyrir uppgefið tímamark.
+Athugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.',
+'mergehistory-go' => 'Sýna breytingar sem hægt er að sameina',
+'mergehistory-submit' => 'Sameina útgáfur',
+'mergehistory-empty' => 'Engar útgáfur sem hægt er að sameina.',
+'mergehistory-success' => '$3 {{PLURAL:$3|útgáfa|útgáfur}} af [[:$1]] sameinaðar í [[:$2]].',
+'mergehistory-fail' => 'Gat ekki sameinað breytingasögur. Vinsamlegast athugaðu síðuna og tímabreyturnar.',
+'mergehistory-no-source' => 'Upprunasíðan $1 er ekki til.',
+'mergehistory-no-destination' => 'Marksíðan $1 er ekki til.',
+'mergehistory-invalid-source' => 'Upprunasíðan verður að hafa gildan titil.',
+'mergehistory-invalid-destination' => 'Marksíðan verður að hafa gildan titil.',
+'mergehistory-autocomment' => 'Sameinaði [[:$1]] inn í [[:$2]]',
+'mergehistory-comment' => 'Sameinaði [[:$1]] inn í [[:$2]]: $3',
+'mergehistory-same-destination' => 'Upprunasíðan og marksíðan mega ekki vera sú sama',
'mergehistory-reason' => 'Ástæða:',
# Merge log
'diff-multi-manyusers' => '({{PLURAL:$1|Ein millibreyting ekki sýnd|$1 millibreytingar ekki sýndar}} frá fleiri en {{PLURAL:$2|einum notanda|$2 notendum}}.)',
'difference-missing-revision' => '{{PLURAL:$2|Ein útgáfa|$2 útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.
-Þetta gerist oftast þegar úreldur samanburðar-tengill tengir á síðu sem hefur verið eytt. Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].',
+Þetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.
+Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].',
# Search results
'searchresults' => 'Leitarniðurstöður',
'prefs-displaywatchlist' => 'Útlitsmöguleikar',
'prefs-diffs' => 'Breytingar',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Netfang virðist vera virkt.',
'email-address-validity-invalid' => 'Settu inn rétt netfang',
'backend-fail-stream' => 'Gat ekki streymt skránni „$1“.',
'backend-fail-backup' => 'Öryggisafritun skráarinnar $1 mistókst.',
'backend-fail-notexists' => 'Skráin $1 er ekki til.',
+'backend-fail-hashes' => 'Gat ekki nálgast tætigildi skráanna til samanburðar.',
'backend-fail-notsame' => 'Ólík skrá er þegar til á $1.',
'backend-fail-invalidpath' => '$1 er ekki gildur geymslustaður.',
'backend-fail-delete' => 'Mistókst að eyða skránni $1.',
'backend-fail-create' => 'Mistókst að skrifa skrá $1.',
'backend-fail-maxsize' => 'Mistókst að skrifa skránna $1 því hún er stærri en {{PLURAL:$2|eitt bæti|$2 bæti}}.',
'backend-fail-readonly' => 'Gagnabankann "$1" er engöngu hægt að lesa í augnablikinu. Ástæðan sem var gefin er: "\'\'$2\'\'"',
+'backend-fail-synced' => 'Skráin $1 er í ósamkvæmu ástandi innan innri geymslubakenda',
'backend-fail-connect' => 'Mistókst að tengjast gagnabankanum "$1".',
'backend-fail-internal' => 'Óþekkt villa átti sér stað í gagnabankanum "$1".',
+'backend-fail-contenttype' => 'Gat ekki ákvarðað innihaldgerð skráarinnar til geymslu á „$1“.',
+'backend-fail-batchsize' => 'Geymslubakendinn fékk bunka af $1 {{PLURAL:$1|skráaraðgerð|skráaraðgerðum}}; mest eru leyfðar $2 {{PLURAL:$2|aðgerð|aðgerðir}}.',
+'backend-fail-usable' => 'Gat ekki lesið skrána „$1“ vegna ófullnægjandi aðgangsheimilda eða týndra mappa/íláta.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Gat ekki tengst dagbókargrunni fyrir geymslubakendann „$1“.',
+'filejournal-fail-dbquery' => 'Gat ekki uppfært dagbókargrunn vegna geymslubakendans „$1“.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Gat ekki aflæst „$1“; það er ekki læst.',
+'lockmanager-fail-closelock' => 'Gat ekki lokað lásaskrá vegna „$1“.',
+'lockmanager-fail-deletelock' => 'Gat ekki eytt lásaskrá vegna „$1“.',
+'lockmanager-fail-acquirelock' => 'Gat ekki nálgast lás vegna „$1“.',
+'lockmanager-fail-openlock' => 'Gat ekki opnað lásaskrá vegna „$1“.',
+'lockmanager-fail-releaselock' => 'Gat ekki opnað lás vegna „$1“.',
+'lockmanager-fail-db-bucket' => 'Náði ekki sambandi við nógu marga lása í fötunni $1.',
+'lockmanager-fail-db-release' => 'Gat ekki opnað lása á gagnagrunninum $1.',
+'lockmanager-fail-svr-acquire' => 'Gat ekki nálgast lása á þjóninum $1.',
+'lockmanager-fail-svr-release' => 'Gat ekki opnað lása á þjóninum $1.',
# ZipDirectoryReader
'zip-file-open-error' => 'Mistök við opnun skráarinnar fyrir ZIP athuganir.',
Reyndu aftur.',
'uploadstash-errclear' => 'Tæming listans mistókst.',
'uploadstash-refresh' => 'Endurhlaða listann',
+'invalid-chunk-offset' => 'Ógild raðbreyting bunka',
# img_auth script messages
'img-auth-accessdenied' => 'Aðgangur óheimill',
Biðlarinn þínn er ekki stilltur til að gefa upp þessar upplýsingar.
Þær mega vera CGI-byggðar og mega ekki styðja img_auth.
https://www.mediawiki.org/wiki/Manual:Image_Authorization',
+'img-auth-notindir' => 'Umbeðin slóð var ekki í stilltri upphlaðsmöppu.',
'img-auth-badtitle' => 'Mistókst að búa til gildan titil útfrá „$1”.',
+'img-auth-nologinnWL' => 'Þú ert ekki skráð(ur) inn og „$1“ er ekki á hvítlista.',
'img-auth-nofile' => 'Skráin "$1" er ekki til.',
+'img-auth-isdir' => 'Þú ert að reyna að nálgast möppuna „$1“.
+Aðeins skráaraðgangur er leyfður.',
'img-auth-streaming' => 'Streymi "$1".',
+'img-auth-public' => 'Virkni img_auth.php er að flytja út skrár frá einkawiki.
+Þessi wiki er stilltur sem opinber wiki.
+Vegna öryggissjónarmiða er img_auth.php óvirkt.',
'img-auth-noread' => 'Notandinn hefur ekki rétt til að lesa "$1"',
'img-auth-bad-query-string' => 'Vefslóðin hefur ógildan fyrirspurnar streng.',
'listgrouprights-addgroup-self-all' => 'Bæta sjálfum sér í alla hópa',
'listgrouprights-removegroup-self-all' => 'Fjarlægja sjálfan sig úr öllum hópum',
-# E-mail user
+# Email user
'mailnologin' => 'Ekkert netfang til að senda á',
'mailnologintext' => 'Þú verður að vera [[Special:UserLogin|innskráð(ur)]] auk þess að hafa gilt netfang í [[Special:Preferences|stillingunum]] þínum til að senda tölvupóst til annara notenda.',
'emailuser' => 'Senda þessum notanda tölvupóst',
'mywatchlist' => 'Vaktlisti',
'watchlistfor2' => 'Eftir $1 $2',
'nowatchlist' => 'Vaktlistinn er tómur.',
-'watchlistanontext' => 'Vinsamlegast $1 til að skoða eða breyta vaktlistanum þínum.',
+'watchlistanontext' => 'Vinsamlegast $1ðu þig til að skoða eða breyta vaktlistanum þínum.',
'watchnologin' => 'Óinnskráð(ur)',
'watchnologintext' => 'Þú verður að vera [[Special:UserLogin|innskáð(ur)]] til að geta breytt vaktlistanum.',
'addwatch' => 'Bæta á vaktlistann',
** Yfirþyrmandi framkoma/áreitni
** Misnotkun á fjölda notandanafna
** Óásættanlegt notandanafn',
-'ipb-hardblock' => 'Hindra innskráðum notendum frá því að breyta frá þessu vistfangi.',
-'ipbcreateaccount' => 'Banna nýskráningu notanda',
+'ipb-hardblock' => 'Banna innskráðum notendum að breyta frá þessu vistfangi.',
+'ipbcreateaccount' => 'Banna nýskráningu notandanafns',
'ipbemailban' => 'Banna notanda að senda tölvupóst',
'ipbenableautoblock' => 'Banna síðasta vistfang notanda sjálfkrafa; og þau vistföng sem viðkomandi notar til að breyta síðum',
'ipbsubmit' => 'Banna notanda',
'ipbotherreason' => 'Önnur/auka ástæða:',
'ipbhidename' => 'Fela notandanafn úr breytingarskrá og listum',
'ipbwatchuser' => 'Vakta notanda- og spjallsíður þessa notanda',
-'ipb-disableusertalk' => 'Banna þessum notenda að breyta egin spjallsíðu',
+'ipb-disableusertalk' => 'Banna þessum notanda að breyta eigin spjallsíðu',
'ipb-change-block' => 'Endurbanna notanda með þessum stillingum',
'ipb-confirm' => 'Staðfesta bann',
'badipaddress' => 'Ógilt vistfang',
'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] hefur verið bannaður/bönnuð.<br />
Sjá [[Special:BlockList|bannaðir notendur og vistföng]] fyrir yfirlit yfir núverandi bönn.',
'ipb-blockingself' => 'Þú ert í þann mund að banna sjálfan þig! Ertu viss um að þú viljir gera það?',
-'ipb-confirmhideuser' => 'Þú ert í þann mund að banna notenda sem er falinn. Notendanafn hans mun ekki birtast í listum og aðgerðarskrám. Ertu viss um að þú viljir gera það?',
+'ipb-confirmhideuser' => 'Þú ert í þann mund að banna notanda sem er falinn. Notandanafn hans mun ekki birtast í listum og aðgerðarskrám. Ertu viss um að þú viljir gera það?',
'ipb-edit-dropdown' => 'Breyta ástæðu fyrir banni',
'ipb-unblock-addr' => 'Afbanna $1',
'ipb-unblock' => 'Afbanna notanda eða vistfang',
# Developer tools
'lockdb' => 'Læsa gagnagrunninum',
'unlockdb' => 'Opna gagnagrunninn',
+'lockdbtext' => 'Læsing gagnagrunnsins mun hindra alla notendur í því að breyta síðum, stillingum, vaktlistum og öðrum möguleikum sem þarfnast aðgangs að gagnagrunninum.
+Staðfestu að þetta er það sem þú vilt gera og að þú munir aflæsa grunninum eftir að viðhaldsverki er lokið.',
+'unlockdbtext' => 'Aflæsing gagnagrunnsins mun gera öllum notendum kleift á ný að breyta síðum, stillingum, vaktlistum og öðrum möguleikum sem þarfnast aðgangs að gagnagrunninum.
+Staðfestu að þetta er það sem þú vilt gera.',
'lockconfirm' => 'Já, ég vil læsa gagnagrunninum.',
'unlockconfirm' => 'Já, ég vil aflæsa gagnagrunninum.',
'lockbtn' => 'Læsa gagnagrunni',
'lockdbsuccesstext' => 'Gagnagrunninum hefur verið læst.<br />
Mundu að [[Special:UnlockDB|opna hann aftur]] þegar þú hefur lokið viðgerðum.',
'unlockdbsuccesstext' => 'Gagnagrunnurinn hefur verið opnaður.',
+'lockfilenotwritable' => 'Skrá gagnagrunnslássins er ekki skrifanleg.
+Til þess að læsa eða aflæsa gagnagrunni þarf vefþjónninn að geta skrifað í skrána.',
'databasenotlocked' => 'Gagnagrunnurinn er ekki læstur.',
'lockedbyandtime' => '(af {{GENDER:$1|$1}} kl. $3, $2)',
'immobile-target-namespace-iw' => 'Óheimilt er að færa síðu með tungumálatengli.',
'immobile-source-page' => 'Þessi síða er ekki færanleg.',
'immobile-target-page' => 'Get ekki fært á áætlaðan titil.',
+'bad-target-model' => 'Markstaðurinn sem þú valdir notast við annað innihaldslíkan. Get ekki umbreytt frá $1 í $2.',
'imagenocrossnamespace' => 'Get ekki fært skrá í skrálaust nafnrými',
'nonfile-cannot-move-to-file' => 'Get ekki fært annað en skrár í nafnrými skráa.',
'imagetypemismatch' => 'Nýi nafnaukinn passar ekki við tegund hennar',
'thumbnail-more' => 'Stækka',
'filemissing' => 'Skrá vantar',
'thumbnail_error' => 'Villa við gerð smámyndar: $1',
+'djvu_page_error' => 'DjVu-blaðsíða er utan marka',
'djvu_no_xml' => 'Mistókst að sækja XML-gögn fyrir DjVu skrá',
'thumbnail-temp-create' => 'Mistókst að búa til tímabundna smámynd.',
+'thumbnail-dest-create' => 'Gat ekki vistað smámynd á markstað',
'thumbnail_invalid_params' => 'Breytur smámyndarinnar eru rangar',
'thumbnail_dest_directory' => 'Mistókst að búa til niðurhals möppu',
'thumbnail_image-type' => 'Enginn stuðningur er við þetta skráarsnið',
+'thumbnail_gd-library' => 'Ófullkomin stilling GD-safns: Skortir aðgerðina $1',
'thumbnail_image-missing' => 'Skránna vantar: $1',
# Special:Import
'import-interwiki-templates' => 'Innifala öll snið með',
'import-interwiki-submit' => 'Flytja inn',
'import-interwiki-namespace' => 'Ákvörðunarnafnrými:',
-'import-interwiki-rootpage' => 'Ákvörðunar grunnsíða (valfrjáls):',
+'import-interwiki-rootpage' => 'Markmóðursíða (valfrjáls):',
'import-upload-filename' => 'Skráarnafn:',
'import-comment' => 'Athugasemdir:',
'importtext' => 'Vinsamlegast fluttu út skránna frá upprunalegum wiki með því að nota [[Special:Export|Flytja út síður]].
'importnopages' => 'Engar síður til innflutnings.',
'imported-log-entries' => '$1 {{PLURAL:$1|breytingar færsla|breytingar færslur}} hafa verið fluttar inn',
'importfailed' => 'Innhlaðning mistókst: $1',
+'importunknownsource' => 'Óþekkt innflutningstilfangsgerð',
'importcantopen' => 'Get ekki opnað innflutt skjal',
'importbadinterwiki' => 'Villa í tungumálatengli',
'importnotext' => 'Tómt eða enginn texti',
'import-error-interwiki' => 'Síðan "$1" var ekki flutt inn því nafn hennar er frátekið fyrir ytri tengla (tungumálatengla).',
'import-error-special' => 'Síðan "$1" var ekki flutt inn því hún tilheyrir ákveðnu nafnrými sem leyfir ekki síður.',
'import-error-invalid' => 'Síðan "$1" var ekki flutt inn því nafn hennar er ógilt.',
+'import-error-unserialize' => 'Ekki unnt að afraða útgáfu $2 af síðunni „$1“. Útgáfan var sögð nota innihaldslíkan $3 raðað sem $4.',
'import-options-wrong' => '{{PLURAL:$2|Rangur möguleiki|Rangir möguleikar}}: <nowiki>$1</nowiki>',
-'import-rootpage-invalid' => 'Uppgefin ákvörðunar síða er ógildur titill.',
-'import-rootpage-nosubpage' => 'Nafnrými „$1“ ákvörðunar síðunar leyfir ekki undirsíður.',
+'import-rootpage-invalid' => 'Uppgefin móðursíða hefur ógildan titil.',
+'import-rootpage-nosubpage' => 'Nafnrými „$1“ móðursíðunnar leyfir ekki undirsíður.',
# Import log
'importlogpage' => 'Innflutningsskrá',
'javascripttest' => 'JavaScript prófun',
'javascripttest-title' => 'Keyri $1 prófun',
'javascripttest-pagetext-noframework' => 'Þessi síða er frátekin fyrir JavaScript prófanir.',
+'javascripttest-pagetext-unknownframework' => 'Óþekktur prófunarrammi „$1“.',
+'javascripttest-pagetext-frameworks' => 'Veldu einn eftirtalinna prófunarramma: $1',
'javascripttest-pagetext-skins' => 'Veldu þema sem á að keyra prófanirnar á:',
+'javascripttest-qunit-intro' => 'Sjá [$1 tilraunaskjölun] á mediawiki.org.',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Notandasíðan þín',
'pageinfo-robot-noindex' => 'Óskráanleg',
'pageinfo-views' => 'Fjöldi innlita',
'pageinfo-watchers' => 'Fjöldi notenda, sem vakta síðuna',
-'pageinfo-few-watchers' => 'Vöktuð af færri en $1 {{PLURAL:$1|notandi|notendum}}',
+'pageinfo-few-watchers' => 'Vöktuð af færri en $1 {{PLURAL:$1|notanda|notendum}}',
'pageinfo-redirects-name' => 'Tilvísanir til þessarar síðu',
'pageinfo-subpages-name' => 'Undirsíður þessarar síðu',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|tilvísun|tilvísanir}}; $3 {{PLURAL:$3|ekki tilvísun|ekki tilvísanir}})',
'pageinfo-magic-words' => 'Töfra {{PLURAL:$1|orð}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Falinn flokkur|Faldir flokkar}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Innifalið snið|Innifalin snið}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|Síða|Síður}} ítengdar á ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Síða|Síður}} innfelldar á ($1)',
'pageinfo-toolboxlink' => 'Síðuupplýsingar',
'pageinfo-redirectsto' => 'Vísar til',
'pageinfo-redirectsto-info' => 'upplýsingar',
'pageinfo-protect-cascading' => 'Keðjuvörn hefst hér',
'pageinfo-protect-cascading-yes' => 'Já',
'pageinfo-protect-cascading-from' => 'Keðjuvörn stafar frá',
-'pageinfo-category-info' => 'Flokka upplýsingar',
+'pageinfo-category-info' => 'Flokkaupplýsingar',
'pageinfo-category-pages' => 'Fjöldi síðna',
'pageinfo-category-subcats' => 'Fjöldi undirflokka',
'pageinfo-category-files' => 'Fjöldi skráa',
'file-info-png-looped' => 'síendurtekin hreyfimynd',
'file-info-png-repeat' => 'spilað {{PLURAL:$1|einu sinni|$1 sinnum}}',
'file-info-png-frames' => '$1 {{PLURAL:$1|rammi|rammar}}',
+'file-no-thumb-animation' => "'''Athugið: Vegna tæknilegra takmarkanna birtast smámyndir af þessari skrá aðeins sem kyrrmyndir.'''",
+'file-no-thumb-animation-gif' => "'''Athugið:Vegna tæknilegra takmarkanna munu smámyndir af GIF-myndum í hárri upplausn eins og þessari ekki birtast sem hreyfimyndir.'''",
# Special:NewFiles
'newimages' => 'Myndasafn nýlegra skráa',
'exif-orientation' => 'Lega',
'exif-samplesperpixel' => 'Fjöldi eininga',
'exif-planarconfiguration' => 'Tilhögun gagna',
+'exif-ycbcrsubsampling' => 'Undirstökunarsnið Y gagnvart C',
'exif-ycbcrpositioning' => 'Staðsetning Y og C',
'exif-xresolution' => 'Lárétt upplausn',
'exif-yresolution' => 'Lóðrétt upplausn',
'exif-stripoffsets' => 'Staðsetning gagna',
'exif-rowsperstrip' => 'Fjöldi raða á ræmu',
'exif-stripbytecounts' => 'Bæti á hverri þjappaðri ræmu',
+'exif-jpeginterchangeformat' => 'Jöfnun JPEG SOI',
'exif-jpeginterchangeformatlength' => 'bæti af JPEG gögnum',
'exif-whitepoint' => 'Krómatísmi hvíta punkts',
'exif-primarychromaticities' => 'Krómatísmi grunnlita',
+'exif-ycbcrcoefficients' => 'Litarýmisumbreytingargfylkistuðlar',
'exif-referenceblackwhite' => 'Pör svartra og hvítra tilvísana gilda',
'exif-datetime' => 'Dagsetning og tími breytingar',
'exif-imagedescription' => 'Titill myndar',
'exif-datetimeoriginal' => 'Upprunaleg dagsetning',
'exif-datetimedigitized' => 'Dagsetning stafrænnar myndar',
'exif-subsectime' => 'DagsetningTími sekúndubrot',
+'exif-subsectimeoriginal' => 'DagurTímiUpprunaleg sekúndubrot',
+'exif-subsectimedigitized' => 'DagurTímiStafrænt sekúndubrot',
'exif-exposuretime' => 'Lýsingartími',
'exif-exposuretime-format' => '$1 sekúnda ($2)',
+'exif-fnumber' => 'F-tala',
'exif-exposureprogram' => 'Ljósastilling',
'exif-spectralsensitivity' => 'Litrófsnæmni',
'exif-isospeedratings' => 'ISO filmuhraði',
'exif-shutterspeedvalue' => 'APEX lokunarhraði',
'exif-aperturevalue' => 'APEX ljósop',
'exif-brightnessvalue' => 'APEX birtustig',
+'exif-exposurebiasvalue' => 'APEX lýsingarbjagi',
+'exif-maxaperturevalue' => 'Hámarksvídd ljósops innra byrðis linsu',
'exif-subjectdistance' => 'Lengd að viðfangsefni',
+'exif-meteringmode' => 'Mælingarhamur',
'exif-lightsource' => 'Uppspretta ljóssins',
'exif-flash' => 'Leifturljós',
'exif-focallength' => 'Brennivídd',
'exif-gpslatitude' => 'Breiddargráða',
'exif-gpslongituderef' => 'Austur- eða vestur lengdargráða',
'exif-gpslongitude' => 'Lengdargráða',
+'exif-gpsaltituderef' => 'Hæðarviðmið',
'exif-gpsaltitude' => 'Stjörnuhæð',
'exif-gpstimestamp' => 'GPS tími (atómklukka)',
'exif-gpssatellites' => 'Gervihnettir sem voru notaðir við mælingu',
'exif-planarconfiguration-2' => 'planar snið',
+'exif-colorspace-65535' => 'Ókvarðað',
+
'exif-componentsconfiguration-0' => 'er ekki til',
'exif-exposureprogram-0' => 'Ekki skilgreind',
'exif-meteringmode-3' => 'Blettur',
'exif-meteringmode-4' => 'Margir-blettir',
'exif-meteringmode-5' => 'Mynstur',
+'exif-meteringmode-6' => 'Að hluta',
'exif-meteringmode-255' => 'Annað',
'exif-lightsource-0' => 'Óþekkt',
'exif-lightsource-9' => 'Gott veður',
'exif-lightsource-10' => 'Skýjað',
'exif-lightsource-11' => 'Skuggi',
+'exif-lightsource-12' => 'Dagsljós flúrlýsing (D 5700 - 7100K)',
+'exif-lightsource-13' => 'Dagur hvít flúrlýsing (N 4600 - 5400K)',
+'exif-lightsource-14' => 'Köld hvít flúrlýsing (W 3900 - 4500K)',
+'exif-lightsource-15' => 'Hvít flúrlýsing (WW 3200 - 3700K)',
'exif-lightsource-17' => 'Staðaljós A',
'exif-lightsource-18' => 'Staðaljós B',
'exif-lightsource-19' => 'Staðaljós C',
+'exif-lightsource-24' => 'ISO stúdíótungsten',
'exif-lightsource-255' => 'Önnur ljósuppspretta',
# Flash modes
'exif-sensingmethod-4' => 'Þriggja-kísilflögu litsviðs skynjari',
'exif-sensingmethod-5' => 'Raðbundinn litsviðs skynjari',
+'exif-filesource-3' => 'Stafræn ljósmyndavél',
+
'exif-customrendered-0' => 'Venjuleg vinnsla',
'exif-customrendered-1' => 'Sérstök vinnsla',
'exif-objectcycle-p' => 'að kvöldi',
'exif-objectcycle-b' => 'að morgni og kvöldi',
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Raunátt',
+'exif-gpsdirection-m' => 'Segulátt',
+
'exif-ycbcrpositioning-1' => 'Miðjuð',
'exif-dc-contributor' => 'Framleggjendur',
'exif-dc-relation' => 'Tengd margmiðlunargögn',
'exif-dc-rights' => 'Réttindi',
'exif-dc-source' => 'Uppruni margmiðlunarskrár',
+'exif-dc-type' => 'Gerð miðlunarefnis',
'exif-rating-rejected' => 'Hafnað',
'exif-iimcategory-edu' => 'Menntun',
'exif-iimcategory-evn' => 'Umhverfi',
'exif-iimcategory-hth' => 'Heilsa',
+'exif-iimcategory-hum' => 'Maðurinn',
'exif-iimcategory-lab' => 'Verkamennska',
'exif-iimcategory-lif' => 'Lífstíll og tómstundagaman',
'exif-iimcategory-pol' => 'Pólitík',
'monthsall' => 'allir',
'limitall' => 'alla',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Staðfesta netfang',
'confirmemail_noemail' => 'Þú hefur ekki gefið upp gilt netfang í [[Special:Preferences|notandastillingum]] þínum.',
'confirmemail_text' => '{{SITENAME}} krefst þess að þú staðfestir netfangið þitt áður en að þú getur notað eiginleika tengt því. Smelltu á hnappinn að neðan til að fá staðfestingarpóst sendan á netfangið. Pósturinn mun innihalda tengil með kóða í sér; opnaðu tengilinn í vafranum til að staðfesta að netfangið sé rétt.',
Póstþjónninn skilaði: $1',
'confirmemail_invalid' => 'Ógildur staðfestingarkóði. Hann gæti verið útrunninn.',
-'confirmemail_needlogin' => 'Þú verður að $1 til að staðfesta netfangið þitt.',
+'confirmemail_needlogin' => 'Þú verður að $1 þig til að staðfesta netfangið þitt.',
'confirmemail_success' => 'Netfang þitt hefur verið staðfest. Þú getur nú [[Special:UserLogin|skráð þig inn]] og vafrað um wiki-kerfið.',
'confirmemail_loggedin' => 'Netfang þitt hefur verið staðfest.',
'confirmemail_error' => 'Eitthvað fór úrskeiðis við vistun staðfestingarinnar.',
'logentry-newusers-newusers' => 'Notandaaðgangurinn $1 var stofnaður',
'logentry-newusers-create' => 'Notandaaðgangurinn $1 var stofnaður',
'logentry-newusers-create2' => '$1 stofnaði notandaaðganginn $3',
-'logentry-newusers-byemail' => 'Notenda aðgangurinn $3 var búinn til af $1 og lykilorðið var sent með tölvupósti',
+'logentry-newusers-byemail' => 'Notandaaðgangurinn $3 var búinn til af $1 og lykilorðið var sent með tölvupósti',
'logentry-newusers-autocreate' => 'Aðgangurinn $1 var stofnaður sjálfvirkt',
'logentry-rights-rights' => '$1 breytti réttindum $3 frá $4 í $5',
'logentry-rights-rights-legacy' => '$1 breytti réttindum $3',
'api-error-ok-but-empty' => 'Innri villa: ekkert svar frá vefþjón.',
'api-error-overwrite' => 'Óheimilt er að skrifa yfir skrá sem er þegar til.',
'api-error-stashfailed' => 'Innri villa: Vefþjónninn gat ekki geymt tímabundna skrá.',
-'api-error-publishfailed' => 'Innri villa: Vefþjónninn gat ekki gefið út tímabundna skrá.',
+'api-error-publishfailed' => 'Innri villa: Vefþjónninn gat ekki gefið út bráðabirgðaskrá.',
'api-error-timeout' => 'Vefþjónninn svaraði ekki á tilætluðum tíma.',
'api-error-unclassified' => 'Óþekkt villa kom upp.',
'api-error-unknown-code' => 'Óþekkt villa: "$1"',
'loginlanguagelabel' => 'Lingua: $1',
'suspicious-userlogout' => 'La tua richiesta di disconnessione è stata negata perché sembra inviata da un browser non funzionante o un proxy di caching.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Errore sconosciuto nella funzione PHP mail()',
'user-mail-no-addy' => 'Hai cercato di inviare una e-mail senza un indirizzo.',
'user-mail-no-body' => 'Tentato di inviare una e-mail con un testo vuoto o estremamente breve.',
'prefs-displaywatchlist' => 'Opzioni di visualizzazione',
'prefs-diffs' => 'Differenze',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => "L'indirizzo e-mail sembra valido",
'email-address-validity-invalid' => 'Inserisci un indirizzo e-mail valido',
Esse potrebbero dover puntare a una pagina più appropriata.<br />
Vengono considerate pagine di disambiguazione tutte quelle che contengono i template elencati in [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pagine con una pagina di proprietà',
+'pageswithprop-legend' => 'Pagine con una pagina di proprietà',
+'pageswithprop-text' => 'Questa pagina elenca le pagine che utilizzano una particolare pagina di proprietà.',
+'pageswithprop-prop' => 'Nome proprietà:',
+'pageswithprop-submit' => 'Vai',
+
'doubleredirects' => 'Redirect doppi',
'doubleredirectstext' => 'In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.
Ciascuna riga contiene i collegamenti al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene la pagina di destinazione "corretta" alla quale dovrebbe puntare anche il primo redirect.
'listgrouprights-addgroup-self-all' => 'Può aggiungersi a tutti i gruppi',
'listgrouprights-removegroup-self-all' => 'Può rimuoversi da tutti i gruppi',
-# E-mail user
+# Email user
'mailnologin' => 'Nessun indirizzo cui inviare il messaggio',
'mailnologintext' => 'Per inviare messaggi e-mail ad altri utenti è necessario [[Special:UserLogin|accedere al sito]] e aver registrato un indirizzo valido nelle proprie [[Special:Preferences|preferenze]].',
'emailuser' => "Scrivi all'utente",
'monthsall' => 'tutti',
'limitall' => 'tutti',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Conferma indirizzo email',
'confirmemail_noemail' => 'Non è stato indicato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]].',
'confirmemail_text' => "{{SITENAME}} richiede la verifica dell'indirizzo e-mail prima di poter usare le relative funzioni. Premere il pulsante qui sotto per inviare una richiesta di conferma al proprio indirizzo; nel messaggio è presente un collegamento che contiene un codice. Visitare il collegamento con il proprio browser per confermare che l'indirizzo e-mail è valido.",
'confirm-unwatch-button' => 'OK',
'confirm-unwatch-top' => 'Elimina questa pagina dalla tua lista degli osservati speciali?',
+# Separators for various lists, etc.
+'percent' => '$1 %',
+
# Multipage image navigation
'imgmultipageprev' => '← pagina precedente',
'imgmultipagenext' => 'pagina seguente →',
'duration-centuries' => '$1 {{PLURAL:$1|secolo|secoli}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennio|millenni}}',
+# Image rotation
+'rotate-comment' => 'Immagine ruotata di $1 {{PLURAL:$1|grado|gradi}} in senso orario',
+
);
'hidetoc' => '非表示',
'collapsible-collapse' => '折り畳む',
'collapsible-expand' => '展開する',
-'thisisdeleted' => '$1を閲覧または復元しますか?',
-'viewdeleted' => '$1を閲覧しますか?',
+'thisisdeleted' => '$1を閲覧または復元しますか?',
+'viewdeleted' => '$1を閲覧しますか?',
'restorelink' => '{{PLURAL:$1|削除された$1編集}}',
'feedlinks' => 'フィード:',
'feed-invalid' => 'フィード形式の指定が正しくありません。',
'page-atom-feed' => '「$1」のAtomフィード',
'feed-atom' => 'Atom',
'feed-rss' => 'RSS',
-'red-link-title' => '$1(存在しないページ)',
+'red-link-title' => '$1 (存在しないページ)',
'sort-descending' => '降順に並べ替え',
'sort-ascending' => '昇順に並べ替え',
'enterlockreason' => 'ロックの理由とロック解除の予定を入力してください',
'readonlytext' => 'データベースは現在、新しいページの追加や編集を受け付けない「ロック状態」になっています。これはおそらくデータベースの定期メンテナンスのためで、メンテナンス終了後は正常な状態に復帰します。
-データベースをロックした管理者による説明は以下の通りです:$1',
+データベースをロックした管理者による説明は以下の通りです: $1',
'missing-article' => '指定されたページ「$1」$2 の本文がデータベース内で見つかりませんでした。
通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。
# Virus scanner
'virus-badscanner' => "環境設定が不適合です: 不明なウイルス対策ソフトウェア: ''$1''",
-'virus-scanfailed' => 'スキャンに失敗しました(コード $1)',
+'virus-scanfailed' => 'スキャンに失敗しました (コード $1)',
'virus-unknownscanner' => '不明なウイルス対策ソフトウェア:',
# Login and logout pages
'createaccount' => 'アカウント作成',
'gotaccount' => 'アカウントを既に持っている場合、$1。',
'gotaccountlink' => 'ログインしてください',
-'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
+'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
'createaccountmail' => '一時的でランダムなパスワードを生成して、以下に指定したメールアドレスに送信する',
'createaccountreason' => '理由:',
'badretype' => '入力したパスワードが一致しません。',
このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
'noemail' => '利用者「$1」のメールアドレスは登録されていません。',
'noemailcreate' => '有効なメールアドレスを入力する必要があります',
-'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスに送信しました。
-ã\83¡ã\83¼ã\83«ã\82\92å\8f\97ã\81\91å\8f\96ã\81£たら、再度ログインしてください。',
+'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスにお送りしました。
+ã\83¡ã\83¼ã\83«ã\81\8cå±\8aã\81\84たら、再度ログインしてください。',
'blocked-mailpassword' => 'ご使用中のIPアドレスからの編集はブロックされており、不正利用防止のため、パスワードの再発行機能は使用できません。',
'eauthentsent' => '指定したメールアドレスに、アドレス確認のためのメールをお送りしました。
メールに記載された手順に従って、このアカウントの所有者であることの確認が取れると、このアカウント宛のメールを受け取れるようになります。',
'accountcreated' => 'アカウントを作成しました',
'accountcreatedtext' => '利用者アカウント「$1」を作成しました。',
'createaccount-title' => '{{SITENAME}}のアカウント作成',
-'createaccount-text' => '誰か(おそらくあなた)が、{{SITENAME}} ($4) にあなたのメールアドレスのアカウントを作成しました。
+'createaccount-text' => '誰か (おそらくあなた) が、{{SITENAME}} ($4) にあなたのメールアドレスのアカウントを作成しました。
アカウント名「$2」、パスワード「$3」です。
今すぐログインしてパスワードを変更してください。
'loginlanguagelabel' => '言語: $1',
'suspicious-userlogout' => '壊れたブラウザーまたはキャッシュプロキシによって送信された可能性があるため、ログアウト要求は拒否されました。',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'PHPのmail()関数での不明なエラーです。',
'user-mail-no-addy' => 'メールアドレスなしでメールを送信しようとしました。',
'user-mail-no-body' => '本文が空、またはあまりにも短いメールは送信できません。',
# Change password dialog
'resetpass' => 'パスワードの変更',
'resetpass_announce' => 'メールでお送りした仮パスワードでログインしました。
-ログインを完了するには、ここで新しいパスワードを設定する必要があります:',
+ログインを完了するには、ここで新しいパスワードを設定する必要があります:',
'resetpass_text' => '<!-- ここに文を挿入 -->',
'resetpass_header' => 'アカウントのパスワードの変更',
'oldpassword' => '古いパスワード:',
'passwordreset-username' => '利用者名:',
'passwordreset-domain' => 'ドメイン:',
'passwordreset-capture' => 'お送りするメールの内容を表示しますか?',
-'passwordreset-capture-help' => 'このボックスにチェックを入れると、利用者に送信されるメールの内容(仮パスワードを含む)をあなたも閲覧できます。',
+'passwordreset-capture-help' => 'このボックスにチェックを入れると、利用者に送信されるメールの内容 (仮パスワードを含む) をあなたも閲覧できます。',
'passwordreset-email' => 'メールアドレス:',
'passwordreset-emailtitle' => '{{SITENAME}}上のアカウントの詳細',
'passwordreset-emailtext-ip' => '誰か (おそらくあなた、IP アドレス $1) が {{SITENAME}} ($4) での
# Special:ChangeEmail
'changeemail' => 'メールアドレスの変更',
-'changeemail-header' => 'ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92変更',
+'changeemail-header' => 'ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81®変更',
'changeemail-text' => 'このフォームではメールアドレスを変更できます。この変更を確認するためにパスワードを入力する必要があります。',
'changeemail-no-info' => 'このページに直接アクセスするためにはログインしている必要があります。',
'changeemail-oldemail' => '現在のメールアドレス:',
'media_sample' => 'サンプル.ogg',
'media_tip' => 'ファイルへのリンク',
'sig_tip' => '時刻印付きの署名',
-'hr_tip' => '水平線を挿入(利用は控えめに)',
+'hr_tip' => '水平線を挿入 (利用は控えめに)',
# Edit pages
'summary' => '編集内容の要約:',
ブロックは$1によって実施されました。
ブロックの理由は ''$2'' です。
-* ã\83\96ã\83ã\83\83ã\82¯é\96\8bå§\8bæ\99\82æ\9c\9fï¼\9a$8
-* ブロック解除予定:$6
-* ブロック対象:$7
+* ã\83\96ã\83ã\83\83ã\82¯é\96\8bå§\8bæ\97¥æ\99\82: $8
+* ブロック解除予定: $6
+* ブロック対象: $7
このブロックについて、$1もしくは他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]に問い合わせることができます。
ただし、[[Special:Preferences|個人設定]]で有効なメールアドレスが登録されていない場合、またはメール送信機能の使用がブロックされている場合、「この利用者にメールを送信」の機能は使えません。
:''$2''
-* ブロックの開始:$8
-* ブロック解除予定:$6
-* 意図されているブロック対象者:$7
+* ブロック開始日時: $8
+* ブロック解除予定: $6
+* ブロック対象: $7
$1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロックについて問い合わせることができます。
'loginreqtitle' => 'ログインが必要',
'loginreqlink' => 'ログイン',
'loginreqpagetext' => '他のページを閲覧するには$1する必要があります。',
-'accmailtitle' => 'パスワードをお送りしました。',
+'accmailtitle' => 'パスワードをお送りしました',
'accmailtext' => "[[User talk:$1|$1]]のために無作為に生成したパスワードを、$2に送信しました。
この新アカウントのパスワードは、ログインした際に''[[Special:ChangePassword|パスワード変更]]''ページで変更できます。",
'newarticletext' => "まだ存在しないページへのリンクをたどりました。
このページを新規作成するには、ページの内容を以下のボックスに記入してください (詳しくは[[{{MediaWiki:Helppage}}|ヘルプページ]]を参照してください)。
誤ってこのページにたどり着いた場合には、ブラウザーの'''戻る'''ボタンで前のページに戻ってください。",
-'anontalkpagetext' => "----''このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。
-匿名利用者を識別するために、利用者名の代わりにIPアドレスが使用されています。
-IP アドレスは複数の利用者で共有されている場合があります。
-もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられている考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。''",
+'anontalkpagetext' => "----
+''このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。''
+
+匿名利用者を識別するために、利用者名の代わりにIPアドレスが使用されています。IP アドレスは複数の利用者で共有されている場合があります。もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられていると考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。",
'noarticletext' => '現在このページには内容がありません。
他のページ内で[[Special:Search/{{PAGENAME}}|このページ名を検索]]、
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連する記録を検索]、
これらの引数を省略しました。",
'post-expand-template-argument-category' => '省略されたテンプレート引数を含むページ',
'parser-template-loop-warning' => 'テンプレートのループを検出しました: [[$1]]',
-'parser-template-recursion-depth-warning' => 'テンプレートの再帰の深さ($1)が上限を超えました',
-'language-converter-depth-warning' => '言語変換機能の深さ($1)が制限を超えました',
+'parser-template-recursion-depth-warning' => 'テンプレートの再帰の深さ ($1) が上限を超えました',
+'language-converter-depth-warning' => '言語変換機能の深さ ($1) が制限を超えました',
'node-count-exceeded-category' => 'ノード数が制限を超えたページ',
'node-count-exceeded-warning' => 'ページがノード数の制限を超えました',
'expansion-depth-exceeded-category' => '展開の深さ制限を超えたページ',
'expansion-depth-exceeded-warning' => 'ページが展開の深さ制限を超えました',
-'parser-unstrip-loop-warning' => 'Unstrip のループが検出されました',
-'parser-unstrip-recursion-limit' => 'Unstrip の再帰($1)が上限を超えました',
+'parser-unstrip-loop-warning' => 'unstrip のループを検出しました',
+'parser-unstrip-recursion-limit' => 'unstrip の再帰 ($1) が上限を超えました',
'converter-manual-rule-error' => '手動の言語変換規則でエラーを検出しました。',
# "Undo" feature
追加の制限がかけられない限り、{{SITENAME}}の他の管理者は同じインターフェイスを使って非表示の内容の取得や復元ができます。",
'revdelete-confirm' => 'この操作を行おうとしていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に従っていること、を確認してください。',
'revdelete-suppress-text' => "秘匿は、'''以下の場合に限って'''使用すべきです:
-* 名誉毀損の恐れのある記述
+* 名誉毀損のおそれがある記述
* 非公開個人情報
*: ''自宅の住所、電話番号、社会保障番号など''",
'revdelete-legend' => '閲覧レベル制限を設定',
'mergehistory' => 'ページの履歴の統合',
'mergehistory-header' => 'このページでは、ある元ページの履歴を新しいページに統合できます。
この変更を行ってもページの履歴の連続性が確実に保たれるようにしてください。',
-'mergehistory-box' => '2ページの過去の版を統合する:',
-'mergehistory-from' => '統合元となるページ:',
-'mergehistory-into' => '統合先のページ:',
+'mergehistory-box' => '2ページの過去の版を統合する:',
+'mergehistory-from' => '統合元となるページ:',
+'mergehistory-into' => '統合先のページ:',
'mergehistory-list' => '統合できる編集履歴',
'mergehistory-merge' => '以下の [[:$1]] の履歴を [[:$2]] に統合できます。
特定の日時以前に作成された版のみを統合するには、ラジオボタンで版を選択してください。
'mergehistory-invalid-source' => '統合元のページは有効な名前でなければなりません。',
'mergehistory-invalid-destination' => '統合先のページは有効な名前でなければなりません。',
'mergehistory-autocomment' => '[[:$1]]を[[:$2]]に統合',
-'mergehistory-comment' => '[[:$1]]を[[:$2]]に統合:$3',
+'mergehistory-comment' => '[[:$1]]を[[:$2]]に統合: $3',
'mergehistory-same-destination' => '統合元と統合先のページを同じにはできません',
-'mergehistory-reason' => '理由:',
+'mergehistory-reason' => '理由:',
# Merge log
'mergelog' => '統合記録',
-'pagemerge-logentry' => '[[$1]]を[[$2]]に統合($3 版まで)',
+'pagemerge-logentry' => '[[$1]]を[[$2]]に統合 ($3 版まで)',
'revertmerge' => '統合解除',
'mergelogpagetext' => '以下は、最近行われたあるページから別のページへの統合の一覧です。',
# Diffs
'history-title' => '「$1」の変更履歴',
-'difference-title' => '$1:版間の差分',
-'difference-title-multipage' => '$1 と $2:ページ間の差分',
+'difference-title' => '「$1」の版間の差分',
+'difference-title-multipage' => 'ページ「$1」と「$2」の間の差分',
'difference-multipage' => '(ページ間の差分)',
-'lineno' => '$1行:',
+'lineno' => '$1行:',
'compareselectedversions' => '選択した版同士を比較',
'showhideselectedversions' => '選択した版を表示/非表示',
'editundo' => '取り消し',
'searchresults' => '検索結果',
'searchresults-title' => '「$1」の検索結果',
'searchresulttext' => '{{SITENAME}}の検索に関する詳しい情報は、[[{{MediaWiki:Helppage}}|{{int:help}}]]をご覧ください。',
-'searchsubtitle' => "'''[[:$1]]'''の検索([[Special:Prefixindex/$1|「$1」から始まるページ]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|「$1」へリンクしている全ページ]])",
+'searchsubtitle' => "'''[[:$1]]'''の検索 ([[Special:Prefixindex/$1|「$1」から始まるページ]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|「$1」へリンクしている全ページ]])",
'searchsubtitleinvalid' => "'''$1'''を検索しました",
'toomanymatches' => '一致したページが多すぎます。他の検索語を指定してください。',
'titlematches' => 'ページ名と一致',
'showingresults' => "'''$2''' 件目以降の最大 {{PLURAL:$1|'''$1''' 件の結果}}を表示しています。",
'showingresultsnum' => "'''$2''' 件目以降の {{PLURAL:$3|'''$3''' 件の結果}}を表示しています。",
'showingresultsheader' => "「'''$4'''」の検索結果 {{PLURAL:$5|'''$3''' 件中の '''$1''' 件目|'''$3''' 件中の '''$1''' 件目から '''$2''' 件目}}",
-'nonefound' => "'''注意''': 既定では一部の名前空間のみを検索します。
-''all:''を前に付けると、すべて(トークページやテンプレートなどを含む)を対象にできます。検索する名前空間を前に付けることもできます。",
+'nonefound' => "'''注意:''' 既定では一部の名前空間のみを検索します。
+''all:''を前に付けると、すべて (トークページやテンプレートなどを含む) を対象にできます。検索する名前空間を前に付けることもできます。",
'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
'powersearch' => '高度な検索',
'powersearch-legend' => '高度な検索',
'timezonelegend' => 'タイムゾーン:',
'localtime' => 'ローカルの時刻:',
'timezoneuseserverdefault' => 'ウィキの既定を使用 ($1)',
-'timezoneuseoffset' => 'その他(時差を指定)',
+'timezoneuseoffset' => 'その他 (時差を指定)',
'timezoneoffset' => '時差¹:',
'servertime' => 'サーバーの時刻:',
'guesstimezone' => 'ブラウザーの設定から入力',
'prefs-displaywatchlist' => '表示の設定',
'prefs-diffs' => '差分',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'メールアドレスは有効のようです',
'email-address-validity-invalid' => '有効なメールアドレスを入力してください',
'userrights-groups-help' => 'この利用者が属するグループを変更できます。
* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。
* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。
-* 「*」はグループに一旦追加した場合に除去(あるいはその逆)ができないことを示しています。',
+* 「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。',
'userrights-reason' => '理由:',
'userrights-no-interwiki' => '他ウィキ上における利用者権限の編集権限はありません。',
'userrights-nodatabase' => 'データベース$1は存在しないか、ローカル上にありません。',
# Rights
'right-read' => 'ページを閲覧',
'right-edit' => 'ページを編集',
-'right-createpage' => 'ページ(議論ページ以外)を作成',
+'right-createpage' => 'ページ (議論ページ以外) を作成',
'right-createtalk' => '議論ページを作成',
'right-createaccount' => '新しい利用者アカウントを作成',
'right-minoredit' => '細部の編集の印を付ける',
'right-bigdelete' => '大きな履歴があるページを削除',
'right-deletelogentry' => '特定の記録項目を削除/復元',
'right-deleterevision' => 'ページの特定の版を削除/復元',
-'right-deletedhistory' => '削除された履歴項目(関連する本文を除く)を閲覧',
+'right-deletedhistory' => '削除された履歴項目 (関連する本文を除く) を閲覧',
'right-deletedtext' => '削除された本文と削除された版間の差分を閲覧',
'right-browsearchive' => '削除されたページを検索',
'right-undelete' => 'ページを復元',
'right-proxyunbannable' => 'プロキシの自動ブロックを回避',
'right-unblockself' => '自身に対するブロックを解除',
'right-protect' => '保護レベルを変更し、保護されたページを編集',
-'right-editprotected' => '保護ページ(カスケード保護を除く)を編集',
+'right-editprotected' => '保護ページ (カスケード保護を除く) を編集',
'right-editinterface' => 'ユーザーインターフェイスを編集',
'right-editusercssjs' => '他の利用者のCSSファイル/JavaScriptファイルを編集',
'right-editusercss' => '他の利用者のCSSファイルを編集',
'boteditletter' => 'ボ',
'unpatrolledletter' => '!',
'number_of_watching_users_pageview' => '[{{PLURAL:$1|$1 人の利用者}}がウォッチしています]',
-'rc_categories' => 'カテゴリを限定(「|」で区切る)',
+'rc_categories' => 'カテゴリを限定 (「|」で区切る)',
'rc_categories_any' => 'すべて',
'rc-change-size' => '$1',
'rc-change-size-new' => '変更後は $1 {{PLURAL:$1|バイト}}',
'newsectionsummary' => '/* $1 */ 新しい節',
-'rc-enhanced-expand' => '詳細を表示(JavaScript が必要)',
+'rc-enhanced-expand' => '詳細を表示 (JavaScript が必要)',
'rc-enhanced-hide' => '詳細を非表示',
'rc-old-title' => '作成時のページ名は「$1」',
'recentchangeslinked-toolbox' => '関連ページの更新状況',
'recentchangeslinked-title' => '「$1」と関連する変更',
'recentchangeslinked-noresult' => '指定期間中に指定ページのリンク先に変更はありませんでした。',
-'recentchangeslinked-summary' => "これは指定したページからリンクされている(または指定したカテゴリに含まれている)ページの最近の変更の一覧です。
+'recentchangeslinked-summary' => "これは指定したページからリンクされている (または指定したカテゴリに含まれている) ページの最近の変更の一覧です。
[[Special:Watchlist|自分のウォッチリスト]]にあるページは'''太字'''で表示されます。",
'recentchangeslinked-page' => 'ページ名:',
'recentchangeslinked-to' => 'このページへのリンク元での変更の表示に切り替え',
新しい概要を表示させるには、説明ページを手動で編集する必要があります。
[[$1|thumb]]',
'fileexists-extension' => '類似した名前のファイルが既に存在します: [[$2|thumb]]
-* アップロード中のファイルの名前:<strong>[[:$1]]</strong>
+* アップロード中のファイルの名前: <strong>[[:$1]]</strong>
* 既存ファイルの名前: <strong>[[:$2]]</strong>
違う名前を選択してください。',
-'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの''(サムネイル)''のようです。
+'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの ''(サムネイル)'' のようです。
[[$1|thumb]]
-ファイル<strong>[[:$1]]</strong>を確認してください。
+ファイル <strong>[[:$1]]</strong> を確認してください。
確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
-'file-thumbnail-no' => "ファイル名が<strong>$1</strong>から始まっています。
-他の画像から縮小されたもの''(サムネイル)''のようです。
+'file-thumbnail-no' => "ファイル名が <strong>$1</strong> で始まっています。
+他の画像から縮小されたもの ''(サムネイル)'' のようです。
より高精細な画像をお持ちの場合はそれをアップロードしてください。お持ちではない場合はファイル名を変更してください。",
'fileexists-forbidden' => 'この名前のファイルは既に存在しており、上書きできません。
アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
'fileexists-shared-forbidden' => 'この名前のファイルは共有ファイルリポジトリに既に存在しています。
アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
[[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'このファイルは以下の{{PLURAL:$1|ファイル|ファイル群}}と重複しています:',
-'file-deleted-duplicate' => 'このファイル([[:$1]])と同一のファイルが以前に削除されています。
+'file-exists-duplicate' => 'このファイルは以下の{{PLURAL:$1|ファイル|ファイル群}}と重複しています:',
+'file-deleted-duplicate' => 'このファイル ([[:$1]]) と同一のファイルが以前に削除されています。
再度アップロードをする前に、以前削除されたファイルの削除記録を確認してください。',
'uploadwarning' => 'アップロード警告',
'uploadwarning-text' => '下記のファイル解説を修正して再試行してください。',
それでもこのエラーが発生する場合は、[[Special:ListUsers/sysop|管理者]]に連絡してください。',
'upload-too-many-redirects' => 'そのURLに含まれるリダイレクトが多すぎます',
'upload-unknown-size' => 'サイズ不明',
-'upload-http-error' => 'HTTPエラー発生:$1',
+'upload-http-error' => 'HTTP エラー発生: $1',
'upload-copy-upload-invalid-domain' => 'このドメインからのアップロードは許可されていません。',
# File backend
'img-auth-bad-query-string' => 'URLの中に無効なクエリ文字列があります。',
# HTTP errors
-'http-invalid-url' => '無効なURL:$1',
+'http-invalid-url' => '無効なURL: $1',
'http-invalid-scheme' => 'スキーム「$1」の URL には未対応です。',
'http-request-error' => '不明なエラーによりHTTPリクエストに失敗しました。',
'http-read-error' => 'HTTP読み込みエラーです。',
'http-timed-out' => 'HTTP要求がタイムアウトしました。',
'http-curl-error' => 'URLからの取得に失敗しました: $1',
'http-host-unreachable' => 'URLに到達できません。',
-'http-bad-status' => 'HTTP要求中に問題が発生しました:$1$2',
+'http-bad-status' => 'HTTP リクエストで問題が発生しました: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URLに到達できませんでした',
'filehist-comment' => 'コメント',
'filehist-missing' => 'ファイルがありません',
'imagelinks' => 'ファイルの使用状況',
-'linkstoimage' => '以下の {{PLURAL:$1| ページ|$1 ページ}}が、このファイルへリンクしています:',
+'linkstoimage' => '以下の{{PLURAL:1|ページ| $1 ページ}}がこのファイルにリンクしています:',
'linkstoimage-more' => 'このファイルへは $1 を超える数のページからリンクがあります。
以下の一覧ではこのファイルにリンクしている最初の $1 ページのみを表示しています。
[[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。',
# Random page
'randompage' => 'おまかせ表示',
-'randompage-nopages' => '以下の{{PLURAL:$2|名前空間}}にはページがありません:$1。',
+'randompage-nopages' => '以下の{{PLURAL:$2|名前空間}}にはページがありません: $1',
# Random redirect
'randomredirect' => 'おまかせリダイレクト',
これらのリンクは、より適切なページへのリンクに変更する必要があります。<br />
[[MediaWiki:Disambiguationspage]] にリンクがあるテンプレートを使用しているページを、曖昧さ回避ページと見なします。",
+'pageswithprop' => 'ページプロパティがあるページ',
+'pageswithprop-legend' => 'ページプロパティがあるページ',
+'pageswithprop-text' => 'このページでは、特定のページプロパティを持つページを列挙します。',
+'pageswithprop-prop' => 'プロパティ名:',
+'pageswithprop-submit' => '実行',
+
'doubleredirects' => '二重転送',
'doubleredirectstext' => 'このページでは、転送ページへの転送ページを列挙します。
最初の転送ページ、その転送先にある転送ページ、さらにその転送先にあるページ、それぞれへのリンクを各行に表示しています。多くの場合は最終的な転送先が「正しい」転送先であり、最初の転送ページの転送先は最終的な転送先に直接向けるべきです。
'allpagesprev' => '前へ',
'allpagesnext' => '次へ',
'allpagessubmit' => '表示',
-'allpagesprefix' => '次の文字列から始まるページを表示:',
+'allpagesprefix' => '次の文字列から始まるページを表示:',
'allpagesbadtitle' => '指定したページ名は無効か、言語間またはインターウィキ接頭辞を含んでいます。
ページ名に使用できない文字が1つ以上含まれている可能性があります。',
'allpages-bad-ns' => '{{SITENAME}}に「$1」という名前空間はありません。',
'categoriespagetext' => '以下の{{PLURAL:$1|カテゴリ}}にはページまたはメディアがあります。
[[Special:UnusedCategories|未使用のカテゴリ]]はここには表示していません。
[[Special:WantedCategories|望まれるカテゴリ]]も参照してください。',
-'categoriesfrom' => '最初に表示するカテゴリ:',
+'categoriesfrom' => '最初に表示するカテゴリ:',
'special-categories-sort-count' => '項目数順に並べ替え',
'special-categories-sort-abc' => '辞書順に並べ替え',
'listgrouprights-members' => '(該当者一覧)',
'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 (<code>$2</code>)</span>',
'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 (<code>$2</code>)</span>',
-'listgrouprights-addgroup' => '{{PLURAL:$2|グループ}}を追加:$1',
-'listgrouprights-removegroup' => '{{PLURAL:$2|グループ}}を除去:$1',
+'listgrouprights-addgroup' => '{{PLURAL:$2|グループ}}を追加: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|グループ}}を除去: $1',
'listgrouprights-addgroup-all' => '全グループを追加可能',
'listgrouprights-removegroup-all' => '全グループを除去可能',
-'listgrouprights-addgroup-self' => '自分のアカウントに{{PLURAL:$2|グループ}}を追加:$1',
-'listgrouprights-removegroup-self' => '自分のアカウントから{{PLURAL:$2|グループ}}を除去:$1',
-'listgrouprights-addgroup-self-all' => '自分のアカウントに全グループを追加可能',
-'listgrouprights-removegroup-self-all' => '自分のアカウントから全グループを除去可能',
+'listgrouprights-addgroup-self' => '自身のアカウントに{{PLURAL:$2|グループ}}を追加: $1',
+'listgrouprights-removegroup-self' => '自身のアカウントから{{PLURAL:$2|グループ}}を除去: $1',
+'listgrouprights-addgroup-self-all' => '自身のアカウントに全グループを追加可能',
+'listgrouprights-removegroup-self-all' => '自身のアカウントから全グループを除去可能',
-# E-mail user
+# Email user
'mailnologin' => '送信アドレスがありません',
'mailnologintext' => '他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。',
'emailuser' => 'この利用者にメールを送信',
'emailpage' => '利用者にメールを送信',
'emailpagetext' => '以下のフォームを使用してこの{{GENDER:$1|利用者}}にメールを送信できます。
「差出人」として、[[Special:Preferences|利用者の個人設定]]で入力したメールアドレスが設定されます。これにより、受信者があなたに直接返信できるようになります。',
-'usermailererror' => 'メールが以下のエラーを返しました:',
+'usermailererror' => 'メールが以下のエラーを返しました:',
'defemailsubject' => '{{SITENAME}} 利用者「$1」からのメール',
'usermaildisabled' => '利用者メール機能は無効です',
'usermaildisabledtext' => 'このウィキでは他の利用者にメールを送信できません',
$PAGEINTRO $NEWPAGE
-編集内容の要約:$PAGESUMMARY($PAGEMINOREDIT)
+編集内容の要約: $PAGESUMMARY ($PAGEMINOREDIT)
-投稿者の連絡先:
-メール:$PAGEEDITOR_EMAIL
-ウィキ:$PAGEEDITOR_WIKI
+投稿者の連絡先:
+メール: $PAGEEDITOR_EMAIL
+ウィキ: $PAGEEDITOR_WIKI
このページを訪れない限り、これ以上の活動に対する通知は送信されません。ウォッチリスト内のすべてのページについて、通知を再設定することもできます。
{{SITENAME}}通知システム
--
-メール通知の設定は、以下のページで変更してください:
+メール通知の設定は、以下のページで変更してください:
{{canonicalurl:{{#special:Preferences}}}}
-ウォッチリストの設定は、以下のページで変更してください:
+ウォッチリストの設定は、以下のページで変更してください:
{{canonicalurl:{{#special:EditWatchlist}}}}
-このページは、以下のページでウォッチリストから削除できます:
+このページは、以下のページでウォッチリストから削除できます:
$UNWATCHURL
-ご意見、お問い合わせ:
+ご意見、お問い合わせ:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
'created' => '作成',
'changed' => '変更',
'rollbackfailed' => '巻き戻しに失敗しました',
'cantrollback' => '編集を差し戻せません。
最後の投稿者が、このページの唯一の作者です。',
-'alreadyrolled' => 'ページ[[:$1]]の[[User:$2|$2]]([[User talk:$2|トーク]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])による編集を巻き戻せません。
+'alreadyrolled' => 'ページ[[:$1]]の[[User:$2|$2]] ([[User talk:$2|トーク]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) による編集を巻き戻せません。
他の利用者が既に編集または巻き戻しを行ったためです。
-このページの最後の編集は[[User:$3|$3]]([[User talk:$3|トーク]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])によるものです。',
+このページの最後の編集は[[User:$3|$3]] ([[User talk:$3|トーク]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) によるものです。',
'editcomment' => "編集内容の要約:「''$1''」",
-'revertpage' => '[[Special:Contributions/$2|$2]]([[User talk:$2|トーク]])による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
-'revertpage-nouser' => '(利用者名削除)による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
+'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
+'revertpage-nouser' => '(利用者名削除) による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
'rollback-success' => '$1による編集を差し戻しました。
$2による直前の版へ変更されました。',
** 高負荷ページ',
'protect-edit-reasonlist' => '保護理由を編集',
'protect-expiry-options' => '1時間:1 hour,1日:1 day,1週間:1 week,2週間:2 weeks,1か月:1 month,3か月:3 months,6か月:6 months,1年:1 year,無期限:infinite',
-'restriction-type' => '許可:',
-'restriction-level' => '制限レベル:',
+'restriction-type' => '許可:',
+'restriction-level' => '制限レベル:',
'minimum-size' => '最小サイズ',
-'maximum-size' => '最大サイズ:',
+'maximum-size' => '最大サイズ:',
'pagesize' => '(バイト)',
# Restrictions (nouns)
'unblockip' => 'ブロックを解除',
'unblockiptext' => '以下のフォームで利用者またはIPアドレスのブロックを解除できます。',
'ipusubmit' => 'このブロックを解除',
-'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
-'unblocked-range' => '$1のブロックを解除しました',
-'unblocked-id' => 'ブロック$1を除去しました',
+'unblocked' => '[[User:$1|$1]]のブロックを解除しました。',
+'unblocked-range' => '$1のブロックを解除しました。',
+'unblocked-id' => 'ブロック$1を除去しました。',
'blocklist' => 'ブロックされている利用者',
'ipblocklist' => 'ブロックされている利用者',
'ipblocklist-legend' => 'ブロックされている利用者の検索',
移動先が既に存在する場合は、そのページが転送ページであり、かつ過去の版を持たない場合を除いて移動'''できません'''。
つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
-'''警告!'''
+'''警告!'''
多く閲覧されるページや多くリンクされているページを移動すると、予期しない大きな変化が起こるかもしれないことにご注意ください。
ページの移動に伴う影響をよく考えてから移動してください。",
'movepagetalktext' => "関連付けられたトークページも一緒に、自動的に移動されます。ただし、'''以下の場合を除きます:'''
'importbadinterwiki' => 'ウィキ間リンクが正しくありません',
'importnotext' => '内容が空、または本文がありません',
'importsuccess' => '取り込みが完了しました!',
-'importhistoryconflict' => '取り込み時にいくつかの版が競合しました(以前に同じページが取り込まれているかもしれません)',
+'importhistoryconflict' => '取り込み時にいくつかの版が競合しました (以前に同じページが取り込まれているかもしれません)',
'importnosources' => 'ウィキ間移動の取り込み元が定義されていないため、履歴の直接アップロードは無効になっています。',
'importnofile' => '取り込みファイルはアップロードされませんでした。',
'importuploaderrorsize' => '取り込みファイルのアップロードに失敗しました。
ファイルの一部のみアップロードされました。',
'importuploaderrortemp' => '取り込みファイルのアップロードに失敗しました。
一時フォルダーがありません。',
-'import-parse-failure' => 'XMLの取り込み構文解析に失敗しました',
+'import-parse-failure' => 'XML取り込みの構文解析に失敗しました',
'import-noarticle' => '取り込むページがありません!',
'import-nonewrevisions' => 'すべての版は以前に取り込み済みです。',
'xml-error-string' => '$1、$2 行の $3 文字目 ($4バイト目): $5',
'import-invalid-interwiki' => '指定されたウィキから取り込めませんでした。',
'import-error-edit' => 'あなたにそのページを編集する許可がないため、ページ「$1」は取り込まれませんでした。',
'import-error-create' => 'あなたにそのページを作成する許可がないため、ページ「$1」は取り込まれませんでした。',
-'import-error-interwiki' => '名前が外部リンク (interwiki) に予約されているため、ページ「$1」を取り込みませんでした。',
+'import-error-interwiki' => 'ページ名が外部リンク (ウィキ間リンク) に予約されているため、ページ「$1」を取り込みませんでした。',
'import-error-special' => 'ページ「$1」は、ページが許可されない特別名前空間に属しているため取り込みません。',
'import-error-invalid' => '名前が正しくないため、ページ「$1」を取り込みませんでした。',
+'import-error-unserialize' => 'ページ「$1」の版 $2 は直列化復元できませんでした。この版は $4 として直列化されたコンテンツモデル $3 を使用していると報告されています。',
'import-options-wrong' => '間違った{{PLURAL:$2|オプション}}です: <nowiki>$1</nowiki>',
-'import-rootpage-invalid' => 'å\85¥å\8a\9bã\81\95ã\82\8cã\81\9fã\83«ã\83¼ã\83\88 ã\83\9aã\83¼ã\82¸ã\81®å\90\8då\89\8dã\81\8c無効です。',
-'import-rootpage-nosubpage' => 'ルート ページの名前空間「$1」では、下位ページが許可されていません。',
+'import-rootpage-invalid' => 'å\85¥å\8a\9bã\81\97ã\81\9fã\83«ã\83¼ã\83\88ã\83\9aã\83¼ã\82¸ã\81®å\90\8då\89\8dã\81¯無効です。',
+'import-rootpage-nosubpage' => 'ルートページの名前空間「$1」では、下位ページが許可されていません。',
# Import log
'importlogpage' => '取り込み記録',
'javascripttest-title' => '$1 のテストの実行',
'javascripttest-pagetext-noframework' => 'このページは JavaScript のテストを実行するために予約されています。',
'javascripttest-pagetext-unknownframework' => 'テストフレームワーク「$1」は不明です。',
-'javascripttest-pagetext-frameworks' => '次のテストフレームワークからひとつを選択してください:$1',
-'javascripttest-pagetext-skins' => 'テストを実行する外装を選択してください:',
+'javascripttest-pagetext-frameworks' => '以下のテストフレームワークから1つ選択してください: $1',
+'javascripttest-pagetext-skins' => 'テストを実行する外装を選択してください:',
'javascripttest-qunit-intro' => 'mediawiki.org上の[$1 テストのドキュメント]を参照してください。',
'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit テストスイート',
'spamprotectiontitle' => 'スパム防御フィルター',
'spamprotectiontext' => '保存しようとした文章はスパムフィルターによってブロックされました。
これはおそらく、ブラックリストにある外部サイトへのリンクが原因で発生します。',
-'spamprotectionmatch' => '以下の文章はスパムフィルターが発動したものです:$1',
+'spamprotectionmatch' => '以下の文章はスパムフィルターが発動したものです: $1',
'spambot_username' => 'MediaWikiスパム除去',
'spam_reverting' => '$1へのリンクを含まない最新の版に差し戻し',
'spam_blanking' => 'すべての版が$1へのリンクを含んでいます。白紙化します。',
'just-now' => 'ちょうど今',
# Bad image list
-'bad_image_list' => '書式は以下の通りです:
+'bad_image_list' => '書式は以下の通りです:
-箇条書き項目(*で始まる行)のみが考慮されます。
-各行最初のリンクは、好ましくないファイルへのリンクとしてください。
-å\90\8cã\81\98è¡\8cã\81§それ以降にあるリンクは例外、つまりインライン挿入されてもいいページと見なされます。',
+箇条書き項目 (*で始まる行) のみが考慮されます。
+各行の最初のリンクは、好ましくないファイルへのリンクにしてください。
+å\90\8cã\81\98è¡\8cã\81®それ以降にあるリンクは例外、つまりインライン挿入されてもいいページと見なされます。',
/*
Short names for language variants used for language conversion links.
'exif-gpslongitude' => '経度',
'exif-gpsaltituderef' => '高度の基準',
'exif-gpsaltitude' => '高度',
-'exif-gpstimestamp' => 'GPS日時(原子時計)',
+'exif-gpstimestamp' => 'GPS日時 (原子時計)',
'exif-gpssatellites' => '測位に用いた衛星信号',
'exif-gpsstatus' => 'GPS受信機の状態',
'exif-gpsmeasuremode' => 'GPSの測位方法',
'exif-label' => 'ラベル',
'exif-datetimemetadata' => 'メタデータの最終更新日',
'exif-nickname' => '画像の非公式名',
-'exif-rating' => '評価(5点満点)',
+'exif-rating' => '評価 (5点満点)',
'exif-rightscertificate' => '権利管理証明書',
'exif-copyrighted' => '著作権情報',
'exif-copyrightowner' => '著作権者',
'monthsall' => 'すべて',
'limitall' => 'すべて',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'メールアドレスの確認',
'confirmemail_noemail' => '[[Special:Preferences|個人設定]]で有効なメールアドレスが指定されていません。',
'confirmemail_text' => '{{SITENAME}}では、メール機能を使用する前にメールアドレスの検証が必要です。
$3
もしアカウントの登録をした覚えがない場合は、
-次のURLをブラウザーで開いて、メールアドレスの確認を中止してください:
+次のURLをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:
$5
この確認用コードは、$4に期限切れになります。',
-'confirmemail_body_changed' => '誰か(おそらくあなた)が IP アドレス $1 から、
+'confirmemail_body_changed' => '誰か (おそらくあなた) が IP アドレス $1 から、
{{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに変更しました。
このアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて、
-{{SITENAME}} のメール機能を再び有効にしてください:
+{{SITENAME}} のメール機能を再び有効にしてください:
$3
もしあなたのアカウント *ではない* 場合は、
-ブラウザーで以下のリンクを開いて、メールアドレスの確認をキャンセルしてください:
+ブラウザーで以下のリンクを開いて、メールアドレスの確認をキャンセルしてください:
$5
この確認コードは $4 に期限切れになります。',
-'confirmemail_body_set' => '誰か(おそらくあなた)が IP アドレス $1 から
+'confirmemail_body_set' => '誰か (おそらくあなた) が IP アドレス $1 から
{{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに設定しました。
このアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて、
$3
もしあなたのアカウントではない場合は、
-次のリンクをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:
+次のリンクをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:
$5
この確認コードは $4 に期限切れになります。',
'confirmemail_invalidated' => 'メールアドレスの確認が中止されました',
-'invalidateemail' => 'メールアドレスの認証中止',
+'invalidateemail' => 'メールアドレスの確認中止',
# Scary transclusion
'scarytranscludedisabled' => '[ウィキ間の参照読み込みは無効になっています]',
'scarytranscludetoolong' => '[URLが長すぎます]',
# Delete conflict
-'deletedwhileediting' => "'''警告''': このページが、編集開始後に削除されました!",
+'deletedwhileediting' => "'''警告:''' このページが、編集開始後に削除されました!",
'confirmrecreate' => "あなたが編集を開始した後、[[User:$1|$1]] ([[User talk:$1|トーク]]) がこのページを以下の理由で削除しました:
: ''$2''
このままこのページを本当に再作成していいか確認してください。",
'hebrew-calendar-m12-gen' => 'エルール',
# Signatures
-'signature' => '[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|トーク]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|トーク]])',
# Core parser functions
'unknown_extension_tag' => '不明な拡張機能タグ「$1」です',
'version-poweredby-credits' => "このウィキは、'''[//www.mediawiki.org/ MediaWiki]'''(copyright © 2001-$1 $2)で動作しています。",
'version-poweredby-others' => 'その他',
'version-credits-summary' => '[[Special:Version|MediaWiki]] に貢献した以下の人たちに感謝します。',
-'version-license-info' => 'MediaWikiはフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約に基づき、このライブラリを再配布および改変できます。
+'version-license-info' => 'MediaWikiはフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License) (バージョン2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。
MediaWikiは、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。詳しくは、GNU一般公衆利用許諾書をご覧ください。
-あなたはこのプログラムと共に、[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU一般公衆利用許諾契約書の複製]を受け取ったはずです。もし受け取っていなければ、フリーソフトウェア財団(the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA)まで請求するか、[//www.gnu.org/licenses/old-licenses/gpl-2.0.html オンラインで閲覧]してください。',
+あなたはこのプログラムと共に、[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU一般公衆利用許諾契約書の複製]を受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA) まで請求するか、[//www.gnu.org/licenses/old-licenses/gpl-2.0.html オンラインで閲覧]してください。',
'version-software' => 'インストール済みソフトウェア',
'version-software-product' => '製品',
'version-software-version' => 'バージョン',
# External image whitelist
'external_image_whitelist' => ' #この行はこのままにしておいてください<pre>
-#この下に正規表現(//の間に入る記述)を置いてください
-#外部の(ホットリンクされている)画像の URL と一致するか検査されます
+#この下に正規表現 (//の間に入る記述) を置いてください
+#外部の (ホットリンクされている) 画像の URL と一致するか検査されます
#一致する場合は画像として、一致しない場合は画像へのリンクとして表示されます
#行の頭に # を付けるとコメントとして扱われます
#大文字と小文字は区別されません
# Special:Tags
'tags' => '有効な変更タグ',
-'tag-filter' => '[[Special:Tags|タグ]]絞り込み:',
+'tag-filter' => '[[Special:Tags|タグ]]絞り込み:',
'tag-filter-submit' => '絞り込み',
'tags-title' => 'タグ',
'tags-intro' => 'このページは、ソフトウェアが編集に対して付けるタグとその意味の一覧です。',
'htmlform-selectorother-other' => 'その他',
# SQLite database support
-'sqlite-has-fts' => '$1(全文検索あり)',
-'sqlite-no-fts' => '$1(全文検索なし)',
+'sqlite-has-fts' => '$1 (全文検索あり)',
+'sqlite-no-fts' => '$1 (全文検索なし)',
# New logging system
'logentry-delete-delete' => '$1 がページ「$3」を削除しました',
'logentry-delete-restore' => '$1 がページ「$3」を復元しました',
-'logentry-delete-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを変更しました:$4',
-'logentry-delete-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを変更しました:$4',
+'logentry-delete-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを変更しました: $4',
+'logentry-delete-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを変更しました: $4',
'logentry-delete-event-legacy' => '$1 が「$3」の記録項目の閲覧レベルを変更しました',
'logentry-delete-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを変更しました',
'logentry-suppress-delete' => '$1 がページ「$3」を隠蔽しました',
-'logentry-suppress-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを見えない形で変更しました:$4',
-'logentry-suppress-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で変更しました:$4',
+'logentry-suppress-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを見えない形で変更しました: $4',
+'logentry-suppress-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で変更しました: $4',
'logentry-suppress-event-legacy' => '$1 が$3で記録項目の閲覧レベルを見えない形で変更しました',
'logentry-suppress-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを見えない形で変更しました',
'revdelete-content-hid' => '本文の不可視化',
# Feedback
'feedback-bugornote' => '技術的な問題の詳細を説明する準備ができている場合は、[$1 バグ報告]をお願いします。
準備ができていない場合は、下の簡易フォームを使用してください。あなたのコメントと利用者名が、ページ「[$3 $2]」に追加されます。',
-'feedback-subject' => '件名:',
-'feedback-message' => 'メッセージ:',
+'feedback-subject' => '件名:',
+'feedback-message' => 'メッセージ:',
'feedback-cancel' => 'キャンセル',
'feedback-submit' => 'フィードバックを送信',
'feedback-adding' => 'ページへのフィードバックの追加...',
'duration-centuries' => '$1 {{PLURAL:$1|世紀}}',
'duration-millennia' => '$1{{PLURAL:$1|,000 年}}',
+# Image rotation
+'rotate-comment' => '画像を時計回りに $1 {{PLURAL:$1|度}}回転',
+
);
'loginlanguagelabel' => 'ენა: $1',
'suspicious-userlogout' => 'თქვენი მოთხოვნა გასვლის შესახებ გაუქმებულია, რადგანაც იგი გავს ქეშირებადი პროქსის ან არაკორექტული ბრაუზერის მოთხოვნას.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'ამოუცნობი შეცდომა PHP-ის mail() ფუნქციაში',
'user-mail-no-addy' => 'ცდილობდა ელ-ფოსტის გაგზავნას ელ-ფოსტის მისამართის გარეშე.',
'user-mail-no-body' => 'ცდილობდა ცარიელი ან უაზროდ მოკლე შინაარსის ელექტრონული წერილის გაგზავნას.',
'revdelete-hide-name' => 'დამალეთ მოქმედება და მისი ობიექტი',
'revdelete-hide-comment' => 'რედაქტირების კომენტარის დამალვა',
'revdelete-hide-user' => 'რედაქტორის მომხ. სახელის/IP-ს დამალვა',
-'revdelete-hide-restricted' => 'á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\94á\83\91á\83\98 á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\97á\83\90á\83\92á\83\90á\83\9cá\83\90á\83ª',
+'revdelete-hide-restricted' => 'á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\94á\83\91á\83\98 á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\98á\83¡á\83¢á\83 á\83\90á\83¢á\83\9dá\83 á\83\97á\83\90á\83\92á\83\90á\83\9c',
'revdelete-radio-same' => '(არ შეცვალოთ)',
'revdelete-radio-set' => 'დიახ',
'revdelete-radio-unset' => 'არა',
-'revdelete-suppress' => 'á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\94á\83\91á\83\98 á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\97á\83\90á\83\92á\83\90á\83\9cá\83\90á\83ª',
+'revdelete-suppress' => 'á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\94á\83\97 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\94á\83\91á\83\98 á\83\90á\83\93á\83\9bá\83\98á\83\9cá\83\98á\83¡á\83¢á\83 á\83\90á\83¢á\83\9dá\83 á\83\97á\83\90á\83\92á\83\90á\83\9c',
'revdelete-unsuppress' => 'მოხსენით შეზღუდვა ვერსიების აღდგენისგან',
'revdelete-log' => 'მიზეზი:',
'revdelete-submit' => '{{PLURAL:$1|არჩეული ვერსიის|არჩეული ვერსიების}} განხორციელება',
'prefs-displaywatchlist' => 'გამოსახვის კონფიგურაციები',
'prefs-diffs' => 'სხვაობა ვერსიებს შორის',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'ელ-ფოსტის მისამართი სწორად გამოიყურება',
'email-address-validity-invalid' => 'მიუთითეთ სწორი ელ-ფოსტის მისამართი',
'newsectionsummary' => '/* $1 */ ახალი სექცია',
'rc-enhanced-expand' => 'დამატებითი ინფორმაციის ჩვენება (მოითხოვს ჯავასკრიპტს)',
'rc-enhanced-hide' => 'დამატებითი ინფორმაციის დამალვა',
-'rc-old-title' => 'თავდაპირველად შექმნილი როგორც "$1"',
+'rc-old-title' => 'თავდაპირველად შექმნილი როგორც „$1“',
# Recent changes linked
'recentchangeslinked' => 'დაკავშირებული ცვლილებები',
'statistics-pages' => 'გვერდები',
'statistics-pages-desc' => 'ვიკის ყველა გვერდი, განხილვის, გადამისამართების და სხვ. ჩათვლით.',
'statistics-files' => 'ატვირთული ფაილები',
-'statistics-edits' => 'გვერდის შესწორებები {{SITENAME}}-ის შექმნიდან',
+'statistics-edits' => 'გვერდის შესწორებები პროექტის {{SITENAME}} შექმნის შემდეგ',
'statistics-edits-average' => 'რედაქტირების საერთო რაოდენობა გვერდზე',
'statistics-views-total' => 'სულ ხილვა',
'statistics-views-total-desc' => 'სათვალავში არ მიიღება არარსებული და სამუშაო გვერდების გადახედვა',
ამის ნაცვლად, სავარაუდოდ, ისისნი უნდა მიუთითებდნენ შესაბამის კონკრეტულ სტატიაზე.<br />
გვერდი ითვლება მრავამნიშვნელოვნად, თუ მასში განთავსებულია თარგი, რომლის სახელიც მითითებულია გვერდზე [[MediaWiki:Disambiguationspage]].",
+'pageswithprop-prop' => 'თვისების სახელი:',
+'pageswithprop-submit' => 'მიდი',
+
'doubleredirects' => 'ორმაგი გადამისამართება',
'doubleredirectstext' => 'ამ გვერდზე ჩამოთვლილია გვერდები, რომლებიც გადამისამართებულია სხვა გადამისამართების გვერდებზე.
ყოველი მწკრივი შეიცავს ბმულებს პირველ და მეორე გადამისამართებაზე, აგრეთვე მეორე გადამისამართების ტექსტის პირველ სტრიქონს, რომელშიც ჩვეულებრივ მითითებულია რეალური „სამიზნე“ გვერდის სათაური. საჭიროა, რომ პირველი გადამისამართებაც უთითებდეს ამ გვერდზე.
'listgrouprights-addgroup-self-all' => 'შეუძლია ყელა ჯგუფია ჩამატება ანგარიშს.',
'listgrouprights-removegroup-self-all' => 'შეუძლია თავისი ანგარიშის ყველა ჯგუფის წაშლა.',
-# E-mail user
+# Email user
'mailnologin' => 'გამგზავნი მისამართი არ არის მითითებული.',
'mailnologintext' => 'თქვენ უნდა [[Special:UserLogin|წარადგენილი იყოთ სისტემისადმი]] და გქონდეთ წესიერი ელექტრონული ფოსტის მისამართი თქვენს [[Special:Preferences|კონფიგურაციაში]] იმისთვის, რომ გაუგზავნოთ წერილების სხვა მომხმარებლებს.',
'emailuser' => 'გაუგზავნეთ იმეილი ამ მომხმარებელს',
'exif-lens' => 'გამოყენებული ლინზა',
'exif-serialnumber' => 'კამერის სერიული ნომერი',
'exif-cameraownername' => 'კამერის მფლობელი',
-'exif-label' => 'á\83\98á\83\90á\83 á\83\9aá\83\98á\83§ი',
+'exif-label' => 'á\83¡á\83\90á\83®á\83\94á\83\9aი',
'exif-datetimemetadata' => 'მეტამონაცემების ბოლო ცვლილების თარიღი',
'exif-nickname' => 'სურათის არაფორმალური სახელი',
'exif-rating' => 'რეიტინგი (5-დან)',
'monthsall' => 'ყველა',
'limitall' => 'ყველა',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'ელ. ფოსტის მისამართის დადასტურება',
'confirmemail_noemail' => 'თქვენ არ გაქვს მითითებული მართებული ელმისამართი [[Special:Preferences|მომხმარებლის პარამეტრებში]].',
'confirmemail_text' => '{{SITENAME}} ითხოვს თქვენი ელ. ფოსტის დადასტურებას, სანამ ელ.
'protectedpagetext' => 'Na pele vurnaisu rê qapan biya.',
'viewsourcetext' => 'Sıma şikinê çımê na pele bıvênê u kopya kerê:',
'protectedinterface' => "Na pele ''software'' rê meqalunê caunê bırnau dana, u qapana ke suıstımalu rê engel bo.",
-'editinginterface' => "'''Teme:''' Sıma hao jü pela ke serba nustê meqalunê caunê bırnau dana, vurnenê.
+'editinginterface' => "Teme:''' Sıma hawo jü pela ke serba nustê meqalunê caunê bırnau dana, vurnenê.
Vurnaisê na pele karberunê binu rê serpela karberi kena ke bıasno.
Serba çarnaişi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]i ra procêdoskerdene rê diqet kerê.",
'sqlhidden' => '(Persê SQLi nımıteo)',
'listgrouprights-addgroup-all' => 'Heme grubu ilawe ke',
'listgrouprights-removegroup-all' => 'Heme grubu wedare',
-# E-mail user
+# Email user
'emailuser' => 'Nê karberi rê e-poste bırusne',
'emailpage' => 'Karberi rê e-poste bırusne',
'emailfrom' => 'Kami ra:',
$messages = array(
# User preference toggles
'tog-underline' => 'គូសបន្ទាត់ក្រោមតំណភ្ជាប់៖',
-'tog-justify' => 'á\9e\8fá\9f\86រឹមកថាខណ្ឌ',
-'tog-hideminor' => 'á\9e\9bá\9e¶á\9e\80á\9f\8bâ\80\8bá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9e·á\9e\85á\9e\8fá\9e½á\9e\85â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
-'tog-hidepatrolled' => 'លាក់កំណែប្រែដែលបានល្បាត នៅក្នុងបំលាស់ប្ដូរថ្មីៗ',
-'tog-newpageshidepatrolled' => 'លាក់ទំព័រដែលបានល្បាត ពីបញ្ជីទំព័រថ្មី',
-'tog-extendwatchlist' => 'á\9e\96á\9e\84á\9f\92á\9e\9aá\9e¸á\9e\80â\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93â\80\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bâ\80\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a á\9e\98á\9e·á\9e\93â\80\8bá\9e\98á\9f\82á\9e\93â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\82â\80\8bá\9e\94á\9f\86លាស់ប្ដូរថ្មីៗនោះទេ',
-'tog-usenewrc' => ' បំលាស់ប្ដូរជាក្រុមតាមទំព័រ ក្នុងបំលាស់ប្តូរថ្មីៗនិងបញ្ជីតាមដាន (តម្រូវឲ្យមាន JavaScript)',
+'tog-justify' => 'á\9e\8fá\9e\98á\9f\92រឹមកថាខណ្ឌ',
+'tog-hideminor' => 'á\9e\9bá\9e¶á\9e\80á\9f\8bâ\80\8bá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9e·á\9e\85á\9e\8fá\9e½á\9e\85â\80\8bá\9e\96á\9e¸á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
+'tog-hidepatrolled' => 'លាក់កំណែប្រែដែលបានល្បាតពីបញ្ជីបន្លាស់ប្ដូរថ្មីៗ',
+'tog-newpageshidepatrolled' => 'លាក់ទំព័រដែលបានល្បាតពីបញ្ជីទំព័រថ្មី',
+'tog-extendwatchlist' => 'á\9e\96á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\8fâ\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93â\80\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bâ\80\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e¢á\9e\9fá\9f\8b á\9e\98á\9e·á\9e\93â\80\8bá\9e\98á\9f\82á\9e\93â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\82â\80\8bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗនោះទេ',
+'tog-usenewrc' => 'បន្លាស់ប្ដូរជាក្រុមតាមទំព័រ ក្នុងបន្លាស់ប្តូរថ្មីៗនិងបញ្ជីតាមដាន (តម្រូវឲ្យមាន JavaScript)',
'tog-numberheadings' => 'បង្ហាញលេខចំណងជើងរងដោយស្វ័យប្រវត្តិ',
'tog-showtoolbar' => 'បង្ហាញរបារឧបករណ៍កែប្រែ (តម្រូវអោយមាន JavaScript)',
'tog-editondblclick' => 'កែប្រែទំព័រដោយចុចពីរដងជាប់គ្នា (តម្រូវអោយមាន JavaScript)',
-'tog-editsection' => 'á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82â\80\8bá\9e\95á\9f\92á\9e\93á\9f\82á\9e\80á\9e\8eá\9e¶á\9e\98á\9e½á\9e\99â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8b[កែប្រែ]',
-'tog-editsectiononrightclick' => 'អនុញ្ញាតកែប្រែផ្នែកណាមួយ ដោយចុចស្តាំកណ្តុរលើចំណងជើងរបស់វា (តម្រូវអោយមាន JavaScript)',
-'tog-showtoc' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\8fá\9e¶á\9e\9aá\9e¶á\9e\84á\9e\98á\9e¶á\9e\8fá\9e·á\9e\80á\9e¶ (á\9e\85á\9f\86á\9e\96á\9f\84á\9f\87ទំព័រដែលមានចំណងជើងរងលើសពី៣)',
+'tog-editsection' => 'á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e¢á\9f\84á\9e\99á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82â\80\8bá\9e\95á\9f\92á\9e\93á\9f\82á\9e\80á\9e\8eá\9e¶á\9e\98á\9e½á\9e\99â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\9aá\9e\99á\9f\88á\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8b [កែប្រែ]',
+'tog-editsectiononrightclick' => 'á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fâ\80\8bá\9e¢á\9f\84á\9e\99á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82â\80\8bâ\80\8bá\9e\95á\9f\92á\9e\93á\9f\82á\9e\80á\9e\8eá\9e¶á\9e\98á\9e½á\9e\99 á\9e\8aá\9f\84á\9e\99â\80\8bá\9e\85á\9e»á\9e\85á\9e\9fá\9f\92á\9e\8fá\9e¶á\9f\86á\9e\80á\9e\8eá\9f\92á\9e\8fá\9e»á\9e\9aâ\80\8bá\9e\9bá\9e¾â\80\8bá\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9cá\9e¶ (á\9e\8fá\9e\98á\9f\92á\9e\9aá\9e¼á\9e\9cá\9e¢á\9f\84á\9e\99á\9e\98á\9e¶á\9e\93 JavaScript)',
+'tog-showtoc' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\8fá\9e¶á\9e\9aá\9e¶á\9e\84á\9e\98á\9e¶á\9e\8fá\9e·á\9e\80á\9e¶ (á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bទំព័រដែលមានចំណងជើងរងលើសពី៣)',
'tog-rememberpassword' => 'ចងចាំការកត់ឈ្មោះចូលរបស់ខ្ញុំលើកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយ៉ាងយូរ$1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
'tog-watchcreations' => 'បន្ថែមទំព័រទាំងឡាយដែលខ្ញុំបង្កើតទៅបញ្ជីតាមដានរបស់ខ្ញុំ',
'tog-watchdefault' => 'បន្ថែមទំព័រទាំងឡាយដែលខ្ញុំកែប្រែទៅបញ្ជីតាមដានរបស់ខ្ញុំ',
'tog-watchdeletion' => 'បន្ថែមទំព័រទាំងឡាយដែលខ្ញុំលុបចោលទៅបញ្ជីតាមដានរបស់ខ្ញុំ',
'tog-minordefault' => "ចំណាំគ្រប់កំណែប្រែរបស់ខ្ញុំថាជា'កំណែប្រែតិចតួច'",
'tog-previewontop' => 'បង្ហាញការមើលមុនពីលើប្រអប់កែប្រែ',
-'tog-previewonfirst' => 'បង្ហាញការមើលមុនចំពោះកំណែប្រែដំបូង',
+'tog-previewonfirst' => 'បង្ហាញការមើលមុនសម្រាប់កំណែប្រែដំបូងគេ',
'tog-nocache' => 'មិនប្រើសតិភ្ជាប់នៃទំព័រ',
-'tog-enotifwatchlistpages' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9f\86លាស់ប្ដូរនៃទំព័រណាមួយដែលមានក្នុងបញ្ជីតាមដានរបស់ខ្ញុំ',
-'tog-enotifusertalkpages' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9f\86លាស់ប្ដូរនៅក្នុងទំព័រពិភាក្សារបស់ខ្ញុំ',
-'tog-enotifminoredits' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\96á\9f\81á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\94á\9f\86លាស់ប្ដូរតិចតួចលើទំព័រឬឯកសារផងដែរ',
-'tog-enotifrevealaddr' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bâ\80\8bá\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\80á\9f\92á\9e\9aá\9e¾á\9e\93á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80â\80\8bá\9e\93á\9e¶á\9e\93á\9e¶',
+'tog-enotifwatchlistpages' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92លាស់ប្ដូរនៃទំព័រណាមួយដែលមានក្នុងបញ្ជីតាមដានរបស់ខ្ញុំ',
+'tog-enotifusertalkpages' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9e¶á\9e\9bá\9e\94á\9e¾â\80\8bá\9e\98á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92លាស់ប្ដូរនៅក្នុងទំព័រពិភាក្សារបស់ខ្ញុំ',
+'tog-enotifminoredits' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\96á\9f\81á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92លាស់ប្ដូរតិចតួចលើទំព័រឬឯកសារផងដែរ',
+'tog-enotifrevealaddr' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bâ\80\8bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\80á\9f\92á\9e\9aá\9e¾á\9e\93á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80â\80\8b',
'tog-shownumberswatching' => 'បង្ហាញចំនួនអ្នកប្រើប្រាស់ដែលតាមដានទំព័រនេះ',
'tog-oldsig' => 'ហត្ថលេខាមានហើយ៖',
'tog-fancysig' => 'ចុះហត្ថលេខាជាអត្ថបទវិគី (ដោយគ្មានតំណភ្ជាប់ស្វ័យប្រវត្តិ)',
'tog-watchlisthideliu' => 'លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់ដែលបានកត់ឈ្មោះចូលពីបញ្ជីតាមដាន',
'tog-watchlisthideanons' => 'លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់អនាមិកពីបញ្ជីតាមដាន',
'tog-watchlisthidepatrolled' => 'លាក់កំណែប្រែដែលបានល្បាតពីបញ្ជីតាមដាន',
-'tog-ccmeonemails' => 'ផ្ញើច្បាប់ចម្លងអ៊ីមែលដែលខ្ញុំផ្ញើទៅកាន់អ្នកប្រើប្រាស់ផ្សេងទៀតមកខ្ញុំផងដែរ',
-'tog-diffonly' => 'á\9e\80á\9e»á\9f\86á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\81á\9f\92á\9e\9bá\9e¹á\9e\98á\9e\9fá\9e¶á\9e\9aá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\85á\9e\96á\9e¸á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\8fá\9e¶á\9e\9aá\9e¶á\9e\84á\9e\94á\9f\92á\9e\9aá\9f\80á\9e\94á\9e\92á\9f\80á\9e\94á\9e\85á\9f\86á\9e\93ុចខុសគ្នា',
+'tog-ccmeonemails' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e\85á\9f\92á\9e\94á\9e¶á\9e\94á\9f\8bá\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84â\80\8bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85á\9e\80á\9e¶á\9e\93á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\91á\9f\80á\9e\8fá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\81á\9f\92á\9e\9bá\9e½á\9e\93á\9e¯á\9e\84á\9e\95á\9e\84á\9e\8aá\9f\82á\9e\9a',
+'tog-diffonly' => 'á\9e\80á\9e»á\9f\86á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\81á\9f\92á\9e\9bá\9e¹á\9e\98á\9e\9fá\9e¶á\9e\9aá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\85á\9e\96á\9e¸á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\8fá\9e¶á\9e\9aá\9e¶á\9e\84á\9e\94á\9f\92á\9e\9aá\9f\80á\9e\94á\9e\92á\9f\80á\9e\94á\9e\85á\9f\86á\9e\8eុចខុសគ្នា',
'tog-showhiddencats' => 'បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់',
'tog-norollbackdiff' => 'បំភ្លេចភាពខុសគ្នាបន្ទាប់ពីអនុវត្តការស្ដារវិញ',
'underline-default' => 'តាមលំនាំដើមនៃកម្មវិធីរុករក',
# Font style option in Special:Preferences
-'editfont-style' => 'កែសម្រួលរចនាបទពុម្ពអក្សរសម្រាប់តំបន់',
+'editfont-style' => 'រចនាបថពុម្ពអក្សរក្នុងប្រអប់កែប្រែ៖',
'editfont-default' => 'លំនាំដើមនៃកម្មវិធីរុករក',
'editfont-monospace' => 'ពុម្ពអក្សរដែលដកឃ្លាតែមួយ',
'editfont-sansserif' => 'ពុម្ពអក្សរគ្មានកន្ទុយ (Sans-serif font)',
'category-file-count' => '{{PLURAL:$2|ចំណាត់ថ្នាក់ក្រុមនេះមានឯកសារមួយដូចខាងក្រោម។|{{PLURAL:$1|ឯកសារមួយ|ឯកសារចំនួន$1}}ក្នុងចំណោមឯកសារសរុប $2 ដូចខាងក្រោមស្ថិតនៅក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។}}',
'category-file-count-limited' => '{{PLURAL:$1|ឯកសារមួយ|ឯកសារចំនួន$1}}ដូចខាងក្រោមស្ថិតនៅក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។',
'listingcontinuesabbrev' => 'បន្ត',
-'index-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾លិបិក្រម',
-'noindex-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾លិបិក្រម',
-'broken-file-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\81á\9e¼á\9e\85',
+'index-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93លិបិក្រម',
+'noindex-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\92á\9e\98á\9e¶á\9e\93លិបិក្រម',
+'broken-file-category' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\8aá\9e¶á\9e\85á\9f\8bá\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8b',
'about' => 'អំពី',
'article' => 'មាតិកាអត្ថបទ',
'retrievedfrom' => 'បានពី "$1"',
'youhavenewmessages' => 'អ្នកមាន $1 ($2)។',
'newmessageslink' => 'សារថ្មីៗ',
-'newmessagesdifflink' => 'á\9e\94á\9f\86លាស់ប្ដូរចុងក្រោយ',
+'newmessagesdifflink' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរចុងក្រោយ',
'youhavenewmessagesfromusers' => 'អ្នកមាន $1 ទទួលបានពី {{PLURAL:$3|អ្នកប្រើប្រាស់ម្នាក់|អុ្នកប្រើប្រាស់ចំនួន $3 នាក់}} ($2)។',
'youhavenewmessagesmanyusers' => 'អ្នកមាន $1 ទទួលបានពីអ្នកប្រើប្រាស់ជាច្រើន ($2)។',
'newmessageslinkplural' => '{{PLURAL:$1|សារថ្មីមួយ|សារថ្មី}}',
'page-rss-feed' => 'បម្រែបម្រួល RSS Feed នៃ "$1"',
'page-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ "$1"',
'red-link-title' => '$1 (ទំព័រនេះមិនទាន់មាននៅឡើយទេ)',
-'sort-descending' => 'á\9e\8fá\9f\86រៀបតាមលំដាប់ចុះ',
-'sort-ascending' => 'á\9e\8fá\9f\86រៀបតាមលំដាប់ឡើង',
+'sort-descending' => 'á\9e\8fá\9e\98á\9f\92រៀបតាមលំដាប់ចុះ',
+'sort-ascending' => 'á\9e\8fá\9e\98á\9f\92រៀបតាមលំដាប់ឡើង',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'អត្ថបទ',
'nstab-category' => 'ចំណាត់ថ្នាក់ក្រុម',
# Main script and global functions
-'nosuchaction' => 'á\9e\98á\9e·á\9e\93មានសកម្មភាពបែបនេះទេ',
+'nosuchaction' => 'á\9e\82á\9f\92មានសកម្មភាពបែបនេះទេ',
'nosuchactiontext' => 'សកម្មភាពបានបង្ហាញដោយ URL មិនត្រឹមត្រូវ។
អ្នកប្រហែលជាបានវាយ URL ខុស បើមិនដូច្នេះទេមានតែតំណភ្ជាប់មិនត្រឹមត្រូវ។
នេះក៏អាចបញ្ជាក់ប្រាប់ពីកំហុសនៅក្នុងផ្នែកទន់ប្រើដោយ {{SITENAME}} ។',
-'nosuchspecialpage' => 'á\9e\98á\9e·á\9e\93មានទំព័រពិសេសបែបនេះទេ',
+'nosuchspecialpage' => 'á\9e\82á\9f\92មានទំព័រពិសេសបែបនេះទេ',
'nospecialpagetext' => '<strong>អ្នកបានស្នើរកទំព័រពិសេសមិនទាន់មាន។</strong>
អ្នកអាចមើលបញ្ជីនៃទំព័រពិសេសៗនៅ [[Special:SpecialPages|{{int:specialpages}}]]។',
# General errors
'error' => 'មានបញ្ហា',
'databaseerror' => 'មូលដ្ឋានទិន្នន័យមានបញ្ហា',
-'laggedslavemode' => "'''á\9e\94á\9f\92á\9e\9aá\9e\99á\9f\90á\9e\8fá\9f\92á\9e\93á\9f\96''' á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87â\80\8bá\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\91á\9e»á\9e\80â\80\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\90á\9f\92á\9e\98á\9e¸á\9f\97ទេ។",
+'laggedslavemode' => "'''á\9e\94á\9f\92á\9e\9aá\9e\99á\9f\90á\9e\8fá\9f\92á\9e\93á\9f\96''' á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87â\80\8bá\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bá\9e\87á\9e¶á\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\9fá\9e\98á\9f\90á\9e\99ទេ។",
'readonly' => 'មូលដ្ឋានទិន្នន័យត្រូវបានចាក់សោ',
'enterlockreason' => 'សូមផ្ដល់ហេតុផលសម្រាប់ការជាប់សោ ព្រមទាំងកាលបរិច្ឆេទដោះសោវិញ',
'readonlytext' => 'ពេលនេះមូលដ្ឋានទិន្នន័យកំពុងជាប់សោ ដើម្បីកុំឱ្យមានការបញ្ចូលទិន្នន័យថ្មីៗឬការកែប្រែផ្សេងៗ។ នេះប្រហែលគ្រាន់តែជាការត្រួតពិនិត្យនិងថែទាំមូលដ្ឋានទិន្នន័យប្រចាំថ្ងៃ ដែលជាធម្មតាវានឹងវិលមកសភាពដើមវិញក្នុងពេលឆាប់ៗ។
'cannotdelete' => 'មិនអាចលុបចោលទំព័រឬឯកសារដែលមានឈ្មោះ "$1"បានទេ។
វាប្រហែលជាត្រូវបាននរណាម្នាក់ផ្សេងទៀតលុបចោលហើយ។',
-'cannotdelete-title' => 'មិនអាចលុបទំព័រ "$1"',
+'cannotdelete-title' => 'មិនអាចលុបទំព័រ "$1"បានទេ',
'badtitle' => 'ចំណងជើងមិនល្អ',
-'badtitletext' => 'ចំណងជើងទំព័រដែលបានស្នើ គ្មានសុពលភាព, ទទេ, ឬ ចំណងជើងតំណភ្ជាប់អន្តរភាសាឬអន្តរវិគី មិនត្រឹមត្រូវ ។ ប្រហែលជាមានតួអក្សរមួយឬច្រើន ដែលជាតួអក្សរហាមប្រើក្នុងចំណងជើង។',
+'badtitletext' => 'ចំណងជើងទំព័រដែលបានស្នើមិនអាចប្រើបាន គ្មានសរសេរអ្វី ឬមានចំណងជើងតំណភ្ជាប់អន្តរភាសាឬអន្តរវិគីមិនត្រឹមត្រូវ ។ វាក៏ប្រហែលជាមានតួអក្សរមួយឬច្រើន ដែលជាតួអក្សរហាមប្រើក្នុងចំណងជើងផងដែរ។',
'perfcached' => 'ទិន្នន័យទាំងនេះត្រូវបានដាក់ទៅសតិភ្ជាប់និងប្រហែលជាមិនទាន់សម័យ ។ ជាអតិបរមា {{PLURAL:$1|លទ្ធផលមួយ|លទ្ធផលចំនួន $1}} អាចប្រើបាននៅក្នុងសតិភ្ជាប់។',
'perfcachedts' => 'ទិន្នន័យខាងក្រោមនេះត្រូវបានដាក់ក្នុងសតិភ្ជាប់ និង បានត្រូវបន្ទាន់សម័យចុងក្រោយនៅ $1។ ជាអតិបរមា {{PLURAL:$4|លទ្ធផលមួយ|លទ្ធផលចំនួន $4}} អាចប្រើបាននៅក្នុងសតិភ្ជាប់។',
'querypage-no-updates' => 'ការបន្ទាន់សម័យសម្រាប់ទំព័រនេះគឺមិនអាចធ្វើទៅរួចទេនាពេលឥឡូវទេ។
សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេលប៉ុន្មាននាទីទៀត។',
'protectedpagetext' => 'ទំព័រនេះបានត្រូវការពារមិនឱ្យកែប្រែឬធ្វើសកម្មភាពផ្សេងទៀតលើវា។',
'viewsourcetext' => 'អ្នកអាចមើលនិងចម្លងកូដរបស់ទំព័រនេះ៖',
-'viewyourtext' => "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\98á\9e¾á\9e\9bá\9e\93á\9e·á\9e\84á\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84á\9e\80á\9e¼á\9e\8aá\9e\9aá\9e\94á\9e\9fá\9f\8b'''á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80'''á\9e\91á\9f\85កាន់ទំព័រនេះ៖",
+'viewyourtext' => "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\98á\9e¾á\9e\9bá\9e\93á\9e·á\9e\84á\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84á\9e\80á\9e¼á\9e\8aá\9e\9aá\9e\94á\9e\9fá\9f\8b'''á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80'''á\9e\98á\9e\80កាន់ទំព័រនេះ៖",
'protectedinterface' => 'ទំព័រនេះផ្ដល់នូវអត្ថបទអន្តរមុខសម្រាប់សូហ្វវែរនៅក្នុងវិគីនេះ និងត្រូវបានចាក់សោដើម្បីចៀសវាងការបំពាន។
ដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែសំរាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគំរោងបកប្រែរបស់MediaWiki។',
'editinginterface' => "'''ប្រយ័ត្ន៖''' អ្នកកំពុងតែកែប្រែទំព័រដែលបានប្រើប្រាស់ដើម្បីផ្ដល់ជូនអន្តរមុខសម្រាប់សូហ្វវែរ។ បំលាស់ប្ដូរចំពោះទំព័រនេះនឹងប៉ះពាល់ដល់ទ្រង់ទ្រាយរបស់ទំព័រអន្តរមុខសំរាប់អ្នកប្រើប្រាស់ជាច្រើន ដែលប្រើប្រាស់វិគីនេះ។ ដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែសំរាប់វិគីទាំងអស់ សូបប្រើប្រាស់ [//translatewiki.net/wiki/Main_Page?setlang=km translatewiki.net] គម្រោងបកប្រែរបស់មេឌាវិគី ។",
'filereadonlyerror' => 'មិនអាចកែប្រែឯកសារ "$1" បានទេពីព្រោះថតឯកសារ "$2" ស្ថិតក្នុងម៉ូដសំរាប់តែអានប៉ុណ្ណោះ។
អភិបាលដែលបានចាក់សោរវាបានផ្ដល់សេចក្ដីពន្យល់បែបនេះ៖ "$3"។',
+'invalidtitle-knownnamespace' => 'ចំណងជើងមិនត្រឹមត្រូវដែលមានលំហឈ្មោះ "$2" និងអត្ថបទ "$3"',
+'invalidtitle-unknownnamespace' => 'ចំណងជើងមិនត្រឹមត្រូវដែលមានលំហឈ្មោះមិនស្គាល់លេខ $1 និងអត្ថបទ "$2"',
'exception-nologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
-'exception-nologin-text' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e¬á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\93á\9f\81á\9f\87á\9e\8fá\9f\86រូវអោយអ្នកធ្វើការកត់ឈ្មោះចូលទៅក្នុងវិគីនេះ។',
+'exception-nologin-text' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e¬á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\93á\9f\81á\9f\87á\9e\8fá\9e\98á\9f\92រូវអោយអ្នកធ្វើការកត់ឈ្មោះចូលទៅក្នុងវិគីនេះ។',
# Virus scanner
'virus-badscanner' => "ការកំណត់រចនាសម្ព័ន្ធមិនល្អ៖ កម្មវិធីស្កេនមេរោគមិនស្គាល់៖ ''$1''",
'welcomecreation-msg' => 'គណនីរបស់អ្នកត្រូវបានបង្កើតហើយ។
កុំភ្លេចផ្លាស់ប្ដូរ[[Special:Preferences|ចំណង់ចំណូលចិត្ត{{SITENAME}}]]របស់អ្នក។',
'yourname' => 'អត្តនាម៖',
-'yourpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់៖',
-'yourpasswordagain' => 'á\9e\9cá\9e¶á\9e\99á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ម្តងទៀត៖',
+'yourpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់៖',
+'yourpasswordagain' => 'á\9e\9cá\9e¶á\9e\99á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ម្តងទៀត៖',
'remembermypassword' => 'ចងចាំកំណត់ឈ្មោះចូលរបស់ខ្ញុំក្នុងកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយូរបំផុត $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
'securelogin-stick-https' => 'នៅភ្ជាប់ទៅ HTTPS ដដែលបន្ទាប់ពីចុះឈ្មោះចូលហើយក៏ដោយ',
'yourdomainname' => 'ដូម៉ែនរបស់អ្នក៖',
-'password-change-forbidden' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ក្នុងវិគីនេះទេ។',
+'password-change-forbidden' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ក្នុងវិគីនេះទេ។',
'externaldberror' => 'មានបញ្ហាក្នុងការបញ្ជាក់ផ្ទៀងផ្ទាត់មូលដ្ឋានទិន្នន័យ ឬអ្នកមិនត្រូវបានអនុញ្ញាតឲ្យបន្ទាន់សម័យគណនីខាងក្រៅរបស់អ្នក។
',
'login' => 'កត់ឈ្មោះចូល',
'nav-login-createaccount' => 'កត់ឈ្មោះចូលឬបង្កើតគណនី',
-'loginprompt' => 'អ្នកត្រូវតែមានខូគី ដើម្បីអាចកត់ឈ្មោះចូល{{SITENAME}}។',
+'loginprompt' => 'á\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82â\80\8bá\9e\98á\9e¶á\9e\93â\80\8bá\9e\81á\9e¼á\9e\82á\9e¸ á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e¢á\9e¶á\9e\85â\80\8bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8b{{SITENAME}}á\9e\94á\9e¶á\9e\93á\9f\94',
'userlogin' => 'កត់ឈ្មោះចូលឬបង្កើតគណនី',
'userloginnocreate' => 'កត់ឈ្មោះចូល',
'logout' => 'កត់ឈ្មោះចេញ',
'createaccount' => 'បង្កើតគណនី',
'gotaccount' => "បើលោកអ្នកមានគណនីសម្រាប់ប្រើហើយ សូម'''$1'''។",
'gotaccountlink' => 'កត់ឈ្មោះចូល',
-'userlogin-resetlink' => 'á\9e\8fá\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9f\86á\9e¢á\9e·á\9e\8fá\9e\9fá\9f\86រាប់កត់ឈ្មោះចូលហើយ?',
+'userlogin-resetlink' => 'á\9e\8fá\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9e\98á\9f\92á\9e¢á\9e·á\9e\8fá\9e\9fá\9e\98á\9f\92រាប់កត់ឈ្មោះចូលហើយ?',
'createaccountmail' => 'ប្រើប្រាស់ពាក្យសំងាត់ព្រៀងបណ្ដោះអាសនុ្ន រួចផ្ញើវាទៅកាន់អាសយដ្ឋានអ៊ីមែលខាងក្រោម',
'createaccountreason' => 'មូលហេតុ៖',
-'badretype' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93បញ្ចូលនោះ គឺមិនស៊ីគ្នាទេ។',
+'badretype' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\9cá\9e¶á\9e\99បញ្ចូលនោះ គឺមិនស៊ីគ្នាទេ។',
'userexists' => 'អត្តនាមដែលអ្នកបានវាយបញ្ចូលមានគេប្រើហើយ។
សូមជ្រើសរើសអត្តនាមផ្សេងពីនេះ។',
'loginerror' => 'កំហុសនៃការកត់ឈ្មោះចូល',
សូមពិនិត្យអក្ខរាវិរុទ្ធរបស់អ្នក ។',
'nouserspecified' => 'អ្នកត្រូវតែផ្ដល់អត្តនាម។',
'login-userblocked' => 'អ្នកប្រើប្រាស់នេះស្ថិតក្រោមការហាមឃាត់។ មិនអនុញ្ញាតអោយកត់ឈ្មោះចូលទេ។',
-'wrongpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93បញ្ចូលមិនត្រឹមត្រូវទេ។
+'wrongpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\9cá\9e¶á\9e\99បញ្ចូលមិនត្រឹមត្រូវទេ។
សូមព្យាយាមម្តងទៀត។',
-'wrongpasswordempty' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93បញ្ចូលទេ។
+'wrongpasswordempty' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9cá\9e¶á\9e\99បញ្ចូលទេ។
សូមព្យាយាមម្តងទៀត។',
-'passwordtooshort' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ត្រូវមានយ៉ាងតិចណាស់ {{PLURAL:$1|១ តួអក្សរ|$1តួអក្សរ}}។',
-'password-name-match' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82á\9e\81á\9e»á\9e\9fá\9e\82á\9f\92á\9e\93á\9e¶á\9e\96á\9e¸á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87របស់អ្នក។',
-'password-login-forbidden' => 'á\9e á\9e¶á\9e\98á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\98á\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98á\9e\93á\9e·á\9e\84á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់នេះ។',
-'mailmypassword' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មី',
-'passwordremindertitle' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្តោះអាសន្នថ្មីសម្រាប់{{SITENAME}}',
-'passwordremindertext' => 'á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\98á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8b (á\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bá\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80, á\9e\96á\9e¸á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93 IP $1) á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីមួយពី {{SITENAME}} ($4)។
-á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\98á\9e½á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b "$2" á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\87á\9e¶ "$3"á\9f\94 á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\85á\9f\81á\9e\8fá\9e\93á\9e¶á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e á\9e¾á\9e\99á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មី។
-á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្ដោះអាសន្នរបស់អ្នក នឹងត្រូវផុតកំណត់ក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5ថ្ងៃ}} ។
-
-á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e\9aá\9e\8eá\9e¸á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\93á\9f\81á\9f\87 á\9e¬ á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\85á\9e¶á\9e\9fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\9cá\9e·á\9e\89 á\9e á\9e¾á\9e\99á\9e\98á\9e·á\9e\93á\9e\85á\9e\84á\9f\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\91á\9f\81á\9e\93á\9f\84á\9f\87 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ចាស់របស់អ្នកបន្តទៀត។',
+'passwordtooshort' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ត្រូវមានយ៉ាងតិចណាស់ {{PLURAL:$1|១ តួអក្សរ|$1តួអក្សរ}}។',
+'password-name-match' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82á\9e\81á\9e»á\9e\9fá\9e\82á\9f\92á\9e\93á\9e¶á\9e\96á\9e¸á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98របស់អ្នក។',
+'password-login-forbidden' => 'á\9e á\9e¶á\9e\98á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\98á\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98á\9e\93á\9e·á\9e\84á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់នេះ។',
+'mailmypassword' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មី',
+'passwordremindertitle' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្តោះអាសន្នថ្មីសម្រាប់{{SITENAME}}',
+'passwordremindertext' => 'á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\98á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8b (á\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bá\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80, á\9e\96á\9e¸á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93 IP $1) á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីមួយពី {{SITENAME}} ($4)។
+á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\98á\9e½á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b "$2" á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\87á\9e¶ "$3"á\9f\94 á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\85á\9f\81á\9e\8fá\9e\93á\9e¶á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e á\9e¾á\9e\99á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មី។
+á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្ដោះអាសន្នរបស់អ្នក នឹងត្រូវផុតកំណត់ក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5ថ្ងៃ}} ។
+
+á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e\9aá\9e\8eá\9e¸á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\93á\9f\81á\9f\87 á\9e¬ á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\85á\9e¶á\9e\9fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\9cá\9e·á\9e\89 á\9e á\9e¾á\9e\99á\9e\98á\9e·á\9e\93á\9e\85á\9e\84á\9f\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\91á\9f\81á\9e\93á\9f\84á\9f\87 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ចាស់របស់អ្នកបន្តទៀត។',
'noemail' => 'គ្មានអាសយដ្ឋានអ៊ីមែលណាមួយត្រូវបានកត់ត្រាទុកសម្រាប់អ្នកប្រើឈ្មោះ "$1" ទេ។',
'noemailcreate' => 'អ្នកត្រូវតែផ្ដល់អាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ',
-'passwordsent' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីត្រូវបានផ្ញើទៅអាសយដ្ឋានអ៊ីមែលដែលបានចុះបញ្ជីសម្រាប់អ្នកប្រើឈ្មោះ "$1" ។
+'passwordsent' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីត្រូវបានផ្ញើទៅអាសយដ្ឋានអ៊ីមែលដែលបានចុះបញ្ជីសម្រាប់អ្នកប្រើឈ្មោះ "$1" ។
-á\9e\9fá\9e¼á\9e\98â\80\8bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e\98á\9f\92á\9e\8fá\9e\84á\9e\91á\9f\80á\9e\8fâ\80\8bá\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8bá\9e\96á\9e¸â\80\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\91á\9e\91á\9e½á\9e\9bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីនោះ។',
-'blocked-mailpassword' => 'á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82 á\9e\93á\9e·á\9e\84á\9e\98á\9e·á\9e\93á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e±á\9f\92á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\9fá\9e\84á\9f\92á\9e\82á\9f\92á\9e\9aá\9f\84á\9f\87á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើម្បីបង្ការការបំពានទេ។',
-'eauthentsent' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\95á\9f\92á\9e\91á\9f\80á\9e\84á\9e\95á\9f\92á\9e\91á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85â\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87ហើយ។
+á\9e\9fá\9e¼á\9e\98â\80\8bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e\98á\9f\92á\9e\8fá\9e\84á\9e\91á\9f\80á\9e\8fâ\80\8bá\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8bá\9e\96á\9e¸â\80\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\91á\9e\91á\9e½á\9e\9bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីនោះ។',
+'blocked-mailpassword' => 'á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93IPá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82 á\9e\93á\9e·á\9e\84á\9e\98á\9e·á\9e\93á\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8fá\9e±á\9f\92á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\9fá\9e\84á\9f\92á\9e\82á\9f\92á\9e\9aá\9f\84á\9f\87á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើម្បីបង្ការការបំពានទេ។',
+'eauthentsent' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\95á\9f\92á\9e\91á\9f\80á\9e\84á\9e\95á\9f\92á\9e\91á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85â\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e\8fá\9f\92á\9e\9aá\9e¶ហើយ។
មុននឹងមានអ៊ីមែលផ្សេងមួយទៀតត្រូវផ្ញើទៅគណនីនេះ អ្នកត្រូវតែធ្វើតាមសេចក្តីណែនាំក្នុងអ៊ីមែលនោះ ដើម្បីបញ្ជាក់ថាគណនីបច្ចុប្បន្នពិតជារបស់អ្នកពិតប្រាកដមែន។',
-'throttled-mailpassword' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។
+'throttled-mailpassword' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។
-á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e¢á\9f\86á\9e\96á\9e¾á\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់តែមួយគត់នឹងត្រូវបានផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។',
+á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e¢á\9f\86á\9e\96á\9e¾á\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់តែមួយគត់នឹងត្រូវបានផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។',
'mailerror' => 'បញ្ហាក្នុងការផ្ញើអ៊ីមែល៖ $1',
'acct_creation_throttle_hit' => 'អ្នកទស្សនាវិគីនេះដោយប្រើប្រាស់អាសយដ្ឋានIPរបស់អ្នក បានបង្កើត{{PLURAL:$1|គណនីមួយ|គណនីចំនួន$1}}នៅថ្ងៃចុងក្រោយ។ ចំនួននេះជាចំនួនអតិបរមារដែលត្រូវបានអនុញ្ញាតសម្រាប់រយៈពេលនេះ។
'emailconfirmlink' => 'ផ្ទៀងផ្ទាត់បញ្ជាក់អាសយដ្ឋានអ៊ីមែលរបស់អ្នក',
'invalidemailaddress' => 'អាសយដ្ឋានអ៊ីមែលនេះមិនអាចទទួលយកបានទេដោយសារវាមានទម្រង់មិនត្រឹមត្រូវ។
-á\9e\9fá\9e¼á\9e\98á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e\98á\9e½á\9e\99â\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93â\80\8bá\9e\91á\9e\98á\9f\92á\9e\9aá\9e\84á\9f\8bâ\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9c á\9e¬á\9e\98á\9e½á\9e\99á\9e\80á\9f\8fá\9e\91á\9e»á\9e\80á\9e\9cá\9e¶á\9e\9bá\9e\93á\9f\84á\9f\87á\9e±á\9f\92á\9e\99នៅទំនេរ។',
+á\9e\9fá\9e¼á\9e\98á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e\98á\9e½á\9e\99â\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93â\80\8bá\9e\91á\9e\98á\9f\92á\9e\9aá\9e\84á\9f\8bâ\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9c á\9e¬á\9e\98á\9e½á\9e\99á\9e\80á\9f\8fá\9e\91á\9e»á\9e\80á\9e±á\9f\92á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¡á\9f\84á\9f\87á\9e\93á\9f\84á\9f\87នៅទំនេរ។',
'cannotchangeemail' => 'អាសយដ្ឋានអ៊ីមែលរបស់គណនីមិនអាចប្ដូរបានទេនៅលើវិគីនេះ។',
'emaildisabled' => 'វិបសៃថ៍នេះមិនអាចផ្ញើអ៊ីមែលបានទេ។',
'accountcreated' => 'គណនីរបស់លោកអ្នកត្រូវបានបង្កើតហើយ',
អ្នកអាចបំភ្លេចពីសារនេះ ប្រសិនបើគណនីនេះត្រូវបានបង្កើតដោយមានបញ្ហា។',
'usernamehasherror' => 'អត្តនាមមិនអាចមានតួអក្សរដែលជាសញ្ញាបានទេ',
-'login-throttled' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេចច្រើនដងពេកហើយ។
+'login-throttled' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេចច្រើនដងពេកហើយ។
សូមរងចាំមួយរយៈ មុនពេលសាកល្បងម្ដងទៀត។',
-'login-abort-generic' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេចទេ។ ការចុះឈ្មោះចូលត្រូវបានបោះបង់។',
+'login-abort-generic' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេចទេ។ ការចុះឈ្មោះចូលត្រូវបានបោះបង់។',
'loginlanguagelabel' => 'ភាសា៖ $1',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'កំហុសមិនស្គាល់នៅក្នុងអនុគមន៍ mail() របស់ PHP',
'user-mail-no-addy' => 'បានព្យាយាមផ្ញើអ៊ីមែលដោយមិនបានដាក់អាសដ្ឋានអ៊ីមែល។',
# Change password dialog
-'resetpass' => 'â\80\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់',
-'resetpass_announce' => 'អ្នកបានកត់ឈ្មោះចូលដោយអក្សរកូដអ៊ីមែលបណ្តោះអាសន្នមួយ។
+'resetpass' => 'â\80\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់',
+'resetpass_announce' => 'អ្នកបានកត់ឈ្មោះចូលដោយអក្សរកូដបណ្តោះអាសន្នមួយដែលយើងខ្ញុំបានអ៊ីមែលទៅឱ្យ។
-á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e\94á\9f\8bâ\80\8bá\9e\80á\9e¶á\9e\9aá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82â\80\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីមួយនៅទីនេះ៖',
+á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸â\80\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e\94á\9f\8bâ\80\8bá\9e\80á\9e¶á\9e\9aá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82â\80\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីមួយនៅទីនេះ៖',
'resetpass_text' => '<!-- បន្ថែមឃ្លានៅទីនេះ -->',
-'resetpass_header' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់គណនី',
-'oldpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ចាស់៖',
-'newpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មី៖',
-'retypenew' => 'á\9e\9fá\9e¼á\9e\98á\9e\9cá\9e¶á\9e\99á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីម្តងទៀត៖',
-'resetpass_submit' => 'á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់និងកត់ឈ្មោះចូល',
-'resetpass_success' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរបានសំរេចហើយ! ឥឡូវនេះកំពុងកត់ឈ្មោះចូល...',
-'resetpass_forbidden' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់មិនអាចផ្លាស់ប្តូរបានទេ',
+'resetpass_header' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់គណនី',
+'oldpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ចាស់៖',
+'newpassword' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មី៖',
+'retypenew' => 'á\9e\9fá\9e¼á\9e\98á\9e\9cá\9e¶á\9e\99á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីម្តងទៀត៖',
+'resetpass_submit' => 'á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់និងកត់ឈ្មោះចូល',
+'resetpass_success' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរបានសំរេចហើយ! ឥឡូវនេះកំពុងកត់ឈ្មោះចូល...',
+'resetpass_forbidden' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់មិនអាចផ្លាស់ប្តូរបានទេ',
'resetpass-no-info' => 'អ្នកចាំបាច់ត្រូវតែកត់ឈ្មោះចូល ដើម្បីចូលទៅកាន់ទំព័រនេះដោយផ្ទាល់។',
-'resetpass-submit-loggedin' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់',
+'resetpass-submit-loggedin' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់',
'resetpass-submit-cancel' => 'បោះបង់',
'resetpass-wrong-oldpass' => 'ពាក្យសម្ងាត់បណ្ដោះអាសន្ន ឬបច្ចុប្បន្នមិនត្រឹមត្រូវ។
-á\9e¢á\9f\92á\9e\93á\9e\80â\80\8bâ\80\8bá\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bâ\80\8bá\9e\87á\9e¶â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\9bá\9f\81á\9e\81â\80\8bá\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9aá\9e½á\9e\85á\9e á\9e¾á\9e\8fá\9e\99 á\9e¬â\80\8bá\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾â\80\8bá\9e\9fá\9e»á\9f\86â\80\8bá\9e\9bá\9f\81á\9e\81សម្ងាត់បណ្ដោះអាសន្នថ្មីមួយហើយ។',
-'resetpass-temp-password' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្តោះអាសន្ន:',
+á\9e¢á\9f\92á\9e\93á\9e\80â\80\8bâ\80\8bá\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bâ\80\8bá\9e\87á\9e¶â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9aá\9e½á\9e\85á\9e á\9e¾á\9e\99 á\9e¬â\80\8bá\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾â\80\8bá\9e\9fá\9e»á\9f\86â\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99សម្ងាត់បណ្ដោះអាសន្នថ្មីមួយហើយ។',
+'resetpass-temp-password' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្តោះអាសន្ន:',
# Special:PasswordReset
-'passwordreset' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់សាឡើងវិញ',
+'passwordreset' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់សាឡើងវិញ',
'passwordreset-text' => 'បំពេញសំណុំបែបបទនេះដើម្បីទទួលបានអ៊ីម៉ែលក្រើនរំលឹកពីព័ត៌មានលំអិតរបស់គណនីរបស់អ្នក។',
-'passwordreset-legend' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើម',
-'passwordreset-disabled' => 'á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
+'passwordreset-legend' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើម',
+'passwordreset-disabled' => 'á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្នន័យខាងក្រោម}}',
'passwordreset-username' => 'អត្តនាម៖',
'passwordreset-domain' => 'ដូម៉ែន៖',
'passwordreset-capture' => 'មើលអ៊ីមែលលទ្ធផល?',
-'passwordreset-capture-help' => 'á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e¼á\9e\9fá\9e\92á\9e¸á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\93á\9f\81á\9f\87 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b (á\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្ដោះអាសន្ន) មិនត្រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងត្រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។',
+'passwordreset-capture-help' => 'á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e¼á\9e\9fá\9e\92á\9e¸á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\93á\9f\81á\9f\87 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b (á\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្ដោះអាសន្ន) មិនត្រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងត្រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។',
'passwordreset-email' => 'អាសយដ្ឋានអ៊ីមែល៖',
'passwordreset-emailtitle' => 'ព័ត៌មានលំអិតពីគណនីនៅលើ {{SITENAME}}',
'passwordreset-emailtext-ip' => 'មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំសារក្រើនរំលឹកពីព័ត៌មានពិស្ដារ
$2
-{{PLURAL:$3|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\93á\9f\81á\9f\87|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
-á\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ
-á\9e¬á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
-á\9e\80á\9e»á\9f\86á\9e\81á\9f\92á\9e\9cá\9e\9bá\9f\8bá\9e\87á\9e¶á\9e\98á\9e½á\9e\99á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e½á\9e\99á\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
+{{PLURAL:$3|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\93á\9f\81á\9f\87|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
+á\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ
+á\9e¬á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
+á\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e¢á\9f\86á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e½á\9e\99á\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
'passwordreset-emailtext-user' => 'អ្នកប្រើប្រាស់ $1 នៅក្នុង {{SITENAME}} បានស្នើសុំសារក្រើនរំលឹកអំពីព័ត៌មានពិស្ដាររបស់គណនីរបស់អ្នកនៅក្នុង {{SITENAME}} ($4)។
{{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាស័យដ្ឋានអ៊ីមែលនេះ៖
$2
-{{PLURAL:$3|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\93á\9f\81á\9f\87|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
-á\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ
-á\9e¬á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
-á\9e\80á\9e»á\9f\86á\9e\81á\9f\92á\9e\9cá\9e\9bá\9f\8bá\9e\87á\9e¶á\9e\98á\9e½á\9e\99á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e½á\9e\99á\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
-'passwordreset-emailelement' => 'á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b៖ $1
-á\9e\9bá\9f\81á\9e\81សម្ងាត់បណ្ដោះអាសន្ន៖ $2',
-'passwordreset-emailsent' => 'á\9e¢á\9e¸á\9e»á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\98á\9e½á\9e\99បានផ្ញើទៅហើយ។',
+{{PLURAL:$3|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\93á\9f\81á\9f\87|á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
+á\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ
+á\9e¬á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
+á\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e¢á\9f\86á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e½á\9e\99á\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
+'passwordreset-emailelement' => 'á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98៖ $1
+á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99សម្ងាត់បណ្ដោះអាសន្ន៖ $2',
+'passwordreset-emailsent' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\98á\9e½á\9e\99á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cបានផ្ញើទៅហើយ។',
'passwordreset-emailsent-capture' => 'អ៊ីមែលរំលឹកមួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។',
'passwordreset-emailerror-capture' => 'អ៊ីមែលរំលឹកមួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់អ្នកប្រើប្រាស់មិនបានសំរេចទេ៖ $1',
# Special:ChangeEmail
'changeemail' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល',
'changeemail-header' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលសំរាប់គណនីនេះ',
-'changeemail-text' => 'á\9e\9fá\9e¼á\9e\98á\9e\94á\9f\86á\9e\96á\9f\81á\9e\89á\9e\9fá\9f\86á\9e\93á\9e»á\9f\86á\9e\94á\9f\82á\9e\94á\9e\94á\9e\91á\9e\93á\9f\81á\9f\87á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9f\94 á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដើម្បីអះអាងលើការផ្លាស់ប្ដូរនេះ។',
+'changeemail-text' => 'á\9e\9fá\9e¼á\9e\98á\9e\94á\9f\86á\9e\96á\9f\81á\9e\89á\9e\9fá\9f\86á\9e\93á\9e»á\9f\86á\9e\94á\9f\82á\9e\94á\9e\94á\9e\91á\9e\93á\9f\81á\9f\87á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9f\94 á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដើម្បីអះអាងលើការផ្លាស់ប្ដូរនេះ។',
'changeemail-no-info' => 'អ្នកចាំបាច់ត្រូវតែកត់ឈ្មោះចូល ដើម្បីចូលទៅកាន់ទំព័រនេះដោយផ្ទាល់។',
'changeemail-oldemail' => 'អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖',
'changeemail-newemail' => 'អាសយដ្ឋានអ៊ីមែលថ្មី៖',
'preview' => 'មើលជាមុន',
'showpreview' => 'បង្ហាញការមើលជាមុន',
'showlivepreview' => 'មើលជាមុនដោយផ្ទាល់',
-'showdiff' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\94á\9f\86លាស់ប្ដូរ',
+'showdiff' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរ',
'anoneditwarning' => "'''ប្រយ័ត្ន ៖''' អ្នកមិនបានកត់ឈ្មោះចូលទេ។ អាសយដ្ឋានIPរបស់អ្នកនឹងត្រូវបានកត់ត្រាទុកក្នុងប្រវត្តិកែប្រែនៃទំព័រនេះ។",
'anonpreviewwarning' => "''អ្នកមិនបានកត់ឈ្មោះចូលទេ។ ប្រសិនបើអ្នកធ្វើការរក្សាទុក នោះអាសយដ្ឋានIPរបស់អ្នកនឹងត្រូវបានកត់ត្រាទុកក្នុងប្រវត្តិកែប្រែនៃទំព័រនេះ។''",
'missingsummary' => "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ចំណារពន្យល់អំពីកំណែប្រែនេះទេ។
បើសិនជាអ្នកចុច '''រក្សាទុក''' ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានចំណារពន្យល់។",
-'missingcommenttext' => 'á\9e\9fá\9e¼á\9e\98á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\98á\9e½á\9e\99á\9e\9cá\9e·á\9e\85á\9e¶á\9e\9aនៅខាងក្រោម។',
-'missingcommentheader' => "'''á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9f\96''' á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e±á\9f\92á\9e\99á\9e\93á\9e¼á\9e\9c á\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91/á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84 á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9cá\9e·á\9e\85á\9e¶á\9e\9aនេះទេ។
+'missingcommenttext' => 'á\9e\9fá\9e¼á\9e\98á\9e\9cá\9e¶á\9e\99á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bá\9e\98á\9e½á\9e\99នៅខាងក្រោម។',
+'missingcommentheader' => "'''á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9f\96''' á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e±á\9f\92á\9e\99á\9e\93á\9e¼á\9e\9c á\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91/á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84 á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\98á\9e\8fá\9e·á\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bនេះទេ។
បើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
'summary-preview' => 'ការមើលជាមុនរបស់ចំណារពន្យល់:',
'subject-preview' => 'ការមើលជាមុនរបស់ប្រធានបទ/ចំណងជើង:',
'loginreqtitle' => 'តម្រូវអោយកត់ឈ្មោះចូល',
'loginreqlink' => 'កត់ឈ្មោះចូល',
'loginreqpagetext' => 'អ្នកត្រូវតែ$1ដើម្បីមើលទំព័រដទៃផ្សេងទៀត។',
-'accmailtitle' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ត្រូវបានផ្ញើរួចហើយ។',
-'accmailtext' => "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ដែលបានបង្កើតដោយចៃដន្យសម្រាប់ [[User talk:$1|$1]] ត្រូវបានផ្ញើទៅ $2 ហើយ។
+'accmailtitle' => 'á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ត្រូវបានផ្ញើរួចហើយ។',
+'accmailtext' => "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ដែលបានបង្កើតដោយចៃដន្យសម្រាប់ [[User talk:$1|$1]] ត្រូវបានផ្ញើទៅ $2 ហើយ។
-á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bâ\80\8bá\9e\82á\9e\8eá\9e\93á\9e¸â\80\8bá\9e\90á\9f\92á\9e\98á\9e¸â\80\8bá\9e\93á\9f\81á\9f\87 á\9e¢á\9e¶á\9e\85â\80\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\94á\9e¶á\9e\93á\9e\93á\9f\85â\80\8bâ\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a ''[[Special:ChangePassword|á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់]]'' បន្ទាប់ពីកត់ឈ្មោះចូលហើយ។",
+á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bâ\80\8bá\9e\82á\9e\8eá\9e\93á\9e¸â\80\8bá\9e\90á\9f\92á\9e\98á\9e¸â\80\8bá\9e\93á\9f\81á\9f\87 á\9e¢á\9e¶á\9e\85â\80\8bâ\80\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\94á\9e¶á\9e\93á\9e\93á\9f\85â\80\8bâ\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a ''[[Special:ChangePassword|á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់]]'' បន្ទាប់ពីកត់ឈ្មោះចូលហើយ។",
'newarticle' => '(ថ្មី)',
'newarticletext' => "អ្នកបានតាមតំណភ្ជាប់ទៅទំព័រដែលមិនទាន់មាននៅឡើយ។
ដើម្បីបង្កើតទំព័រនេះ សូមចាប់ផ្ដើមវាយក្នុងប្រអប់ខាងក្រោម (សូមមើល [[{{MediaWiki:Helppage}}|ទំព័រជំនួយ]] សម្រាប់ព័ត៌មានបន្ថែម)។
'userinvalidcssjstitle' => "'''ប្រយ័ត្ន៖''' គ្មានសំបក \"\$1\"។ ចងចាំថា ទំព័រផ្ទាល់ខ្លួន .css និង .js ប្រើប្រាស់ ចំណងជើង ជាអក្សរតូច, ឧទាហរណ៍ {{ns:user}}:Foo/vector.css ត្រឹមត្រូវ, រីឯ {{ns:user}}:Foo/Vector.css មិនត្រឹមត្រូវ។",
'updated' => '(បានបន្ទាន់សម័យ)',
'note' => "'''ចំណាំ៖'''",
-'previewnote' => "'''á\9e\9fá\9e¼á\9e\98á\9e\85á\9e¶á\9f\86á\9e\90á\9e¶á\9e\93á\9f\81á\9f\87á\9e\82á\9f\92á\9e\9aá\9e¶á\9e\93á\9f\8bá\9e\8fá\9f\82á\9e\87á\9e¶â\80\8bá\9e\80á\9e¶á\9e\9aá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\80á\9e¶á\9e\9aá\9e\98á\9e¾á\9e\9bá\9e\87á\9e¶á\9e\98á\9e»á\9e\93á\9e\94á\9f\89á\9e»á\9e\8eá\9f\92á\9e\8eá\9f\84á\9f\87á\9f\94 á\9e\94á\9f\86លាស់ប្ដូររបស់អ្នកមិនទាន់បានរក្សាទុកទេ!'''",
+'previewnote' => "'''á\9e\9fá\9e¼á\9e\98á\9e\85á\9e¶á\9f\86á\9e\90á\9e¶á\9e\93á\9f\81á\9f\87á\9e\82á\9f\92á\9e\9aá\9e¶á\9e\93á\9f\8bá\9e\8fá\9f\82á\9e\87á\9e¶â\80\8bá\9e\80á\9e¶á\9e\9aá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\80á\9e¶á\9e\9aá\9e\98á\9e¾á\9e\9bá\9e\87á\9e¶á\9e\98á\9e»á\9e\93á\9e\94á\9f\89á\9e»á\9e\8eá\9f\92á\9e\8eá\9f\84á\9f\87á\9f\94 á\9e\94á\9e\93á\9f\92លាស់ប្ដូររបស់អ្នកមិនទាន់បានរក្សាទុកទេ!'''",
'continue-editing' => 'ទៅកាន់កន្លែងសំរាប់ធ្វើការកែប្រែ',
'previewconflict' => 'ការមើលមុននេះយោងតាមអត្ថបទក្នុងប្រអប់កែប្រែខាងលើ។ ទំព័រអត្ថបទនឹងបង្ហាញចេញបែបនេះប្រសិនបើអ្នកជ្រើសរើសរក្សាទុក។',
'session_fail_preview' => "'''សូមអភ័យទោស! យើងមិនអាចរក្សាទុកការកែប្រែរបស់អ្នកបានទេ ដោយសារបាត់ទិន្នន័យវេនការងារ។
'editingold' => "'''បម្រាម:អ្នកកំពុងតែកែកំណែប្រែដែលហួសសម័យរបស់ទំព័រនេះ។
ប្រសិនបើអ្នករក្សាវាទុក កំណែប្រែពីមុនទាំងប៉ុន្មាននឹងត្រូវបាត់បង់។'''",
-'yourdiff' => 'á\9e\85á\9f\86á\9e\93ុចខុសគ្នា',
-'copyrightwarning' => "á\9e\9fá\9e¼á\9e\98á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bâ\80\8bá\9e\90á\9e¶ á\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\80á\9e¶á\9e\9aá\9e\9aá\9e½á\9e\98á\9e\85á\9f\86á\9e\8eá\9f\82á\9e\80â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\93á\9f\85á\9e\9bá\9e¾{{SITENAME}} á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93â\80\8bá\9e\95á\9f\92á\9e\9fá\9e\96á\9f\92á\9e\9cá\9e\95á\9f\92á\9e\9fá\9e¶á\9e\99â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\9bá\9e·á\9e\81á\9e·á\9e\8fá\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8f $2 (á\9e\9fá\9e¼á\9e\98â\80\8bá\9e\98á\9e¾á\9e\9b $1 á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93â\80\8bá\9e\9bá\9f\86អិត) ។ បើអ្នកមិនចង់ឱ្យត្រូវបានអ្នកដទៃធ្វើការកែប្រែ ផ្សព្វផ្សាយបន្តសំណេររបស់អ្នកទេនោះ សូមអ្នកកុំដាក់ស្នើវានៅទីនេះអី។<br />
+'yourdiff' => 'á\9e\85á\9f\86á\9e\8eុចខុសគ្នា',
+'copyrightwarning' => "á\9e\9fá\9e¼á\9e\98á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\80á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bâ\80\8bá\9e\90á\9e¶ á\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\80á\9e¶á\9e\9aá\9e\9aá\9e½á\9e\98á\9e\85á\9f\86á\9e\8eá\9f\82á\9e\80â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80â\80\8bá\9e\93á\9f\85á\9e\9bá\9e¾{{SITENAME}} á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93â\80\8bá\9e\95á\9f\92á\9e\9fá\9e\96á\9f\92á\9e\9cá\9e\95á\9f\92á\9e\9fá\9e¶á\9e\99â\80\8bá\9e\8fá\9e¶á\9e\98â\80\8bá\9e\9bá\9e·á\9e\81á\9e·á\9e\8fá\9e¢á\9e\93á\9e»á\9e\89á\9f\92á\9e\89á\9e¶á\9e\8f $2 (á\9e\9fá\9e¼á\9e\98â\80\8bá\9e\98á\9e¾á\9e\9b $1 á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93â\80\8bá\9e\9bá\9e\98á\9f\92អិត) ។ បើអ្នកមិនចង់ឱ្យត្រូវបានអ្នកដទៃធ្វើការកែប្រែ ផ្សព្វផ្សាយបន្តសំណេររបស់អ្នកទេនោះ សូមអ្នកកុំដាក់ស្នើវានៅទីនេះអី។<br />
អ្នកត្រូវសន្យាថា អ្នកសរសេរវាដោយខ្លួនអ្នក ឬបានចម្លងវាពីកម្មសិទ្ធិសាធារណៈឬពីប្រភពសេរី ។
'''មិនត្រូវដាក់ស្នើការងារមានជាប់កម្មសិទ្ឋិបញ្ញាដោយគ្មានការអនុញ្ញាតទេ!'''",
'copyrightwarning2' => "សូមធ្វើការកត់សម្គាល់ថា គ្រប់ការរួមចំណែកទៅ {{SITENAME}} អាចត្រូវបានកែប្រែ ផ្លាស់ប្ដូរ រឺលុបចោល ដោយអ្នករួមចំណែកដទៃទៀត។
'last' => 'ចុងក្រោយ',
'page_first' => 'ដំបូង',
'page_last' => 'ចុងក្រោយ',
-'histlegend' => "ជម្រើស៖ សូមគូសក្នុងកូនប្រអប់ពីមុខកំណែដែលអ្នកចង់ប្រៀបធៀប រួចចុចច្នុច enter ឬប៊ូតុងនៅខាងក្រោម។<br />
+'histlegend' => "ជម្រើស៖ សូមគូសក្នុងកូនប្រអប់ពីមុខកំណែដែលអ្នកចង់ប្រៀបធៀប រួចចុចច្នុច ENTER ឬប៊ូតុងនៅខាងក្រោម។<br />
'''ពាក្យតំណាង'''៖(បច្ចុប្បន្ន) = ភាពខុសគ្នាជាមួយនឹងកំណែបច្ចុប្បន្ន, (ចុងក្រោយ) = ភាពខុសគ្នារវាងកំណែប្រែពីមុន, តិច = កំណែប្រែតិចតួច",
'history-fieldset-title' => 'ស្វែងរកក្នុងប្រវត្តិ',
'history-show-deleted' => 'តែទំព័រលុបចោលប៉ុណ្ណោះ',
'revdelete-unsuppress' => 'ដកចេញការដាក់កំហិតលើកំណែដែលបានស្តារឡើងវិញ',
'revdelete-log' => 'មូលហេតុ៖',
'revdelete-submit' => 'អនុវត្តទៅលើ{{PLURAL:$1|កំណែ|កំណែទាំងឡាយ}}ដែលបានជ្រើសយក',
-'revdelete-success' => "'''á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\9fá\9e\98á\9f\90á\9e\99á\9e\82á\9f\86á\9e á\9e¾á\9e\89á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេច។'''",
+'revdelete-success' => "'''á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\9fá\9e\98á\9f\90á\9e\99á\9e\82á\9f\86á\9e á\9e¾á\9e\89á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេច។'''",
'revdelete-failure' => "'''មិនអាចបន្ទាន់សម័យគំហើញនៃកំណែប្រែបាន៖'''
$1",
'logdelete-success' => "'''បានកំណត់គំហើញកំណត់ហេតុដោយជោគជ័យ។'''",
'searchprofile-project-tooltip' => 'ស្វែងរកក្នុង $1',
'searchprofile-images-tooltip' => 'ស្វែងរកឯកសាររូបភាព',
'searchprofile-everything-tooltip' => 'ស្វែងរកក្នុងខ្លឹមសារទាំងអស់(រួមបញ្ចូលទាំងទំព័រពិភាក្សា)',
-'searchprofile-advanced-tooltip' => 'á\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91á\9e\80á\9f\86á\9e\93ត់ដោយអ្នកប្រើប្រាស់',
+'searchprofile-advanced-tooltip' => 'á\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91á\9e\80á\9f\86á\9e\8eត់ដោយអ្នកប្រើប្រាស់',
'search-result-size' => '$1({{PLURAL:$2|១ពាក្យ|$2ពាក្យ}})',
'search-result-category-size' => '{{PLURAL:$1|សមាជិកម្នាក់|សមាជិក$1នាក់}} ({{PLURAL:$2|ចំណាត់ថ្នាក់ក្រុមរង១|$2 ចំណាត់ថ្នាក់ក្រុមរង}}, {{PLURAL:$3|1 ឯកសារ|$3 ឯកសារ}})',
'search-result-score' => 'កម្រិតទាក់ទិន៖ $1%',
'search-interwiki-default' => 'លទ្ធផលពី$1៖',
'search-interwiki-more' => '(បន្ថែមទៀត)',
'search-relatedarticle' => 'ទាក់ទិន',
-'mwsuggest-disable' => 'á\9e\98á\9e·á\9e\93á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\9fá\9f\86á\9e\93ើAJAX',
+'mwsuggest-disable' => 'á\9e\98á\9e·á\9e\93á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\9fá\9f\86á\9e\8eើAJAX',
'searcheverything-enable' => 'ស្វែងរកនៅក្នុងលំហឈ្មោះទាំងអស់',
'searchrelated' => 'ទាក់ទិន',
'searchall' => 'ទាំងអស់',
'search-nonefound' => 'មិនមានលទ្ធផលណាមួយត្រូវគ្នានឹងសំណើសុំនេះទេ',
'powersearch' => 'ស្វែងរកថ្នាក់ខ្ពស់',
'powersearch-legend' => 'ស្វែងរកថ្នាក់ខ្ពស់',
-'powersearch-ns' => 'á\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91៖',
+'powersearch-ns' => 'á\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\9bá\9f\86á\9e á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87៖',
'powersearch-redir' => 'បញ្ជីការបញ្ជូនបន្ត',
'powersearch-field' => 'ស្វែងរក',
'powersearch-togglelabel' => 'គូសធីក៖',
'prefs-edits' => 'ចំនួនកំណែប្រែ៖',
'prefsnologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
'prefsnologintext' => 'អ្នកចាំបាច់ត្រូវតែ<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} កត់ឈ្មោះចូល]</span> ដើម្បីកំណត់ចំណង់ចំណូលចិត្តរបស់អ្នក។',
-'changepassword' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់',
+'changepassword' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់',
'prefs-skin' => 'សំបក',
'skin-preview' => 'មើលជាមុន',
'datedefault' => 'គ្មានចំណូលចិត្ត',
'prefs-labs' => 'មុខងារពិសេសថ្មីៗដែលស្ថិតក្រោមការពិសោធន៍នៅឡើយ',
'prefs-user-pages' => 'ទំព័រអ្នកប្រើប្រាស់',
'prefs-personal' => 'ប្រវត្តិរូប',
-'prefs-rc' => 'á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
+'prefs-rc' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
'prefs-watchlist' => 'បញ្ជីតាមដាន',
'prefs-watchlist-days' => 'ចំនួនថ្ងៃត្រូវបង្ហាញក្នុងបញ្ជីតាមដាន៖',
'prefs-watchlist-days-max' => 'អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}',
'prefs-watchlist-edits' => 'ចំនួនអតិបរមានៃបំលាស់ប្តូរត្រូវបង្ហាញក្នុងបញ្ជីតាមដានដែលបានពង្រីក៖',
'prefs-watchlist-edits-max' => 'ចំនួនអតិបរមា៖ ១០០០',
'prefs-misc' => 'ផ្សេងៗ',
-'prefs-resetpass' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់',
+'prefs-resetpass' => 'á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់',
'prefs-changeemail' => 'ផ្លាស់ប្ដូរអ៊ីមែល',
'prefs-setemail' => 'ដាក់អាសយដ្ឋានអ៊ីមែលមួយ',
'prefs-email' => '
ជំរើសទាក់ទិននឹងអ៊ីមែល',
'prefs-rendering' => 'ការរចនា',
'saveprefs' => 'រក្សាទុក',
-'resetprefs' => 'á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9bá\9e\94á\9f\86លាស់ប្ដូរមិនបានរក្សាទុក',
+'resetprefs' => 'á\9e\9bá\9e»á\9e\94á\9e\85á\9f\84á\9e\9bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរមិនបានរក្សាទុក',
'restoreprefs' => 'ស្ដារការកំណត់ទាំងអស់ទៅលំនាំដើម',
'prefs-editing' => 'កំណែប្រែ',
'prefs-edit-boxsize' => 'ទំហំរបស់ផ្ទាំងកែប្រែទំព័រ។',
'resultsperpage' => 'ចំនួនលទ្ធផលក្នុងមួយទំព័រ៖',
'stub-threshold' => 'ទំហំអប្បបរមាសំរាប់ដាក់ជាទំរង់<a href="#" class="stub">តំណភ្ជាប់ទៅទំព័រកំប៉ិចកំប៉ុក</a> (គិតជាបៃ)៖',
'stub-threshold-disabled' => 'មិនប្រើ',
-'recentchangesdays' => 'ចំនួនថ្ងៃបង្ហាញក្នុង ទំព័របំលាស់ប្តូរថ្មីៗ៖',
+'recentchangesdays' => 'ចំនួនថ្ងៃបង្ហាញក្នុងទំព័របន្លាស់ប្តូរថ្មីៗ៖',
'recentchangesdays-max' => '(អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
'recentchangescount' => 'ចំនួនកំណែប្រែដែលត្រូវបង្ហាញតាមលំនាំដើម:',
'prefs-help-recentchangescount' => 'រាប់បញ្ចូលទាំងការកែប្រែនាពេលថ្មី ប្រវត្តិទំព័រនិងកំណត់ហេតុនានា។',
'prefs-help-gender' => 'ដាក់ក៏បានមិនដាក់ក៏បាន៖ ប្រើសំរាប់អោយសូហ្វវែរហៅតាមភេទអោយបាមត្រឹមត្រូវ។ ព័ត៌មាននេះនឹងត្រូវបង្ហាញជាសាធារណៈ។',
'email' => 'អ៊ីមែល',
'prefs-help-realname' => 'អ្នកអាចផ្ដល់ឈ្មោះពិតរបស់អ្នកក៏បានមិនផ្ដល់ក៏បាន។ បើអ្នកផ្ដល់ឱ្យ វានឹងត្រូវបានប្រើប្រាស់់ដើម្បីបញ្ជាក់ភាពជាម្ចាស់លើការរួមចំណែកនានារបស់អ្នក។',
-'prefs-help-email' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9e\98á\9e·á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9f\94 á\9e\94á\9f\89á\9e»á\9e\93á\9f\92á\9e\8aá\9f\82á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e¢á\9f\84á\9e\99á\9e\93á\9e¹á\9e\84á\9e\98á\9e¶á\9e\93á\9e\94á\9f\92á\9e\9aá\9e\99á\9f\84á\9e\87á\9e\93á\9f\8dá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ ពេលដែលអ្នកភ្លេចវា។',
+'prefs-help-email' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9e\98á\9e·á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9f\94 á\9e\94á\9f\89á\9e»á\9e\93á\9f\92á\9e\8aá\9f\82á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e¢á\9f\84á\9e\99á\9e\93á\9e¹á\9e\84á\9e\98á\9e¶á\9e\93á\9e\94á\9f\92á\9e\9aá\9e\99á\9f\84á\9e\87á\9e\93á\9f\8dá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ ពេលដែលអ្នកភ្លេចវា។',
'prefs-help-email-others' => 'អ្នកក៏អាចជ្រើសរើសការផ្ដល់លទ្ឋភាពឱ្យអ្នកដទៃទាក់ទងអ្នកតាមរយៈទំព័រអ្នកប្រើប្រាស់ឬទំព័រពិភាក្សារបស់អ្នកដោយមិនចាំបាច់ឱ្យគេដឹងពីអត្តសញ្ញាណរបស់អ្នកផងដែរ។',
'prefs-help-email-required' => 'អាសយដ្ឋានអ៊ីមែលត្រូវការជាចាំបាច់។',
'prefs-info' => 'ព័ត៌មានផ្ទាល់ខ្លួន',
'prefs-displaywatchlist' => 'ជំរើសការបង្ហាញ',
'prefs-diffs' => 'ភាពខុសគ្នា',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'អាសយដ្ឋានអ៊ីមែលហាក់មានសុពលភាព',
'email-address-validity-invalid' => 'បញ្ចូលអាសយដ្ឋានអ៊ីមែលដែលមានសុពលភាព',
'group-user' => 'អ្នកប្រើប្រាស់',
'group-autoconfirmed' => 'អ្នកប្រើប្រាស់ទទួលស្គាល់ដោយស្វ័យប្រវត្តិ',
'group-bot' => 'រូបយន្ត',
-'group-sysop' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9b',
+'group-sysop' => 'អភិបាល',
'group-bureaucrat' => 'អ្នកការិយាល័យ',
'group-suppress' => 'អធិការ',
'group-all' => '(ទាំងអស់)',
'group-user-member' => '{{GENDER:$1|អ្នកប្រើប្រាស់}}',
'group-autoconfirmed-member' => '{{GENDER:$1|អ្នកប្រើប្រាស់ទទួលស្គាល់ដោយស្វ័យប្រវត្តិ}}',
'group-bot-member' => '{{GENDER:$1|រូបយន្ត}}',
-'group-sysop-member' => '{{GENDER:$1|á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9b}}',
+'group-sysop-member' => '{{GENDER:$1|អភិបាល}}',
'group-bureaucrat-member' => '{{GENDER:$1|អ្នកការិយាល័យ}}',
'group-suppress-member' => '{{GENDER:$1|អធិការ}}',
'right-writeapi' => 'ការប្រើប្រាស់ API សម្រាប់សរសេរ',
'right-delete' => 'លុបទំព័រចោល',
'right-bigdelete' => 'លុបទំព័រទាំងឡាយដែលមានប្រវត្តិវែង',
+'right-deletelogentry' => 'លប់និងឈប់លុបកំណត់ហេតុច្បាស់លាស់ណាមួយ',
'right-deleterevision' => 'លុបនិងឈប់លុបកំណែប្រែច្បាស់លាស់នៃទំព័រ',
-'right-deletedhistory' => 'មើលកំនត់ត្រាប្រវត្តិដែលត្រូវបានលុបចោល ដោយគ្មានអត្ថបទភ្ជាប់របស់វា',
+'right-deletedhistory' => 'មើលកំណត់ត្រាប្រវត្តិដែលត្រូវបានលុបចោល ដោយគ្មានអត្ថបទភ្ជាប់របស់វា',
+'right-deletedtext' => 'មើលផ្នែកអត្ថបទដែលបានលប់និងបន្លាស់ប្ដូររវាងកំណែទាំងឡាយដែលបានលុបចោល',
'right-browsearchive' => 'ស្វែងរកទំព័រដែលត្រូវបានលុបចោល',
'right-undelete' => 'ឈប់លុបទំព័រមួយ',
-'right-suppressrevision' => 'á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99á\9e\93á\9e·á\9e\84á\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\9bá\9e¶á\9e\80á\9f\8b',
+'right-suppressrevision' => 'ពិនិត្យនិងស្ដារកំណែដែលអភិបាលបានលាក់',
'right-suppressionlog' => 'មើលកំណត់ហេតុឯកជន',
'right-block' => 'ហាមមិនឱ្យអ្នកប្រើប្រាស់ដទៃទៀតធ្វើការកែប្រែ',
'right-blockemail' => 'ហាមឃាត់អ្នកប្រើប្រាស់ម្នាក់មិនអោយផ្ញើអ៊ីមែល',
'right-editusercss' => 'កែប្រែឯកសារ CSS របស់អ្នកប្រើប្រាស់ផ្សេងទៀត',
'right-edituserjs' => 'កែប្រែឯកសារ JS របស់អ្នកប្រើប្រាស់ផ្សេងទៀត',
'right-rollback' => 'ត្រឡប់យ៉ាងរហ័សនូវកំណែប្រែទំព័រវិសេសណាមួយដែលធ្វើឡើងដោយអ្នកប្រើប្រាស់ចុងក្រោយគេ។',
-'right-markbotedits' => 'á\9e\85á\9f\86á\9e\93á\9e¶á\9f\86á\9e\80á\9f\86á\9e\93á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9f\92á\9e\9aá\9e¡á\9e\94á\9f\8bá\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89á\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\90á\9e¶á\9e\87á\9e¶á\9e\80á\9f\86á\9e\93ែប្រែដោយរូបយន្ត',
+'right-markbotedits' => 'á\9e\85á\9f\86á\9e\8eá\9e¶á\9f\86á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8fá\9f\92á\9e\9aá\9e¡á\9e\94á\9f\8bá\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89á\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\90á\9e¶á\9e\87á\9e¶á\9e\80á\9f\86á\9e\8eែប្រែដោយរូបយន្ត',
'right-noratelimit' => 'មិនទទួលរងឥទ្ធិពលពីការដាក់កំហិតណាទាំងអស់',
'right-import' => 'នាំចូលទំព័រនានាពីវិគីផ្សេងៗទៀត',
'right-importupload' => 'នាំចូលទំព័រនានាពីឯកសារដែលបានផ្ទុកឡើង',
'right-patrol' => 'ចំណាំកំណែប្រែរបស់អ្នកដ៏ទៃថាជាកំណែប្រែបានល្បាត',
-'right-autopatrol' => 'á\9e\80á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bá\9e\8aá\9f\84á\9e\99á\9e\9fá\9f\92á\9e\9cá\9f\90á\9e\99á\9e\94á\9f\92á\9e\9aá\9e\9cá\9e\8fá\9f\92á\9e\8fá\9e·á\9e\93á\9e¼á\9e\9cá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\90á\9e¶á\9e\87á\9e¶á\9e\80á\9f\86á\9e\93ែប្រែបានល្បាត',
-'right-patrolmarks' => 'á\9e\98á\9e¾á\9e\80កំណត់សម្គាល់ល្បាតដែលផ្លាស់ប្តូរថ្មីៗ',
+'right-autopatrol' => 'á\9e\80á\9e\8fá\9f\8bá\9e\9fá\9e\98á\9f\92á\9e\82á\9e¶á\9e\9bá\9f\8bá\9e\8aá\9f\84á\9e\99á\9e\9fá\9f\92á\9e\9cá\9f\90á\9e\99á\9e\94á\9f\92á\9e\9aá\9e\9cá\9e\8fá\9f\92á\9e\8fá\9e·á\9e\93á\9e¼á\9e\9cá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\90á\9e¶á\9e\87á\9e¶á\9e\80á\9f\86á\9e\8eែប្រែបានល្បាត',
+'right-patrolmarks' => 'á\9e\98á\9e¾á\9e\9bកំណត់សម្គាល់ល្បាតដែលផ្លាស់ប្តូរថ្មីៗ',
'right-unwatchedpages' => 'បង្ហាញបញ្ជីទំព័រនានាដែលមិនត្រូវបានមើល',
'right-mergehistory' => 'ច្របាច់ប្រវត្តិរបស់ទំព័រនានាបញ្ចូលគ្នា',
-'right-userrights' => 'á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\9fá\9e·á\9e\91á\9f\92á\9e\92á\9e·á\9e\93á\9f\83á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶ស់',
+'right-userrights' => 'á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\9fá\9e·á\9e\91á\9f\92á\9e\92á\9e·á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\91á\9e¶á\9f\86á\9e\84á\9e¢ស់',
'right-userrights-interwiki' => 'កែប្រែសិទ្ធិអ្នកប្រើប្រាស់នៅលើវិគីផ្សេងៗទៀត',
'right-siteadmin' => 'ចាក់សោនិងបើកសោមូលដ្ឋានទិន្នន័យ',
'right-override-export-depth' => 'នាំចេញទំព័ររួមទាំងទំព័រដែលមានភ្ជាប់តំណភ្ជាប់រហូតដល់លំដាប់ទី៥',
'right-sendemail' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើដទៃ',
-'right-passwordreset' => 'á\9e\98á\9e¾á\9e\9bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\86ងាត់ឡើងវិញ',
+'right-passwordreset' => 'á\9e\98á\9e¾á\9e\9bá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92ងាត់ឡើងវិញ',
# Special:Log/newusers
'newuserlogpage' => 'កំណត់ហេតុនៃការបង្កើតគណនី',
'action-sendemail' => 'ផ្ញើអ៊ីមែល',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a|á\9e\94á\9f\86លាស់ប្ដូរ}}',
-'recentchanges' => 'á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
+'nchanges' => '$1 {{PLURAL:$1|á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a|á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ}}',
+'recentchanges' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
'recentchanges-legend' => 'ជម្រើសនានា សម្រាប់ការបង្ហាញបន្លាស់ប្ដូរថ្មីៗ',
'recentchanges-summary' => 'តាមដានរាល់បំលាស់ប្ដូរថ្មីៗបំផុតចំពោះវិគីនៅលើទំព័រនេះ។',
'recentchanges-feed-description' => 'តាមដានបន្លាស់ប្ដូរថ្មីៗបំផុតនៃវិគីនេះក្នុងមតិព័ត៌មាននេះ។',
'recentchanges-label-minor' => 'នេះជាការកែប្រែតិចតួចមួយប៉ុណ្ណោះ',
'recentchanges-label-bot' => 'ការកែប្រែនេះត្រូវបានធ្វើឡើងដោយរូបយន្ត',
'recentchanges-label-unpatrolled' => 'ការកែប្រែនេះមិនទាន់ត្រូវបានល្បាតទេ',
-'rcnote' => "á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98â\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\87á\9e¶â\80\8b{{PLURAL:$1|á\9f¡á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a|'''$1'''á\9e\94á\9f\86លាស់ប្ដូរ}}ចុងក្រោយក្នុងរយៈពេល{{PLURAL:$2|ថ្ងៃ|'''$2'''ថ្ងៃ}}ចុងក្រោយគិតត្រឹម$5 $4 ។",
-'rcnotefrom' => "á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\93á\9e¶á\9e\93á\9e¶á\9e\82á\9e·á\9e\8fá\9e\85á\9e¶á\9e\94á\9f\8bá\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸ '''$2''' (á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e¢á\9e\8fá\9e·á\9e\94á\9e\9aá\9e\98á\9e¶ '''$1''' á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a)។",
-'rclistfrom' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1',
+'rcnote' => "á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98â\80\8bá\9e\93á\9f\81á\9f\87â\80\8bá\9e\87á\9e¶â\80\8b{{PLURAL:$1|á\9f¡á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9a|'''$1'''á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ}}ចុងក្រោយក្នុងរយៈពេល{{PLURAL:$2|ថ្ងៃ|'''$2'''ថ្ងៃ}}ចុងក្រោយគិតត្រឹម$5 $4 ។",
+'rcnotefrom' => "á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\93á\9e¶á\9e\93á\9e¶á\9e\82á\9e·á\9e\8fá\9e\85á\9e¶á\9e\94á\9f\8bá\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸ '''$2''' (á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e¢á\9e\8fá\9e·á\9e\94á\9e\9aá\9e\98á\9e¶á\9e\85á\9f\86á\9e\93á\9e½á\9e\93 '''$1''')។",
+'rclistfrom' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1',
'rcshowhideminor' => '$1កំណែប្រែតិចតួច',
'rcshowhidebots' => '$1រូបយន្ត',
'rcshowhideliu' => '$1អ្នកប្រើប្រាស់ដែលបានកត់ឈ្មោះចូល',
'rcshowhideanons' => '$1អ្នកប្រើប្រាស់អនាមិក',
'rcshowhidepatr' => '$1កំណែប្រែដែលបានល្បាត',
'rcshowhidemine' => '$1កំណែប្រែរបស់ខ្ញុំ',
-'rclinks' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\94á\9f\86លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ<br />$3',
+'rclinks' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ<br />$3',
'diff' => 'ប្រៀបធៀប',
'hist' => 'ប្រវត្តិ',
'hide' => 'លាក់',
'rc_categories' => 'កម្រិតទីតាំងចំណាត់ថ្នាក់ក្រុម(ខណ្ឌដោយសញ្ញា "|")',
'rc_categories_any' => 'មួយណាក៏បាន',
'rc-change-size' => '$1',
-'rc-change-size-new' => '$1 {{PLURAL:$1|á\9e\94á\9f\83|á\9e\94á\9f\83}} á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8bá\9e\96á\9e¸á\9e\94á\9f\86លាស់ប្ដូរ',
+'rc-change-size-new' => '$1 {{PLURAL:$1|á\9e\94á\9f\83|á\9e\94á\9f\83}} á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8bá\9e\96á\9e¸á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ',
'newsectionsummary' => '/* $1 */ ផ្នែកថ្មី',
'rc-enhanced-expand' => 'បង្ហាញព័ត៌មានលំអិត (តម្រូវអោយមាន JavaScript)',
'rc-enhanced-hide' => 'លាក់ព័ត៌មានលំអិត',
# Recent changes linked
'recentchangeslinked' => 'បន្លាស់ប្ដូរពាក់ព័ន្ធ',
-'recentchangeslinked-feed' => 'á\9e\94á\9f\86លាស់ប្ដូរពាក់ព័ន្ធ',
+'recentchangeslinked-feed' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរពាក់ព័ន្ធ',
'recentchangeslinked-toolbox' => 'បន្លាស់ប្ដូរពាក់ព័ន្ធ',
'recentchangeslinked-title' => 'បន្លាស់ប្ដូរទាក់ទងនឹង "$1"',
'recentchangeslinked-noresult' => 'គ្មានបន្លាស់ប្ដូរលើទំព័រដែលត្រូវបានតភ្ជាប់ ក្នុងថេរវេលាដែលត្រូវបានផ្តល់ឱ្យ ។',
'uploadnologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
'uploadnologintext' => 'អ្នកត្រូវតែ [[Special:UserLogin|កត់ឈ្មោះចូល]] ដើម្បីមានសិទ្ធិផ្ទុកឯកសារទាំងឡាយឡើង។',
'upload_directory_missing' => 'ថតសំរាប់ទុកឯកសារផ្ទុកឡើង ($1) បាត់ ហើយប្រព័ន្ធបំរើការមិនអាចបង្កើតវាបានទេ។',
-'upload_directory_read_only' => 'á\9e\94á\9f\92á\9e\9aá\9e\96á\9f\90á\9e\93á\9f\92á\9e\92á\9e\94á\9f\86រើការមិនអាចសរសេរចូលទៅក្នុងថតសំរាប់ទុកឯកសារផ្ទុកឡើង ($1) ទេ។',
+'upload_directory_read_only' => 'á\9e\94á\9f\92á\9e\9aá\9e\96á\9f\90á\9e\93á\9f\92á\9e\92á\9e\94á\9e\98á\9f\92រើការមិនអាចសរសេរចូលទៅក្នុងថតសំរាប់ទុកឯកសារផ្ទុកឡើង ($1) ទេ។',
'uploaderror' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
'upload-recreate-warning' => "''ប្រយ័ត្ន៖ ឯកសារដែលមានឈ្មោះដូចគ្នានេះត្រូវបានលុបចោលឬប្ដូរទីតាំង។'''
'filename' => 'ឈ្មោះឯកសារ',
'filedesc' => 'ចំណារពន្យល់',
'fileuploadsummary' => 'ចំណារពន្យល់៖',
-'filereuploadsummary' => 'á\9e\94á\9f\86លាស់ប្ដូរឯកសារ៖',
+'filereuploadsummary' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរឯកសារ៖',
'filestatus' => 'ស្ថានភាពរក្សាសិទ្ធិ៖',
'filesource' => 'ប្រភព',
'uploadedfiles' => 'ឯកសារដែលត្រូវបានផ្ទុកឡើង',
-'ignorewarning' => 'មិនខ្វល់ការព្រមាន ហើយរក្សាទុកឯកសារតែម្តង។',
-'ignorewarnings' => 'មិនខ្វល់ការព្រមានណាមួយ',
+'ignorewarning' => 'á\9e\98á\9e·á\9e\93á\9e\81á\9f\92á\9e\9cá\9e\9bá\9f\8bâ\80\8bá\9e\96á\9e¸á\9e\80á\9e¶á\9e\9aá\9e\96á\9f\92á\9e\9aá\9e\98á\9e¶á\9e\93 á\9e á\9e¾á\9e\99á\9e\9aá\9e\80á\9f\92á\9e\9fá\9e¶á\9e\91á\9e»á\9e\80â\80\8bá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\8fá\9f\82á\9e\98á\9f\92á\9e\8fá\9e\84á\9f\94',
+'ignorewarnings' => 'á\9e\98á\9e·á\9e\93á\9e\81á\9f\92á\9e\9cá\9e\9bá\9f\8bâ\80\8bá\9e\96á\9e¸á\9e\80á\9e¶á\9e\9aá\9e\96á\9f\92á\9e\9aá\9e\98á\9e¶á\9e\93â\80\8bá\9e\8eá\9e¶á\9e\98á\9e½á\9e\99',
'minlength1' => 'ឈ្មោះឯកសារត្រូវមានយ៉ាងតិច១អក្សរ។',
'illegalfilename' => 'ឈ្មោះឯកសារ "$1" មានអក្សរហាមឃាត់ក្នុងចំណងជើងទំព័រ។ សូមប្តូរឈ្មោះឯកសារ ហើយព្យាយាមផ្ទុកវាឡើងម្តងទៀត។',
'filename-toolong' => 'ឈ្មោះឯកសារមិនអាចវែងជាង 240 បៃទេ។',
-'badfilename' => 'ឈ្មោះឯកសារ បានត្រូវប្តូរ ជា "$1" ។',
+'badfilename' => 'ឈ្មោះឯកសារត្រូវបានប្តូរជា "$1" ។',
'filetype-mime-mismatch' => 'កន្ទុយរបស់ឯកសារ ".$1" មិនត្រូវគ្នានឹងប្រភេទ MIME របស់ឯកសារ ($2) ទេ។',
'filetype-badmime' => 'ឯកសារប្រភេទ MIME "$1" មិនត្រូវបានអនុញ្ញាតឱ្យផ្ទុកឡើង។',
'filetype-bad-ie-mime' => 'មិនអាចផ្ទុកឯកសារនេះឡើងបានទេ ព្រោះInternet Explorerបានរកឃើញថាឯកសារនេះជា "$1" ដែលជាប្រភេទឯកសារហាមឃាត់និងមានគ្រោះថ្នាក់ខ្លាំង។',
{{PLURAL:$3|ប្រភេទឯកសារ|ប្រភេទឯកសារ}}ដែលគេចង់បានគឺ $2។',
'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|មិនមែនជាប្រភេទឯកសារដែលត្រូវបានគេអនុញ្ញាតទេ|មិនមែនជាប្រភេទឯកសារដែលត្រូវបានគេអនុញ្ញាតទេ}}។
{{PLURAL:$3|ប្រភេទឯកសារ|ប្រភេទឯកសារ}}ដែលត្រូវបានគេអនុញ្ញាតគឺ $2 ។',
-'filetype-missing' => 'ឯកសារ មិនមានកន្ទុយ (ដូចជា ".jpg")។',
+'filetype-missing' => 'ឯកសារគ្មានកន្ទុយ (ដូចជា ".jpg")។',
'empty-file' => 'ឯកសារដែលអ្នកបានដាក់ស្នើគឺទទេ។',
'file-too-large' => 'ឯកសារដែលអ្នកបានដាក់ស្នើធំពេកហើយ។',
'filename-tooshort' => 'ឈ្មោះឯកសារខ្លីពេកហើយ។',
'uploadscripted' => 'ឯកសារនេះមានកូដHTMLឬស្គ្រីបដែលអាចអោយឧបករណ៍រាវរកវិបសាយមានការយល់ច្រលំ។',
'uploadvirus' => 'ឯកសារមានមេរោគ!
-á\9e\9fá\9f\81á\9e\85á\9e\80á\9f\92á\9e\8fá\9e¸á\9e\9bá\9f\86អិត៖ $1',
+á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\9bá\9e\98á\9f\92អិត៖ $1',
'uploadjava' => 'ឯកសារនេះជាប្រភេទ ZIP ដែលមានផ្ទុក Java .class។
ការផ្ទុកឡើងឯកសារ Java ត្រូវបានហាមឃាត់ ព្រោះវាអាចធ្វើមានបញ្ហាក្នុងការឆ្លងកុងត្រូលសុវត្តិភាព។',
'upload-source' => 'ឯកសារប្រភព',
MGP # ម៉ាក Pentax
PICT # ផ្សេងៗ
#</pre> <!-- leave this line exactly as it is -->',
-'upload-success-subj' => 'á\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e¡á\9e¾á\9e\84á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេច',
-'upload-success-msg' => 'á\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e¡á\9e¾á\9e\84á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\96á\9e¸ [$2] á\9e\94á\9e¶á\9e\93á\9e\91á\9e\91á\9e½á\9e\9bá\9e\87á\9f\84á\9e\82á\9e\87á\9f\90យ។ អ្នកអាចរកវាបាននៅទៅនេះ៖ [[:{{ns:file}}:$1]]',
+'upload-success-subj' => 'á\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e¡á\9e¾á\9e\84á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេច',
+'upload-success-msg' => 'á\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\91á\9e»á\9e\80á\9e¡á\9e¾á\9e\84á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\96á\9e¸ [$2] á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85á\9e á\9e¾យ។ អ្នកអាចរកវាបាននៅទៅនេះ៖ [[:{{ns:file}}:$1]]',
'upload-failure-subj' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
'upload-failure-msg' => 'មានបញ្ហាមួយជាមួយការផ្ទុកឡើងរបស់អ្នកពី [$2]៖
'upload-file-error' => 'បញ្ហាផ្នែកខាងក្នុង',
'upload-file-error-text' => 'បញ្ហាផ្នែកខាងក្នុងបានកើតឡើង នៅពេលព្យាយាមបង្កើតឯកសារបណ្ដោះអាសន្នមួយនៅក្នុងម៉ាស៊ីនបម្រើការ។
-á\9e\9fá\9e¼á\9e\98á\9e\91á\9f\86á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\91á\9f\86á\9e\93á\9e\84[[Special:ListUsers/sysop|á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9b]]á\9f\94',
+សូមទំនាក់ទំនង[[Special:ListUsers/sysop|អភិបាល]]។',
'upload-misc-error' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
'upload-misc-error-text' => 'បញ្ហាដែលមិនស្គាល់មួយបានកើតឡើងនៅក្នុងកំឡុងពេលផ្ទុកឡើង។
ចូរផ្ទៀងផ្ទាត់ថា URL គឺមានសុពលភាពហើយអាចដំណើរការ រួចហើយព្យាយាមម្តងទៀត។
-á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e\94á\9e\89á\9f\92á\9e á\9e¶á\9e\93á\9f\85á\9e\8fá\9f\82á\9e\80á\9e¾á\9e\8fá\9e¡á\9e¾á\9e\84 á\9e\9fá\9e¼á\9e\98á\9e\91á\9f\86á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\91á\9f\86á\9e\93á\9e\84[[Special:ListUsers/sysop|អ្នកអភិបាល]]។',
-'upload-too-many-redirects' => 'URLá\9e\93á\9f\81á\9f\87á\9e\98á\9e¶á\9e\93á\9e\8fá\9f\86á\9e\93ភ្ជាប់បញ្ជូនបន្តច្រើនពេកហើយ',
+á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e\94á\9e\89á\9f\92á\9e á\9e¶á\9e\93á\9f\85á\9e\8fá\9f\82á\9e\80á\9e¾á\9e\8fá\9e¡á\9e¾á\9e\84 á\9e\9fá\9e¼á\9e\98á\9e\91á\9e¶á\9e\80á\9f\8bá\9e\91á\9e\84á\9e\91á\9f\85[[Special:ListUsers/sysop|អ្នកអភិបាល]]។',
+'upload-too-many-redirects' => 'URLá\9e\93á\9f\81á\9f\87á\9e\98á\9e¶á\9e\93á\9e\8fá\9f\86á\9e\8eភ្ជាប់បញ្ជូនបន្តច្រើនពេកហើយ',
'upload-unknown-size' => 'មិនដឹងទំហំ',
'upload-http-error' => 'មានកំហុសHTTPមួយបានកើតឡើង៖ $1',
'backend-fail-maxsize' => 'មិនអាចសរសេរឯកសារ "$1" បានទេពីព្រោះវាមានទំហំធំជាង {{PLURAL:$2|មួយបៃ|$2 បៃ}}.',
# Special:UploadStash
-'uploadstash-errclear' => 'á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\86á\9e¢á\9e¶á\9e\8fá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86រេច។',
+'uploadstash-errclear' => 'á\9e\80á\9e¶á\9e\9aá\9e\9fá\9e\98á\9f\92á\9e¢á\9e¶á\9e\8fá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92រេច។',
'uploadstash-refresh' => 'ផ្ទុកបញ្ជីឯកសារឡើងវិញ',
# img_auth script messages
អ្នកគួរតែសាកល្បងនៅពេលដែលវិបសាយនេះមិនសូវរវល់។',
'license' => 'អាជ្ញាប័ណ្ណ',
-'license-header' => 'á\9e\8aá\9e¶á\9e\80á\9f\8bâ\80\8bá\9e\87á\9e¶អាជ្ញាប័ណ្ណ',
+'license-header' => 'á\9e\80á\9e¶á\9e\9aá\9e\8aá\9e¶á\9e\80á\9f\8bអាជ្ញាប័ណ្ណ',
'nolicense' => 'គ្មាន',
'license-nopreview' => '(មិនទាន់មានការបង្ហាញការមើលជាមុនទេ)',
-'upload_source_url' => ' (URL ត្រឹមត្រូវនិងបើកចំហជាសាធារណៈ)',
-'upload_source_file' => ' (ឯកសារក្នុងកុំព្យូទ័ររបស់អ្នក)',
+'upload_source_url' => '(URL ត្រឹមត្រូវនិងបើកចំហជាសាធារណៈ)',
+'upload_source_file' => '(ឯកសារក្នុងកុំព្យូទ័ររបស់អ្នក)',
# Special:ListFiles
'listfiles-summary' => 'ទំព័រពិសេសនេះបង្ហាញគ្រប់ឯកសារដែលបានផ្ទុកឡើង។
'filehist-filesize' => 'ទំហំឯកសារ',
'filehist-comment' => 'យោបល់',
'filehist-missing' => 'ឯកសារបាត់បង់',
-'imagelinks' => 'á\9e\94á\9f\86á\9e\9aá\9e¾á\9e\94á\9f\86រាស់ឯកសារ',
+'imagelinks' => 'á\9e\94á\9e\98á\9f\92á\9e\9aá\9e¾á\9e\94á\9e\98á\9f\92រាស់ឯកសារ',
'linkstoimage' => '{{PLURAL:$1|ទំព័រ|$1 ទំព័រ}} ខាងក្រោមមានតំណភ្ជាប់មកឯកសារនេះ ៖',
'linkstoimage-more' => 'មាន{{PLURAL:$1|តំណភ្ជាប់ទំព័រ}}ច្រើនជាង $1 មកកាន់ឯកសារនេះ។
បញ្ជីនេះបង្ហាញអំពី{{PLURAL:$1|តំណភ្ជាប់ទំព័រដំបូង|តំណភ្ជាប់ទំព័រ $1ដំបូង}}មកកាន់ឯកសារនេះប៉ុណ្ណោះ។
'nolinkstoimage' => 'គ្មានទំព័រណាមួយដែលតភ្ជាប់មកឯកសារនេះទេ។',
'morelinkstoimage' => 'មើល [[Special:WhatLinksHere/$1|តំណភ្ជាប់បន្ថែមទៀត]] ដែលតភ្ជាប់មកកាន់ឯកសារនេះ។',
'linkstoimage-redirect' => '$1 (ឯកសារបញ្ជូនបន្ត) $2',
-'duplicatesoffile' => '{{PLURAL:$1|file is a duplicate|$1 á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\87á\9e¶á\9e\85á\9f\92á\9e\94á\9e¶á\9e\94á\9f\8bá\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84}}á\9e\8aá\9e¼á\9e\85á\9e\8fá\9e\91á\9f\85â\80\8bá\9e\93á\9f\83â\80\8bá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\93á\9f\81á\9f\87â\80\8b ([[Special:FileDuplicateSearch/$2|á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93â\80\8bá\9e\9bá\9f\86អិត]])៖',
+'duplicatesoffile' => '{{PLURAL:$1|file is a duplicate|$1 á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\87á\9e¶á\9e\85á\9f\92á\9e\94á\9e¶á\9e\94á\9f\8bá\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84}}á\9e\8aá\9e¼á\9e\85á\9e\8fá\9e\91á\9f\85â\80\8bá\9e\93á\9f\83â\80\8bá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aâ\80\8bá\9e\93á\9f\81á\9f\87â\80\8b ([[Special:FileDuplicateSearch/$2|á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93â\80\8bá\9e\9bá\9e\98á\9f\92អិត]])៖',
'sharedupload' => 'ឯកសារនេះបានមកពី $1 និងអាចត្រូវបានប្រើប្រាស់នៅគម្រោងដទៃទៀត។',
'sharedupload-desc-there' => 'ឯកសារនេះមកពី $1 និងអាចត្រូវបានប្រើប្រាស់ដោយគម្រោងផ្សេងៗដទៃទៀត។
សូមមើល[ទំព័របរិយាយឯកសារ $2] សម្រាប់ព័ត៌មានបន្ថែម។',
-'sharedupload-desc-here' => 'ឯកសារនេះមានប្រភពមកពី $1 និងអាចត្រូវបានប្រើដោយគំរោងដ៏ទៃទៀត។
-ការពណ៌នានៅលើ [$2 ទំព័រពណ៌នា]អំពីវា មានបង្ហាញខាងក្រោមនេះ។',
+'sharedupload-desc-here' => 'ឯកសារនេះមានប្រភពមកពី $1 និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
+ការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវា មានបង្ហាញខាងក្រោមនេះ។',
+'sharedupload-desc-edit' => 'ឯកសារនេះមានប្រភពមកពី $1 និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
+ប្រហែលជាអ្នកចង់កែប្រែការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវានៅទីនោះ។',
+'sharedupload-desc-create' => 'ឯកសារនេះមានប្រភពមកពី $1 និងអាចត្រូវបានប្រើដោយគម្រោងដ៏ទៃទៀត។
+ប្រហែលជាអ្នកកែប្រែការពណ៌នានៅលើ[$2 ទំព័រពណ៌នា]អំពីវានៅទីនោះ។',
'filepage-nofile' => 'គ្មានឯកសារដែលមានឈ្មោះនេះទេ។',
-'filepage-nofile-link' => 'គ្មានរូបភាពដែលមានឈ្មោះនេះទេ។ ប៉ុន្តែអ្នកអាច [$1 ផ្ទុកវាឡើង] ។',
+'filepage-nofile-link' => 'គ្មានរូបភាពដែលមានឈ្មោះនេះទេ។ ប៉ុន្តែអ្នកអាច[$1 ផ្ទុកវាឡើង] ។',
'uploadnewversion-linktext' => 'ផ្ទុកឡើងមួយកំណែថ្មីនៃឯកសារនេះ',
'shared-repo-from' => 'ពី $1',
'shared-repo' => 'ឃ្លាំងរួម',
'statistics-edits' => 'ការកែប្រែទំព័រចាប់តាំងពី{{SITENAME}}ត្រូវបានដំឡើង',
'statistics-edits-average' => 'កំណែប្រែជាមធ្យមក្នុងមួយទំព័រ',
'statistics-views-total' => 'ចំនួនការចូលមើលសរុប',
-'statistics-views-total-desc' => 'á\9e\98á\9e·á\9e\93á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\80á\9e¶á\9e\9aá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93និងទំព័រពិសេសៗទេ',
+'statistics-views-total-desc' => 'á\9e\98á\9e·á\9e\93á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\80á\9e¶á\9e\9aá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\9aá\9e¼á\9e\94á\9e\9aá\9e¶á\9e\84និងទំព័រពិសេសៗទេ',
'statistics-views-peredit' => 'ចំនួនការចូលមើលក្នុងមួយកំណែប្រែ',
'statistics-users' => '[[Special:ListUsers|អ្នកប្រើប្រាស់]]ដែលបានចុះឈ្មោះ',
'statistics-users-active' => 'អ្នកប្រើប្រាស់សកម្ម',
'protectedtitlesempty' => 'មិនមានចំណងជើងណាដែលត្រូវបានការពារជាមួយនឹងប៉ារ៉ាម៉ែតទាំងនេះទេនាពេលថ្មីៗនេះ។',
'listusers' => 'បញ្ជីអ្នកប្រើប្រាស់',
'listusers-editsonly' => 'បង្ហាញតែអ្នកប្រើប្រាស់ដែលបានកែប្រែអត្ថបទប៉ុណ្ណោះ',
-'listusers-creationsort' => 'á\9e\8fá\9f\86រៀបតាមលំដាប់កាលបរិច្ឆេទបង្កើត',
+'listusers-creationsort' => 'á\9e\8fá\9e\98á\9f\92រៀបតាមលំដាប់កាលបរិច្ឆេទបង្កើត',
'usereditcount' => '$1 {{PLURAL:$1|កំណែប្រែ|កំណែប្រែ}}',
'usercreated' => '{{GENDER:$3|បានបង្កើត}}នៅ$1 $2',
'newpages' => 'ទំព័រថ្មីៗ',
# Special:Log
'specialloguserlabel' => 'អ្នកប្រព្រឹត្តិ៖',
-'speciallogtitlelabel' => 'á\9e\82á\9f\84á\9e\9bá\9e\8aá\9f\85 (á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84á\9e¢á\9e\8fá\9f\92á\9e\8fបទឬអត្តនាមអ្នកប្រើប្រាស់)៖',
+'speciallogtitlelabel' => 'á\9e\82á\9f\84á\9e\9bá\9e\8aá\9f\85 (á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84á\9e¢á\9e\8fá\9f\92á\9e\90បទឬអត្តនាមអ្នកប្រើប្រាស់)៖',
'log' => 'កំណត់ហេតុ',
'all-logs-page' => 'កំណត់ហេតុសាធារណៈទាំងអស់',
'alllogstext' => 'ការបង្ហាញកំណត់ហេតុទាំងអស់របស់{{SITENAME}}។
'allpagesnext' => 'បន្ទាប់',
'allpagessubmit' => 'ទៅ',
'allpagesprefix' => 'បង្ហាញទំព័រដែលចាប់ផ្ដើមដោយ ៖',
-'allpagesbadtitle' => 'ចំណងជើងទំព័រដែលត្រូវបានផ្តល់ឱ្យគឺគ្មានសុពលភាពឬក៏មានបុព្វបទដែលមានអន្តរភាសាឬអន្តរវីគី។ ប្រហែលជាវាមានអក្សរមួយឬច្រើន ដែលមិនអាចត្រូវប្រើនៅក្នុងចំណងជើង។',
-'allpages-bad-ns' => '{{SITENAME}}á\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91"$1"ទេ។',
+'allpagesbadtitle' => 'ចំណងជើងទំព័រដែលត្រូវបានផ្តល់ឱ្យគឺគ្មានសុពលភាពឬក៏មានបុព្វបទដែលមានអន្តរភាសាឬអន្តរវីគី។ ប្រហែលជាវាមានអក្សរមួយឬច្រើន ដែលគេហាមមិនឱ្យប្រើនៅក្នុងចំណងជើង។',
+'allpages-bad-ns' => '{{SITENAME}}á\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\9bá\9f\86á\9e á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87"$1"ទេ។',
'allpages-hide-redirects' => 'លាក់ការបញ្ជូនបន្ត',
# SpecialCachedPage
# Special:ListUsers
'listusersfrom' => 'បង្ហាញអ្នកប្រើប្រាស់ចាប់ផ្តើមពី៖',
'listusers-submit' => 'បង្ហាញ',
-'listusers-noresult' => 'á\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9e»á\9e\98នេះទេ។',
+'listusers-noresult' => 'á\9e\9aá\9e\80á\9e\98á\9e·á\9e\93á\9e\83á\9e¾á\9e\89á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bនេះទេ។',
'listusers-blocked' => '(ស្ថិតក្រោមការហាមឃាត់)',
# Special:ActiveUsers
'activeusers-count' => '{{PLURAL:$1|សកម្មភាព|សកម្មភាព}}ចំនួន$1 ក្នុងរយៈពេល{{PLURAL:$3|១ថ្ងៃ|$3 ថ្ងៃ}}ចុងក្រោយ',
'activeusers-from' => 'បង្ហាញអត្តនាមផ្ដើមដោយ៖',
'activeusers-hidebots' => 'លាក់រូបយន្ត',
-'activeusers-hidesysops' => 'á\9e\9bá\9e¶á\9e\80á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9b',
+'activeusers-hidesysops' => 'លាក់អភិបាល',
'activeusers-noresult' => 'អ្នកប្រើប្រាស់រកមិនឃើញ។',
# Special:ListGroupRights
'listgrouprights-addgroup-self-all' => 'បន្ថែមក្រុមទាំងអស់ទៅគណនីផ្ទាល់ខ្លួន',
'listgrouprights-removegroup-self-all' => 'យកចេញក្រុមទាំងអស់ពីគណនីផ្ទាល់ខ្លួន',
-# E-mail user
-'mailnologin' => 'á\9e\98á\9e·á\9e\93មានអាសយដ្ឋានផ្ញើទេ',
+# Email user
+'mailnologin' => 'á\9e\82á\9f\92មានអាសយដ្ឋានផ្ញើទេ',
'mailnologintext' => 'អ្នកត្រូវតែ [[Special:UserLogin|កត់ឈ្មោះចូល]] និង មានអាសយដ្ឋានអ៊ីមែលមានសុពលភាពមួយ ក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]របស់អ្នក ដើម្បីមានសិទ្ធិផ្ញើអ៊ីមែលទៅអ្នកប្រើប្រាស់ដទៃទៀត។',
'emailuser' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់នេះ',
'emailuser-title-target' => 'ផ្ញើសារទៅកាន់ {{GENDER:$1|អ្នកប្រើប្រាស់}} នេះ',
'noemailtext' => 'អ្នកប្រើប្រាស់នេះមិនបានផ្ដល់អាសយដ្ឋានអ៊ីមែលដែលមានសុពលភាពទេ។',
'nowikiemailtitle' => 'មិនអនុញ្ញាតអោយប្រើអ៊ីមែល',
'nowikiemailtext' => 'អ្នកប្រើប្រាស់នេះបានជ្រើសរើសមិនទទួលអ៊ីមែលពីអ្នកប្រើប្រាស់ដទៃទៀត។',
-'emailnotarget' => 'á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e\91á\9e\91á\9e½á\9e\9bá\9e\98á\9e·á\9e\93á\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e¬á\9e\87á\9e¶á\9e¢á\9e\8fá\9f\92á\9e\8fá\9e\93á\9e¶á\9e\98á\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9f\94',
+'emailnotarget' => 'អត្តនាមអ្នកទទួលមិនត្រឹមត្រូវឬគ្មាន។',
'emailtarget' => 'វាយបញ្ចូលអត្តនាមអ្នកទទួល',
'emailusername' => 'អត្តនាម៖',
'emailusernamesubmit' => 'ដាក់ស្នើ',
# Watchlist
'watchlist' => 'បញ្ជីតាមដាន',
'mywatchlist' => 'បញ្ជីតាមដាន',
-'watchlistfor2' => 'á\9e\9fá\9f\86រាប់ $1 $2',
+'watchlistfor2' => 'á\9e\9fá\9e\98á\9f\92រាប់ $1 $2',
'nowatchlist' => 'គ្មានអ្វីនៅក្នុងបញ្ជីតាមដានរបស់អ្នកទេ។',
'watchlistanontext' => 'សូម $1 ដើម្បីមើលឬកែប្រែរបស់ក្នុងបញ្ជីតាមដានរបស់អ្នក។',
'watchnologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
'enotif_mailer' => 'ភ្នាក់ងារផ្ញើអ៊ីមែលផ្ដល់ដំណឹងរបស់ {{SITENAME}}',
'enotif_reset' => 'កត់សម្គាល់រាល់គ្រប់ទំព័រដែលបានចូលមើល',
'enotif_impersonal_salutation' => 'អ្នកប្រើប្រាស់ {{SITENAME}}',
-'enotif_lastvisited' => 'á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99 $1 á\9e\85á\9f\86á\9e\96á\9f\84á\9f\87á\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9a á\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸á\9e\96á\9f\81á\9e\9bá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9b ចុងក្រោយ។',
-'enotif_lastdiff' => 'á\9e\9fá\9e¼á\9e\98á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99$1á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\98á\9e¾á\9e\9bá\9e\94á\9f\86លាស់ប្តូរនេះ។',
+'enotif_lastvisited' => 'á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99 $1 á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸á\9e\96á\9f\81á\9e\9bá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bចុងក្រោយ។',
+'enotif_lastdiff' => 'á\9e\9fá\9e¼á\9e\98á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99$1á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\98á\9e¾á\9e\9bá\9e\94á\9e\93á\9f\92លាស់ប្តូរនេះ។',
'enotif_anon_editor' => 'អ្នកប្រើប្រាស់អនាមិក $1',
'enotif_body' => 'ជូនចំពោះ $WATCHINGUSERNAME ជាទីរាប់អាន,
'historywarning' => "'''ប្រយ័ត្ន៖''' ទំព័រដែលអ្នកបំរុងនឹងលុប មានប្រវត្តិចំនួនប្រហែល $1 {{PLURAL:$1|កំណែ|កំណែ}}៖",
'confirmdeletetext' => 'អ្នកប្រុងនឹងលុបចោលទាំងស្រុង នូវទំព័រមួយដោយរួមបញ្ចូលទាំងប្រវត្តិកែប្រែរបស់វាផង។
សូមអ្នកអះអាងថា អ្នកពិតជាមានចេតនាធ្វើបែបហ្នឹង និងថាអ្នកបានយល់ច្បាស់ពីផលវិបាកទាំងឡាយដែលអាចកើតមាន និងសូមអះអាងថា អ្នកធ្វើស្របតាម [[{{MediaWiki:Policy-url}}|គោលការណ៍]]។',
-'actioncomplete' => 'á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\9aá\9e½á\9e\85á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\87á\9e¶á\9e\9fá\9f\92á\9e\90á\9e¶á\9e\96á\9e\9a',
-'actionfailed' => 'á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96â\80\8bá\9e\94á\9e\9aá\9e¶á\9e\87á\9f\90á\9e\99',
+'actioncomplete' => 'á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85',
+'actionfailed' => 'á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96â\80\8bá\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85',
'deletedtext' => '"$1"ត្រូវបានលុបចោលរួចហើយ។
សូមមើល$2សំរាប់បញ្ជីនៃការលុបចោលនាពេលថ្មីៗ។',
'tooltip-pt-mytalk' => 'ទំព័រពិភាក្សារបស់អ្នក',
'tooltip-pt-anontalk' => 'ការពិភាក្សាអំពីកំណែប្រែដែលធ្វើឡើងចេញពីអាសយដ្ឋាន IP នេះ',
'tooltip-pt-preferences' => 'ចំណង់ចំណូលចិត្ត',
-'tooltip-pt-watchlist' => 'á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸â\80\8bá\9e\93á\9f\83â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\86á\9e\96á\9e»á\9e\84â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e½á\9e\8fá\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99â\80\8bá\9e\9aá\9e\80â\80\8bá\9e\94á\9f\86លាស់ប្ដូរ',
+'tooltip-pt-watchlist' => 'á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸â\80\8bá\9e\93á\9f\83â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\86á\9e\96á\9e»á\9e\84â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e½á\9e\8fá\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99â\80\8bá\9e\9aá\9e\80â\80\8bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរ',
'tooltip-pt-mycontris' => 'បញ្ជីនៃការរួមចំណែករបស់អ្នក',
'tooltip-pt-login' => 'អ្នកត្រូវបានលើកទឹកចិត្តឱ្យកត់ឈ្មោះចូល។ ប៉ុន្តែនេះមិនមែនជាការបង្ខំទេ។',
'tooltip-pt-anonlogin' => 'អ្នកត្រូវបានលើកទឹកចិត្តឱ្យកត់ឈ្មោះចូល មិនមែនជាការបង្ខំទេ។',
'tooltip-ca-talk' => 'ការពិភាក្សាអំពីទំព័រខ្លឹមសារនេះ',
'tooltip-ca-edit' => "អ្នកអាចកែប្រែទំព័រនេះ ។ សូមប្រើប្រាស់ប៊ូតុង 'បង្ហាញការមើលមុន' មុននឹងរក្សាទុកវា ។",
'tooltip-ca-addsection' => 'ចាប់ផ្ដើមផ្នែកថ្មីមួយក្នុងទំព័រពិភាក្សានេះ',
-'tooltip-ca-viewsource' => 'ទំព័រនេះបានត្រូវការពារ ។ អ្នកអាចមើលអក្សរកូដរបស់វា ។',
+'tooltip-ca-viewsource' => 'ទំព័រនេះបានត្រូវការពារ ។ អ្នកអាចមើលអក្សរកូដរបស់វាបាន ។',
'tooltip-ca-history' => 'កំណែកន្លងមករបស់ទំព័រនេះ ។',
'tooltip-ca-protect' => 'ការពារទំព័រនេះ',
'tooltip-ca-unprotect' => 'ផ្លាស់ប្ដូរការការពារទំព័រនេះ',
'tooltip-p-logo' => 'ទំព័រដើម',
'tooltip-n-mainpage' => 'ចូលមើលទំព័រដើម',
'tooltip-n-mainpage-description' => 'ចូលមើលទំព័រដើម',
-'tooltip-n-portal' => 'អំពីគម្រោង វិធីប្រើប្រាស់ និង ការស្វែងរកព័ត៌មាន',
+'tooltip-n-portal' => 'អំពីគម្រោង វិធីប្រើប្រាស់ និងការស្វែងរកព័ត៌មាន',
'tooltip-n-currentevents' => 'រកមើលព័ត៌មានទាក់ទិននឹងព្រឹត្តិការណ៍បច្ចុប្បន្ន',
'tooltip-n-recentchanges' => 'បញ្ជីនៃបន្លាស់ប្ដូរថ្មីៗនៅក្នុងវិគីនេះ',
'tooltip-n-randompage' => 'ផ្ទុកទំព័រចៃដន្យមួយទំព័រ',
'tooltip-ca-nstab-help' => 'មើលទំព័រជំនួយ',
'tooltip-ca-nstab-category' => 'មើលទំព័រចំណាត់ថ្នាក់ក្រុម',
'tooltip-minoredit' => "ចំណាំកំណែប្រែនេះថាជា 'កំណែប្រែតិចតួច'",
-'tooltip-save' => 'á\9e\9aá\9e\80á\9f\92á\9e\9fá\9e¶á\9e\94á\9f\86លាស់ប្ដូររបស់អ្នកទុក',
-'tooltip-preview' => 'មើលមុនបំលាស់ប្ដូររបស់អ្នក។ សូមប្រើប្រាស់វាមុននឹងរក្សាទុក!',
-'tooltip-diff' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾â\80\8bâ\80\8bá\9e\85á\9f\86á\9e\96á\9f\84á\9f\87á\9e¢á\9e\8fá\9f\92á\9e\90á\9e\94á\9e\91á\9f\94',
+'tooltip-save' => 'á\9e\9aá\9e\80á\9f\92á\9e\9fá\9e¶á\9e\94á\9e\93á\9f\92លាស់ប្ដូររបស់អ្នកទុក',
+'tooltip-preview' => 'មើលបន្លាស់ប្ដូររបស់អ្នកជាមុន។ សូមប្រើប្រាស់វាមុននឹងរក្សាទុក!',
+'tooltip-diff' => 'á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e¶á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾â\80\8bâ\80\8bá\9e\9bá\9e¾á\9e¢á\9e\8fá\9f\92á\9e\90á\9e\94á\9e\91',
'tooltip-compareselectedversions' => 'មើលភាពខុសគ្នារវាងកំណែទាំង២របស់ទំព័រនេះ។',
'tooltip-watch' => 'បន្ថែមទំព័រនេះទៅបញ្ជីតាមដានរបស់អ្នក',
'tooltip-recreate' => 'បង្កើតទំព័រនេះឡើងវិញ ទោះបីជាវាបានត្រូវលុបចេញក៏ដោយ',
'tooltip-upload' => 'ចាប់ផ្តើមផ្ទុកឡើងឯកសារ',
'tooltip-rollback' => '"ត្រឡប់"កំណែប្រែធ្វើឡើងដោយអ្នករួមចំណែកចុងក្រោយគេ ទៅកំណែប្រែមុននោះវិញ ដោយគ្រាន់តែចុចមួយច្នុចប៉ុណ្ណោះ',
'tooltip-undo' => '"មិនធ្វើវិញ" ត្រឡប់កំណែនេះឡើងវិញ និងបើកបែបបទកែប្រែក្នុងទម្រង់មើលជាមុន។
-á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98â\80\8bá\9e\98á\9e¼á\9e\9bâ\80\8bá\9e á\9f\81á\9e\8fá\9e»â\80\8bá\9e\93á\9f\85â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bá\9e\9fá\9f\81á\9e\85á\9e\80á\9f\92á\9e\8aá\9e¸â\80\8bá\9e\9fá\9e\84á\9f\92á\9e\81á\9f\81á\9e\94បាន។',
+á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98â\80\8bá\9e\98á\9e¼á\9e\9bâ\80\8bá\9e á\9f\81á\9e\8fá\9e»â\80\8bá\9e\93á\9f\85â\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bá\9e\85á\9f\86á\9e\8eá\9e¶á\9e\9aá\9e\96á\9e\93á\9f\92á\9e\99á\9e\9bá\9f\8bបាន។',
'tooltip-preferences-save' => 'រក្សាទុកចំណង់ចំណូលចិត្ត',
-'tooltip-summary' => 'á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bចំណារពន្យល់ថ្មីមួយ',
+'tooltip-summary' => 'á\9e\9fá\9e\9aá\9e\9fá\9f\81á\9e\9aចំណារពន្យល់ថ្មីមួយ',
# Stylesheets
'common.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */',
'file-info' => 'ទំហំឯកសារ៖ $1, ប្រភេទ MIME ៖ $2',
'file-info-size' => '$1 × $2 ភីកសែល ទំហំឯកសារ៖ $3 ប្រភេទ MIME៖ $4',
'file-info-size-pages' => '$1 × $2 ភិចសែល, ទំហំឯកសារ: $3, ប្រភេទ MIME: $4, $5 {{PLURAL:$5|ទំព័រ|ទំព័រ}}',
-'file-nohires' => 'គ្មានភាពម៉ត់ ដែលខ្ពស់ជាង។',
+'file-nohires' => 'គ្មានភាពម៉ត់ខ្ពស់ជាងនេះទេ។',
'svg-long-desc' => 'ឯកសារប្រភេទSVG $1 × $2 ភីកសែល ទំហំឯកសារ៖ $3',
'svg-long-desc-animated' => 'ឯកសារជីវចល SVG, ជាធម្មតា $1 × $2 ភិចសែល, ទំហំឯកសារ: $3',
'show-big-image' => 'រូបភាពពេញ',
'monthsall' => 'ទាំងអស់',
'limitall' => 'ទាំងអស់',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'បញ្ជាក់ទទួលស្គាល់អាសយដ្ឋានអ៊ីមែល',
'confirmemail_noemail' => 'អ្នកមិនមានអាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ ដាក់នៅក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]របស់អ្នកទេ។',
'confirmemail_text' => '{{SITENAME}}តំរូវអោយអ្នកបញ្ជាក់សុពលភាពរបស់អាសយដ្ឋានអ៊ីមែលរបស់អ្នកមុននឹងអ្នកមានសិទ្ធប្រើមុខងារអ៊ីមែល។
'watchlistedit-raw-removed' => '{{PLURAL:$1|១ចំណងជើងបានត្រូវ|$1ចំណងជើងបានត្រូវ}}ដកចេញ៖',
# Watchlist editing tools
-'watchlisttools-view' => 'á\9e\98á\9e¾á\9e\9bá\9e\94á\9f\86លាស់ប្ដូរពាក់ព័ន្ធ',
+'watchlisttools-view' => 'á\9e\98á\9e¾á\9e\9bá\9e\94á\9e\93á\9f\92លាស់ប្ដូរពាក់ព័ន្ធ',
'watchlisttools-edit' => 'មើលនិងកែប្រែបញ្ជីតាមដាន',
'watchlisttools-raw' => 'កែប្រែបញ្ជីតាមដានឆៅ',
* @author Nayvik
* @author Nk rahul14
* @author Omshivaprakash
+ * @author Prashwiki
* @author Shankar
* @author Shushruth
* @author Teju2friends
'newwindow' => '(새 창으로 열림)',
'cancel' => '취소',
'moredotdotdot' => '더 보기...',
-'morenotlisted' => '목ë¡\9dì\97\90 ì\97\86ë\8a\94 항목 더 보기...',
+'morenotlisted' => 'ë\8b¤ë¥¸ 항목 더 보기...',
'mypage' => '문서',
'mytalk' => '토론',
'anontalk' => '익명 사용자 토론',
'toc' => '목차',
'showtoc' => '보이기',
'hidetoc' => '숨기기',
-'collapsible-collapse' => 'ì\88¨ê¸°기',
-'collapsible-expand' => '보이기',
+'collapsible-collapse' => 'ì \91기',
+'collapsible-expand' => '펼치기',
'thisisdeleted' => '$1을 보거나 되살리겠습니까?',
'viewdeleted' => '$1을 보겠습니까?',
'restorelink' => '삭제된 편집 $1개',
'loginlanguagelabel' => '언어: $1',
'suspicious-userlogout' => '브라우저에 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'PHP의 mail() 함수에서 알 수 없는 오류가 발생했습니다.',
'user-mail-no-addy' => '받는이의 이메일 주소가 없으면 이메일을 보낼 수 없습니다.',
'user-mail-no-body' => '비어 있거나 지나치게 짧은 본문으로 이메일을 보내려고 했습니다.',
'prefs-displaywatchlist' => '보이기 설정',
'prefs-diffs' => '차이',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => '이메일 주소가 유효한 것으로 보입니다.',
'email-address-validity-invalid' => '유효한 이메일 주소를 입력해주세요.',
'action-sendemail' => '이메일 보내기',
# Recent changes
-'nchanges' => '$1개 바뀜',
+'nchanges' => '$1개 {{PLURAL:$1|바뀜}}',
'recentchanges' => '최근 바뀜',
'recentchanges-legend' => '최근 바뀜 설정',
'recentchanges-summary' => '위키의 최근 바뀜 내역이 나와 있습니다.',
'recentchanges-label-minor' => '사소한 편집',
'recentchanges-label-bot' => '봇의 편집',
'recentchanges-label-unpatrolled' => '아직 검토하지 않은 편집',
-'rcnote' => "다음은 $4 $5 까지의 '''$2'''일동안 바뀐 문서 '''$1'''개입니다.",
+'rcnote' => "다음은 $4 $5 까지의 {{PLURAL:$2|'''$2'''일}}동안 {{PLURAL:$1|바뀐 문서 '''$1'''개입니다}}.",
'rcnotefrom' => "다음은 '''$2'''에서부터 바뀐 문서 '''$1'''개입니다.",
'rclistfrom' => '$1 이래로 바뀐 문서',
'rcshowhideminor' => '사소한 편집을 $1',
그 링크는 다른 적절한 문서로 연결할 필요가 있습니다.<br />
[[MediaWiki:Disambiguationspage]]에서 링크된 틀을 사용하는 문서를 동음이의 문서로 간주합니다.",
+'pageswithprop' => '문서 속성으로 된 문서',
+'pageswithprop-legend' => '문서 속성으로 된 문서',
+'pageswithprop-text' => '이 문서는 특정 문서 속성을 사용한 문서를 나타냅니다.',
+'pageswithprop-prop' => '속성 이름:',
+'pageswithprop-submit' => '가기',
+
'doubleredirects' => '이중 넘겨주기 목록',
'doubleredirectstext' => '이 문서는 다른 넘겨주기 문서로 넘겨주고 있는 문서의 목록입니다.
매 줄에는 첫 번째 문서와 두 번째 문서의 링크가 있습니다. 그리고 보통 첫 번째 문서가 넘겨주어야 할 "실제" 문서인 두 번째 넘겨주기의 대상이 있습니다.
'listgrouprights-addgroup-self-all' => '자신에게 모든 권한을 부여',
'listgrouprights-removegroup-self-all' => '자신의 계정에서 모든 권한을 해제',
-# E-mail user
+# Email user
'mailnologin' => '보낼 이메일 주소가 없음',
'mailnologintext' => '다른 사용자에게 이메일을 보내려면 [[Special:UserLogin|로그인]]한 다음 [[Special:Preferences|사용자 환경 설정]]에서 자신의 이메일 주소를 저장해야 합니다.',
'emailuser' => '이메일 보내기',
'undeletehistory' => '문서를 되살리면 모든 역사가 같이 복구됩니다.
문서가 삭제된 뒤 같은 이름의 문서가 만들어졌다면, 복구되는 역사는 지금 역사의 과거 부분에 나타날 것입니다.',
'undeleterevdel' => '복구하려는 문서의 최신판이 삭제되어 있는 경우 문서를 복구시킬 수 없습니다.
-이러한 경우, 삭제된 최신판 문서의 체크박스를 선택 해제하거나 숨김을 해제해야 합니다.',
+이러한 경우 삭제된 최신판 문서의 확인 상자를 선택 해제하거나 숨김을 해제해야 합니다.',
'undeletehistorynoadmin' => '이 문서는 삭제되었습니다.
삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자가 아래에 나와 있습니다.
삭제된 문서의 내용을 보려면 관리자 권한이 필요합니다.',
'pageinfo-authors' => '총 서로 다른 편집자 수',
'pageinfo-recent-edits' => '최근 편집 수 (지난 $1 이내)',
'pageinfo-recent-authors' => '최근 기여자 수',
-'pageinfo-magic-words' => '매직 {{PLURAL:$1|워드}} ($1개)',
+'pageinfo-magic-words' => '특수 {{PLURAL:$1|명령}} ($1개)',
'pageinfo-hidden-categories' => '숨은 {{PLURAL:$1|분류}} ($1개)',
'pageinfo-templates' => '포함한 {{PLURAL:$1|틀}} ($1개)',
'pageinfo-transclusions' => '포함한 {{PLURAL:$1|문서}} ($1개)',
'monthsall' => '모든 달',
'limitall' => '모두',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => '이메일 주소 확인',
'confirmemail_noemail' => '[[Special:Preferences|환경 설정]]에 이메일을 설정하지 않았습니다.',
'confirmemail_text' => '{{SITENAME}}에서는 이메일 기능을 사용하기 전에 이메일 인증을 받아야 합니다.
'watchlistedit-normal-title' => '주시문서 목록 편집하기',
'watchlistedit-normal-legend' => '주시문서 목록에서 문서 제거하기',
'watchlistedit-normal-explain' => '주시문서 목록에 있는 문서의 제목이 아래에 나열되어 있습니다.
-주시문서 목록에서 제거하려는 문서가 있으면, 각 항목의 체크박스를 선택한 다음 "{{int:Watchlistedit-normal-submit}}"를 클릭해주세요.
+주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 "{{int:Watchlistedit-normal-submit}}"를 클릭해주세요.
또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.',
'watchlistedit-normal-submit' => '항목 삭제',
'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목}}을 주시하지 않습니다:',
'tags-description-header' => '태그에 대한 설명',
'tags-hitcount-header' => '태그된 바뀜',
'tags-edit' => '편집',
-'tags-hitcount' => '$1개 바뀜',
+'tags-hitcount' => '$1개 {{PLURAL:$1|바뀜}}',
# Special:ComparePages
'comparepages' => '문서 비교',
'api-error-invalid-file-key' => '내부 오류: 임시 저장소에서 파일을 찾지 못했습니다.',
'api-error-missingparam' => '내부 오류: 요청 중 매개변수가 누락되었습니다.',
'api-error-missingresult' => '내부 오류: 파일의 복제가 성공했는지 판단할 수 없습니다.',
-'api-error-mustbeloggedin' => '파일을 올리기 위해서는 로그인해야 합니다.',
+'api-error-mustbeloggedin' => '파일을 올리려면 로그인해야 합니다.',
'api-error-mustbeposted' => '내부 오류: HTTP POST에 요청이 필요합니다.',
'api-error-noimageinfo' => '파일 올리기는 성공했지만 서버가 파일에 대해 어떠한 정보도 주지 않았습니다.',
'api-error-nomodule' => '내부 오류: 올리기 모듈이 설정되지 않았습니다.',
'duration-centuries' => '$1{{PLURAL:$1|세기}}',
'duration-millennia' => '$1{{PLURAL:$1|천년}}',
+# Image rotation
+'rotate-comment' => '그림을 시계 방향으로 $1{{PLURAL:$1|도}}로 회전함',
+
);
'loginlanguagelabel' => 'Тил: $1',
'suspicious-userlogout' => 'Терс браузер неда кэш этиучу прокси берген соруугъа ушагъаны ючюн, Сизни чыгъаргъа сорууугъуз алынмагъанды.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "PHP's mail() функцияда белгили болмагъан халат",
'user-mail-no-addy' => 'Бир e-mail адрес болмагъанлай e-mail иерге кюрешди',
'prefs-displaywatchlist' => 'Кёрюнюуню джарашдырыулары',
'prefs-diffs' => 'Версияланы башхалыкълары',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mail адрес тюзге ушайды',
'email-address-validity-invalid' => 'Тюз e-mail адрес джазыгъыз!',
'listgrouprights-addgroup-self-all' => 'Бютеу къауумланы кесини тергеу джазыууна къошаллыкъды',
'listgrouprights-removegroup-self-all' => 'Кесини тергеу джазыуундан бютеу къауумланы къораталлыкъды',
-# E-mail user
+# Email user
'mailnologin' => 'Джиберирге адрес джокъду',
'mailnologintext' => 'Башха къошулуучулагъа эл. почта джиберелир ючюн [[Special:UserLogin|системагъа кирирге]] керексиз эм [[Special:Preferences|джарашдырыуланы]] бетинде джараулу эл. почта адрес болургъа керекди.',
'emailuser' => 'Къошулуучугъа письмо',
'markedaspatrollederror' => 'Сыналмаганды',
'markedaspatrollederrortext' => 'Сыналгъан кибик белгилер ючюн версия белгилерге керексиз.',
'markedaspatrollederror-noautopatrol' => 'Кесигизни тюрлендириулеригизни, сыналгъан кибик белгилерге эркинлигигиз джокъду.',
+'markedaspatrollednotify' => '«$1» бетдеги бу тюрлениу тинтиб къаралгъанча белгиленди.',
# Patrol log
'patrol-log-page' => 'Патруль этиуню журналы',
'monthsall' => 'бютеу',
'limitall' => 'бютеую',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Электорн адресни мюкюл эт',
'confirmemail_noemail' => '[[Special:Preferences|джарашдырыулада]] тамамланнган, джараулу электрон адресигиз джокоъду.',
'confirmemail_text' => 'Викини электрон почтасыны адреси бла хайырланыб башлауну аллы бла, аны мюкюл этериге керекди.
'tags-description-header' => 'Bedüggtening',
'tags-hitcount-header' => 'Makeete Änderunge',
'tags-edit' => 'ändere',
-'tags-hitcount' => '{{PLURAL:$1|Ein Änderong|$1 Änderonge|kein Änderonge}}',
+'tags-hitcount' => '{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderonge}}',
# Special:ComparePages
'comparepages' => 'Sigge verjliesche',
'listgrouprights-addgroup-self-all' => 'Addere omnes greges ad rationem propriam',
'listgrouprights-removegroup-self-all' => 'Removere omnes greges ex ratione propria',
-# E-mail user
+# Email user
'emailuser' => 'Litteras electronicas usori mittere',
'emailpage' => 'Mittere litteras electronicas huic usori',
'emailpagetext' => 'Forma subter nuntium ad usorem mittet.
'siteusers' => '{{PLURAL:$2|usor|usores}} {{grammar:genitive|{{SITENAME}}}} $1',
'creditspage' => 'Auctores paginae',
+# Info page
+'pageinfo-title' => 'Res quae ad "$1" pertinent',
+'pageinfo-header-basic' => 'De hac pagina',
+'pageinfo-display-title' => 'Titulus ut in pagina ipsa monstratur',
+'pageinfo-length' => 'Magnitudo paginae (octeti)',
+'pageinfo-article-id' => 'Identificatio paginis',
+'pageinfo-language' => 'Lingua verborum in pagina',
+'pageinfo-firstuser' => 'Creator paginae',
+'pageinfo-firsttime' => 'Dies et tempus creationis paginae',
+'pageinfo-lastuser' => 'Usor qui ultimam recensionem fecit',
+'pageinfo-lasttime' => 'Dies ultimae emendationis',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria celata|Categoriae celatae}} ($1)',
+'pageinfo-toolboxlink' => 'De hac pagina',
+
# Skin names
'skinname-standard' => 'Norma',
'skinname-cologneblue' => 'Caerulus Colonia',
'namespacesall' => 'omnia',
'monthsall' => 'omnes',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Inscriptionem electronicam adfirmare',
'confirmemail_noemail' => 'Non est tibi inscriptio electronica valida in [[Special:Preferences|tuis praeferentiis]] posita.',
'confirmemail_text' => '{{SITENAME}} te postulat inscriptionem tuam electronicam adfirmare priusquam proprietatibus litterarum electronicarum fruaris. Imprime botonem subter ut nuntium adfirmationis tibi mittatur. Nuntio nexus inerit quod est scribendus in tuo navigatro interretiali ut validum adfirmes tuam inscriptionem electronicam.',
'fri' => 'Vie',
'sat' => 'Shab',
'january' => 'Enero',
-'february' => 'Fevrero',
+'february' => 'Hevrero',
'march' => 'Março',
-'april' => 'Abril',
+'april' => 'Avril',
'may_long' => 'Mayo',
-'june' => 'Junio',
+'june' => 'Juño',
'july' => 'Jullo',
'august' => 'Agosto',
-'september' => 'Setembre',
-'october' => 'Ochůvre',
-'november' => 'Novembre',
-'december' => 'Diziembre',
+'september' => 'Setiembre',
+'october' => 'Ochòvre',
+'november' => 'Noviembre',
+'december' => 'Deziembre',
'january-gen' => 'Enero',
'february-gen' => 'Fevrero',
'march-gen' => 'Março',
'policy-url' => 'Project:Politikas',
'portal' => 'Puertal de la komunitá',
'portal-url' => 'Project:Puertal de la komunitá',
-'privacy' => 'Principio de particůlaridad',
+'privacy' => 'Principio de particòlaridad',
'privacypage' => 'Project:Principio de particůlaridad',
'badaccess' => 'Yerro de permissión',
'viewsourceold' => 'Ver su manadero',
'editlink' => 'trocar',
'viewsourcelink' => 'ver su manadero',
-'editsectionhint' => 'Troca el capítůlo: $1',
+'editsectionhint' => 'Troca el kapítolo: $1',
'toc' => 'Contènidos',
'showtoc' => 'Amostrar',
'hidetoc' => 'esconder',
# Special:ListGroupRights
'listgrouprights-members' => '(ver los miembros de este grupo)',
-# E-mail user
+# Email user
'emailuser' => 'Embia e-mail a este usuario',
# Watchlist
'blocklink' => 'blokea',
'unblocklink' => 'quita el bloqueo',
'change-blocklink' => 'troca el blokeo',
-'contribslink' => 'Àjustamientos',
+'contribslink' => 'donos',
'blocklogpage' => 'Bloqueos de usuarios',
'blocklogentry' => 'bloqueó a [[$1]] $3 durante un tiempo de $2',
'unblocklogentry' => 'desbloqueó a "$1"',
'tooltip-pt-preferences' => 'Mis preferencias',
'tooltip-pt-watchlist' => 'La lista de los trocamientos acontècidos en las hojas akavidadas.',
'tooltip-pt-mycontris' => 'La lista de tus àjustamientos',
-'tooltip-pt-login' => "T'encorajamos d'entrar ma no sos obligado",
+'tooltip-pt-login' => 'Te encorajamos de entrar ma no estás obligado',
'tooltip-pt-logout' => 'Salir',
'tooltip-ca-talk' => 'Diskusyón encima del artícůlo de contènido',
'tooltip-ca-edit' => 'Puedes trocar esta hoja. Y si puede ser, usa el botón de previsteo antes de enrejistrar la hoja',
'tooltip-search' => 'Busca en {{SITENAME}}',
'tooltip-search-go' => 'Si ay una hoja con este nombre egzakto, vate allá.',
'tooltip-search-fulltext' => 'Busca este teksto en las hojas',
-'tooltip-p-logo' => 'Visita la primera hoja',
+'tooltip-p-logo' => 'Vate a la primera hoja',
'tooltip-n-mainpage' => 'Visita la primera hoja',
'tooltip-n-mainpage-description' => 'Visita la primera hoja',
'tooltip-n-portal' => 'Encima del projeto, lo que puedes hazer y ánde topar todo',
'tooltip-n-currentevents' => 'Información encima de los acontècimientos de oy día',
-'tooltip-n-recentchanges' => 'La lista de los trocamientos freskos en el viki',
-'tooltip-n-randompage' => 'Carga una kualunke hoja asegún viene',
-'tooltip-n-help' => 'El lugar para âmbezarse',
+'tooltip-n-recentchanges' => 'Lista de los trocamientos muevos en el viki',
+'tooltip-n-randompage' => 'Carga una hoja por asardo',
+'tooltip-n-help' => 'Para saver mas',
'tooltip-t-whatlinkshere' => 'Una lista de todas las hojas del viki que tienen atamientos con esta hoja',
'tooltip-t-recentchangeslinked' => 'Los trocamientos freskos de las hojas que tienen atamiento con esta hoja',
'tooltip-feed-rss' => 'Sindicación RSS de esta hoja',
'tooltip-t-contributions' => 'Ver la lista de ajustamientos de este usuario',
'tooltip-t-emailuser' => 'A este usuario, mándale una letra electrόnica (ímey)',
'tooltip-t-upload' => 'Suve dosyas por aquí',
-'tooltip-t-specialpages' => 'La lista de todas las hojas especiales',
+'tooltip-t-specialpages' => 'Lista de todas las hojas especiales',
'tooltip-t-print' => "Versión apropiada para imprimir d'esta hoja",
'tooltip-t-permalink' => "Atamiento permanente á est'enderechamiento de la hoja",
'tooltip-ca-nstab-main' => 'Ve el artícůlo de contènido',
'show-big-image' => 'Resolución original',
# Bad image list
-'bad_image_list' => "El formato es ańsina:
+'bad_image_list' => 'El formato es ansina:
-Cale akavidar sólo elementos de lista (quere dezir: shurás/satires qu'empeçan con *).
-El primer atamiento de cada shurá deve de ser un atamiento á una dosya negra (á la dosya que se quere blokear).
-Los atamientos venideros que stan en la mesma shurá s'aprecian como eksepsiones, por eńxemplo, hojas ande la dosya se ve en la shurá.",
+Sólo elementos de lista (liñas empeçando con *) se toman en konsidherasyón.
+El primer atamiento de cada liña deve de atarse con una dosya negra (la dosya que se quere blokar).
+Los atamientos venideros que están en la misma liña se konsidheran como eksepsiones (yaani hojas ande la dosya puede aparecer encaxada en la liña)',
# Metadata
'metadata' => 'Metadatos',
'namespacesall' => 'todos',
'monthsall' => '(todos)',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Konfirmar direksion e-pósta',
'confirmemail_send' => 'Embiar el kodigo de konfirmasion.',
'confirmemail_sent' => 'Konfirmasion de pósta embiada.',
'loginlanguagelabel' => 'Sprooch: $1',
'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et esou ausgesäit wéi wann se vun engem Futtise Browser oder Proxy-Tëschespäicher kënnt.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Onbekannte Feeler an der PHP-Mail-Fonctioun',
'user-mail-no-addy' => 'Huet versicht eng Mail ouni Mailadress ze schécken',
'user-mail-no-body' => 'Et gouf probéiert eng E-Mail ouni Text oder mat engem ze kuerzen Text ze schécken.',
'prefs-displaywatchlist' => 'Optioune vun deem wat gewise gëtt',
'prefs-diffs' => 'Ënnerscheeder',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => "D'E-Mailadress schéngt valabel ze sinn",
'email-address-validity-invalid' => 'Gitt eng valabel e-Mailadress an',
'backend-fail-create' => 'De Fichier $1 konnt net geschriwwe ginn.',
'backend-fail-maxsize' => 'De Fichier $1 konnt net geschriwwe gi well e méi grouss ass wéi {{PLURAL:$2|ee Byte|$2 Byten}}.',
'backend-fail-readonly' => 'De Späicher-Backend "$1" kann elo nëmme geliest ginn (read-only). De Grond deen ugi gouf war: "$2"',
+'backend-fail-connect' => 'Keng Verbindung mam Backend vum Späicher "$1".',
+'backend-fail-internal' => 'Onbekannte Feeler am Backend vum Späicher: "$1"',
# Lock manager
'lockmanager-notlocked' => '"$1" konnt net fräigeschalt ginn; $1 ass net gespaart.',
Si sollte am beschten op déi eigentlech gemengte Säit verlinkt sinn.<br />
Eng Säite gëtt als Homonymie-Säit behandelt, wa si eng Schabloun benotzt déi vu [[MediaWiki:Disambiguationspage]] verlinkt ass.",
+'pageswithprop' => 'Säite mat enger Säiten-Eegeschaft',
+'pageswithprop-legend' => 'Säite mat enger Säiten-Eegeschaft',
+'pageswithprop-prop' => 'Numm vun der Eegeschaft:',
+'pageswithprop-submit' => 'Lass',
+
'doubleredirects' => 'Duebel Viruleedungen',
'doubleredirectstext' => 'Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.
An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun der zweeter Viruleedung, déi normalerweis déi "richteg" Zilsäit ass, op déi déi éischt Viruleedung hilinke soll.
'listgrouprights-addgroup-self-all' => 'däerf all Gruppe bäi säin eegene Benotzerkont derbäisetzen',
'listgrouprights-removegroup-self-all' => 'Däerf all Gruppe vu sengem eegene Benotzerkont ewechhuelen',
-# E-mail user
+# Email user
'mailnologin' => 'Keng E-Mailadress',
'mailnologintext' => 'Dir musst [[Special:UserLogin|ugemellt]] sinn an eng gëlteg E-Mail Adress an Äre [[Special:Preferences|Astellungen]] aginn hunn, fir engem anere Benotzer eng E-Mail ze schécken.',
'emailuser' => 'Dësem Benotzer eng E-Mail schécken',
'blanknamespace' => '(Haapt)',
# Contributions
-'contributions' => 'Kontributioune {{GENDER:$1|vum Benotzer $1}}',
+'contributions' => '{{GENDER:$1|Benotzer}}kontributiounen',
'contributions-title' => 'Kontributioune vum $1',
'mycontris' => 'Kontributiounen',
'contribsub2' => 'Fir $1 ($2)',
'import-error-interwiki' => 'D\'Säit "$1" gouf net importéiert well deen Numm fir extern Linken (Interwiki) reservéiert ass.',
'import-error-special' => 'D\'Säit "$1" gouf net importéiert well se zu engem speziellen Nummraum gehéiert an deem et keng Säite gëtt.',
'import-error-invalid' => 'D\'Säit "$1" gouf net importéiert well hiren Numm net valabel ass.',
+'import-error-unserialize' => 'D\'Versioun $2 vun der Säit "$1" konnt net deserialiséiert ginn. Et gouf uginn datt déi Versioun den Inhaltsmodell $3 benotzt deen als $4 serialiséiert ass.',
'import-options-wrong' => 'Falsch {{PLURAL:$2|Optioun|Optiounen}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Déi Basis-Säit déi Dir uginn hutt ass kee valabelen Titel.',
'import-rootpage-nosubpage' => 'Am Nummraum "$1" vun der Basis-Säit si keng Ënnersäiten erlaabt.',
'pageinfo-length' => 'Gréisst vun der Säit (a Bytes)',
'pageinfo-article-id' => 'ID (Nummer) vun der Säit',
'pageinfo-language' => 'Sprooch vum Inhalt vun der Säit',
+'pageinfo-robot-policy' => 'Sichmaschinnestatus',
+'pageinfo-robot-index' => 'Indexéierbar',
'pageinfo-robot-noindex' => 'Net indexéierbar',
'pageinfo-views' => 'Zuel vun de Kéieren déi dës Säit gekuckt gouf',
'pageinfo-watchers' => "Zuel vun de Benotzer déi d'Säit iwwerwaachen",
'pageinfo-magic-words' => '{{PLURAL:$1|Magescht Wuert|Magesch Wierder}} ($1)',
'pageinfo-hidden-categories' => 'Verstoppte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
'pageinfo-templates' => 'Agebonne {{PLURAL:$1|Schabloun|Schabloune}} ($1)',
+'pageinfo-transclusions' => 'Agebonnen {{PLURAL:$1|an eng Säit|a(n) $1 Säiten}}',
'pageinfo-toolboxlink' => "Informatiounen iwwert d'Säit",
'pageinfo-redirectsto' => 'Viruleedung op',
'pageinfo-redirectsto-info' => 'Informatioun',
'monthsall' => 'all',
'limitall' => 'all',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'E-Mailadress confirméieren',
'confirmemail_noemail' => 'Dir hutt keng gëlteg E-Mail-Adress an Äre [[Special:Preferences|Benotzerastellungen]] agedro.',
'confirmemail_text' => "Ier Dir d'E-Mailfunktioune vun {{SITENAME}} benotze kënnt musst dir als éischt Är E-Mailadress confirméieren. Dréckt w.e.g. de Knäppchen hei ënnendrënner fir eng Confirmatiouns-E-Mail op déi Adress ze schécken déi Dir uginn hutt. An där E-Mail steet e Link mat engem Code, deen dir dann an Ärem Browser opmaache musst fir esou ze bestätegen, datt Är Adress och wierklech existéiert a valabel ass.",
'subject' => 'Тема/кьилинцIар',
'minoredit' => 'ГъвечIи дуьзар хъувун',
'watchthis' => 'И ччин гуьзетун',
-'savearticle' => 'ЧÑ\87ин Ñ\85Ñ\83Ñ\8cн',
+'savearticle' => 'ЧÑ\8aин Ñ\85вин',
'preview' => 'Сифтедин килигун',
'showpreview' => 'Сифтедин килигун къалурун',
'showlivepreview' => 'Фад сифтедин килигун',
'recentchangeslinked-toolbox' => 'Галкlанвай масакIавилер',
'recentchangeslinked-title' => '"$1" галаз галкlанавай масакIавилер',
'recentchangeslinked-noresult' => 'Ганвай чlава галкlанавай ччинра са масакIавални хьанвайд туш',
-'recentchangeslinked-summary' => 'Им къалурай ччиниз (ва я къалурай категориядиз гьатзавай ччинриз) элячIзавай ччинра мукьвара хьайи масакIавилерин сиягь я. Куь [[Special:Watchlist| вилив хуьнин сиягь ]]диз гьатзавай ччинар яцlу шрифтдал къалурнава.',
+'recentchangeslinked-summary' => 'Им къалурай ччиниз (ва я къалурай категориядиз гьатзавай ччинриз) элячӀзавай ччинра мукьвара хьайи масакӀавилерин сиягь я. Куь [[Special:Watchlist|вилив хуьнин сиягь диз]] гьатзавай ччинар яцӀу шрифтдал къалурнава.',
'recentchangeslinked-page' => 'Ччинин тlвар:',
'recentchangeslinked-to' => 'Аксина, къалурай ччиниз элячlзавай ччинра масакIавилер къалура',
'listgrouprights-group' => 'КIеретI',
'listgrouprights-members' => '(уьзвийрин сиягь)',
-# E-mail user
+# Email user
'emailuser' => 'Уртахдиз чар кхьихь',
'emailusername' => 'Уртахдин тlвар:',
'emailusernamesubmit' => 'Ракъурун',
'thursday' => '週四',
'friday' => '週五',
'saturday' => '週六',
-'sun' => '週日',
-'mon' => '周一',
-'tue' => '周二',
-'wed' => '周三',
-'thu' => 'å\91¨å\9b\9b',
-'fri' => '周五',
-'sat' => 'å\91¨å\85',
+'sun' => '日',
+'mon' => '一',
+'tue' => '二',
+'wed' => '三',
+'thu' => '四',
+'fri' => '五',
+'sat' => '六',
'january' => '一月',
'february' => '二月',
'march' => '三月',
'ok' => '可',
'retrievedfrom' => '取自"$1"',
-'youhavenewmessages' => '子有$1($2)',
+'youhavenewmessages' => '有$1書至子書房也。($2)',
'newmessageslink' => '新訊',
'newmessagesdifflink' => '變更',
'youhavenewmessagesfromusers' => '子有 $1 自 {{PLURAL:$3|another user|$3 簿戶也}} ($2)。',
'loginlanguagelabel' => '語:$1',
'suspicious-userlogout' => '爾欲無離也,可由壞瀏覽器或快枝代理呈送之。',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => '於 PHP mail() 參數現錯',
# Change password dialog
'last' => '前',
'page_first' => '首',
'page_last' => '末',
-'histlegend' => "辨ç\95°ï¼\9aæ\93\87äº\8cå\94å¾\8c,按Enter、或點下鈕以辨之。<br />
-釋義:'''({{int:cur}})'''與今審辨;'''({{int:last}})'''與前審辨;'''{{int:minoreditletter}}''',校文",
+'histlegend' => "辨ç\95°ï¼\9aæ\97¢æ\93\87äº\8cå\94,按Enter、或點下鈕以辨之。<br />
+釋義:'''({{int:cur}})'''與今審辨;'''({{int:last}})'''與前審辨;'''{{int:minoreditletter}}''',令校",
'history-fieldset-title' => '誌覽',
'history-show-deleted' => '只刪',
'histfirst' => '初',
'prefs-displaywatchlist' => '示項',
'prefs-diffs' => '異',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => '電郵有效之',
'email-address-validity-invalid' => '貢一效之電郵',
'recentchanges-label-newpage' => '此纂開新頁',
'recentchanges-label-minor' => '此乃細纂',
'recentchanges-label-bot' => '此乃機纂',
-'recentchanges-label-unpatrolled' => 'æ¤ä¹\83æ\9cªå·¡ä¹\8bçº\82',
+'recentchanges-label-unpatrolled' => 'æ\98¯çº\82æ\9cªå·¡',
'rcnote' => "下為自$4$5起,'''$2'''日內'''$1'''近易也。",
'rcnotefrom' => "下為自'''$2'''至'''$1'''之易也。",
'rclistfrom' => '自$1起之易也',
'statistics-mostpopular' => '燴炙',
'disambiguations' => '釋義',
+'disambiguationspage' => 'Template:弭誤解',
'disambiguations-text' => '頁下引[[MediaWiki:Disambiguationspage]]模,求釋義,宜正題之。',
'doubleredirects' => '窮渡',
'listgrouprights-addgroup-self-all' => '加自之全組',
'listgrouprights-removegroup-self-all' => '除自之全組',
-# E-mail user
+# Email user
'mailnologin' => '無驛',
'mailnologintext' => '[[Special:UserLogin|登簿]]置郵,方可捎書。',
'emailuser' => '捎君',
'historywarning' => '警示,此頁約有誌$1:',
'confirmdeletetext' => '欲刪此物與誌,知後果、合[[{{MediaWiki:Policy-url}}]]後再為之。',
'actioncomplete' => '成矣',
-'actionfailed' => 'æ\95\97ç\9f£',
+'actionfailed' => 'æ\9cªç«\9f',
'deletedtext' => '"$1"刪矣,見誌刪於$2。',
'dellogpage' => '誌刪',
'dellogpagetext' => '近刪如下:',
'monthsall' => '全',
'limitall' => '全',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => '核郵驛',
'confirmemail_noemail' => '[[Special:Preferences|簿註]]有驛。',
'confirmemail_send' => '遣核符',
'loginlanguagelabel' => 'fiteny : $1',
'suspicious-userlogout' => "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
'user-mail-no-addy' => 'Nanandrana nandefa imailaka tsy misy adiresy imailaka.',
'timezoneregion-europe' => 'Eoropa',
'timezoneregion-indian' => 'Ranomasimbe Indianina',
'timezoneregion-pacific' => 'Ranomasimbe Pasifika',
-'allowemail' => "Ekeo ny handraisana imailaka avy amin'ny mpikambana hafa",
+'allowemail' => "Hanaiky ny fandefasana mailaka avy amin'ny mpikambana hafa",
'prefs-searchoptions' => 'Karoka',
'prefs-namespaces' => "Toeran'anarana",
'defaultns' => "Fikarohana tsipalotra anatin'ireo anaran-tsehatra ireo :",
'prefs-displaywatchlist' => 'Safidin-tseho',
'prefs-diffs' => 'Diff',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Adiresy imailaka mameno fepetra',
'email-address-validity-invalid' => 'Ilaina ny mametraka adiresy imailaka mameno fepetra',
'listgrouprights-addgroup-self-all' => "Manampy ny vondrom-pikambana rehetra amin'ny kaontiny",
'listgrouprights-removegroup-self-all' => "Manala ny vondrom-pikambana rehetra amin'ny kaontiny",
-# E-mail user
+# Email user
'mailnologin' => 'Tsy misy adiresy handefasana ny tenimiafina',
'mailnologintext' => "Mila [[Special:UserLogin|miditra]] ianao sady manana imailaka mandeha sy voamarina ao amin'ny [[Special:Preferences|mombamomba anao]] vao afaka mandefa imailaka amin'ny mpikambana hafa.",
'emailuser' => 'Andefaso imailaka io mpikambana io',
'monthsall' => 'rehetra',
'limitall' => 'rehetra',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Fanamarinana adiresy imailaka.',
'confirmemail_noemail' => "Tsy nilaza adiresy imailaka azo ampiasaina ianao tao amin'ny [[Special:Preferences|safidinao]].",
'confirmemail_text' => "
'tog-hideminor' => 'Suruakkan suntingan ketek di parubahan tabaru',
'tog-hidepatrolled' => 'Suruakkan suntingan nan lah dijago di parubahan tabaru',
'tog-newpageshidepatrolled' => 'Suruakkan laman nan lah dijago dari dafta laman baru',
-'tog-extendwatchlist' => 'Kambangkan dafta pantauan untuak malihek sado parubahan, indak nan baru se',
+'tog-extendwatchlist' => 'Kambangkan dafta pantau untuak malihek sado parubahan, indak nan baru se',
'tog-usenewrc' => 'Gunokan tampilan parubahan tingkek lanjuik (paralu JavaScript)',
'tog-numberheadings' => 'Agiah nomor judua sacaro otomatis',
'tog-showtoolbar' => 'Tampilkan bilah suntiang (paralu JavaScript)',
'tog-editsectiononrightclick' => 'Hiduikkan bagian panyuntiangan jo mangklik kanan pado judul bagian (paralu JavaScript)',
'tog-showtoc' => 'Tunjuakkan dafta isi (untuak laman nan labiah dari 3 subbagian)',
'tog-rememberpassword' => 'Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})',
-'tog-watchcreations' => 'Tambahkan laman nan den buek jo gambar nan den unggah ka dafta pantauan',
-'tog-watchdefault' => 'Tambahkan laman jo gamba nan den suntiang ka dafta pantauan',
-'tog-watchmoves' => 'Tambahkan laman jo gamba nan den pindah ka dafta pantauan',
-'tog-watchdeletion' => 'Tambahkan laman jo gamba nan den hapuih ka dafta pantauan',
+'tog-watchcreations' => 'Tambahkan laman nan den buek jo gambar nan den unggah ka dafta pantau',
+'tog-watchdefault' => 'Tambahkan laman jo gamba nan den suntiang ka dafta pantau',
+'tog-watchmoves' => 'Tambahkan laman jo gamba nan den pindah ka dafta pantau',
+'tog-watchdeletion' => 'Tambahkan laman jo gamba nan den hapuih ka dafta pantau',
'tog-minordefault' => 'Tandoi sadoalah suntiangan sabagai suntiangan ketek sacaro baku',
'tog-previewontop' => 'Tampilkan pratonton sabalun kotak suntiang',
'tog-previewonfirst' => 'Tunjuakkan pratonton pado suntiangan patamo',
'tog-nocache' => 'Matikan panyinggahan laman paramban',
-'tog-enotifwatchlistpages' => 'Kirimkan surel, kalau laman atau gambar pado daftar pantauan den lah barubah',
-'tog-enotifusertalkpages' => "Kirimkan denai surel ko' laman diskusi den lah barubah",
+'tog-enotifwatchlistpages' => 'Kirimkan surel, kok laman atau gambar pado dafta pantau Ambo lah barubah',
+'tog-enotifusertalkpages' => 'Kirimkan surel, koq laman diskusi Ambo lah barubah',
'tog-enotifminoredits' => 'Kirimkan surel juo untuk saketek suntingan pado laman jo gambar',
'tog-enotifrevealaddr' => 'Tunjuakkan alamaik surel ambo pado pambaritauan surel',
'tog-shownumberswatching' => 'Tunjuakkan jumlah pamantau',
'tog-showjumplinks' => 'Aktifkan tautan pambantu "langsuang ka"',
'tog-uselivepreview' => 'Gunokan pratayang langsuang (JavaScript) (eksperimental)',
'tog-forceeditsummary' => 'Ingekkan awak bilo kotak ringkasan suntiangan masih kosoang',
-'tog-watchlisthideown' => 'Suruakkan suntiangan surang di dafta pantauan',
-'tog-watchlisthidebots' => 'Suruakkan suntiangan bot di dafta pantauan',
-'tog-watchlisthideminor' => 'Suruakkan suntiangan ketek di dafta pantauan',
-'tog-watchlisthideliu' => 'Suruakkan suntiangan pangguno masuak log di dafta pantauan',
-'tog-watchlisthideanons' => 'Suruakkan suntiangan pangguno indak di kana di dafta pantauan',
-'tog-watchlisthidepatrolled' => 'Suruakkan suntiangan tapatroli di dafta pantauan',
-'tog-ccmeonemails' => 'Kiriman awak salinan surel nan dikiriman ka urang lain',
+'tog-watchlisthideown' => 'Suruakkan suntiangan surang di dafta pantau',
+'tog-watchlisthidebots' => 'Suruakkan suntiangan bot di dafta pantau',
+'tog-watchlisthideminor' => 'Suruakkan suntiangan ketek di dafta pantau',
+'tog-watchlisthideliu' => 'Suruakkan suntiangan pangguno masuak log di dafta pantau',
+'tog-watchlisthideanons' => 'Suruakkan suntiangan pangguno indak di kana di dafta pantau',
+'tog-watchlisthidepatrolled' => 'Suruakkan suntiangan tapatroli di dafta pantau',
+'tog-ccmeonemails' => 'Kiriman Ambo salinan surel nan dikiriman ka urang lain',
'tog-diffonly' => 'Jan tampilan isi laman di bawah pabedoan suntiangan',
'tog-showhiddencats' => 'Tampilan kategori tasambunyi',
'tog-norollbackdiff' => 'Jan tampilan pabedoan sasudah malakukan pangambalian',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori}}',
-'category_header' => 'Laman dalam kategori "$1"',
+'category_header' => 'Laman pado kategori "$1"',
'subcategories' => 'Subkategori',
'category-media-header' => 'Laman/Media dalam kategori "$1"',
'category-empty' => "''Kini ko, indak ado laman ataupun media dalam kategori ko.''",
'vector-simplesearch-preference' => 'Aktifkan kotak pancarian sadarano (hanyo kulik Vector)',
'vector-view-create' => 'Buek',
'vector-view-edit' => 'Suntiang',
-'vector-view-history' => 'Riwayaik lalu',
+'vector-view-history' => 'Riwayaik',
'vector-view-view' => 'Baco',
'vector-view-viewsource' => 'Caliak sumber',
'actions' => 'Tindakan',
'viewtalkpage' => 'Caliak laman diskusi',
'otherlanguages' => 'Dalam bahaso lain',
'redirectedfrom' => '(Dialiahkan dari $1)',
-'redirectpagesub' => 'Laman pengalihan',
+'redirectpagesub' => 'Laman pangaliahan',
'lastmodifiedat' => 'Laman ko taakia diubah pado $2, $1.',
-'viewcount' => 'Laman iko alah diakses sabanyak {{PLURAL:$1|ciek kali|$1 kali}}.<br />',
-'protectedpage' => 'Laman nan dilindungi',
+'viewcount' => 'Laman ko lah dicaliak {{PLURAL:$1|$1 kali}}.',
+'protectedpage' => 'Laman nan dilinduangi',
'jumpto' => 'Lompek ka:',
'jumptonavigation' => 'pinteh',
'jumptosearch' => 'cari',
-'view-pool-error' => 'Maaf, server sadang sibuak pado kini ko.
-Talalu banyak pangguno barusaho mancaliak laman ko.
-Tunggu sabanta sabalum Sanak mancubo baliak mangakses laman ko.
+'view-pool-error' => 'Maaf, server sadang kalabiahan baban.
+Banyak bana nan barusaho mancaliak laman ko.
+Tunggu santa koq nio mancubo baliak ka laman ko.
$1',
-'pool-timeout' => 'Lewat waktu manunggu kunci',
-'pool-queuefull' => 'Kumpulan antrean panuah',
+'pool-timeout' => 'Abih wakatu',
+'pool-queuefull' => 'Antrian panuah',
'pool-errorunknown' => 'Kasalahan nan indak dikatahui',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
'disclaimers' => 'Sanggah',
'disclaimerpage' => 'Project:Sanggahan umum',
'edithelp' => 'Bantuan suntiangan',
-'edithelppage' => 'Help:Suntingan',
+'edithelppage' => 'Help:Panyuntiangan',
'helppage' => 'Help:Isi',
'mainpage' => 'Palanta',
'mainpage-description' => 'Palanta',
'editlink' => 'suntiang',
'viewsourcelink' => 'caliak sumber',
'editsectionhint' => 'Suntiang bagian: $1',
-'toc' => 'Daftar isi',
+'toc' => 'Dafta isi',
'showtoc' => 'tampilkan',
'hidetoc' => 'suruakkan',
'collapsible-collapse' => 'Ketekan',
Jikok urang lain nan malakukan pamintaan iko, atau jikok Sanak alah mangingek kato sandi Sanak dan akan tetap manggunokan kato sandi tasabuik, sila abaikan pasan iko dan tatap gunokan kato sandi lamo Sanak.',
'noemail' => 'Indak ado alamaik surel nan tacatat untuak pangguno "$1".',
'noemailcreate' => 'Sanak paralu manyadiokan alamaik surel nan sah',
-'passwordsent' => 'Kato sandi baharu alah dikiriman ka alamaik surel nan didaftakan untuak "$1".
-Sila masuak log baliak sasudah manarimo surel tasabuik.',
+'passwordsent' => 'Kato sandi baru alah dikiriman ka alamaik surel nan didaftakan untuak "$1".
+Silakan masuak log baliak sasudah manarimo surel tasabuik.',
'blocked-mailpassword' => 'Alamaik IP Sanak diblokir dari panyuntingan dan karanonyo indak diizinan manggunokan fungsi pangingek kato sandi untuak mancegah panyalahgunoan.',
-'eauthentsent' => 'Sabuah surel untuak konfirmasi alah dikirim ka alamaik surel.
-Sanak harus mangikuti instruksi di dalam surel tasabuik untuak malakukan konfirmasi bahawa alamaik tasabuik adolah batua kapunyoan Sanak. {{SITENAME}} indak akan mangaktifan fitur surel jikok langkah iko alun dilakuan.',
+'eauthentsent' => 'Surel untuak konfirmasi alah dikirim ka alamaik surel Sanak.
+Ikuti instruksi dalam surel tasabuik untuak malakuan konfirmasi jikok alamaik tasabuik adolah batua punyo Sanak. {{SITENAME}} indak akan mangaktifan fitur surel jikok langkah ko alun dilakuan.',
'throttled-mailpassword' => 'Suatu pangingat kato sandi alah dikiriman dalam {{PLURAL:$1|jam|$1 jam}} tarakhir.
Untuak manghindari panyalahgunoan, hanyo ciek kato sandi nan akan dikiriman satiok {{PLURAL:$1|jam|$1 jam}}.',
'mailerror' => 'Kasalahan dalam mangirimkan surel: $1',
'acct_creation_throttle_hit' => 'Pangunjung wiki iko jo alamaik IP nan samo jo Sanak alah mambuek {{PLURAL:$1|1 akun|$1 akun}} dalam sahari tarakhir, hinggo jumlah maksimum nan diizinan.
Karanonyo, pangunjuang jo alamaik IP iko indak dapek baliak mambuek akun lain untuak samantaro.',
-'emailauthenticated' => 'Alamaik surel Sanak alah dikonfirmasi pado $3, $2.',
-'emailnotauthenticated' => 'Alamaik surel Sanak alum dikonfirmasi. Sabalun dikonfirmasi Sanak ndak bisa manggunokan fitur surel.',
-'noemailprefs' => 'Sanak harus mamasukan alamaik surel di preferensi Sanak untuak dapek manggunokan fitur-fitur iko.',
-'emailconfirmlink' => 'Konfirmasikan alamaik surel Sanak',
-'invalidemailaddress' => 'Alamaik surel iko indak dapek ditarimo karano formatnyo indak sasuai.
-Harap masuakan alamaik surel dalam format nan batua atau kosoangan isian tasabuik.',
-'cannotchangeemail' => 'Alamat e-mail sanak indak bisa diubah di wiki ko.',
-'emaildisabled' => 'Situs iko indak bisa mangirim e-mail.',
+'emailauthenticated' => 'Alamaik surel Sanak lah dikonfirmasi pado $3, $2.',
+'emailnotauthenticated' => 'Alamaik surel Sanak alun dikonfirmasi. Sabalun dikonfirmasi Sanak indak dapek manggunoan fitur surel.',
+'noemailprefs' => 'Sanak harus mamasukan alamaik surel di pangaturan Sanak untuak dapek manggunoan fitur-fitur ko.',
+'emailconfirmlink' => 'Konfirmasi alamaik surel Sanak',
+'invalidemailaddress' => 'Alamaik surel iko indak dapek ditarimo dek formatnyo indak sasuai.
+Harap masuakan alamaik surel dalam format nan bana atau kosoangan isian tasabuik.',
+'cannotchangeemail' => 'Alamaik surel Sanak indak bisa diubah di wiki ko.',
+'emaildisabled' => 'Situs web ko indak dapek mangirim surel.',
'accountcreated' => 'Akun dibuek',
'accountcreatedtext' => 'Akun pangguno untuak $1 alah dibuek.',
'createaccount-title' => 'Pambuekan akun untuak {{SITENAME}}',
'createaccount-text' => 'Sasaurang alah mambuek sabuah akun untuak alamaik surel Sanak di {{SITENAME}} ($4) jo namo "$2" dan kato sandi "$3". Sanak dianjuakan untuak masuak log dan mangganti kato sandi Sanak kini.
-Sanak dapek maabaikan pasan iko jikok akun iko dibuek karano suatu kasalahan.',
+Sanak dapek mangacuahkan pasan ko jikok akun ko dibuek dek ado kasalahan.',
'usernamehasherror' => 'Namo pangguno indak bisa mangandung tando paga',
'login-throttled' => 'Sanak alah bakali-kali mancoba masuak log.
Sila manunggu sabalun mancubo baliak.',
'loginlanguagelabel' => 'Baso: $1',
'suspicious-userlogout' => 'Pamintaan Sanak untuak kalua log ditolak karano tampaknyo dikirim oleh panjalajah nan rusak atau proksi panyinggah.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Kasalahan nan indak dikana dalam fungsi mail() PHP',
-'user-mail-no-addy' => 'Mancubo mangirim e-mail tanpa alamat e-mail nan sah.',
+'user-mail-no-addy' => 'Mancubo mangirim surel tanpa alamaik surel nan sah.',
'user-mail-no-body' => 'Mancubo kirim surel kosong atau pasan talalu pendek',
# Change password dialog
'resetpass' => 'Tuka kato sandi',
-'resetpass_announce' => 'Sanak alah masauk log jo kode samantaro nan dikirim malalui surel. Untuak malanjuikkan, Sanak harus mamasuakan kato sandi baru di siko:',
+'resetpass_announce' => 'Sanak alah masauk log jo kode samantaro nan dikirim malalui surel. Untuak malanjuikan, Sanak harus mamasuakan kato sandi baru di siko:',
'resetpass_header' => 'Tuka kato sandi akun',
'oldpassword' => 'Kato sandi lamo:',
'newpassword' => 'Kato sandi baharu:',
# Special:PasswordReset
'passwordreset' => 'Setel ulang sandi',
-'passwordreset-text' => 'Langkapi formulir iko untuak manarimo surel pangingek detail akun Sanak.',
+'passwordreset-text' => 'Lengkapi formulir ko untuak manarimo surel pangingek pado detil akun Sanak.',
'passwordreset-legend' => 'Tuka baliak kato sandi',
'passwordreset-disabled' => 'Panukaran baliak kato sandi alah dimatian di wiki iko.',
'passwordreset-pretext' => '{{PLURAL:$1||Masuakan ciek data di bawah iko}}',
'passwordreset-username' => 'Namo pangguno:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Caliak kaputusannyo?',
-'passwordreset-capture-help' => 'Kalau sanak meancek boks iko, e-mail (jo kato kunci samantaro) akan dicaliakkan ka sanak.',
+'passwordreset-capture-help' => 'Kalau sanak mancentang kotak ko, surel (jo kato sandi samantaro) akan nampak jo Sanak.',
'passwordreset-email' => 'Alamaik surel:',
'passwordreset-emailtitle' => 'Detail akun di {{SITENAME}}',
'passwordreset-emailtext-ip' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek
-detail akun untuak {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} barikuik
-takaik jo alamaik surel iko:
+detil akun untuak {{SITENAME}} ($4). {{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel iko:
$2
-{{PLURAL:$3|Sandi samantaro|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|sahari|$5 hari}}.
-Sanak harus masuak dan mamiliah sandi baharu kini. Jikok urang lain mambuek
-pamintaan iko atau jikok Sanak ingek sandi asali dan indak lai
-ingin maubahnyo, Sanak dapek mabaikan pasan iko dan taruih manggunoan sandi lamo.',
-'passwordreset-emailtext-user' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek detail akun untuak {{SITENAME}} ($4).
-{{PLURAL:$3|Akun|Akun-akun}} barikuik takaik jo alamaik surel iko:
+{{PLURAL:$3|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|$5 hari}}.
+Sanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan sandi lamo.',
+'passwordreset-emailtext-user' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek detil akun untuak {{SITENAME}} ($4).
+{{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel ko:
$2
-{{PLURAL:$3|Sandi samantaro|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|sahari|$5 hari}}.
-Sanak harus masuak dan mamiliah sandi baharu kini. Jikok urang lain mambuek
-pamintaan iko atau jikok Sanak ingek sandi asali dan indak lai
-ingin maubahnyo, Sanak dapek maabaikan pasan iko dan taruih manggunokan sandi lamo.',
+{{PLURAL:$3|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|$5 hari}}.
+Sanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan sandi lamo.',
'passwordreset-emailelement' => 'Namo pangguno: $1
Sandi samantaro: $2',
'passwordreset-emailsent' => 'Surel pangingek alah dikiriman.',
'passwordreset-emailerror-capture' => 'Surel pangingek, nan ditampilkan di bawah, alah dibuek, tapi pengirimannyo gagal ka pangguno: $1',
# Special:ChangeEmail
-'changeemail' => 'Tuka alamat e-mail.',
-'changeemail-header' => 'Ganti alamat e-mail.',
+'changeemail' => 'Tuka alamaik surel.',
+'changeemail-header' => 'Ganti alamaik surel.',
'changeemail-text' => 'Isi formulir ko untuak mangganti alamat surel. Sanak harus mamasuakkan kato sandi untuak mayakinkan parubahan.',
'changeemail-no-info' => 'Sanak harus masuak log untuak mangakses laman ko.',
'changeemail-oldemail' => 'Alamat surel kini:',
'nowiki_tip' => 'Abaikan format wiki',
'image_tip' => 'Cantumkan berkas',
'media_tip' => 'Pautan berkas',
-'sig_tip' => 'Tandotangan sanak jo waktu',
+'sig_tip' => 'Tandotangan sanak jo wakatu',
'hr_tip' => 'Garih mandata',
# Edit pages
-'summary' => 'Ringkasan:',
+'summary' => 'Ikhtisar:',
'subject' => 'Subjek/judul:',
'minoredit' => 'Suntiangan ketek',
'watchthis' => 'Pantau laman ko',
-'savearticle' => 'Simpan laman',
+'savearticle' => 'Simpan',
'preview' => 'Caliak',
-'showpreview' => 'Caliak pratonton',
+'showpreview' => 'Pratonton',
'showlivepreview' => 'Pratayang langsuang',
-'showdiff' => 'Caliak parubahan',
+'showdiff' => 'Parubahan',
'anoneditwarning' => "'''Ingek:''' Sanak alun masuak log.
Alamat IP sanak tacatat pado riwayaik suntiangan laman ko.",
'anonpreviewwarning' => "''Sanak alun masuak log. Manyimpan laman akan manyababkan alamaik IP Sanak tacatat pado riwayat suntiangan laman iko.''",
* '''Firefox / Safari:''' Tahan ''Shift'' sambia mangklik ''Reload'', atau takan ''Ctrl-F5'' atau ''Ctrl-R'' (''⌘-R'' di Mac)
* '''Google Chrome:''' Takan ''Ctrl-Shift-R'' (''⌘-Shift-R'' di Mac)
* '''Internet Explorer:''' Tahan ''Ctrl'' sambia mangklik ''Refresh'', atau takan ''Ctrl-F5''
-* '''Opera:''' Barasiahkan tembolok di ''Tools → Preferences''",
+* '''Opera:''' Barasiahkan singgahan di ''Tools → Preferences''",
'usercssyoucanpreview' => "'''Tips:''' Gunoan tombol \"{{int:showpreview}}\" untuak mauji CSS baharu Sanak sabalun manyimpannyo.",
'userjsyoucanpreview' => "'''Tips:''' Gunoan tombol \"{{int:showpreview}}\" untuak mauji JS baharu Sanak sabalun manyimpannyo.",
'usercsspreview' => "'''Ingeklah bahawa Sanak sadang manampilan pratayang dari CSS Sanak.
'userinvalidcssjstitle' => "'''Paringatan:''' Kulik \"\$1\" indak ditamuan. Harap diingek bahawa laman .css dan .js manggunokan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannyo {{ns:user}}:Foo/Vector.css.",
'updated' => '(Dipabaharui)',
'note' => "'''Catatan:'''",
-'previewnote' => "'''Ingek ko hanyo pratonton'''
+'previewnote' => "'''Ingek iko hanyo pratonton'''
Parubahan Sanak alun disimpan!",
'continue-editing' => 'Pai ka area mangedit.',
'previewconflict' => 'Pratayang iko mancaminan teks pado bagian ateh kotak suntiangan teks sabagaimano akan taliek bilo Sanak manyimpannyo.',
'session_fail_preview' => "'''Maaf, kami ndak dapek mangolah suntiangan Sanak akibat tahapuihnyo data sesi.
Sila cubo sakali lai.
Jikok masih indak barhasil, cubolah [[Special:UserLogout|kalua log]] dan masuak log baliak.'''",
-'session_fail_preview_html' => "'''Kami indak dapek mamproses suntiangan Sanak karano hilangnyo data sesi.'''
+'session_fail_preview_html' => "'''Kami indak dapek mamproses suntiangan Sanak karano hilangnyo sesi data.'''
-''Karano {{SITENAME}} mangizinan panggunoan HTML mantah, pratayang alah disurukan sabagai pancagahan terhadap serangan JavaScript.''
+''Dek {{SITENAME}} mangizinan panggunoan HTML mantah, pratonton alah disuruakan sabagai pancagahan terhadok sarangan JavaScript.''
-'''Jikok iko marupokan upayo suntiangan nan sahih, sila cubo lai.
-Jikok masih tatap indak bahasil, cubolah [[Special:UserLogout|kalua log]] dan masuak baliak.'''",
+'''Jikok iko marupoan suntiangan nan sah, silakan cubo lai.
+Jikok masih jo indak barasil, cubolah [[Special:UserLogout|kalua log]] dan masuak baliak.'''",
'token_suffix_mismatch' => "'''Suntiangan Sanak ditolak karano aplikasi klien Sanak maubah karakter tando baco pado suntiangan.'''
Suntiangan tasabuik ditolak untuak mancegah kasalahan pado teks laman.
Hal iko kadang tajadi jikok Sanak manggunokan layanan proxy anonim babasis web nan bamasalah.",
'editing' => 'Manyuntiang $1',
'creating' => 'Mambuek $1',
'editingsection' => 'Suntiang $1 (bagian)',
-'editingcomment' => 'Manyuntiang $1 (bahagian baharu)',
+'editingcomment' => 'Manyuntiang $1 (bagian baru)',
'editconflict' => 'Konflik panyuntiangan: $1',
-'explainconflict' => "Urang lain alah manyuntiang laman iko sajak Sanak mulai manyuntiangnyo.
-Bagian ateh teks iko manganduang teks laman saat iko.
+'explainconflict' => "Urang lain lah manyuntiang laman ko sajak Sanak mulai manyuntiangnyo.
+Bagian ateh teks ko manganduang teks laman saat kini ko.
Parubahan nan Sanak lakuan ditunjuakan pado bagian bawah teks.
-Sanak hanyo paralu magabungan parubahan Sanak jo teks nan alah ado.
-'''Hanyo''' teks pado bagian ateh lamanlah nan akan disimpan apobilo Sanak manakan \"{{int:savearticle}}\".",
+Sanak hanyo paralu manggabungan parubahan Sanak jo teks nan lah ado.
+'''Hanyo''' teks pado bagian ateh lamanlah nan akan disimpan jikok Sanak manakan \"{{int:savearticle}}\".",
'yourtext' => 'Teks Sanak',
'storedversion' => 'Versi tasimpan',
-'nonunicodebrowser' => "'''Paringatan: Panjalajah web Sanak indak mandukung unicode.'''
-Alah tadapek sabuah solusi agar Sanak dapek manyuntiang laman jo aman: karakter non-ASCII akan muncua dalam kotak edit sabagai kode heksadesimal.",
+'nonunicodebrowser' => "'''Paringatan: Panjalajah web Sanak indak mandukuang Unicode.'''
+Alah ado solusi bia Sanak dapek manyuntiang laman sacaro aman: karakter non-ASCII akan muncua dalam kotak suntiang sabagai kode heksadesimal.",
'editingold' => "'''Paringatan:
-Sanak manyuntiang revisi lama suatu laman.
-Jikok Sanak manyimpannyo, parubahan-parubahan nan dibuek sajak revisi iko akan hilang.'''",
+Sanak manyuntiang revisi lamo suatu laman.
+Jikok Sanak manyimpannyo, parubahan-parubahan nan dibuek sajak revisi ko akan hilang.'''",
'yourdiff' => 'Pambedoan',
'copyrightwarning' => "Untuak diingek bahaso apo nan disumbang kapado {{SITENAME}} dianggap lah dilapeh di bawah $2 (caliak $1 untuak langkoknyo).
Jikok awak indak ingin apo nan ditulih tu disuntiang dan disebaran, jan dikirim tulisan tu ka siko.<br />
Awak musti bajanji juo bahaso iko adolah asia karya awak surang, atau disalin dari sumber miliak basamo atau sumber bebas lainnyo.
'''Jan dikirim karya bahak cipta nan indak baizin!'''",
'copyrightwarning2' => "Parhatikan bahawa sadoalah kontribusi terhadap {{SITENAME}} dapek disuntiang, diubah, atau dihapuih oleh panyumbang lainnyo. Jikok Sanak indak ingin tulisan Sanak disuntiang urang lain, jan kiriman ka siko.<br />Sanak jua bajanji bahawa iko adolah hasil karyo Sanak surang, atau disalin dari sumber miliak umum atau sumber bebas nan lain (liek $1 untuak informasi labiah lanjuik). '''JAN KIRIMAN KARYO NAN DILINDUNGI HAK CIPTA TANPA IJIN!'''",
-'longpageerror' => "'''KASALAHAN: Teks nan Sanak kiriman sagadang {{PLURAL:$1|kilobita|$1 kilobita}}, nan barati labiah gadang dari jumlah maksimum {{PLURAL:$2|kilobita|$2 kilobita}}. Teks indak dapek disimpan.'''",
+'longpageerror' => "'''Kasalahan: Teks nan Sanak kiriman sagadang {{PLURAL:$1|$1 kilobita}}, barati labiah gadang dari jumlah maksimum {{PLURAL:$2|$2 kilobita}}. Teks indak dapek disimpan.'''",
'readonlywarning' => "'''PARINGATAN: Basis data sadang dikunci untuak pamaliharaan, sahinggo saat iko Sanak indak dapek manyimpan hasil suntiangan.'''
Sanak mungkin paralu manyalin teks suntiangan Sanak ko dan simpankan ka sabuah berkas teks guno mamuekannyo baliak kundian.
Entri catatan tarakhir disadioan di bawah untuak referensi:",
'semiprotectedpagewarning' => "'''Paringatan: Laman iko sadang dilinduangi sahinggo hanyo pangguno tadafta nan bisa manyuntiangnyo.'''
Entri catatan tarakhir disadioan di bawah untuak referensi:",
-'cascadeprotectedwarning' => "'''PARINGATAN:''' Laman iko sadang dilinduangi sahinggo hanyo pangguno jo hak akses pangurus sajo nan dapek manyuntiangnyo karano disaratokan dalam {{PLURAL:$1|laman|laman-laman}} barikuik nan alah dilinduangi jo opsi 'palinduangan runtun':",
+'cascadeprotectedwarning' => "'''Paringatan:''' Laman ko sadang dilinduangi jadi hanyo pangguno jo hak akses panguruih sajo nan dapek manyuntiangnyo karano disaratoan dalam {{PLURAL:$1|laman}} nan alah dilinduangi jo palinduangan batingkek:",
'titleprotectedwarning' => "'''Paringatan: Laman iko alah dilinduangi sahinggo diparaluan [[Special:ListGroupRights|hak khusus]] untuak mambueknyo.'''
Entri catatan tarakhir disadioan di bawah untuak referensi:",
-'templatesused' => '{{PLURAL:$1|Templat}} yang digunoan di laman ko:',
-'templatesusedpreview' => '{{PLURAL:$1|Templat|Templat}} yang digunoan dalam pratonton ko:',
-'templatesusedsection' => '{{PLURAL:$1|Templat|Templat}} nan digunoan di bagian iko:',
+'templatesused' => '{{PLURAL:$1|Templat}} nan digunoan di laman ko:',
+'templatesusedpreview' => '{{PLURAL:$1|Templat}} nan digunoan dalam pratonton ko:',
+'templatesusedsection' => '{{PLURAL:$1|Templat}} nan digunoan di bagian ko:',
'template-protected' => '(dilinduangi)',
-'template-semiprotected' => '(semi-perlindungan)',
+'template-semiprotected' => '(palinduangan semi)',
'hiddencategories' => 'Laman ko marupokan kalompok dari {{PLURAL:$1|$1 kategori tapandam}}:',
-'nocreatetext' => '{{SITENAME}} alah mambatasi pambuekan laman-laman baharu.
-Sanak dapek baliak dan manyuntiang laman nan alah ado, atau sila [[Special:UserLogin|masuak log atau mambuek akun]].',
+'nocreatetext' => '{{SITENAME}} lah mambatasi pambuekan laman-laman baru.
+Sanak dapek baliak dan manyuntiang laman nan alah ado, atau [[Special:UserLogin|masuak log - mambuek akun]].',
'nocreate-loggedin' => 'Sanak ndak mampunyoi hak akses untuak mambuek laman baharu.',
'sectioneditnotsupported-title' => 'Panyuntiangan bagian indak didukuang',
'sectioneditnotsupported-text' => 'Panyuntiangan bagian indak didukuang di laman suntiang iko.',
'permissionserrors' => 'Kasalahan Hak Akses',
-'permissionserrorstext' => 'Sanak ndak mampunyoi hak untuak malakuan hal itu karano {{PLURAL:$1|alasan|alasan-alasan}} barikuik:',
+'permissionserrorstext' => 'Sanak indak ado hak untuak malakuannyo dek {{PLURAL:$1|alasan}} barikuik:',
'permissionserrorstext-withaction' => 'Awak indak punyo hak akses untuak $2, karano {{PLURAL:$1|alasan}} barikuik:',
'recreate-moveddeleted-warn' => "'''Ingek: Sanak mambuek ulang suatu laman nan alah dihapuih.'''
'pagehist' => 'Riwayaik laman',
'revdelete-otherreason' => 'Alasan lain/tambahan:',
'revdelete-reasonotherlist' => 'Alasan lain',
+'revdelete-edit-reasonlist' => 'Alasan mangapuih laman',
+
+# History merging
+'mergehistory-reason' => 'Alasan:',
# Merge log
+'mergelog' => 'Log panggabuangan',
'revertmerge' => 'Batal gabuang',
# Diffs
'history-title' => 'Riwayaik revisi dari "$1"',
+'difference-title' => 'Pabedoan antaro revisi dari "$1"',
+'difference-title-multipage' => 'Pabedoan antaro laman "$1" jo "$2"',
+'difference-multipage' => '(Pabedoan antaro laman)',
'lineno' => 'Barih $1:',
'compareselectedversions' => 'Bandiangan versi tapiliah',
+'showhideselectedversions' => 'Tampilkan/suruakan versi tapiliah',
'editundo' => 'batal',
'diff-multi' => '({{PLURAL:$1|$1 revisi antaro}} oleh {{PLURAL:$2|$2 pangguno}} indak ditampilkan)',
'searchresults' => 'Hasil pancarian',
'searchresults-title' => 'Hasil pancarian untuak "$1"',
'searchresulttext' => 'Untuak informasi labiah lanjuik tantang pancarian {{SITENAME}}, caliak [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Awak mancari \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|sado laman yang dimulai jo "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|sado laman nan tapauik ka "$1"]])',
-'searchsubtitleinvalid' => "Awak mancari '''$1'''",
+'searchsubtitle' => 'Sanak mancari \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|sado laman nan dimulai jo "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|sado laman nan tapauik ka "$1"]])',
+'searchsubtitleinvalid' => "Sanak mancari '''$1'''",
+'titlematches' => 'Judul laman pas',
'notitlematches' => 'Indak ado judul nan pas',
+'textmatches' => 'Teks laman pas',
'notextmatches' => 'Indak ado judul nan pas',
'prevn' => '{{PLURAL:$1|$1}} sabalunnyo',
-'nextn' => '{{PLURAL:$1|$1}} salanjuiknyo',
+'nextn' => '{{PLURAL:$1|$1}} barikuiknyo',
'prevn-title' => '$1 {{PLURAL:$1|hasil}} sabalunnyo',
'nextn-title' => '$1 {{PLURAL:$1|hasil}} barikuiknyo',
'shown-title' => 'Tampilkan $1 {{PLURAL:$1|hasil}} per laman',
'viewprevnext' => 'Caliakkan ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'Atua pancarian',
'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
'searchhelp-url' => 'Help:Isi',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Cari laman jo awalan ko]]',
'searchprofile-articles' => 'Laman isi',
'searchprofile-project' => 'Laman Bantuan jo Proyek',
'searchprofile-images' => 'Multimedia',
'search-result-score' => 'Relevansi: $1%',
'search-redirect' => '(pangaliahan $1)',
'search-section' => '(bagian $1)',
-'search-suggest' => 'Mungkin maksud awak: $1',
+'search-suggest' => 'Mungkin makasuiknyo: $1',
'search-interwiki-caption' => 'Proyek badunsanak',
'search-interwiki-default' => 'Hasil $1:',
-'search-interwiki-more' => '(selanjutnyo)',
+'search-interwiki-more' => '(salanjuiknyo)',
+'search-relatedarticle' => 'Bakaitan',
+'mwsuggest-disable' => 'Matian saran pancarian',
+'searcheverything-enable' => 'Cari di sagalo ruang namo',
'searchrelated' => 'bakaitan',
'searchall' => 'sado',
'showingresults' => "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
'powersearch-togglelabel' => 'Piliah:',
'powersearch-toggleall' => 'Sadonyo',
'powersearch-togglenone' => 'Dak ado',
+'search-external' => 'Pancarian lua',
+'searchdisabled' => 'Pancarian {{SITENAME}} dimatian.
+Sanak samantaro dapek mancari lewaik Google.
+Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
+
+# Quickbar
+'qbsettings' => 'Bar pinteh',
+'qbsettings-none' => 'Indak ado',
+'qbsettings-fixedleft' => 'Rato kiri',
+'qbsettings-fixedright' => 'Rato kanan',
+'qbsettings-floatingleft' => 'Mangambang di kiri',
+'qbsettings-floatingright' => 'Mangambang di kanan',
+'qbsettings-directionality' => 'Tetap, tagantuang pado skrip bahaso Sanak',
# Preferences page
'preferences' => 'Pangaturan',
'mypreferences' => 'Pangaturan',
+'prefs-edits' => 'Jumlah suntiangan:',
+'prefsnologin' => 'Alun masuak log',
'prefsnologintext' => 'Sanak musti <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} masuak log]</span> untuak mengeset pangaturan.',
'changepassword' => 'Tuka kato sandi',
'prefs-skin' => 'Kulik',
'prefs-user-pages' => 'Laman pangguno',
'prefs-personal' => 'Profil pangguno',
'prefs-rc' => 'Parubahan tabaru',
-'prefs-watchlist' => 'Dafta pantauan',
-'prefs-watchlist-days' => 'Lamonyo dalam daftar pantauan:',
+'prefs-watchlist' => 'Dafta pantau',
+'prefs-watchlist-days' => 'Lamonyo dalam dafta pantau:',
'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|hari}}',
-'prefs-watchlist-edits' => 'Jumlah suntiangan maksimum nan ditampilkan di dafta pantauan nan labiah langkok:',
+'prefs-watchlist-edits' => 'Jumlah suntiangan maksimum nan ditampilkan didafta pantaun nan labiah langkok:',
'prefs-watchlist-edits-max' => 'Nilai maksimum: 1000',
'prefs-watchlist-token' => 'Token pantauan:',
'prefs-misc' => 'Lain-lain',
'prefs-rendering' => 'Tampilan',
'saveprefs' => 'Simpan',
'resetprefs' => 'Batalan parubahan',
-'restoreprefs' => 'Baliakkan ka setelan bawaan',
+'restoreprefs' => 'Baliakan ka setelan awal',
'prefs-editing' => 'Panyuntiangan',
'prefs-edit-boxsize' => 'Ukuran kotak panyuntiangan.',
'rows' => 'Barih:',
'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|hari}}',
'recentchangescount' => 'Standar jumlah suntiangan nan ditampilkan:',
'prefs-help-recentchangescount' => 'Iko untuak parubahan tabaru, riwayaik laman nan lalu, sarato log.',
-'prefs-help-watchlist-token' => 'Mangisi kotak ko jo kunci rasio (PIN) akan manghasilkan sindikasi RSS untuak dafta pantauan Angku. Sia juo nan tau jo kunci ko dapek mambaco dafta pantauan Angku, jadi hati-hatilah mamiliah nilainyo
-Barikuik ko nilai acak nan dapek Angku gunoan: $1',
+'prefs-help-watchlist-token' => 'Mangisi kotak ko jo kunci rasio (PIN) akan manghasilkan sindikasi RSS untuak dafta pantau Sanak. Sia juo nan tau jo kunci ko dapek mambaco dafta pantau Sanak, jadi hati-hatilah mamiliah nilainyo.
+Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
'savedprefs' => 'Pangaturan lah tasimpan',
'timezonelegend' => 'Zona wakatu:',
'localtime' => 'Wakatu satampaik:',
'prefs-files' => 'Berkas',
'prefs-custom-css' => 'CSS pribadi',
'prefs-custom-js' => 'JS pribadi',
-'prefs-common-css-js' => 'CSS/JS babagi untuak sado kulik:',
+'prefs-common-css-js' => 'CSS/JS untuak kasado kulik:',
'prefs-reset-intro' => 'Angku dapek manggunokan laman ko untuak mangambalikan pangaturan ka setelan baku situs ko.
Pangambalian pangaturan indak dapek dibatalan.',
'prefs-emailconfirm-label' => 'Surel konfirmasi:',
'prefs-textboxsize' => 'Ukuran kotak suntiang',
'youremail' => 'Surel:',
'username' => '{{GENDER:$1|Namo pangguno}}:',
+'uid' => 'ID {{GENDER:$1|pangguno}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Anggota}} {{PLURAL:$1|kalompok}}:',
'prefs-registration' => 'Wakatu pandaftaran:',
'yourrealname' => 'Namo sabananyo:',
'yourlanguage' => 'Bahaso',
'email' => 'Surel',
'prefs-help-realname' => "Namo asli sifaiknyo opsional.
Jiko' Angku manambahkannyo, namo asli Angku akan digunoan untuak mengenal hasil karaja Angku.",
-'prefs-help-email' => 'Alamaik surel ko hanyo tambahan se, namun paralu untuak maulang kato kunci, jikok Sanak lupo kato kunci.',
+'prefs-help-email' => "Alamaik surel ko hanyolah tambahan, tapi paralu untuak ma-''reset'' kato sandi, bilo Sanak lupo kato sandi.",
'prefs-help-email-others' => 'Sanak dapek mamiliah untuak mangizinkan urang lain manghubungi jo surel malalui laman pangguno atau laman diskusi.
Alamaik surel tu indakkan tau dek urang nan manghubungi sanak tu.',
'prefs-help-email-required' => 'Alamaik surel wajib diisi.',
'prefs-displaywatchlist' => 'Pilihan tampilan',
'prefs-diffs' => 'Pabedoan',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Alamaik surel nampaknyo sah',
-'email-address-validity-invalid' => 'Masuakkan alamaik surel nan sah',
+'email-address-validity-invalid' => 'Masuakan alamaik surel nan sah',
# User rights
'userrights' => 'Manajemen hak pangguno',
'userrights-lookup-user' => 'Mangatua kalompok pangguno',
-'userrights-user-editname' => 'Masuakkan namo pangguno:',
+'userrights-user-editname' => 'Masuakan namo pangguno:',
'editusergroup' => 'Suntiang kalompok pangguno',
+'editinguser' => "Mangganti hak akses pangguno '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Suntiang kalompok pangguno',
+'saveusergroups' => 'Simpan kalompok pangguno',
+'userrights-groupsmember' => 'Anggota dari:',
+'userrights-groupsmember-auto' => 'Anggota implisit dari:',
+'userrights-groups-help' => 'Sanak dapek mangubah kalompok pangguno ko:
+* Kotak jo tando cek marupoan kalompok pangguno tasabuik
+* Kotak tanpa tando cek bararti pangguno ko bukan anggota kalompok tasabuik
+* Tando * manandoi Sanak indak dapek mambatalan kalompok tasabuik bilo Sanak alah manambahannyo, atau sabaliaknyo.',
+'userrights-reason' => 'Alasan:',
+'userrights-no-interwiki' => 'Sanak indak bahak untuak mangubah hak pangguno di wiki lain.',
+'userrights-nodatabase' => 'Basis data $1 indak ado atau bukan disiko.',
+'userrights-nologin' => 'Sanak musti [[Special:UserLogin|masuak log]] jo akun panguruih untuak dapek mangubah hak pangguno.',
+'userrights-notallowed' => 'Akun Sanak indak ado izin untuak manambah atau malapeh hak pangguno.',
+'userrights-changeable-col' => 'Kalompok nan dapek Sanak ubah',
+'userrights-unchangeable-col' => 'Kalompok nan indak dapek Sanak ubah',
# Groups
'group' => 'Kalompok:',
'group-all' => '(sadonyo)',
'group-user-member' => '{{GENDER:$1|pangguno}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|pangguno takonfirmasi otomatis}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|panguruih}}',
+'group-bureaucrat-member' => '{{GENDER:$1|birokrat}}',
+'group-suppress-member' => '{{GENDER:$1|pangawas}}',
'grouppage-user' => '{{ns:project}}:Pangguno',
-'grouppage-sysop' => '{{ns:project}}:Pengurus',
+'grouppage-autoconfirmed' => '{{ns:project}}:Pangguno takonfirmasi otomatis',
+'grouppage-bot' => '{{ns:project}}:Bot',
+'grouppage-sysop' => '{{ns:project}}:Panguruih',
+'grouppage-bureaucrat' => '{{ns:project}}:Birokrat',
+'grouppage-suppress' => '{{ns:project}}:Pangawas',
# Rights
+'right-read' => 'Mambaco laman',
+'right-edit' => 'Manyuntiang laman',
'right-createpage' => 'Mambuek laman baru (nan bukan laman diskusi)',
'right-createtalk' => 'Mambuek laman diskusi',
'right-createaccount' => 'Mambuek akun baru',
+'right-minoredit' => 'Manandoi suntiangan ketek',
+'right-move' => 'Mamindahan laman',
+'right-move-subpages' => 'Mamindahan laman jo kasado sub laman',
+'right-move-rootuserpages' => 'Mamindahan laman pangguno',
+'right-movefile' => 'Mamindahan berkas',
+'right-suppressredirect' => 'Indak mambuek pangaliahan wakatu mamindahan laman',
+'right-upload' => 'Mamuek berkas',
+'right-reupload' => 'Manimpo berkas lamo',
+'right-reupload-own' => 'Manimpo berkas nan dimuek surang',
# Special:Log/newusers
'newuserlogpage' => 'Log pangguno baru',
+'newuserlogpagetext' => 'Di bawah ko log pandaftaran pangguno baru',
# User rights log
'rightslog' => 'Log parubahan hak akses',
'rclinks' => 'Tunjuakkan $1 parubahan tabaru dalam $2 hari tarakhia<br />$3',
'diff' => 'bedo',
'hist' => 'sijarah',
-'hide' => 'Suruakkan',
-'show' => 'Tampilkan',
+'hide' => 'Suruakan',
+'show' => 'Tunjuakan',
'minoreditletter' => 'k',
'newpageletter' => 'B',
'boteditletter' => 'b',
'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
'recentchangeslinked-noresult' => 'Indak ado parubahan pado laman nan tapauik salamo periode nan ditantuan',
'recentchangeslinked-summary' => "Iko dafta parubahan tarakhir pado laman nan tahubuang dari laman tatantu (atau anggota dari kategori tatantu).
-Laman pado [[Special:Watchlist|pantauan Sanak]] ditandoi jo '''cetak taba'''.",
+Laman pado [[Special:Watchlist|dafta pantau Sanak]] ditandoi jo '''cetak taba'''.",
'recentchangeslinked-page' => 'Namo laman:',
'recentchangeslinked-to' => 'Tampilkan parubahan dari laman nan takaik jo laman nan ko',
# Upload
'upload' => 'Muek berkas',
'uploadlogpage' => 'Log unggah',
-'filedesc' => 'Ringkasan',
+'filename' => 'Namo berkas',
+'filedesc' => 'Ikhtisar',
+'fileuploadsummary' => 'Ikhtisar:',
+'filereuploadsummary' => 'Parubahan berkas:',
+'filestatus' => 'Status hak cipta:',
+'filesource' => 'Sumber:',
+'uploadedfiles' => 'Berkas nan lah dimuek',
+'ignorewarning' => 'Acuahkan pasan dan langsuang simpan berkas.',
+'ignorewarnings' => 'Acuahkan pasan apo pun',
+'minlength1' => 'Namo berkas paliang indak ado satu hurup.',
+'illegalfilename' => 'Namo berkas "$1" ado karakter nan indak dipabuliahkan ado dalam judul. Ubah namo berkas dan cubalah muek baliak.',
+'filename-toolong' => 'Namo berkas indak buliah labiah panjang dari 240 bita.',
+'badfilename' => 'Namo berkas lah diubah manjadi "$1".',
+'filetype-mime-mismatch' => 'Ekstensi berkas ".$1" indak cocok jo MIME nan tadeteksi dari berkas ($2).',
+'filetype-badmime' => 'Berkas batipe MIME "$1" indak buliah dimuek.',
+'filetype-bad-ie-mime' => 'Indak dapek mamuek berkas dek Internet Explorer mandeteksinyo sabagai "$1", nan indak diizinkan dan marupokan tipe berkas bapotensi bahayo.',
+'fileexists-thumbnail-yes' => "Berkas ko nampaknyo marupoan gambar nan ukurannyo dipaketek ''(miniatua)''. [[$1|thumb]]
+Cubo pareso berkas <strong>[[:$1]]</strong> tasabuik.
+Koq berkas tu samemang marupoan gambar dalam ukuran aslinyo, Sanak indak paralu untuak mamuak baliak miniatur lainnyo.",
+'file-thumbnail-no' => "Namo berkas dimulai jo <strong>$1</strong>.
+Nampaknyo berkas ko marupoan gambar jo ukuran dipaketek ''(miniatua)''.
+Koq Sanak ado versi resolusi panuah dari gambar ko, cubolah muekan berkas tasabuik. Koq indak, harap ubah namo berkas ko.",
'uploadedimage' => 'muek "[[$1]]"',
'license' => 'Lisensi:',
'license-header' => 'Lisensi',
# Special:ListFiles
+'listfiles' => 'Dafta berkas',
+'listfiles_thumb' => 'Miniatur',
+'listfiles_date' => 'Tanggal',
+'listfiles_name' => 'Namo',
'listfiles_user' => 'Pangguno',
'listfiles_size' => 'Ukuran',
'listfiles_description' => 'Katarangan',
'file-anchor-link' => 'Berkas',
'filehist' => 'Riwayaik berkas',
'filehist-help' => 'Klik pado tanggal/waktu untuak malihek berkas pado maso tu',
-'filehist-revert' => 'baliakkan',
+'filehist-deleteall' => 'hapuih sadonyo',
+'filehist-deleteone' => 'hapuih',
+'filehist-revert' => 'baliakan',
'filehist-current' => 'kini ko',
-'filehist-datetime' => 'Tanggal/Waktu',
+'filehist-datetime' => 'Tanggal/Wakatu',
'filehist-thumb' => 'Miniatur',
'filehist-thumbtext' => 'Miniatur untuak versi per $1',
'filehist-nothumb' => 'Miniatur indak ado',
'imagelinks' => 'Panggunoan berkas',
'linkstoimage' => 'Barikuik ko {{PLURAL:$1|$1 laman nan takaik}} jo berkas:',
'nolinkstoimage' => 'Indak ado laman nan batauik ka berkas ko.',
+'linkstoimage-redirect' => '$1 (pangaliahan berkas) $2',
'sharedupload' => 'Berkas ko barasal dari $1 dan mungkin digunoan oleh berbagai proyek lain.',
-'sharedupload-desc-here' => 'Berkas ko dari $1 dan mungkin digunoan untuak proyek-proyek lain.
-Katarangan dari [$2 laman kataranagn berkas] ditampilkan di bawah.',
+'sharedupload-desc-here' => 'Berkas ko dari $1, mungkin juo digunoan untuak proyek-proyek lain.
+Informasi dari [$2 laman katarangannyo] ado di bawah.',
+'filepage-nofile' => 'Indak ado berkas banomo iko.',
+'filepage-nofile-link' => 'Indak ado berkas banamo iko, tapi sanak dapek [$1 mamueknyo].',
'uploadnewversion-linktext' => 'Unggah versi baru dari berkas ko',
+'shared-repo-from' => 'dari $1',
+'shared-repo' => 'repositori basamo',
+'upload-disallowed-here' => 'Sanak indak dapaek manimpo berkas ko.',
+
+# File reversion
+'filerevert' => 'Baliakan $1',
+'filerevert-legend' => 'Baliakan berkas',
+'filerevert-intro' => "Sanank ka mambaliakan berkas '''[[Media:$1|$1]]''' ka versi [$4 pado $3, $2].",
+'filerevert-comment' => 'Alasan:',
+'filerevert-defaultcomment' => 'Baliakan ka versi pado $2, $1',
+'filerevert-submit' => 'Baliakan',
+'filerevert-success' => "'''[[Media:$1|$1]]''' lah dibaliakan ka versi [$4 pado $3, $2]",
+'filerevert-badversion' => 'Indak ado versi lokal tadahulu dari berkas ko pado wakatu nan dituju.',
+
+# File deletion
+'filedelete' => 'Hapuih $1',
+'filedelete-legend' => 'Hapuih berkas',
# Random page
'randompage' => 'Laman sumbarang',
# Statistics
'statistics' => 'Statistik',
-
+'statistics-header-pages' => 'Statistik laman',
+'statistics-header-edits' => 'Statistik suntiangan',
+'statistics-header-views' => 'Statistik tampilan',
+'statistics-header-users' => 'Statistik pangguno',
+'statistics-header-hooks' => 'Statistik lainnyo',
+'statistics-articles' => 'Laman konten',
+'statistics-pages' => 'Jumlah laman',
+'statistics-pages-desc' => 'Sado laman pado wiki, tamasuak laman maota, pangaliahan, dll.',
+'statistics-files' => 'Berkas nan lah dimuek',
+'statistics-edits' => 'Jumlah suntiangan sangkek {{SITENAME}} ko dimulai',
+'statistics-edits-average' => 'Rato-rato suntiangan per-laman',
+'statistics-views-total' => 'Jumlah tampilan laman',
+'statistics-views-total-desc' => 'Tampilan ka laman nan indak ado jo laman khusus nan indak ikuik',
+'statistics-views-peredit' => 'Tampilan per-suntiangan',
+'statistics-users' => 'Jumlah [[Special:ListUsers|pangguno tadafta]]',
+'statistics-users-active' => 'Pangguno aktip',
+'statistics-users-active-desc' => 'Pangguno nan aktip dalam {{PLURAL:$1|$1 ari}} tarakhia.',
+'statistics-mostpopular' => 'Laman nan paliang banyak ditampilkan',
+
+'disambiguations' => 'Laman nan tahubuang ka laman disambiguasi',
'disambiguationspage' => 'Template:sanamo',
+'doubleredirects' => 'Pangaliahan ganda',
+
+'withoutinterwiki-submit' => 'Tunjuakan',
+
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|bita}}',
+'ncategories' => '$1 {{PLURAL:$1|kategori}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki}}',
+'nlinks' => '$1 {{PLURAL:$1|pautan}}',
'nmembers' => '$1 {{PLURAL:$1|anggota}}',
+'nrevisions' => '$1 {{PLURAL:$1|revisi}}',
+'nviews' => 'dilihek $1 {{PLURAL:$1|kali}}',
+'nimagelinks' => 'Digunoan pado $1 {{PLURAL:$1|laman}}',
+'ntransclusions' => 'digunoan pado $1 {{PLURAL:$1|laman}}',
+'lonelypages' => 'Laman yatim',
'prefixindex' => 'Sado laman jo awalan',
+'prefixindex-namespace' => 'Sado laman jo awalan (ruang namo $1)',
+'shortpages' => 'Laman pendek',
+'longpages' => 'Laman panjang',
+'deadendpages' => 'Laman buntu',
+'deadendpagestext' => 'Laman-laman ko indak ad pautan ka laman lain di {{SITENAME}}.',
+'protectedpages' => 'Laman nan dilinduangi',
+'protectedpages-indef' => 'Untuak palinduangan salamonyo',
+'protectedpages-cascade' => 'Untuak palinduangan batingkek',
+'usereditcount' => '$1 {{PLURAL:$1|suntiangan}}',
'usercreated' => '{{GENDER:$3|Dibuek}} pado $1 pukua $2',
'newpages' => 'Laman baru',
+'newpages-username' => 'Namo pangguno:',
+'ancientpages' => 'Laman paliang lamo',
'move' => 'Pindah',
'movethispage' => 'Pindahan laman ko',
+'unusedimagestext' => 'Berkas barikuik ado tapi indak takaik jo laman mana pun.
+Harap paratikan bahwa situs web lain mungkin ado tautan ka suatu berkas jo URL langsung, dan masih tadafta di siko walaupun indak digunoan aktif.',
'pager-newer-n' => '{{PLURAL:$1|$1 labiah baru}}',
'pager-older-n' => '{{PLURAL:$1|$1 labiah lamo}}',
'booksources-go' => 'Tuju',
# Special:Log
+'specialloguserlabel' => 'Pangguno:',
+'speciallogtitlelabel' => 'Target (judul atau pangguno):',
'log' => 'Log',
+'all-logs-page' => 'Sado log publik',
+'alllogstext' => 'Gabungan kasado log nan ado di {{SITENAME}}.
+Sanak dapek mamiliah jenis log nan ado, namo pangguno (bedoan huruf ketek/gadang), atau judul laman (bedoan huruf ketek/gadang).',
+'logempty' => 'Indak basobok entri log nan sasuai.',
+'log-title-wildcard' => 'Cari judul nan diawali jo teks ko',
+'showhideselectedlogentries' => 'Tunjuakan/Suruakan entri log tapiliah',
# Special:AllPages
'allpages' => 'Kasado laman',
'alphaindexline' => '$1 sampai $2',
+'nextpage' => 'Laman salanjuiknyo ($1)',
'prevpage' => 'Laman sabalunnyo ($1)',
-'allpagesfrom' => 'Tampilkan laman mulai dari:',
-'allpagesto' => 'Tampilkan laman hinggo:',
-'allarticles' => 'Semua laman',
+'allpagesfrom' => 'Tunjuakan laman mulai dari:',
+'allpagesto' => 'Tunjuakan laman sampai:',
+'allarticles' => 'Kasado laman',
+'allinnamespace' => 'Kasado laman (ruang namo $1)',
+'allnotinnamespace' => 'Kasado laman (bukan ruang namo $1)',
+'allpagesprev' => 'Sabalun',
+'allpagesnext' => 'Lanjuik',
'allpagessubmit' => 'Tuju',
+'allpagesprefix' => 'Tunjuakan laman jo awalan:',
+'allpages-bad-ns' => '{{SITENAME}} indak ado ruang namo "$1".',
+'allpages-hide-redirects' => 'Suruakan pangaliahan',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Caliak versi baru.',
# Special:Categories
'categories' => 'Kategori',
+'categoriespagetext' => '{{PLURAL:$1|Isi kategori}} ko ado laman atau media.
+[[Special:UnusedCategories|Kategori nan indak tapakai]] indak nampak di siko.
+Lihek pulo [[Special:WantedCategories|kategori nan diinginkan]].',
+'categoriesfrom' => 'Tunjuakan kategori mulai jo:',
+'special-categories-sort-count' => 'uruikan manuruik jumlah',
+'special-categories-sort-abc' => 'uruikan manuruik abjad',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'Jariah nan dihapuih',
+'deletedcontributions-title' => 'Jariah nan dihapuih',
+'sp-deletedcontributions-contribs' => 'Jariah',
# Special:LinkSearch
'linksearch' => 'Pancarian pautan lua',
+'linksearch-pat' => 'Pola pancarian:',
+'linksearch-ns' => 'Ruang namo:',
+'linksearch-ok' => 'Cari',
'linksearch-line' => '$1 tapauik dari $2',
+# Special:ListUsers
+'listusersfrom' => 'Tunjuakan pangguno mulai dari:',
+'listusers-submit' => 'Tunjuakan',
+'listusers-noresult' => 'Pangguno indak basobok.',
+'listusers-blocked' => '(tasakek)',
+
+# Special:ActiveUsers
+'activeusers' => 'Dafta pangguno aktif',
+'activeusers-from' => 'Tunjuakan pangguno mulai dari:',
+'activeusers-hidebots' => 'Suruakan bot',
+'activeusers-hidesysops' => 'Suruakan panguruih',
+'activeusers-noresult' => 'Pangguno indak basobok',
+
# Special:ListGroupRights
+'listgrouprights' => 'Dafta kalompok pangguno',
+'listgrouprights-group' => 'Kalompok',
+'listgrouprights-rights' => 'Hak',
+'listgrouprights-helppage' => 'Help:Hak akses',
'listgrouprights-members' => '(dafta anggota)',
-# E-mail user
-'emailuser' => 'Kirim surel pangguno ko',
+# Email user
+'emailuser' => 'Surel pangguno',
+'emailuser-title-target' => 'Kirim surel ka {{GENDER:$1|panggun}} ko',
+'emailuser-title-notarget' => 'Kirim surel',
+'emailpage' => 'Kirim surel ka pangguno ko',
'emailpagetext' => 'Sanak dapek manggunoan formulir di bawah ko untuak mangirimkan surel ka {{GENDER:$1|pangguna}} ko.
Alamaik surel nan Sanak masuakkan di [[Special:Preferences|pangaturan akun]] akan kalua sabagai alamaik "Dari" pado surel tasabuik, jadi panarimo dapek langsuang mambalehnyo.',
+'usermaildisabled' => 'Surel pangguno non-aktif',
+'emailtarget' => 'Masuakan namo pangguno nan ka manarimo surel',
+'emailusername' => 'Namo pangguno:',
+'emailusernamesubmit' => 'Kirim',
+'email-legend' => 'Kirim surel ka pangguno {{SITENAME}} lainnyo',
+'emailfrom' => 'Dari:',
+'emailto' => 'Untuak:',
+'emailsubject' => 'Perihal:',
+'emailmessage' => 'Pasan:',
+'emailsend' => 'Kirim',
+'emailccme' => 'Kirimkan denai salinan pasan.',
# Watchlist
-'watchlist' => 'Daftapantau',
-'mywatchlist' => 'Daftapantau',
+'watchlist' => 'Pantauan',
+'mywatchlist' => 'Pantauan',
'watchlistfor2' => 'Untuak $1 $2',
-'addedwatchtext' => "Laman \"[[:\$1]]\" lah ditambahkan ka [[Special:Watchlist|senarai pantauan awak]].
-Parubahan laman ko tamasuak laman otanyo akan ditampilkan dalam '''cetak taba''' pado [[Special:RecentChanges|senarai parubahan]] agar lebih mudah manjagonyo.",
-'removedwatchtext' => 'Laman "[[:$1]]" lah dihapuih dari [[Special:Watchlist|senarai pantauan awak]].',
+'addedwatchtext' => "Laman \"[[:\$1]]\" lah ditambahkan ka [[Special:Watchlist|dafta pantauan Sanak]].
+Parubahan laman ko tamasuak laman rundiangnyo akan ditampilan pado [[Special:RecentChanges|dafta parubahan]] '''bacetak taba''' agar labiah mudah mancaliaknyo.",
+'removewatch' => 'Hapuih dari dafta pantau',
+'removedwatchtext' => 'Laman "[[:$1]]" lah dihapuih dari [[Special:Watchlist|dafta pantau Sanak]].',
'watch' => 'Pantau',
'watchthispage' => 'Pantau laman ko',
'unwatch' => 'Batal pantau',
-'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam daftapantau awak, indak tamasuak laman diskusi.',
+'unwatchthispage' => 'Batal pantau laman ko',
+'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam dafta pantau awak, indak tamasuak laman rundiangnyo.',
'wlshowlast' => 'Tampilkan $1 jam $2 hari tarakhia $3',
-'watchlist-options' => 'Piliahan daftapantau',
+'watchlist-options' => 'Piliahan dafta pantau',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Mamantau...',
# Delete
'deletepage' => 'Hapuih laman',
+'confirm' => 'Konfirmasi',
'confirmdeletetext' => 'Awak akan mahapuih laman atau berkas basamo riwayatnyo.
Pastikan awak mainginkannyo, dan awak lah tahu sagalo akibatnyo dan sasuai jo [[{{MediaWiki:Policy-url}}|kebijakan]] yang balaku.',
'actioncomplete' => 'Proses salasai',
'deletereasonotherlist' => 'Alasan lain',
# Rollback
-'rollbacklink' => 'baliakkan',
+'rollback' => 'Baliakan suntiangan',
+'rollback_short' => 'Baliakan',
+'rollbacklink' => 'baliakan',
+'rollbacklinkcount' => 'baliakan $1 {{PLURAL:$1|suntiangan}}',
+'rollbacklinkcount-morethan' => 'baliakan labiah dari $1 {{PLURAL:$1|suntiangan}}',
+'rollbackfailed' => 'Gagal mambaliakan',
# Protect
'protectlogpage' => 'Log palinduangan',
+'protectlogtext' => 'Di bawah ko dafta parubahan tahadok palinduangan laman.
+Caliak [[Special:ProtectedPages|dafta laman talinduang]] untuak dafta palinduangan laman tabaru.',
'protectedarticle' => 'malinduangkan "[[$1]]"',
-'modifiedarticleprotection' => 'maubah tingkek perlindungan "[[$1]]"',
+'modifiedarticleprotection' => 'maubah tingkek palinduangan "[[$1]]"',
'protectcomment' => 'Alasan:',
'protectexpiry' => 'Kadaluwarsa:',
'protect_expiry_invalid' => 'Maso kadaluwarsa indak balaku',
'protect_expiry_old' => 'Maso kadaluwarsa adolah pado maso lampau',
-'protect-text' => "Awak buliah malihek jo mangganti tingkek perlindungan di siko untuak laman '''$1'''.",
-'protect-locked-access' => "Akun awak indak berhak untuak maubah tingkek perlindungan laman ko.
-Berikut ko pengaturan yang balaku untuak laman '''$1''':",
+'protect-text' => "Sanak buliah malihek jo mangganti tingkek palinduangan untuak laman '''$1'''.",
+'protect-locked-access' => "Akun Sanak indak bahak untuak maubah tingkek palinduangan laman ko.
+Barikuik ko pangaturan nan balaku untuak laman '''$1''':",
'protect-cascadeon' => 'Laman ko sedang dilindungi karano tamasuak dalam {{PLURAL:$1|laman|laman}} aktif perlindungan batingkek.
Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlindungan batingkeknyo.',
'protect-default' => 'Semua pangguno diizinkan',
-'protect-fallback' => 'Memerlukan hak akses "$1"',
-'protect-level-autoconfirmed' => 'Blokir pangguno baru dan indak terdaftar',
-'protect-level-sysop' => 'Hanya pengurus',
+'protect-fallback' => 'Cumo untuak pangguno jo izin "$1"',
+'protect-level-autoconfirmed' => 'Cumo untuak pangguno takonfirmasi otomatis',
+'protect-level-sysop' => 'Cumo untuak panguruih',
'protect-summary-cascade' => 'batingkek',
-'protect-expiring' => 'kadaluwarsa $1 (UTC)',
-'protect-cascade' => 'Lindungi semua laman yang bakaik jo laman ko (perlindungan batingkek)',
-'protect-cantedit' => 'Awak indak dapek maubah tingkek perlindungan laman ko, karano awak indak berhak.',
-'restriction-type' => 'Perlindungan:',
+'protect-expiring' => 'sampai $1 (UTC)',
+'protect-expiring-local' => 'sampai $1',
+'protect-expiry-indefinite' => 'sataruihnyo',
+'protect-cascade' => 'Linduangi laman nan takaik jo laman ko (palinduangan batingkek)',
+'protect-cantedit' => 'Sanak indak dapek maubah tingkek palinduangan laman ko, karano indak ado izin untuak itu.',
+'protect-othertime' => 'Wakatu lain:',
+'protect-othertime-op' => 'wakatu lain',
+'protect-existing-expiry' => 'Alah sampai: $3, $2',
+'protect-otherreason' => 'Alasan lain/tambahan:',
+'protect-otherreason-op' => 'Alasan lain',
+'protect-dropdown' => '*Alasan umum palinduangan
+** Vandal baulang
+** Spam baulang
+** Parang suntiangan
+** Laman balalu lintas tinggi
+** Digunoan di Palanta
+** Templat baresiko tinggi
+** Berkas nan banyak digunoan
+** Baulang kali dihapuih dalam waktu dakek
+** Baulang kali dialiahan tanpa barundiang
+** Baulang kali dikosongan
+** Pamintaan pangguno',
+'protect-edit-reasonlist' => 'Suntiang alasan palinduangan',
+'protect-expiry-options' => '1 jam:1 hour,1 ari:1 day,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taun:1 year,salamonyo:infinite',
+'restriction-type' => 'Palinduangan:',
'restriction-level' => 'Tingkek larangan:',
+'minimum-size' => 'Ukuran min',
+'maximum-size' => 'Ukuran max',
+'pagesize' => '(bita)',
# Restrictions (nouns)
-'restriction-move' => 'Pindahan',
+'restriction-edit' => 'Suntiang',
+'restriction-move' => 'Pindah',
+'restriction-create' => 'Buek',
+'restriction-upload' => 'Muek',
+
+# Restriction levels
+'restriction-level-sysop' => 'palinduangan panuah',
+'restriction-level-autoconfirmed' => 'palinduangan semi',
+'restriction-level-all' => 'sado tingkek',
# Undelete
-'undeletelink' => 'caliak/cegakkan',
+'undelete' => 'Caliak laman nan dihapuih',
+'undeletepage' => 'Caliak dan baliakan laman tahapuih',
+'undeletepagetitle' => "'''Iko dafta revisi nan dihapuih dari [[:$1|$1]]'''.",
+'viewdeletedpage' => 'Caliak laman nan dihapuih',
+'undelete-nodiff' => 'Indak ado basobok revisi lamo',
+'undeletebtn' => 'Baliakan',
+'undeletelink' => 'caliak/baliakan',
'undeleteviewlink' => 'caliak',
# Namespace form on various pages
'year' => 'Dari taun (dan sabalunnyo):',
'sp-contributions-newbies' => 'Tampilkan jariah pangguno baru sajo',
+'sp-contributions-newbies-sub' => 'Untuak pangguno baru',
+'sp-contributions-newbies-title' => 'Jariah pangguno baru',
'sp-contributions-blocklog' => 'log pamblokiran',
-'sp-contributions-deleted' => 'kontribusi pangguno nan lah batiadoan',
+'sp-contributions-deleted' => 'jariah pangguno nan lah dihapuih',
'sp-contributions-uploads' => 'muek',
'sp-contributions-logs' => 'log',
'sp-contributions-talk' => 'maota',
+'sp-contributions-userrights' => 'pangalolaan hak pangguno',
+'sp-contributions-blocked-notice' => 'Pangguno ko sadang kanai sakek. log pamblokiran tarakhia ditunjuakan disiko untuak referensi:',
+'sp-contributions-blocked-notice-anon' => 'Alamaik IP ko tangah diblokir.
+Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
'sp-contributions-search' => 'Cari jariah',
'sp-contributions-username' => 'Alamat IP atau namo pangguno:',
'sp-contributions-toponly' => 'Hanyo manampilan suntiangan nan tarakhia',
'whatlinkshere-page' => 'Laman:',
'linkshere' => "Laman-laman ko bakaik ka '''[[:$1]]''':",
'nolinkshere' => "Indak ado laman nan punyo tautan ka '''[[:$1]]'''.",
-'isredirect' => 'laman pengaliahan',
+'nolinkshere-ns' => "Indak ado pautan laman ka '''[[:$1]]''' pado ruang namo nan dipiliah.",
+'isredirect' => 'laman pangaliahan',
'istemplate' => 'transklusi',
-'isimage' => 'tautan berkas',
-'whatlinkshere-prev' => '{{PLURAL:$1|sabalunnyo|sabalunnyo $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|salanjuiknyo|salanjuiknyo $1}}',
+'isimage' => 'pautan berkas',
+'whatlinkshere-prev' => '{{PLURAL:$1|sabalunnyo}}',
+'whatlinkshere-next' => '{{PLURAL:$1|salanjuiknyo}}',
'whatlinkshere-links' => '← pautan',
-'whatlinkshere-hideredirs' => '$1 pengalihan',
+'whatlinkshere-hideredirs' => '$1 pangaliahan',
'whatlinkshere-hidetrans' => '$1 transklusi',
'whatlinkshere-hidelinks' => '$1 pautan',
-'whatlinkshere-hideimages' => '$1 pahubuang berkas',
-'whatlinkshere-filters' => 'Panapiah',
+'whatlinkshere-hideimages' => '$1 pautan berkas',
+'whatlinkshere-filters' => 'Panyariang',
# Block/unblock
+'autoblockid' => 'Sakek otomatis #$1',
+'block' => 'Sakek pangguno',
+'unblock' => 'Lapeh sakek',
'blockip' => 'Sakek pangguno',
'blockip-title' => 'Sakek pangguno',
'blockip-legend' => 'Sakek pangguno',
+'ipadressorusername' => 'Alamaik IP atau namo pangguno:',
+'ipbexpiry' => 'Sampai:',
+'ipbreason' => 'Alasan:',
+'ipbreasonotherlist' => 'Alasan lain',
+'ipbreason-dropdown' => '*Alasan umum
+** Marusak (vandal)
+** Mangagiah informasi palsu
+** Mangilangkan isi laman
+** Spam pautan ka situs lua
+** Mambuek ota gadang di laman
+** Babuek intimidasi/palecehan
+** Manyalahgunoan babarapo akun
+** Namo pangguno talarang',
+'ipb-hardblock' => 'Halang pangguno tadafta untuak manyuntiang dari alamaik IP ko',
+'ipbcreateaccount' => 'Halang mambuek akun',
+'ipbemailban' => 'Halang pangguno mangirim surel',
+'ipbenableautoblock' => 'Otomatis sakek alamaik IP tarakhia nan digunoan pangguno ko, jo sado alamaik IP takaik nan mancubo manyuntiang.',
+'ipbsubmit' => 'Sakek pangguno ko',
+'ipbother' => 'Salamo:',
'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taun:1 year,salamonyo:infinite',
-'ipblocklist' => 'Pangguno tablokir',
+'ipbotheroption' => 'lainnyo',
+'ipbotherreason' => 'Alasan lain/tambahan:',
+'ipbhidename' => 'Suruakan namo pangguno dari dafta jo suntiangan',
+'ipbwatchuser' => 'Pantau laman pangguno ko jo laman diskusinyo',
+'ipb-disableusertalk' => 'Halang pangguno ko manyuntiang laman diskusinyo wakatu disakek',
+'ipb-change-block' => 'Sakek baliak pangguno jo setelan ko',
+'ipb-confirm' => 'Konfirmasi sakek',
+'badipaddress' => 'Alamaik IP salah',
+'blockipsuccesssub' => 'Sakek barasil',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] lah disakek.<br />
+Liek [[Special:BlockList|dafta sakek]] buek maninjaunyo.',
+'ipb-blockingself' => 'Angku ka manyakek diri surang! Lai yakin apo nan dikarajoan?',
+'ipb-edit-dropdown' => 'Suntiang alasan manyakek',
+'ipb-unblock-addr' => 'Lapeh sakek $1',
+'ipb-unblock' => 'Lapeh sakek pangguno atau alamaik IP',
+'ipb-blocklist' => 'Caliak nan disakek',
+'ipb-blocklist-contribs' => 'Jariah untuak $1',
+'unblockip' => 'Lapeh sakek',
+'unblockiptext' => 'Gunoan formulir ko untuak mangambalian hak akses alamaik IP atau pangguno nan kanai sakek',
+'ipusubmit' => 'Lapeh sakek ko',
+'unblocked' => '[[User:$1|$1]] lah dilapeh sakeknyo',
+'unblocked-range' => '$1 lah dilapeh sakeknyo',
+'unblocked-id' => 'Sakek $1 lah dilapeh',
+'blocklist' => 'Pangguno kanai sakek',
+'ipblocklist' => 'Pangguno kanai sakek',
+'ipblocklist-legend' => 'Cari pangguno kanai sakek',
+'blocklist-userblocks' => 'Suruakan akun tasakek',
+'blocklist-tempblocks' => 'Suruakan sakek samantaro',
+'blocklist-addressblocks' => 'Suruakan ciek IP tasakek',
+'blocklist-rangeblocks' => 'Suruakan wilayah sakek',
+'blocklist-timestamp' => 'tando wakatu',
+'blocklist-target' => 'Target',
+'blocklist-expiry' => 'Kadaluwarsa',
+'blocklist-by' => 'Panguruih nan manyakek',
+'blocklist-params' => 'Parameter sakek',
+'blocklist-reason' => 'Alasan',
+'ipblocklist-submit' => 'Cari',
+'ipblocklist-localblock' => 'Sakek lokal',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|Sakek}} lain',
+'infiniteblock' => 'salamonyo',
+'expiringblock' => 'habih pado $1 di $2',
+'anononlyblock' => 'hanyo anon.',
+'noautoblockblock' => 'sakek otomatis dimatian',
+'createaccountblock' => 'mambuek akun dimatian',
+'emailblock' => 'surel diblokir',
+'blocklist-nousertalk' => 'indak dapek manyuntiang laman maota surang',
+'ipblocklist-empty' => 'Dafta sakek ko kosong.',
+'ipblocklist-no-results' => 'Alamaik IP atau pangguno nan dimintak indak disakek.',
'blocklink' => 'sakek',
-'unblocklink' => 'hilangkan blokir',
+'unblocklink' => 'lapeh sakek',
'change-blocklink' => 'ubah sakek',
'contribslink' => 'jariah',
-'blocklogpage' => 'Log pamblokiran',
-'blocklogentry' => 'mamblokir [[$1]] dalam maso $2 $3',
-'unblocklogentry' => 'mahilangkan blokir $1',
-'block-log-flags-nocreate' => 'mambuek akun dimatikan',
+'emaillink' => 'kirim surel',
+'autoblocker' => 'Sakek otomatis dek alamaik IP lah digunoan jo "[[User:$1|$1]]".
+Alasan disakek untuak $1 adolah "\'\'$2\'\'"',
+'blocklogpage' => 'Log sakek',
+'blocklogentry' => 'Manyakek [[$1]] dalam maso $2 $3',
+'unblocklogentry' => 'lapeh sakek $1',
+'block-log-flags-anononly' => 'hanyo pangguno anonim',
+'block-log-flags-nocreate' => 'mambuek akun dimatian',
+'block-log-flags-noautoblock' => 'sakek otomatis dimatian',
+'block-log-flags-noemail' => 'surel diblokir',
+'block-log-flags-nousertalk' => 'indak dapek manyuntiang laman maota surang',
+'block-log-flags-angry-autoblock' => 'sistim sakek otomatis diaktifkan',
+'block-log-flags-hiddenname' => 'namo pangguno tasuruak',
+'ipb_already_blocked' => '"$1" alah disakek',
+'ipb-needreblock' => '$1 alah tasakek. Apo nio diubah pangaturannyo?',
+'ipb-otherblocks-header' => '{{PLURAL:$1|Sakek}} lain',
'blockme' => 'Sakek denai',
+'proxyblocker' => 'Sakek proksi',
+'proxyblocker-disabled' => 'Fungsi ko dimatian',
+
+# Developer tools
+'lockdb' => 'Kunci basis data',
+'unlockdb' => 'Bukak kunci basis data',
# Move page
+'move-page' => 'Pindahan $1',
+'move-page-legend' => 'Pindahan laman',
'movepagetext' => "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sadonyo data riwayaik ka namo baru.
Judua lamo tu ka manjadi laman paraliahan manuju judua nan baru.
Awak dapek mampabarui paraliahan-paraliahan nan manuju ka judua lamo sacaro otomatis.
Dalam kasus tu, kok amuah Angku dapek mamindahkan ataupun manggabuangkan laman sacaro manual.",
'movearticle' => 'Pindahkan laman',
+'movenologin' => 'Alun masuak log',
+'movenologintext' => 'Sanak musti pangguno tadafta dan [[Special:UserLogin|masuak lo]] untuak mamindahan laman.',
+'movenotallowed' => 'Sanak indak ado izin untuak mamindahan laman.',
+'movenotallowedfile' => 'Sanak indak ado izin untuak mamindahan berkas.',
+'cant-move-user-page' => 'Sanak indak ado izin untuak mamindahan laman pangguno (bagian dari sub laman).',
+'cant-move-to-user-page' => 'Sanak indak ado izin untuak mamindahan laman ka laman pangguno (salain ka sub laman pangguno).',
'newtitle' => 'Ka judul baru:',
'move-watch' => 'Pantau laman ko',
-'movepagebtn' => 'Pindahkan laman',
+'movepagebtn' => 'Pindahan laman',
'pagemovedsub' => 'Pamindahan berhasil',
-'movepage-moved' => '\'\'\'"$1" lah dipindahkan ka "$2"\'\'\'',
-'articleexists' => 'Laman dengan namo tu lah ado, atau namo yang awak pilih indak tapek. Silakan pilih namo lain',
-'talkexists' => "'''Laman tersebut berhasil dipindahkan, tapi laman otanyo indak dapek dipindahkan karano lah ado laman ota pado judul yang baru. Silakan digabuang laman ota tu sacaro manual.'''",
-'movedto' => 'dipindahkan ka',
-'movetalk' => 'Pindahkan laman ota yang takaik',
-'movelogpage' => 'Log pemindahan',
+'movepage-moved' => '\'\'\'"$1" lah dipindahan ka "$2"\'\'\'',
+'movepage-moved-redirect' => 'Pangaliahan lah dibuek.',
+'movepage-moved-noredirect' => 'Pangaliahan indak dibuek.',
+'articleexists' => 'Laman nan banamo tu lah ado, atau namo nan Sanak piliah indak tapek.
+Silakan piliah namo lain.',
+'cantmove-titleprotected' => 'Sanak indak dapek mamindahan laman kasiko dek judul barunyo kanai linduang dari dibuek',
+'talkexists' => "'''Laman tasabuik barasil dipindahan, tapi laman rundiangnyo indak dapek dipindahan dek lah ado laman rundiang disinan. Silakan digabuang laman rundiang tu sacaro manual.'''",
+'movedto' => 'pindahan ka',
+'movetalk' => 'Pindahan laman rundiang nan takaik',
+'move-subpages' => 'Pindahan sub laman (sampai $1)',
+'move-talk-subpages' => 'Pindahan sub laman dari laman rundiang (sampai $1)',
+'movelogpage' => 'Log pamindahan',
'movereason' => 'Alasan:',
'revertmove' => 'baliakkan',
'thumbnail-more' => 'Pagadang',
'thumbnail_error' => 'Gagal mambuek miniatur: $1',
+# Special:Import
+'importstart' => 'Mangimpor laman...',
+
+# Import log
+'import-logentry-upload' => 'mangimpor [[$1]] malalui pamuekan berkas',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Laman pangguno sanak',
+'tooltip-pt-userpage' => 'Laman pangguno Sanak',
'tooltip-pt-anonuserpage' => 'Laman pangguno IP Sanak',
-'tooltip-pt-mytalk' => 'Laman diskusi sanak',
-'tooltip-pt-anontalk' => 'Diskusi tantang suntiangan dari alamat IP ko',
+'tooltip-pt-mytalk' => 'Laman rundiang Sanak',
+'tooltip-pt-anontalk' => 'Parundiangan tantang suntiangan dari IP ko',
'tooltip-pt-preferences' => 'Pangaturan denai',
'tooltip-pt-watchlist' => 'Dafta laman nan dipantau.',
-'tooltip-pt-mycontris' => 'Daftar jariah Sanak',
+'tooltip-pt-mycontris' => 'Dafta jariah Sanak',
'tooltip-pt-login' => 'Sanak disaranan untuak masuak log; walaupun indak wajib',
'tooltip-pt-logout' => 'Kalua log',
'tooltip-ca-talk' => 'Parudiangan tantang isi laman',
Sanak hanyo buliah mancaliak sumbernyo sajo',
'tooltip-ca-history' => 'Revisi sabalunnyo dari laman ko',
'tooltip-ca-protect' => 'Linduangi laman ko',
+'tooltip-ca-unprotect' => 'Tuka palinduangan laman ko',
'tooltip-ca-delete' => 'Hapuih laman ko',
'tooltip-ca-move' => 'Pindahan laman ko',
-'tooltip-ca-watch' => 'Tambahkan laman ko ka dafta pantauan sanak',
-'tooltip-ca-unwatch' => 'Kaluaan laman ko dari daftapantau',
+'tooltip-ca-watch' => 'Tambahkan laman ko ka dafta pantau sanak',
+'tooltip-ca-unwatch' => 'Kaluaan laman ko dari dafta pantau',
'tooltip-search' => 'Cari {{SITENAME}}',
'tooltip-search-go' => 'Cari laman jo namo nan samo jikok ado',
'tooltip-search-fulltext' => 'Cari laman untuak teks ko',
'tooltip-feed-rss' => 'Umpan RSS untuak laman ko',
'tooltip-feed-atom' => 'Umpan Atom untuak laman ko',
'tooltip-t-contributions' => 'Caliak dafta jariah pangguno ko',
-'tooltip-t-emailuser' => 'Kirim surel ka pangguno ko',
+'tooltip-t-emailuser' => 'Kirimkan surel pado pangguno ko',
'tooltip-t-upload' => 'Muek berkas',
'tooltip-t-specialpages' => 'Dafta dari sado laman istimewa',
'tooltip-t-print' => 'Versi cetak dari laman ko',
'tooltip-preview' => 'Caliak dulu nan diubah, gunokan ko sabalun manyimpan',
'tooltip-diff' => 'Caliak parubahan nan alah awak buek tu',
'tooltip-compareselectedversions' => 'Caliak pabedoan antaro duo revisi pilihan laman ko',
-'tooltip-watch' => 'Tambahkan laman ko ka daftapantau',
+'tooltip-watch' => 'Tambahkan laman ko ka dafta pantau',
'tooltip-recreate' => 'Buek baliak laman walaupun sabananyo pernah dihapuih',
'tooltip-upload' => 'Mulai mamuek',
'tooltip-rollback' => '"Baliakkan" uruangkan suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
'tooltip-preferences-save' => 'Simpan preferensi',
'tooltip-summary' => 'Masuakan sabuah ringkasan pendek',
+# Stylesheets
+'print.css' => '/* CSS placed here will affect the print output */',
+
# Metadata
'notacceptable' => 'Layanan wiki indak manyadioan data dalam format yang dapek dibaco dek pelanggan awak.',
'anonymous' => '{{PLURAL:$1|Pangguno}} anonim {{SITENAME}}',
'siteuser' => 'pangguno {{SITENAME}} $1',
'anonuser' => 'pangguno anonim {{SITENAME}} $1',
+'others' => 'lainnyo',
'siteusers' => '{{PLURAL:$2|pangguno}} {{SITENAME}} $1',
'anonusers' => '{{PLURAL:$2|pangguno}} anonim {{SITENAME}} $1',
'creditspage' => 'Panghargaan laman',
'pageinfo-length' => 'Panjang laman (dalam bita)',
'pageinfo-article-id' => 'ID Laman',
'pageinfo-firstuser' => 'Pambuek laman',
+'pageinfo-toolboxlink' => 'Informasi laman',
# Skin names
'skinname-standard' => 'Klasik',
'skinname-modern' => 'Moderen',
'skinname-vector' => 'Vektor',
+# Patrolling
+'markaspatrolleddiff' => 'Tandoi lah dipatroli',
+'markaspatrolledtext' => 'Tandoi laman ko lah dipatroli',
+'markedaspatrolled' => 'Tandoi lah dipatroli',
+
+# Patrol log
+'patrol-log-page' => 'Log patroli',
+'log-show-hide-patrol' => '$1 log patroli',
+
# Browsing diffs
'previousdiff' => '← Revisi sabalunnyo',
'nextdiff' => 'Revisi salanjuiknyo →',
# Media information
-'thumbsize' => 'Ukuran miniatur:',
+'imagemaxsize' => "Bateh ukuran gambar:<br />''(untuak laman katarangan berkas)''",
+'thumbsize' => 'Ukuran miniatua:',
'widthheight' => '$1 × $2',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|laman}}',
'file-info' => 'ukuran berkas: $1, tipe MIME: $2',
'file-nohires' => 'Indak tasadio resolusi nan labiah gadang.',
'svg-long-desc' => 'Berkas SVG, $1 × $2 piksel, ukuran berkas: $3',
'svg-long-desc-animated' => 'Berkas anmasi SVG, $1 × $2 piksel, ukuran berkas: $3',
+'svg-long-error' => 'Berkas SVG indak sah: $1',
'show-big-image' => 'Resolusi panuah',
'show-big-image-preview' => 'Ukuran pratonton ko: $1',
'show-big-image-other' => '{{PLURAL:$2|Resolusi}} lainnyo: $1.',
'file-info-png-frames' => '$1 {{PLURAL:$1|bingkai}}',
# Special:NewFiles
-'newimages-legend' => 'Panyaring',
+'newimages-legend' => 'Panyariang',
'newimages-label' => 'Namo berkas (atau sabagian darinyo):',
'showhidebots' => '($1 bot)',
'noimages' => 'Indak ado nan dicaliak.',
'minutes' => '{{PLURAL:$1|$1 minik}}',
'hours' => '{{PLURAL:$1|$1 jam}}',
'days' => '{{PLURAL:$1|$1 hari}}',
+'months' => '{{PLURAL:$1|$1 bulan}}',
+'years' => '{{PLURAL:$1|$1 taun}}',
'ago' => '$1 nan lalu',
+'just-now' => 'kini ko',
# Bad image list
'bad_image_list' => 'Formatnyo adolah sabagai barikuik:
'watchlistall2' => 'kasadonyo',
'namespacesall' => 'sadonyo',
'monthsall' => 'sadonyo',
+'limitall' => 'sadonyo',
+
+# Watchlist editor
+'watchlistedit-raw-titles' => 'Judul:',
+'watchlistedit-raw-submit' => 'Pabarui pantauan',
+'watchlistedit-raw-done' => 'Pantauan Sanak lah dipabarui',
+'watchlistedit-raw-added' => '{{PLURAL:$1|$1 judul lah}} ditambahan:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|$1 judul lah}} dibuang:',
# Watchlist editing tools
-'watchlisttools-view' => 'Tampilkan parubahan takaik',
-'watchlisttools-edit' => 'Tampilkan sarato suntiang daftapantau',
+'watchlisttools-view' => 'Tunjuakan parubahan takaik',
+'watchlisttools-edit' => 'Tunjuakan sarato suntiang dafta pantau',
'watchlisttools-raw' => 'Suntiang pantauan mantah',
# Signatures
'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|maota]])',
# Core parser functions
+'unknown_extension_tag' => 'Tag ekstensi "$1" indak tau',
'duplicate-defaultsort' => '\'\'\'Peringatan:\'\'\' Kunci panguruitan default "$2" sabalunnyo mangabaikan kunci panguruitan default "$1".',
# Special:Version
+'version' => 'Versi',
+'version-extensions' => 'Ekstensi tarinstal',
+'version-specialpages' => 'Laman istimewa',
+'version-parserhooks' => 'Kaik parser',
+'version-variables' => 'Variabel',
+'version-antispam' => 'Pancagahan spam',
'version-skins' => 'Kulik',
'version-other' => 'Lain-lain',
+'version-version' => '(Versi $1)',
'version-license' => 'Lisensi',
+'version-poweredby-credits' => "Wiki ko didukuang jo '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
+'version-poweredby-others' => 'lainnyo',
+'version-software' => 'Parangkaik lunak tapasang',
+'version-software-product' => 'Produk',
+'version-software-version' => 'Versi',
+'version-entrypoints-header-url' => 'URL',
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
# Special:FilePath
+'filepath' => 'Lokasi berkas',
'filepath-page' => 'Berkas:',
+'filepath-submit' => 'Cari',
# Special:FileDuplicateSearch
-'fileduplicatesearch-result-n' => 'Berkas "$1" punyo {{PLURAL:$2|1 duplikat identik|$2 duplikat identik}}.',
+'fileduplicatesearch-result-n' => 'Berkas "$1" ado {{PLURAL:$2|$2 duplikat nan samo}}.',
'fileduplicatesearch-noresults' => 'Indak basobok berkas banamo "$1".',
# Special:SpecialPages
'specialpages' => 'Laman istimewa',
+'specialpages-group-login' => 'Masuak log / mandafta',
+
+# Special:BlankPage
+'blankpage' => 'Laman kosong',
# External image whitelist
'external_image_whitelist' => '#Bia se barih ko apo adonyo<pre>
'searchsuggest-containing' => 'Barisi...',
# Durations
-'duration-millennia' => '$1 {{PLURAL:$1|millennium|millenia}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenium}}',
);
'loginlanguagelabel' => 'Јазик: $1',
'suspicious-userlogout' => 'Вашето барање за одјава е одбиено бидејќи се чини дека е испратено од расипан прелистувач или кеширачки застапник (proxy).',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Непозната грешка во функцијата mail() на PHP',
'user-mail-no-addy' => 'Се обидовте да испратите порака без да внесете адреса',
'user-mail-no-body' => 'Се обидовте да испратите писмо кое е празно или со неразумно куса содржина.',
'prefs-user-pages' => 'Кориснички страници',
'prefs-personal' => 'Кориснички профил',
'prefs-rc' => 'Скорешни промени',
-'prefs-watchlist' => 'Ð\9dабљудувања',
+'prefs-watchlist' => 'набљудувања',
'prefs-watchlist-days' => 'Број на денови за приказ во списокот на набљудувања:',
'prefs-watchlist-days-max' => 'Највеќе $1 {{PLURAL:$1|ден|дена}}',
'prefs-watchlist-edits' => 'Максимален број на прикажани промени во проширениот список на набљудувања:',
'prefs-displaywatchlist' => 'Нагодувања на приказот',
'prefs-diffs' => 'Разлики',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Исправно',
'email-address-validity-invalid' => 'Се бара исправна адреса!',
Наместо тоа, може да имаат врска до посоодветната тема.<br />
Една страница се смета за страница за појаснување ако го користи шаблонот што води од [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Страници со својство',
+'pageswithprop-legend' => 'Страници со својство',
+'pageswithprop-text' => 'На страницава се наведени страници што користат дадено својство.',
+'pageswithprop-prop' => 'Име на својството:',
+'pageswithprop-submit' => 'Оди',
+
'doubleredirects' => 'Двојни пренасочувања',
'doubleredirectstext' => 'Оваа страница ги прикажува пренасочувачките страници до други пренасочувачки страници.
Секој ред содржи врски кон првото и второто пренасочување, како и целта на второто пренасочување, кое обично ја посочува <i>вистинската</i> целна страница кон која првото пренасочување би требало да насочува.
'listgrouprights-addgroup-self-all' => 'Може да ги додаде сите групи на сопствената корисничка сметка',
'listgrouprights-removegroup-self-all' => 'Може да ги избрише сите групи од сопствената корисничка сметка',
-# E-mail user
+# Email user
'mailnologin' => 'Нема адреса за праќање',
'mailnologintext' => 'Мора да сте [[Special:UserLogin|најавени]] и да имате важечка е-поштенска адреса во вашите [[Special:Preferences|нагодувања]] за да може да праќате е-пошта до други корисници.',
'emailuser' => 'Пиши е-пошта на корисникот',
'exblank' => 'страницата беше празна',
'delete-confirm' => 'Избриши „$1“',
'delete-legend' => 'Бришење',
-'historywarning' => "'''Предупредување:''' Страницата којашто сакате да ја избришете има историја со околу $1 {{PLURAL:$1|ревизија|ревизии}}:",
+'historywarning' => "'''Предупредување:''' Страницата што сакате да ја избришете има историја со околу $1 {{PLURAL:$1|ревизија|ревизии}}:",
'confirmdeletetext' => 'На пат сте трајно да избришете страница заедно со нејзината историја.
Потврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа, дека го правите ова во согласност со [[{{MediaWiki:Policy-url}}|политиката]].',
'actioncomplete' => 'Дејството е спроведено',
'monthsall' => 'сите',
'limitall' => 'сите',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Потврда на е-поштенска адреса',
'confirmemail_noemail' => 'Немате наведено важечка е-поштенска адреса во вашите [[Special:Preferences|нагодувања]].',
'confirmemail_text' => '{{SITENAME}} бара да ја потврдите вашата е-поштенска адреса пред да ги користите можностите за е-пошта.
'revdelete-content-unhid' => 'содржината е откриена',
'revdelete-summary-unhid' => 'описот на уредувањето е откриен',
'revdelete-uname-unhid' => 'корисничкото име е скриено',
-'revdelete-restricted' => 'применети ограничувања на систем оператори',
+'revdelete-restricted' => 'применети ограничувања на администратори',
'revdelete-unrestricted' => 'отстранети ограничувања за систем оператори',
'logentry-move-move' => '$1 ја премести страницата $3 на $4',
'logentry-move-move-noredirect' => '$1 ја премести страницата $3 на $4 без да остави пренасочување',
'api-error-invalid-file-key' => 'Внатрешна грешка: не ја пронајдов податотеката во привременото складиште.',
'api-error-missingparam' => 'Внатрешна грешка: недостасуваат параметри за барањето.',
'api-error-missingresult' => 'Внатрешна грешка: не можев да одредам дали копирањето заврши успешно.',
-'api-error-mustbeloggedin' => 'Ð\9cоÑ\80а да Ñ\81Ñ\82е наÑ\98авени за да можеÑ\82е да подигаÑ\82е подаÑ\82оÑ\82еки.',
+'api-error-mustbeloggedin' => 'Мора да сте најавени за да подигате податотеки.',
'api-error-mustbeposted' => 'Во програмов има грешка. Не користи исправен HTTP-метод.',
'api-error-noimageinfo' => 'Погидањето успеа, но опслужувачот не понуди никакви информации за податотеката.',
'api-error-nomodule' => 'Внатрешна грешка: нема зададено модул за подигање.',
'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
'duration-millennia' => '$1 {{PLURAL:$1|милениум|милениуми}}',
+# Image rotation
+'rotate-comment' => 'Сликата е завртена за $1 {{PLURAL:$1|степен|степени}} вдесно',
+
);
'loginlanguagelabel' => 'ഭാഷ: $1',
'suspicious-userlogout' => 'ലോഗൗട്ട് ചെയ്യാനുള്ള താങ്കളുടെ അഭ്യർത്ഥന നിരസിച്ചിരിക്കുന്നു, കാരണം അത് തകർന്ന ബ്രൗസറിൽ നിന്നോ കാഷിങ് പ്രോക്സിയിൽ നിന്നോ ഉണ്ടായതുപോലെ അനുഭവപ്പെടുന്നു.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'പി.എച്ച്.പി.യുടെ main() ഫങ്ഷനിൽ അപരിചിതമായ പിഴവ്',
'user-mail-no-addy' => 'ഇമെയിൽ വിലാസം ഇല്ലാതെയാണ് ഇമെയിൽ അയയ്ക്കാൻ ശ്രമിച്ചത്',
'user-mail-no-body' => 'ശൂന്യമായതോ അസാമാന്യമായി ചെറുതോ ആയ ഉള്ളടക്കമുള്ള ഇമെയിൽ അയയ്ക്കാൻ ശ്രമിച്ചു.',
# Preferences page
'preferences' => 'ക്രമീകരണങ്ങൾ',
'mypreferences' => 'ക്രമീകരണങ്ങൾ',
-'prefs-edits' => 'à´\86à´\95àµ\86 തിരàµ\81à´¤àµ\8dതലàµ\81à´\95ൾ:',
+'prefs-edits' => 'ആകെ തിരുത്തുകൾ:',
'prefsnologin' => 'ലോഗിൻ ചെയ്തിട്ടില്ല',
'prefsnologintext' => 'ഉപയോക്തൃക്രമീകരണങ്ങൾ മാറ്റാൻ താങ്കൾ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ലോഗിൻ]</span> ചെയ്തിരിക്കണം.',
'changepassword' => 'രഹസ്യവാക്ക് മാറ്റുക',
'prefs-displaywatchlist' => 'പ്രദർശന ഐച്ഛികങ്ങൾ',
'prefs-diffs' => 'വ്യത്യാസങ്ങൾ',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'സാധുതയുള്ളതെന്ന് തോന്നുന്നു',
'email-address-validity-invalid' => 'സാധുതയുള്ള വിലാസം ആവശ്യമാണ്!',
'listgrouprights-addgroup-self-all' => 'എല്ലാ സംഘങ്ങളേയും സ്വന്തം അംഗത്വത്തിൽ ചേർക്കുക',
'listgrouprights-removegroup-self-all' => 'സ്വന്തം അംഗത്വത്തിൽ നിന്ന് എല്ലാ സംഘങ്ങളേയും നീക്കംചെയ്യുക',
-# E-mail user
+# Email user
'mailnologin' => 'അയയ്ക്കാനുള്ള വിലാസം ലഭ്യമല്ല',
'mailnologintext' => 'മറ്റ് ഉപയോക്താക്കൾക്കു ഇമെയിലയക്കുവാൻ താങ്കൾ [[Special:UserLogin|ലോഗിൻ]] ചെയ്തിരിക്കുകയും, സാധുവായ ഒരു ഇമെയിൽ വിലാസം താങ്കളുടെ [[Special:Preferences|ക്രമീകരണങ്ങൾ]] താളിൽ സജ്ജീകരിച്ചിരിക്കുകയും വേണം.',
'emailuser' => 'ഈ ഉപയോക്താവിനു ഇമെയിൽ അയക്കുക',
'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ',
'pageinfo-not-current' => 'ക്ഷമിക്കുക, പഴയ നാൾപ്പതിപ്പുകളിൽ ഈ വിവരം പ്രദർശിപ്പിക്കുക അസാദ്ധ്യമാണ്.',
'pageinfo-header-basic' => 'അടിസ്ഥാനവിവരങ്ങൾ',
-'pageinfo-header-edits' => 'തിരàµ\81à´¤àµ\8dതൽà´\9aà´°à´¿à´¤àµ\8dà´°à´\82',
+'pageinfo-header-edits' => 'തിരàµ\81à´¤àµ\8dà´¤àµ\81à´\95à´³àµ\81à´\9fàµ\86 നാൾവഴി',
'pageinfo-header-restrictions' => 'സംരക്ഷണം',
'pageinfo-header-properties' => 'താളിന്റെ ഗുണഗണങ്ങൾ',
'pageinfo-display-title' => 'പ്രദർശിപ്പിക്കേണ്ട തലക്കെട്ട്',
'monthsall' => 'എല്ലാം',
'limitall' => 'എല്ലാം',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'ഇ-മെയിൽ വിലാസം സ്ഥിരീകരിക്കൽ',
'confirmemail_noemail' => '[[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളുടെ കൂടെ]] സാധുവായൊരു ഇ-മെയിൽ വിലാസം സജ്ജീകരിച്ചിട്ടില്ല.',
'confirmemail_text' => '{{SITENAME}} സംരംഭത്തിൽ ഇ-മെയിൽ സൗകര്യം ഉപയോഗിക്കണമെങ്കിൽ താങ്കൾ താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിന്റെ സാധുത തെളിയിച്ചിരിക്കണം. താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിലേക്ക് സ്ഥിരീകരണ മെയിൽ അയക്കുവാൻ താഴെയുള്ള ബട്ടൺ അമർത്തുക. താങ്കൾക്ക് അയക്കുന്ന ഇ-മെയിലിൽ ഒരു സ്ഥിരീകരണ കോഡ് ഉണ്ട്. ആ കോഡിൽ അമർത്തിയാൽ താങ്കളുടെ വിലാസത്തിന്റെ സാധുത തെളിയിക്കപ്പെടും.',
'duration-centuries' => '{{PLURAL:$1|ഒരു നൂറ്റാണ്ട്|$1 നൂറ്റാണ്ട്}}',
'duration-millennia' => '{{PLURAL:$1|ഒരു സഹസ്രാബ്ദം|$1 സഹസ്രാബ്ദം}}',
+# Unknown messages
+'pageswithprop-submit' => 'പോകൂ',
);
* @author Aan
* @author Angela
* @author Ankitgadgil
+ * @author Ashupawar
* @author Balaji
* @author Chandu
* @author Dnyanesh325
* @author Mohanpurkar
* @author Mvkulkarni23
* @author Prabodh1987
+ * @author Pranav jagtap
* @author Rahuldeshmukh101
* @author Rdeshmuk
* @author Sankalpdravid
* @author Sudhanwa
* @author Tusharpawar1982
* @author V.narsikar
+ * @author Vibhavari
* @author Vpnagarkar
* @author Ydyashad
* @author Ynwala
'moredotdotdot' => 'अजून...',
'morenotlisted' => 'आणखी यादीत नाही...',
'mypage' => 'माझे पान',
-'mytalk' => 'माà¤\9dà¥\8dया à¤\9aरà¥\8dà¤\9aा',
+'mytalk' => 'चर्चा',
'anontalk' => 'या अंकपत्त्याचे चर्चा पान उघडा',
'navigation' => 'सुचालन',
'and' => ' आणि',
'namespaces' => 'नामविश्वे',
'variants' => 'अस्थिर',
+'navigation-heading' => 'दिक्चालन यादी',
'errorpagetitle' => 'चूक',
'returnto' => '$1 कडे परत चला.',
'tagline' => '{{SITENAME}} कडून',
'badarticleerror' => 'या पानावर ही कृती करता येत नाही.',
'cannotdelete' => '$1 हे पान किंवा संचिका वगळता आलेली नाही. (आधीच इतर कुणी वगळले असण्याची शक्यता आहे.)',
'cannotdelete-title' => '$1 ला वगळू शकत नाहि',
+'delete-hook-aborted' => 'खोडण्याची क्रिया मधेच थांबवीण्यात येत आहे.
+कोणतेही कारण देण्यात आले नाही',
'badtitle' => 'चुकीचे शीर्षक',
'badtitletext' => 'आपण मागितलेले शीर्षक पान अयोग्य, रिकामे अथवा चूकीने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीर्षक आहे. त्यात एक किंवा अधिक शीर्षकअयोग्य चिन्हे आहेत.',
'perfcached' => 'खालील माहिती सयीमध्ये(कॅशे) ठेवली आहे त्यामुळे ती नवीनतम {{PLURAL:$1|one result is|$1 results }} नसावी.',
'edit-no-change' => 'तुमचे संपादन दुर्लक्षित करण्यात आले आहे, कारण माहितीमध्ये काहीही बदल झालेला नाही.',
'edit-already-exists' => 'नवीन पान तयार करता येऊ शकले नाही.
या नावाचे पान आधीच अस्तित्वात आहे.',
+'defaultmessagetext' => 'कसूर पाठ्य मजकूर',
+'invalid-content-data' => 'अवैध माहिती',
# Content models
'content-model-wikitext' => 'विकिमजकूर',
'right-writeapi' => 'लेखन एपीआय चा उपयोग',
'right-delete' => 'पृष्ठे वगळा',
'right-bigdelete' => 'जास्त इतिहास असणारी पाने वगळा',
+'right-deletelogentry' => 'थरविक् लोग् प्रवेश् बन्द आनि चालु करने',
'right-deleterevision' => 'एखाद्या पानाच्या विशिष्ट आवृत्त्या लपवा',
'right-deletedhistory' => 'वगळलेल्या इतिहास नोंदी, त्यांच्या संलग्न मजकूराशिवाय पहा',
'right-deletedtext' => 'वगळलेला मजकूर व वगळलेल्या आवर्तनांमधील बदल पहा',
'alllogstext' => '{{SITENAME}}च्या सर्व नोंदीचे एकत्र दर्शन.नोंद प्रकार, सदस्यनाव किंवा बाधीत पान निवडून तुम्ही तुमचे दृश्यपान मर्यादीत करू शकता.',
'logempty' => 'नोंदीत अशी बाब नाही.',
'log-title-wildcard' => 'या मजकुरापासून सुरू होणारी शिर्षके शोधा.',
+'showhideselectedlogentries' => 'निवडलेले लॉग पहाणे /लपवणे',
# Special:AllPages
'allpages' => 'सर्व पृष्ठे',
'allpages-hide-redirects' => 'पुनर्निर्देशने लपवा',
# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'तुम्ही पाहत आहात या पाठया ची छोटी आवृत्ती,जी की १ तास ३० मिनिट जुनी असू शकते',
'cachedspecial-refresh-now' => 'आखेरचे दृश्य',
# Special:Categories
'import-error-interwiki' => 'इंटर विकी लिंक साठी $1 पान आरक्षित केल्यामुळे ते इम्पोर्ट करू शकत नाही',
'import-error-special' => 'विशेष नामविश्वासाठी $1 पान आरक्षित केल्यामुळे ते इम्पोर्ट करू शकत नाही. या नामविश्वात पाने असत नाहीत.',
'import-error-invalid' => 'नाव अयोग्य असल्याने $1 पान इम्पोर्ट करू शकत नाही.',
+'import-rootpage-invalid' => 'दिलेले मूळ पान अवैध नाव आहे',
# Import log
'importlogpage' => 'ईम्पोर्ट सूची',
'pageinfo-display-title' => 'दृश्य शीर्षक',
'pageinfo-length' => 'पानाचा आकार (बाइट्समध्ये)',
'pageinfo-language' => 'पानाच्या मजकूराची भाषा',
+'pageinfo-robot-index' => 'आनुक्रमानीत',
+'pageinfo-robot-noindex' => 'आनुक्रमानीत करू शकत नाही',
'pageinfo-views' => 'अभिप्रायांची संख्या',
'pageinfo-watchers' => 'पाहणाऱ्यांची संख्या',
'pageinfo-redirects-name' => 'या पानाकडील पुनर्निर्देशने',
+'pageinfo-firstuser' => 'पृष्ठ निर्मानक',
'pageinfo-firsttime' => 'पान निर्मितीचा दिनांक',
'pageinfo-lastuser' => 'अलीकडील संपादक',
'pageinfo-lasttime' => 'अलीकडिल संपादनाचा दिनांक',
'loginlanguagelabel' => 'Bahasa: $1',
'suspicious-userlogout' => 'Permintaan anda untuk log keluar ditolak kerana ia kelihatan seperti dihantar oleh pelayar rosak atau proksi pengagregatan.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Ralat tak diketahui dalam fungsi mail() PHP',
'user-mail-no-addy' => 'E-eml cuba dihantar tanpa alamat e-mel',
'user-mail-no-body' => 'Anda telah cuba menghantar e-mel dengan isi yang kosong atau terlampau ringkas.',
'prefs-displaywatchlist' => 'Pilihan paparan',
'prefs-diffs' => 'Beza',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Alamat e-mel adalah sah',
'email-address-validity-invalid' => 'Sila masukkan alamat e-mel yang sah',
Pautan ini sepatutnya ditujukan ke topik yang sepatutnya.<br />
Sesebuah laman dianggap sebagai laman penyahkekaburan jika ia menggunakan templat yang dipaut dari [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Halaman dengan sifat halaman',
+'pageswithprop-text' => 'Halaman ini menyenaraikan halaman-halaman yang menggunakan sifat halaman yang tertentu.',
+'pageswithprop-prop' => 'Nama sifat:',
+
'doubleredirects' => 'Lencongan berganda',
'doubleredirectstext' => 'Yang berikut ialah senarai laman yang melencong ke laman lencongan lain. Setiap baris mengandungi pautan ke laman lencongan pertama dan kedua, serta baris pertama bagi teks lencongan kedua, lazimnya merupakan laman sasaran "sebenar", yang sepatutnya ditujui oleh lencongan pertama.
Masukan yang <del>dipotong</del> telah diselesaikan.',
'listgrouprights-addgroup-self-all' => 'Menyertai semua kumpulan',
'listgrouprights-removegroup-self-all' => 'Keluar daripada semua kumpulan',
-# E-mail user
+# Email user
'mailnologin' => 'Tiada alamat e-mel',
'mailnologintext' => 'Anda perlu [[Special:UserLogin|log masuk]]
terlebih dahulu dan mempunyai alamat e-mel yang sah dalam
'monthsall' => 'semua',
'limitall' => 'semua',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Sahkan alamat e-mel',
'confirmemail_noemail' => 'Anda belum menetapkan alamat e-mel yang sah dalam [[Special:Preferences|laman keutamaan]] anda.',
'confirmemail_text' => '{{SITENAME}} menghendaki supaya anda mengesahkan alamat e-mel anda sebelum menggunakan ciri-ciri e-mel.
'duration-centuries' => '$1 abad',
'duration-millennia' => '$1 alaf',
+# Unknown messages
+'pageswithprop-legend' => 'Halaman dengan sifat halaman',
+'pageswithprop-submit' => 'Pergi',
);
'loginlanguagelabel' => 'Språk: $1',
'suspicious-userlogout' => 'Din forespørsel om å logge ut ble nektet fordi den så ut til å ha bli sendt av en ødelagt nettleser eller en mellomtjener.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
'user-mail-no-addy' => 'Forsøkte å sende e-post uten e-postadresse',
'user-mail-no-body' => 'Prøvde å sende e-post med tom eller for kort brødtekst.',
'prefs-displaywatchlist' => 'Visningsalternativer',
'prefs-diffs' => 'Forskjeller',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-postadressen ser gyldig ut',
'email-address-validity-invalid' => 'Skriv inn en gyldig e-postadresse',
De burde i stedet lenke til en passende innholdsside.<br />
En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sider med sideverdi',
+
'doubleredirects' => 'Doble omdirigeringer',
'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
Hver rad inneholder lenker til første og andre omdirigering, samt målet for den andre omdirigeringen, som vanligvis er den «virkelige» målsiden som den første omdirigeringen burde peke til.
'listgrouprights-addgroup-self-all' => 'Kan legge til alle grupper til egen konto',
'listgrouprights-removegroup-self-all' => 'Kan ta bort alle grupper fra egen konto',
-# E-mail user
+# Email user
'mailnologin' => 'Ingen avsenderadresse',
'mailnologintext' => 'Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
'emailuser' => 'E-post til denne brukeren',
Om du velger å ikke gjøre det, sjekk at flyttingen ikke fører til [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].
Du er ansvarlig for at lenker fortsetter å peke til de sidene de er ment å peke til.
-Legg merke til at siden '''ikke''' kan flyttes hvis det allerede finnes en side med den nye tittelen, med mindre den er tom eller er en omdirigeringsside uten historikk.
+Legg merke til at siden '''ikke''' kan flyttes hvis det allerede finnes en side med den nye tittelen, med mindre sistnevnte er tom eller er en omdirigeringsside uten historikk.
Det betyr at du kan flytte en side tilbake dit den kom fra hvis du gjør en feil, og du kan ikke overskrive eksisterende sider ved et uhell.
'''Advarsel!'''
'monthsall' => 'alle',
'limitall' => 'alle',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Bekreft e-postadresse',
'confirmemail_noemail' => 'Du har ikke oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].',
'confirmemail_text' => 'Du må bekrefte e-postadressen din før du kan benytte deg av e-posttjenester på {{SITENAME}}. Trykk på knappen under for å sende en bekreftelsesmelding til e-postadressen din. Meldingen vil inneholde en lenke med en kode; følg lenken for å bekrefte at e-postadressen er gyldig.',
'duration-centuries' => '$1 {{PLURAL:$1|århundre|århundrer}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
+# Unknown messages
+'pageswithprop-legend' => 'Sider med en sideverdi',
);
'newwindow' => '(नयाँ विन्डोमा खुल्छ)',
'cancel' => 'रद्द',
'moredotdotdot' => 'थप...',
+'morenotlisted' => 'थप जानकारी दिइएको छैन',
'mypage' => 'पृष्ठ',
'mytalk' => 'वार्ता',
'anontalk' => 'यस IP को वारेमा वार्तालाप गर्नुहोस्',
'loginlanguagelabel' => 'भाषा: $1',
'suspicious-userlogout' => 'तपाईंको निर्गमन अनुरोध अस्विकार गरिन्छ किन कि यो खराब ब्राउजर वा क्यासिङ प्रोक्सिले पठाएको जस्तो देखिन्छ।',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'PHP मेल() क्रियामा अज्ञात त्रुटि',
'user-mail-no-addy' => 'इमेल ठेगाना बिना नै इमेल पठाउन खोजिएको थियो।',
'prefs-displaywatchlist' => 'प्रदर्शन विकल्पहरू',
'prefs-diffs' => 'diffs(भिन्नता)',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'ई मेल ठेगाना मान्य भएको प्रतीत हुन्छ',
'email-address-validity-invalid' => 'मान्य ईमेल ठेगाना दिनुहोस्',
'listgrouprights-removegroup-self' => '{{PLURAL:$2|समूह|समूहहरु}} यस $1 खाताबाट हटाउने',
'listgrouprights-addgroup-self-all' => 'सबै समूहहरु निजी खातामा थप्ने',
-# E-mail user
+# Email user
'mailnologin' => 'ईमेल पठाउने ठेगाना नै भएन ।',
'mailnologintext' => 'तपाईले अरु प्रयोगकर्ताहरुलाई ईमेल पठाउनको लागि आफु पहिले [[Special:UserLogin|प्रवेश(लगइन)गरेको]] हुनुपर्छ र [[Special:Preferences|आफ्नो रोजाइहरुमा]] एउटा वैध ईमेल ठेगाना भएको हुनुपर्छ।',
'emailuser' => 'यो प्रयोगकर्तालाई ई-मेल पठाउनुहोस्',
'monthsall' => 'सबै',
'limitall' => 'सबै',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'इमेल ठेगाना पक्का गर्नुहोस्',
'confirmemail_noemail' => 'तपाईको प्रयोगकर्ता [[Special:Preferences|अभिरुचीमा]] मान्य इमेल ठेगाना राखीएको छैन ।',
'confirmemail_pending' => 'तपाईको इमेलमा प्रपाणिकरण कोड पहिले नै पठाइ सकिएको छ;
'loginlanguagelabel' => 'Taal: $1',
'suspicious-userlogout' => 'Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Er is een onbekende fout opgetreden in de mail()-functie van PHP',
'user-mail-no-addy' => 'Geprobeerd een e-mail te verzenden zonder een e-mailadres.',
'user-mail-no-body' => 'Er is geprobeerd een e-mail te verzenden zonder inhoud of met een hele korte inhoud.',
'prefs-displaywatchlist' => 'Weergaveopties',
'prefs-diffs' => 'Verschillen',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Het e-mailadres lijkt geldig',
'email-address-validity-invalid' => 'Geef een geldig e-mailadres op',
Deze horen waarschijnlijk direct naar een meer toepasselijke pagina te verwijzen.<br />
Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => "Pagina's met een pagina-eigenschap",
+'pageswithprop-legend' => "Pagina's met een pagina-eigenschap",
+'pageswithprop-text' => "Op deze pagina worden pagina's weergegeven met een bepaalde pagina-eigenschap.",
+'pageswithprop-prop' => 'Naam van de eigenschap:',
+'pageswithprop-submit' => 'OK',
+
'doubleredirects' => 'Dubbele doorverwijzingen',
'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
Elke rij bevat koppelingen naar de eerste en de tweede doorverwijspagina en een koppeling naar de doelpagina van de tweede doorverwijspagina.
'listgrouprights-addgroup-self-all' => 'Alle groepen toevoegen aan eigen gebruiker',
'listgrouprights-removegroup-self-all' => 'Alle groepen verwijderen van eigen gebruiker',
-# E-mail user
+# Email user
'mailnologin' => 'Geen verzendadres beschikbaar',
'mailnologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in uw [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
'emailuser' => 'Deze gebruiker e-mailen',
'monthsall' => 'alle',
'limitall' => 'alle',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'E-mailadres bevestigen',
'confirmemail_noemail' => 'U hebt geen geldig e-mailadres ingegeven in uw [[Special:Preferences|gebruikersvoorkeuren]].',
'confirmemail_text' => '{{SITENAME}} eist bevestiging van uw e-mailadres voordat u de e-mailmogelijkheden kunt gebruiken.
'loginlanguagelabel' => 'Språk: $1',
'suspicious-userlogout' => 'Førespurnaden din om å logge ut vart nekta fordi han såg ut til å vere sendt av ein øydelagt nettlesar eller mellomtenar.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Ukjend feil i PHPs mail()-funksjon',
'user-mail-no-addy' => '↓Prøvde å senda e-post utan e-postadresse',
'user-mail-no-body' => 'Freista å senda e-post med tom eller urimeleg stutt brødtekst.',
'showpreview' => 'Førehandsvis',
'showlivepreview' => 'Levande førehandsvising',
'showdiff' => 'Vis skilnader',
-'anoneditwarning' => "'''Åtvaring:''' Du er ikkje innlogga. IP-adressa di vert lagra i historikken for sida.",
+'anoneditwarning' => "'''Åtvaring:''' Du er ikkje innlogga.
+IP-adressa di vert lagra i endringshistorikken til sida.",
'anonpreviewwarning' => "''Du er ikkje innlogga. Lagrar du vil IP-adressa di verta førd opp i endringshistorikken til denne sida.''",
'missingsummary' => "'''Påminning:''' Du har ikkje skrive noko endringssamandrag. Dersom du trykkjer «Lagre» ein gong til, vert endringa di lagra utan.",
'missingcommenttext' => 'Ver venleg og skriv ein kommentar nedanfor.',
'search-interwiki-default' => '$1-resultat:',
'search-interwiki-more' => '(meir)',
'search-relatedarticle' => 'Relatert',
-'mwsuggest-disable' => 'Slå av AJAX-forslag',
+'mwsuggest-disable' => 'Slå av søkjeframlegg',
'searcheverything-enable' => 'Søk i alle namneroma',
'searchrelated' => 'relatert',
'searchall' => 'alle',
'prefs-i18n' => 'Internasjonalisering',
'prefs-signature' => 'Signatur',
'prefs-dateformat' => 'Datoformat',
-'prefs-timeoffset' => 'Tidsforskuving',
+'prefs-timeoffset' => 'Tidforskuving',
'prefs-advancedediting' => 'Avanserte val',
'prefs-advancedrc' => 'Avanserte val',
'prefs-advancedrendering' => 'Avanserte val',
'prefs-displaywatchlist' => 'Val for vising',
'prefs-diffs' => 'Skilnader',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-postadressa ser ut til å vera gyldig',
'email-address-validity-invalid' => 'Skriv inn ei gyldig e-postaddresse.',
Dei bør kan henda lenkja til ei meir passande side i staden.<br />
Ei side vert handsama som ei fleirtydingsside om ho nyttar ein mal som er lenkja til frå [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sider med ein sideeigenskap',
+'pageswithprop-legend' => 'Sider med ein sideeigenskap',
+'pageswithprop-text' => 'Denne sida listar opp sider som nyttar ein viss sideeigenskap.',
+'pageswithprop-prop' => 'Namn på eigenskap:',
+'pageswithprop-submit' => 'Gå',
+
'doubleredirects' => 'Doble omdirigeringar',
'doubleredirectstext' => 'Kvar line inneheld lenkjer til den første og den andre omdirigeringa, og den første lina frå den andre omdirigeringsteksten. Det gjev som regel den «rette» målartikkelen, som den første omdirigeringa skulle ha peikt på. <del>Overstrykne</del> liner har vorte retta på.',
'double-redirect-fixed-move' => '[[$1]] har blitt flytta, og er no ei omdirigering til [[$2]]',
'listgrouprights-addgroup-self-all' => 'Kan leggja til alle gruppene til sin eigen konto',
'listgrouprights-removegroup-self-all' => 'Kan ta vekk alle gruppene frå sin eigen konto',
-# E-mail user
+# Email user
'mailnologin' => 'Inga avsendaradresse',
'mailnologintext' => 'Du lyt vera [[Special:UserLogin|innlogga]] og ha ei gyldig e-postadresse sett i [[Special:Preferences|brukarinnstillingane]] for å sende e-post åt andre brukarar.',
'emailuser' => 'Send e-post åt denne brukaren',
'ipb-change-block' => 'Blokker brukaren på nytt med desse innstillingane',
'ipb-confirm' => 'Stadfest blokkering',
'badipaddress' => 'IP-adressa er ugyldig eller blokkering av brukarar er slått av på tenaren.',
-'blockipsuccesssub' => 'Blokkeringa er utførd',
+'blockipsuccesssub' => 'Blokkeringa er utført',
'blockipsuccesstext' => '«[[Special:Contributions/$1|$1]]» er blokkert.<br />
Sjå [[Special:BlockList|blokkeringslista]] for alle blokkeringane.',
'ipb-blockingself' => 'Du er i ferd med å blokkera deg sjølv. Er du viss på at du ynskjer gjera dette?',
'pageinfo-robot-noindex' => 'Kan ikkje indekserast',
'pageinfo-views' => 'Tal på visningar',
'pageinfo-watchers' => 'Tal på overvakarar av sida',
+'pageinfo-few-watchers' => 'Færre enn $1 {{PLURAL:$1|som overvakar}}',
'pageinfo-redirects-name' => 'Omdirigeringar til sida',
'pageinfo-subpages-name' => 'Undersider av sida',
'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|éi omdirigering|$2 omdirigeringar}}; {{PLURAL:$3|éi ikkje-omdirigering|$3 ikkje-omdirigeringar}})',
'monthsall' => 'alle',
'limitall' => 'alle',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Stadfest e-postadresse',
'confirmemail_noemail' => 'Du har ikkje gjeve ei gyldig e-postadresse i [[Special:Preferences|innstillingane dine]].',
'confirmemail_text' => '{{SITENAME}} krev at du stadfester e-postadressa di
'tog-extendwatchlist' => 'Espandir la lista de seguiment per afichar totas las modificacions e non pas solament las mai recentas',
'tog-usenewrc' => 'Agropar los cambiaments dins los darrièrs cambiaments e la lista de seguiment (necessita JavaScript)',
'tog-numberheadings' => 'Numerotar automaticament los títols',
-'tog-showtoolbar' => 'Far veire la barra de menut de modificacion (JavaScript)',
+'tog-showtoolbar' => 'Far veire la barra de menú de modificacion (JavaScript)',
'tog-editondblclick' => 'Modificar una pagina amb un clic doble (JavaScript)',
'tog-editsection' => 'Modificar una seccion via los ligams [modificar]',
'tog-editsectiononrightclick' => 'Modificar una seccion en fasent un clic drech sus son títol (JavaScript)',
'protectedpagetext' => "Aquesta pagina es estada protegida per empachar sa modificacion o d'autras accions.",
'viewsourcetext' => 'Podètz veire e copiar lo contengut de l’article per poder trabalhar dessús :',
'viewyourtext' => "Podètz veire e copiar lo contengut de '''vòstras modificacions''' a aquesta pagina :",
-'protectedinterface' => 'Aquesta pagina provesís de tèxte d’interfàcia pel logicial e es protegida per evitar los abuses.',
+'protectedinterface' => 'Aquesta pagina provesís de tèxte d’interfàcia pel logicial susaqueste wiki, e es protegida per evitar los abuses.
+Per apondre o modificar de traduccions sus totes los wikis, utilizatz [//translatewiki.net/ translatewiki.net], lo projècte de localizacion de MediaWiki.',
'editinginterface' => "'''Atencion :''' sètz a editar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial. Los cambiaments se repercutaràn, segon lo contèxte, sus totas o d'unas paginas visiblas pels autres utilizaires. Per las traduccions, vos convidam a utilizar lo projècte MediaWiki d'internacionalizacion dels messatges [//translatewiki.net/wiki/Main_Page?setlang=oc translatewiki.net].",
'sqlhidden' => '(Requèsta SQL amagada)',
'cascadeprotected' => "Aquesta pagina es actualament protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta|las paginas seguentas}}, {{PLURAL:$1|qu'es estada protegida|que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :
'gotaccount' => "Ja avètz un compte ? '''$1'''.",
'gotaccountlink' => 'Identificatz-vos',
'userlogin-resetlink' => 'Avètz doblidat vòstres detalhs de connexion ?',
-'createaccountmail' => 'per corrièr electronic',
+'createaccountmail' => 'Utilizar un senhal aleatòri temporari e lo mandar a l’adreça de corrièl especificada çaijós',
'createaccountreason' => 'Motiu :',
'badretype' => "Los senhals qu'avètz picats son pas identics.",
'userexists' => "Lo nom d'utilizaire qu'avètz picat ja es utilizat.
'loginlanguagelabel' => 'Lenga: $1',
'suspicious-userlogout' => 'Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en escondedor d’un proxy.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Error desconeguda dins la foncion mail() de PHP.',
# Change password dialog
'passwordreset-legend' => 'Reïnicializar lo senhal',
'passwordreset-username' => "Nom d'utilizaire :",
'passwordreset-domain' => 'Domeni:',
+'passwordreset-capture' => 'Veire lo corrièl resultant ?',
'passwordreset-email' => 'Adreça de corrièr electronic :',
'passwordreset-emailtitle' => "Detailhs d'un compte per {{SITENAME}}",
'passwordreset-emailelement' => 'Utilizaire: $1
'prefs-displaywatchlist' => "Opcions d'afichatge",
'prefs-diffs' => 'Diferéncias',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => "L'adreça electronica sembla bona",
'email-address-validity-invalid' => 'entrar una adreça electronica valida',
'lockmanager-fail-openlock' => 'Impossible de dobrir lo fichièr de varrolh per « $1 ».',
'lockmanager-fail-releaselock' => 'Impossible de daissar anar lo fichièr de varrolh per « $1 ».',
+# Special:UploadStash
+'uploadstash' => "Escondedor d'impòrt",
+
# img_auth script messages
'img-auth-accessdenied' => 'Accès refusat',
'img-auth-nopathinfo' => 'PATH_INFO mancant.
'statistics-users-active-desc' => "Utilizaires qu'an fach al mens una accion durant {{PLURAL:$1|lo darrièr jorn|los $1 darrièrs jorns}}",
'statistics-mostpopular' => 'Paginas mai consultadas',
-'disambiguations' => "Paginas d'omonimia",
+'disambiguations' => "Paginas qu'an de ligams cap a de paginas d'omonimia",
'disambiguationspage' => 'Template:Omonimia',
'disambiguations-text' => "Las paginas seguentas puntan cap a una '''pagina d’omonimia'''.
Deurián puslèu puntar cap a una pagina apropriada.<br />
'listgrouprights-addgroup-self-all' => 'Se pòt apondre totes los gropes a son compte pròpri',
'listgrouprights-removegroup-self-all' => 'Se pòt levar totes los gropes de son compte pròpri',
-# E-mail user
+# Email user
'mailnologin' => "Pas d'adreça",
'mailnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
e aver indicat una adreça electronica valida dins vòstras [[Special:Preferences|preferéncias]]
'usermessage-editor' => 'Messatgièr del sistèma',
# Watchlist
-'watchlist' => 'Ma lista de seguiment',
+'watchlist' => 'Lista de seguiment',
'mywatchlist' => 'Lista de seguiment',
'watchlistfor2' => 'Per $1 ($2)',
'nowatchlist' => "Vòstra lista de seguiment conten pas cap d'article.",
L’article de destinacion « [[:$1]] » existís ja.
Lo volètz suprimir per permetre lo cambiament de nom ?',
'delete_and_move_confirm' => 'Òc, accèpti de suprimir la pagina de destinacion per permetre lo cambiament de nom.',
-'delete_and_move_reason' => 'Pagina suprimida per permetre un cambiament de nom',
+'delete_and_move_reason' => 'Pagina suprimida per permetre lo cambiament de nom dempuèi « [[$1]] »',
'selfmove' => 'Los títols d’origina e de destinacion son los meteisses : impossible de tornar nomenar una pagina sus ela-meteissa.',
'immobile-source-namespace' => "Podètz pas tornar nomenar de paginas dins l'espaci de noms « $1 »",
'immobile-target-namespace' => "Podètz pas desplaçar de paginas cap a l'espaci de noms « $1 »",
Per exportar de paginas, entratz lors títols dins la bóstia de tèxte çaijós, un títol per linha, e seleccionatz s'o desiratz o pas la version actuala amb totas las versions ancianas, amb la pagina d’istoric, o simplament la pagina actuala amb d'informacions sus la darrièra modificacion.
Dins aqueste darrièr cas, podètz tanben utilizar un ligam, coma [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per la pagina [[{{MediaWiki:Mainpage}}]].",
+'exportall' => 'Exportar totas las paginas',
'exportcuronly' => 'Exportar unicament la version correnta sens l’istoric complet',
'exportnohistory' => "----
'''Nòta :''' l’exportacion completa de l’istoric de las paginas amb l’ajuda d'aqueste formulari es estada desactivada per de rasons de performàncias.",
'import-logentry-interwiki' => 'a importat (transwiki) $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|version|versions}} dempuèi $2',
+# JavaScriptTest
+'javascripttest' => 'Tèst de JavaScript',
+'javascripttest-title' => 'Execucion dels tèsts $1',
+
# Tooltip help for the actions
'tooltip-pt-userpage' => "Vòstra pagina d'utilizaire",
'tooltip-pt-anonuserpage' => "La pagina d'utilizare de l’IP amb la quala contribuissètz",
'tooltip-ca-viewsource' => 'Aquesta pagina es protegida. Çaquelà, ne podètz veire lo contengut.',
'tooltip-ca-history' => "Los autors e versions precedentas d'aquesta pagina.",
'tooltip-ca-protect' => 'Protegir aquesta pagina',
-'tooltip-ca-unprotect' => 'Desprotegir aquesta pagina',
+'tooltip-ca-unprotect' => "Cambiar la proteccion d'aquesta pagina",
'tooltip-ca-delete' => 'Suprimir aquesta pagina',
'tooltip-ca-undelete' => 'Restablir aquesta pagina',
'tooltip-ca-move' => 'Tornar nomenar aquesta pagina',
'tooltip-diff' => "Permet de visualizar los cambiaments qu'avètz efectuats",
'tooltip-compareselectedversions' => "Afichar las diferéncias entre doas versions d'aquesta pagina",
'tooltip-watch' => 'Apondre aquesta pagina a vòstra lista de seguiment',
+'tooltip-watchlistedit-normal-submit' => 'Levar los títols',
+'tooltip-watchlistedit-raw-submit' => 'Mesa a jorn de la lista de seguiment',
'tooltip-recreate' => 'Tornar crear la pagina, quitament se es estada escafada',
'tooltip-upload' => 'Amodar lo mandadís',
'tooltip-rollback' => '"Revocar" anulla en un clic la o las edicion(s) sus aquesta pagina del darrièr contributor.',
'pageinfo-magic-words' => '{{PLURAL:$1|Mot magic|Mots magics}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria amagada|Categorias amagadas}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Modèl inclús|Modèls incluses}} ($1)',
+'pageinfo-toolboxlink' => 'Informacion sus la pagina',
+'pageinfo-redirectsto' => 'Redirigir cap a',
'pageinfo-redirectsto-info' => 'info',
'pageinfo-contentpage-yes' => 'Òc',
'pageinfo-protect-cascading-yes' => 'Òc',
+'pageinfo-category-info' => 'Informacions sus la categoria',
+'pageinfo-category-pages' => 'Nombre de paginas',
+'pageinfo-category-subcats' => 'Nombre de soscategorias',
+'pageinfo-category-files' => 'Nombre de fichièrs',
# Skin names
'skinname-standard' => 'Estandard',
'hours' => '{{PLURAL:$1|$1 ora|$1 oras}}',
'days' => '{{PLURAL:$1|$1 jorn|$1 jorns}}',
'ago' => 'I a $1',
+'just-now' => 'sulpic',
# Bad image list
'bad_image_list' => "Lo format es lo seguent :
'monthsall' => 'totes',
'limitall' => 'totes',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => "Confirmar l'adreça de corrièr electronic",
'confirmemail_noemail' => 'L’adreça de corrièr electronic configurada dins vòstras [[Special:Preferences|preferéncias]] es pas valida.',
'confirmemail_text' => '{{SITENAME}} necessita la verificacion de vòstra adreça de corrièr electronic abans de poder utilizar tota foncion de messatjariá. Utilizatz lo boton çaijós per mandar un corrièr electronic de confirmacion a vòstra adreça. Lo corrièr contendrà un ligam contenent un còde, cargatz aqueste ligam dins vòstre navigador per validar vòstra adreça.',
'filepath' => "Camin d'accès d'un fichièr",
'filepath-page' => 'Fichièr :',
'filepath-submit' => 'Validar',
-'filepath-summary' => "Aquesta pagina especiala balha lo camin d'accès complet d’un fichièr ; los imatges son mostrats en nauta resolucion, los fichièrs audiò e vidèo s’executan amb lor programa associat.
-
-Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
+'filepath-summary' => "Aquesta pagina especiala retorna lo camin d'accès complet d’un fichièr.
+Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son cargats e aviats dirèctament amb lor programa associat.",
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Recèrca dels fichièrs en doble',
'fileduplicatesearch-info' => '$1 × $2 pixèls<br />Talha del fichièr : $3<br />MIME type : $4',
'fileduplicatesearch-result-1' => 'Lo fichièr « $1 » a pas de doble identic.',
'fileduplicatesearch-result-n' => 'Lo fichièr « $1 » a {{PLURAL:$2|1 doble identic|$2 dobles identics}}.',
+'fileduplicatesearch-noresults' => 'Cap de fichièr nomenat « $1 » es pas estat trobat.',
# Special:SpecialPages
'specialpages' => 'Paginas especialas',
'specialpages-note' => '----
-* Las paginas especialas
-* <strong class="mw-specialpagerestricted">en gras</strong> son restrenhudas.',
+* Paginas especialas normalas.
+* <span class="mw-specialpagerestricted">Paginas especialas restrenchas.</span>
+* <span class="mw-specialpagecached">Paginas especialas solament en escondedor (poirián èsser obsolètas).</span>',
'specialpages-group-maintenance' => 'Rapòrts de mantenença',
'specialpages-group-other' => 'Autras paginas especialas',
'specialpages-group-login' => "S'identificar / s'inscriure",
'specialpages-group-highuse' => 'Utilizacion intensa de las paginas',
'specialpages-group-pages' => 'Listas de paginas',
'specialpages-group-pagetools' => 'Aisinas per las paginas',
-'specialpages-group-wiki' => 'Donadas del wiki e aisinas',
+'specialpages-group-wiki' => 'Donadas e aisinas',
'specialpages-group-redirects' => 'Redireccions',
'specialpages-group-spam' => 'Aisinas antispam',
'htmlform-selectorother-other' => 'Autre',
# New logging system
+'logentry-delete-delete' => '$1 a suprimit la pagina $3',
+'logentry-delete-restore' => '$1 a restablit la pagina $3',
'revdelete-content-hid' => 'contengut amagat',
'revdelete-summary-hid' => 'resumit de modificacion amagat',
'revdelete-uname-hid' => 'nom d’utilizaire amagat',
'tog-extendwatchlist' => 'କେବଳ ନଗଦ ନୁହେଁ, ସବୁଯାକ ବଦଳକୁ ଦେଖାଇବା ନିମନ୍ତେ ଦେଖଣାତାଲିକାକୁ ବଢ଼ାଇବେ',
'tog-usenewrc' => 'ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
'tog-numberheadings' => 'ଆପେଆପେ-ସଂଖ୍ୟାର ନାମଗୁଡ଼ିକ',
-'tog-showtoolbar' => 'ସମà\8dପାଦନା à¬\9fà\81ଲବାର ଦà\87à¬\96ାà¬\87ବà\87 (à¬\9cାà¬à¬¾à¬¸à\8dà¬\95à\8dରିପà\8dà¬\9f ସà¬\9aଳ à¬\95ରିବà\87)',
+'tog-showtoolbar' => 'ସମà\8dପାଦନା à¬\9fà\81ଲବାର ଦà\87à¬\96ାà¬\87ବà\87 (à¬\9cାà¬à¬¾à¬¸à\8dà¬\95à\8dରିପà\8dà¬\9f ଲà\8bଡ଼ା)',
'tog-editondblclick' => 'ଦୁଇଥର କ୍ଲିକରେ ପୃଷ୍ଠା ବଦଳାଇବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
'tog-editsection' => '[ବଦଳାଇବେ] ଲିଙ୍କରେ ବିଭାଗର ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ',
'tog-editsectiononrightclick' => 'ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
'fri' => 'ଶୁକ୍ର',
'sat' => 'ଶନି',
'january' => 'ଜାନୁଆରୀ',
-'february' => 'ଫà\87ବà\8dରà\81ଆରୀ',
+'february' => 'ଫà\87ବà\83ଆରୀ',
'march' => 'ମାର୍ଚ୍ଚ',
'april' => 'ଅପ୍ରେଲ',
'may_long' => 'ମଇ',
'november' => 'ନଭେମ୍ବର',
'december' => 'ଡିସେମ୍ବର',
'january-gen' => 'ଜାନୁଆରୀ',
-'february-gen' => 'ଫà\87ବà\8dରà\81ଆରୀ',
+'february-gen' => 'ଫà\87ବà\83ଆରୀ',
'march-gen' => 'ମାର୍ଚ୍ଚ',
'april-gen' => 'ଅପ୍ରେଲ',
'may-gen' => 'ମଇ',
'november-gen' => 'ନଭେମ୍ବର',
'december-gen' => 'ଡିସେମ୍ବର',
'jan' => 'ଜାନୁଆରୀ',
-'feb' => 'ଫà\87ବà\8dରà\81ଆରୀ',
+'feb' => 'ଫà\87ବà\83ଆରୀ',
'mar' => 'ମାର୍ଚ୍ଚ',
'apr' => 'ଅପ୍ରେଲ',
'may' => 'ମଇ',
'namespaces' => 'ନେମସ୍ପେସ',
'variants' => 'ନିଆରା',
-'navigation-heading' => 'ଦିà¬\97ବାରà\87ଣà\80 ମିନୁ',
+'navigation-heading' => 'ଦିà¬\97ବାରà\87ଣି ମà\87ନୁ',
'errorpagetitle' => 'ଭୁଲ',
'returnto' => '$1କୁ ଫେରିଯାନ୍ତୁ ।',
'tagline' => '{{SITENAME}} ରୁ',
'imagepage' => 'ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ',
'mediawikipage' => 'ମେସେଜ ପୃଷ୍ଠାଟି ଦେଖାଇବେ',
'templatepage' => 'ଛାଞ୍ଚ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ',
-'viewhelppage' => 'ସହାଯà\8bà¬\97 ପà\83ଷà\8dଠାà¬\97à\81ଡ଼ିà¬\95 ଦà\87à¬\96ନà\8dତà\81',
+'viewhelppage' => 'ସହଯୋଗ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ',
'categorypage' => 'ଶ୍ରେଣୀ ପୃଷ୍ଠାଟିକୁ ଦେଖାଇବେ',
'viewtalkpage' => 'ଆଲୋଚନାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ',
'otherlanguages' => 'ଅଲଗା ଭାଷା',
'mainpage' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
'mainpage-description' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
'policy-url' => 'Project:ନୀତି',
-'portal' => 'ସà¬\99à\8dଘ ସୂଚନା ଫଳକ',
-'portal-url' => 'Project:ସà¬\99à\8dଘ ସୂଚନା ଫଳକ',
+'portal' => 'ସà¬\82ଘ ସୂଚନା ଫଳକ',
+'portal-url' => 'Project:ସà¬\82ଘ ସୂଚନା ଫଳକ',
'privacy' => 'ଗୁମର ନୀତି',
'privacypage' => 'Project:ଗୁମର ନୀତି',
'badaccess' => 'ଅନୁମତି ମିଳିବାରେ ଅସୁବିଧା',
-'badaccess-group0' => 'à¬\86ପଣ à¬\85ନà\81ରà\8bଷ କରିଥିବା ପୃଷ୍ଠାଟିରେ କିଛି କାମ କରିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଅନୁମତି ମିଳିନାହିଁ',
+'badaccess-group0' => 'à¬\86ପଣ à¬\85ନà\81ରà\8bଧ କରିଥିବା ପୃଷ୍ଠାଟିରେ କିଛି କାମ କରିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଅନୁମତି ମିଳିନାହିଁ',
'badaccess-groups' => 'ଆପଣ ଅନୁରୋଧ କରିଥିବା କାମଟି କେବଳ {{PLURAL:$2|ଗୋଠ|ଗୋଠମାନଙ୍କ ଭିତରୁ ଗୋଟିଏ ଗୋଠ}}: $1 ର ସଭ୍ୟମାନଙ୍କ ଭିତରେ ସୀମିତ ।',
'versionrequired' => 'ମିଡ଼ିଆଉଇକି ର $1 ତମ ସଙ୍କଳନଟି ଲୋଡ଼ା',
'feedlinks' => 'ଫିଡ଼:',
'feed-invalid' => 'ଅଚଳ ସବସ୍କ୍ରିପସନ ଫିଡ଼ ପ୍ରକାର ।',
'feed-unavailable' => 'ସିଣ୍ଡିକେସନ ଫିଡ଼ସବୁ ମିଳୁନାହିଁ',
-'site-rss-feed' => '$1 à¬\86ରà\87ସà\87ସ ଫିଡ଼',
+'site-rss-feed' => '$1 à¬\86ରà¬\8fସà¬\8fସ ଫିଡ଼',
'site-atom-feed' => '$1 ଆଟମ ଫିଡ଼',
'page-rss-feed' => '$1 ଟି ଆରେସେସ ଫିଡ଼',
'page-atom-feed' => '$1 ଟି ଆଟମ ଫିଡ଼',
# General errors
'error' => 'ଭୁଲ',
'databaseerror' => 'ଡାଟାବେସରେ ଭୁଲ',
-'dberrortext' => 'à¬\8fହା à¬\8fହି ସଫà\8dà¬\9fବେରରେ ଭୁଲଟିଏକୁ ମଧ୍ୟ ସୂଚାଇପାରେ ।
+'dberrortext' => 'à¬\8fହା à¬\8fହି ସଫà\8dà¬\9fà±େରରେ ଭୁଲଟିଏକୁ ମଧ୍ୟ ସୂଚାଇପାରେ ।
ଶେଷଥର ଖୋଜାଯାଇଥିବା ଡାଟାବେସ ପ୍ରଶ୍ନଟି ଥିଲା:
<blockquote><code>$1</code></blockquote>
ଯାହାକି "<code>$2</code>"ରୁ ଥିଲା
'protectedpagetext' => 'ଏହି ପୃଷ୍ଠାଟି ସମ୍ପାଦନା କିମ୍ବା ଅନ୍ୟକୌଣସି କାର୍ଯ୍ୟ କରିବାରୁ କିଳାଯାଇଛି ।',
'viewsourcetext' => 'ଆପଣ ଏହି ପୃଷ୍ଠାର ଲେଖା ଦେଖିପାରିବେ ଓ ନକଲ କରିପାରିବେ:',
'viewyourtext' => "ଆପଣ '''ଆପଣଙ୍କ ସମ୍ପାଦିତ ''' ଅଧରଟିକୁ ଦେଖିପାରିବେ ଓ ଏହି ପୃଷ୍ଠାକୁ ନକଲ କରି ପାରିବେ",
-'protectedinterface' => 'à¬\8fହି ପà\83ଷà\8dଠାà¬\9fି à¬\8fହି à¬\89à¬\87à¬\95ିରà\87 ଥିବା ସଫà\8dà¬\9fà±à\87ର ନିମନà\8dତà\87 à¬\87ଣà\8dà¬\9fରଫà\87ସ ଲà\87à¬\96ା ଯà\8bà¬\97ାà¬\87ଥାà¬\8f à¬\93 à¬\8fହା à¬\85ବà\8dପà\9fବହାରà¬\95à\81 ରà\8bà¬\95ିବା ନିମନà\8dତà\87 à¬\95ିଳାଯାà¬\87à¬\85à¬\9bି । ସମସà\8dତ à¬\89à¬\87à¬\95ିର à¬\85ନà\81ବାଦà¬\95à\81 ଯà\8bଡିବା à¬\8fବà¬\82 ବଦଳାà¬\87ବା ପାà¬\87à¬\81 ମà\87ଡିଆଉଇକିର ସ୍ଥାନୀୟ ପ୍ରକଳ୍ପରେ ଥିବା [//translatewiki.net/ translatewiki.net]କୁ ବ୍ୟବହାର କରନ୍ତୁ ।',
-'editinginterface' => "'''à¬\9aà\87ତାବନà\80:''' à¬\86ପଣ ସଫà\8dà¬\9fବେରର ଇଣ୍ଟରଫେସ ଲେଖା ଯୋଗାଇବା ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଉଥିବା ଏକ ପୃଷ୍ଠାର ସମ୍ପାଦନା କରୁଅଛନ୍ତି ।
+'protectedinterface' => 'à¬\8fହି ପà\83ଷà\8dଠାà¬\9fି à¬\8fହି à¬\89à¬\87à¬\95ିରà\87 ଥିବା ସଫà\8dà¬\9fà±à\87ର ନିମନà\8dତà\87 à¬\87ଣà\8dà¬\9fରଫà\87ସ ଲà\87à¬\96ା ଯà\8bà¬\97ାà¬\87ଥାà¬\8f à¬\93 à¬\8fହା à¬\85ପବà\8dà\9fବହାରà¬\95à\81 ରà\8bà¬\95ିବା ନିମନà\8dତà\87 à¬\95ିଳାଯାà¬\87à¬\85à¬\9bି । ସମସà\8dତ à¬\89à¬\87à¬\95ିର à¬\85ନà\81ବାଦà¬\95à\81 ଯà\8bଡ଼ିବା à¬\8fବà¬\82 ବଦଳାà¬\87ବା ପାà¬\87à¬\81 ମà\87ଡ଼ିଆଉଇକିର ସ୍ଥାନୀୟ ପ୍ରକଳ୍ପରେ ଥିବା [//translatewiki.net/ translatewiki.net]କୁ ବ୍ୟବହାର କରନ୍ତୁ ।',
+'editinginterface' => "'''à¬\9aà\87ତାବନà\80:''' à¬\86ପଣ ସଫà\8dà¬\9fà±େରର ଇଣ୍ଟରଫେସ ଲେଖା ଯୋଗାଇବା ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଉଥିବା ଏକ ପୃଷ୍ଠାର ସମ୍ପାଦନା କରୁଅଛନ୍ତି ।
ଏହି ଉଇକିପୃଷ୍ଠାର କିଛି ବି ବଦଳ ବାକି ସଭ୍ୟମାନଙ୍କ ଇଣ୍ଟରଫେସର ଦେଖଣାକୁ ପ୍ରଭାବିତ କରିବ ।
ସମସ୍ତ ଉଇକିର ଅନୁବାଦ ନିମନ୍ତେ, ଦୟାକରି ମିଡ଼ିଆଉଇକିର ସ୍ଥାନୀୟକରଣ ପ୍ରକଳ୍ପ [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] ବ୍ୟବହାର କରନ୍ତୁ ।",
'sqlhidden' => '(SQL ପ୍ରଶ୍ନ ଲୁଚାଯାଇଅଛି)',
'filereadonlyerror' => 'ଫାଇଲ ଧାରକ "$2"ଟି ଖାଲି ପଢିବା ହେବାଭଳି ରହିଥିବା ହେତୁ ଏଥିରେ ଥିବା $1 ପାଇଲଟିକୁ ବଦଳା ଯାଇପାରିବ ନାହିଁ ।
ଯେଉଁ ପରିଚ୍ଛା ଏହାକୁ ବନ୍ଦ କରିଛନ୍ତି ସେ ଏହି ବିବରଣୀ ଦେଇଛନ୍ତି: "$3"',
-'invalidtitle-knownnamespace' => '"$2" ନà\87ମà\8dସà\8dପà\87ସ à¬\8fବà¬\82 "$3" ଲà\87à¬\96ାଥିବା à¬\85ବà\88ଧ ଶà\80ରà\8dଷà¬\95 ।',
+'invalidtitle-knownnamespace' => '"$2" ନେମସ୍ପେସ ଏବଂ "$3" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।',
'invalidtitle-unknownnamespace' => '"$1" ନେମ୍ସ୍ପେସ ଏବଂ "$2" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।',
'exception-nologin' => 'ଲଗ ଇନ କରିନାହାନ୍ତି',
'exception-nologin-text' => 'ଏହା କରିବାକୁ ହେଲେ ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଲଗଇନ କରିବାକୁ ପଡିବ ।',
ଆପଣ ବନାନ ପରଖି ନିଅନ୍ତୁ ।',
'nouserspecified' => 'ଆପଣଙ୍କୁ ଇଉଜର ନାମଟିଏ ଦେବାକୁ ପଡ଼ିବ ।',
'login-userblocked' => 'ଏହି ସଭ୍ୟଙ୍କୁ ଅଟକାଯାଇଛି । ଲଗ ଇନ କରିବାକୁ ଅନୁମତି ନାହିଁ ।',
-'wrongpassword' => 'ଦିà¬\86ଯାà¬\87ଥିବା ପାସବାର୍ଡ଼ଟି ଭୁଲ ଅଟେ ।
+'wrongpassword' => 'ଦିà¬\86ଯାà¬\87ଥିବା ପାସà±ାର୍ଡ଼ଟି ଭୁଲ ଅଟେ ।
ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।',
'wrongpasswordempty' => 'ଦିଆଯାଇଥିବା ପାସବାର୍ଡ଼ଟି ଖାଲି ଛଡ଼ାଯାଇଛି ।
ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।',
-'passwordtooshort' => 'ପାସବାର୍ଡ଼ଟି ଅତି କମରେ {{PLURAL:$1|ଗୋଟିଏ ଅକ୍ଷର|$1ଟି ଅକ୍ଷର}}ର ହୋଇଥିବା ଲୋଡ଼ା ।',
-'password-name-match' => 'à¬\86ପଣà¬\99à\8dà¬\95 ପାସବାର୍ଡ଼ଟି ଆପଣଙ୍କ ଇଉଜର ନାମ ଠାରୁ ଅଲଗା ହେବା ଉଚିତ ।',
-'password-login-forbidden' => 'à¬\8fହି à¬\87à¬\89à¬\9cର ନାମ à¬\93 ପାସବାର୍ଡ଼ର ବ୍ୟବହାରକୁ ବାରଣ କରାଯାଇଅଛି ।',
-'mailmypassword' => 'ପାସବାର୍ଡ଼ଟିକୁ ଇମେଲ କରି ପଠାଇବେ',
+'passwordtooshort' => 'ପାସà±ାର୍ଡ଼ଟି ଅତି କମରେ {{PLURAL:$1|ଗୋଟିଏ ଅକ୍ଷର|$1ଟି ଅକ୍ଷର}}ର ହୋଇଥିବା ଲୋଡ଼ା ।',
+'password-name-match' => 'à¬\86ପଣà¬\99à\8dà¬\95 ପାସà±ାର୍ଡ଼ଟି ଆପଣଙ୍କ ଇଉଜର ନାମ ଠାରୁ ଅଲଗା ହେବା ଉଚିତ ।',
+'password-login-forbidden' => 'à¬\8fହି à¬\87à¬\89à¬\9cର ନାମ à¬\93 ପାସà±ାର୍ଡ଼ର ବ୍ୟବହାରକୁ ବାରଣ କରାଯାଇଅଛି ।',
+'mailmypassword' => 'ପାସà±ାର୍ଡ଼ଟିକୁ ଇମେଲ କରି ପଠାଇବେ',
'passwordremindertitle' => '{{SITENAME}} ପାଇଁ ନୂଆ ଅଳ୍ପ କାଳର ପାସୱାର୍ଡ଼',
'passwordremindertext' => 'କେହିଜଣେ (ବୋଧେ ଆପଣ, $1 IP ଠିକଣାରୁ)
ନୂଆ ପାସବାର୍ଡ଼ଟିଏ ପାଇଁ {{SITENAME}} ($4) ରେ ଆବେଦନ କରିଅଛନ୍ତି । "$2"ଙ୍କ ପାଇଁ ଏକ ଅସ୍ଥାୟୀ ପାସବାର୍ଡ଼
continue using your old password.',
'noemail' => 'ସଭ୍ୟ "$1"ଙ୍କ ପାଇଁ କିଛି ବି ଇ-ମେଲ ଆଇ.ଡି. ସାଇତାଯାଇନାହିଁ ।',
'noemailcreate' => 'ଆପଣଙ୍କୁ ଏକ ସଚଳ ଇ-ମେଲ ଠିକଣା ଦେବାକୁ ପଡ଼ିବ',
-'passwordsent' => '"$1" ପାà¬\87à¬\81 ଥà\9f à¬\95ରାଯାà¬\87ଥିବା à¬\87-ମà\87ଲà¬\95à\81 ନà\82à¬\86 ପାସବାର୍ଡ଼ଟିଏ ପଠାଇଦିଆଗଲା ।
+'passwordsent' => '"$1" ପାà¬\87à¬\81 ଥà\9f à¬\95ରାଯାà¬\87ଥିବା à¬\87-ମà\87ଲà¬\95à\81 ନà\82à¬\86 ପାସà±ାର୍ଡ଼ଟିଏ ପଠାଇଦିଆଗଲା ।
ତାହା ମିଳିଲା ପରେ ଆଉଥରେ ଲଗ ଇନ କରନ୍ତୁ ।',
-'blocked-mailpassword' => 'à¬\86ପଣà¬\99à\8dà¬\95 IP ଠିà¬\95ଣାà¬\9fି ସମà\8dପାଦନାରà\87 à¬à¬¾à¬\97 ନà\87ବାରà\81 à¬\85à¬\9fà¬\95ାଯାà¬\87à¬\9bି, ତà\87ଣà\81 ପାସବାର୍ଡ଼ ଫେରନ୍ତା କାମ ବ୍ୟବହାର କରି ଅବ୍ୟବହାରକୁ ରୋକିବା ଅନୁମୋଦିତ ନୁହେଁ ।',
+'blocked-mailpassword' => 'à¬\86ପଣà¬\99à\8dà¬\95 IP ଠିà¬\95ଣାà¬\9fି ସମà\8dପାଦନାରà\87 à¬à¬¾à¬\97 ନà\87ବାରà\81 à¬\85à¬\9fà¬\95ାଯାà¬\87à¬\9bି, ତà\87ଣà\81 ପାସà±ାର୍ଡ଼ ଫେରନ୍ତା କାମ ବ୍ୟବହାର କରି ଅବ୍ୟବହାରକୁ ରୋକିବା ଅନୁମୋଦିତ ନୁହେଁ ।',
'eauthentsent' => 'ଆପଣଙ୍କ ବଛା ଇ-ମେଲ ଠିକଣାକୁ ଏକ ଥୟ କରିବା ଇ-ମେଲଟିଏ ପଠାଇଦିଆଗଲା ।
ଖାତାଟି ଆପଣଙ୍କର ବୋଲି ଥୟ କରିବା ନିମନ୍ତେ ଆଉ କେଉଁ ଇ-ମେଲ ଆପଣଙ୍କ ଖାତାକୁ ପଠାହେବା ଆଗରୁ ଆପଣଙ୍କୁ ସେହି ଇ-ମେଲରେ ଥିବା ସୂଚନା ଅନୁସରଣ କରିବାକୁ ପଡ଼ିବ ।',
-'throttled-mailpassword' => 'à¬\97ତ {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà\8dà¬\9fାରà\87|$1 à¬\98ଣà\8dà¬\9fାରà\87}} à¬\86ପଣà¬\99à\8dà¬\95à\81 à¬\8fà¬\95 ପାସବାର୍ଡ଼ ମନେକରିବା ସୂଚନାଟିଏ ପଠାଯାଇଛି ।
-à¬\85ବà\8dà\9fବହାରà¬\95à\81 ରà\8bà¬\95ିବା ନିମନà\8dତà\87, {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà\8dà¬\9fାରà\87|$1 à¬\98ଣà\8dà¬\9fାରà\87}} à¬\95à\87ବଳ à¬\97à\8bà¬\9fିà¬\8f ପାସବାର୍ଡ଼ ହିଁ ପଠାହେବ ।',
+'throttled-mailpassword' => 'à¬\97ତ {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà\8dà¬\9fାରà\87|$1 à¬\98ଣà\8dà¬\9fାରà\87}} à¬\86ପଣà¬\99à\8dà¬\95à\81 à¬\8fà¬\95 ପାସà±ାର୍ଡ଼ ମନେକରିବା ସୂଚନାଟିଏ ପଠାଯାଇଛି ।
+à¬\85ବà\8dà\9fବହାରà¬\95à\81 ରà\8bà¬\95ିବା ନିମନà\8dତà\87, {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà\8dà¬\9fାରà\87|$1 à¬\98ଣà\8dà¬\9fାରà\87}} à¬\95à\87ବଳ à¬\97à\8bà¬\9fିà¬\8f ପାସà±ାର୍ଡ଼ ହିଁ ପଠାହେବ ।',
'mailerror' => 'ମେଲ ପଠାଇବାରେ ଭୁଲ : $1',
'acct_creation_throttle_hit' => 'ଏହି ଉଇକିର ଦେଖଣାହାରୀ ମାନେ ଆପଣଙ୍କ IP ଠିକଣା ବ୍ୟବହାର କରି ବିଗତ ଦିନରେ {{PLURAL:$1|ଖାତାଟିଏ|$1 ଗୋଟି ଖାତା}} ତିଆରି କରିଛନ୍ତି ଯାହା ସେହି ସମୟସୀମା ଭିତରେ ସବୁଠାରୁ ଅଧିକ ଥିଲା ।
ତେଣୁ, ଏହି IP ଠିକଣାର ଦେଖଣାହାରୀ ଗଣ ଏବେ ଆଉ ଅଧିକ ଖାତା ଖୋଲିପାରିବେ ନାହିଁ ।',
'emailauthenticated' => '$2 ତାରିଖ $3 ଘଟିକା ବେଳେ ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣାଟି ଅନୁମୋଦିତ ହେଲା ।',
-'emailnotauthenticated' => 'à¬\86ପନà¬\99à\8dà¬\95 à¬\87-ମà\87ଲ ଠିà¬\95ଣାà¬\9fି à¬\85ନà\81ମà\8bଦିତà\8d ହୋଇନାହିଁ ।
+'emailnotauthenticated' => 'à¬\86ପଣà¬\99à\8dà¬\95 à¬\87-ମà\87ଲ ଠିà¬\95ଣାà¬\9fି à¬\85ନà\81ମà\8bଦିତ ହୋଇନାହିଁ ।
ଏହି ସବୁ ସୁବିଧାକୁ ନେଇ କିଛି ବି ଇ-ମେଲ ଆପଣଙ୍କୁ ପଠାଯିବ ନାହିଁ ।',
'noemailprefs' => 'ଆପଣଙ୍କ ପସନ୍ଦ ଭିତରେ ଏକ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ ଯାହା ଏହି ସବୁ ସୁବିଧାକୁ ସଚଳ କରାଇବ ।',
'emailconfirmlink' => 'ଆପଣଙ୍କ ଇମେଲ ଆଇ.ଡି.ଟି ଠିକ ବୋଲି ଥୟ କରନ୍ତୁ',
'accountcreated' => 'ଖାତାଟି ଖୋଲାହୋଇଗଲା',
'accountcreatedtext' => '$1 ପାଇଁ ନୂଆ ଖାତାଟିଏ ତିଆରି ହୋଇଗଲା ।',
'createaccount-title' => '{{SITENAME}} ପାଇଁ ଖାତା ଖୋଲା',
-'createaccount-text' => 'à¬\95à\87ହି à¬\9cଣà\87 à¬\86ପଣà¬\99à\8dà¬\95 à¬\87-ମà\87ଲ ଠିà¬\95ଣାରà\87 {{SITENAME}} ($4) ରà\87 "$2" ନାମରà\87, "$3" ପାସବାର୍ଡ଼ରେ ଖାତାଟିଏ ତିଆରି କରିଅଛି ।
+'createaccount-text' => 'à¬\95à\87ହି à¬\9cଣà\87 à¬\86ପଣà¬\99à\8dà¬\95 à¬\87-ମà\87ଲ ଠିà¬\95ଣାରà\87 {{SITENAME}} ($4) ରà\87 "$2" ନାମରà\87, "$3" ପାସà±ାର୍ଡ଼ରେ ଖାତାଟିଏ ତିଆରି କରିଅଛି ।
ଆପଣ ଏବେ ଲଗ ଇନ କରି ନିଜର ପାସବାର୍ଡ଼ଟିକୁ ବଦଳାଇଦିଅନ୍ତୁ ।
-ଯଦି ଭୁଲରେ ଏହି ଖାତାଟି ତିଆରି କରାଯାଇଥାଏ ତେବେ ଏହି ସୂଚନାଟିକୁ ଅଣଦେଖା କରିବେ ।',
+ଯଦି ଭୁଲରେ ଏହି ଖାତାଟି ତିଆରି କରାଯାଇଥାଏ, ତେବେ ଏହି ସୂଚନାଟିକୁ ଅଣଦେଖା କରିବେ ।',
'usernamehasherror' => 'ଇଉଜର ନାମରେ ହାସ ଅକ୍ଷର (hash characters) ରହି ପାରିବନାହିଁ',
'login-throttled' => 'ଆପଣ ବହୁ ଥର ଲଗ ଇନ କରିବାର ଉଦ୍ୟମ କରିଅଛନ୍ତି ।
-ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରିବା ଆଗରୁ କିଛି କାଳ ଅପେକ୍ଷ କରନ୍ତୁ ।',
+ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରିବା ଆଗରୁ କିଛି କାଳ ଅପେକ୍ଷା କରନ୍ତୁ ।',
'login-abort-generic' => 'ଆପଣଙ୍କ ଲଗ ଇନ ଅସଫଳ ହେଲା - ନାକଚ କରିଦିଆଗଲା',
'loginlanguagelabel' => 'ଭାଷା: $1',
'suspicious-userlogout' => 'ଲଗ ଆଉଟ କରିବା ନିମନ୍ତେ ଆପଣ କରିଥିବା ଆବେଦନ ନାକଚ କରିଦିଆଗଲା କାରଣ ଲାଗୁଅଛି ଯେ ଏହା ଏକ ଅସ୍ଥିର ବ୍ରାଉଜରରୁ ପଠାଯାଇଅଛି ଅବା ପ୍ରକ୍ସି ଧରାଯାଇଅଛି ।',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'PHP ର ମେଲ() କାମରେ ଅଜଣା ଅସୁବିଧା ।',
'user-mail-no-addy' => 'ଏକ ଇ-ମେଲ ଠିକଣା ବିନା ଇ-ମେଲ ପଠାଇବାକୁ ଚେଷ୍ଟା କଲୁଁ ।',
'user-mail-no-body' => 'ଏକ ଖାଲି କିମ୍ବା ଅଦରକାରୀ ଛୋଟ ଲେଖା ଥିବା ମେଲ ପଠେଇବାକୁ ଚେଷ୍ଟା କରିଥିଲେ',
'resetpass' => 'ପାସୱାର୍ଡ଼ ବଦଳାନ୍ତୁ',
'resetpass_announce' => 'ଆପଣ ଏକ ଅସ୍ଥାୟୀ ଇ-ମେଲରେ ଯାଇଥିବା କୋଡ଼ ସହାୟତାରେ ଲଗ ଇନ କରିଅଛନ୍ତି ।
ଲଗ ଇନ ଶେଷ କରିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଏହିଠାରେ ନୂଆ ପାସବାର୍ଡ଼ଟିଏ ଦେବାକୁ ପଡ଼ିବ:',
-'resetpass_header' => 'à¬\96ାତାର ପାସବାର୍ଡ଼ଟିକୁ ବଦଳାଇ ଦିଅନ୍ତୁ',
+'resetpass_header' => 'à¬\96ାତାର ପାସà±ାର୍ଡ଼ଟିକୁ ବଦଳାଇ ଦିଅନ୍ତୁ',
'oldpassword' => 'ପୁରୁଣା ପାସୱାର୍ଡ଼:',
'newpassword' => 'ନୂଆ ପାସୱାର୍ଡ଼:',
'retypenew' => 'ପାସୱାର୍ଡ଼ ଆଉଥରେ ଦିଅନ୍ତୁ:',
-'resetpass_submit' => 'ପାସବାରà\8dଡ଼à¬\9fି ଦେଇ ଲଗ ଇନ କରନ୍ତୁ',
-'resetpass_success' => 'à¬\86ପଣà¬\99à\8dà¬\95 ପାସବାର୍ଡ଼ଟି ବଦଳାଇ ଦିଆଗଲା !
+'resetpass_submit' => 'ପାସà±à¬¾à¬°à\8dଡ଼à¬\9fିà¬\8f ଦେଇ ଲଗ ଇନ କରନ୍ତୁ',
+'resetpass_success' => 'à¬\86ପଣà¬\99à\8dà¬\95 ପାସà±ାର୍ଡ଼ଟି ବଦଳାଇ ଦିଆଗଲା !
ଏବେ ଲଗ ଇନ କରୁଅଛୁଁ...',
-'resetpass_forbidden' => 'ପାସବାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ',
+'resetpass_forbidden' => 'ପାସà±ାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ',
'resetpass-no-info' => 'ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।',
'resetpass-submit-loggedin' => 'ପାସୱାର୍ଡ଼ ବଦଳାନ୍ତୁ',
'resetpass-submit-cancel' => 'ନାକଚ',
-'resetpass-wrong-oldpass' => 'à¬\85ସà\8dଥାà\9fà\80 ବା à¬\8fବà\87à¬\95ାର ପାସବାର୍ଡ଼ଟି ଭୁଲ ଅଟେ ।
-à¬\86ପଣ ବà\8bଧ ହà\81à¬\8f à¬\86à¬\97ରà\81 ସଫଳ à¬à¬¾à¬¬à¬°à\87 ନିà¬\9cର ପାସବାରà\8dଡ଼à¬\9fି ବଦଳାà¬\87ଦà\87à¬\87à¬\9bନà\8dତି ବା ନà\82à¬\86 à¬\85ସà\8dଥାà\9fà\80 ପାସବାର୍ଡ଼ଟିଏ ପାଇଁ ଆବେଦନ କରିଅଛନ୍ତି ।',
+'resetpass-wrong-oldpass' => 'à¬\85ସà\8dଥାà\9fà\80 ବା à¬\8fବà\87à¬\95ାର ପାସà±ାର୍ଡ଼ଟି ଭୁଲ ଅଟେ ।
+à¬\86ପଣ ବà\8bଧ ହà\81à¬\8f à¬\86à¬\97ରà\81 ସଫଳ à¬à¬¾à¬¬à¬°à\87 ନିà¬\9cର ପାସà±à¬¾à¬°à\8dଡ଼à¬\9fି ବଦଳାà¬\87ଦà\87à¬\87à¬\9bନà\8dତି ବା ନà\82à¬\86 à¬\85ସà\8dଥାà\9fà\80 ପାସà±ାର୍ଡ଼ଟିଏ ପାଇଁ ଆବେଦନ କରିଅଛନ୍ତି ।',
'resetpass-temp-password' => 'ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼:',
# Special:PasswordReset
'passwordreset' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
'passwordreset-text' => 'ନିଜ ଖାତାର ସବିଶେଷ ବିବରଣୀ ଏକ ଇ-ମେଲରେ ପାଇବା ପାଇଁ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ ।',
'passwordreset-legend' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
-'passwordreset-disabled' => 'ପାସବାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
+'passwordreset-disabled' => 'ପାସà±ାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥ୍ୟସମୂହରୁ କୌଣସି ଗୋଟିଏ ଦିଅନ୍ତୁ}}',
'passwordreset-username' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
'passwordreset-domain' => 'ଡୋମେନ:',
$2
-{{PLURAL:$3|à¬\8fହି à¬\85ସà\8dଥାà\9fà\80 ପାସବାରà\8dଡ଼à¬\9fି|à¬\8fହି à¬\85ସà\8dଥାà\9fà\80 ପାସବାର୍ଡ଼ସବୁ}} {{PLURAL:$5|ଦିନକରେ|$5 ଦିନରେ ଅଚଳ}} ହୋଇଯିବ ।
-à¬\86ପଣ à¬\8fବà\87 ଲà¬\97 à¬\87ନ à¬\95ରି ନà\82à¬\86 ପାସବାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯହି ଆଉ କେହି ଜଣେ ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି
-à¬\95ିମà\8dବା à¬\86ପଣ à¬\8fବà\87 ନିà¬\9cର ମà\82ଳ ପାସବାରà\8dଡ଼ ମନà\87 ପà¬\95ାà¬\87 ପାରିଥାନà\8dତି ତà\87ବà\87 à¬\8fହି ପାସବାର୍ଡ଼ଟିକୁ ଆଉ ବଦଳାଇବା ଲୋଡ଼ା ନାହିଁ ।
-à¬\86ପଣ ନିà¬\9c ପà\81ରà\81ଣା ପାସବାର୍ଡ଼ଟି ଆଗପରି ବ୍ୟବହାର କରିପାରନ୍ତି ।',
-'passwordreset-emailtext-user' => '{{SITENAME}}ରà\87 ଥିବା ବà\8dà\9fà\9fବହାରà¬\95ାରà\80 $1 {{SITENAME}} ($4) ସାà¬\87à¬\9fରà\87 ଥିବା à¬\86ପଣà¬\99à\8dà¬\95 à¬\96ାତାର ସବିଶà\87ଷ à¬\9cାଣିବାà¬\95à\81 à¬\85ନà\81ରà\8bଧ à¬\95ରିà¬\9bନà\8dତି । à¬\8fହି à¬\87ମà\87ଲ ଠିà¬\95ଣା ସହିତ ତଳଲିà¬\96ିତ ବà\8dà\9fବହାରà¬\95ାରà\80à¬\99à\8dà¬\95 {{PLURAL:$3|à¬\96ାତା|à¬\96ାତାସମà\82ହ}} ଯà\8bଡ଼ା:
+{{PLURAL:$3|à¬\8fହି à¬\85ସà\8dଥାà\9fà\80 ପାସà±à¬¾à¬°à\8dଡ଼à¬\9fି|à¬\8fହି à¬\85ସà\8dଥାà\9fà\80 ପାସà±ାର୍ଡ଼ସବୁ}} {{PLURAL:$5|ଦିନକରେ|$5 ଦିନରେ ଅଚଳ}} ହୋଇଯିବ ।
+à¬\86ପଣ à¬\8fବà\87 ଲà¬\97 à¬\87ନ à¬\95ରି ନà\82à¬\86 ପାସà±ାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯହି ଆଉ କେହି ଜଣେ ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି
+à¬\95ିମà\8dବା à¬\86ପଣ à¬\8fବà\87 ନିà¬\9cର ମà\82ଳ ପାସà±à¬¾à¬°à\8dଡ଼ ମନà\87 ପà¬\95ାà¬\87 ପାରିଥାନà\8dତି ତà\87ବà\87 à¬\8fହି ପାସà±ାର୍ଡ଼ଟିକୁ ଆଉ ବଦଳାଇବା ଲୋଡ଼ା ନାହିଁ ।
+à¬\86ପଣ ନିà¬\9c ପà\81ରà\81ଣା ପାସà±ାର୍ଡ଼ଟି ଆଗପରି ବ୍ୟବହାର କରିପାରନ୍ତି ।',
+'passwordreset-emailtext-user' => '{{SITENAME}}ରେ ଥିବା ବ୍ୟବହାରକାରୀ $1 {{SITENAME}} ($4) ସାଇଟରେ ଥିବା ଆପଣଙ୍କ ଖାତାର ସବିଶେଷ ଜାଣିବାକୁ ଅନୁରୋଧ କରିଛନ୍ତି । ଏହି ଇମେଲ ଠିକଣା ସହିତ ତଳଲିଖିତ ବ୍ୟବହାରକାରୀଙ୍କ {{PLURAL:$3|ଖାତା|ଖାତାସମୂହ}} ଯୋଡ଼ା:
$2
-{{PLURAL:$3|à¬\8fହି à¬\85ସà\8dଥାà\9fà\80 ପାସବାରà\8dଡ଼à¬\9fି|à¬\8fହି à¬\85ସà\8dଥାà\9fà\80 ପାସବାର୍ଡ଼ସବୁ}} {{PLURAL:$5|ଦିନକରେ|$5 ଦିନରେ ଅଚଳ}} ହୋଇଯିବ ।
-à¬\86ପଣ à¬\8fବà\87 ଲà¬\97 à¬\87ନ à¬\95ରି ନà\82à¬\86 ପାସବାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯହି ଆଉ କେହି ଜଣେ ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି
-à¬\95ିମà\8dବା à¬\86ପଣ à¬\8fବà\87 ନିà¬\9cର ମà\82ଳ ପାସବାରà\8dଡ଼ ମନà\87 ପà¬\95ାà¬\87 ପାରିଥାନà\8dତି ତà\87ବà\87 à¬\8fହି ପାସବାର୍ଡ଼ଟିକୁ ଆଉ ବଦଳାଇବା ଲୋଡ଼ା ନାହିଁ ।
-à¬\86ପଣ ନିà¬\9c ପà\81ରà\81ଣା ପାସବାର୍ଡ଼ଟି ଆଗପରି ବ୍ୟବହାର କରିପାରନ୍ତି ।',
+{{PLURAL:$3|à¬\8fହି à¬\85ସà\8dଥାà\9fà\80 ପାସà±à¬¾à¬°à\8dଡ଼à¬\9fି|à¬\8fହି à¬\85ସà\8dଥାà\9fà\80 ପାସà±ାର୍ଡ଼ସବୁ}} {{PLURAL:$5|ଦିନକରେ|$5 ଦିନରେ ଅଚଳ}} ହୋଇଯିବ ।
+à¬\86ପଣ à¬\8fବà\87 ଲà¬\97 à¬\87ନ à¬\95ରି ନà\82à¬\86 ପାସà±ାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯହି ଆଉ କେହି ଜଣେ ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି
+à¬\95ିମà\8dବା à¬\86ପଣ à¬\8fବà\87 ନିà¬\9cର ମà\82ଳ ପାସà±à¬¾à¬°à\8dଡ଼ ମନà\87 ପà¬\95ାà¬\87 ପାରିଥାନà\8dତି ତà\87ବà\87 à¬\8fହି ପାସà±ାର୍ଡ଼ଟିକୁ ଆଉ ବଦଳାଇବା ଲୋଡ଼ା ନାହିଁ ।
+à¬\86ପଣ ନିà¬\9c ପà\81ରà\81ଣା ପାସà±ାର୍ଡ଼ଟି ଆଗପରି ବ୍ୟବହାର କରିପାରନ୍ତି ।',
'passwordreset-emailelement' => 'ଇଉଜର ନାମ: $1
-à¬\85ସà\8dଥାà\9fà\80 ପାସବାର୍ଡ଼: $2',
+à¬\85ସà\8dଥାà\9fà\80 ପାସà±ାର୍ଡ଼: $2',
'passwordreset-emailsent' => 'ଏକ ମନେପକାଇବା ଇ-ମେଲ ପଠାଇଦିଆଯାଇଅଛି ।',
'passwordreset-emailsent-capture' => 'ତଳେ ଦିଆଯାଇଥିବା ଭଳି ମନେପକାଇବା ଇ-ମେଲଟିଏ ପଠାଦିଆଗଲା ।',
-'passwordreset-emailerror-capture' => 'à¬\97à\8bà¬\9fିà¬\8f ସବିଶà\87ଷ à¬\8fମà\87ଲà¬\9fିà¬\8f ବାହାରିà¬\9bି, ଯାହାକି ତଳେ ଅଛି, କିନ୍ତୁ ଏହାକୁ ବ୍ୟବହାରକାରୀକୁ ପଠାଇବାରେ ଅସଫଳ ହେଲା :$1',
+'passwordreset-emailerror-capture' => 'à¬\97à\8bà¬\9fିà¬\8f ମନà\87ପà¬\95ାà¬\87ବା à¬\87-ମà\87ଲ ତିà¬\86ରି à¬\95ରାଯାà¬\87ଥିଲା, ଯାହାକି ତଳେ ଅଛି, କିନ୍ତୁ ଏହାକୁ ବ୍ୟବହାରକାରୀକୁ ପଠାଇବାରେ ଅସଫଳ ହେଲା :$1',
# Special:ChangeEmail
'changeemail' => 'ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ',
'changeemail-header' => 'ଖାତା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ',
-'changeemail-text' => 'à¬\86ପଣା à¬\87-ମà\87ଲ ଠିà¬\95ଣା ବଦଳାà¬\87ବା ନିମନà\8dତà\87 à¬\8fହି à¬\86ବà\87ଦନ ପତà\8dରà¬\9fି ପà\82ରଣ à¬\95ରନà\8dତà\81 । à¬\86ପଣà¬\99à\8dà¬\95à\81 à¬\8fହି ବଦଳ ଥà\9f à¬\95ରିବା ପାà¬\87à¬\81 ନିà¬\9cର ପାସବାର୍ଡ଼ ଦେବାକୁ ପଡ଼ିବ ।',
+'changeemail-text' => 'à¬\86ପଣା à¬\87-ମà\87ଲ ଠିà¬\95ଣା ବଦଳାà¬\87ବା ନିମନà\8dତà\87 à¬\8fହି à¬\86ବà\87ଦନ ପତà\8dରà¬\9fି ପà\82ରଣ à¬\95ରନà\8dତà\81 । à¬\86ପଣà¬\99à\8dà¬\95à\81 à¬\8fହି ବଦଳ ଥà\9f à¬\95ରିବା ପାà¬\87à¬\81 ନିà¬\9cର ପାସà±ାର୍ଡ଼ ଦେବାକୁ ପଡ଼ିବ ।',
'changeemail-no-info' => 'ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।',
'changeemail-oldemail' => 'ଏବେକାର ଇ-ମେଲ ଠିକଣା:',
'changeemail-newemail' => 'ନୂଆ ଇ-ମେଲ ଠିକଣା:',
'link_sample' => 'ଲିଙ୍କ ଶିରୋନାମା',
'link_tip' => 'ଭିତର ଲିଙ୍କ',
'extlink_sample' => 'http://www.example.com ଲିଙ୍କ ଶିରୋନାମା',
-'extlink_tip' => 'ବାହାର ଲିଙ୍କ (http:// ଆଗରେ ଲଗାଇବାକୁ ମନେରଖିଥିବେ)',
+'extlink_tip' => 'ବାହାର ଲିଙ୍କ (ଆରମ୍ଭରେ http:// ଲେଖିବାକୁ ମନେରଖିଥିବେ)',
'headline_sample' => 'ଶିରୋନାମା ଲେଖା',
'headline_tip' => '୨କ ଆକାରର ମୂଳଧାଡ଼ି',
'nowiki_sample' => 'ଅସଜଡ଼ା ଲେଖା ଏଠାରେ ଭରିବେ',
'nowiki_tip' => 'ଉଇକି ସଜାଣି ବିନା',
-'image_tip' => 'ଏମବେଡ଼ ହୋଇ ଥିବା ଫାଇଲ',
+'image_tip' => 'à¬\8fମà\8dବà\87ଡ଼ ହà\8bà¬\87 ଥିବା ଫାà¬\87ଲ',
'media_tip' => 'ଫାଇଲର ଲିଙ୍କ',
-'sig_tip' => 'ଲà\87à¬\96ାର ସମà\9f ସହ à¬\86ପଣà¬\99à\8dà¬\95 ସନà\8dତà¬\95',
+'sig_tip' => 'ସମୟ ସହ ଆପଣଙ୍କ ସନ୍ତକ',
'hr_tip' => 'ସମାନ୍ତରାଳ ରେଖା (ବେଳେବେଳେ ବ୍ୟବହାର କରିବେ)',
# Edit pages
'summary' => 'ସାରକଥା:',
-'subject' => 'ବିଷà\9f/ମà\82ଳ ଲà\87à¬\96ା',
+'subject' => 'ବିଷà\9f/ଶିରà\8bନାମା',
'minoredit' => 'ଏହା ଖୁବ ଛୋଟ ବଦଳଟିଏ',
'watchthis' => 'ଏହି ପୃଷ୍ଠାଟିକୁ ଦେଖିବେ',
'savearticle' => 'ସାଇତିବେ',
'showlivepreview' => 'ଜୀବନ୍ତ ଦେଖଣା',
'showdiff' => 'ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ',
'anoneditwarning' => "'''ଜାଣିରଖନ୍ତୁ:''' ଆପଣ ଲଗଇନ କରିନାହାନ୍ତି ।
-à¬\8fହି ଫରଦର '''à¬\87ତିହାସ''' ପà\83ଷà\8dଠାରେ ଆପଣଙ୍କ ଆଇପି ଠିକଣାଟି ସାଇତା ହୋଇଯିବ ।",
-'anonpreviewwarning' => "''à¬\86ପଣ ଲà¬\97 à¬\87ନ à¬\95ରି ନାହାନà\8dତି । à¬\86ପଣ ଯà\87à¬\89à¬\81 ବଦଳସବà\81 à¬\95ରିବେ ଆପଣଙ୍କର IP ଠିକଣା ଏହି ପୃଷ୍ଠାର ଇତିହାସରେ ସାଇତା ହୋଇଯିବ ।''",
+à¬\8fହି ପà\83ଷà\8dଠାର à¬\87ତିହାସରେ ଆପଣଙ୍କ ଆଇପି ଠିକଣାଟି ସାଇତା ହୋଇଯିବ ।",
+'anonpreviewwarning' => "''à¬\86ପଣ ଲà¬\97 à¬\87ନ à¬\95ରି ନାହାନà\8dତି । ବଦଳà¬\95ରି ସାà¬\87ତିଲେ ଆପଣଙ୍କର IP ଠିକଣା ଏହି ପୃଷ୍ଠାର ଇତିହାସରେ ସାଇତା ହୋଇଯିବ ।''",
'missingsummary' => "'''ଚେତାବନୀ:''' ଆପଣ ଏକ ସମ୍ପାଦନା ସାରକଥା ଦେଇନାହାନ୍ତି ।
ଯଦି ଆପଣ \"{{int:savearticle}}\"ରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ବଦଳ ସାରକଥା ବିନା ସାଇତା ହୋଇଯିବ ।",
'missingcommenttext' => 'ଦୟାକରି ତଳେ ଏକ ମତାମତ ଦିଅନ୍ତୁ ।',
'loginreqtitle' => 'ଲଗ ଇନ ଲୋଡ଼ା',
'loginreqlink' => 'ଲଗଇନ',
'loginreqpagetext' => 'ବାକି ପୃଷ୍ଠାମାନ ଦେଖିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ $1 କରିବାକୁ ପଡ଼ିବ ।',
-'accmailtitle' => 'ପାସବାର୍ଡ଼ଟି ପଠାଇ ଦିଆଗଲା ।',
-'accmailtext' => "[[User talk:$1|$1]]à¬\99à\8dà¬\95 ନିମନà\8dତà\87 à¬\8fà¬\95 ଯାହିତାହି ପାସବାର୍ଡ଼ $2ଙ୍କ ନିକଟକୁ ପଠାଗଲା ।
+'accmailtitle' => 'ପାସà±ାର୍ଡ଼ଟି ପଠାଇ ଦିଆଗଲା ।',
+'accmailtext' => "[[User talk:$1|$1]]à¬\99à\8dà¬\95 ନିମନà\8dତà\87 à¬\8fà¬\95 ଯାହିତାହି ପାସà±ାର୍ଡ଼ $2ଙ୍କ ନିକଟକୁ ପଠାଗଲା ।
-à¬\8fହି ପାସବାରà\8dଡ଼à¬\9fି ''[[Special:ChangePassword|ପାସବାରà\8dଡ଼ ବଦଳାଇବା]]'' ପୃଷ୍ଠାରେ ଲଗଇନ କରି କରାଯାଇପାରିବ ।",
+à¬\8fହି ପାସà±à¬¾à¬°à\8dଡ଼à¬\9fି ''[[Special:ChangePassword|ପାସà±à¬¾à¬°à\8dଡ଼ ବଦଳାଇବା]]'' ପୃଷ୍ଠାରେ ଲଗଇନ କରି କରାଯାଇପାରିବ ।",
'newarticle' => '(ନୁଆ)',
'newarticletext' => "ଆପଣ ଖୋଲିଥିବା ଲିଙ୍କଟିରେ ଏଯାଏଁ କିଛିବି ପୃଷ୍ଠା ନାହିଁ ।
ଏହି ପୃଷ୍ଠାଟିକୁ ତିଆରି କରିବା ପାଇଁ ତଳ ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ (ଅଧିକ ଜାଣିବା ପାଇଁ [[{{MediaWiki:Helppage}}|ସାହାଯ୍ୟ ପୃଷ୍ଠା]] ଦେଖନ୍ତୁ) ।
ଯଦି ଆପଣ ଏଠାକୁ ଭୁଲରେ ଆସିଯାଇଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ବ୍ରାଉଜରର '''Back''' ପତିଟି ଦବାନ୍ତୁ ।",
'anontalkpagetext' => "----''ଏହା ଏକ IP ଖାତା ଖୋଲିନଥିବା ବା ଖାତା ବ୍ୟବହାର କରିନଥିବା ଜଣେ ବେନାମି ସଭ୍ୟଙ୍କର ଆଲୋଚନା ପୃଷ୍ଠା ।
-ତà\87ଣà\81 à¬\86ମà\8dà¬à\87 ସà¬\99à\8dà¬\96à\8dà\9fା ଦà\87à¬\87 ସà\82à¬\9aିତ IP ଠିକଣା ଦେଇ ତାହାଙ୍କୁ ଜାଣିବା ।
+ତà\87ଣà\81 à¬\86ମà\8dà¬à\87 ସà¬\82à¬\96à\8dà\9fା ଦà\87à¬\87 ସà\82à¬\9aà\80ତ IP ଠିକଣା ଦେଇ ତାହାଙ୍କୁ ଜାଣିବା ।
ଏହି ପ୍ରକାରର IP ଠିକଣା ବହୁ ସଭ୍ୟଙ୍କ ଦେଇ ବଣ୍ଟା ବି ଯାଇପାରେ ।
ଯଦି ଆପଣ ଜଣେ ଅଜଣା ସଭ୍ୟ ଓ ଭାବୁଛନ୍ତି ଇଆଡୁ ସିଆଡୁ ମତାମତ ସବୁ ଆପଣଙ୍କ ଉପରେ ଦିଆଯାଇଛି ତେବେ ଦୟାକରି [[Special:UserLogin/signup|ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ]] କିମ୍ବା [[Special:UserLogin|ଆଗରୁ ଥିବା ଖାତାରେ ଲଗ ଇନ କରନ୍ତୁ]] ଯାହା ବେନାମି ସଭ୍ୟଙ୍କୁ ନେଇ ଉପୁଜିଥିବା ଦ୍ଵନ୍ଦର ସମାଧାନ କରିବ ।''",
'noarticletext' => 'ଏହି ପୃଷ୍ଠାଟିରେ କିଛି ବି ଲେଖା ନାହିଁ ।
'edit-conflict' => 'ବଦଳାଇବା ଦ୍ଵନ୍ଦ.',
'edit-no-change' => 'ଆପଣଙ୍କ ସମ୍ପାଦନାକୁ ଅଣଦେଖା କରାଗଲା, କାରଣ ଲେଖାରେ କିଛି ବି ବଦଳ କରାଯାଇନଥିଲା ।',
'edit-already-exists' => 'ନୂଆ ପୃଷ୍ଠାଟିଏ ତିଆରି କରିପାରିଲୁଁ ନାହିଁ ।
-à¬\8fହା à¬\85ଗରୁ ଅଛି ।',
+à¬\8fହା à¬\86ଗରୁ ଅଛି ।',
'defaultmessagetext' => 'ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ',
'content-failed-to-parse' => '$1 ପ୍ରକାର ପାଇଁ $2 ଲେଖାକୁ ବର୍ଣ୍ଣନା କରିପାରିଲା ନାହିଁ: $3',
'invalid-content-data' => 'ଅବୈଧ ଆଧାର ତଥ୍ୟ',
'gender-unknown' => 'ଲୁଚାଯାଇଥିବା',
'gender-male' => 'ପୁରୁଷ',
'gender-female' => 'ନାରୀ',
-'prefs-help-gender' => 'à¬\87à¬\9aà\8dà¬\9bାଧିନ: ସଫà\8dà¬\9fବେରରେ ଲିଙ୍ଗବାଚକ ସମ୍ବୋଧନ ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଇଥାଏ ।
+'prefs-help-gender' => 'à¬\87à¬\9aà\8dà¬\9bାଧିନ: ସଫà\8dà¬\9fà±େରରେ ଲିଙ୍ଗବାଚକ ସମ୍ବୋଧନ ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଇଥାଏ ।
ଏହି ତଥ୍ୟ ସାଧାରଣରେ ପ୍ରକାଶିତ ।',
'email' => 'ଇ-ମେଲ',
'prefs-help-realname' => 'ପ୍ରକୃତ ନାମ ଦେବା ଆପଣଙ୍କ ଉପରେ ନିର୍ଭର କରେ ।
ଯଦି ଆପଣ ଏହା ଦିଅନ୍ତି, ତେବେ ଏହା ଆପଣଙ୍କ କାମ ପାଇଁ ଶ୍ରେୟ ଦେବାରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ।',
-'prefs-help-email' => 'à¬\87-ମà\87ଲ ଠିà¬\95ଣାà¬\9fି à¬\87à¬\9aà\8dà¬\9bାଧà\80ନ, à¬\95ିନà\8dତà\81 à¬\86ପଣ ପାସବାରà\8dଡ଼à¬\9fି ଯଦି ଭୁଲିଗଲେ ତାହା ଆଉଥରେ ତିଆରିବା ପାଇଁ ଏହା କାମରେ ଲାଗିବ ।',
+'prefs-help-email' => 'à¬\87-ମà\87ଲ ଠିà¬\95ଣାà¬\9fି à¬\87à¬\9aà\8dà¬\9bାଧà\80ନ, à¬\95ିନà\8dତà\81 à¬\86ପଣ ଯଦି ପାସà±à¬¾à¬°à\8dଡ଼à¬\9fି ଭୁଲିଗଲେ ତାହା ଆଉଥରେ ତିଆରିବା ପାଇଁ ଏହା କାମରେ ଲାଗିବ ।',
'prefs-help-email-others' => 'ଆପଣ ନିଜର ଇ-ମେଲଟିଏ ନିଜର ସଭ୍ୟ ବା ଆଲୋଚନା ପୃଷ୍ଠାରେ ଦେଇ ଅନ୍ୟମାନଙ୍କୁ ଇ-ମେଲରେ ଯୋଗଯୋଗ କରିବାର ସୁବିଧା ଦେଇପାରିବେ ।
ଆପଣଙ୍କୁ କେହି ମେଲ କଲେ ଆପଣଙ୍କ ଇ-ମେଲ ତାହାଙ୍କୁ ଦେଖାଯିବ ନାହିଁ ।',
'prefs-help-email-required' => 'ଇ-ମେଲ ଠିକଣାଟି ଲୋଡ଼ା ।',
'prefs-displaywatchlist' => 'ଦେଖଣା ବିକଳ୍ପ',
'prefs-diffs' => 'ତଫାତସବୁ',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'ଇ-ମେଲ ଠିକଣା ବୈଧ ଭଳି ଲାଗୁଅଛି',
'email-address-validity-invalid' => 'ଏକ ସଠିକ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ',
'right-deletedtext' => 'ଲିଭାଇ ଦିଆଯାଇଥିବା ଲେଖା ଓ ଲିଭାଇ ଦିଆଯାଇଥିବା ଲେଖା ଭିତରର ସଙ୍କଳନର ବଦଳ ଦେଖିବେ',
'right-browsearchive' => 'ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାସବୁକୁ ଖୋଜିବେ',
'right-undelete' => 'ଲିଭାଇ ଦିଆଯାଇଥିବା ପୃଷ୍ଠାଟିଏକୁ ଫେରାଇ ଆଣିବେ',
-'right-suppressrevision' => 'ପରିà¬\9bାମାନଙ୍କଠାରୁ ଲୁଚାଯାଇଥିବା ସଙ୍କଳନ ପରଖିବେ ଓ ଲେଉଟାଇବେ',
+'right-suppressrevision' => 'ପରିà¬\9aାଳà¬\95ମାନଙ୍କଠାରୁ ଲୁଚାଯାଇଥିବା ସଙ୍କଳନ ପରଖିବେ ଓ ଲେଉଟାଇବେ',
'right-suppressionlog' => 'ବ୍ୟକ୍ତିଗତ ଲଗ ଦେଖାଇବେ',
'right-block' => 'ବାକି ସଭ୍ୟମାନଙ୍କୁ ସମ୍ପାଦନାରୁ ବାରଣ କରିବେ',
'right-blockemail' => 'ଇ-ମେଲ ପଠାଇବାରୁ ଜଣେ ସଭ୍ୟଙ୍କୁ ବାରଣ କରିବେ',
'listgrouprights-addgroup-self-all' => 'ନିଜ ଖାତାରେ ସବୁଯାକ ଗୋଠ ଯୋଡ଼ିବେ',
'listgrouprights-removegroup-self-all' => 'ନିଜ ଖାତାରୁ ସବୁଯାକ ଗୋଠ ହଟାଇଦେବେ',
-# E-mail user
+# Email user
'mailnologin' => 'ଗୋଟିଏ ବି ପଠାଇବା ଠିକଣା ନାହିଁ',
'mailnologintext' => 'ଆପଣ ନିଜ [[Special:Preferences|ପସନ୍ଦସବୁ]]ରେ [[Special:UserLogin|ଲଗ ଇନ]] କରିଥିଲେ ଓ ନିଜର ଏକ ସଚଳ ଇ-ମେଲ ଠିକଣା ଥିଲେ ଯାଇ ବାକି ସବୁ ସଭ୍ୟଙ୍କୁ ଇ-ମେଲ ପଠାଇପାରିବେ ।',
'emailuser' => 'ଏହି ସଭ୍ୟଙ୍କୁ ଇମେଲ କରିବେ',
'tooltip-n-mainpage-description' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
'tooltip-n-portal' => 'ଏହି ପ୍ରକଳ୍ପଟିରେ ଖୋଜା ଖୋଜି ପାଇଁ ଆପଣ କେମିତି ସାହାଯ୍ୟ କରିପାରିବେ',
'tooltip-n-currentevents' => 'ନଗଦ କାମର ପଛପଟେ ଚାଲିଥିବା କାମର ତଥ୍ୟ',
-'tooltip-n-recentchanges' => 'ବିକିରେ ଏହିମାତ୍ର କରାଯାଇଥିବା ଅଦଳ ବଦଳ',
+'tooltip-n-recentchanges' => 'à±ିକିରେ ଏହିମାତ୍ର କରାଯାଇଥିବା ଅଦଳ ବଦଳ',
'tooltip-n-randompage' => 'ଯାହିତାହି ପୃଷ୍ଠାଟିଏ ଖୋଲ',
'tooltip-n-help' => 'ଖୋଜି ପାଇବା ଭଳି ଜାଗା',
'tooltip-t-whatlinkshere' => 'ଏଠାରେ ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠାସବୁର ତାଲିକା',
'monthsall' => 'ସବୁ',
'limitall' => 'ସବୁ',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'ଆପଣଙ୍କ ଇମେଲ ଠିକଣା ଟି ଠିକ ବୋଲି ଥୟ କରନ୍ତୁ',
'confirmemail_noemail' => '[[Special:Preferences|ଆପଣଙ୍କ ପସନ୍ଦ]] ଭିତରେ ଏକ ସଠିକ ଇମେଲ ଠିକଣା ଦିଆଯାଇନାହିଁ ।',
'confirmemail_text' => 'ଆପଣା ଇମେଲ ସୁବିଧା ବ୍ୟବହାର କରିବା ଆଗରୁ {{SITENAME}}ରେ ଆପଣଙ୍କର ଇମେଲ ଠିକଣା ଥୟ କରିବାକୁ ପଡ଼ିବ ।
'imagelinks' => 'Usage dech fichié',
'linkstoimage' => "{{PLURAL:$1|L'pache d'apreu est liée|Chés $1 paches d'apreu sont liées}} à ch'fichié-lo :",
'nolinkstoimage' => "Autchune pache n'est loïée aveuc ch'fichié-lo",
-'sharedupload' => "Cht'fichié vient éd $1 pi i put ète imploïé par d'eutes proujés.",
-'sharedupload-desc-here' => "Ch'fichié i vient éd $1. I put ète uzer pèr d’eutes prodjés.
-Vir apré ([$2 pache]).",
+'sharedupload' => "Ch'fichié i vient éd $1. I put ète imploïé par d'eutes proujés.",
+'sharedupload-desc-there' => "Ch'fichié i vient éd $1. I put ète uzé pèr d’eutes prodjés. Vir l'pache [$2 édseur Commons].",
+'sharedupload-desc-here' => "Ch'fichié i vient éd $1. I put ète uzé pèr d’eutes prodjés.
+Vir l'pache [$2 édseur Commons].",
+'sharedupload-desc-edit' => "Ch'fichié i vient éd $1. I put ète imploïé par d'eutes proujés. Os pouvez canjer l' déscripcion dsu s' [$2 pache Commons].",
+'sharedupload-desc-create' => "Ch'fichié i vient éd $1. I put ète imploïé par d'eutes proujés. Os pouvez canjer l' déscripcion dsu s' [$2 pache Commons].",
'uploadnewversion-linktext' => 'Quértcher eune novèle vérchion del pache-lo',
+'shared-repo-from' => 'à : $1',
+'shared-repo' => 'un dépôt partagé',
# MIME search
'mimesearch' => 'Tracher pèr type éd contenu MIME',
'loginlanguagelabel' => 'Język: $1',
'suspicious-userlogout' => 'Żądanie wylogowania zostało odrzucone ponieważ wygląda na to, że zostało wysłane przez uszkodzoną przeglądarkę lub buforujący serwer proxy.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Wystąpił nieznany błąd w funkcji PHP mail()',
'user-mail-no-addy' => 'Próba wysłania e‐maila bez adresu odbiorcy',
'user-mail-no-body' => 'Próbowano wysłać e-mail o psutej lub krótkiej treści.',
'prefs-displaywatchlist' => 'Opcje wyświetlania',
'prefs-diffs' => 'Zmiany',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Wygląda na prawidłowy',
'email-address-validity-invalid' => 'Wymagany jest prawidłowy adres!',
'listgrouprights-addgroup-self-all' => 'Może dodać własne konto do wszystkich grup',
'listgrouprights-removegroup-self-all' => 'Może usunąć własne konto ze wszystkich grup',
-# E-mail user
+# Email user
'mailnologin' => 'Brak adresu',
'mailnologintext' => 'Musisz się [[Special:UserLogin|zalogować]] i mieć wpisany aktualny adres e‐mailowy w swoich [[Special:Preferences|preferencjach]], aby móc wysłać e‐mail do innego użytkownika.',
'emailuser' => 'Wyślij e‐mail do tego użytkownika',
'pageinfo-robot-noindex' => 'Nieindeksowalne',
'pageinfo-views' => 'Odsłon',
'pageinfo-watchers' => 'Liczba obserwujących',
+'pageinfo-few-watchers' => 'Mniej niż $1 {{PLURAL:$1|obserwujący|obserwujących}}',
'pageinfo-redirects-name' => 'Liczba przekierowań do tej strony',
'pageinfo-subpages-name' => 'Liczba podstron tej strony',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|przekierowanie|przekierowania|przekierowań}}; $3 {{PLURAL:$3|bez przekierowania|bez przekierowań|bez przekierowań}})',
'monthsall' => 'wszystkie',
'limitall' => 'wszystkie',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Potwierdzanie adresu e‐mail',
'confirmemail_noemail' => 'Nie podał{{GENDER:|eś|aś|eś/aś}} prawidłowego adresu e‐mail w [[Special:Preferences|preferencjach]].',
'confirmemail_text' => 'Projekt {{SITENAME}} wymaga weryfikacji adresu e‐mail przed użyciem funkcji korzystających z poczty.
'duration-centuries' => '$1 {{PLURAL:$1|stulecie|stulecia|stuleci}}',
'duration-millennia' => '$1 {{PLURAL:$1|tysiąclecie|tysiąclecia|tysiącleci}}',
+# Image rotation
+'rotate-comment' => 'Obraz został odwrócony o $1 {{PLURAL:$1|stopień|stopnie|stopni}} (w kierunku zgodnym z ruchem wskazówek zegara)',
+
);
تاسې کولای شی چې د کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په همدې او يا کوم بل کارن-نوم، يو ځل <span class='plainlinks'>[$1 بيا غونډال ته ورننوځۍ]</span>.
دا په پام کې وساتۍ چې تر څو تاسې د خپل کتنمل حافظه نه وي سپينه کړې، نو ځينې مخونو کې به لا تر اوسه پورې په غونډال کې ننوتي ښکارۍ.",
+'welcomeuser' => '$1، ښه راغلې!',
'yourname' => 'کارن-نوم:',
'yourpassword' => 'پټنوم:',
'yourpasswordagain' => 'پټنوم بيا وليکه',
'login-abort-generic' => 'غونډال کې مو ننوتل نابريالی شو - ناڅاپي بند شو',
'loginlanguagelabel' => 'ژبه: $1',
-# E-mail sending
+# Email sending
'user-mail-no-addy' => 'د يوې برېښليک پتې پرته د برېښليک لېږلو هڅه شوې.',
# Change password dialog
'prefs-displaywatchlist' => 'د ښکارېدنې خوښنې',
'prefs-diffs' => 'توپيرونه',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'برېښليک پته سمه ښکاري',
'email-address-validity-invalid' => 'يوه سمه برېښليک پته وليکۍ',
'listgrouprights-addgroup-self-all' => 'خپل ګڼون کې ټولې ډلې ورګډول',
'listgrouprights-removegroup-self-all' => 'خپل ګڼون نه ټولې ډلې ليري کول',
-# E-mail user
+# Email user
'mailnologin' => 'هېڅ کومه لېږل شوې پته نشته',
'emailuser' => 'کارن ته برېښليک لېږل',
'emailuser-title-target' => 'دې {{GENDER:$1|کارن}} ته برېښليک لېږل',
'monthsall' => 'ټول',
'limitall' => 'ټول',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'د برېښليک پتې پخلی وکړی',
'confirmemail_noemail' => 'تاسې يوه سمه برېښليک پته نه ده ثبته کړې مهرباني وکړی [[Special:Preferences|د کارن غوره توبونه]] مو بدل کړۍ.',
'confirmemail_send' => 'يو تاييدي کوډ لېږل',
'specialpages-group-highuse' => 'ډېر کارېدونکي مخونه',
'specialpages-group-pages' => 'د مخونو لړليک',
'specialpages-group-pagetools' => 'د مخ اوزارونه',
-'specialpages-group-wiki' => 'ويکيډاټا او اوزارونه',
+'specialpages-group-wiki' => 'توکي او اوزارونه',
# Special:BlankPage
'blankpage' => 'تش مخ',
'february' => 'fevereiro',
'march' => 'março',
'april' => 'abril',
-'may_long' => 'Maio',
+'may_long' => 'maio',
'june' => 'junho',
'july' => 'julho',
'august' => 'agosto',
'loginlanguagelabel' => 'Língua: $1',
'suspicious-userlogout' => 'O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
'user-mail-no-addy' => 'Tentou enviar uma mensagem sem um endereço de correio electrónico',
'extlink_sample' => 'http://www.example.com título da ligação',
'extlink_tip' => 'Ligação externo (lembre-se do prefixo http://)',
'headline_sample' => 'Texto do cabeçalho',
-'headline_tip' => 'Secção de nível 2',
+'headline_tip' => 'Seção de nível 2',
'nowiki_sample' => 'Inserir texto não-formatado aqui',
'nowiki_tip' => 'Ignorar formatação wiki',
'image_sample' => 'Exemplo.jpg',
'prefs-displaywatchlist' => 'Opções de apresentação',
'prefs-diffs' => 'Diferenças',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Parece válido',
'email-address-validity-invalid' => 'Endereço válido necessário!',
# User rights
'userrights' => 'Privilégios dos utilizadores',
-'userrights-lookup-user' => 'Gerir grupos do utilizador',
+'userrights-lookup-user' => 'Gerir grupos de utilizadores',
'userrights-user-editname' => 'Introduza um nome de utilizador:',
'editusergroup' => 'Editar grupos do utilizador',
'editinguser' => "A modificar os privilégios do utilizador '''[[User:$1|$1]]''' $2",
'listgrouprights-addgroup-self-all' => 'Adicionar a própria conta a todos os grupos',
'listgrouprights-removegroup-self-all' => 'Remover a própria conta de todos os grupos',
-# E-mail user
+# Email user
'mailnologin' => 'Não existe endereço de envio',
'mailnologintext' => 'Precisa de estar [[Special:UserLogin|autenticado]] e possuir um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio electrónico a outros utilizadores.',
'emailuser' => 'Enviar correio electrónico a este utilizador',
'nocredits' => 'Não há informação disponível sobre os créditos desta página.',
# Spam protection
-'spamprotectiontitle' => 'Filtro de protecção contra spam',
+'spamprotectiontitle' => 'Filtro de proteção contra spam',
'spamprotectiontext' => "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.
Este bloqueio foi provavelmente causado por um link para um site externo que consta da lista negra.",
'spamprotectionmatch' => 'O seguinte texto activou o filtro de spam: $1',
'monthsall' => 'todos',
'limitall' => 'tudo',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Confirmar endereço de correio electrónico',
'confirmemail_noemail' => 'Não tem um endereço de correio electrónico válido nas suas [[Special:Preferences|preferências de utilizador]].',
'confirmemail_text' => 'A {{SITENAME}} requer que valide o seu endereço de correio electrónico antes de usar as funcionalidades de correio.
'loginlanguagelabel' => 'Idioma: $1',
'suspicious-userlogout' => 'Sua solicitação para sair foi negada porque aparentemente foi enviada por um navegador danificado ou por um servidor proxy com cache.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
'user-mail-no-addy' => 'Tentou enviar uma mensagem sem um endereço de e-mail.',
'user-mail-no-body' => 'Você tentou enviar com o campo de e-mail vazio ou com poucos caracteres.',
'difference-title-multipage' => 'Mudanças entre as páginas "$1" e "$2"',
'difference-multipage' => '(Diferenças entre páginas)',
'lineno' => 'Linha $1:',
-'compareselectedversions' => 'Compare as versões selecionadas',
+'compareselectedversions' => 'Comparar as versões selecionadas',
'showhideselectedversions' => 'Exibir/ocultar edições selecionadas',
'editundo' => 'desfazer',
'diff-multi' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de {{PLURAL:$2|um usuário|$2 usuários}} {{PLURAL:$1|não apresentada|não apresentadas}})',
'prefs-displaywatchlist' => 'Opções de exibição',
'prefs-diffs' => 'Diferenças',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Parece válido',
'email-address-validity-invalid' => 'Forneça um endereço de e-mail válido',
Talvez fosse melhor que possuissem links para uma página mais específica.</br>
Uma página é considerada como de desambiguação se utilizar uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Páginas com uma propriedade de página',
+'pageswithprop-legend' => 'Páginas com uma propriedade de página',
+'pageswithprop-text' => 'Esta página lista as páginas que usam uma determinada propriedade de página.',
+'pageswithprop-prop' => 'Nome da propriedade:',
+'pageswithprop-submit' => 'Ir',
+
'doubleredirects' => 'Redirecionamentos duplos',
'doubleredirectstext' => 'Esta página lista as páginas que redirecionam para outros redirecionamentos.
Cada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
'special-categories-sort-abc' => 'ordenar alfabeticamente',
# Special:DeletedContributions
-'deletedcontributions' => 'Contribuições de usuário eliminadas',
+'deletedcontributions' => 'Edições eliminadas',
'deletedcontributions-title' => 'Contribuições de usuário eliminadas',
'sp-deletedcontributions-contribs' => 'contribuições',
'listgrouprights-addgroup-self-all' => 'Pode adicionar todos os grupos à própria conta',
'listgrouprights-removegroup-self-all' => 'Pode remover todos os grupos da própria conta',
-# E-mail user
+# Email user
'mailnologin' => 'Nenhum endereço de envio',
'mailnologintext' => 'Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.',
'emailuser' => 'Enviar-lhe um e-mail',
'protect-fallback' => 'Permitir apenas os usuários com privilégio de "$1"',
'protect-level-autoconfirmed' => 'Permitir apenas usuários auto-confirmados',
'protect-level-sysop' => 'Permitir apenas administradores',
-'protect-summary-cascade' => 'p. progressiva',
+'protect-summary-cascade' => 'em cascata',
'protect-expiring' => 'expira em $1 (UTC)',
'protect-expiring-local' => 'expira $1',
'protect-expiry-indefinite' => 'indefinidamente',
'import-error-interwiki' => 'A página "$1" não pôde ser importada pois seu nome está reservado para um link interwik.',
'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
+'import-error-unserialize' => 'Revisão $2 da página " $1 " não pôde ser desserializada. A revisão foi relatada para usar o modelo de conteúdo $3 serializado como $4',
'import-options-wrong' => '{{PLURAL:$2|Opção com erro|Opções com erros}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'A página raiz dada é um título inválido.',
'import-rootpage-nosubpage' => 'O espaço nominal $1 da página principal não permite subpáginas.',
'pageinfo-robot-noindex' => 'Não indexável',
'pageinfo-views' => 'Número de visitas',
'pageinfo-watchers' => 'Número de vigilantes da página',
+'pageinfo-few-watchers' => 'Menos de $1 {{PLURAL:$1|vigilante|vigilantes}}',
'pageinfo-redirects-name' => 'Redirecionamentos para esta página',
'pageinfo-subpages-name' => 'Subpáginas desta página',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não redirecionamento|não redirecionamentos}})',
'monthsall' => 'todos',
'limitall' => 'todas',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Confirmar endereço de E-mail',
'confirmemail_noemail' => 'Não possui um endereço de e-mail válido indicado nas suas [[Special:Preferences|preferências de usuário]].',
'confirmemail_text' => '{{SITENAME}} requer o seu endereço de e-mail esteja validado antes de utilizar as funcionalidades que requerem um endereço de e-mail.
'watchlistedit-normal-explain' => 'Os títulos das páginas de sua lista de vigiadas são exibidos abaixo.
Para remover um título, marque a caixa ao lado do mesmo e clique "{{int:Watchlistedit-normal-submit}}".
Você pode também [[Special:EditWatchlist/raw|editar a lista de páginas vigiadas em forma de texto]].',
-'watchlistedit-normal-submit' => 'Remover Títulos',
+'watchlistedit-normal-submit' => 'Remover páginas',
'watchlistedit-normal-done' => '{{PLURAL:$1|um título foi removido|$1 títulos foram removidos}} de sua lista de páginas vigiadas:',
'watchlistedit-raw-title' => 'Edição crua da lista de páginas vigiadas',
'watchlistedit-raw-legend' => 'Edição crua da lista de páginas vigiadas',
'api-error-ok-but-empty' => 'Erro interno: não há resposta do servidor.',
'api-error-overwrite' => 'Não é permitido sobrescrever um arquivo já existente.',
'api-error-stashfailed' => 'Erro interno: o servidor não conseguiu armazenar o arquivo temporário.',
+'api-error-publishfailed' => 'Erro interno: O servidor falhou ao publicar o arquivo temporário.',
'api-error-timeout' => 'O servidor não respondeu dentro do tempo esperado.',
'api-error-unclassified' => 'Ocorreu um erro desconhecido',
'api-error-unknown-code' => 'Erro desconhecido: "$1"',
* @author Usarker
* @author Verdy p
* @author Vinhtantran
+ * @author Vivaelcelta
* @author Waldir
* @author Whym
* @author Yekrats
'tog-editsectiononrightclick' => "[[Special:Preferences]], tab 'Edit'. Offers user to edit a section by clicking on a section title. {{Gender}}",
'tog-showtoc' => "[[Special:Preferences]], tab 'Misc'.
Offers user to show a table of contents automatically if a page has more than 3 headings (= 4 or more headings).",
-'tog-rememberpassword' => "{{Identical|Remember my login on this computer}}[[Special:Preferences]], tab 'User profile', section 'Change password'. Offers user remember login details. {{Gender}} Parameters:
-* $1 is the number of days the login details are remembered.",
+'tog-rememberpassword' => "{{Gender}}
+[[Special:Preferences]], tab 'User profile', section 'Change password'. Offers user remember login details.
+Parameters:
+* $1 - the number of days the login details are remembered
+{{Identical|Remember my login on this computer}}",
'tog-watchcreations' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add created pages to watchlist. {{Gender}}",
'tog-watchdefault' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add edited pages to watchlist. {{Gender}}",
'tog-watchmoves' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to add moved pages to watchlist. {{Gender}}",
# Font style option in Special:Preferences
'editfont-style' => 'Used in [[Special:Preferences]], tab Editing. {{Gender}}',
'editfont-default' => 'Option used in [[Special:Preferences]], tab Editing. {{Gender}}
-
-{{identical|Browser default}}',
+{{Identical|Browser default}}',
'editfont-monospace' => 'Option used in [[Special:Preferences]], tab Editing. {{Gender}}',
'editfont-sansserif' => 'Option used in [[Special:Preferences]], tab Editing. {{Gender}}',
'editfont-serif' => 'Option used in [[Special:Preferences]], tab Editing. {{Gender}}',
'category-empty' => 'The text displayed in category page when that category is empty',
'hidden-categories' => 'Used in the categories section of pages. Is followed by a colon and a list of categories.',
'hidden-category-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where hidden categories will be listed.',
-'category-subcat-count' => 'This message is displayed at the top of a category page showing the number of pages in the category. Parameters:
-* $1: number of subcategories shown
-* $2: total number of subcategories in category',
-'category-subcat-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted. Parameters:
-* $1: number of subcategories shown',
+'category-subcat-count' => 'This message is displayed at the top of a category page showing the number of pages in the category.
+
+Parameters:
+* $1 - number of subcategories shown
+* $2 - total number of subcategories in category',
+'category-subcat-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
+
+Parameters:
+* $1 - number of subcategories shown',
'category-article-count' => 'This message is used on category pages. Parameters:
-* $1: number of pages shown
-* $2: total number of pages in category',
-'category-article-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted. Parameters:
-* $1: number of pages shown',
-'category-file-count' => 'This message is displayed at the top of a category page showing the number of pages in the category. Parameters:
-* $1: number of files shown
-* $2: total number of files in category',
-'category-file-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted. Parameters:
-* $1: number of files shown',
-'listingcontinuesabbrev' => 'Shown in contiuation of each first letter group.
+* $1 - number of pages shown
+* $2 - total number of pages in category',
+'category-article-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
+
+Parameters:
+* $1 - number of pages shown',
+'category-file-count' => 'This message is displayed at the top of a category page showing the number of pages in the category.
+
+Parameters:
+* $1 - number of files shown
+* $2 - total number of files in category',
+'category-file-count-limited' => 'This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.
+
+Parameters:
+* $1 - number of files shown',
+'listingcontinuesabbrev' => 'Shown in contiuation of each first letter group. This message follows the first letter.
+
See http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for example.',
-'index-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behaviour switch are listed. For description of this behaviour switch see [//www.mediawiki.org/wiki/Help:Magic_words#Behavior_switches mediawiki].',
-'noindex-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behaviour switch are listed. For description of this behaviour switch see [//www.mediawiki.org/wiki/Help:Magic_words#Behavior_switches mediawiki].',
+'index-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behavior switch are listed. For description of this behavior switch see [[mw:Help:Magic_words#Behavior_switches|MediaWiki]].',
+'noindex-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behavior switch are listed. For description of this behavior switch see [[mw:Help:Magic_words#Behavior_switches|MediaWiki]].',
'broken-file-category' => 'Name of [[mw:Help:Tracking categories|tracking category]] where pages that embed files that do not exist ("broken images") are listed.',
'categoryviewer-pagedlinks' => '{{Optional}}
The pagination links in category viewer. Parameters:
'linkprefix' => '{{optional}}',
'about' => '{{Identical|About}}',
-'article' => "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
+'article' => "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].
Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
{{Identical|Navigation}}',
'and' => 'The translation for "and" appears in the [[Special:Version]] page, between the last two items of a list. If a comma is needed, add it at the beginning without a gap between it and the "&". <nowiki> </nowiki> is a blank space, one character long. Please leave it as it is.
-This can also appear in the credits page if the credits feature is enabled,for example [http://translatewiki.net/wiki/Support&action=credits the credits of the support page]. (To view any credits page type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar.)
-
+This can also appear in the credits page if the credits feature is enabled,for example [{{canonicalurl:Support|action=credits}} the credits of the support page]. (To view any credits page type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar.)
{{Identical|And}}',
# Cologne Blue skin
'qbedit' => '{{Identical|Edit}}',
'qbmyoptions' => 'Heading in the Cologne Blue skin user menu containing links to user (talk) page, preferences, watchlist, etc.
{{Identical|My pages}}',
-'qbspecialpages' => '{{Identical|Special pages}}',
+'qbspecialpages' => '{{Identical|Special page}}',
'faq' => "FAQ is short for ''frequently asked questions''.",
'faqpage' => "FAQ is short for ''frequently asked questions''. This page is only linked on some of the old skins, not in Monobook or Modern.
{{doc-important|Do not translate <tt>Project:</tt> part.}}",
# Vector skin
-'vector-action-addsection' => 'Used in the Vector skin. See for example http://translatewiki.net/wiki/Talk:Main_Page?useskin=vector',
-'vector-action-delete' => 'Used in the Vector skin, as the name of a tab at the top of the page. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
+'vector-action-addsection' => 'Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}',
+'vector-action-delete' => 'Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Main_Page|useskin=vector}}
{{Identical|Delete}}',
-'vector-action-move' => 'Used in the Vector skin, on the tabs at the top of the page. See for example http://translatewiki.net/wiki/Talk:Main_Page?useskin=vector
+'vector-action-move' => 'Used in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}
{{Identical|Move}}',
'vector-action-protect' => 'Tab at top of page, in vector skin
{{Identical|Unprotect}}',
'vector-simplesearch-preference' => 'Preference for enhanced search suggestion in the Vector skin.',
-'vector-view-create' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Foo?useskin=vector
+'vector-view-create' => 'Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}
{{Identical|Create}}',
-'vector-view-edit' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
+'vector-view-edit' => 'Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}
{{Identical|Edit}}',
-'vector-view-history' => 'Tab label in the Vector skin. See for example http://translatewiki.net/wiki/Main_Page?useskin=vector
+'vector-view-history' => 'Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}
{{Identical|View history}}',
-'vector-view-view' => 'Tab label in the Vector skin (verb). See for example http://translatewiki.net/w/i.php?title=Main_Page&useskin=vector',
+'vector-view-view' => 'Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}',
'vector-view-viewsource' => 'Tab label in the Vector skin.
{{Identical|View source}}',
'actions' => '{{Identical|Action}}',
{{Identical|Error}}',
'returnto' => '{{Identical|Return to $1}}',
-'tagline' => 'Used to identify the source of copied information. Do not change <nowiki>{{SITENAME}}</nowiki>.',
+'tagline' => '{{doc-important|Do not change <code><nowiki>{{SITENAME}}</nowiki></code>.}}
+Used to identify the source of copied information.',
'help' => 'General text (noun) used in the sidebar (by default).
-See also [[MediaWiki:Helppage/{{SUBPAGENAME}}|{{int:helppage}}]] and [[MediaWiki:Edithelp/{{SUBPAGENAME}}|{{int:edithelp}}]].
+See also {{msg-mw|Helppage}} and {{msg-mw|Edithelp}}.
See also:
* {{msg-mw|Help}}
* {{msg-mw|Accesskey-search}}
* {{msg-mw|Tooltip-search}}
{{Identical|Search}}',
-'searchbutton' => 'The button you can see in the sidebar, below the search input box. The "Go" button is [[MediaWiki:Searcharticle/{{SUBPAGENAME}}]].
-
+'searchbutton' => 'The button you can see in the sidebar, below the search input box. The "Go" button is {{msg-mw|Searcharticle}}.
{{Identical|Search}}',
'go' => 'See also:
* {{msg-mw|Go}}
* {{msg-mw|Accesskey-search-go}}
* {{msg-mw|Tooltip-search-go}}
{{Identical|Go}}',
-'searcharticle' => 'Button description in the search menu displayed on every page. The "Search" button is [[MediaWiki:Searchbutton/{{SUBPAGENAME}}]].
-
+'searcharticle' => 'Button description in the search menu displayed on every page. The "Search" button is {{msg-mw|Searchbutton}}.
{{Identical|Go}}',
+'history' => '{{Identical|Page history}}',
'history_short' => 'Text used on the history tab.
{{Identical|History}}',
See also:
* {{msg-mw|Printableversion}}
* {{msg-mw|Accesskey-t-print}}
-* {{msg-mw|Tooltip-t-print}}',
+* {{msg-mw|Tooltip-t-print}}
+{{Identical|Printable version}}',
'permalink' => 'Display name for a permanent link to the current revision of a page. When the page is edited, permalink will still link to this revision. Example: Last menu link on [[{{MediaWiki:Mainpage}}]]
See also:
'talkpagelinktext' => 'Used as name of links going to talk page in some places, like in [[Special:RecentChanges]], [[Special:Allmessages]], [[Special:Logs]], and [[Special:Watchlist/edit]].
{{Identical|Talk}}',
-'specialpage' => '{{Identical|Special pages}}',
-'personaltools' => 'Heading for a group of links to your user page, talk page, preferences, watchlist, and contributions. This heading is visible in the sidebar in some skins. For an example, see [http://translatewiki.net/wiki/Main_Page?useskin=simple Main Page using simple skin].',
+'specialpage' => '{{Identical|Special page}}',
+'personaltools' => 'Heading for a group of links to your user page, talk page, preferences, watchlist, and contributions. This heading is visible in the sidebar in some skins. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].',
'articlepage' => "'Content page' is used for NS_MAIN and any other non-standard namespace and this message is only used in skins Nostalgia, Cologneblue and Standard in the bottomLinks part.
{{Identical|Content page}}",
* {{msg-mw|Accesskey-ca-talk}}
* {{msg-mw|Tooltip-ca-talk}}
{{Identical|Discussion}}',
-'views' => 'Subtitle for the list of available views, for the current page. In "monobook" skin the list of views are shown as tabs, so this sub-title is not shown. For an example, see [http://translatewiki.net/wiki/Main_Page?useskin=simple Main Page using simple skin].
+'views' => 'Subtitle for the list of available views, for the current page. In "monobook" skin the list of views are shown as tabs, so this sub-title is not shown. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].
\'\'\'Note:\'\'\' This is "views" as in "appearances"/"representations", \'\'\'not\'\'\' as in "visits"/"accesses".
{{Identical|View}}',
'viewtalkpage' => 'Used in Standard (a.k.a. Classic) skin as a link to talk page for all namespaces, in edit or history mode.',
'otherlanguages' => 'This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <tt><nowiki>[[</nowiki>en:Interwiki article]]</tt>.
{{Identical|Otherlanguages}}',
-'redirectedfrom' => 'The text displayed when a certain page is redirected to another page.
-*<tt>$1</tt> contains the name of the page user came from.',
+'redirectedfrom' => 'The text displayed when a certain page is redirected to another page. Parameters:
+* $1 - the name of the page user came from',
'redirectpagesub' => 'Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.
{{Identical|Redirect page}}',
'lastmodifiedat' => 'This message is shown below each page, in the footer with the logos and links.
-* $1: date
-* $2: time
-See also [[MediaWiki:Lastmodifiedatby/{{SUBPAGENAME}}]].',
+Parameters:
+* $1 - date
+* $2 - time
+See also:
+* {{msg-mw|Lastmodifiedatby}}',
'viewcount' => 'Used as page-view counter.',
'protectedpage' => "This message is displayed when trying to edit a page you can't edit because it has been protected.
'jumptosearch' => 'Part of the "jump to" navigation links. Hidden by default in monobook skin. The format is: [[MediaWiki:Jumpto/{{SUBPAGENAME}}|{{int:jumpto}}]] [[MediaWiki:Jumptonavigation/{{SUBPAGENAME}}|{{int:jumptonavigation}}]], {{int:jumptosearch}}.
{{Identical|Search}}',
-'view-pool-error' => 'Error message. $1 is probably unused.',
+'view-pool-error' => 'Error message. Parameters:
+* $1 - probably unused',
'pool-timeout' => "Part of {{msg-mw|view-pool-error}}.
-For explanation of 'lock' see [http://en.wikipedia.org/wiki/Lock_%28computer_science%29 wikipedia].",
+For explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
'pool-queuefull' => 'Part of {{msg-mw|view-pool-error}}
"Pool" refers to a pool of processes.',
'badaccess' => 'Title shown within page indicating unauthorized access.',
'badaccess-group0' => 'Shown when you are not allowed to do something.',
-'badaccess-groups' => "Error message when you aren't allowed to do something.
-
-* $1 is a list of groups.
-* $2 is the number of groups.",
+'badaccess-groups' => "Error message when you aren't allowed to do something. Parameters:
+* $1 - a list of groups
+* $2 - the number of groups",
'versionrequired' => 'This message is not used in the MediaWiki core, but was introduced with the reason that it could be useful for extensions. See also {{msg|versionrequiredtext}}.',
'versionrequiredtext' => 'This message is not used in the MediaWiki core, but was introduced with the reason that it could be useful for extensions. See also {{msg|versionrequired}}.',
'backlinksubtitle' => '{{optional}}
Appears in subtitle
* $1 is a link to the page (HTML)',
-'retrievedfrom' => 'Message which appears in the source of every page, but it is hidden. It is shown when printing. $1 is a link back to the current page: {{FULLURL:{{FULLPAGENAME}}}}.',
+'retrievedfrom' => 'Message which appears in the source of every page, but it is hidden. It is shown when printing.
+
+Parameters:
+* $1 - a link back to the current page: {{FULLURL:{{FULLPAGENAME}}}}',
'youhavenewmessages' => 'The yellow message appearing when someone edited your user talk page.
The format is: "{{int:youhavenewmessages| [[MediaWiki:Newmessageslink/{{SUBPAGENAME}}|{{int:newmessageslink}}]] |[[MediaWiki:Newmessagesdifflink/{{SUBPAGENAME}}|{{int:newmessagesdifflink}}]]}}"',
'newmessageslink' => 'This is the first link displayed in an orange rectangle when a user gets a message on his talk page.
See also:
* {{msg-mw|Newmessagesdifflinkplural}}',
-'youhavenewmessagesfromusers' => 'New talk indicator message: the message appearing when someone edited your user talk page.
-The message takes three parameters;
-*$1 {{msg-mw|newmessageslinkplural}},
-*$2 {{msg-mw|newmessagesdifflinkplural}}, and
-*$3 the number of authors who have edited the talk page since the owning user last viewed it.',
-'youhavenewmessagesmanyusers' => 'New talk indicator message: the message appearing when someone edited your user talk page. Used when more than 10 users edited the user talk page since the owning user last viewed it, similar to{{msg-mw|youhavenewmessages}}. Parameters:
-* $1 is {{msg-mw|newmessageslinkplural}},
-* $2 is {{msg-mw|newmessagesdifflinkplural}}.',
+'youhavenewmessagesfromusers' => 'New talk indicator message: the message appearing when someone edited your user talk page. Parameters:
+* $1 - defined as {{msg-mw|newmessageslinkplural}}
+* $2 - defined as {{msg-mw|newmessagesdifflinkplural}}
+* $3 - the number of authors who have edited the talk page since the owning user last viewed it',
+'youhavenewmessagesmanyusers' => 'New talk indicator message: the message appearing when someone edited your user talk page.
+
+Used when more than 10 users edited the user talk page since the owning user last viewed it, similar to {{msg-mw|youhavenewmessages}}.
+
+Parameters:
+* $1 - {{msg-mw|newmessageslinkplural}}
+* $2 - {{msg-mw|newmessagesdifflinkplural}}',
'newmessageslinkplural' => 'Like {{msg-mw|newmessageslink}} but supporting pluralization. Used in message {{msg-mw|youhavenewmessagesfromusers}} (as parameter $1).
This message itself takes one parameter, $1, which is 1 if there was one new edit, or 2 if there was more than one new edit
since the last time the user has seen his or her talk page.',
{{Identical|View source}}',
'editsectionhint' => "Tool tip shown when hovering the mouse over the link to '[{{MediaWiki:Editsection}}]' a section. Example: Edit section: Heading name",
-'toc' => 'This is the title of the table of contents displayed in pages with more than 3 sections
-
-{{Identical|Contents}}',
+'toc' => 'This is the title of the table of contents displayed in pages with more than 3 sections.
+{{Identical|Content}}',
'showtoc' => 'This is the link used to show the table of contents
{{Identical|Show}}',
This is the link used to collapse a collapsible element. (used as plaintext. No wikitext or html is parsed.)
See also:
-* {{msg-mw|Collapsible-expand}}',
+* {{msg-mw|Collapsible-expand}}
+{{Identical|Collapse}}',
'collapsible-expand' => '{{Doc-actionlink}}
This is the link used to expand a collapsible element (used as plaintext. No wikitext or html is parsed.)
See the following example:
{{Identical|Expand}}',
-'thisisdeleted' => 'Message shown on a deleted page when the user has the undelete right. $1 is a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text. See also {{msg-mw|viewdeleted}}.',
-'viewdeleted' => 'Message shown on a deleted page when the user does not have the undelete right (but has the deletedhistory right). $1 is a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text. See also {{msg-mw|thisisdeleted}}.',
+'thisisdeleted' => 'Message shown on a deleted page when the user has the undelete right. Parameters:
+* $1 - a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text
+See also:
+* {{msg-mw|viewdeleted}}',
+'viewdeleted' => 'Message shown on a deleted page when the user does not have the undelete right (but has the deletedhistory right). Parameters:
+* $1 - a link to [[Special:Undelete]], with {{msg-mw|restorelink}} as the text
+See also:
+* {{msg-mw|thisisdeleted}}',
'restorelink' => "This text is always displayed in conjunction with the {{msg-mw|thisisdeleted}} message (View or restore $1?). The user will see
View or restore <nowiki>{{PLURAL:$1|one deleted edit|$1 deleted edits}}</nowiki>? i.e ''View or restore one deleted edit?'' or
''View or restore n deleted edits?''",
'feed-invalid' => 'Result of check whether feed type is valid or not.',
'feed-unavailable' => 'This message is displayed when a user tries to use an RSS or Atom feed on a wiki where such feeds have been disabled.',
'site-rss-feed' => "Used in the HTML header of a wiki's RSS feed.
-$1 is <nowiki>{{SITENAME}}</nowiki>.
HTML markup cannot be used.
+
+Parameters:
+* $1 - <nowiki>{{SITENAME}}</nowiki>
{{Identical|S1 RSS/Atom feed}}",
'site-atom-feed' => "Used in the HTML header of a wiki's Atom feed.
-$1 is <nowiki>{{SITENAME}}</nowiki>.
HTML markup cannot be used.
+
+Parameters:
+* $1 - <nowiki>{{SITENAME}}</nowiki>
{{Identical|S1 RSS/Atom feed}}",
'page-rss-feed' => '{{Identical|S1 RSS/Atom feed}}',
'page-atom-feed' => '{{Identical|S1 RSS/Atom feed}}',
See also:
* {{msg-mw|Nstab-special}}
* {{msg-mw|Tooltip-ca-nstab-special}}
-{{Identical|Special pages}}',
+{{Identical|Special page}}',
'nstab-project' => 'The name for the tab of the project namespace. Example: [[Project:Example]]
See also:
# Main script and global functions
'nosuchaction' => 'The title of the error you get when trying to open a page with invalid "action" parameter. The text of the warning is the message {{msg-mw|nosuchactiontext}}.
-See example [//translatewiki.net/wiki/Main_page?action=x action=x].',
-'nosuchactiontext' => 'This error is shown when trying to open a page with invalid "action" parameter, e.g. [//translatewiki.net/wiki/Main_page?action=x action=x].
+See example [{{canonicalurl:Main_page|action=x}} action=x].',
+'nosuchactiontext' => 'This error is shown when trying to open a page with invalid "action" parameter, e.g. [{{canonicalurl:Main_page|action=x}} action=x].
* The title of this error is the message {{msg-mw|nosuchaction}}.',
'nosuchspecialpage' => 'The title of the error you get when trying to open a special page which does not exist. The text of the warning is the message {{msg-mw|nospecialpagetext}}. Example: [[Special:Nosuchpage]]',
'nospecialpagetext' => '{{doc-important|Link <code><nowiki>[[Special:SpecialPages|{{int:specialpages}}]]</nowiki></code> should remain untranslated.}}
'readonly' => 'Used as title of error message when database is locked.',
'enterlockreason' => 'For developers when locking the database',
'readonlytext' => 'Used as error message when the database is locked.',
-'missing-article' => "This message is shown when a revision does not exist, either as permalink or as diff. Examples:
-
-# [http://translatewiki.net/w/i.php?title=Project:News&oldid=9999999 Permalink with invalid revision#]
-# [http://translatewiki.net/w/i.php?title=Project:News&diff=426850&oldid=99999999 Diff with invalid revision#]
-
-'''Parameters'''
-* $1: Pagename
-* $2: Content of
+'missing-article' => 'This message is shown when a revision does not exist, either as permalink or as diff. Examples:
+# [{{canonicalurl:Project:News|oldid=9999999}} Permalink with invalid revision#]
+# [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]
+Parameters:
+* $1 - Pagename
+* $2 - Content of
*# {{msg-mw|Missingarticle-rev}} - Permalink with invalid revision#
-*# {{msg-mw|Missingarticle-diff}} - Diff with invalid revision#",
+*# {{msg-mw|Missingarticle-diff}} - Diff with invalid revision#',
'missingarticle-rev' => 'Parameter $2 of {{msg-mw|Missing-article}}: It is shown after the articlename.
-* $1: revision# of the requested id
+Parameters:
+* $1 - revision# of the requested id
-[http://translatewiki.net/w/i.php?title=Translating:Tasks&oldid=371789000 Click here] to see an example of such an error message.',
+[{{canonicalurl:Translating:Tasks|oldid=371789000}} Click here] to see an example of such an error message.',
'missingarticle-diff' => 'Parameter $2 of {{msg-mw|Missing-article}}: It is shown after the articlename.
-* $1: revision# of the old id
-* $2: revision# of the id build the diff with.
+Parameters:
+* $1 - revision# of the old id
+* $2 - revision# of the id build the diff with
-[http://translatewiki.net/w/i.php?title=Translating:Tasks&diff=372398&oldid=371789000 Click here] to see an example of such an error message.',
+[{{canonicalurl:Translating:Tasks|diff=372398&oldid=371789000}} Click here] to see an example of such an error message.',
'readonly_lag' => 'Error message displayed when the database is locked.',
'internalerror' => '{{Identical|Internal error}}',
'internalerror_info' => '* $1 - error message',
-'fileappenderrorread' => '"Append" is a computer procedure, explained on [http://en.wikipedia.org/wiki/Append Wikipedia].
-
-$1 is a filename, I think.',
+'fileappenderrorread' => '"Append" is a computer procedure, explained on [[w:Append|Wikipedia]]. Parameters:
+* $1 - probably filename',
'fileappenderror' => 'Parameters:
* $1 - file name
* $2 - file name',
* {{msg-mw|Bad-target-model}}',
'cannotdelete' => 'Error message in deleting. Parameters:
* $1 - page name or file name',
-'cannotdelete-title' => 'Title of error page when the user cannot delete a page
-* $1 is the page name',
+'cannotdelete-title' => 'Title of error page when the user cannot delete a page. Parameters:
+* $1 - the page name',
'delete-hook-aborted' => 'Error message shown when an extension hook prevents a page deletion, but does not provide an error message.',
'badtitle' => 'The page title when a user requested a page with invalid page name. The content will be {{msg-mw|badtitletext}}.',
'badtitletext' => 'The message shown when a user requested a page with invalid page name. The page title will be {{msg-mw|badtitle}}.
* {{msg-mw|immobile-source-namespace}}
* {{msg-mw|immobile-target-namespace-iw}}
* {{msg-mw|immobile-target-namespace}}',
-'perfcached' => 'Like {{msg-mw|perfcachedts}} but used when we do not know how long ago page was cached (unlikely to happen). Parameters:
-* $1 is the max result cut off ($wgQueryCacheLimit)',
+'perfcached' => 'Like {{msg-mw|perfcachedts}} but used when we do not know how long ago page was cached (unlikely to happen).
+
+Parameters:
+* $1 - the max result cut off ($wgQueryCacheLimit)',
'perfcachedts' => 'Used on pages that list page lists for which the displayed data is cached. Parameters:
-* $1 is a time stamp (date and time combined)
-* $2 is a date (optional)
-* $3 is a time (optional)
-* $4 is the cut off limit for cached results ($wgQueryCacheLimit). If there are more then this many results for the query, only the first $4 of those will be listed on the page. Usually $4 is about 1000.',
+* $1 - a time stamp (date and time combined)
+* $2 - a date (optional)
+* $3 - a time (optional)
+* $4 - the cut off limit for cached results ($wgQueryCacheLimit). If there are more then this many results for the query, only the first $4 of those will be listed on the page. Usually $4 is about 1000.',
'querypage-no-updates' => 'Text on some special pages, e.g. [[Special:FewestRevisions]].',
'wrong_wfQuery_params' => 'Used as error message.',
'viewsource' => 'The text displayed in place of the {{msg-mw|Edit}} tab when the user has no permission to edit the page.
* {{msg-mw|Accesskey-ca-viewsource}}
* {{msg-mw|Tooltip-ca-viewsource}}
{{Identical|View source}}',
-'viewsource-title' => 'Page title shown when trying to edit a protected page.
-* $1 is the name of the page',
+'viewsource-title' => 'Page title shown when trying to edit a protected page. Parameters:
+* $1 - the name of the page',
'actionthrottled' => 'This is the title of an error page. Read it in combination with {{msg-mw|actionthrottledtext}}.',
'actionthrottledtext' => 'Used as error message. Read it in combination with {{msg-mw|actionthrottled}}.',
'protectedpagetext' => "This message is displayed when trying to edit a page you can't edit because it has been protected.
* $2 - file repository name
* $3 - reason',
'invalidtitle-knownnamespace' => 'Displayed when an invalid title was encountered (generally in a list), but the namespace number is known to exist.
-* $1 is the namespace number
-* $2 is the namespace name in content language or {{msg-mw|blanknamespace}} for the main namespace
-* $3 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
-'invalidtitle-unknownnamespace' => 'Displayed when an invalid title was encountered (generally in a list) and the namespace number is unknown.
-* $1 is the namespace number
-* $2 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
+
+Parameters:
+* $1 - the namespace number
+* $2 - the namespace name in content language or {{msg-mw|blanknamespace}} for the main namespace
+* $3 - the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
+'invalidtitle-unknownnamespace' => 'Displayed when an invalid title was encountered (generally in a list) and the namespace number is unknown. Parameters:
+* $1 - the namespace number
+* $2 - the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
'exception-nologin' => 'Generic page title used on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.
{{Identical|Not logged in}}',
'exception-nologin-text' => 'Generic reason displayed on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.',
'virus-unknownscanner' => 'Used as error message. This message is followed by the virus scanner name.',
# Login and logout pages
-'logouttext' => 'Log out message
-* $1 is an URL to [[Special:Userlogin]] containing returnto and returntoquery parameters',
+'logouttext' => 'Log out message. Parameters:
+* $1 - an URL to [[Special:Userlogin]] containing <code>returnto</code> and <code>returntoquery</code> parameters',
'welcomeuser' => 'Text for a welcome heading that users see after registering a user account. $1 is the username of the new user. See [[bugzilla:42215]]',
'welcomecreation-msg' => 'A welcome message users see after registering a user account, following a welcomeuser heading. $1 is the username of the new user. Replaces welcomecreation in 1.21wmf5,see [[bugzilla:42215]]',
-'yourname' => "In user preferences
-
-<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.
-
+'yourname' => "{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
+In user preferences.
{{Identical|Username}}",
'yourpassword' => 'In user preferences
* {{msg-mw|Tooltip-pt-anonlogin}}
{{Identical|Log in}}",
'nav-login-createaccount' => "Shown to anonymous users in the upper right corner of the page. When you can't create an account, the message {{msg-mw|login}} is shown.
-{{identical|Log in / create account}}",
+{{Identical|Log in / create account}}",
'loginprompt' => 'A small notice in the log in form.',
'userlogin' => 'Name of special page [[Special:UserLogin]] where a user can log in or click to create a user account.
{{Identical|Log in / create account}}',
'notloggedin' => 'This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.
{{Identical|Not logged in}}',
-'nologin' => 'A message shown in the log in form. $1 is a link to the account creation form, and the text of it is "[[MediaWiki:Nologinlink/{{SUBPAGENAME}}|{{int:nologinlink}}]]".',
-'nologinlink' => 'Text of the link to the account creation form. Before that link, the message [[MediaWiki:Nologin/{{SUBPAGENAME}}]] appears.
+'nologin' => 'A message shown in the log in form. Parameters:
+* $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}',
+'nologinlink' => 'Text of the link to the account creation form. Before that link, the message {{msg-mw|Nologin}} appears.
{{Identical|Create an account}}',
-'createaccount' => 'The title of Special:CreateAccount, where users can register a new account. Used on Special:SpecialPages and on the submit button in the form where you register a new account.
+'createaccount' => 'The title of [[Special:CreateAccount]], where users can register a new account. Used on [[Special:SpecialPages]] and on the submit button in the form where you register a new account.
It is also used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
{{Identical|Create account}}',
'gotaccount' => 'A message shown in the account creation form.
* $1 - a link to the log in form, and the text of it is {{msg-mw|Gotaccountlink}}',
-'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message [[MediaWiki:Gotaccount/{{SUBPAGENAME}}]] appears.
-
+'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message {{msg-mw|Gotaccount}} appears.
{{Identical|Log in}}',
'userlogin-resetlink' => 'Used on the login page.',
'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
'noname' => 'Error message.',
'loginsuccesstitle' => 'The title of the page saying that you are logged in. The content of the page is the message {{msg-mw|Loginsuccess}}.
{{Identical|Login successful}}',
-'loginsuccess' => 'The content of the page saying that you are logged in. The title of the page is "[[MediaWiki:Loginsuccesstitle/{{SUBPAGENAME}}|{{int:loginsuccesstitle}}]]". $1 is the name of the logged in user.
+'loginsuccess' => 'The content of the page saying that you are logged in. The title of the page is {{msg-mw|Loginsuccesstitle}}.
-<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is supported.',
+Parameters:
+* $1 - the name of the logged in user
+{{Gender}}',
'nosuchuser' => 'Displayed when trying to log in with an unexisting username. When you are not allowed to create an account, the message {{msg-mw|nosuchusershort}} is displayed.',
'nosuchusershort' => "Displayed when trying to log in with a non-existant username. This message is only shown when you can't create an account, otherwise the message {{msg-mw|nosuchusershort}} is displayed.",
'nouserspecified' => 'Used as error message when username to fetch is not specified.',
* $3 is a password. Example: er##@fdas!
* $4 is a URL. Example: http://wiki.example.com
* $5 is a number of days in which the temporary password will expire',
-'noemail' => 'Shown as error message when trying to register a user sending password to e-mail adress and no e-mail address has been given. Registering users and sending a password to an e-mail address may require non-standard user rights ([http://translatewiki.net/w/i.php?title=Special:UserLogin&action=submitlogin&type=signup register user link]).
+'noemail' => 'Shown as error message when trying to register a user sending password to e-mail adress and no e-mail address has been given. Registering users and sending a password to an e-mail address may require non-standard user rights ([{{canonicalurl:Special:UserLogin|action=submitlogin&type=signup}} register user link]).
Parameters:
* $1 is a user name. This parameter can be used with GENDER.',
* $1 - password reminder resend time (in hours)',
'mailerror' => 'Used as error message in sending confirmation mail to user. Parameters:
* $1 - new mail address',
-'acct_creation_throttle_hit' => 'Errormessage at [[Special:CreateAccount]].
+'acct_creation_throttle_hit' => 'Error message at [[Special:CreateAccount]].
+
"in the last day" precisely means: during the lasts 86400 seconds (24 hours) ending right now.',
'emailauthenticated' => 'In user preferences ([[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}) and on [[Special:ConfirmEmail]].
-* $1: obsolete, date and time
-* $2: date
-* $3: time',
+Parameters:
+* $1 - obsolete, date and time
+* $2 - date
+* $3 - time',
'emailnotauthenticated' => 'Message in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. It appears after saving your e-mail address but before it has been authenticated.',
'noemailprefs' => "Message appearing in the 'E-mail options' section of the 'User profile' page in [[Special:Preferences|Preferences]], when no user e-mail address has been entered.",
'emailconfirmlink' => 'Link to [[Special:ConfirmEmail]]. Appears in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}} after saving your e-mail address but before it has been authenticated.',
{{Identical|Language}}',
'suspicious-userlogout' => 'Used when the logout request looks suspicious, in Special:UserLogout.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Used as error message when <code>mail()</code> returned empty error message.',
'user-mail-no-addy' => 'This is the error message in case an e-mail could not be sent because there was no e-mail address to send it to.',
'user-mail-no-body' => 'This is the error message in case an e-mail has an empty or unreasonably short body',
'resetpass-submit-loggedin' => 'Button on [[Special:ResetPass]] to submit new password.
{{Identical|Change password}}',
-'resetpass-submit-cancel' => '{{Identical|Cancel}}
-
-Used on [[Special:ResetPass]]',
+'resetpass-submit-cancel' => 'Used on [[Special:ResetPass]].
+{{Identical|Cancel}}',
'resetpass-wrong-oldpass' => 'Error message shown on [[Special:ChangePassword]] when the old password is not valid.',
'resetpass-temp-password' => 'The label of the input box for the temporary password (received by e-mail) on the form displayed after logging in with a temporary password.',
* $3 - the number of repetitions in $2
* $4 - base URL of the wiki',
'passwordreset-emailelement' => "This is a body of a reminder email to allow them into the system with a new password. Parameters:
-* $1 will be the user's login name. This parameter can be used for GENDER.
-* $2 will be the temporary password given by the system.",
+* $1 - the user's login name. This parameter can be used for GENDER.
+* $2 - the temporary password given by the system",
'passwordreset-emailsent' => 'Used in [[Special:PasswordReset]].
See also:
{{Identical|Italic text}}',
'link_sample' => 'This is the default text in the internal link that is created when you press the third button from the left on the edit toolbar (the "Ab" icon).',
-'link_tip' => '{{Identical|Internal link}}
-
-Tip for internal links',
+'link_tip' => 'Tip for internal links.
+{{Identical|Internal link}}',
'extlink_sample' => 'This message appears when clicking on the fourth button of the edit toolbar. You can translate "link title". Because many of the localisations had urls that went to domains reserved for advertising, it is recommended that the link is left as-is. All customised links were replaced with the standard one, that is reserved in the standard and will never have ads or something.',
'extlink_tip' => 'This is the tip that appears when you hover the mouse over the fourth button from the left on the edit toolbar.
See also:
* {{msg-mw|Showpreview}}
* {{msg-mw|Accesskey-preview}}
-* {{msg-mw|Tooltip-preview}}',
+* {{msg-mw|Tooltip-preview}}
+{{Identical|Show preview}}',
'showlivepreview' => 'An edit preview without needing to reload the edit form.',
'showdiff' => 'Button below the edit page. See also {{msg|showpreview}} and {{msg|savearticle}} for the other buttons.
'blockedtitle' => 'Used as title displayed for blocked users. The corresponding message body is one of the following messages:
* {{msg-mw|Blockedtext|notext=1}}
* {{msg-mw|Autoblockedtext|notext=1}}',
-'blockedtext' => 'Text displayed to blocked users.
-
-Parameters:
-* <tt>$1</tt> is the blocking sysop (with a link to his/her userpage)
-* <tt>$2</tt> is the reason for the block
-* <tt>$3</tt> is the current IP address of the blocked user
-* <tt>$4</tt> is the blocking sysop’s username (plain text, without the link)
-* <tt>$5</tt> is the unique numeric identifier of the applied autoblock
-* <tt>$6</tt> is the expiry of the block
-* <tt>$7</tt> is the intended target of the block (what the blocking user specified in the blocking form)
-* <tt>$8</tt> is the timestamp when the block started',
-'autoblockedtext' => 'Text displayed to automatically blocked users.
-
-Parameters:
-* <tt>$1</tt> is the blocking sysop (with a link to his/her userpage)
-* <tt>$2</tt> is the reason for the block
-* <tt>$3</tt> is the current IP address of the blocked user
-* <tt>$4</tt> is the blocking sysop’s username (plain text, without the link). Use it for GENDER.
-* <tt>$5</tt> is the unique numeric identifier of the applied autoblock
-* <tt>$6</tt> is the expiry of the block
-* <tt>$7</tt> is the intended target of the block (what the blocking user specified in the blocking form)
-* <tt>$8</tt> is the timestamp when the block started',
+'blockedtext' => "Text displayed to blocked users. Parameters:
+* $1 - the blocking sysop (with a link to his/her userpage)
+* $2 - the reason for the block
+* $3 - the current IP address of the blocked user
+* $4 - the blocking sysop's username (plain text, without the link)
+* $5 - the unique numeric identifier of the applied autoblock
+* $6 - the expiry of the block
+* $7 - the intended target of the block (what the blocking user specified in the blocking form)
+* $8 - the timestamp when the block started",
+'autoblockedtext' => "Text displayed to automatically blocked users. Parameters:
+* $1 - the blocking sysop (with a link to his/her userpage)
+* $2 - the reason for the block
+* $3 - the current IP address of the blocked user
+* $4 - the blocking sysop's username (plain text, without the link). Use it for GENDER.
+* $5 - the unique numeric identifier of the applied autoblock
+* $6 - the expiry of the block
+* $7 - the intended target of the block (what the blocking user specified in the blocking form)
+* $8 - the timestamp when the block started",
'blockednoreason' => 'Substituted with <code>$2</code> in the following message if the reason is not given:
* {{msg-mw|cantcreateaccount-text}}.
{{Identical|No reason given}}',
'loginreqtitle' => 'Used as title of error message.
See also:
-* {{msg-mw|permissionserrors}}',
+* {{msg-mw|permissionserrors}}
+{{Identical|Login required}}',
'loginreqlink' => 'Take a look on inflection. Used as parameter in {{msg-mw|loginreqpagetext}}, {{msg-mw|whitelistedittext}}, {{msg-mw|watchlistanontext}} and {{msg-mw|Confirmemail needlogin}}.
{{Identical|Log in}}',
'noarticletext-nopermission' => 'See also {{msg-mw|Noarticletext}}.',
'missing-revision' => 'Text displayed when the requested revision does not exist using a permalink.
-Example: [http://translatewiki.net/w/i.php?title=Project:News&oldid=9999999 Permalink with invalid revision#]
+Example: [{{canonicalurl:Project:News|oldid=9999999}} Permalink with invalid revision#]
* $1 is the ID of the missing revision',
'userpage-userdoesnotexist' => 'Error message displayed when trying to edit or create a page or a subpage that belongs to a user who is not registered on the wiki. Parameters:
* $1 is a possible username that has not been registered.',
-'userpage-userdoesnotexist-view' => 'Shown in user pages of non existing users. See for example [http://translatewiki.net/wiki/User:Foo User:Foo]. Parameters:
+'userpage-userdoesnotexist-view' => 'Shown in user pages of non existing users. See for example [{{canonicalurl:User:Foo}} User:Foo]. Parameters:
* $1 is a username.',
'blocked-notice-logextract' => 'Parameters:
* $1 is the name of the blocked user (optional). Can be used for GENDER.',
See also:
* {{msg-mw|Nocreatetext}}',
-'sectioneditnotsupported-title' => 'Page title of special page, which presumably appears when someone tries to edit a section, and section editing is disabled. Explanation of section editing on [http://meta.wikimedia.org/wiki/Help:Section_editing#Section_editing meta].',
-'sectioneditnotsupported-text' => 'I think this is the text of an error message, which presumably appears when someone tries to edit a section, and section editing is disabled. Explanation of section editing on [http://meta.wikimedia.org/wiki/Help:Section_editing#Section_editing meta].',
+'sectioneditnotsupported-title' => 'Page title of special page, which presumably appears when someone tries to edit a section, and section editing is disabled. Explanation of section editing on [[meta:Help:Section_editing#Section_editing|meta]].',
+'sectioneditnotsupported-text' => 'I think this is the text of an error message, which presumably appears when someone tries to edit a section, and section editing is disabled. Explanation of section editing on [[meta:Help:Section_editing#Section_editing|meta]].',
'permissionserrors' => 'Used as title of error message.
See also:
Please report at [[Support]] if you are unable to properly translate this message. Also see [[bugzilla:14246]]',
'recreate-moveddeleted-warn' => 'Warning shown when creating a page which has already been deleted. See for example [[Test]].',
-'moveddeleted-notice' => 'Shown on top of a deleted page in normal view modus ([http://translatewiki.net/wiki/Test example]).',
+'moveddeleted-notice' => 'Shown on top of a deleted page in normal view modus ([{{canonicalurl:Test}} example]).',
'log-fulllog' => 'Used as link text.',
'edit-hook-aborted' => 'Used as error message.
* {{msg-mw|edit-gone-missing}}
* {{msg-mw|edit-conflict}}
* {{msg-mw|edit-no-change}}',
-'defaultmessagetext' => 'Caption above the default message text shown on the left-hand side of a diff displayed after clicking “Show changes” when creating a new page in the MediaWiki: namespace',
+'defaultmessagetext' => 'Caption above the default message text shown on the left-hand side of a diff displayed after clicking "Show changes" when creating a new page in the MediaWiki: namespace',
'content-failed-to-parse' => "Error message indicating that the page's content can not be saved because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.
*$1 – content model ({{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}})
*$2 – content format as MIME type (e.g. <tt>text/css</tt>)
*$3 – specific error message",
'invalid-content-data' => "Error message indicating that the page's content can not be saved because it is invalid. This may occurr for content types with internal consistency constraints.",
'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
-* $1 is the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
-* $2 is the title of the page in question.',
+* $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
+* $2 - the title of the page in question',
# Content models
'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
* {{msg-mw|Post-expand-template-argument-warning}}',
'parser-template-loop-warning' => '* $1 - page title',
'parser-template-recursion-depth-warning' => '* $1 - limit value of recursion depth',
-'language-converter-depth-warning' => 'Error message shown when a page uses too deeply nested language conversion syntax
-
-* <tt>$1</tt> is the value of the depth limit',
+'language-converter-depth-warning' => 'Error message shown when a page uses too deeply nested language conversion syntax. Parameters:
+* $1 - the value of the depth limit',
'node-count-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.',
-'node-count-exceeded-warning' => 'Error message shown when a page exceeded the node-count limit of the preprocessor
-
-* <tt>$1</tt> is the value of the node-count limit
-* <tt>$2</tt> is the value of the max node-count limit',
-'expansion-depth-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the [http://meta.wikimedia.org/wiki/Help:Expansion_depth expansion depth] of the preprocessor exceeds the limit.',
-'expansion-depth-exceeded-warning' => 'Error message shown when a page exceeded the [http://meta.wikimedia.org/wiki/Help:Expansion_depth expansion depth limit] of the preprocessor
+'node-count-exceeded-warning' => 'Error message shown when a page exceeded the node-count limit of the preprocessor. Parameters:
+* $1 - the value of the node-count limit
+* $2 - the value of the max node-count limit',
+'expansion-depth-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the [[meta:Help:Expansion_depth|expansion depth]] of the preprocessor exceeds the limit.',
+'expansion-depth-exceeded-warning' => 'Error message shown when a page exceeded the [[meta:Help:Expansion_depth|expansion depth limit]] of the preprocessor. Parameters:
+* $1 - the value of the depth limit
+* $2 - the value of the max depth limit',
+'parser-unstrip-loop-warning' => '{{Doc-important|Do not translate function name "<code>unstrip</code>".}}
+This error is shown when a parser extension tag such as <pre> includes a reference to itself in its own output.
-* <tt>$1</tt> is the value of the depth limit
-* <tt>$2</tt> is the value of the max depth limit',
-'parser-unstrip-loop-warning' => 'This error is shown when a parser extension tag such as <pre> includes a reference to itself in its own output.
The reference must be to the exact same invocation of the tag at the same location in the source, merely writing <pre><pre></pre></pre> will not do it.
+
This is usually impossible and unlikely to happen by accident, so translation is not essential.
-"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above. See also:
+
+"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.
+
+See also:
*{{msg-mw|Parser-unstrip-recursion-limit}}',
-'parser-unstrip-recursion-limit' => 'This message is shown when the recursion limit for nested parser extension tags is exceeded.
+'parser-unstrip-recursion-limit' => '{{doc-important|Do not translate function name "<code>unstrip</code>".}}
+This message is shown when the recursion limit for nested parser extension tags is exceeded.
+
This warning may be encountered due to input text like <ref><ref><ref>...</ref></ref></ref>.
-* <tt>$1</tt> is the depth limit
+Parameters:
+* $1 - the depth limit
+
+"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.
-"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above. See also:
-*{{msg-mw|Parser-unstrip-loop-warning}}',
+See also:
+* {{msg-mw|Parser-unstrip-loop-warning}}',
'converter-manual-rule-error' => "This message is shown when a manual conversion rule for the language converter has errors. For example it's not using the correct syntax, or not supplying text in all variants.",
# "Undo" feature
* $2 is a date (optional)
* $3 is a time (optional)',
'revisionasof' => 'Used on a difference page when comparing different versions of a page or when viewing an non-current version of a page. See {{msg-mw|Currentrev-asof}} for the message for the current version.
-* $1 is the date/time at which the revision was created. Example: "\'\'Revision as of 14:44, 24 January 2008\'\'".
-* $2 is the date at which the revision was created.
-* $3 is the time at which the revision was created.',
+* $1 - the date/time at which the revision was created. Example: "\'\'Revision as of 14:44, 24 January 2008\'\'".
+* $2 - the date at which the revision was created
+* $3 - the time at which the revision was created',
'revision-info' => 'Appears just below the page title when an old version of the page is being viewed.
-* $1: date and time of revision
-* $2: a series of links: to author of the revision, his talk page, etc.
-* (optional) $3: revision ID
-* (optional) $4: date of revision
-* (optional) $5: time of revision
-* (optional) $6: author of revision, for GENDER use',
+Parameters:
+* $1 - date and time of revision
+* $2 - a series of links: to author of the revision, his talk page, etc.
+* $3 - (Optional) revision ID
+* $4 - (Optional) date of revision
+* $5 - (Optional) time of revision
+* $6 - (Optional) author of revision, for GENDER use',
'previousrevision' => 'See also:
* {{msg-mw|Nextrevision}}',
'nextrevision' => 'See also:
'revdelete-nologid-text' => 'See also:
* {{msg-mw|Revdelete-nologid-title}}',
'revdelete-no-file' => 'Used as error message in [[Special:RevisionDelete]].',
-'revdelete-show-file-confirm' => 'A confirmation message shown on Special:Revisiondelete when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
+'revdelete-show-file-confirm' => 'A confirmation message shown on [[Special:Revisiondelete]] when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
-* <code>$1</code> is a file name
-* <code>$2</code> is a date
-* <code>$3</code> is a time
-
-{{identical|Are you sure you want to view the deleted revision of the file...}}',
+Parameters:
+* $1 - a file name
+* $2 - a date
+* $3 - a time
+{{Identical|Are you sure you want to view the deleted revision of the file...}}',
'revdelete-show-file-submit' => 'Reply to {{msg-mw|Revdelete-show-file-confirm}}.
{{Identical|Yes}}',
'revdel-restore-deleted' => '{{RevisionDelete}}',
'revdel-restore-visible' => '{{RevisionDelete}}',
'pagehist' => '{{RevisionDelete}}
-
-Links to page history at Special:RevisionDelete header together with links to the logs and Special:Undelete.',
+Links to page history at Special:RevisionDelete header together with links to the logs and [[Special:Undelete]].
+{{Identical|Page history}}',
'deletedhist' => '{{RevisionDelete}}
-Links to Special:Undelete at Special:RevisionDelete header together with links to the logs and page history.',
+Links to [[Special:Undelete]] at [[Special:RevisionDelete]] header together with links to the logs and page history.',
'revdelete-hide-current' => '{{RevisionDelete}}
Parameters:
* $1 is a date
Please note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.",
'revertmerge' => 'Used as link text',
-'mergelogpagetext' => 'Description of the [http://translatewiki.net/w/i.php?title=Special%3ALog&type=merge&user=&page=&year=&month=-1 merge log], on the log. The associated [[Special:MergeHistory|Merge]] special page is not enabled by default.',
+'mergelogpagetext' => 'Description of the [{{canonicalurl:Special:Log|type=merge&user=&page=&year=&month=-1}} merge log], on the log. The associated [[Special:MergeHistory|Merge]] special page is not enabled by default.',
# Diffs
'history-title' => 'Displayed as page title when you click on the "history" tab. The parameter $1 is the normal page title.',
*Parameter $1 is the number of revisions
*Parameter $2 is the number of distinct users who made those revisions",
'diff-multi-manyusers' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions have been edited by more than 100 users. Parameters:
-* $1 is the number of revisions, will always be 101 or more.
-* $2 is the number of users that were found, which was limited at 100.",
+* $1 - the number of revisions, will always be 101 or more
+* $2 - the number of users that were found, which was limited at 100",
'difference-missing-revision' => 'Text displayed when the requested revision does not exist using a diff link.
-Example: [http://translatewiki.net/w/i.php?title=Project:News&diff=426850&oldid=99999999 Diff with invalid revision#]
+Example: [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]
* $1 is the list of missing revisions IDs
* $2 is the number of items in $1 (one or two)',
* $1 - prefix string',
'searchprofile-articles' => "A quick link in the advanced search box on [[Special:Search]]. Clicking on this link starts a search in the content pages of the wiki.
-A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
+A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].
Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
* {{msg-mw|Searchprofile-advanced|message}}
* {{msg-mw|Searchprofile-advanced-tooltip|tooltip}}',
'search-result-size' => 'Shown per line of a [[Special:Search|search result]]
-* $1 is the size of the page in bytes, but no need to add "byte" or similar as the unit is added by special function.
-* $2 is the sum of all words in this page.',
+* $1 - the size of the page in bytes, but no need to add "byte" or similar as the unit is added by special function
+* $2 - the sum of all words in this page',
'search-result-category-size' => '* $1 - number of members in this category. $1 is equal to $2+$3.
* $2 - number of subcategories
* $3 - number of files',
'search-relatedarticle' => 'This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is "More Like This" functionality. Microsoft glossary defines MLT as "A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry."[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]
{{Identical|Related}}',
'mwsuggest-disable' => "The text of an option on the 'search options' tab of a user's Preferences.",
-'searcheverything-enable' => 'Used in [[Special:Preferences]], tab “Search”.',
+'searcheverything-enable' => 'Used in [[Special:Preferences]], tab "Search".',
'searchrelated' => 'This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is "More Like This" functionality. Microsoft glossary defines MLT as "A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry."[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]
{{Identical|Related}}',
'searchall' => '{{Identical|All}}',
'showingresults' => 'This message is used on some special pages such as [[Special:WantedCategories]]. Parameters:
-*$1 is the total number of results in the batch shown.
-*$2 is the number of the first item listed.
+* $1 - the total number of results in the batch shown
+* $2 - the number of the first item listed
See also:
* {{msg-mw|Showingresultsnum}}',
'showingresultsnum' => 'Parameters:
'powersearch-ns' => 'Used in the extended search form at [[Special:Search]]',
'powersearch-redir' => 'Used in the extended search form at [[Special:Search]]',
'powersearch-field' => 'Used in the extended search form at [[Special:Search]]',
-'powersearch-togglelabel' => 'Used in [http://translatewiki.net/w/i.php?title=Special:Search&advanced=1 Advanced search]. Synonym: "Select" as verb.',
-'powersearch-toggleall' => '"All" refers to namespaces. It is used in Advanced search: http://translatewiki.net/w/i.php?title=Special:Search&advanced=1
+'powersearch-togglelabel' => 'Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: "Select" as verb.',
+'powersearch-toggleall' => '"All" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}
{{Identical|All}}',
-'powersearch-togglenone' => '"None" refers to namespaces. It is used in Advanced search: http://translatewiki.net/w/i.php?title=Special:Search&advanced=1
+'powersearch-togglenone' => '"None" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}
{{Identical|None}}',
'search-external' => 'Legend of the fieldset for the input form when the internal search is disabled. Inside the fieldset [[MediaWiki:Searchdisabled]] and [[MediaWiki:Googlesearch]] is shown.',
'searchdisabled' => '{{doc-singularthey}}
'qbsettings-directionality' => '"Fixed", as in the position "fixed left or right". For left-to-right languages, the quickbar will be positioned at the left, for right-to-left languages at the right.',
# Preferences page
-'preferences' => 'Title of the Special:Preferences page.
-
+'preferences' => 'Title of the [[Special:Preferences]] page.
{{Identical|Preferences}}',
-'mypreferences' => 'Action link label that leads to Special:Preferences; appears in the top menu (e.g. "Username Talk Preferences Watchlist Contributions Log out").
+'mypreferences' => 'Action link label that leads to [[Special:Preferences]]; appears in the top menu (e.g. "Username Talk Preferences Watchlist Contributions Log out").
See also:
* {{msg-mw|Mypreferences}}
{{Related|Timezoneregion}}',
'allowemail' => 'Used in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
'prefs-searchoptions' => '{{Identical|Search}}',
-'prefs-namespaces' => "{{Identical|Namespaces}}
-Shown as legend of the second fieldset of the tab 'Search' in [[Special:Preferences]]",
+'prefs-namespaces' => "Shown as legend of the second fieldset of the tab 'Search' in [[Special:Preferences]]
+{{Identical|Namespaces}}",
'defaultns' => 'Used in [[Special:Preferences]], tab "Search".',
'default' => '{{Identical|Default}}',
-'prefs-files' => 'Title of a tab in [[Special:Preferences]].',
+'prefs-files' => 'Title of a tab in [[Special:Preferences]].
+{{Identical|File}}',
'prefs-custom-css' => 'visible on [[Special:Preferences]] -[Skins].',
'prefs-custom-js' => 'visible on [[Special:Preferences]] -[Skins].',
'prefs-common-css-js' => 'Used as label in [[Special:Preferences#mw-prefsection-rendering|preferences]], tab "Appearance", section "Skin".',
'prefs-reset-intro' => 'Used in [[Special:Preferences/reset]].',
'prefs-emailconfirm-label' => 'Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
'prefs-textboxsize' => "Header for the box specifying the size of the editing window, displayed on the 'editing' tab of the [[Special:Preferences|user preferences]] special page.",
-'youremail' => 'Label of the e-mail text box of the "E-mail options" section of "Special:Preferences".
-
+'youremail' => 'Label of the e-mail text box of the "E-mail options" section of [[Special:Preferences]].
{{Identical|E-mail}}',
'username' => 'Username field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).
* {{msg-mw|prefs-help-email-others|help}}
* {{msg-mw|prefs-changeemail|link title}}
* {{msg-mw|prefs-setemail|link title}}',
-'prefs-info' => "Header for the box giving basic information on the user account, displayed on the 'user profile' tab of the [[Special:Preferences|user preferences]] special page.",
+'prefs-info' => "Header for the box giving basic information on the user account, displayed on the 'user profile' tab of the [[Special:Preferences|user preferences]] special page.
+{{Identical|Basic information}}",
'prefs-i18n' => 'Field set legend for user preferences regarding the interface language',
'prefs-signature' => '{{Identical|Signature}}',
'prefs-dateformat' => 'Used in [[Special:Preferences#mw-prefsection-datetime|Special:Preferences]], tab "Date and time".
* {{msg-mw|Prefs-watchlist-edits}}',
'prefs-diffs' => 'Used in [[Special:Preferences]], tab "Misc".',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.',
'email-address-validity-invalid' => 'Used as warning for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is invalid.',
'userrights-groupsmember' => 'Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.
Parameters:
-* $1 - the number of items in the list following the message, for PLURAL.
-* $2 - the user name, for GENDER.',
+* $1 - the number of items in the list following the message, for PLURAL
+* $2 - the user name, for GENDER',
'userrights-groupsmember-auto' => 'Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.
"Implicit" is for groups that the user was automatically added to (such as "autoconfirmed"); cf. {{msg-mw|userrights-groupsmember}}
Parameters
-* $1 - the number of items in the list following the message, for PLURAL.
-* $2 - the user name, for GENDER.',
+* $1 - the number of items in the list following the message, for PLURAL
+* $2 - the user name, for GENDER',
'userrights-groupsmember-type' => '{{optional}}
Parameters:
* $1 is list of group names.
{{Identical|Reason}}',
'userrights-no-interwiki' => 'Error message when editing user groups',
'userrights-nodatabase' => 'Error message when editing user groups. "Local" means databases/wikis of the same farm/cluster; that is, meta, enwiki, dewiki, commons, etc are all local databases of the Wikimedia Foundation.
-See http://meta.wikimedia.org/w/index.php?title=Special%3ALog&type=rights for a usage of local databases: username@barwiki',
+See [{{canonicalurl:meta:Special:Log|type=rights}} meta:Special:Log?type=rights] for a usage of local databases: username@barwiki',
'userrights-nologin' => "Error displayed on [[Special:UserRights]] when you aren't logged in. If you are logged in, but don't have the correct permission, you see {{msg|userrights-notallowed|pl=yes}}.",
'userrights-notallowed' => "Error displayed on [[Special:UserRights]] when you don't have the permission.",
'userrights-changeable-col' => 'Used when editing user groups in [[Special:Userrights]]. The message is the head of a column of group assignements.
'action-upload_by_url' => '{{Doc-action|upload by url}}',
'action-writeapi' => '{{Doc-action|writeapi}}
-API is an abbreviation for [http://en.wikipedia.org/wiki/API application programming interface].',
+API is an abbreviation for [[w:API|application programming interface]].',
'action-delete' => '{{Doc-action|delete}}',
'action-deleterevision' => '{{Doc-action|deleterevision}}',
'action-deletedhistory' => '{{Doc-action|deletedhistory}}',
{{Identical|Recent changes}}',
'recentchanges-legend' => 'Legend of the fieldset of [[Special:RecentChanges]]',
'recentchanges-summary' => 'Summary of [[Special:RecentChanges]].',
-'recentchanges-feed-description' => 'Used in feed of RecentChanges. See example [http://translatewiki.net/w/i.php?title=Special:RecentChanges&feed=atom feed].',
+'recentchanges-feed-description' => 'Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].',
'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
'recentchanges-label-minor' => 'Tooltip for {{msg-mw|minoreditletter}}',
'recentchanges-label-bot' => 'Tooltip for {{msg-mw|boteditletter}}',
* {{msg-mw|Filesource}}
{{Identical|Summary}}',
'fileuploadsummary' => '{{Identical|Summary}}',
-'filereuploadsummary' => 'Label of textearea in Special:Upload when uploading a new version of existing file.',
+'filereuploadsummary' => 'Label of textearea in [[Special:Upload]] when uploading a new version of existing file.',
'filestatus' => 'Used as section header in [[Special:Upload]].
See also:
* {{msg-mw|http-invalid-url}}
* {{msg-mw|upload-copy-upload-invalid-domain}}
* {{msg-mw|tmp-create-error}}',
-'large-file' => 'Variables $1 and $2 have appropriate unit symbols already. See for example [[Mediawiki:size-kilobytes]].',
+'large-file' => 'Variables $1 and $2 have appropriate unit symbols already. See for example {{msg-mw|Size-kilobytes}}.',
'largefileserver' => 'Error message when uploading a file whose size is larger than the maximum allowed',
'emptyfile' => 'Error message when trying to upload an empty file',
'windows-nonascii-filename' => 'Used as error message when uploading a file.
* {{msg-mw|hookaborted}}
* {{msg-mw|filename-toolong}}
* {{msg-mw|unknown-error}}',
-'fileexists' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}",
+'fileexists' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
+Parameters:
+* $1 - name of the existing file",
'filepageexists' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
-Shown on [[Special:Upload]], $1 is link to the page. This message is displayed if a description page exists, but a file with the same name does not yet exists, and a user tries to upload a file with that name. In that case the description page is not changed, even if the uploading user specifies a description with the upload.",
-'fileexists-extension' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}",
-'fileexists-thumbnail-yes' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}",
-'file-thumbnail-no' => 'Error message at [[Special:Upload]]',
-'fileexists-forbidden' => "{{doc-important|''thumb'' and ''center'' are magic words. Leave it untranslated!}}",
+Shown on [[Special:Upload]]. Parameters:
+* $1 - link to the page
+This message is displayed if a description page exists, but a file with the same name does not yet exists, and a user tries to upload a file with that name. In that case the description page is not changed, even if the uploading user specifies a description with the upload.",
+'fileexists-extension' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
+Parameters:
+* $1 - name of the uploading file
+* $2 - name of the existing file",
+'fileexists-thumbnail-yes' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
+Parameters:
+* $1 - name of thumbnail file",
+'file-thumbnail-no' => 'Error message at [[Special:Upload]]. Parameters:
+* $1 - String (e.g. "180px-")',
+'fileexists-forbidden' => "{{doc-important|''thumb'' and ''center'' are magic words. Leave it untranslated!}}
+Parameters:
+* $1 - name of the existing file",
'fileexists-shared-forbidden' => "{{doc-important|''thumb'' and ''center'' are magic words. Leave it untranslated!}}
-Error message at [[Special:Upload]]",
+Error message at [[Special:Upload]].
+Parameters:
+* $1 - name of the existing file",
'file-exists-duplicate' => 'Used as warning in [[Special:Upload]].
This message is followed by the gallery of the duplicate files.
'savefile' => 'When uploading a file',
'uploadedimage' => 'This is the text of an entry in the [[Special:Log|upload log]] (and Recent Changes), after hour (and date, only in the Upload log) and user name. $1 is the name of the file uploaded.',
'overwroteimage' => 'This is the text of an entry in the [[Special:Log|upload log]] (and Recent Changes), after hour (and date, only in the Upload log) and user name. $1 is the name of the file uploaded.',
-'uploaddisabled' => 'Title of the Special:Upload page when upload is disabled.
+'uploaddisabled' => 'Title of the [[Special:Upload]] page when upload is disabled.
See also:
* {{msg-mw|Copyuploaddisabled}}',
'copyuploaddisabled' => 'See also:
* {{msg-mw|Uploaddisabled}}',
-'uploaddisabledtext' => 'This message can have parameter $1, which contains the name of the target file. See r22243 and [https://bugzilla.wikimedia.org/show_bug.cgi?id=8818 bug 8818].',
+'uploaddisabledtext' => 'This message can have parameter $1, which contains the name of the target file. See r22243 and [[bugzilla:8818|bug 8818]].',
'php-uploaddisabledtext' => 'This means that file uploading is disabled in PHP, not upload of PHP-files.',
'uploadscripted' => 'Used as error message when uploading a file.
'upload-proto-error' => 'See also:
* {{msg-mw|Upload-proto-error|title}}
* {{msg-mw|Upload-proto-error-text|text}}',
-'upload-proto-error-text' => '"Remote upload" is explained on [http://en.wikipedia.org/wiki/Uploading_and_downloading#Remote_upload Wikipedia].
+'upload-proto-error-text' => '"Remote upload" is explained on [[w:Uploading_and_downloading#Remote_upload|Wikipedia]].
See also:
* {{msg-mw|Upload-proto-error|title}}
'backend-fail-alreadyexists' => 'Parameters:
* $1 is a filename.',
'backend-fail-store' => 'Parameters:
-* $1 is a filename
-* $2 is a storage path.',
+* $1 - a filename
+* $2 - a storage path',
'backend-fail-copy' => 'Parameters:
-* $1 is a file path
-* $2 is a file path.',
+* $1 - a file path
+* $2 - a file path',
'backend-fail-move' => 'Parameters:
-* $1 is a file path
-* $2 is a file path.',
+* $1 - a file path
+* $2 - a file path',
'backend-fail-opentemp' => 'Used as error message.
{{Related|Backend-fail}}',
'backend-fail-writetemp' => 'Used as error message.
'backend-fail-contenttype' => '$1 is a storage (file) path',
'backend-fail-batchsize' => 'Error message when the limit of operations to be done at once in the file backend was reached.
Parameters:
-* $1 is the number of operations attempted at once in this case.
-* $2 is the maximum number of operations that can be attempted at once.
+* $1 - the number of operations attempted at once in this case
+* $2 - the maximum number of operations that can be attempted at once
A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
'backend-fail-usable' => 'Parameters:
'lockmanager-fail-closelock' => 'Parameters:
* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").
-A "[http://en.wikipedia.org/wiki/File_locking#Lock_files lock file]" signals by its presence that some resource is locked.',
+A "[[w:File_locking#Lock_files|lock file]]" signals by its presence that some resource is locked.',
'lockmanager-fail-deletelock' => 'Parameters:
* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").
-A "[http://en.wikipedia.org/wiki/File_locking#Lock_files lock file]" signals by its presence that some resource is locked.',
+A "[[w:File_locking#Lock_files|lock file]]" signals by its presence that some resource is locked.',
'lockmanager-fail-acquirelock' => 'Parameters:
* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").',
'lockmanager-fail-openlock' => 'Parameters:
* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").
-A "[http://en.wikipedia.org/wiki/File_locking#Lock_files lock file]" signals by its presence that some resource is locked.',
+A "[[w:File_locking#Lock_files|lock file]]" signals by its presence that some resource is locked.',
'lockmanager-fail-releaselock' => 'Parameters:
* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").',
'lockmanager-fail-db-bucket' => 'The databases store what is locked by who. Parameters:
* {{msg-mw|Http-request-error}}
* {{msg-mw|Http-read-error}}
* {{msg-mw|Http-timed-out|28}}',
-'http-bad-status' => '$1 is an HTTP error code (e.g. 404), $2 is the HTTP error message (e.g. File Not Found)',
+'http-bad-status' => 'Parameters:
+* $1 - an HTTP error code (e.g. 404)
+* $2 - the HTTP error message (e.g. File Not Found)',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'See also:
* {{msg-mw|Upload-curl-error28|title}}
* {{msg-mw|Upload-curl-error28-text|body}}',
-'license' => 'This appears in the upload form for the license drop-down. The header in the file description page is now at {{msg-mw|License-header}}.',
+'license' => 'This appears in the upload form for the license drop-down. The header in the file description page is now at {{msg-mw|License-header}}.
+{{Identical|Licensing}}',
'license-header' => 'Used as section header in [[Special:Upload]].
See also:
* {{msg-mw|Filedesc}}
* {{msg-mw|Filestatus}}
-* {{msg-mw|Filesource}}',
+* {{msg-mw|Filesource}}
+{{Identical|Licensing}}',
'nolicense' => '{{Identical|None selected}}',
'license-nopreview' => 'Error message when a certain license does not exist',
'upload_source_url' => 'Used in [[Special:Upload]].
{{Identical|Size}}',
'listfiles_description' => 'Column header for the result table displayed on [[Special:ListFiles]].
{{Identical|Description}}',
-'listfiles_count' => 'One of the table column headers in [[Special:Listfiles]] denoting the amount of saved versions of that file.',
+'listfiles_count' => 'One of the table column headers in [[Special:Listfiles]] denoting the amount of saved versions of that file.
+{{Identical|Version}}',
# File description page
'file-anchor-link' => '{{Identical|File}}',
* Parameter $1 is the number of pages that link to the file/image.',
'linkstoimage-more' => 'Shown on an image description page when a file is used/linked more than 100 times on other pages.
-* $1: limit. At the moment hardcoded at 100
-* $2: filename',
+Parameters:
+* $1 - limit. At the moment hardcoded at 100
+* $2 - filename',
'nolinkstoimage' => 'Displayed on image description pages, see for exampe [[:Image:Tournesol.png#filelinks]].',
'morelinkstoimage' => '{{doc-important|Do not translate "Special:WhatLinksHere"}}
Parameters:
* $1 - page title',
'linkstoimage-redirect' => 'Item in the "the following pages link to this file" section on a file page if the item is a redirect.
-* $1: an HTML link to the file
-* $2: the list of files that link to the redirect (may be empty)',
-'duplicatesoffile' => 'Shown on file description pages when a file is duplicated
-* $1: Number of identical files
-* $2: Name of the shown file to link to the special page "FileDuplicateSearch"',
-'sharedupload' => 'Shown on an image description page when it is used in a central repository (i.e. [http://commons.wikimedia.org/ Commons] for Wikimedia wikis).
+Parameters:
+* $1 - an HTML link to the file
+* $2 - the list of files that link to the redirect (may be empty)',
+'duplicatesoffile' => 'Shown on file description pages when a file is duplicated. Parameters:
+* $1 - Number of identical files
+* $2 - Name of the shown file to link to the special page [[Special:FileDuplicateSearch]]',
+'sharedupload' => 'Shown on an image description page when it is used in a central repository (i.e. [[commons:|Commons]] for Wikimedia wikis).
* $1 is the name of the shared repository. On Wikimedia sites, $1 is {{msg-mw|shared-repo-name-shared}}. The default value for $1 is {{msg-mw|shared-repo}}.
'statistics-header-hooks' => 'Header of a section on [[Special:Statistics]] containing data provided by MediaWiki extensions',
'statistics-articles' => "Used in [[Special:Statistics]].
-A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
+A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].
Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
'statistics-edits-average' => 'Used in [[Special:Statistics]]',
'statistics-views-total' => 'Used in [[Special:Statistics]]',
'statistics-views-peredit' => 'Used in [[Special:Statistics]]',
-'statistics-users' => 'Used in [[Special:Statistics]]. Do not change "Special:ListUsers"!',
+'statistics-users' => '{{doc-important|Do not translate "Special:ListUsers"}}
+Used in [[Special:Statistics]].',
'statistics-users-active' => 'Used in [[Special:Statistics]]',
-'statistics-users-active-desc' => "Description shown beneath ''Active users'' in [[Special:Statistics]]
-
-* \$1: Value of \$wgRCMaxAge in days",
+'statistics-users-active-desc' => "Description shown beneath ''Active users'' in [[Special:Statistics]]. Parameters:
+* \$1 - Value of <code>\$wgRCMaxAge</code> in days",
'statistics-mostpopular' => 'Used in [[Special:Statistics]]',
'disambiguations' => 'Name of a special page displayed in [[Special:SpecialPages]].',
'disambiguationspage' => 'This message is the name of the template used for marking disambiguation pages. It is used by [[Special:Disambiguations]] to find all pages which link to disambiguation pages.
{{doc-important|Don\'t translate the "Template:" part!}}',
-'disambiguations-text' => "This block of text is shown on [[:Special:Disambiguations]].
-
-* '''Note:''' Do not change the link [[MediaWiki:Disambiguationspage]], even because it is listed as problematic. Be sure the \"D\" is in uppercase, so not \"d\".
-
-* '''Background information:''' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].",
+'disambiguations-text' => '{{doc-important|Do not change the link "<code><nowiki>[[MediaWiki:Disambiguationspage]]</nowiki></code>", even because it is listed as problematic. Be sure the "D" is in uppercase, so not "d".}}
+This block of text is shown on [[:Special:Disambiguations]].
+
+\'\'\'Background information:\'\'\' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].',
+
+'pageswithprop' => 'Title for [[Special:PagesWithProp]].
+{{Identical|Page with page property}}',
+'pageswithprop-legend' => 'Legend for the input form on [[Special:PagesWithProp]].
+{{Identical|Page with page property}}',
+'pageswithprop-text' => 'Introductory text for the input form on [[Special:PagesWithProp]]',
+'pageswithprop-prop' => 'Label for the property name input field on [[Special:PagesWithProp]].
+{{Identical|Property name}}',
+'pageswithprop-submit' => 'Label for the submit button on [[Special:PagesWithProp]].
+{{Identical|Go}}',
'doubleredirects' => 'Name of [[Special:DoubleRedirects]] displayed in [[Special:SpecialPages]]',
'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
'protectedpages-cascade' => 'Option in [[Special:ProtectedPages]]',
'protectedpagestext' => 'Shown on top of [[Special:ProtectedPages]]',
'protectedtitles' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'protectedtitlestext' => 'Shown on top of list of titles on [[Special:ProtectedTitles]]. If the list is empty the message [[MediaWiki:Protectedtitlesempty]] appears instead of this. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] for more information.',
-'protectedtitlesempty' => 'Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] for more information.',
+'protectedtitlestext' => 'Shown on top of list of titles on [[Special:ProtectedTitles]]. If the list is empty the message [[MediaWiki:Protectedtitlesempty]] appears instead of this. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
+'protectedtitlesempty' => 'Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
'listusers' => 'Name of special page displayed in [[Special:SpecialPages]]',
'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
'listusers-creationsort' => 'Option in [[Special:ListUsers]].',
'usereditcount' => 'Shown behind every username on [[Special:ListUsers]].',
-'usercreated' => 'Used in [[Special:ListUsers]].
-* <code>$1</code> is a date
-* <code>$2</code> is a time
-* <code>$3</code> is the name of the user, for use in GENDER',
+'usercreated' => 'Used in [[Special:ListUsers]]. Parameters:
+* $1 - a date
+* $2 - a time
+* $3 - the name of the user, for use in GENDER',
'newpages' => 'Name of special page displayed in [[Special:SpecialPages]]
{{Identical|New page}}',
'newpages-username' => '{{Identical|Username}}',
'categories' => 'The page name of [[Special:Categories]].
{{Identical|Categories}}',
-'categoriespagetext' => "Text displayed in [[Special:Categories]]. Do not translate or change links. In order to translate ''Unused categories'' and ''wanted categories'' see {{msg|unusedcategories}} and {{msg|wantedcategories}}.",
+'categoriespagetext' => "{{doc-important|Do not translate or change links.}}
+Text displayed in [[Special:Categories]].
+
+In order to translate ''Unused categories'' and ''wanted categories'' see {{msg|unusedcategories}} and {{msg|wantedcategories}}.",
'special-categories-sort-count' => 'This message is used on [[Special:Categories]] to sort the list by the number of members in the categories.',
# Special:DeletedContributions
'deletedcontributions-title' => 'Title of [[Special:DeletedContributions]] (extension), a special page with a list of edits to pages which were deleted. Only viewable by sysops.
{{Identical|Deleted user contributions}}',
-'sp-deletedcontributions-contribs' => 'Link to user’s contributions on [[Special:DeletedContributions]]',
+'sp-deletedcontributions-contribs' => "Link to user's contributions on [[Special:DeletedContributions]].
+{{Identical|Contribution}}",
# Special:LinkSearch
'linksearch' => 'Title of [[Special:LinkSearch|special page]] and legend of fieldset on that page.
* $1 is the text from the 'right-...' messages, i.e. {{msg-mw|right-edit}}
* $2 is the codename of this right",
'listgrouprights-addgroup' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
-* $1 is an enumeration of group names.
-* $2 is the number of group names in $1.
-See also {{msg|listgrouprights-removegroup}}.',
+* $1 - an enumeration of group names
+* $2 - the number of group names in $1
+See also:
+* {{msg-mw|listgrouprights-removegroup}}',
'listgrouprights-removegroup' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
-* $1 is an enumeration of group names.
-* $2 is the number of group names in $1.
-See also {{msg|listgrouprights-addgroup}}.',
+* $1 - an enumeration of group names
+* $2 - the number of group names in $1
+See also:
+* {{msg-mw|listgrouprights-addgroup}}',
'listgrouprights-addgroup-all' => 'Used on [[Special:ListGroupRights]].
{{Related|Listgrouprights}}',
'listgrouprights-removegroup-all' => 'Used on [[Special:ListGroupRights]].
{{Related|Listgrouprights}}',
'listgrouprights-addgroup-self' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
-* $1 are the group names.
-* $2 is the number of group names in $1.',
+* $1 - the group names
+* $2 - the number of group names in $1',
'listgrouprights-removegroup-self' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
-* $1 are the group names.
-* $2 is the number of group names in $1.',
+* $1 - the group names
+* $2 - the number of group names in $1',
'listgrouprights-addgroup-self-all' => 'Used on [[Special:ListGroupRights]].
{{Related|Listgrouprights}}',
'listgrouprights-removegroup-self-all' => 'Used on [[Special:ListGroupRights]].
{{Related|Listgrouprights}}',
-# E-mail user
+# Email user
'mailnologin' => 'Used in [[Special:EmailUser]].
Used as title of the error message {{msg-mw|Mailnologintext}}.',
'emailpage' => "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
'emailpagetext' => 'This is the text that is displayed above the e-mail form on [[Special:EmailUser]].
-Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message [[Mediawiki:Noemailtext]] will appear instead of Special:EmailUser.',
+Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message {{msg-mw|Noemailtext}} will appear instead of Special:EmailUser.',
'defemailsubject' => 'The default subject of EmailUser emails. Parameters:
* $1 is the username of the user sending the email and can be used for GENDER.',
'usermaildisabled' => 'Caption for an error message ({{msg-mw|Usermaildisabledtext}}) shown when the user-to-user e-mail feature is disabled on the wiki (see [[mw:Manual:$wgEnableEmail]], [[mw:Manual:$wgEnableUserEmail]]).',
'usermaildisabledtext' => 'Used as error message in [[Special:EmailUser]].
The title for this error message is {{msg-mw|Usermaildisabled}}.',
-'noemailtitle' => 'The title of the message that appears instead of Special:EmailUser after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user.',
+'noemailtitle' => 'The title of the message that appears instead of [[Special:EmailUser]] after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user.',
'noemailtext' => 'The text of the message that appears in [[Special:EmailUser]] after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user because he has not specified or not confirmed an e-mail address.',
'nowikiemailtext' => 'This is an error message used in [[Special:Emailuser]] when called with a target user not consenting to be an e-mail recipient.',
'emailnotarget' => 'This is an error message that may be used in [[Special:Emailuser]] when called without a (valid) target user for the e-mail.',
'emailusername' => 'This is a prompt being used in [[Special:Emailuser]] when called without a (valid) target user for the e-mail.
{{Identical|Username}}',
-'emailusernamesubmit' => '{{Identical|Submit}}
-
-This is a button text used in [[Special:Emailuser]] when called without a (valid) target user for the e-mail.',
+'emailusernamesubmit' => 'This is a button text used in [[Special:Emailuser]] when called without a (valid) target user for the e-mail.
+{{Identical|Submit}}',
'email-legend' => 'Title of the box in [[Special:EmailUser]]',
'emailfrom' => 'Field in [[Special:EmailUser]].
{{Identical|From}}',
{{Identical|Send}}',
'emailccme' => 'Used at [[Special:Preferences]] > E-mail',
'emailccsubject' => 'Subject of the carbon-copied email for the sender sent through MediaWiki.',
-'emailsent' => 'Title of Special:Emailuser when it says you it sent an email',
-'emailsenttext' => 'When you send an e-mail, Special:Emailuser says you this (Your email has been sent).',
-'emailuserfooter' => 'This message is appended to every email sent through the "Email user" function.
-
-* $1: username of the sender
-* $2: username of the recipient',
+'emailsent' => 'Title of [[Special:EmailUser]] when it says you it sent an email',
+'emailsenttext' => 'When you send an e-mail, [[Special:EmailUser]] says you this (Your email has been sent).',
+'emailuserfooter' => 'This message is appended to every email sent through the "Email user" function. Parameters:
+* $1 - username of the sender
+* $2 - username of the recipient',
# User Messenger
'usermessage-summary' => 'This message is used as an edit summary for any message that is posted because of a system event. Translate "leaving a message" in the sense of: to give a message to someone; to deliver a message somewhere; to deposit.',
-'usermessage-editor' => 'The user name for the user that is the editor of system messages. See [http://translatewiki.net/wiki/Thread:Support/Message_info_please discussion on Support].',
+'usermessage-editor' => 'The user name for the user that is the editor of system messages. See [{{canonicalurl:Thread:Support/Message_info_please}} discussion on Support].',
'usermessage-template' => '{{optional}}',
# Watchlist
* {{msg-mw|Tooltip-pt-watchlist}}
{{Identical|My watchlist}}',
'watchlistfor2' => 'Subtitle on [[Special:Watchlist]].
-
-*$1: Username of current user
-*$2: Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)
+Parameters:
+* $1 - Username of current user
+* $2 - Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)
{{Identical|For $1}}',
'nowatchlist' => 'Displayed when there is no pages in the watchlist.',
'watchlistanontext' => '* $1 is a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
See also:
* {{msg-mw|Watchthispage|link text}}
* {{msg-mw|Notanarticle|error message}}',
-'notanarticle' => "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
+'notanarticle' => "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].
Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
* {{msg-mw|Watchmethod-recent}}',
'watchlistcontains' => '* $1 - number of pages in your watchlist',
'wlnote' => 'Used on [[Special:Watchlist]] when the maximum number of days is specified.
+
Similar to {{msg-mw|rcnote}} which is used on [[Special:RecentChanges]].
-* $1 is the number of changes shown,
-* $2 is the number of hours for which the changes are shown,
-* $3 is a date alone,
-* $4 is a time alone.',
+
+Parameters:
+* $1 - the number of changes shown
+* $2 - the number of hours for which the changes are shown
+* $3 - a date alone
+* $4 - a time alone',
'wlshowlast' => 'Appears on [[Special:Watchlist]]. Parameters:
* $1 - a choice of different numbers of hours ("1 | 2 | 6 | 12")
* $2 - a choice of different numbers of days ("1 | 3 | 7")
* {{msg-mw|enotif reset|Submit button text}}',
# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Text displayed when clicked on the watch tab: [[MediaWiki:Watch/{{SUBPAGENAME}}|{{int:watch}}]]. It means the wiki is adding that page to your watchlist.',
-'unwatching' => 'Text displayed when clicked on the unwatch tab: [[MediaWiki:Unwatch/{{SUBPAGENAME}}|{{int:unwatch}}]]. It means the wiki is removing that page from your watchlist.',
+'watching' => 'Text displayed when clicked on the watch tab: {{msg-mw|Watch}}. It means the wiki is adding that page to your watchlist.',
+'unwatching' => 'Text displayed when clicked on the unwatch tab: {{msg-mw|Unwatch}}. It means the wiki is removing that page from your watchlist.',
'watcherrortext' => 'When a user clicked the watch/unwatch tab and the action did not succeed, this message is displayed.
This message is used raw and should not contain wikitext.
# Rollback
'rollback' => '{{Identical|Rollback}}',
'rollback_short' => '{{Identical|Rollback}}',
-'rollbacklink' => '{{Identical|Rollback}}
+'rollbacklink' => '{{Doc-actionlink}}
This link text appears on the recent changes page to users who have the "rollback" right.
This message has a tooltip {{msg-mw|tooltip-rollback}}
+{{Identical|Rollback}}',
+'rollbacklinkcount' => '{{doc-actionlink}}
+Text of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.
-{{Doc-actionlink}}',
-'rollbacklinkcount' => 'Text of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.
-* $1: the number of edits that will be rollbacked. If $1 is over the value of $wgShowRollbackEditCount (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.
-
-The rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}
+Parameters:
+* $1 - the number of edits that will be rollbacked. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.
-{{Doc-actionlink}}',
+The rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}',
'rollbacklinkcount-morethan' => 'Text of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.
When the number of edits rolled back is smaller than [[mw:Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.
* {{msg-mw|Notvisiblerev}}
{{Identical|Revert}}
{{Identical|Rollback}}',
-'alreadyrolled' => "Appear when there's rollback and/or edit collision.
-* $1: the page to be rollbacked
-* $2: the editor to be rollbacked of that page
-* $3: the editor that cause collision
-
+'alreadyrolled' => "Appear when there's rollback and/or edit collision. Parameters:
+* $1 - the page to be rollbacked
+* $2 - the editor to be rollbacked of that page
+* $3 - the editor that cause collision
{{Identical|Rollback}}",
'editcomment' => "Only shown if there is an edit ''{{msg-mw|summary}}''",
-'revertpage' => '{{Identical|Revert}}
-Additionally available:
-* $3: revid of the revision reverted to,
-* $4: timestamp of the revision reverted to,
-* $5: revid of the revision reverted from,
-* $6: timestamp of the revision reverted from',
+'revertpage' => 'Parameters:
+* $1 - username 1
+* $2 - username 2
+Additionally available parameters:
+* $3 - revid of the revision reverted to
+* $4 - timestamp of the revision reverted to
+* $5 - revid of the revision reverted from
+* $6 - timestamp of the revision reverted from
+{{Identical|Revert}}',
'revertpage-nouser' => 'This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.
In other cases the message {{msg-mw|revertpage}} is used.',
'rollback-success' => 'This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.
'protect-fallback' => 'This message is used as an option in the protection form on wikis were extra protection levels have been configured.',
'protect-level-autoconfirmed' => 'Used as protect level.
-See example: [http://translatewiki.net/w/i.php?title=Main_Page&action=info]',
+See example: {{canonicalurl:Main_Page|action=info}}',
'protect-level-sysop' => 'Used as protect level.
-See example: [http://translatewiki.net/w/i.php?title=Main_Page&action=info]',
+See example: {{canonicalurl:Main_Page|action=info}}',
'protect-summary-desc' => '{{Optional}}
Used in edit summary for description of a protecting restriction.
* $1 is action, taken from restriction-*
{{Identical|Other time}}',
'protect-othertime-op' => 'Used on the page protection form in the drop down menu
{{Identical|Other time}}',
-'protect-existing-expiry' => 'Shows the existing expiry time in the drop down menu of the protection form ([http://translatewiki.net/w/i.php?title=User:Raymond/test&action=unprotect example])
+'protect-existing-expiry' => 'Shows the existing expiry time in the drop down menu of the protection form ([{{canonicalurl:User:Raymond/test|action=unprotect}} example])
-* $1: date and time of the existing expiry time (kept for backward compatibility purposes)
-* $2: date of the existing expiry time
-* $3: time of the existing expiry time',
+Parameters:
+* $1 - date and time of the existing expiry time (kept for backward compatibility purposes)
+* $2 - date of the existing expiry time
+* $3 - time of the existing expiry time',
'protect-otherreason' => 'Shown on the page protection form as label for the following input field (text)
{{Identical|Other/additional reason}}',
'protect-otherreason-op' => 'Shown on the page protection form in the drop down menu
See also:
* {{msg-mw|Delete-edit-reasonlist}}
* {{msg-mw|Ipb-edit-dropdown}}',
-'protect-expiry-options' => "{{Identical|Infinite}}{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
-
-Options for the duration of the page protection. Example: See e.g. [[MediaWiki:Protect-expiry-options/nl]] if you still don't know how to do it.",
-'restriction-type' => 'Used on [[Special:ProtectedPages]]. The text next to a drop-down box. See [[mw:Manual:Administrators|MediaWiki Manual]] for more information on protection.',
-'restriction-level' => 'Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. The text next to a drop-down box. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.',
+'protect-expiry-options' => "{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
+Options for the duration of the page protection. Example: See e.g. [[MediaWiki:Protect-expiry-options/nl]] if you still don't know how to do it.
+{{Identical|Infinite}}",
+'restriction-type' => 'Used on [[Special:ProtectedPages]]. The text next to a drop-down box. See [[mw:Manual:Administrators|MediaWiki Manual]] for more information on protection.
+{{Identical|Permission}}',
+'restriction-level' => 'Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. The text next to a drop-down box. See the [[mw:Project:Protected_titles|help page on MediaWiki]] and on [[meta:Protect|Meta]] for more information.',
'minimum-size' => 'Used in [[Special:Protectedpages]] as a pair of radio buttons, with {{msg-mw|Maximum-size}}. There is an input box to specify the minimum bites of the projected pages listed.',
'maximum-size' => 'Used in [[Special:Protectedpages]] as a pair of radio buttons, with {{msg-mw|Minimum-size}}. There is an input box to specify the maximum bites of the projected pages listed.',
-'pagesize' => 'Used on [[Special:ProtectedPages]]. See the help page on [http://meta.wikimedia.org/wiki/Protect Meta] for more information on protection.',
+'pagesize' => 'Used on [[Special:ProtectedPages]]. See the help page on [[meta:Protect|Meta]] for more information on protection.',
# Restrictions (nouns)
'restriction-edit' => "Used on [[Special:ProtectedPages]]. Option in the 'permission' drop-down box.
'restriction-move' => "Used on [[Special:ProtectedPages]]. Option in the 'permission' drop-down box.
{{Identical|Move}}",
-'restriction-create' => 'Used on [[Special:ProtectedPages]]. An option in a drop-down box. See the help pages on [//www.mediawiki.org/wiki/Project:Protected_titles MediaWiki] and [http://meta.wikimedia.org/wiki/Protect Meta] for more information on protection.
-
+'restriction-create' => 'Used on [[Special:ProtectedPages]]. An option in a drop-down box. See the help pages on [[mw:Project:Protected_titles|MediaWiki]] and [[meta:Protect|Meta]] for more information on protection.
{{Identical|Create}}',
'restriction-upload' => '{{Identical|Upload}}',
# Restriction levels
-'restriction-level-sysop' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level' and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+'restriction-level-sysop' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level' and in brackets after each page name entry. See the [[mw:Project:Protected_titles|help page on MediaWiki]] and on [[meta:Protect|Meta]] for more information.
See also:
*{{msg-mw|Restriction-level-autoconfirmed}}
*{{msg-mw|Restriction-level-all}}",
-'restriction-level-autoconfirmed' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+'restriction-level-autoconfirmed' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. See the [[mw:Project:Protected_titles|help page on MediaWiki]] and on [[meta:Protect|Meta]] for more information.
See also:
*{{msg-mw|Restriction-level-sysop}}
*{{msg-mw|Restriction-level-all}}",
-'restriction-level-all' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+'restriction-level-all' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. See the [[mw:Project:Protected_titles|help page on MediaWiki]] and on [[meta:Protect|Meta]] for more information.
See also:
*{{msg-mw|Restriction-level-sysop}}
{{Identical|View deleted pages}}',
'undeletepagetext' => '* $1 - number of pages',
'undelete-fieldset-title' => 'Used as the title of the fieldset.',
-'undeleteextrahelp' => "Help message displayed when restoring history of a page. In your language, ''Restore'' is called ''[[MediaWiki:Undeletebtn/{{SUBPAGENAME}}|{{int:Undeletebtn}}]]'' ({{msg|Undeletebtn}}), The ''Reset'' button is called ''[[MediaWiki:Undeletereset/{{SUBPAGENAME}}|{{int:Undeletereset}}]]'' ({{msg|Undeletereset}}).",
+'undeleteextrahelp' => "Help message displayed when restoring history of a page.
+
+In your language, ''Restore'' is called {{msg-mw|Undeletebtn}}, the ''Reset'' button is called {{msg-mw|Undeletereset}}.",
'undeleterevisions' => '* $1 - number of revisions',
'undeletehistory' => 'Used in [[Special:Undelete]].
* {{msg-mw|Undeletehistory}}
* {{msg-mw|Undeleterevdel}}',
'undelete-revision' => 'Shown in "View and restore deleted pages" ([[Special:Undelete/$1]]).
-
-* $1: deleted page name
-* $3: user name (author of revision, not who deleted it)
-* $4: date of the revision
-* $5: time of the revision
-
-\'\'Example:\'\' Deleted revision of [[Main Page]] (as of {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, at {{CURRENTTIME}}) by [[User:Username|Username]]:',
+Parameters:
+* $1 - deleted page name
+* $2 - (unused)
+* $3 - user name (author of revision, not who deleted it)
+* $4 - date of the revision
+* $5 - time of the revision
+Example:
+* Deleted revision of [[Main Page]] (as of {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, at {{CURRENTTIME}}) by [[User:Username|Username]]:',
'undelete-nodiff' => 'Used in [[Special:Undelete]].',
'undeletebtn' => 'Shown on [[Special:Undelete]] as button caption and on [[Special:Log/delete|deletion log]] after each entry (for sysops).
See also:
* {{msg-mw|Undeletedrevisions-files}}
* {{msg-mw|Undeletedrevisions}}',
-'cannotundelete' => 'Message shown when undeletion failed for some reason.
-* <code>$1</code> is the combined wikitext of messages for all errors that caused the failure.',
+'cannotundelete' => 'Message shown when undeletion failed for some reason. Parameters:
+* $1 - the combined wikitext of messages for all errors that caused the failure',
'undeletedpage' => '* $1 - page title',
'undelete-header' => 'Used in [[Special:Undelete]].',
'undelete-search-title' => 'Page title when showing the search form in [[Special:Undelete]].
'undelete-error-long' => 'Used as error message. See also:
* {{msg-mw|Undelete-error-short}}
* {{msg-mw|Undelete-error-long}}',
-'undelete-show-file-confirm' => 'A confirmation message shown on Special:Undelete when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
-* <code>$1</code> is the name of the file being undeleted.
-* <code>$2</code> is the date of the displayed revision.
-* <code>$3</code> is the time of the displayed revision.
+'undelete-show-file-confirm' => 'A confirmation message shown on [[Special:Undelete]] when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
-{{identical|Are you sure you want to view the deleted revision of the file...}}',
+Parameters:
+* $1 - the name of the file being undeleted
+* $2 - the date of the displayed revision
+* $3 - the time of the displayed revision
+{{Identical|Are you sure you want to view the deleted revision of the file...}}',
'undelete-show-file-submit' => '{{Identical|Yes}}',
'undelete-revisionrow' => "{{Optional}}
A revision row in the undelete page. Parameters:
Parameter $1 is a page title.',
'nolinkshere-ns' => '* $1 - page title',
-'isredirect' => 'Displayed in Special:WhatLinksHere (see [{{fullurl:Special:WhatLinksHere/Project:Translator|hidelinks=1}} Special:WhatLinksHere/Project:Translator] for example).
+'isredirect' => 'Displayed in [[Special:WhatLinksHere]] (see [{{fullurl:Special:WhatLinksHere/Project:Translator|hidelinks=1}} Special:WhatLinksHere/Project:Translator] for example).
{{Identical|Redirect page}}',
'istemplate' => 'Means that a page (a template, specifically) is used as <code><nowiki>{{Page name}}</nowiki></code>.
-Displayed in Special:WhatLinksHere (see [[Special:WhatLinksHere/Template:New portal]] for example).',
+Displayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).',
'isimage' => 'This message is displayed on [[Special:WhatLinksHere]] for images. It means that the image is used on the page (as opposed to just being linked to like an non-image page).',
'whatlinkshere-prev' => 'This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the first argument of {{msg-mw|Viewprevnext}}.
$1 is the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.
{{Identical|Automatically block ...}}',
'ipbsubmit' => '{{Identical|Block this user}}',
'ipbother' => '{{Identical|Other time}}',
-'ipboptions' => "{{Identical|Infinite}}{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
-
-Options for the duration of the block. Example: See e.g. [[MediaWiki:Ipboptions/nl]] if you still don't know how to do it.",
+'ipboptions' => "{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
+Options for the duration of the block. Example: See e.g. [[MediaWiki:Ipboptions/nl]] if you still don't know how to do it.
+{{Identical|Infinite}}",
'ipbotheroption' => '{{Identical|Other}}',
'ipbotherreason' => '{{Identical|Other/additional reason}}',
'ipbhidename' => 'This is the label for a checkbox in the user block form on [[Special:Block]].
* $1 - target username',
'unblockip' => 'Used as legend for the form in [[Special:Unblock]].',
'unblockiptext' => 'Used in the {{msg-mw|Unblockip}} form on [[Special:Unblock]].',
-'ipusubmit' => 'Used as button text on Special:BlockList?action=unblock. To see the message:
+'ipusubmit' => 'Used as button text on [{{canonicalurl:Special:BlockList|action=unblock}} Special:BlockList?action=unblock]. To see the message:
* Go to [[Special:BlockList]]
* Click "unblock" for any block (but you can only see "unblock" if you have administrator rights)
* It is now the button below the form',
{{Related|Blocklist-blocks}}',
'blocklist-rangeblocks' => 'Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].
-For an explanation of "range blocks", see http://www.mediawiki.org/wiki/Help:Range_blocks
+For an explanation of "range blocks", see [[mw:Help:Range_blocks]]
{{Related|Blocklist-blocks}}',
'blocklist-timestamp' => 'This is a column header for dates and times in the table on the page [[Special:BlockList]].
{{Identical|Timestamp}}',
* {{msg-mw|Sp-contributions-uploads}}
* {{msg-mw|Sp-contributions-logs}}
* {{msg-mw|Sp-contributions-deleted}}
-* {{msg-mw|Sp-contributions-userrights}}",
+* {{msg-mw|Sp-contributions-userrights}}
+{{Identical|Block}}",
'unblocklink' => 'Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].
See also:
* {{msg-mw|sp-contributions-logs}}
* {{msg-mw|sp-contributions-deleted}}
* {{msg-mw|sp-contributions-userrights}}',
-'change-blocklink' => 'Used to name the link on Special:Log.
+'change-blocklink' => 'Used to name the link on [[Special:Log]].
Also used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].
'blocklog-showsuppresslog' => 'Parameters:
* $1 is the blocked user. Can be used for GENDER (optional)',
'blocklogentry' => 'This is the text of an entry in the Block log, and recent changes, after hour (and date, only in the Block log) and sysop name:
-* $1 is the blocked user or IP (with link to contributions and talk)
-* $2 is the duration of the block (hours, days etc.) or the specified expiry date
-* $3 contains "(details) (\'\'reason\'\')"
-See also {{msg-mw|Blocklistline}}.',
+* $1 - the blocked user or IP (with link to contributions and talk)
+* $2 - the duration of the block (hours, days etc.) or the specified expiry date
+* $3 - contains "(details) (\'\'reason\'\')"
+See also:
+* {{msg-mw|Blocklistline}}',
'reblock-logentry' => 'This is the text of an entry in the Block log (and Recent Changes), after hour (and date, only in the Block log) and sysop name:
* $1 is the user being reblocked
* $2 is the expiry time of the block
See also:
* {{msg-mw|Sorbsreason}}
* {{msg-mw|Sorbs create account_reason}}',
-'cant-see-hidden-user' => 'Used as (red) error message on Special:Block when you try to change (as sysop w/o the hideuser right) the block of a hidden user.',
+'cant-see-hidden-user' => 'Used as (red) error message on [[Special:Block]] when you try to change (as sysop without the hideuser right) the block of a hidden user.',
'ipbblocked' => 'Error message shown when a user tries to alter block settings when they are themselves blocked.',
'ipbnounblockself' => 'Error message shown when a user without the <tt>unblockself</tt> right tries to unblock themselves.',
'delete_and_move_text' => 'Used when moving a page, but the destination page already exists and needs deletion. This message is to confirm that you really want to delete the page. See also {{msg|delete and move confirm}}.',
'delete_and_move_confirm' => 'Used when moving a page, but the destination page already exists and needs deletion. This message is for a checkbox to confirm that you really want to delete the page. See also {{msg|delete and move text}}.',
'delete_and_move_reason' => 'Shown as reason in content language in the deletion log. Parameter:
-* $1: The page name for which this page was deleted.',
+* $1 - The page name for which this page was deleted.',
'selfmove' => 'Used as error message when moving page.
See also:
* {{msg-mw|Immobile-target-page}}',
'bad-target-model' => 'This message is shown when attempting to move a page, but the move would change the page\'s content model.
This may be the case when [[mw:Manual:$wgContentHandlerUseDB|$wgContentHandlerUseDB]] is set to false, because then a page\'s content model is derived from the page\'s title.
-* $1: The localized name of the original page\'s content model:
+
+Parameters:
+* $1 - The localized name of the original page\'s content model:
**{{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
-* $2: The localized name of the content model used by the destination title:
+* $2 - The localized name of the content model used by the destination title:
**{{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}',
'imagenocrossnamespace' => 'Used as error message.
# Export
'export' => 'Page title of [[Special:Export]], a page where a user can export pages from a wiki to a file.',
-'exporttext' => 'Main text on [[Special:Export]]. Leave the line <tt><nowiki>[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]</nowiki></tt> exactly as it is!',
+'exporttext' => '{{doc-important|Leave the line <code><nowiki>[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]</nowiki></code> exactly as it is!}}
+Main text on [[Special:Export]].',
'exportall' => 'A label of checkbox option in [[Special:Export]]',
'exportcuronly' => 'A label of checkbox option in [[Special:Export]]',
'exportnohistory' => 'Used in [[Special:Export]].',
* {{msg-mw|Import-interwiki-templates}}
* {{msg-mw|Import-interwiki-namespace}}
* {{msg-mw|Import-interwiki-rootpage}}
-* {{msg-mw|Import-interwiki-submit}}',
+* {{msg-mw|Import-interwiki-submit}}
+{{Identical|Comment}}',
'importtext' => 'Used in the Import form on [[Special:Import]].',
'importstart' => 'Used in [[Special:Import]].
* {{msg-mw|Import-noarticle}}
* {{msg-mw|Importbadinterwiki}}',
'import-nonewrevisions' => 'Used in [[Special:Import]].',
-'xml-error-string' => ':$1: Some kind of message, perhaps name of the error?
-:$2: line number
-:$3: columm number
-:$4: ?? $this->mByte . $this->mContext
-:$5: error description
-----
-:Example
-Import failed: XML import parse failure at line 1, col 1 (byte 3; "- <mediawiki xml"): Empty document',
+'xml-error-string' => 'Parameters:
+* $1 - Some kind of message, perhaps name of the error?
+* $2 - line number
+* $3 - column number
+* $4 - ?? $this->mByte . $this->mContext
+* $5 - error description
+Example:
+* Import failed: XML import parse failure at line 1, col 1 (byte 3; "- <mediawiki xml"): Empty document',
'import-upload' => 'Used on [[Special:Import]].
Related messages:
'import-error-special' => '* $1 - page title',
'import-error-invalid' => '* $1 - page title',
'import-error-unserialize' => 'Import error message displayed when a revision could not be unserialized.
-This may happen if the content got corrupted or the serialization format is mis-reported. Parameters:
-* $1 is the name of the page the offending revision belongs to.
-* $2 is the ID of the offending revision, as reported in the dump that is being imported.
-* $3 is the content model reported for the offending revision in the dump that is being imported.
-* $4 is the serialization format reported for the offending revision in the dump that is being imported.',
+
+This may happen if the content got corrupted or the serialization format is mis-reported.
+
+Parameters:
+* $1 - the name of the page the offending revision belongs to
+* $2 - the ID of the offending revision, as reported in the dump that is being imported
+* $3 - the content model reported for the offending revision in the dump that is being imported
+* $4 - the serialization format reported for the offending revision in the dump that is being imported',
'import-options-wrong' => 'Used on [[Special:Import]], when one of the options has an error.',
'import-rootpage-invalid' => 'Used on [[Special:Import]], when the root page is invalid.',
'import-rootpage-nosubpage' => 'Used on [[Special:Import]], when the import namespace does not support subpages. Parameters:
# Import log
'importlogpage' => '{{doc-logpage}}',
-'importlogpagetext' => 'This text appears at the top of the [//translatewiki.net/w/i.php?title=Special:Log&type=import import log] special page.',
+'importlogpagetext' => 'This text appears at the top of the [{{canonicalurl:Special:Log|type=import}} import log] special page.',
'import-logentry-upload' => 'This is the text of an entry in the Import log (and Recent Changes), after hour (and date, only in the Import log) and sysop name:
* $1 is the name of the imported file',
'import-logentry-upload-detail' => '* $1 - number of revisions, success count',
{{Identical|Log out}}',
'tooltip-ca-talk' => "Tooltip shown when hovering over the {{msg-mw|Talk}} tab.
-A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For a technical definition of 'content namespaces' see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
+A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For a technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].
Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
* {{msg-mw|Accesskey-t-upload}}
* {{msg-mw|Tooltip-t-upload}}
{{Identical|Upload file}}',
-'tooltip-t-specialpages' => 'The tooltip when hovering over the link "[[MediaWiki:Specialpages/{{SUBPAGENAME}}|{{int:specialpages}}]]" going to a list of all special pages available in the wiki.
+'tooltip-t-specialpages' => 'The tooltip when hovering over the link {{msg-mw|Specialpages}} going to a list of all special pages available in the wiki.
See also:
* {{msg-mw|Specialpages}}
* {{msg-mw|Permalink}}
* {{msg-mw|Accesskey-t-permalink}}
* {{msg-mw|Tooltip-t-permalink}}',
-'tooltip-ca-nstab-main' => 'A "content page" is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons "content pages" include pages in the file and category namespaces. On Wikinews "content pages" include pages in the Portal namespace. For technical definition of "content namespaces" see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
+'tooltip-ca-nstab-main' => 'A "content page" is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons "content pages" include pages in the file and category namespaces. On Wikinews "content pages" include pages in the Portal namespace. For technical definition of "content namespaces" see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].
Possible alternatives to the word \'content\' are \'subject matter\' or \'wiki subject\' or \'wiki purpose\'.
# Attribution
'anonymous' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net).
-This message appears at the very end of the list of names in the message [[MediaWiki:Othercontribs/{{SUBPAGENAME}}|othercontribs]]. If there are no anonymous users in the credits list then this message does not appear at all.
-* $1 is the number of anonymous users in the message',
+This message appears at the very end of the list of names in the message {{msg-mw|Othercontribs}}.
+
+If there are no anonymous users in the credits list then this message does not appear at all.
+
+Parameters:
+* $1 - the number of anonymous users in the message',
'siteuser' => "This message is shown when viewing the credits of a page ([{{fullurl:Main Page|action=credits}} example]). Note that this action is disabled by default, but currently enabled on translatewiki.net. This message is the variable $3 in the message {{msg-mw|lastmodifiedatby}}. This message only appears if a user has not entered their 'real name' in their preferences. See also {{msg-mw|Siteusers}}.
Parameters:
See also {{msg-mw|Anonusers}} and {{msg-mw|Siteuser}}.",
'lastmodifiedatby' => "This message is shown when viewing the credits of a page (example: [{{fullurl:Main Page|action=credits}}]). Note that this action is disabled by default (currently enabled on translatewiki.net).
-* $1: date
-* $2: time
-* $3: if the user has entered his 'real name' in his preferences then this variable is his 'real name'. If the user has not entered his 'real name' in his preferences then this variable is the message [[Mediawiki:siteuser/{{SUBPAGENAME}}]], which includes his username.
-* $4: username in plain text. Can be used for GENDER
-See also [[MediaWiki:Lastmodifiedat/{{SUBPAGENAME}}]].",
+Parameters:
+* $1 - date
+* $2 - time
+* $3 - if the user has entered his 'real name' in his preferences then this variable is his 'real name'. If the user has not entered his 'real name' in his preferences then this variable is the message {{msg-mw|Siteuser}}, which includes his username.
+* $4 - username in plain text. Can be used for GENDER
+See also:
+* {{msg-mw|Lastmodifiedat}}",
'othercontribs' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net - to use type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar).
-* $1: the list of author(s) of the revisions preceding the current revision. It appears after the message [[Mediawiki:lastmodifiedatby/{{SUBPAGENAME}}]]. If there are no previous authors this message does not appear at all. If needed the messages [[Mediawiki:siteusers/{{SUBPAGENAME}}]], [[Mediawiki:anonymous/{{SUBPAGENAME}}]] and [[Mediawiki:and/{{SUBPAGENAME}}]] are part of the list of names.
-* $2: optional, the count of names in $1',
+
+Parameters:
+* $1 - the list of author(s) of the revisions preceding the current revision. It appears after the message {{msg-mw|Lastmodifiedatby}}. If there are no previous authors this message does not appear at all. If needed the messages {{msg-mw|Siteusers}}, {{msg-mw|Anonymous}} and {{msg-mw|And}} are part of the list of names.
+* $2 - (Optional) the count of names in $1',
'others' => 'The following explanation is guesswork. This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net - to use type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar).
-The message appears at the end of the list of credits given in the message [[Mediawiki:Othercontribs/{{SUBPAGENAME}}]] if the number of contributors is above a certain level.',
+The message appears at the end of the list of credits given in the message {{msg-mw|Othercontribs}} if the number of contributors is above a certain level.
+{{Identical|Other}}',
'siteusers' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net).
-It should be in a form that fits with [[MediaWiki:Othercontribs/{{SUBPAGENAME}}|othercontribs]].
-* $1 is a list of user names (example: "\'\'Jim, Janet, Jane, Joe\'\'") where the user has not put his \'real name\' in his preferences.
-* $2 is the number of user names in $1
+It should be in a form that fits with {{msg-mw|Othercontribs}}.
-If there is more than one user in the list then the message {{msg-mw|and}} appears before the last name. If $2 is NIL then this message does not appear at all.
+Parameters:
+* $1 - a list of user names (example: "\'\'Jim, Janet, Jane, Joe\'\'") where the user has not put his \'real name\' in his preferences.
+* $2 - the number of user names in $1
+
+If there is more than one user in the list then the message {{msg-mw|And}} appears before the last name. If $2 is NULL then this message does not appear at all.
-See also {{msg-mw|Siteuser}}.',
+See also:
+* {{msg-mw|Siteuser}}',
'anonusers' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Support|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net).
-It should be in a form that fits with [[MediaWiki:Othercontribs/{{SUBPAGENAME}}|othercontribs]].
-* $1 is a list of IP addresses
-* $2 is the number of IP addresses in $1
+It should be in a form that fits with {{msg-mw|Othercontribs}}.
+
+Parameters:
+* $1 - a list of IP addresses
+* $2 - the number of IP addresses in $1
If there is more than one user in the list then the message {{msg-mw|and}} appears before the last name. If $2 is NIL then this message does not appear at all.
-See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
+See also:
+* {{msg-mw|Anonuser}}
+* {{msg-mw|Siteusers}}',
'creditspage' => "This message is the ''contentSub'' (the grey subtitle) shown when viewing credits of a page (example: {{fullurl:Project:News|action=credits}}). Note that the credits action is disabled by default (currently enabled on translatewiki.net).",
'nocredits' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}) but when there are no credits available. Note that the credits action is disabled by default (currently enabled on translatewiki.net).',
'pageinfo-title' => 'Page title for action=info. Parameters:
* $1 is the page name',
'pageinfo-not-current' => 'Error message displayed when information for an old revision is requested. Example: [{{fullurl:Project:News|oldid=4266597&action=info}}]',
-'pageinfo-header-basic' => 'Table section header in action=info.',
+'pageinfo-header-basic' => 'Table section header in action=info. See [{{canonicalurl:MediaWiki:Pageinfo-header-basic/en|action=info}} example].
+{{Identical|Basic information}}',
'pageinfo-header-edits' => 'Table section header in action=info.',
'pageinfo-header-restrictions' => 'Table section header in action=info.',
'pageinfo-header-properties' => 'Table section header in action=info.',
Used as link text, linked to '{{int:Prefixindex}}' page ([[Special:PrefixIndex]]).",
'pageinfo-subpages-value' => 'Parameters:
-* $1 is the number of subpages of the page.
-* $2 is the number of subpages of the page that are redirects.
-* $3 is the number of subpages of the page that are not redirects.',
+* $1 - the number of subpages of the page
+* $2 - the number of subpages of the page that are redirects
+* $3 - the number of subpages of the page that are not redirects',
'pageinfo-firstuser' => 'The user who created the page.',
'pageinfo-firsttime' => 'The date and time the page was created.',
'pageinfo-lastuser' => 'The last user who edited the page.',
See also:
* {{msg-mw|Pageinfo-templates}}',
'pageinfo-toolboxlink' => "Information link for the page (like 'What links here', but to action=info for the current page instead)",
-'pageinfo-redirectsto' => 'Key for the row shown if this page is a redirect. Verb. See [http://en.wikipedia.org/w/index.php?title=Main_page&action=info example].',
+'pageinfo-redirectsto' => 'Key for the row shown if this page is a redirect. Verb. See [{{canonicalurl:w:Main_page|action=info}} example].',
'pageinfo-redirectsto-info' => 'Text to put in parentheses for the link to the action=info of the redirect target.
{{Identical|Info}}',
'pageinfo-contentpage' => 'Key for the row shown on [{{fullurl:News|action=info}} action=info] if this page is [[mw:Manual:Article count|counted as a content page]]',
# Media information
'mediawarning' => 'Shows up on file description pages if the file type is not listed in [[mw:Manual:$wgTrustedMediaFormats|Manual:$wgTrustedMediaFormats]].',
-'imagemaxsize' => 'This is used in Special:Preferences, under Files.
+'imagemaxsize' => 'This is used in [[Special:Preferences]], under Files.
See also:
* {{msg-mw|Thumbsize}}',
'widthheightpage' => 'This message is used on image pages in the dimensions column in the file history section for images with more than one page.
Parameters:
-* $1 is the width of the image pages in pixels.
-* $2 is the height of the image pages in pixels.
-* $3 is the number of pages in the file.',
+* $1 - the width of the image pages in pixels
+* $2 - the height of the image pages in pixels
+* $3 - the number of pages in the file',
'file-info' => 'File info displayed on file description page.',
'file-info-size' => 'File info displayed on file description page.
'file-info-size-pages' => 'File info displayed on file description page, when the file is a multi-page document, with at least two pages. Like {{msg-mw|file-info-size}} but $5 is the total number of pages in the document.
Parameters:
-* $1 is the width of the image pages in pixels.
-* $2 is the height of the image pagess in pixels.
-* $3 is the file size as a number followed by a unit — for example: 99 KB
-* $4 is the MIME type, a formalized textual information — for example: <code>image/jpeg</code>
-* $5 is the total number of pages in the document.',
+* $1 - the width of the image pages in pixels
+* $2 - the height of the image pagess in pixels
+* $3 - the file size as a number followed by a unit — for example: 99 KB
+* $4 - the MIME type, a formalized textual information — for example: <code>image/jpeg</code>
+* $5 - the total number of pages in the document',
'file-nohires' => 'File info displayed on file description page. For example of message in use see [[:File:Mouse10.gif]].',
'svg-long-desc' => 'Displayed under an SVG image at the image description page. Note that argument 3 is a string that includes the file size unit symbol. See for example [[:File:Yes check.svg]].
-Start with a lowercase letter, unless the first word is “SVG”.',
+Start with a lowercase letter, unless the first word is "SVG".',
'svg-long-desc-animated' => 'Displayed under an SVG image at the image description page if the image is animated. Non-animated images use {{msg-mw|svg-long-desc}}.
-* $1 is the width in pixels
-* $2 is the height in pixels, and
-* $3 is the file size including a unit (for example "10 KB").
+* $1 - the width in pixels
+* $2 - the height in pixels
+* $3 - the file size including a unit (for example "10 KB")
-Start with a lowercase letter, unless the first word is “SVG”.',
+Start with a lowercase letter, unless the first word is "SVG".',
'svg-long-error' => 'Displayed for invalid SVG file metadata. Parameters:
* $1 - the error message
See also:
'show-big-image' => 'Displayed under an image at the image description page, when it is displayed smaller there than it was uploaded.',
'show-big-image-preview' => 'Message shown under the image description page thumbnail, next to {{msg-mw|show-big-image-other}}.',
'show-big-image-other' => 'Message shown under the image description page thumbnail, next to {{msg-mw|show-big-image-preview}}, if the image is in high resolution.',
-'show-big-image-size' => '
-Parameters:
-* $1 is the width of the image(s) in pixels.
-* $2 is the height of the image(s) in pixels.',
-'file-info-gif-looped' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/Gif .gif file] on its file description page. Looped means repeating in the context of an animated gif. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop. For example of message in use see [[:File:Mouse10.gif]].',
-'file-info-gif-frames' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/Gif .gif file] on its file description page.',
-'file-info-png-looped' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/APNG .apng file] on its file description page. Looped means repeating indefinetly in the context of an animated png. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop.',
-'file-info-png-repeat' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/APNG .apng file] on its file description page. The sequence of images is repeating a limited amount of time. It is a sequence of images, each displayed after the other, and the first one displayed after the last, for $1 times.',
-'file-info-png-frames' => 'Part of the information provided about a [http://en.wikipedia.org/wiki/APNG .apng file] on its file description page.
+'show-big-image-size' => 'Parameters:
+* $1 - the width of the image(s) in pixels
+* $2 - the height of the image(s) in pixels',
+'file-info-gif-looped' => 'Part of the information provided about a [[w:Gif|.gif file]] on its file description page. Looped means repeating in the context of an animated gif. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop. For example of message in use see [[:File:Mouse10.gif]].',
+'file-info-gif-frames' => 'Part of the information provided about a [[w:Gif|.gif file]] on its file description page.',
+'file-info-png-looped' => 'Part of the information provided about a [[w:APNG|.apng file]] on its file description page. Looped means repeating indefinetly in the context of an animated png. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop.',
+'file-info-png-repeat' => 'Part of the information provided about a [[w:APNG|.apng file]] on its file description page. The sequence of images is repeating a limited amount of time. It is a sequence of images, each displayed after the other, and the first one displayed after the last, for $1 times.',
+'file-info-png-frames' => 'Part of the information provided about a [[w:APNG|.apng file]] on its file description page.
The variable $1 is the number of individual frames in an animated gif file.
'variantname-shi' => '{{optional}}',
# Metadata
-'metadata' => 'The title of a section on an image description page, with information and data about the image. For example of message in use see [http://commons.wikimedia.org/wiki/File:Titan-crystal_bar.JPG Commons].
-
+'metadata' => 'The title of a section on an image description page, with information and data about the image. For example of message in use see [[commons:File:Titan-crystal_bar.JPG|Commons]].
{{Identical|Metadata}}',
-'metadata-expand' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see "[[MediaWiki:Metadata-collapse/{{SUBPAGENAME}}|{{int:metadata-collapse}}]]".',
-'metadata-collapse' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on the link "[[MediaWiki:Metadata-expand/{{SUBPAGENAME}}|{{int:metadata-expand}}]]", you can see more data and information. This message is for the link to hide back the less important data.',
-'metadata-fields' => "'''Warning:''' Do not translate list items, only translate the text! So leave \"<tt>* make</tt>\" and the other items exactly as they are.
-
-The sentences are for explanation only and are not shown to the user.",
+'metadata-expand' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.',
+'metadata-collapse' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on the link {{msg-mw|Metadata-expand}}, you can see more data and information. This message is for the link to hide back the less important data.',
+'metadata-fields' => '{{doc-important|Do not translate list items, only translate the text! So leave "<code>* make</code>" and the other items exactly as they are.}}
+The sentences are for explanation only and are not shown to the user.',
'metadata-langitem' => '{{optional}}
This is used for constructing the list of translations when a metadata property is translated into multiple languages.
Similar to "metadata-langitem" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.',
# EXIF tags
-'exif-imagewidth' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-
+'exif-imagewidth' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
{{Identical|Width}}',
-'exif-imagelength' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-
+'exif-imagelength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
{{Identical|Height}}',
-'exif-bitspersample' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-compression' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-bitspersample' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-compression' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-This field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. http://en.wikipedia.org/wiki/TIFF#TIFF_Compression_Tag has information about this field.
+This field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. [[w:TIFF#TIFF_Compression_Tag]] has information about this field.
{{Related|Exif-compression}}',
-'exif-photometricinterpretation' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-orientation' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-photometricinterpretation' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-orientation' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
For specific information on the orientation tag, see http://sylvana.net/jpegcrop/exif_orientation.html
{{Related|Exif-orientation}}',
-'exif-samplesperpixel' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-planarconfiguration' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-samplesperpixel' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-planarconfiguration' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
See also:
* {{msg-mw|Exif-planarconfiguration}}
* {{msg-mw|Exif-planarconfiguration-1}}
* {{msg-mw|Exif-planarconfiguration-2}}',
-'exif-ycbcrsubsampling' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-ycbcrpositioning' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-ycbcrsubsampling' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-ycbcrpositioning' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
{{Related|Exif-ycbcrpositioning}}',
-'exif-xresolution' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-xresolution' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
This is the horizontal resolution in either dots/inch or dots/cm.',
-'exif-yresolution' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-yresolution' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
This is the vertical resolution in either dots/inch or dots/cm.',
-'exif-stripoffsets' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-rowsperstrip' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-stripbytecounts' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-jpeginterchangeformat' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-jpeginterchangeformatlength' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-whitepoint' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-stripoffsets' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-rowsperstrip' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-stripbytecounts' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-jpeginterchangeformat' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-jpeginterchangeformatlength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-whitepoint' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
'exif-primarychromaticities' => 'The chromaticity of the three primary colours of the image. Normally this tag is not necessary, since colour space is specified in the colour space information tag. This should probably be translated it as "Chromaticity of primary colours".
-Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-ycbcrcoefficients' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-referenceblackwhite' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-datetime' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-ycbcrcoefficients' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-referenceblackwhite' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-datetime' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Note, this message is also used for the XMP:ModifyDate property in XMP metadata. See page 35 of http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf
Datetime is the time that the digital file was last changed.',
-'exif-imagedescription' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-imagedescription' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
This property is the description or caption of the image. It is used for the exif ImageDescription property, the dc:description property in XMP (see http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), and the iptc-iim 2:120 caption/abstract property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).
When an image has multiple differing descriptions, mediawiki follows the MWG guidelines when deciding which to show (Which typically means Exif takes precedence).',
-'exif-make' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-make' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The Manufacturer of the digital camera (or scanner) that took the photo.',
-'exif-model' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-model' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The model of camera (or scanner) used to take the picture.',
'exif-software' => 'Short for "The software which was used to create or modify this image".
The property can come from the Exif Software tag, PNG software chunk, iptc-iim 2:65 Software field, or XMP\'s xmp:CreatorTool field.
-Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-artist' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-artist' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
This message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practise very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.
This property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.
-
{{Identical|Author}}",
-'exif-copyright' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-copyright' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Label for information contained in exif Copyright tag, XMP dc:rights, IPTC-iim 2:116, or PNG copyright textual chunk.
Typically the copyright statement for the photograph/drawing/video (such as ''(c) 2010 John Smith. Released under GFDL''). Sometimes contains license information. See also {{msg-mw|exif-copyrightowner}}",
-'exif-exifversion' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-exifversion' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Version of exif standard photo uses. Typically this is 2.22',
-'exif-flashpixversion' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-flashpixversion' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Version of flashpix used. Flashpix is a format used for storing some types of metadata in image. It is not as commonly used as EXIF, and mediawiki currently cannot read Flashpix data.',
-'exif-colorspace' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-colorspace' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The colorspace of the photo. This tells the computer how to make the colours in the photo be more true to the original photo. Typical values for this are sRGB or uncalibrated. This only gives information on colour information given in the exif-colorspace property. However, colour information is often stored elsewhere in the photo.
* {{msg-mw|Exif-colorspace}}
* {{msg-mw|Exif-colorspace-1|optional}}
* {{msg-mw|Exif-colorspace-65535}}',
-'exif-componentsconfiguration' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-componentsconfiguration' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
This contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.
{{Related|Exif-componentsconfiguration}}',
-'exif-compressedbitsperpixel' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-pixelydimension' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-pixelxdimension' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-usercomment' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-compressedbitsperpixel' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-pixelydimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-pixelxdimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-usercomment' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Comments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practise utf-8 is used in ImageDescription, so this field isn't used too much.)",
-'exif-relatedsoundfile' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-relatedsoundfile' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Some cameras offer the option to record an audio "memo" for the photo they just took. If the user did that, the name of the file is labelled with this message.',
-'exif-datetimeoriginal' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-datetimeoriginal' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The date and time when the original image data was generated. For example if it was a painting from 1773, scanned in to a computer in 2007, the datetimeoriginal would be 1773 and {{msg-mw|exif-datetimedigitized}} would have the 2007 date.',
-'exif-datetimedigitized' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-datetimedigitized' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The date and time when the image was stored as digital data.',
-'exif-subsectime' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-subsectime' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
'DateTime subseconds' shows the detail of the fraction of a second (1/100s) at which the file was changed, when the tag {{msg-mw|Exif-datetime}} is recorded to the whole second.",
-'exif-subsectimeoriginal' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-subsectimeoriginal' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
This tag shows the detail of the fraction of a second (1/100s) at which the file data was originally generated, when the tag {{msg-mw|Exif-datetimeoriginal}} is recorded to the whole second.',
-'exif-subsectimedigitized' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-subsectimedigitized' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
This tag shows the detail of the fraction of a second (1/100s) at which the file was stored as digital data, when the tag {{msg-mw|Exif-datetimedigitized}} is recorded to the whole second.',
-'exif-exposuretime' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-exposuretime' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The exposure time. Number of (or fraction of) seconds the film was exposed to light. The value for this property is formatted using {{msg-mw|exif-exposuretime-format}}',
-'exif-exposuretime-format' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-exposuretime-format' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+
+Parameters:
+* $1 - the exposure time written as a fraction of a second, for example 1/640 of a second
+* $2 - the exposure time written as a decimal, for example 0.0015625
-*$1 is the exposure time written as a fraction of a second, for example 1/640 of a second.
-*$2 is the exposure time written as a decimal, for example 0.0015625.
-*'sec' is the abbreviation used in English for the unit of time 'second'.",
-'exif-fnumber' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'sec' is the abbreviation used in English for the unit of time 'second'.",
+'exif-fnumber' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-The [http://en.wikipedia.org/wiki/F_number F number] is the relative aperture of the camera.',
+The [[w:F_number|F number]] is the relative aperture of the camera.',
'exif-fnumber-format' => "{{optional}}
Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
*$1 is a number
*f is the abbreviation used in English for 'f-number'.",
-'exif-exposureprogram' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-exposureprogram' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
How the camera figured out what exposure to use. (If it was manually set, if its optimizing for fast shutter speed, etc).
{{Related|Exif-exposureprogram}}',
-'exif-spectralsensitivity' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-spectralsensitivity' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
How sensitive each channel (colour) of the photo is to light. This tag is almost never used.',
-'exif-isospeedratings' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-isospeedratings' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The iso speed of the film used in the camera. This is basically a measure of how sensitive the film in the camera is to light.',
-'exif-shutterspeedvalue' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-shutterspeedvalue' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-[http://en.wikipedia.org/wiki/Shutter_speed Shutter speed] is the time that the camera shutter is open.
+[[w:Shutter_speed|Shutter speed]] is the time that the camera shutter is open.
This is the shutter speed measured in APEX units (negative base 2 log of shutter speed in seconds). See {{msg-mw|exif-exposuretime}} for this property in more traditional units of seconds.',
-'exif-aperturevalue' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-aperturevalue' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-The [http://en.wikipedia.org/wiki/Aperture aperture] of a camera is the hole through which light shines. This message can be translated 'Aperture width'. Note, this is measured in APEX units which is 2*log<sub>2</sub>(f-number) . See {{msg-mw|exif-fnumber}} for this value in more traditional units.",
-'exif-brightnessvalue' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+The [[w:Aperture|aperture]] of a camera is the hole through which light shines. This message can be translated 'Aperture width'. Note, this is measured in APEX units which is 2*log<sub>2</sub>(f-number) . See {{msg-mw|exif-fnumber}} for this value in more traditional units.",
+'exif-brightnessvalue' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
How intense the illumination of the scene photographed is. Measured in APEX brightness units. See Annex C of Exif standard for details on the measurement system in use.',
-'exif-exposurebiasvalue' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-exposurebiasvalue' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-Another term for [http://en.wikipedia.org/wiki/Exposure_bias 'exposure bias'] is 'exposure compensation'.",
-'exif-maxaperturevalue' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+Another term for [[w:Exposure_bias|'exposure bias']] is 'exposure compensation'.",
+'exif-maxaperturevalue' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The 'land' in a camera refers possibly to the inner surface of the barrel of the lens. An alternative phrasing for this message could perhaps be 'maximum width of the land aperture'.",
-'exif-subjectdistance' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-subjectdistance' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
The subject of a photograph is the person or thing on which the camera focuses. 'Subject distance' is the distance to the subject given in meters.",
-'exif-meteringmode' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-meteringmode' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-See [http://en.wikipedia.org/wiki/Metering_mode Wikipedia article] on metering mode.
+See [[w:Metering_mode|Wikipedia article]] on metering mode.
{{Related|Exif-meteringmode}}',
-'exif-lightsource' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-lightsource' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
{{Related|Exif-lightsource}}',
-'exif-flash' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-flash' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-See this [http://en.wikipedia.org/wiki/Flash_(photography) Wikipedia article] for an explanation of the term.
+See this [[w:en:Flash_(photography)|Wikipedia article]] for an explanation of the term.
See also:
* {{msg-mw|Exif-flash}}
* {{msg-mw|Exif-flash-fired-0}}
* {{msg-mw|Exif-flash-fired-1}}
{{Identical|Flash}}',
-'exif-focallength' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-focallength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-See this [http://en.wikipedia.org/wiki/Focal_length_(photography) Wikipedia article] for an explanation of the term.',
+See this [[w:en:Focal_length_(photography)|Wikipedia article]] for an explanation of the term.',
'exif-focallength-format' => "{{optional}}
Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
*$1 is a number
*mm is the abbreviation used in English for the unit of measurement of length 'millimetre'.",
-'exif-subjectarea' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-subjectarea' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
This exif property contains the position of the main subject. The first two numbers is the position of the subject in the picture in pixels from the upper left corner. If a third number is specified, it is a circle centred at the first two numbers. If four numbers are specified, the first two are coordinates of the centre of the subject as before, the third is the width of the rectangle, and the fourth is the height of the rectangle. It is rare for a photo to use this tag.',
-'exif-flashenergy' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-flashenergy' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
How bright the flash is in beam candle power seconds.',
-'exif-focalplanexresolution' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-focalplanexresolution' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Indicates the number of pixels in the image width (X) direction per FocalPlaneResolutionUnit on the camera focal plane.',
-'exif-focalplaneyresolution' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-focalplaneresolutionunit' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-focalplaneyresolution' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-focalplaneresolutionunit' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
See also:
* {{msg-mw|Exif-focalplaneresolutionunit-2}}',
-'exif-subjectlocation' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-subjectlocation' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Same as {{msg-mw|exif-subjectarea}} but only ever has two numbers as a value.',
-'exif-exposureindex' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-sensingmethod' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-exposureindex' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-sensingmethod' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
{{Related|Exif-sensingmethod}}',
-'exif-filesource' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-filesource' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
Determines if the image was recorded by a digital camera adhering to DSC standard (which is almost all digital cameras).',
-'exif-scenetype' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-scenetype' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
If the image is directly photographed (taken by a digital camera).
See also:
* {{msg-mw|Exif-scenetype}}
* {{msg-mw|Exif-scenetype-1}}',
-'exif-customrendered' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-customrendered' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-See also Wikipedia on [http://en.wikipedia.org/wiki/Image_processing image processing].
+See also Wikipedia on [[w:Image_processing|image processing]].
See also:
* {{msg-mw|Exif-customrendered}}
* {{msg-mw|Exif-customrendered-0}}
* {{msg-mw|Exif-customrendered-1}}',
-'exif-exposuremode' => "Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-exposuremode' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-See also Wikipedia on [http://en.wikipedia.org/wiki/Exposure_(photography) exposure in photography]. This tag shows if the photo's exposure was manually set or automatically determined.
+See also Wikipedia on [[w:en:Exposure_(photography)|exposure in photography]]. This tag shows if the photo's exposure was manually set or automatically determined.
{{Related|Exif-exposuremode}}",
-'exif-whitebalance' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-whitebalance' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-See also Wikipedia on [http://en.wikipedia.org/wiki/Color_balance color balance].
+See also Wikipedia on [[w:Color_balance|color balance]].
See also:
* {{msg-mw|Exif-whitebalance}}
* {{msg-mw|Exif-whitebalance-0}}
* {{msg-mw|Exif-whitebalance-1}}',
-'exif-digitalzoomratio' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-digitalzoomratio' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-See also Wikipedia on [http://en.wikipedia.org/wiki/Digital_zoom digital zoom].',
-'exif-focallengthin35mmfilm' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+See also Wikipedia on [[w:Digital_zoom|digital zoom]].',
+'exif-focallengthin35mmfilm' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
-See also Wikipedia on [http://en.wikipedia.org/wiki/Focal_length#In_photography focal length].',
+See also Wikipedia on [[w:Focal_length#In_photography|focal length]].',
'exif-scenecapturetype' => '{{Related|Exif-scenecapturetype}}',
'exif-gaincontrol' => 'Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.
{{Related|Exif-gaincontrol}}',
{{Identical|Language}}",
'exif-iimversion' => 'IIM version number. Version of information interchange 2:xx records. 4 is current version. 2 is often seen as well. This is the value stored 2:00 field (Note, iptc-iim also stores a model version in 1:00. This version field displays the 2:00 record only)',
'exif-iimcategory' => 'Primary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.
-{{identical|Category}}',
+{{Identical|Category}}',
'exif-iimsupplementalcategory' => 'Supplemental categories. Like {{msg-mw|exif-iimcategory}} but for categories beyond the main one.',
'exif-datetimeexpires' => 'Date after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.',
'exif-datetimereleased' => 'Earliest date the image (media) can be used. See 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
{{Related|Exif-componentsconfiguration}}',
'exif-exposureprogram-0' => '{{Related|Exif-exposureprogram}}',
-'exif-exposureprogram-1' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[http://en.wikipedia.org/wiki/Mode_dial Mode dial]' for an explanation.
+'exif-exposureprogram-1' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.
{{Related|Exif-exposureprogram}}",
-'exif-exposureprogram-2' => '{{Related|Exif-exposureprogram}}',
-'exif-exposureprogram-3' => 'One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [http://en.wikipedia.org/wiki/Aperture_priority aperture priority].
+'exif-exposureprogram-2' => 'One of the exposure program types in the table of metadata on image description pages.
+{{Related|Exif-exposureprogram}}',
+'exif-exposureprogram-3' => 'One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Aperture_priority|aperture priority]].
{{Related|Exif-exposureprogram}}',
-'exif-exposureprogram-4' => 'One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [http://en.wikipedia.org/wiki/Shutter_priority shutter priority].
+'exif-exposureprogram-4' => 'One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Shutter_priority|shutter priority]].
{{Related|Exif-exposureprogram}}',
-'exif-exposureprogram-5' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[http://en.wikipedia.org/wiki/Mode_dial Mode dial]' for an explanation.
+'exif-exposureprogram-5' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.
{{Related|Exif-exposureprogram}}",
-'exif-exposureprogram-6' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[http://en.wikipedia.org/wiki/Mode_dial Mode dial]' for an explanation.
+'exif-exposureprogram-6' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.
{{Related|Exif-exposureprogram}}",
-'exif-exposureprogram-7' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[http://en.wikipedia.org/wiki/Mode_dial Mode dial]' for an explanation.
+'exif-exposureprogram-7' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.
{{Related|Exif-exposureprogram}}",
-'exif-exposureprogram-8' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[http://en.wikipedia.org/wiki/Mode_dial Mode dial]' for an explanation.
+'exif-exposureprogram-8' => "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.
{{Related|Exif-exposureprogram}}",
'exif-subjectdistance-value' => '$1 is a distance measured in metres. The value can, and usually does, include decimal places.',
* {{msg-mw|Exif-flash}}
* {{msg-mw|Exif-flash-fired-0}}
* {{msg-mw|Exif-flash-fired-1}}',
-'exif-flash-return-0' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-flash-return-0' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
"Strobe" and "flash" mean the same here.
* {{msg-mw|Exif-flash-return-0}}
* {{msg-mw|Exif-flash-return-2}}
* {{msg-mw|Exif-flash-return-3}}',
-'exif-flash-return-2' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-flash-return-2' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
"Strobe" and "flash" mean the same here.
* {{msg-mw|Exif-flash-return-0}}
* {{msg-mw|Exif-flash-return-2}}
* {{msg-mw|Exif-flash-return-3}}',
-'exif-flash-return-3' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+'exif-flash-return-3' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
"Strobe" and "flash" mean the same here.
* {{msg-mw|Exif-flash-mode-1}}
* {{msg-mw|Exif-flash-mode-2}}
* {{msg-mw|Exif-flash-mode-3}}',
-'exif-flash-function-1' => 'Exif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-flash-function-1' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
'exif-focalplaneresolutionunit-2' => 'See also:
* {{msg-mw|Exif-focalplaneresolutionunit}}',
'exif-exposuremode-0' => '{{Related|Exif-exposuremode}}',
'exif-exposuremode-1' => '{{Related|Exif-exposuremode}}',
-'exif-exposuremode-2' => "A type of exposure mode shown as part of the metadata on image description pages. The Wikipedia article on [http://en.wikipedia.org/wiki/Bracketing#Exposure_bracketing bracketing] says that 'auto bracket' is a camera exposure setting which automatically takes a series of pictures at slightly different light exposures.
+'exif-exposuremode-2' => "A type of exposure mode shown as part of the metadata on image description pages. The Wikipedia article on [[w:Bracketing#Exposure_bracketing|bracketing]] says that 'auto bracket' is a camera exposure setting which automatically takes a series of pictures at slightly different light exposures.
{{Related|Exif-exposuremode}}",
'exif-whitebalance-0' => 'See also:
'exif-subjectdistancerange-0' => '{{Related|Exif-subjectdistancerange}}
{{Identical|Unknown}}',
-'exif-subjectdistancerange-1' => 'Macro view is close-up photography. See [http://en.wikipedia.org/wiki/Macro_photography Wikipedia].
+'exif-subjectdistancerange-1' => 'Macro view is close-up photography. See [[w:Macro_photography|Wikipedia]].
{{Identical|Macro}}
{{Related|Exif-subjectdistancerange}}',
'exif-subjectdistancerange-2' => '{{Related|Exif-subjectdistancerange}}',
See: http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrpositioning.html
{{Related|Exif-ycbcrpositioning}}',
-'exif-dc-contributor' => 'People who helped make the resource, but are secondary in contribution to the author.',
+'exif-dc-contributor' => 'People who helped make the resource, but are secondary in contribution to the author.
+{{Identical|Contributor}}',
'exif-dc-coverage' => '"The extent or scope of the resource" see dc:coverage in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf',
'exif-dc-date' => 'One or more dates associated with the image. How they are associated is not really defined. From the dc:date XMP property.',
'exif-dc-publisher' => 'One or more publisher of resource.
'exif-iimcategory-hum' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
'exif-iimcategory-lab' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}
-"Labour" here refers to all news on labour issues; employment; unemployment; work relations; labour disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)',
+"Labor" here refers to all news on labor issues; employment; unemployment; work relations; labor disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)',
'exif-iimcategory-lif' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
'exif-iimcategory-pol' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
'exif-iimcategory-rel' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
'exif-iimcategory-sci' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
'exif-iimcategory-soi' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
-'exif-iimcategory-spo' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
+'exif-iimcategory-spo' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}.
+{{Identical|Sport}}',
'exif-iimcategory-war' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
'exif-iimcategory-wea' => 'Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}',
# External editor support
'edit-externally' => 'Displayed on image description pages. See for example [[:Image:Yes.png#filehistory]].',
-'edit-externally-help' => 'Displayed on image description pages. See for example [[:Image:Yes.png#filehistory]].
-
-Please leave the link http://www.mediawiki.org/wiki/Manual:External_editors exactly as it is.',
+'edit-externally-help' => '{{doc-important|Please leave the link "<code>http://www.mediawiki.org/wiki/Manual:External_editors</code>" exactly as it is.}}
+Displayed on image description pages. See for example [[:Image:Yes.png#filehistory]].',
# 'all' in various places, this might be different for inflected languages
'watchlistall2' => 'Appears on [[Special:Watchlist]].
'namespacesall' => 'In special page [[Special:WhatLinksHere]]. Drop-down box option for namespace.
{{Identical|All}}',
-'monthsall' => 'Used in a drop-down box on [[Special:Contributions]] as an option for "all months". See also [[MediaWiki:Month/{{SUBPAGENAME}}]].
-
+'monthsall' => 'Used in a drop-down box on [[Special:Contributions]] as an option for "all months". See also {{msg-mw|Month}}.
{{Identical|All}}',
'limitall' => 'Used on [[Special:AllMessages]] (and potentially other TablePager based tables) to display "all" the messages.
{{Identical|All}}',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Title of [[Special:ConfirmEmail]] page.',
'confirmemail_noemail' => 'Failure message on [[Special:ConfirmEmail]].',
'confirmemail_text' => 'Explanation on [[Special:ConfirmEmail]]',
Name of month in Hebrew calendar.',
# Signatures
-'signature' => "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp)
-* $1: the username that is currently login
-* $2: the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw
+'signature' => "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp). Parameters:
+* $1 - the username that is currently login
+* $2 - the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw
Use your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.",
'timezone-utc' => '{{optional}}',
# Core parser functions
-'unknown_extension_tag' => '* Description: This is an error shown when you use an unknown extension tag name. This feature allows tags like <tt><nowiki><pre></nowiki></tt> to be called with a parser like <tt><nowiki>{{#tag:pre}}</nowiki></tt>.
-* Parameter $1: This is the unknown extension tag name.',
-'duplicate-defaultsort' => 'See definition of [http://en.wikipedia.org/wiki/Sorting sort key] on Wikipedia.',
+'unknown_extension_tag' => 'This is an error shown when you use an unknown extension tag name.
+
+This feature allows tags like <code><nowiki><pre></nowiki></code> to be called with a parser like <code><nowiki>{{#tag:pre}}</nowiki></code>.
+
+Parameters:
+* $1 - the unknown extension tag name',
+'duplicate-defaultsort' => 'See definition of [[w:Sorting|sort key]] on Wikipedia.',
# Special:Version
'version' => 'Name of special page displayed in [[Special:SpecialPages]]
{{Identical|Version}}',
'version-extensions' => 'Header on [[Special:Version]].',
'version-specialpages' => 'Part of [[Special:Version]].
-
-{{Identical|Special pages}}',
+{{Identical|Special page}}',
'version-parserhooks' => 'This message is a heading at [[Special:Version]] for extensions that modifies the parser of wikitext.',
'version-variables' => '{{Identical|Variable}}',
'version-antispam' => 'Part of [[Special:Version]].
{{Identical|Revision}}',
'version-license' => '{{Identical|License}}',
-'version-poweredby-credits' => 'Message shown on [[Special:Version]]. Parameters are:
-*$1: the current year
-*$2: a list of selected MediaWiki authors',
+'version-poweredby-credits' => 'Message shown on [[Special:Version]]. Parameters:
+* $1 - the current year
+* $2 - a list of selected MediaWiki authors',
'version-poweredby-others' => 'Used at the very end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there\'s a long list of selected MediaWiki authors, then the word "and" (from {{msg-mw|and}}) follows and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.',
'version-credits-summary' => 'Summary of the [[Special:Version/Credits]] sub page, which lists all developers etc. who contributed to MediaWiki. Shown at the top.',
'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
'fileduplicatesearch-submit' => 'Button label on [[Special:FileDuplicateSearch]].
{{Identical|Search}}',
-'fileduplicatesearch-info' => 'Information beneath the thumbnail on the right side shown after a successful search via [[Special:FileDuplicateSearch]]
+'fileduplicatesearch-info' => 'Information beneath the thumbnail on the right side shown after a successful search via [[Special:FileDuplicateSearch]].
-* $1: width of the file
-* $2: height of the file
-* $3: File size
-* $4: MIME type',
+Parameters:
+* $1 - width of the file
+* $2 - height of the file
+* $3 - File size
+* $4 - MIME type',
'fileduplicatesearch-result-1' => 'Result line after the list of files of [[Special:FileDuplicateSearch]]
$1 is the name of the requested file.',
* {{msg-mw|Specialpages}}
* {{msg-mw|Accesskey-t-specialpages}}
* {{msg-mw|Tooltip-t-specialpages}}
-{{Identical|Special pages}}',
+{{Identical|Special page}}',
'specialpages-note' => 'Footer note for the [[Special:SpecialPages]] page',
'specialpages-group-maintenance' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
'specialpages-group-other' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
# External image whitelist
'external_image_whitelist' => "As usual please leave all the wiki markup, including the spaces, as they are. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.
-See definition of [http://en.wikipedia.org/wiki/Regular_expression regular expression] on Wikipedia.",
+See definition of [[w:Regular_expression|regular expression]] on Wikipedia.",
# Special:Tags
-'tags' => "Shown on [[Special:Specialpages]] for page listing the tags that the software may mark an edit with, and their meaning. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].
+'tags' => "Shown on [[Special:Specialpages]] for page listing the tags that the software may mark an edit with, and their meaning. For more information on tags see [[mw:Manual:Tags|MediaWiki]].
It appears that the word 'valid' describes 'tags', not 'change'. It also appears that you could use the term 'defined' instead of 'valid', or perhaps use a phrase meaning 'Change tags in use'.",
'tag-filter' => 'Caption of a filter shown on lists of changes (e.g. [[Special:Log]], [[Special:Contributions]], [[Special:Newpages]], [[Special:Recentchanges]], [[Special:Recentchangeslinked]], page histories)',
{{Identical|Filter}}',
'tags-title' => 'The title of [[Special:Tags]]',
-'tags-intro' => 'Explanation on top of [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].',
-'tags-tag' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].',
-'tags-display-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].',
-'tags-description-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].',
-'tags-hitcount-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].',
-'tags-edit' => '{{Identical|Edit}}
-Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.',
-'tags-hitcount' => 'Shown in the "{{msg-mw|Tags-hitcount-header}}" column in [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].
+'tags-intro' => 'Explanation on top of [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-tag' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-display-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-description-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-hitcount-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-edit' => 'Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.
+{{Identical|Edit}}',
+'tags-hitcount' => 'Shown in the "{{msg-mw|Tags-hitcount-header}}" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].
-* <code>$1</code> is the number of changes marked with the tag',
+Parameters:
+* $1 - the number of changes marked with the tag',
# Special:ComparePages
'comparepages' => 'The title of [[Special:ComparePages]]',
{{Identical|Other}}',
# SQLite database support
-'sqlite-has-fts' => 'Shown on Special:Version, $1 is version',
-'sqlite-no-fts' => 'Shown on Special:Version, $1 is version',
+'sqlite-has-fts' => 'Shown on [[Special:Version]].
+Parameters:
+* $1 - version',
+'sqlite-no-fts' => 'Shown on [[Special:Version]].
+Parameters:
+* $1 - version',
# New logging system
'logentry-delete-delete' => '{{Logentry}}',
'feedback-bugornote' => 'When feedback dialog box is opened, this introductory message in small print explains the options to report a bug or add simple feedback. We expect that people in a hurry will not read this.',
'feedback-subject' => 'Label for a text input
{{Identical|Subject}}',
-'feedback-message' => 'Label for a textarea; signature referrs to a Wikitext signature.',
+'feedback-message' => 'Label for a textarea; signature referrs to a Wikitext signature.
+{{Identical|Message}}',
'feedback-cancel' => 'Button label
{{Identical|Cancel}}',
'feedback-submit' => 'Button label
'api-error-badtoken' => 'API error message that can be used for client side localisation of API errors.',
'api-error-copyuploaddisabled' => 'API error message that can be used for client side localisation of API errors.',
'api-error-duplicate' => 'API error message that can be used for client side localisation of API errors. Parameters:
-* $1 is a number of files
-* $2 is a link to a list of duplicate files.',
+* $1 - a number of files
+* $2 - a link to a list of duplicate files',
'api-error-duplicate-archive' => 'API error message that can be used for client side localisation of API errors. Parameters:
-* $1 is a number of files
-* $2 is a link to a list of duplicate files.',
+* $1 - a number of files
+* $2 - a link to a list of duplicate files',
'api-error-duplicate-archive-popup-title' => 'API error message that can be used for client side localisation of API errors. Parameters:
* $1 is a number of files.',
'api-error-duplicate-popup-title' => 'This message is a pop-up title shown in case one or more files exactly equal to the one just uploaded are already present. The word "duplicate" is an adjective.',
'duration-centuries' => '{{Related|Duration}}',
'duration-millennia' => '{{Related|Duration}}',
+# Image rotation
+'rotate-comment' => 'Edit summary for the act of rotating an image.',
+
);
'loginlanguagelabel' => 'Limba: $1',
'suspicious-userlogout' => 'Cererea dumneavoastră de a închide sesiunea a fost refuzată întrucât pare că a fost trimisă printr-o eroare a navigatorului sau de un proxy memorat în cache.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Eroare necunoscută în funcția PHP mail()',
'user-mail-no-addy' => 'S-a încercat trimiterea e-mailului fără o adresă de e-mail.',
'user-mail-no-body' => 'S-a încercat trimiterea unui e-mail fără conținut sau nejustificat de scurt.',
'prefs-displaywatchlist' => 'Opțiuni de afișare',
'prefs-diffs' => 'Diferențe',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Adresa de e-mail pare validă',
'email-address-validity-invalid' => 'Introduceți o adresă de e-mail validă',
Acestea ar trebui să conțină legături către un articol mai potrivit.<br />
O pagină este considerată o pagină de dezambiguizare dacă folosește formate care apar la [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pagini cu o proprietate de pagină',
+'pageswithprop-legend' => 'Pagini cu o proprietate de pagină',
+'pageswithprop-text' => 'Această pagină listează paginile care utilizează o anumită proprietate de pagină.',
+'pageswithprop-prop' => 'Numele proprietății:',
+'pageswithprop-submit' => 'Du-te',
+
'doubleredirects' => 'Redirecționări duble',
'doubleredirectstext' => 'Această listă conține pagini care redirecționează la alte pagini de redirecționare.
Fiecare rând conține legături la primele două redirecționări, precum și ținta celei de-a doua redirecționări, care este de obicei pagina țintă "reală", către care ar trebui să redirecționeze prima pagină.
'listgrouprights-addgroup-self-all' => 'Pot fi adăugate toate grupurile contului propriu',
'listgrouprights-removegroup-self-all' => 'Pot fi șterse toate grupurile din contul propriu',
-# E-mail user
+# Email user
'mailnologin' => 'Nu există adresă de trimitere',
'mailnologintext' => 'Trebuie să fii [[Special:UserLogin|autentificat]] și să ai o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.',
'emailuser' => 'Trimiteți un e-mail',
'monthsall' => 'toate',
'limitall' => 'toate',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Confirmă adresa de e-mail',
'confirmemail_noemail' => 'Nu aveți o adresă de e-mail validă setată la [[Special:Preferences|preferințe]].',
'confirmemail_text' => '{{SITENAME}} solicită validarea adresei de e-mail înaintea utilizării funcțiilor specifice poștei electronice.
'duration-centuries' => '$1 {{PLURAL:$1|secol|secole|de secole}}',
'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenii|de milenii}}',
+# Image rotation
+'rotate-comment' => 'Imagine rotită în sensul acelor de ceasornic cu $1 {{PLURAL:$1|grad|grade|de grade}}',
+
);
'loginlanguagelabel' => 'Lénga: $1',
'suspicious-userlogout' => "'A richiesta toje de assè ha state bloccate purcè pare ca ha state mannate da 'nu browser scuasciate o da 'a cache de 'nu proxy.",
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "Errore scanusciute jndr'à funzione PHP mail()",
'user-mail-no-addy' => "E' pruvate a mannà 'na mail senze 'u 'ndirizze mail",
'user-mail-no-body' => "Pruvate a mannà 'na mail cu 'nu cuèrpe vacande o troppe curte.",
'prefs-displaywatchlist' => "Fà vedè l'opzione",
'prefs-diffs' => 'Diff',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => "L'indirizze e-mail pare valide",
'email-address-validity-invalid' => "Mitte 'n'indirizze e-mail valide",
'Nvece avessere appondà a 'a temateca appropriate.<br />
'Na pàgene jè trattate cumme pàgene de disambiguazione ce tu ause 'nu template ca è appundate da [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => "Pàggene cu 'na probbietà d'a pàgene",
+'pageswithprop-legend' => "Pàggene cu 'na probbietà d'a pàgene",
+'pageswithprop-text' => "Sta pàgene elenghe le pàggene ca ausane 'na particolare probbietà d'a pàgene.",
+'pageswithprop-prop' => "Nome d'a probbietà:",
+'pageswithprop-submit' => 'Véje',
+
'doubleredirects' => 'Ridirezionaminde a doppie',
'doubleredirectstext' => "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.
Ogne righe condene 'nu collegamende a 'u prime e a 'u seconde ridirezionamende pe fà vedè addò arrive 'u seconde ridirezionamende, 'u quale jè normalmende 'a pàgena de destinaziona \"rèale\", addò 'u prime ridirezionamende avesse appondà.
'listgrouprights-addgroup-self-all' => "Mitte tutte le gruppe sus a 'u cunde utende mije",
'listgrouprights-removegroup-self-all' => "Live tutte le gruppe da 'u cunde utende mije",
-# E-mail user
+# Email user
'mailnologin' => 'Nisciune indirizze de invie',
'mailnologintext' => "Tu a essere [[Special:UserLogin|collegate]] e a avè 'n'indirizze email valide jndr'à le [[Special:Preferences|preferenze]] tue pe mannà 'na mail a otre utinde.",
'emailuser' => "Manne n'email a stu utende",
'monthsall' => 'tutte',
'limitall' => 'tutte',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => "Conferme l'indirizze e-mail",
'confirmemail_noemail' => "Tu non ge tine 'n'indirizze e-mail valide configurate sus a le [[Special:Preferences|preferenze tue]].",
'confirmemail_text' => "{{SITENAME}} richiede ca tu ha validà l'indirizze email tue apprime de ausà 'a funzione de l'email.
'duration-centuries' => '$1 {{PLURAL:$1|sechele|sechele}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennie|millennie}}',
+# Image rotation
+'rotate-comment' => 'Immaggine rotate de $1 {{PLURAL:$1|grade}} in sienze orarie',
+
);
'loginlanguagelabel' => 'Язык: $1',
'suspicious-userlogout' => 'Ваш запрос на завершение сеанса отклонён, так как он похож на запрос, отправленный некорректным браузером или кэширующим прокси.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Неизвестная ошибка в PHP-функции mail()',
'user-mail-no-addy' => 'Пытался отправить электронное письмо без адреса электронной почты',
'user-mail-no-body' => 'Пытался отправить электронное письмо с пустым или бессмысленно коротким содержанием.',
'search-interwiki-default' => '$1 результ.:',
'search-interwiki-more' => '(ещё)',
'search-relatedarticle' => 'Связанный',
-'mwsuggest-disable' => 'Отключить AJAX-подсказки',
+'mwsuggest-disable' => 'Отключить подсказки поиска',
'searcheverything-enable' => 'Поиск по всем пространствам имён',
'searchrelated' => 'связанный',
'searchall' => 'все',
'prefs-displaywatchlist' => 'Настройки отображения',
'prefs-diffs' => 'Разница версий',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Выглядит корректно',
'email-address-validity-invalid' => 'Введите корректный адрес электронной почты!',
Вместо этого они, вероятно, должны указывать на соответствующую конкретную страницу.<br />
Страница считается многозначной, если на ней размещён шаблон, имя которого указано на странице [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Страницы с переопределёнными свойствами',
+'pageswithprop-legend' => 'Страницы с переопределёнными свойствами',
+'pageswithprop-text' => 'Здесь перечислены страницы, у которых были вручную переопределены отдельные свойства.',
+'pageswithprop-prop' => 'Название свойства:',
+'pageswithprop-submit' => 'Найти',
+
'doubleredirects' => 'Двойные перенаправления',
'doubleredirectstext' => 'На этой странице представлен список перенаправлений на другие перенаправления.
Каждая строка содержит ссылки на первое и второе перенаправления, а также целевую страницу второго перенаправления, в которой обычно указывается название страницы, куда должно ссылаться первое перенаправление.
'listgrouprights-addgroup-self-all' => 'Может добавлять все группы к своей учётной записи',
'listgrouprights-removegroup-self-all' => 'может удалять все группы со своей учётной записи',
-# E-mail user
+# Email user
'mailnologin' => 'Адрес для отправки отсутствует',
'mailnologintext' => 'Вы должны [[Special:UserLogin|представиться системе]] и иметь действительный адрес электронной почты в ваших [[Special:Preferences|настройках]], чтобы иметь возможность отправлять электронную почту другим участникам.',
'emailuser' => 'Письмо участнику',
Вы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.
Обратите внимание, что страница '''не будет''' переименована, если уже существует страница с названием, идентичным выбранному, кроме случаев, когда такая страница является перенаправлением или пуста, и при этом не имеет истории правок.
-ÐÑ\82о ознаÑ\87аеÑ\82, Ñ\87Ñ\82о вÑ\8b можеÑ\82е пеÑ\80еименоваÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 обÑ\80аÑ\82но в Ñ\82о название, коÑ\82оÑ\80ое Ñ\83 него Ñ\82олÑ\8cко Ñ\87Ñ\82о бÑ\8bло, еÑ\81ли вÑ\8b Ñ\81делали пÑ\80еименование оÑ\88ибоÑ\87но, но вы не можете случайно затереть существующую страницу.
+ÐÑ\82о ознаÑ\87аеÑ\82, Ñ\87Ñ\82о еÑ\81ли вÑ\8b Ñ\81делали пÑ\80еименование оÑ\88ибоÑ\87но, вÑ\8b можеÑ\82е пеÑ\80еименоваÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 обÑ\80аÑ\82но в Ñ\82о название, коÑ\82оÑ\80ое Ñ\83 неÑ\91 Ñ\82олÑ\8cко Ñ\87Ñ\82о бÑ\8bло, но вы не можете случайно затереть существующую страницу.
'''Предупреждение!'''
Переименование ''популярных'' страниц может привести к масштабным и неожиданным изменениям.
-Ð\9fожалÑ\83йÑ\81Ñ\82а, пÑ\80ежде Ñ\87ем вÑ\8b пÑ\80одолжиÑ\82е, Ñ\83бедиÑ\82еÑ\81Ñ\8c, Ñ\87Ñ\82о вÑ\8b понимаете все возможные последствия.",
+Ð\9fожалÑ\83йÑ\81Ñ\82а, пÑ\80ежде Ñ\87ем пÑ\80одолжаÑ\82Ñ\8c, Ñ\83бедиÑ\82еÑ\81Ñ\8c, Ñ\87Ñ\82о понимаете все возможные последствия.",
'movepagetext-noredirectfixer' => "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.
Старое название станет перенаправлением на новое название.
Пожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].
'pageinfo-robot-noindex' => 'Не индексируется',
'pageinfo-views' => 'Количество просмотров',
'pageinfo-watchers' => 'Число наблюдающих',
+'pageinfo-few-watchers' => 'Менее $1 {{PLURAL:$1|следящего|следящих}}',
'pageinfo-redirects-name' => 'Перенаправления на эту страницу',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Подстраницы данной страницы',
'monthsall' => 'все',
'limitall' => 'все',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Подтверждение адреса электронной почты',
'confirmemail_noemail' => 'Вы не задали корректный адрес электронной почты в своих [[Special:Preferences|настройках]].',
'confirmemail_text' => 'Вики-движок требует подтверждения адреса электронной почты перед тем, как начать с ним работать.
'logentry-patrol-patrol-auto' => '$1 автоматически {{GENDER:$1|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
'logentry-newusers-newusers' => 'Создана учётная запись $1',
'logentry-newusers-create' => 'Создана учётная запись $1',
-'logentry-newusers-create2' => '$1 {{GENDER:$2|создал|создала}} учётную запись для $3',
-'logentry-newusers-byemail' => 'Учетная запись пользователя $3 была создана $1 и пароль был отправлен по электронной почте',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|создал|создала}} учётную запись $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|создал|создала}} учётную запись $3 и пароль был отправлен по электронной почте',
'logentry-newusers-autocreate' => 'Автоматически создана учётная запись $1',
'logentry-rights-rights' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3 с $4 на $5',
'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3',
'youhavenewmessages' => 'भवदर्थम् $1 सन्ति। ($2).',
'newmessageslink' => 'नूतनाः सन्देशाः',
'newmessagesdifflink' => 'अन्तिमं परिवर्तनम्',
-'youhavenewmessagesfromusers' => '{{PLURAL:$3|अन्ययोजकः|$3 योजकाः}} ($2) इत्यस्मात् भवतः $1 अस्ति ।',
-'youhavenewmessagesmanyusers' => 'à¤\85नà¥\88à¤\95à¥\87à¤à¥\8dयà¤\83 यà¥\8bà¤\9cà¤\95à¥\87à¤à¥\8dयà¤\83 तà¥\87 $1 सनà¥\8dति $2 ।',
+'youhavenewmessagesfromusers' => 'भवदर्थम् {{PLURAL:$3|अन्यस्मात् सदस्यात्|$3 सदस्येभ्यः}} $1 अस्ति ($2)।',
+'youhavenewmessagesmanyusers' => 'नैकेभ्यः योजकेभ्यः ते $1 सन्ति $2 ।',
'newmessageslinkplural' => '{{PLURAL:$1|नूतनः सन्देशः|नूतनसन्देशाः}}',
'newmessagesdifflinkplural' => 'सद्यः {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
'youhavenewmessagesmulti' => 'भवतः कृते $1 मध्ये नूतनः सन्देशः विद्यते',
'loginlanguagelabel' => 'भाषा : $1',
'suspicious-userlogout' => 'भवतः सत्राद् बहिर्गमनस्य अनुरोधः अस्वीकृतोऽस्ति, यस्मादेतत् भग्नादेकस्मात् ब्राउज़र्तः अथवा स्वल्पसञ्चयि-प्रॉक्सितः प्रेषित आसीत्।',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'पीएच्पी इत्येतस्य mail() फलने अज्ञाता काऽपि त्रुटिर्जाता।',
'user-mail-no-addy' => 'ईपत्रसङ्केतं विना ईपत्रप्रेषणस्य प्रयासः कृतः ।',
'prefs-displaywatchlist' => 'प्रदर्शनविकल्पाः',
'prefs-diffs' => 'अन्तरम्',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'प्रयुक्तः विद्युन्मानपत्रसङ्केतः मानितः ।',
'email-address-validity-invalid' => 'मान्यः विद्युन्मानपत्रसङ्केतः योजनीयः ।',
'listgrouprights-addgroup-self-all' => 'स्वस्थाने सर्वसमूहान योजयतु ।',
'listgrouprights-removegroup-self-all' => 'स्वस्थानात् सर्वसमूहान् अपनयतु ।',
-# E-mail user
+# Email user
'mailnologin' => 'सम्प्रेषणस्य सङ्केतः नास्ति ।',
'mailnologintext' => 'अस्य योजकेभ्यः विद्युन्मानपत्रप्रेषणार्थम् [[Special:UserLogin|नामाभिलेखनम्]] आवश्यकम् [[Special:Preferences|आद्यता]]यां प्रेषयितुं विद्युन्मानपत्रसङ्केतः आवश्यकः ।',
'emailuser' => 'एतस्मै योजकाय ईपत्रं प्रेष्यताम्',
'monthsall' => 'सर्वाणि',
'limitall' => 'सर्वाणि',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'ईपत्रसङ्केतः प्रमाणीक्रियताम्',
'confirmemail_noemail' => 'भवतः योजकाद्यतायां व्यवस्थापितः विद्युन्मानपत्रसङ्केतः मान्यं नाश्ति । [[Special:Preferences|user preferences]]',
'confirmemail_text' => '{{SITENAME}} इत्यत्र विद्युन्मानसुविधोपयोगात् पूर्वं भवतः विद्युन्मानपत्रसङ्केतं मान्यं करोतु ।
Pò èssiri ca ggià canciasti cu successu la tò password o c'addumannasti na nova password timpurrània.",
'resetpass-temp-password' => 'Password timpurrània:',
+# Special:ChangeEmail
+'changeemail-submit' => 'Cancia e-mail',
+
# Edit page toolbar
'bold_sample' => 'Grassettu',
'bold_tip' => 'Grassettu',
'searchhelp-url' => 'Help:Cuntinuti',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualizza li pàggini cu stu prifissu]]',
'searchprofile-articles' => 'Pàggini di cuntinutu',
-'searchprofile-project' => "Pàggini d'aiutu e dô pruggettu",
+'searchprofile-project' => "Pàggini d'ajutu e dô pruggettu",
'searchprofile-images' => 'Multimedia',
'searchprofile-everything' => 'Tuttu',
'searchprofile-advanced' => 'Avanzata',
'linksearch' => 'Lijami di fora',
'linksearch-pat' => 'Mudellu di circata:',
'linksearch-ns' => 'Namespace:',
-'linksearch-ok' => 'Cerca',
+'linksearch-ok' => 'Arriscedi',
'linksearch-text' => 'C\'è la pussibbilitati di fari usu di metacaràttiri, p\'asèmpiu "*.wikipedia.org".<br />
Protucolli suppurtati: <code>$1</code>',
'linksearch-line' => '$1 prisenti ntâ pàggina $2',
'listgrouprights-addgroup-self-all' => 'Junci tutti li gruppa ô propriu account',
'listgrouprights-removegroup-self-all' => 'Può livari tutti li gruppi dô propriu account',
-# E-mail user
+# Email user
'mailnologin' => 'Nuddu ndirizzu cui mannari lu missaggiu',
'mailnologintext' => 'Hai a fari lu [[Special:UserLogin|login]] e aver riggistratu na casella e-mail vàlida ntê tò [[Special:Preferences|prifirenzi]] pi mannari posta alittrònica a àutri Utenti.',
'emailuser' => "Manna n'imail a stu utenti",
# Watchlist
'watchlist' => 'Lista taliata mia',
'mywatchlist' => 'Lista taliata mia',
+'watchlistfor2' => 'Pi $1, $2',
'nowatchlist' => "Nun hai innicatu pàggini a tèniri d'occhiu.",
'watchlistanontext' => "Pi visualizzari e canciari l'alencu di l'ossirvati spiciali è nicissariu $1.",
'watchnologin' => 'Nun hai effittuatu lu login',
'sp-contributions-search' => 'Ricerca cuntribbuti',
'sp-contributions-username' => 'Nnirizzu IP o nomu utenti:',
'sp-contributions-toponly' => "Ammuscia sulu li cuntribbuti ca sunnu l'ùrtimi rivisioni pâ pàggina",
-'sp-contributions-submit' => 'Ricerca',
+'sp-contributions-submit' => 'Risciduta',
# What links here
'whatlinkshere' => 'Chi punta ccà',
'unblocked-id' => 'Lu bloccu $1 hà statu cacciatu',
'ipblocklist' => 'Utiloizzatura bluccati',
'ipblocklist-legend' => "Atrova n'utenti bluccatu",
-'ipblocklist-submit' => 'Ricerca',
+'ipblocklist-submit' => 'Risciduta',
'infiniteblock' => 'nfinitu',
'expiringblock' => 'scadi lu $1 ê $2',
'anononlyblock' => 'sulu anònimi',
'spam_reverting' => "Ripristinata l'ùrtima virsioni priva di culligamenti a $1",
'spam_blanking' => 'Pàggina svacantata, tutti li virsioni cuntinìanu culligamenti a $1',
+# Info page
+'pageinfo-toolboxlink' => 'Nfurmazzioni ncapu la pàggina',
+
# Skin names
'skinname-standard' => 'Classicu',
'skinname-nostalgia' => 'Nustargìa',
'namespacesall' => 'Tutti',
'monthsall' => 'tutti',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Cunferma ndirizzu e-mail',
'confirmemail_noemail' => 'Nun hà statu ndicatu un ndirizzu e-mail vàlidu ntê propi [[Special:Preferences|prifirenzi]].',
'confirmemail_text' => "Stu situ richiedi la virìfica di l ndirizzu e-mail prima di putiri usari li funzioni cunnessi a l'email. Prèmiri lu pulsanti ccà sutta pi mannari na richiesta di cunferma a lu propiu ndirizzu; ntô missaggiu è prisenti un culligamenti ca cunteni un còdici. Visitari lu culligamentu cu lu propiu browser pi cunfirmari ca lu ndirizzu e-mail è vàlidu.",
'rightsnone' => '(nuddu)',
# Search suggestions
-'searchsuggest-search' => 'Ricerca',
+'searchsuggest-search' => 'Risciduta',
# API errors
'api-error-nomodule' => 'Erruri nternu: nun fu mpustatu lu mòdulu di carricamentu',
'newwindow' => '(otvara se u novom prozoru)',
'cancel' => 'Poništi',
'moredotdotdot' => 'Još...',
+'morenotlisted' => 'Više nije prikazano...',
'mypage' => 'Stranica',
'mytalk' => 'Razgovor',
'anontalk' => 'Razgovor za ovu IP adresu',
'gotaccount' => "Imate račun? '''$1'''.",
'gotaccountlink' => 'Prijavi se',
'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
-'createaccountmail' => 'e-mailom',
+'createaccountmail' => 'Koristite privremenu slučajno stvorenu lozinku i pošaljite na dolje specificiranu e-mail adresu',
'createaccountreason' => 'Razlog:',
'badretype' => 'Lozinke koje ste unijeli se ne poklapaju.',
'userexists' => 'Uneseno korisničko ime već je u upotrebi.
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
'user-mail-no-addy' => 'Pokušaj slanja e-maila bez e-mail adrese.',
+'user-mail-no-body' => 'Pokušano slanje e-maila s praznim ili nerazumno kratkim sadržajem.',
# Change password dialog
'resetpass' => 'Promijeni korisničku šifru',
'changeemail-oldemail' => 'Trenutna e-mail adresa:',
'changeemail-newemail' => 'Nova e-mail adresa:',
'changeemail-none' => '(ništa)',
+'changeemail-password' => 'Tvoja šifra/lozinka za {{SITENAME}}:',
'changeemail-submit' => 'Promijeni e-mail',
'changeemail-cancel' => 'Odustani',
'''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
'longpageerror' => "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''
Stranica ne može biti sačuvana.",
-'readonlywarning' => "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da snimite svoje izmjene za sada.
-Možda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.'''
+'readonlywarning' => "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.'''
+Možda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.
Administrator koji je zaključao bazu je naveo slijedeće objašnjenje: $1",
'protectedpagewarning' => "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''
'search-interwiki-default' => '$1 rezultati:',
'search-interwiki-more' => '(više)',
'search-relatedarticle' => 'Povezano',
-'mwsuggest-disable' => 'Onemogući AJAX prijedloge',
+'mwsuggest-disable' => 'Onemogući prijedloge pretrage',
'searcheverything-enable' => 'Pretraga u svim imenskim prostorima',
'searchrelated' => 'povezano',
'searchall' => 'sve',
'prefs-emailconfirm-label' => 'E-mail potvrda:',
'prefs-textboxsize' => 'Veličina prozora za uređivanje',
'youremail' => 'E-mail:',
-'username' => 'Korisničko ime:',
-'uid' => 'Korisnički ID:',
-'prefs-memberingroups' => 'Član {{PLURAL:$1|grupe|grupa}}:',
+'username' => 'Ime {{GENDER:$1|korisnika|korisnice}}:',
+'uid' => '{{GENDER:$1|Korisnički}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:',
'prefs-registration' => 'Vrijeme registracije:',
'yourrealname' => 'Vaše pravo ime:',
'yourlanguage' => 'Jezik:',
'prefs-displaywatchlist' => 'Postavke prikaza',
'prefs-diffs' => 'Razlike',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mail adresa izgleda valjano',
'email-address-validity-invalid' => 'Unesite valjanu e-mail adresu',
'linksearch-pat' => 'Šema pretrage:',
'linksearch-ns' => 'Imenski prostor:',
'linksearch-ok' => 'Traži',
-'linksearch-text' => 'Mogu se koristiti džokeri poput "*.wikipedia.org".<br />
-Potreban je najviši domen, na primjer "*.org".<br />
-Podržani protokoli: <tt>$1</tt> (zadaje http:// ako ne navedete protokol).',
+'linksearch-text' => 'Možete koristiti džoker znakove poput "*.wikipedia.org".
+Potrebno je navesti osnovnu domenu (TLD), npr. "*.org".<br />
+Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http:// ako nijedan protokol nije naveden).',
'linksearch-line' => '$1 je povezan od $2',
'linksearch-error' => 'Džokeri se mogu pojavljivati samo na početku naziva servera.',
# Special:ActiveUsers
'activeusers' => 'Spisak aktivnih korisnika',
'activeusers-intro' => 'Ovo je spisak korisnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.',
-'activeusers-count' => '{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
+'activeusers-count' => '{{PLURAL:$1|$1 izmjena|$1 izmjene|$1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
'activeusers-from' => 'Prikaži korisnike koji počinju sa:',
'activeusers-hidebots' => 'Sakrij botove',
'activeusers-hidesysops' => 'Sakrij administratore',
'listgrouprights-addgroup-self-all' => 'Može dodati sve grupe na svoj račun',
'listgrouprights-removegroup-self-all' => 'Može ukloniti sve grupe sa svog računa',
-# E-mail user
+# Email user
'mailnologin' => 'Nema adrese za slanje',
'mailnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.',
'emailuser' => 'Pošalji E-mail ovom korisniku',
'usermessage-editor' => 'Sistem za poruke',
# Watchlist
-'watchlist' => 'Moj spisak praćenja',
+'watchlist' => 'Spisak praćenja',
'mywatchlist' => 'Spisak praćenja',
'watchlistfor2' => 'Za $1 $2',
'nowatchlist' => 'Nemate ništa na svom spisku praćenih članaka.',
'watchnologin' => 'Niste prijavljeni',
'watchnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da bi ste mijenjali spisak praćenih članaka.',
'addwatch' => 'Dodaj u popis praćenja',
-'addedwatchtext' => "Stranica \"[[:\$1]]\" je dodana [[Special:Watchlist|vašoj listi praćenih stranica]].
-Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovdje, te će stranica izgledati '''podebljana''' u [[Special:RecentChanges|listi nedavnih]] izmjena kako bi se lakše uočila.",
+'addedwatchtext' => 'Stranica "[[:$1]]" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]].
+Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.',
'removewatch' => 'Ukloni sa spiska praćenja',
'removedwatchtext' => 'Stranica "[[:$1]]" je uklonjena s [[Special:Watchlist|vaše liste praćenja]].',
'watch' => 'Prati',
'enotif_subject_moved' => '{{SITENAME}} stranicu $1 {{gender:|je premijestio|je premjestila|je premjestio}} $2',
'enotif_subject_restored' => '{{SITENAME}} stranicu $1 {{gender:|je obnovio|je obnovila|je obnovio}} $2',
'enotif_subject_changed' => '{{SITENAME}} stranicu $1 {{gender:|je promijenio|je promijenila|je promijenio}} $2',
-'enotif_body_intro_deleted' => '{{SITENAME}} stranica $1 je izbrisana na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_deleted' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3.',
'enotif_body_intro_created' => '{{SITENAME}} stranica $1 je stvorena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
'enotif_body_intro_moved' => '{{SITENAME}} stranica $1 je premještena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
'enotif_body_intro_restored' => '{{SITENAME}} stranica $1 je obnovljena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
'prot_1movedto2' => '[[$1]] premješten na [[$2]]',
'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
+'protect-norestrictiontypes-text' => 'Ova stranica se ne može zaštititi jer nema dostupnih oblika ograničenja.',
+'protect-norestrictiontypes-title' => 'Stranica koju nije moguće zaštititi',
'protect-legend' => 'Potvrdite zaštitu',
'protectcomment' => 'Razlog:',
'protectexpiry' => 'Ističe:',
'protect-cascadeon' => 'Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu (kaskadnu) zaštitu.
Možete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenosnu zaštitu.',
'protect-default' => 'Dozvoli svim korisnicima',
-'protect-fallback' => 'Potrebno je imati "$1" ovlasti',
-'protect-level-autoconfirmed' => 'Blokiraj nove i neregistrovane korisnike',
-'protect-level-sysop' => 'Samo administratori',
+'protect-fallback' => 'Dopušteno samo korisnicima s dozvolom "$1"',
+'protect-level-autoconfirmed' => 'Dopušteno samo automatski potvrđenim korisnicima',
+'protect-level-sysop' => 'Dopušteno samo administratorima',
'protect-summary-cascade' => 'prenosna (kaskadna) zaštita',
'protect-expiring' => 'ističe $1 (UTC)',
'protect-expiring-local' => 'ističe $1',
# Move page
'move-page' => 'Preusmjeravanje $1',
'move-page-legend' => 'Premjestite stranicu',
-'movepagetext' => "Korištenjem donjeg formulara možete preimenovati stranicu, preusmjerivši njenu historiju na novi naziv.
-Stari naslov će postati stranica za preusmjerenje na novi naslov.
-Možete updateirati preusmjerenja koja idu na originalni naslov automatski.
-Ako to ne učinite, budite sigurni da ste provjerili [[Special:DoubleRedirects|dupla]] ili [[Special:BrokenRedirects|mrtva preusmjerenja]].
-Odgovorni ste za to da poveznice nastave povezivati stranice kojima su namijenjene.
-
-Uzmite u obzir da stranica '''neće''' biti preusmjerena ako već postoji stranica s novim naslovom, osim ako je prazna ili ako je preusmjerenje bez prethodne historije uređivanja.
-To znači da stranicu možete ponovno preimenovati u stari naslov ako je u pitanju bila pogreška, te da ne možete presnimiti već postojeću stranicu.
-
-'''UPOZORENJE!'''
-Ovo može biti drastična i neočekivana promjena za popularnu stranicu;
-budite sigurni da ste shvatili sve posljedice prije nego što nastavite.",
+'movepagetext' => "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.
+Članak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom.
+Možete automatski izmjeniti preusmjerenje do izvornog naslova.
+Ako se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].
+Dužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.
+
+Imajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.
+To znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.
+
+'''Pažnja!'''
+Ovo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;
+Molimo dobro razmislite prije nego što preimenujete stranicu.",
'movepagetext-noredirectfixer' => "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.
Stari naziv će postati preusmjerenje na novi naziv.
Molimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].
'import-error-interwiki' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (interwiki).',
'import-error-special' => 'Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.',
'import-error-invalid' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.',
+'import-error-unserialize' => 'Verzija $2 stranice "$1" ne može biti pročitana/uvezena. Zapisano je da verzija koristi $3 tip sadržaja u $4 formatu.',
'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Navedena osnovna stranica ima neispravan naslov.',
'import-rootpage-nosubpage' => 'Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.',
'pageinfo-robot-noindex' => 'Ne može se indeksirati',
'pageinfo-views' => 'Broj pregleda',
'pageinfo-watchers' => 'Broj pratitelja stranice',
+'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
'pageinfo-subpages-name' => 'Podstranice ove stranice',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja|nepreusmjerenja}})',
'pageinfo-magic-words' => '{{PLURAL:$1|Magična riječ|Magične riječi}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Stranica|Stranice}} uključene u ($1)',
'pageinfo-toolboxlink' => 'Informacije o stranici',
'pageinfo-redirectsto' => 'Preusmjerava na',
'pageinfo-redirectsto-info' => 'Informacije',
'pageinfo-protect-cascading' => 'Prenosiva zaštita stranica važi odavde',
'pageinfo-protect-cascading-yes' => 'Da',
'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
+'pageinfo-category-info' => 'Informacije o kategoriji',
+'pageinfo-category-pages' => 'Broj stranica',
+'pageinfo-category-subcats' => 'Broj potkategorija',
+'pageinfo-category-files' => 'Broj datoteka',
# Patrolling
'markaspatrolleddiff' => 'Označi kao patrolirano',
'minutes' => '{{PLURAL:$1|$1 minut|$1 minuta|$1 minuta}}',
'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
+'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
'ago' => 'prije $1',
'just-now' => 'upravo sada',
'monthsall' => 'sve',
'limitall' => 'sve',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Potvrdite adresu e-pošte',
'confirmemail_noemail' => 'Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].',
'confirmemail_text' => 'Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. ž
'specialpages-group-highuse' => 'Često korištene stranice',
'specialpages-group-pages' => 'Spiskovi stranica',
'specialpages-group-pagetools' => 'Alati za stranice',
-'specialpages-group-wiki' => 'Wiki podaci i alati',
+'specialpages-group-wiki' => 'Podaci i alati',
'specialpages-group-redirects' => 'Preusmjeravanje posebnih stranica',
'specialpages-group-spam' => 'Spam alati',
'logentry-newusers-newusers' => 'Korisnički račun $1 je napravljen',
'logentry-newusers-create' => 'Korisnički račun $1 je napravljen',
'logentry-newusers-create2' => 'Korisnički račun $3 {{GENDER:|je napravio|je napravila|je napravio}} $1',
+'logentry-newusers-byemail' => 'Korisnički račun $3 je napravio $1 i lozinka/šifra je poslana putem e-maila',
'logentry-newusers-autocreate' => 'Račun $1 je samostalno otvoren',
'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3 iz $4 u $5',
'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|je promenio|je promenila|je promenio}} članstvo grupe za $3',
'api-error-ok-but-empty' => 'Unutrašnja greška: nema odgovora od servera.',
'api-error-overwrite' => 'Pisanje preko postojeće datoteke nije dopušteno.',
'api-error-stashfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
+'api-error-publishfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
'api-error-timeout' => 'Server nije odgovorio unutar očekivanog vremena.',
'api-error-unclassified' => 'Desila se nepoznata greška',
'api-error-unknown-code' => 'Nepoznata greška: "$1"',
'loginlanguagelabel' => 'Jazyk: $1',
'suspicious-userlogout' => 'Vaša požiadavka odhlásiť sa bola zamietnutá, pretože to vyzerá, že ju poslal pokazený prehliadač alebo proxy server.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Neznáma chyba vo funkcii PHP mail()',
'user-mail-no-addy' => 'Pokus o odoslanie e-mailu bez e-mailovej adresy.',
'prefs-displaywatchlist' => 'Možnosti zobrazenia',
'prefs-diffs' => 'Rozdiely',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Formát e-mailovej adresa vyzerá byť správny',
'email-address-validity-invalid' => 'Zadajte platnú e-mailovú adresu',
'allpagesprev' => 'Predchádzajúci',
'allpagesnext' => 'Ďalší',
'allpagessubmit' => 'Vykonať',
-'allpagesprefix' => 'Zobraziť stránky s predponou:',
+'allpagesprefix' => 'Zobraziť stránky začínajúce na:',
'allpagesbadtitle' => 'Zadaný názov stránky je neplatný alebo mal medzijazykový alebo interwiki prefix. Môže obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v názve stránky.',
'allpages-bad-ns' => '{{SITENAME}} nemá menný priestor „$1“.',
'allpages-hide-redirects' => 'Skryť presmerovania',
'listgrouprights-addgroup-self-all' => 'Do vlastného účtu je možné pridať všetky skupiny',
'listgrouprights-removegroup-self-all' => 'Z vlastného účtu je možné odstrániť všetky skupiny',
-# E-mail user
+# Email user
'mailnologin' => 'Žiadna adresa na zaslanie',
'mailnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený]] a mať platnú e-mailovú adresu vo vašich [[Special:Preferences|nastaveniach]], aby ste mohli iným používateľom posielať e-maily.',
'emailuser' => 'E-mail tomuto používateľovi',
'monthsall' => 'všetky',
'limitall' => 'všetky',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Potvrdiť e-mailovú adresu',
'confirmemail_noemail' => 'Nenastavili ste platnú emailovú adresu vo svojich [[Special:Preferences|Nastaveniach]].',
'confirmemail_text' => '{{SITENAME}} vyžaduje, aby ste potvrdili platnosť vašej e-mailovej adresy
* @author Irena Plahuta
* @author McDutchie
* @author Smihael
+ * @author Vadgt
* @author XJamRastafire
* @author Yerpo
* @author romanm
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaša zahteva za odjavo je bila zavrnjena, saj kaže, da je bila poslana iz pokvarjenega brskalnika ali proxyja s predpomnilnikom.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Neznana napaka v funkciji PHP mail()',
'user-mail-no-addy' => 'Poskušal poslati e-pošto brez e-poštnega naslova',
'user-mail-no-body' => 'Poskušali ste poslati e-pošto s prazno ali nerazumno kratko vsebino.',
'prefs-displaywatchlist' => 'Možnosti prikaza',
'prefs-diffs' => 'Primerjave',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Izgleda veljaven',
'email-address-validity-invalid' => 'Obvezen je veljaven naslov!',
'nchanges' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
'recentchanges' => 'Zadnje spremembe',
'recentchanges-legend' => 'Možnosti zadnjih sprememb',
-'recentchanges-summary' => 'Na tej strani lahko spremljajte najnedavnejše spremembe wikija.',
+'recentchanges-summary' => 'Na tej strani lahko spremljate najnovejše spremembe wikija.',
'recentchanges-feed-description' => 'Spremljajte zadnje spremembe wikija prek tega vira.',
'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
'recentchanges-label-minor' => 'Manjše urejanje',
Namesto tega bi morda bilo bolje, da se povezujejo na primernejše strani.<br />
Stran se obravnava kot razločitvena, če uporablja predloge, povezane z [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Strani z lastnostmi strani',
+'pageswithprop-legend' => 'Strani z lastnostmi strani',
+'pageswithprop-text' => 'Stran navaja vse strani, ki uporabljajo določene lastnosti strani.',
+'pageswithprop-prop' => 'Ime lastnosti:',
+'pageswithprop-submit' => 'Pojdi',
+
'doubleredirects' => 'Dvojne preusmeritve',
'doubleredirectstext' => 'Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.
Vsaka vrstica vsebuje povezavo do prve in druge preusmeritve, kakor tudi do cilja druge preusmeritve, ki je po navadi »prava« ciljna stran, na katero naj bi kazala prva preusmeritev.
'listgrouprights-addgroup-self-all' => 'Lastni račun dodaj v vse skupine',
'listgrouprights-removegroup-self-all' => 'Lastni račun odstrani iz vseh skupin',
-# E-mail user
+# Email user
'mailnologin' => 'Manjka naslov pošiljatelja',
'mailnologintext' => 'Za pošiljanje e-pošte drugim uporabnikom se [[Special:UserLogin|prijavite]] in v [[Special:Preferences|nastavitvah]] vpišite veljaven e-poštni naslov.',
'emailuser' => 'Pošlji uporabniku e-pismo',
'dellogpage' => 'Dnevnik brisanja',
'dellogpagetext' => 'Spodaj je prikazan seznam nedavnih brisanj.',
'deletionlog' => 'dnevnik brisanja',
-'reverted' => 'Vrnjeno na prejšnje urejanje.',
+'reverted' => 'Vrnjeno na prejšnjo redakcijo.',
'deletecomment' => 'Razlog:',
'deleteotherreason' => 'Drugi/dodatni razlogi:',
'deletereasonotherlist' => 'Drug razlog',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
'seconds-abbrev' => '$1 s',
-'minutes-abbrev' => '$1 m',
+'minutes-abbrev' => '$1 min',
'hours-abbrev' => '$1 h',
'days-abbrev' => '$1 d',
'seconds' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
'monthsall' => 'vse',
'limitall' => 'vse',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Potrditev naslova elektronske pošte',
'confirmemail_noemail' => 'Nimate določenega veljavnega e-poštnega naslova v vaših [[Special:Preferences|uporabniških nastavitvah]].',
'confirmemail_text' => 'Za uporabo e-poštnih možnosti {{GRAMMAR:rodilnik|{{SITENAME}}}} morate najprej potrditi svoj e-poštni naslov.
'confirm-unwatch-button' => 'V redu',
'confirm-unwatch-top' => 'Odstranim stran z vašega spiska nadzorov?',
+# Separators for various lists, etc.
+'percent' => '$1 %',
+
# Multipage image navigation
'imgmultipageprev' => '← prejšnja stran',
'imgmultipagenext' => 'naslednja stran →',
'duration-centuries' => '$1 {{PLURAL:$1|stoletje|stoletji|stoletja|stoletij}}',
'duration-millennia' => '$1 {{PLURAL:$1|tisočletje|tisočletji|tisočletja|tisočletij}}',
+# Image rotation
+'rotate-comment' => 'Slika zavrti s $1 {{PLURAL:$1| degree|degrees}} v smeri urinega kazalca',
+
);
'login-abort-generic' => 'Ma u soo gali karin gudaha - waa la noqay',
'loginlanguagelabel' => 'Luqada: $1',
-# E-mail sending
+# Email sending
'user-mail-no-addy' => "Isku dayday in aa dirto e-mail ayada oo ciwaan e-mail la'aan ah.",
# Change password dialog
'filehist-thumb' => 'Sawir yar',
'filehist-thumbtext' => 'Sawirka yar nuuciisa ahaa $1',
'filehist-user' => 'Isticmaale',
+'filehist-dimensions' => 'Cabirka',
'filehist-comment' => 'Ka hadalka',
'imagelinks' => 'Faylka lagu isticmaalay',
'linkstoimage' => 'Boggagaan soo socota ee {{PLURAL:$1|ah waxey la xiriiraan|$1 ah waxey la xiriiraan}} faylkan:',
# Special:ListGroupRights
'listgrouprights-members' => '(Inta ka mid ah liiskooda)',
-# E-mail user
+# Email user
'mailnologin' => "Ma'jiro cinwaan wax lagu diro",
'mailnologintext' => 'Waa in aad [[Special:UserLogin|gudaha ku jirtaa]]
kuna haysatid E-boosto sax ah [[Special:Preferences|dooqyadaada]],
# Rollback
'rollback_short' => 'Soo celi',
'rollbacklink' => 'dib u soo celi',
+'rollbacklinkcount-morethan' => 'soo celinta in kabadan $1 {{PLURAL:$1|badal|badallo}}',
'revertpage' => 'Wuxuu dib u noqay badalkii oo sameeyay [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) kuna celiyay badalkii ka danbeeyay oo sameeyay [[User:$1|$1]]',
'revertpage-nouser' => 'Wuxuu dib u noqay bedelyada (magaca isticmaalaha waa laga saaray) kuna celiyay [[User:$1|$1]]',
'rollback-success' => 'Wuxuu dib u noqay bedelka oo sameeyay $1;
'namespacesall' => 'dhamaan',
'monthsall' => 'Dhamaan',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail_noemail' => 'Kuma haysatid cinwaan E-boosto sax [[Special:Preferences|isticmaala dooqiisa]].',
# action=watch/unwatch
'loginlanguagelabel' => 'Språk: $1',
'suspicious-userlogout' => 'Din begäran om att logga ut nekades eftersom det ser ut som det skickades av en trasig webbläsare eller cachande proxy.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "Okänt fel i PHP's mail()-funktion",
'user-mail-no-addy' => 'Försökte skicka e-post utan en e-postadress',
'user-mail-no-body' => 'Försökte skicka e-post med tomt eller orimligt kort innehåll.',
'prefs-displaywatchlist' => 'Visningalternativ',
'prefs-diffs' => 'Skillnader',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Ser giltig ut',
'email-address-validity-invalid' => 'Giltig adress krävs!',
De bör troligtvis ändras så att de länkar till en mer passande sida istället.<br />
En sida anses vara en förgreningssida om den inkluderar en mall som länkas till från [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sidor med en sidegenskap',
+'pageswithprop-legend' => 'Sidor med en sidegenskap',
+'pageswithprop-text' => 'Denna sida listar sidor som använder en speciell sidegenskap.',
+'pageswithprop-prop' => 'Egenskapsnamn:',
+'pageswithprop-submit' => 'Gå',
+
'doubleredirects' => 'Dubbla omdirigeringar',
'doubleredirectstext' => 'Det här är en lista över sidor som dirigerar om till andra omdirigeringssidor. Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt till målet för den andra omdirigeringen. Målet för den andra omdirigeringen är ofta den "riktiga" sidan, som den första omdirigeringen egentligen ska leda till.
<del>Stryk över</del> poster som har åtgärdats.',
'listgrouprights-addgroup-self-all' => 'Kan lägga till alla grupperna till sitt eget konto',
'listgrouprights-removegroup-self-all' => 'Kan ta bort alla grupperna från sitt eget konto',
-# E-mail user
+# Email user
'mailnologin' => 'Ingen adress att skicka till',
'mailnologintext' => 'För att kunna skicka e-post till andra användare, måste du vara [[Special:UserLogin|inloggad]] och ha angivit en korrekt e-postadress i dina [[Special:Preferences|användarinställningar]].',
'emailuser' => 'Skicka e-post till den här användaren',
'monthsall' => 'alla',
'limitall' => 'alla',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Bekräfta e-postadress',
'confirmemail_noemail' => 'Du har inte angivit någon giltig e-postadress i dina [[Special:Preferences|inställningar]].',
'confirmemail_text' => 'Innan du kan använda {{SITENAME}}s funktioner för e-post måste du bekräfta din e-postadress. Aktivera knappen nedan för att skicka en bekräftelsekod till din e-postadress. Mailet kommer att innehålla en länk, som innehåller en kod. Genom att klicka på den länken eller kopiera den till din webbläsares fönster för webbadresser, bekräftar du att din e-postadress fungerar.',
'duration-centuries' => '$1 {{PLURAL:$1|sekel|sekel}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
+# Image rotation
+'rotate-comment' => 'Bilden roteras $1 {{PLURAL:$1|grad|grader}} medurs',
+
);
'vector-action-protect' => 'காக்கவும்',
'vector-action-undelete' => 'நீக்கத்தை நிறுத்து',
'vector-action-unprotect' => 'காப்பை மாற்று',
-'vector-simplesearch-preference' => 'à®®à¯\87à®®à¯\8dபà®\9fà¯\8dà®\9f தà¯\87à®\9fà¯\81தலà¯\8d à®®à¯\81à®\9fிவà¯\81à®\95ளà¯\88à®\9aà¯\8d செயல்படுத்தவும் (Vector தோல் மட்டும்)',
+'vector-simplesearch-preference' => 'à®\9aாதாரண தà¯\87à®\9fà¯\81தலà¯\8d பà®\9fà¯\8dà®\9fà¯\88யதà¯\8dதà¯\88 செயல்படுத்தவும் (Vector தோல் மட்டும்)',
'vector-view-create' => 'உருவாக்கவும்',
'vector-view-edit' => 'தொகு',
'vector-view-history' => 'வரலாற்றைக் காட்டவும்',
'prot_1movedto2' => '[[$1]], [[$2]] என்றத் தலைப்புக்கு நகர்த்தப்பட்டுள்ளது.',
'protect-badnamespace-title' => 'பாதுகாக்க முடியாத பெயரிடைவெளி',
'protect-badnamespace-text' => 'இந்த பெயரிடைவெளியில் உள்ள பக்கங்கள் பாதுகாக்கப்படாது.',
+'protect-norestrictiontypes-title' => 'பாதுகாக்க முடியாத பக்கங்கள்',
'protect-legend' => 'காப்பை உறுதிப்படுத்து',
'protectcomment' => 'காரணம்:',
'protectexpiry' => 'முடிவுறுகிறது:',
'pageinfo-hidden-categories' => 'மறைக்கப்பட்ட {{PLURAL:$1|பகுப்பு|பகுப்புகள்}} ($1)',
'pageinfo-templates' => 'பயன்படுத்தப்பட்ட {{PLURAL:$1|வார்ப்புரு|வார்ப்புருக்கள்}} ($1)',
'pageinfo-toolboxlink' => 'பக்கத் தகவல்',
+'pageinfo-redirectsto' => 'வழிமாற்றவும்:',
'pageinfo-redirectsto-info' => 'தகவல்',
'pageinfo-contentpage' => 'உள்ளடக்கப் பக்கமாய்க் கணக்கிடப்பட்டது.',
'pageinfo-contentpage-yes' => 'ஆம்',
'pageinfo-protect-cascading-yes' => 'ஆம்',
+'pageinfo-category-info' => 'பகுப்புகளின் எண்ணிக்கை',
+'pageinfo-category-pages' => 'பக்கங்களின் எண்ணிக்கை',
+'pageinfo-category-files' => 'கோப்புகளின் எண்ணிக்கை',
# Skin names
'skinname-standard' => 'இயல்பான',
'tog-watchdefault' => "Hateke pájina sira-ne'ebé ha'u edita",
'tog-watchmoves' => "Hateke pájina sira-ne'ebé ha'u book",
'tog-watchdeletion' => "Hateke pájina sira-ne'ebé ha'u halakon",
+'tog-minordefault' => 'Edita hotu-hotu "ki\'ik"',
+'tog-oldsig' => 'Asinatura atuál',
'tog-watchlisthideown' => "La hatudu ha'u-nia edita iha lista hateke",
'tog-watchlisthidebots' => 'Hamsumik bot iha lista hateke',
'tog-watchlisthideminor' => "Hamsumik muda ki-ki'ik iha lista hateke",
'tog-watchlisthideliu' => 'La hatudu edita ema rejista nian iha lista hateke',
'tog-watchlisthideanons' => 'La hatudu edita ema anónimu nian iha lista hateke',
+'tog-watchlisthidepatrolled' => 'Hamsumik muda patrolada iha lista hateke',
+'tog-ccmeonemails' => "Haruka ba ha'u kopia korreiu eletróniku nian ne'ebé ha'u korreia",
'tog-showhiddencats' => "Hatudu kategoria sira-ne'ebé subar",
'underline-always' => 'Sempre',
# History pages
'currentrev' => 'Versaun atuál',
'revisionasof' => 'Versaun $1 nian',
+'revision-info' => 'Revisaun loron $4, tempu $5, husi $2',
'previousrevision' => '←Versaun tuan liu',
'nextrevision' => 'Versaun foun liu→',
'currentrevisionlink' => 'Versaun atuál',
'listgrouprights-rights' => 'Priviléjiu',
'listgrouprights-members' => '(lista membru nian)',
-# E-mail user
+# Email user
'emailuser' => "Haruka korreiu eletróniku ba uza-na'in ne'e",
'defemailsubject' => '{{SITENAME}} - korreiu eletróniku husi uza-na\'in "$1"',
'noemailtitle' => "Lá'os diresaun korreiu eletróniku",
'tog-hidepatrolled' => 'Пинҳон кардани вироишҳои гаштхӯрда дар тағйироти охир',
'tog-newpageshidepatrolled' => 'Пинҳони саҳифаҳои гаштхӯрда аз феҳристи саҳифаҳои нав',
'tog-extendwatchlist' => 'Густариши феҳристи пайгириҳо барои нишон додани ҳамаи тағйиротҳо, на танҳо аз ҳама охирин',
-'tog-usenewrc' => 'Ð\90з Ñ\82аÒ\93йиÑ\80оÑ\82и оÑ\85иÑ\80и гÑ\83Ñ\81Ñ\82аÑ\80иÑ\88Ñ\91Ñ\84Ñ\82а иÑ\81Ñ\82иÑ\84ода баÑ\80ед(ҶаваСкÑ\80ипÑ\82 лозим аÑ\81т)',
+'tog-usenewrc' => 'Ð\93Ñ\83Ñ\80ӯҳбандии Ñ\82аÒ\93ийÑ\80оÑ\82 баÑ\80 поÑ\8fи Ñ\81аÑ\84ҳа даÑ\80 Ñ\82аÒ\93ийÑ\80оÑ\82и оÑ\85иÑ\80 ва Ñ\84еҳÑ\80иÑ\81Ñ\82и пайгиÑ\80иҳо (ниÑ\91зманди ҶаваСкÑ\80ипт)',
'tog-numberheadings' => 'шуморагузори~и худкори инвонҳо',
'tog-showtoolbar' => 'Намоиши навори абзори вироиш (JavaScript)',
'tog-editondblclick' => 'Вироиш намудани саҳифаҳо ҳангоми ду карат пахш намудани тугмаи мушак (JavaScript)',
'tog-editsectiononrightclick' => 'Ба кор андохтани вироиши сарлавҳаҳои қисматҳо бо клики рост (ҶаваСкрипт)',
'tog-showtoc' => 'Намоиши феҳристи мундариҷон (барои мақолаҳои бо беш аз 3 сарлавҳа)',
'tog-rememberpassword' => 'Вуруди манро дар ин мурургар дар хотир нигоҳ дор (ҳадди аксар то $1 {{PLURAL:$1|рӯз|рӯз}})',
-'tog-watchcreations' => 'Ð\94оÑ\85ил намÑ\83дани Ñ\81аҳиÑ\84аҳое, ки ман Ñ\81оÑ\85Ñ\82аам ба Ñ\84еҳÑ\80иÑ\81Ñ\82и назаÑ\80оÑ\82и ман',
-'tog-watchdefault' => 'Саҳифаҳои эҷодкардаамро ба феҳристи пайгириам илова кунед',
-'tog-watchmoves' => 'Саҳифаҳои кӯчонидаамро ба феҳристи пайгириҳоям илова кунед',
-'tog-watchdeletion' => 'Саҳифаҳои эҷодкардаи манро ба феҳристи пайгириҳоям илова кунед',
+'tog-watchcreations' => 'СаҳиÑ\84аҳое, ки меÑ\81озам ва паÑ\80вандаҳое, ки боÑ\80гÑ\83зоÑ\80Ó£ мекÑ\83нам ба Ñ\84еҳÑ\80иÑ\81Ñ\82и пайгиÑ\80иҳоÑ\8fм аÑ\84зÑ\83да Ñ\88авад.',
+'tog-watchdefault' => 'Саҳифаҳо ва парвандаҳое, ки вироиш мекунам ба феҳристи пайгириҳоям афзуда шавад',
+'tog-watchmoves' => 'Саҳифаҳо ва парвандаҳое, ки мунтақил мекунам ба феҳристи пайгириҳоям афзуда шавад',
+'tog-watchdeletion' => 'Саҳифаҳо ва парвандаҳое, ки ҳазф мекунам ба феҳристи пайгириҳоям афзуда шавад',
'tog-minordefault' => 'Пешфарзи ҳамаи вироишҳоро ҷузъи ишора кунед',
'tog-previewontop' => 'Намоиши пешнамоиши қаблӣ пеш аз қуттии вироиш ва на пас аз он',
'tog-previewonfirst' => 'Нишон додани пешнамоиш дар нахустин вироиш',
'tog-nocache' => 'Ҳофизаи ниҳонии саҳифа дар мурургар ғайрифаъол шавад',
-'tog-enotifwatchlistpages' => 'Агар саҳифае мавриди пайгирии ман тағйир карда шавад ба ман тариқи почтаи электронӣ пайём бифиристед.',
+'tog-enotifwatchlistpages' => 'Агар сафҳа ё парвандае аз феҳристи пайгириҳоям вироиш шуд ба ман номае фиристода шавад',
'tog-enotifusertalkpages' => 'Ҳангоме ки дар саҳифаи корбариам тағйир дода мешавад ба ман тариқи почтаи электронӣ пайём бифиристед.',
-'tog-enotifminoredits' => 'Ð\91аÑ\80ои Ñ\82аÒ\93йиÑ\80оÑ\82и Ò·Ñ\83зÑ\8aи ба ман Ñ\82аÑ\80иÒ\9bи поÑ\87Ñ\82аи Ñ\8dлекÑ\82Ñ\80онӣ пайÑ\91м биÑ\84иÑ\80иÑ\81Ñ\82ед.',
+'tog-enotifminoredits' => 'Ð\91аÑ\80ои Ñ\82аÒ\93ийÑ\80оÑ\82и Ò·Ñ\83зÑ\8aÓ£ даÑ\80 Ñ\81аÑ\84ҳаҳо ва паÑ\80вандаҳо ҳам ба ман номае Ñ\84иÑ\80иÑ\81Ñ\82ода Ñ\88авад',
'tog-enotifrevealaddr' => 'Нишонаи почтаи электронии ман дар номаҳои иттилорасонӣ қайд шавад',
'tog-shownumberswatching' => 'Нишон додани шумораи корбарони пайгир',
'tog-oldsig' => 'Пешнамоиши имзои вуҷуддошта:',
'underline-always' => 'Доимо',
'underline-never' => 'Ҳеҷгоҳ',
-'underline-default' => 'Пешфарзи мурургар',
+'underline-default' => 'Пӯст ё мурургари пешфарз',
# Font style option in Special:Preferences
'editfont-style' => 'Сабки қалами ҷаъбаи вироиш:',
'listingcontinuesabbrev' => 'идома',
'index-category' => 'Саҳифаҳои намояшуда',
'noindex-category' => 'Саҳифаҳои намоиянашуда',
+'broken-file-category' => 'Саҳифаҳои дорои пайванди шикаста ба парванда',
'about' => 'Дар бораи',
'article' => 'Саҳифаи мӯҳтаво',
'newwindow' => '(дар равзанаи ҷадид боз мешавад)',
'cancel' => 'Лағв',
'moredotdotdot' => 'Бештар...',
-'mypage' => 'Саҳифаи ман',
-'mytalk' => 'Ð\93Ñ\83Ñ\84Ñ\82Ñ\83гӯи ман',
+'mypage' => 'Саҳифа',
+'mytalk' => 'Ð\91аҳÑ\81',
'anontalk' => 'Баҳс бо ин IP',
'navigation' => 'Гаштан',
'and' => ' ва',
'viewsource' => 'Намоиши матни вики',
'actionthrottled' => 'Ҷилави амали шумо гирифта шуд',
'actionthrottledtext' => 'Ба манзури ҷилавгирӣ аз спам, шумо иҷоза надоред, ки чунин амалеро беш аз чанд бор дар як муддати замони кӯтоҳ анҷом бидиҳед. Лутфан пас аз чанд дақиқа дубора талош кунед.',
-'protectedpagetext' => 'Ин саҳифа барои ҷилавгирӣ аз вироиш қуфл шудааст.',
+'protectedpagetext' => 'Ин саҳифа барои ҷилавгирӣ аз вироиш ва дигар амалҳо қуфл шудааст.',
'viewsourcetext' => 'Шумо метавонед матни викии ин саҳифаро назар кунед ё нусха бардоред:',
'protectedinterface' => 'Ин саҳифа ороишдиҳандаи матни ин нармафзор аст, ва ба манзури пешгирӣ аз харобкорӣ қуфл шудааст.',
'editinginterface' => "'''Огоҳӣ:''' Шумо саҳифаеро вироиш карда истодаед, ки матни интерфейси барнома мебошад. Тағйироти ин саҳифа барои намуди интерфейси дигар корбарон таъсир хоҳад расонид. Барои тарҷумаҳо, лутфан аз [//translatewiki.net/wiki/Main_Page?setlang=tg Бетавики], ки лоиҳаи маҳаликунонии МедиаВики мебошад, истифода кунед.",
'createaccount' => 'Ҳисоби ҷадидеро созед',
'gotaccount' => "Ҳисоби корбарӣ доред? '''$1'''.",
'gotaccountlink' => 'Вуруд шавед',
+'userlogin-resetlink' => 'Ҷузъиёти вурудро фаромӯш кардаед?',
'createaccountmail' => 'бо почтаи электронӣ',
'createaccountreason' => 'Сабаб:',
'badretype' => 'Калимаҳои убуре, ки ворид кардаед бо ҳамдигар мувофиқат намекунанд.',
'resetpass_forbidden' => 'Дар {{SITENAME}} калимаҳои убурро наметавон тағйир дод',
'resetpass-no-info' => 'Барои дастрасии мустақим ба ин саҳифа шумо бояд ба систем ворид шуда бошед.',
'resetpass-submit-loggedin' => 'Тағйири гузарвожа',
+'resetpass-submit-cancel' => 'Лағв',
'resetpass-wrong-oldpass' => 'Гузарвожаи мувақат ё охир номӯътабар.
Мумкин аст, ки шумо аллакай гузарвожаатонро бо муваффақият тағйир дода бошед ё дархости як гузарвожаи мувақатӣ карда бошед.',
'resetpass-temp-password' => 'Гузарвожаи муваққатӣ:',
# Special:PasswordReset
-'passwordreset-username' => 'Номи корбарӣ',
+'passwordreset-username' => 'Номи корбарӣ:',
+'passwordreset-emailelement' => 'Номи корбарӣ: $1
+Гузарвожаи муваққатӣ: $2',
+
+# Special:ChangeEmail
+'changeemail-cancel' => 'Лағв',
# Edit page toolbar
'bold_sample' => 'Матни пурранг',
'userinvalidcssjstitle' => "'''Ҳушдор:'''Пӯсте бо номи \"\$1\" вуҷуд надорад. Таваҷҷӯҳ кунед ки саҳифаҳои .css ва .js бо ҳарфҳои хурд навишта мешаванд, Намуна. {{ns:user}}:Фу/vector.css дар муқобили корбар {{ns:user}}:Фу/Vector.css.",
'updated' => '(Ба рӯз шуда)',
'note' => "'''Эзоҳ:'''",
-'previewnote' => "'''Ин фақат пешнамоиш аст; дигаргуниҳо ҳоло захира нашудаанд!'''",
+'previewnote' => "'''Ба ёд дошта бошед, ки ин фақат пешнамоиш аст.'''
+Тағийроти шумо ҳанӯз захира нашудааст!",
'previewconflict' => 'Ин пешнамоиш аккоскунандаи матни ноҳияи вироиш дар боло аст ва агар онро захира кунед бо ҳамин шакл нишода дода хоҳад шуд.',
'session_fail_preview' => "'''Бубахшед! Аз сабаби аз даст рафтани иттилооти нишасти корбарӣ, наметавонем вироишҳои шуморо пардозиш кунем.
Лутфан дубора саъй кунед. Агар боз бо ҳамин паём рӯ ба рӯ шавед, аз систем хориҷ шавед ва муҷаддадан ворид шавед.'''",
Шумо зарурияти вироиши ин саҳифаро дида баромаданатон лозим.
Сабти ҳазфшавии ин саҳифа барои фароҳам овардани имкониятҳои қулай оварда шудааст:",
+# Parser/template warnings
+'post-expand-template-argument-category' => 'Саҳифаҳои ҳавои шаблонҳои бо параметрҳои нодида гирифташуда',
+
# "Undo" feature
'undo-success' => 'Ин вироиш метавонад ботил шавад. Лутфан муқоисаи зеринро барои таъйид кардани амалӣ худ, баррасӣ кунед, ва баъдан барои анҷом додани ботилкунии вироиш тағйироти зеринро захира кунед.',
'undo-failure' => 'Ба иллати бархӯрдани вироишҳои дар миён омада, ин вироишро ботил наметавон кард.',
Шарҳ: (феълӣ) тафовут бо нусхаи феълӣ
(қаблӣ) = тафовут бо нусхаи феълӣ, ҷузъ = вироиши ҷузъӣ',
'history-fieldset-title' => 'Мурури таърих',
+'history-show-deleted' => 'Фақат ҳазфшуда',
'histfirst' => 'Аввалин',
'histlast' => 'Охирин',
'historysize' => '({{PLURAL:$1|1 байт|$1 байт}})',
'revdelete-success' => "'''Тағйири намоёнии нусха бо муваффақият анҷом шуд.'''",
'logdelete-success' => "'''Тағйири намоёнии маврид бо муваффақият анҷом шуд.'''",
'revdel-restore' => 'Тағйири падидорӣ',
+'revdel-restore-deleted' => 'нусхаҳои ҳазфшуда',
'revdel-restore-visible' => 'нусхаҳои намоён',
'pagehist' => 'Таърихи саҳифа',
'deletedhist' => 'Таърихи ҳазфшуда',
'lineno' => 'Сатри $1:',
'compareselectedversions' => 'Нусхаҳои интихобшударо муқоиса кунед',
'editundo' => 'ботил',
-'diff-multi' => '({{PLURAL:$1|вироиши миёнӣ|$1 вироишоти миёнӣ}} нишон дода нашудааст.)',
+'diff-multi' => '({{PLURAL:$1|як|$1}} вироиш миёнӣ тавассути {{PLURAL:$2|як|$2}} корбар нишон дода нашудааст)',
# Search results
'searchresults' => 'Натиҷаҳои ҷустуҷӯ',
'nextn' => 'баъдӣ {{PLURAL:$1|$1}}',
'viewprevnext' => 'Намоиш ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'Гузинаҳои ҷустуҷӯ',
+'searchmenu-exists' => "'''Саҳифае бо номи \"[[:\$1]]\" дар ин вики вуҷуд дорад.'''",
'searchmenu-new' => "'''Эҷоди саҳифаи \"[[:\$1]]\" дар ин вики!'''",
'searchhelp-url' => 'Help:Мундариҷа',
-'searchprofile-articles' => 'Саҳифаҳои мӯҳтавоӣ',
-'searchprofile-project' => 'Саҳифаҳои лоиҳа',
-'searchprofile-images' => 'Парвандаҳо',
+'searchprofile-articles' => 'Саҳифаҳои мӯҳтаво',
+'searchprofile-project' => 'Саҳифаҳои роҳномо ва лоиҳа',
+'searchprofile-images' => 'Чандрасонаӣ',
+'searchprofile-everything' => 'Ҳамачиз',
'searchprofile-advanced' => 'Пешрафта',
'searchprofile-articles-tooltip' => 'Ҷустуҷӯ дар $1',
'searchprofile-project-tooltip' => 'Ҷустуҷӯ дар $1',
'searchprofile-images-tooltip' => 'Ҷустуҷӯи парвандаҳо',
'searchprofile-everything-tooltip' => 'Ҷустуҷӯи ҳамаи мӯҳтаво (бо ҳисоби саҳифаҳои баҳс)',
+'searchprofile-advanced-tooltip' => 'Ҷустуҷӯ дар фазоҳои номи дилхоҳ',
'search-result-size' => '$1 ({{PLURAL:$2|1 калима|$2 калимаҳо}})',
'search-result-score' => 'Иртибот: $1%',
'search-redirect' => '(тағйири масир $1)',
'showingresultsnum' => "Намоиши {{PLURAL:$3|'''1''' натиҷа|'''$3''' натоиҷ}} оғоз аз #'''$2'''.",
'nonefound' => "'''Эзоҳ''': Танҳо чанд фазоиномҳо аз рӯи пешфарш ҷустуҷӯ мешаванд.
Ҷустуҷӯи худро бо пешванди ''ҳама:'' барои ҷустуҷӯи мӯҳтавои пурра (саҳифаҳои баҳс, шаблонҳо ва ғайраҳо) такрор кунед, ё фазои номи дилхоҳро чун пешванд истифода баред.",
+'search-nonefound' => 'Натиҷаи муносиб бо дархост пайдо нашуд.',
'powersearch' => 'Ҷустуҷӯ',
'powersearch-legend' => 'Ҷустуҷӯи пешрафта',
'powersearch-ns' => 'Ҷустуҷӯ дар фазоҳои ном:',
# Preferences page
'preferences' => 'Тарҷиҳот',
-'mypreferences' => 'Тарҷиҳоти ман',
+'mypreferences' => 'Танзимот',
'prefs-edits' => 'Шумораи вироишҳо:',
'prefsnologin' => 'Ба систем ворид нашудаед',
'prefsnologintext' => 'Барои танзими тарҷиҳоти корбарӣ бояд [[Special:UserLogin|вуруд ба систем шавед]].',
'gender-female' => 'Зан',
'email' => 'Почтаи электронӣ',
'prefs-help-realname' => 'Номи ҳақиқӣ ихтиёрӣ ва агар шумо онро пешниҳод кунед онро ҳамчун муаллифи эҷодиётатон ёдоварӣ карда хоҳад шуд.',
-'prefs-help-email' => 'Нишонаи почтаи электронӣ (ихтиёрӣ); тамоси дигар корбарон бо шуморо ба василаи номаи электронӣ аз тариқи саҳифаи корбарӣ ё саҳифаи баҳси корбарӣ, бидуни ниёз ба фош кардани сомона ва нишонаи воқеъи почтаи электронии шумо мумкин месозад.',
+'prefs-help-email' => 'Нишонаи электронӣ ихтиёрист, аммо фиристодани гузарвожаи навро агар гузарвожаи худро фаромӯш кунед мумкин мегардад.',
'prefs-help-email-required' => 'Нишони почтаи электрони лозим аст.',
# User rights
'recentchanges-legend' => 'Ихтиёроти тағйироти охирин',
'recentchanges-summary' => 'Назорати тағйиротҳои навтарин дар Википедиа дар ҳамин саҳифа аст.',
'recentchanges-feed-description' => 'Радёбии охирин тағйироти ин вики дар ин хурд.',
+'recentchanges-label-newpage' => 'Ин вироиш саҳифаи нав эҷод кард',
+'recentchanges-label-minor' => 'Ин вироиши ҷузъи аст',
+'recentchanges-label-bot' => 'Ин вироишро робот анҷом додааст',
+'recentchanges-label-unpatrolled' => 'Ин вироиш ҳанӯз гаштзанӣ нашудааст',
'rcnote' => "Дар поён {{PLURAL:$1|'''1''' тағйире аст|'''$1''' тағйирот мебошанд}}, ки дар давоми {{PLURAL:$2|рӯҳ|'''$2''' рӯзҳои}} охир, сар карда аз $5, $4.",
'rcnotefrom' => 'Дар зер тағйиротҳои охирин аз <b>$2</b> (то <b>$1</b> нишон дода шудааст).',
'rclistfrom' => 'Нишон додани тағйиротҳои нав сар карда аз $1',
'upload-curl-error28-text' => 'Ин сомона беш аз андоза дар посух тӯл кард. Лутфан баррасӣ кунед, ки оё сомона фаъол ва бар хат аст ё на. Сипас лаҳзае интизор шавед ва дубора талош кунед. Шояд бад набошад дар вақти н он қадар банд дубора талош кунед.',
'license' => 'Иҷозатнома:',
-'license-header' => 'Иҷозатнома:',
+'license-header' => 'Иҷозатнома',
'nolicense' => 'Ҳеҷ яке интихоб нашудааст',
'license-nopreview' => '(Пешнамоиш вуҷуд надорад)',
'upload_source_url' => '(як нишони интернетии мӯътабар ва оммавӣ)',
'protectedtitlestext' => 'Унвонҳои зерин аз эҷод муҳофизат шудаанд',
'protectedtitlesempty' => 'Дар ҳоли ҳозир ҳеҷ унвоне бо ин параметрҳо муҳофизат нащудааст',
'listusers' => 'Рӯйхати корбарон',
+'usercreated' => '{{GENDER:$3|Эҷодшуда}} дар таърихи $1 дар соати $2',
'newpages' => 'Саҳифаҳои нав',
'newpages-username' => 'Номи корбар:',
'ancientpages' => 'Саҳифаҳои кӯҳнатарин',
'listgrouprights-helppage' => 'Help:Дастрасиҳои гурӯҳӣ',
'listgrouprights-members' => '(феҳристи аъзоён)',
-# E-mail user
+# Email user
'mailnologin' => 'Нишонае аз фиристанда вуҷуд надорад',
'mailnologintext' => 'Барои фиристодани почтаи электронӣ барои корбарони дигар бояд [[Special:UserLogin|ба систем ворид шавед]] ва нишонаи почтаи электронии мӯътабар дар [[Special:Preferences|тарҷиҳоти]] худ дошта бошед.',
'emailuser' => 'Фиристодани email ба ин корбар',
'emailsenttext' => 'Номаи почтаи электронии шумо фиристода шуд.',
# Watchlist
-'watchlist' => 'Феҳристи назароти ман',
-'mywatchlist' => 'Феҳристи назароти ман',
+'watchlist' => 'Феҳристи пайгирӣ',
+'mywatchlist' => 'Феҳристи пайгириҳо',
+'watchlistfor2' => 'Барои $1 $2',
'nowatchlist' => 'Дар феҳристи пайгириҳои шумо ҳеҷ мавриде нест.',
'watchlistanontext' => 'Лутфан барои мушоҳида ва вироиши феҳристи пайгириҳои худ аз $1 истифода кунед.',
'watchnologin' => 'Вуруд нашуда',
'historywarning' => 'Ҳушдор: Саҳифае ки шумо ҳазф карданиед, таърих дорад:',
'confirmdeletetext' => 'Шумо дар ҳоли ҳазф кардани як саҳифа ё аксе аз пойгоҳ дода ҳамроҳ бо тамоми таърихи он ҳастед. Лутфан ин амалро тасдиқ кунед ва итминон ҳосил кунед, ки оқибати ин корро медонед ва ин амалро мутобиқи [[{{MediaWiki:Policy-url}}|сиёсати ҳазф]] анҷом медиҳед.',
'actioncomplete' => 'Амал иҷро шуд',
+'actionfailed' => 'Амал номуваффақ шуд',
'deletedtext' => '"$1" ҳазф шудааст.
Нигаред ба $2 барои гузориши ҳазфи охирин.',
'dellogpage' => 'Гузоришҳои ҳазф',
'blanknamespace' => '(Аслӣ)',
# Contributions
-'contributions' => 'Ҳиссагузории корбар',
+'contributions' => 'Ҳиссагузориҳои {{GENDER:$1|корбар}}',
'contributions-title' => 'Ҳиссагузориҳои корбар барои $1',
-'mycontris' => 'Хиссагузории ман',
+'mycontris' => 'Ҳиссагузориҳо',
'contribsub2' => 'Барои $1 ($2)',
'nocontribs' => 'Ҳеҷ тағйире бо ин мушаххасот пайдо нашуд.',
'uctop' => '(боло)',
'sp-contributions-newbies-sub' => 'Барои навкорон',
'sp-contributions-blocklog' => 'Гузориши басташуданҳо',
'sp-contributions-deleted' => 'Ҳиссагузориҳои ҳазфшудаи корбар',
-'sp-contributions-talk' => 'Баҳс',
+'sp-contributions-uploads' => 'боргузориҳо',
+'sp-contributions-logs' => 'гузоришҳо',
+'sp-contributions-talk' => 'баҳс',
'sp-contributions-userrights' => 'Мудирияти ихтиёроти корбарӣ',
'sp-contributions-search' => 'Ҷустуҷӯи ҳиссагузориҳо',
'sp-contributions-username' => 'IP нишона ё номи корбар:',
'nolinkshere-ns' => "Ҳеҷ саҳифа аз фазоиноми интихобшуда ба '''[[:$1]]''' пайванд надорад.",
'isredirect' => 'саҳифаи тағйири масир',
'istemplate' => 'истифодашуда дар саҳифа',
-'isimage' => 'пайванди акс',
+'isimage' => 'пайванд ба парванда',
'whatlinkshere-prev' => '{{PLURAL:$1|қаблӣ|қаблӣ $1}}',
'whatlinkshere-next' => '{{PLURAL:$1|баъдӣ|баъдӣ $1}}',
'whatlinkshere-links' => '← пайвандҳо',
'whatlinkshere-hideredirs' => '$1 тағйири масир',
'whatlinkshere-hidetrans' => '$1 трансгунҷоишҳо',
'whatlinkshere-hidelinks' => '$1 пайвандҳо',
+'whatlinkshere-hideimages' => '$1 пайвандҳои парванда',
'whatlinkshere-filters' => 'Филтрҳо',
# Block/unblock
'ipusubmit' => 'Боз кардани дастрасӣ',
'unblocked' => 'Дастрасии [[User:$1|$1]] боз карда шуд',
'unblocked-id' => 'Қатъи дастрасии шумораи $1 хотима ёфт',
-'ipblocklist' => 'IP нишонаҳо ва номҳои корбарии баста шуда',
+'ipblocklist' => 'Корбарони басташуда',
'ipblocklist-legend' => 'Ҷустуҷӯи корбари баста шуда',
'ipblocklist-submit' => 'Ҷустуҷӯ',
'infiniteblock' => 'бе поён',
'tooltip-rollback' => '"Вогард" вироиш(ҳо)ро ба ин саҳифаи охирин ҳиссагузор бо як клик мегардонад',
'tooltip-undo' => '"Ботил" ин вироишро ботил мекунад ва форми вироишро дар ҳолати пешнамоиш боз мекунад.
Ин имкони илова кардани як сабаберо дар хулоса медиҳад.',
+'tooltip-summary' => 'Хулосаи кӯтоҳ ворид кунед',
# Metadata
'notacceptable' => 'Коргузори ин вики аз ирсоли дода ба шакле ки барномаи шумо битавонад намоиш диҳад, пешкаш карда наметавонад.',
'metadata-help' => 'Ин парванда иттилооти иловагиро дар бар мегирад, эҳтимол аз аксбардораки рақамӣ ё сканер дар вақти сохтан ва рақамӣ кардан, илова шудааст. Агар парванда аз вазъияти ибтидоиаш тағйир дода бошад, мумкин аст, шарҳу тафсилоти мавҷуди иттилооти аксро тамоман бозтоб надиҳад.',
'metadata-expand' => 'Намоиши ҷузъиёти тафсилӣ',
'metadata-collapse' => 'Пинҳон кардани ҷузъиёти тафсилӣ',
-'metadata-fields' => 'EXIF фосилаҳои додаҳо, ки дар ин паём оварда шудаанд дар ҷадвали акс ҷамъ шуда бошанд ҳам, намоиш дода хоҳанд шуд. Бақия онҳо танҳо дар вақти боз кардани ҷадвал нишон дода хоҳанд шуд.
+'metadata-fields' => 'Фарододаҳои тасвир нишон додашуда дар ин пайғом вақти ҷадвал фарододаҳои тавсир ҷамъ шуда бошад ҳам намоиш дода мешавад. Бақияи маворид танҳо замоне нишон дода мешавад, ки ҷадвали ёдшуда боз шавад.
* make
* model
* datetimeoriginal
'monthsall' => 'ҳама',
'limitall' => 'ҳама',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Тасдиқи нишонаи почтаи электронӣ',
'confirmemail_noemail' => 'Шумо дар саҳифаи [[Special:Preferences|тарҷиҳоти корбарии]] худ нишонаи почтаи электронии мӯътабареро ворид накардаед.',
'confirmemail_text' => '{{SITENAME}} таъйиди эътибои почтаи электронии шуморо пеш аз истифода хидмати электронӣ талаб мекунад. Тугмаи зеринро фаъол кунед то номаи таъйидӣ ба почтаи электронии шумо фиристода шавад. Ин нома пайвандеро дар бар мегирад, ки коде дорад; пайвандро дар мурургар боз кунед, то ки почтаи электрониатон дар ҳақиқат таъйид шавад.',
'blankpage' => 'Саҳифаи холӣ',
# Special:Tags
+'tag-filter' => 'Филтри [[Special:Tags|барчасбҳо]]:',
'tags-edit' => 'вироиш',
# Database error messages
$messages = array(
# User preference toggles
-'tog-underline' => 'à¸\82ีà¸\94à¹\80สà¹\89à¸\99à¹\83à¸\95à¹\89ลิà¸\87à¸\81à¹\8c',
+'tog-underline' => 'à¸\81ารà¸\82ีà¸\94à¹\80สà¹\89à¸\99à¹\83à¸\95à¹\89ลิà¸\87à¸\81à¹\8c:',
'tog-justify' => 'จัดย่อหน้าชิดขอบ',
'tog-hideminor' => 'ซ่อนการแก้ไขเล็กน้อยในหน้าปรับปรุงล่าสุด',
'tog-hidepatrolled' => 'ซ่อนการแก้ไขที่ตรวจแล้วในหน้าปรับปรุงล่าสุด',
'underline-default' => 'ค่าโดยปริยายของหน้าตาหรือเบราว์เซอร์',
# Font style option in Special:Preferences
-'editfont-style' => 'รูà¸\9bà¹\81à¸\9aà¸\9aà¸\95ัวอักษรในพื้นที่แก้ไข:',
+'editfont-style' => 'รูà¸\9bà¹\81à¸\9aà¸\9aà¸\8aุà¸\94à¹\81à¸\9aà¸\9aอักษรในพื้นที่แก้ไข:',
'editfont-default' => 'ค่าตั้งต้นของเบราว์เซอร์',
'editfont-monospace' => 'ชุดอักษรแบบความกว้างคงที่',
'editfont-sansserif' => 'ชุดอักษรแบบไม่มีเชิง',
'morenotlisted' => 'มีที่ยังไม่แสดงอีก...',
'mypage' => 'หน้า',
'mytalk' => 'พูดคุย',
-'anontalk' => 'พูดคุยกับไอพีนี้',
+'anontalk' => 'à¸\9eูà¸\94à¸\84ุยà¸\81ัà¸\9aà¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¸\99ีà¹\89',
'navigation' => 'ป้ายบอกทาง',
'and' => ' และ',
'returnto' => 'กลับไป $1',
'tagline' => 'จาก {{SITENAME}}',
'help' => 'คำอธิบาย',
-'search' => 'สืà¸\9aà¸\84à¹\89à¸\99',
-'searchbutton' => 'สืà¸\9aà¸\84à¹\89à¸\99',
+'search' => 'à¸\84à¹\89à¸\99หา',
+'searchbutton' => 'à¸\84à¹\89à¸\99หา',
'go' => 'ไป',
'searcharticle' => 'ไป',
'history' => 'ประวัติหน้า',
'protect' => 'ล็อก',
'protect_change' => 'เปลี่ยน',
'protectthispage' => 'ล็อกหน้านี้',
-'unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\84à¹\88าà¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99',
+'unprotect' => 'เปลี่ยนการป้องกัน',
'unprotectthispage' => 'เปลี่ยนการป้องกันหน้านี้',
'newpage' => 'หน้าใหม่',
'talkpage' => 'อภิปรายหน้านี้',
'talkpagelinktext' => 'พูดคุย',
'specialpage' => 'หน้าพิเศษ',
'personaltools' => 'เครื่องมือส่วนตัว',
-'postcomment' => 'à¸\95à¸นใหม่',
+'postcomment' => 'สà¹\88วนใหม่',
'articlepage' => 'ดูหน้าเนื้อหา',
'talk' => 'อภิปราย',
'views' => 'ดู',
'protectedpage' => 'หน้าถูกล็อก',
'jumpto' => 'ข้ามไปยัง:',
'jumptonavigation' => 'นำทาง',
-'jumptosearch' => 'สืà¸\9aà¸\84à¹\89à¸\99',
+'jumptosearch' => 'à¸\84à¹\89à¸\99หา',
'view-pool-error' => 'ขออภัย ขณะนี้เซิร์ฟเวอร์มีภาระเกิน
ผู้ใช้พยายามเข้าดูหน้านี้มากเกินไป
กรุณารอสักครู่ก่อนที่จะเข้าดูหน้านี้อีกครั้งหนึ่ง
$1',
-'pool-timeout' => 'à¹\80à¸\81ิà¸\99à¹\80วลารà¸à¸\81ารลà¹\87à¸à¸\84',
+'pool-timeout' => 'à¹\80à¸\81ิà¸\99à¹\80วลารà¸à¸\81ารลà¹\87à¸à¸\81',
'pool-queuefull' => 'พื้นที่รองรับคิวเต็ม',
-'pool-errorunknown' => 'à¹\80à¸\81ิà¸\94à¸\84วามผิดพลาดไม่ทราบสาเหตุ',
+'pool-errorunknown' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89à¸ผิดพลาดไม่ทราบสาเหตุ',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'เกี่ยวกับ {{SITENAME}}',
+'aboutsite' => 'เกี่ยวกับ{{SITENAME}}',
'aboutpage' => 'Project:เกี่ยวกับ',
'copyright' => 'เนื้อหาอนุญาตให้เผยแพร่ภายใต้ $1',
'copyrightpage' => '{{ns:project}}:ลิขสิทธิ์',
'privacypage' => 'Project:นโยบายสิทธิส่วนบุคคล',
'badaccess' => 'มีข้อผิดพลาดในการใช้สิทธิ',
-'badaccess-group0' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸à¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\95ามà¸\97ีà¹\88รà¹\89à¸à¸\87à¸\82à¸',
-'badaccess-groups' => 'à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\97ีà¹\88à¸\84ุà¸\93รà¹\89à¸à¸\87à¸\82à¸à¸\99ีà¹\89สà¸\87วà¸\99à¹\84วà¹\89à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\83à¸\99{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88มหà¸\99ึà¹\88à¸\87à¸\81ลุà¹\88มà¹\83à¸\94 à¸\94ัà¸\87à¸\99ีà¹\89}}: $1',
+'badaccess-group0' => 'คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ขอ',
+'badaccess-groups' => 'ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่มหนึ่งกลุ่มใด ดังนี้}}: $1',
'versionrequired' => 'ต้องการมีเดียวิกิรุ่น $1',
'versionrequiredtext' => 'ต้องการมีเดียวิกิรุ่น $1 สำหรับใช้งานหน้านี้ ดู[[Special:Version|หน้ารุ่น]]',
'hidetoc' => 'ซ่อน',
'collapsible-collapse' => 'ยุบ',
'collapsible-expand' => 'ขยาย',
-'thisisdeleted' => 'à¹\81สà¸\94à¸\87หรืà¸à¹\80รียà¸\81à¸\94ู $1',
+'thisisdeleted' => 'à¸\94ูหรืà¸à¸\81ูà¹\89à¸\84ืà¸\99 $1 หรืà¸à¹\84มà¹\88',
'viewdeleted' => 'ดู $1',
'restorelink' => '$1 การแก้ไขที่ถูกลบ',
'feedlinks' => 'ฟีด',
'fileexistserror' => 'ไม่สามารถเขียนไฟล์ "$1" ได้ เนื่องจากมีไฟล์อยู่แล้ว',
'unexpected' => 'ผลที่ไม่คาดคิด: "$1"="$2"',
'formerror' => 'ผิดพลาด: ไม่สามารถส่งแบบได้',
-'badarticleerror' => 'à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ี้ในหน้านี้',
+'badarticleerror' => 'à¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94้ในหน้านี้',
'cannotdelete' => 'ไม่สามารถลบหน้าหรือไฟล์ "$1"
อาจมีผู้อื่นลบไปแล้ว',
'cannotdelete-title' => "ไม่สามารถลบหน้า ''$1''",
'delete-hook-aborted' => 'การลบถูกฮุกยกเลิก
-à¹\84มà¹\88มีà¸\84ำà¸à¸\98ิà¸\9aายสำหรัà¸\9aà¸\81ารยà¸\81à¹\80ลิà¸\81à¸\99ีà¹\89',
-'badtitle' => 'à¸\8aืà¹\88à¸à¹\84มà¹\88à¹\80หมาะสม',
-'badtitletext' => 'à¸\8aืà¹\88à¸à¸\82à¸à¸\87หà¸\99à¹\89าà¸\97ีà¹\88รà¹\89à¸à¸\87à¸\82à¸à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87 à¸à¸²à¸\88à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88à¸à¸§à¹\88าà¸\87 หรืà¸à¸\8aืà¹\88à¸à¸\97ีà¹\88à¸\9cิà¸\94à¸\9eลาà¸\94à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81ลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามมาà¸\88าà¸\81ภาษาà¸à¸·à¹\88à¸\99
-หรืà¸à¹\84มà¹\88à¸\8aืà¹\88à¸à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸à¸²à¸\88มีà¸\95ัวà¸à¸±à¸\81ษรà¸\97ีà¹\88à¹\84มà¹\88สามารà¸\96à¸\9bราà¸\81à¸\8fà¹\83à¸\99à¸\8aืà¹\88à¸à¸\81à¹\87à¹\84à¸\94à¹\89',
-'perfcached' => 'à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89à¹\83à¸\99à¹\81à¸\84à¸\8a à¹\81ละà¸à¸²à¸\88ลà¹\89าสมัย มีà¸\9cลà¸\81ารà¸\84à¹\89à¸\99หาสูà¸\87สุà¸\94 $1 รายà¸\81ารà¹\83à¸\99à¹\81à¸\84à¸\8a',
-'perfcachedts' => 'à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89à¹\83à¸\99หà¸\99à¹\88วยà¸\84วามà¸\88ำà¹\81à¸\84à¸\8a à¹\81ละà¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bรัà¸\9aลà¹\88าสุà¸\94à¹\80มืà¹\88ภ$1 à¸\84à¹\88าสูà¸\87สุà¸\94 $4 à¸\9cลลัà¸\9eà¸\98à¹\8cสามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¹\84วà¹\89à¹\83à¸\99หà¸\99à¹\88วยà¸\84วามà¸\88ำแคชได้',
-'querypage-no-updates' => 'à¸\82à¸\93ะà¸\99ีà¹\89à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ระà¸\87ัà¸\9a à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\83à¸\99à¸\97ีà¹\88à¸\99ีà¹\88จะไม่รีเฟรชเป็นปัจจุบัน',
+à¹\82à¸\94ยà¹\84มà¹\88มีà¸\84ำà¸à¸\98ิà¸\9aาย',
+'badtitle' => 'à¹\83à¸\8aà¹\89à¸\8aืà¹\88à¸à¸«à¸±à¸§à¸\82à¹\89à¸à¸\99ีà¹\89à¹\84มà¹\88à¹\84à¸\94à¹\89',
+'badtitletext' => 'à¸\8aืà¹\88à¸à¸«à¸\99à¹\89าà¸\97ีà¹\88à¸\82à¸à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87 à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88à¸à¸§à¹\88าà¸\87 หรืà¸à¸\8aืà¹\88à¸à¸\82à¹\89ามภาษาหรืà¸à¸\82à¹\89ามวิà¸\81ิà¸\97ีà¹\88à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87
+à¸à¸²à¸\88มีà¸à¸±à¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88สามารà¸\96à¹\83à¸\8aà¹\89à¹\83à¸\99à¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87à¹\84à¸\94à¹\89',
+'perfcached' => 'ข้อมูลต่อไปนี้ถูกเก็บในแคช และอาจล้าสมัย มีผลการค้นหาสูงสุด $1 รายการในแคช',
+'perfcachedts' => 'à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¹\83à¸\99à¹\81à¸\84à¸\8a à¹\81ละà¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bรัà¸\9aลà¹\88าสุà¸\94à¹\80มืà¹\88ภ$1 à¸\9cลลัà¸\9eà¸\98à¹\8cสูà¸\87สุà¸\94 $4 รายà¸\81ารสามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¹\83à¸\99แคชได้',
+'querypage-no-updates' => 'à¸\82à¸\93ะà¸\99ีà¹\89à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ระà¸\87ัà¸\9a à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\83à¸\99à¸\97ีà¹\88à¸\99ีà¹\89จะไม่รีเฟรชเป็นปัจจุบัน',
'wrong_wfQuery_params' => 'พารามิเตอร์ที่ส่งไป wfQuery() ไม่ถูกต้อง<br />
ฟังก์ชั่น: $1<br />
คำค้น: $2',
'ns-specialprotected' => 'หน้าพิเศษไม่สามารถแก้ไขได้',
'titleprotected' => "ชื่อเรื่องนี้ถูกป้องกันมิให้สร้างโดย [[User:$1|$1]]
เหตุผลที่ให้ไว้คือ ''$2''",
-'invalidtitle-knownnamespace' => 'ชื่อที่มีเนมสเปซ "$2" กับข้อความ "$3" ไม่ถูกต้อง',
-'invalidtitle-unknownnamespace' => 'ชื่อที่ไม่ทราบเนมสเปซหมายเลข $1 กับข้อความ "$2" ไม่ถูกต้อง',
+'filereadonlyerror' => 'ไม่สามารถแก้ไขไฟล์ "$1" เพราะที่เก็บไฟล์ "$2" อยู่ในภาวะอ่านอย่างเดียว
+ผู้ดูแลระบบที่ล็อกให้คำอธิบายว่า: "$3"',
+'invalidtitle-knownnamespace' => 'ชื่อเรื่องที่มีเนมสเปซ "$2" กับข้อความ "$3" ไม่ถูกต้อง',
+'invalidtitle-unknownnamespace' => 'ชื่อเรื่องที่ไม่ทราบเนมสเปซหมายเลข $1 กับข้อความ "$2" ไม่ถูกต้อง',
'exception-nologin' => 'ไม่ได้ล็อกอิน',
-'exception-nologin-text' => 'หน้าหรือปฏิบัติการนี้กำหนดให้คุณล็อกอินเข้าสู่วิกินี้ก่อน',
+'exception-nologin-text' => 'หà¸\99à¹\89าหรืà¸à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ีà¹\89à¸\81ำหà¸\99à¸\94à¹\83หà¹\89à¸\84ุà¸\93à¸\95à¹\89à¸à¸\87ลà¹\87à¸à¸\81à¸à¸´à¸\99à¹\80à¸\82à¹\89าสูà¹\88วิà¸\81ิà¸\99ีà¹\89à¸\81à¹\88à¸à¸\99',
# Virus scanner
-'virus-badscanner' => "à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: ''$1''",
+'virus-badscanner' => "à¹\82à¸\84รà¸\87à¹\81à¸\9aà¸\9aผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: ''$1''",
'virus-scanfailed' => 'การสแกนล้มเหลว (โค้ด $1)',
'virus-unknownscanner' => 'ไม่รู้จักโปรแกรมป้องกันไวรัสตัวนี้:',
'logouttext' => "'''ขณะนี้คุณได้ล็อกเอาต์แล้ว'''
คุณสามารถใช้งาน {{SITENAME}} ต่อในฐานะผู้ใช้นิรนาม หรือคุณสามารถ<span class='plainlinks'>[$1 ล็อกอินกลับเข้าไป]</span>ด้วยชื่อผู้ใช้เดิมหรือชื่อผู้ใช้อื่น
-อย่างไรก็ตามอาจมีบางหน้าที่แสดงผลเสมือนคุณกำลังล็อกอินอยู่ จนกว่าคุณจะล้างแคชเบราว์เซอร์ของคุณ",
+à¸à¸¢à¹\88าà¸\87à¹\84รà¸\81à¹\87à¸\95ามà¸à¸²à¸\88มีà¸\9aาà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\81สà¸\94à¸\87à¸\9cลà¹\80สมืà¸à¸\99วà¹\88าà¸\84ุà¸\93à¸\81ำลัà¸\87ลà¹\87à¸à¸\81à¸à¸´à¸\99à¸à¸¢à¸¹à¹\88 à¸\88à¸\99à¸\81วà¹\88าà¸\84ุà¸\93à¸\88ะลà¹\89าà¸\87à¹\81à¸\84à¸\8aà¹\80à¸\9aราวà¹\8cà¹\80à¸\8bà¸à¸£à¹\8cà¸\82à¸à¸\87à¸\84ุà¸\93",
'welcomeuser' => 'ยินดีต้อนรับ $1!',
'welcomecreation-msg' => 'บัญชีของคุณถูกสร้างขึ้นแล้ว
อย่าลืมเปลี่ยนแปลง[[Special:Preferences|การตั้งค่าใน {{SITENAME}}]] ของคุณ',
'password-login-forbidden' => 'ห้ามใช้ชื่อผู้ใช้และรหัสผ่านนี้',
'mailmypassword' => 'อีเมลรหัสผ่านใหม่',
'passwordremindertitle' => 'รหัสผ่านชั่วคราวใหม่สำหรับ {{SITENAME}}',
-'passwordremindertext' => 'à¸\9cูà¹\89à¹\83à¸\94à¸\9cูà¹\89หà¸\99ึà¹\88à¸\87 (à¸\8bึà¹\88à¸\87à¸à¸²à¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\97ีà¹\88à¹\83à¸\8aà¹\89หมายà¹\80ลà¸\82à¹\84à¸à¸\9eี $1) à¸\82à¸à¹\83หà¹\89สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\82à¸à¸\87 {{SITENAME}} ($4) รหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวสำหรัà¸\9aà¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89 "$2" à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99 à¹\81ละà¸\81ำหà¸\99à¸\94à¹\80à¸\9bà¹\87à¸\99 "$3" หาà¸\81เป็นเจตนาของคุณ คุณจำต้องล็อกอินและเลือกรหัสผ่านใหม่ ณ ขณะนี้ รหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน
+'passwordremindertext' => 'à¸\9cูà¹\89à¹\83à¸\94à¸\9cูà¹\89หà¸\99ึà¹\88à¸\87 (à¸\8bึà¹\88à¸\87à¸à¸²à¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eี $1) à¸\82à¸à¹\83หà¹\89สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\82à¸à¸\87 {{SITENAME}} ($4) รหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวสำหรัà¸\9aà¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89 "$2" à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99 à¹\81ละà¸\81ำหà¸\99à¸\94à¹\80à¸\9bà¹\87à¸\99 "$3" หาà¸\81à¸\81ารà¸\82à¸à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\99ีà¹\89เป็นเจตนาของคุณ คุณจำต้องล็อกอินและเลือกรหัสผ่านใหม่ ณ ขณะนี้ รหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน
-หาà¸\81à¸\9aุà¸\84à¸\84ลà¸à¸·à¹\88à¸\99à¸\9aุà¸\84à¸\84ลà¹\83à¸\94ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป',
+หาà¸\81à¹\80à¸\9bà¹\87à¸\99à¸\9aุà¸\84à¸\84ลà¸à¸·à¹\88à¸\99à¸\97ีà¹\88ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป',
'noemail' => 'ไม่มีที่อยู่อีเมลบันทึกไว้สำหรับผู้ใช้ "$1"',
'noemailcreate' => 'คุณจำต้องใส่ที่อยู่อีเมลให้ถูกต้อง',
-'passwordsent' => 'รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มลà¸\97ีà¹\88ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99à¹\84วà¹\89à¸\82à¸à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89 "$1"
-à¸\81รุà¸\93าลà¹\87à¸à¸\81à¸à¸´à¸\99à¸à¸µà¸\81à¸\84รัà¹\89à¸\87หลัà¸\87à¸\88าà¸\81à¸\84ุà¸\93à¹\84à¸\94à¹\89รัà¸\9aà¸à¸µà¹\80มล',
-'blocked-mailpassword' => 'หมายà¹\80ลà¸\82ไอพีของคุณถูกบล็อกมิให้แก้ไข ฉะนั้น จึงไม่ได้รับอนุญาตให้ใช้ฟังก์ชันขอกู้รหัสผ่านเพื่อป้องกันการกระทำผิด',
-'eauthentsent' => 'à¸à¸µà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bà¸\97ีà¹\88à¸à¸µà¹\80มลà¸\97ีà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81à¹\80สà¸\99ภà¸\81à¹\88à¸à¸\99à¸\97ีà¹\88à¸à¸µà¹\80มลà¸\88ะà¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bà¸\97ีà¹\88à¸\8aืà¹\88à¸à¸\9aัà¸\8dà¸\8aีà¸\99ัà¹\89à¸\99 à¸\84ุà¸\93à¸\95à¹\89à¸à¸\87à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\95ามà¸\84ำà¹\81à¸\99ะà¸\99ำà¹\83à¸\99à¸à¸µà¹\80มลà¹\80à¸\9eืà¹\88à¸à¸¢à¸·à¸\99ยัà¸\99วà¹\88าหมายà¹\80ลยà¸\9aัà¸\8dà¸\8aีà¸\99ัà¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99à¸\82à¸à¸\87à¸\84ุà¸\93',
+'passwordsent' => 'รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มลà¸\97ีà¹\88ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99à¹\84วà¹\89à¸\82à¸à¸\87 "$1"
+กรุณาล็อกอินอีกครั้งหลังได้รับอีเมล',
+'blocked-mailpassword' => 'à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88ไอพีของคุณถูกบล็อกมิให้แก้ไข ฉะนั้น จึงไม่ได้รับอนุญาตให้ใช้ฟังก์ชันขอกู้รหัสผ่านเพื่อป้องกันการกระทำผิด',
+'eauthentsent' => 'à¸à¸µà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bà¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มลà¸\97ีà¹\88à¹\80สà¸\99ภà¸\81à¹\88à¸à¸\99à¸\97ีà¹\88à¸à¸µà¹\80มลà¸\88ะà¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bà¸\97ีà¹\88à¸\8aืà¹\88à¸à¸\9aัà¸\8dà¸\8aีà¸\99ัà¹\89à¸\99 à¸\84ุà¸\93à¸\95à¹\89à¸à¸\87à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\95ามà¸\84ำà¹\81à¸\99ะà¸\99ำà¹\83à¸\99à¸à¸µà¹\80มลà¹\80à¸\9eืà¹\88à¸à¸¢à¸·à¸\99ยัà¸\99วà¹\88าà¸\9aัà¸\8dà¸\8aีà¸\99ัà¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99à¸\82à¸à¸\87à¸\84ุà¸\93à¸\88ริà¸\87 à¹\86',
'throttled-mailpassword' => 'ตัวเตือนรหัสผ่านได้ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา ตัวเตือนรหัสผ่านนี้จะถูกส่งได้หนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำผิด',
-'mailerror' => 'à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87à¸à¸µà¹\80มลà¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81 $1',
-'acct_creation_throttle_hit' => 'à¸\9cูà¹\89à¹\80à¸\82à¹\89าà¸\8aมà¸\97ีà¹\88à¹\83à¸\8aà¹\89หมายà¹\80ลà¸\82à¹\84à¸à¸\9eีà¸\82à¸à¸\87à¸\84ุà¸\93à¹\83à¸\99วิà¸\81ิà¸\99ีà¹\89 à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\8aืà¹\88à¸à¸\9aัà¸\8dà¸\8aีà¹\81ลà¹\89ว $1 à¸\9aัà¸\8dà¸\8aีà¹\83à¸\99วัà¸\99à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มา à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\88ำà¸\99วà¸\99มาà¸\81à¸\97ีà¹\88สุดที่อนุญาตในช่วงเวลาดังกล่าว
-à¸\88ึà¸\87สà¹\88à¸\87à¸\9cลà¹\83หà¹\89à¸\9cูà¹\89à¹\80à¸\82à¹\89าà¸\8aมà¸\97ีà¹\88à¹\83à¸\8aà¹\89หมายà¹\80ลà¸\82ไอพีนี้ ไม่สามารถสร้างบัญชีได้อีกในขณะนี้',
-'emailauthenticated' => 'อีเมลของคุณได้รับการยืนยันเมื่อวันที่ $2 เวลา $3',
+'mailerror' => 'à¸\82à¹\89à¸à¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารสà¹\88à¸\87à¹\80มล: $1',
+'acct_creation_throttle_hit' => 'à¸\9cูà¹\89à¹\80à¸\82à¹\89าà¸\8aมวิà¸\81ิà¸\99ีà¹\89à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¸\82à¸à¸\87à¸\84ุà¸\93 à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¹\81ลà¹\89ว $1 à¸\9aัà¸\8dà¸\8aีà¹\83à¸\99วัà¸\99à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มา à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\88ำà¸\99วà¸\99สูà¸\87สุดที่อนุญาตในช่วงเวลาดังกล่าว
+à¸\88ึà¸\87สà¹\88à¸\87à¸\9cลà¹\83หà¹\89à¸\9cูà¹\89à¹\80à¸\82à¹\89าà¸\8aมà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88ไอพีนี้ ไม่สามารถสร้างบัญชีได้อีกในขณะนี้',
+'emailauthenticated' => 'à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มลà¸\82à¸à¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารยืà¸\99ยัà¸\99à¹\80มืà¹\88à¸à¸§à¸±à¸\99à¸\97ีà¹\88 $2 à¹\80วลา $3',
'emailnotauthenticated' => 'ที่อยู่อีเมลของคุณยังไม่ได้รับการยืนยัน
ไม่มีการส่งอีเมลสำหรับคุณลักษณะใด ๆ ต่อไปนี้',
'noemailprefs' => 'ระบุที่อยู่อีเมลในการตั้งค่าของคุณเพื่อให้คุณลักษณะเหล่านี้ทำงานได้',
-'emailconfirmlink' => 'ยืนยันอีเมลของคุณ',
+'emailconfirmlink' => 'ยืà¸\99ยัà¸\99à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มลà¸\82à¸à¸\87à¸\84ุà¸\93',
'invalidemailaddress' => 'ไม่สามารถรับที่อยู่อีเมลได้ เพราะดูมีรูปแบบไม่ถูกต้อง
โปรดใส่ที่อยู่ให้มีรูปแบบถูกต้อง หรือเว้นช่องนั้น',
'cannotchangeemail' => 'ไม่สามารถเปลี่ยนที่อยู่อีเมลบนวิกินี้',
'createaccount-text' => 'มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ "$2" และรหัสผ่าน "$3" คุณควรล็อกอินเพื่อเปลี่ยนรหัสผ่านทันที
คุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เกิดจากความผิดพลาด',
-'usernamehasherror' => 'à¹\83à¸\99à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\95à¹\89à¸à¸\87à¹\84มà¹\88มีà¸\95ัวà¸à¸±à¸\81ษร "#"',
-'login-throttled' => 'à¸\84ุà¸\93à¹\84à¸\94à¹\89พยายามล็อกอินมากครั้งเกินไป
+'usernamehasherror' => 'à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\95à¹\89à¸à¸\87à¹\84มà¹\88มีà¸à¸±à¸\81à¸\82ระà¹\81ฮà¸\8a',
+'login-throttled' => 'à¸\97ีà¹\88à¸\9cà¹\88าà¸\99มาà¸\84ุà¸\93พยายามล็อกอินมากครั้งเกินไป
กรุณารอสักครู่แล้วลองใหม่อีกครั้ง',
'login-abort-generic' => 'การเข้าสู่ระบบของคุณไม่ประสบความสำเร็จ - ล้มเลิกแล้ว',
'loginlanguagelabel' => 'ภาษา: $1',
-'suspicious-userlogout' => 'à¸\84ำà¸\82à¸à¸\82à¸à¸\87à¸\84ุà¸\93à¹\80à¸\9eืà¹\88à¸à¸à¸à¸\81à¸\88าà¸\81ระà¸\9aà¸\9aà¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98 à¹\80à¸\9eราะà¸\94ูà¹\80หมืà¸à¸\99วà¹\88าà¸\88ะสà¹\88à¸\87มาà¸\88าà¸\81à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bà¸à¸£à¹\8cหรืà¸à¸\9eรà¹\87à¸à¸\81à¸\8bีà¹\88แคชที่เสีย',
+'suspicious-userlogout' => 'à¸\84ำà¸\82à¸à¸¥à¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8cà¸\82à¸à¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98à¹\80à¸\9eราะà¸\94ูà¹\80หมืà¸à¸\99สà¹\88à¸\87มาà¸\88าà¸\81à¹\80à¸\9aราวà¹\8cà¹\80à¸\8bà¸à¸£à¹\8cหรืà¸à¸\9eรà¹\87à¸à¸\81à¸\8bีแคชที่เสีย',
-# E-mail sending
-'php-mail-error-unknown' => 'ข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี',
+# Email sending
+'php-mail-error-unknown' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89à¸à¸\9cิà¸\94à¸\9eลาà¸\94à¹\84มà¹\88à¸\97ราà¸\9aสาà¹\80หà¸\95ุà¹\83à¸\99à¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99 mail() à¸\82à¸à¸\87à¸\9eีà¹\80à¸à¸\8aà¸\9eี',
'user-mail-no-addy' => 'พยายามส่งอีเมลโดยไม่มีที่อยู่อีเมล',
+'user-mail-no-body' => 'พยายามส่งอีเมลที่มีเนื้อหาว่างหรือสั้นอย่างไร้เหตุผล',
# Change password dialog
'resetpass' => 'เปลี่ยนรหัสผ่าน',
'resetpass-submit-loggedin' => 'เปลี่ยนรหัสผ่าน',
'resetpass-submit-cancel' => 'ยกเลิก',
'resetpass-wrong-oldpass' => 'รหัสผ่านชั่วคราวหรือปัจจุบันไม่ถูกต้อง
-à¸\84ุà¸\93à¸à¸²à¸\88à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99à¸\82à¸à¸\87à¸\84ุà¸\93à¹\84à¸\9bà¹\81ลà¹\89ว หรืà¸à¸£à¹\89à¸à¸\87à¸\82à¸à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¹\83หมà¹\88à¹\81ลà¹\89ว',
+คุณอาจเปลี่ยนรหัสผ่านของคุณไปแล้ว หรือขอรหัสผ่านชั่วคราวใหม่แล้ว',
'resetpass-temp-password' => 'รหัสผ่านชั่วคราว:',
# Special:PasswordReset
'passwordreset' => 'ตั้งรหัสผ่านใหม่',
-'passwordreset-text' => 'à¸\81รà¸à¸\81à¹\81à¸\9aà¸\9aà¸\99ีà¹\89à¹\80à¸\9eืà¹\88à¸à¸£à¸±à¸\9aà¸\95ัวà¹\80à¸\95ืà¸à¸\99à¸à¸µà¹\80มลà¸\82à¸à¸\87รายละà¹\80à¸à¸µà¸¢à¸\94à¸\9aัà¸\8dà¸\8aีà¸\82à¸à¸\87à¸\84ุà¸\93',
+'passwordreset-text' => 'กรอกแบบนี้เพื่อรับตัวเตือนอีเมลรายละเอียดบัญชีของคุณ',
'passwordreset-legend' => 'เปลี่ยนรหัสผ่าน',
'passwordreset-disabled' => 'การตั้งรหัสผ่านใหม่ปิดใช้งานบนวิกินี้',
'passwordreset-username' => 'ชื่อผู้ใช้:',
'passwordreset-domain' => 'โดเมน:',
'passwordreset-email' => 'ที่อยู่อีเมล:',
'passwordreset-emailtitle' => 'รายละเอียดบัญชีบน {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'ใครบางคน (ซึ่งอาจเป็นคุณ ที่ใช้เลขที่อยู่ไอพี $1) ขอตัวเตือนรายละเอียดบัญชีของคุณบน {{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
+
+$2
+
+{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน
+ตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตัวเตือนรายละเอียดบัญชี หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเก่าของคุณต่อไป',
+'passwordreset-emailtext-user' => 'ผู้ใช้ $1 ขอตัวเตือนรายละเอียดบัญชีของคุณบน {{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
+
+$2
+
+{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน
+ตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตัวเตือนรายละเอียดบัญชี หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเก่าของคุณต่อไป',
'passwordreset-emailelement' => 'ชื่อผู้ใช้: $1
รหัสผ่านชั่วคราว: $2',
'passwordreset-emailsent' => 'อีเมลแจ้งเตือนได้ถูกส่งไปแล้ว',
+'passwordreset-emailsent-capture' => 'อีเมลแจ้งเตือนได้ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง',
+'passwordreset-emailerror-capture' => 'อีเมลแจ้งเตือนถูกสร้างขึ้นแล้ว ซึ่งแสดงข้างล่าง แต่การส่งไปยังผู้ใช้ล้มเหลว: $1',
# Special:ChangeEmail
'changeemail' => 'เปลี่ยนที่อยู่อีเมล',
'showpreview' => 'แสดงตัวอย่าง',
'showlivepreview' => 'แสดงตัวอย่างทันที',
'showdiff' => 'แสดงความเปลี่ยนแปลง',
-'anoneditwarning' => "'''คำเตือน:''' คุณมิได้ล็อกอิน ที่อยู่ไอพีของคุณจะถูกบันทึกไว้ในประวัติการแก้ไขของหน้านี้",
-'anonpreviewwarning' => "'''คุณมิได้ล็อกอิน การบันทึกจะเก็บที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้'''",
+'anoneditwarning' => "'''à¸\84ำà¹\80à¸\95ืà¸à¸\99:''' à¸\84ุà¸\93มิà¹\84à¸\94à¹\89ลà¹\87à¸à¸\81à¸à¸´à¸\99 à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¸\82à¸à¸\87à¸\84ุà¸\93à¸\88ะà¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81à¹\84วà¹\89à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89",
+'anonpreviewwarning' => "'''à¸\84ุà¸\93มิà¹\84à¸\94à¹\89ลà¹\87à¸à¸\81à¸à¸´à¸\99 à¸\81ารà¸\9aัà¸\99à¸\97ึà¸\81à¸\88ะà¹\80à¸\81à¹\87à¸\9aà¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¸\82à¸à¸\87à¸\84ุà¸\93à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''",
'missingsummary' => "'''อย่าลืม:''' คุณยังไม่ได้ระบุคำอธิบายการแก้ไข ถ้าคุณกด \"บันทึก\" อีกครั้ง การแก้ไขของคุณจะถูกบันทึกโดยไม่มีคำอธิบายการแก้ไข",
'missingcommenttext' => 'กรุณาใส่ความเห็นด้านล่าง',
'missingcommentheader' => "'''ประกาศเตือน:''' คุณยังไม่ได้ใส่หัวข้อ/จ่าหัวสำหรับความเห็นนี้ ถ้าคุณกด \"{{int:savearticle}}\" อีกครั้ง การแก้ไขของคุณจะถูกบันทึกโดยไม่มีหัวข้อ",
'summary-preview' => 'ตัวอย่างคำอธิบายการแก้ไข:',
'subject-preview' => 'ตัวอย่างหัวข้อ:',
-'blockedtitle' => 'ผู้ใช้ถูกบล็อก',
-'blockedtext' => "'''à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89หรืà¸à¸«à¸¡à¸²à¸¢à¹\80ลà¸\82ไอพีของคุณถูกบล็อก'''
+'blockedtitle' => 'ผู้ใช้ถูกบล็อกอยู่',
+'blockedtext' => "'''à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89หรืà¸à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88ไอพีของคุณถูกบล็อก'''
การบล็อกนี้ดำเนินการโดย $1
-à¸\8bึà¹\88à¸\87ระà¸\9aุà¹\80หà¸\95ุà¸\9cลà¹\84วà¹\89วà¹\88า ''$2''
+ซึ่งระบุเหตุผลว่า ''$2''
* เริ่มการบล็อก: $8
* หมดเขตการบล็อก: $6
* ผู้ถูกบล็อก: $7
คุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้
-คุณไม่สามารถใช้ 'ส่งอีเมลหาผู้ใช้รายนี้ได้' จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกบล็อกไม่ให้ใช้ความสามารถนี้
+คุณไม่สามารถใช้คุณลักษณะ 'ส่งอีเมลหาผู้ใช้รายนี้ได้' จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกบล็อกไม่ให้ใช้ความสามารถนี้
เลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5
โปรดแสดงรายละเอียดข้างต้นทั้งหมดนี้ในการอภิปรายเกี่ยวกับการบล็อกของคุณด้วย",
-'autoblockedtext' => "เลขที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติ เพราะมีผู้ใช้อื่นมาก่อน ซึ่งถูกบล็อกโดย $1
-à¹\80หà¸\95ุà¸\9cลà¸\97ีà¹\88à¹\83หà¹\89à¹\84วà¹\89à¹\83à¸\99à¸\81ารà¸\9aลà¹\87à¸à¸\81à¸\84ืà¸:
+'autoblockedtext' => "à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¸\82à¸à¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87à¸à¸\81à¸à¸±à¸\95à¹\82à¸\99มัà¸\95ิ à¹\80à¸\9eราะมีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸à¸·à¹\88à¸\99à¹\83à¸\8aà¹\89มาà¸\81à¹\88à¸à¸\99 à¸\8bึà¹\88à¸\87à¸\96ูà¸\81à¸\9aลà¹\87à¸à¸\81à¹\82à¸\94ย $1
+à¹\82à¸\94ยระà¸\9aุà¹\80หà¸\95ุà¸\9cลวà¹\88า
:''$2''
* เริ่มการบล็อก: $8
* สิ้นสุดการบล็อก: $6
-* ผู้ถูกบล็อกโดยเจตนา: $7
-
-คุณอาจติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่อหารือการบล็อกนี้
+* ผู้ถูกบล็อก: $7
คุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่อหารือการบล็อกนี้
-คุณไม่สามารถใช้คุณลักษณะ 'ส่งอีเมลหาผู้ใช้รายนี้ได้' จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกบล็อกไม่ให้
+คุณไม่สามารถใช้คุณลักษณะ 'ส่งอีเมลหาผู้ใช้รายนี้ได้' จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกบล็อกไม่ให้ใช้
เลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5
โปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
'blockednoreason' => 'ไม่ได้ให้เหตุผลไว้',
-'whitelistedittext' => 'à¸\84ุà¸\93à¸\95à¹\89à¸à¸\87$1à¹\80à¸\9eืà¹\88à¸à¸\97ำà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89า',
+'whitelistedittext' => 'คุณต้อง$1เพื่อแก้ไขหน้า',
'confirmedittext' => 'คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า โปรดกำหนดที่อยู่อีเมลของคุณและทำให้ถูกต้องผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]',
-'nosuchsectiontitle' => 'à¹\84มà¹\88à¸\9eà¸\9aหัวà¸\82à¹\89à¸à¸¢à¹\88à¸à¸¢',
-'nosuchsectiontext' => 'à¸\84ุà¸\93à¸\9eยายามà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¸à¸\99à¸\97ีà¹\88à¹\84มà¹\88มีà¸à¸¢à¸¹à¹\88 à¸\95à¸นดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่',
+'nosuchsectiontitle' => 'à¹\84มà¹\88à¸\9eà¸\9aสà¹\88วà¸\99',
+'nosuchsectiontext' => 'à¸\84ุà¸\93à¸\9eยายามà¹\81à¸\81à¹\89à¹\84à¸\82สà¹\88วà¸\99à¸\97ีà¹\88à¹\84มà¹\88มีà¸à¸¢à¸¹à¹\88 สà¹\88วนดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่',
'loginreqtitle' => 'จำเป็นต้องล็อกอิน',
'loginreqlink' => 'ล็อกอิน',
'loginreqpagetext' => 'คุณต้อง$1เพื่อดูหน้าอื่น',
'newarticle' => '(ใหม่)',
'newarticletext' => "คุณตามลิงก์ไปยังหน้าที่ยังไม่มีในขณะนี้
ในการสร้างหน้า เริ่มพิมพ์ในกล่องด้านล่าง (ดูข้อมูลเพิ่มเติมใน[[{{MediaWiki:Helppage}}|หน้าคำอธิบาย]])
-à¸\96à¹\89าà¸\84ุà¸\93มาà¹\82à¸\94ยà¸à¸¸à¸\9aัà¸\95ิà¹\80หà¸\95ุ à¹\83หà¹\89à¸\81à¸\94'''à¸\96à¸à¸¢à¸«à¸¥à¸±à¸\87''' (back) à¸\97ีà¹\88เบราว์เซอร์",
-'anontalkpagetext' => "----''หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยสำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99าม à¸\8bึà¹\88à¸\87ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89
-à¹\82à¸\94ยà¸\97าà¸\87à¹\80ราà¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89à¸à¸\87ระà¸\9aุà¸\95ัวà¸\95à¸\99à¸\9cà¹\88าà¸\99à¸\97าà¸\87หมายà¹\80ลà¸\82à¹\84à¸à¸\9eี
-à¸\8bึà¹\88à¸\87หมายà¹\80ลà¸\82à¹\84à¸à¸\9eีà¸\99ีà¹\89à¸à¸²à¸\88à¸\96ูà¸\81à¹\83à¸\8aà¹\89รà¹\88วมà¸\81ัà¸\99à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89หลายคน
+à¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\82à¹\89ามาหà¸\99à¹\89าà¸\99ีà¹\89à¹\82à¸\94ยà¸\9cิà¸\94à¸\9eลาà¸\94 à¹\83หà¹\89à¸\81à¸\94à¸\9bุà¹\88ม'''à¸\96à¸à¸¢à¸«à¸¥à¸±à¸\87''' (back) à¸\82à¸à¸\87เบราว์เซอร์",
+'anontalkpagetext' => "----''หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99ามà¸\8bึà¹\88à¸\87ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีหรืà¸à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87à¸à¸\81à¸à¸´à¸\99
+à¸\94ัà¸\87à¸\99ัà¹\89à¸\99à¹\80ราà¸\88ึà¸\87ระà¸\9aุà¸\95ัวà¸\95à¸\99à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¹\81à¸\97à¸\99
+à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¸\99ีà¹\89à¸à¸²à¸\88มีà¸\9cูà¹\89à¹\83à¸\8aà¹\89รà¹\88วมà¸\81ัà¸\99หลายคน
ถ้าคุณเป็นผู้ใช้นิรนาม และรู้สึกว่าความเห็นที่คุณได้รับไม่เกี่ยวข้องกับคุณแต่อย่างใด กรุณา[[Special:UserLogin/signup|สร้างบัญชีผู้ใช้]]หรือ[[Special:UserLogin|ล็อกอิน]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่น''",
-'noarticletext' => 'ขณะนี้ไม่มีเนื้อหาในหน้านี้
-คุณสามารถ [[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง] หรือ[{{fullurl:{{FULLPAGENAME}}|action=edit}} แก้ไขหน้านี้]</span>',
-'noarticletext-nopermission' => 'ปัจจุบันไม่มีข้อความในหน้านี้
-คุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อบทความนี้]]ในหน้าอื่น หรือ<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง]</span> แต่คุณไม่มีสิทธิ์สร้างหน้านี้',
+'noarticletext' => 'ปัจจุบันไม่มีเนื้อหาในหน้านี้
+คุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น หรือ<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง] หรือ[{{fullurl:{{FULLPAGENAME}}|action=edit}} แก้ไขหน้านี้]</span>',
+'noarticletext-nopermission' => 'ปัจจุบันไม่มีเนื้อหาในหน้านี้
+คุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น หรือ<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง]</span> แต่คุณไม่มีสิทธิสร้างหน้านี้',
+'missing-revision' => 'ไม่มีรุ่น #$1 ของหน้าชื่อ "{{PAGENAME}}"
+
+โดยปกติเกิดจากการเข้าลิงก์ประวัติเก่าของหน้าที่ถูกลบไปแล้ว
+ดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]',
'userpage-userdoesnotexist' => 'บัญชีผู้ใช้ "<nowiki>$1</nowiki>" มิได้ลงทะเบียน กรุณาตรวจสอบก่อนว่าคุณต้องการสร้างหรือแก้ไขหน้านี้',
'userpage-userdoesnotexist-view' => 'บัญชีผู้ใช้ "$1" มิได้ลงทะเบียน',
'blocked-notice-logextract' => 'ปัจจุบันเลขที่อยู่ไอพีนี้ถูกบล็อก
-รายการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:',
-'clearyourcache' => "'''หมายเหตุ:''' หลังจากบันทึกแล้ว คุณอาจจะต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง
-* '''ไฟร์ฟอกซ์ / ซาฟารี:''' กดปุ่ม ''Shift'' ค้างไว้ขณะคลิก ''Reload'' หรือกดปุ่ม ''Ctrl-F5'' หรือ ''Ctrl-R'' (''⌘-R'' บนแมคอินทอช)
-* '''กูเกิล โครม:''' กดปุ่ม ''Ctrl-Shift-R'' (''⌘-Shift-R'' บนแมคอินทอช)
-* '''อินเทอร์เน็ตเอกซ์พลอเรอร์:''' กดปุ่ม ''Ctrl'' ค้างไว้ขณะคลิก ''Refresh'' หรือกดปุ่ม ''Ctrl-F5''
-* '''คองเคอเรอร์:''' คลิก ''Reload'' หรือกดปุ่ม ''F5''
-* '''โอเปร่า:''' ล้างแคชในเมนู ''Tools → Preferences''",
-'usercssyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบสไตล์ชีท CSS ก่อนบันทึก",
-'userjsyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"แสดงตัวอย่าง\" เพื่อทดสอบจาวาสคริปต์ใหม่ก่อนบันทึก",
+หน่วยบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:',
+'clearyourcache' => "'''หมายเหตุ:''' หลังจากบันทึก คุณอาจต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง
+* '''ไฟร์ฟอกซ์ / ซาฟารี:''' กดปุ่ม ''Shift'' ค้างไว้ขณะคลิก ''Reload'' หรือกด ''Ctrl-F5'' หรือ ''Ctrl-R'' (''⌘-R'' บนแมค)
+* '''กูเกิล โครม:''' กดปุ่ม ''Ctrl-Shift-R'' (''⌘-Shift-R'' บนแมค)
+* '''อินเทอร์เน็ตเอกซ์พลอเรอร์:''' กดปุ่ม ''Ctrl'' ค้างไว้ขณะคลิก ''Refresh'' หรือกด ''Ctrl-F5''
+* '''โอเปร่า:''' ล้างแคชใน ''Tools → Preferences''",
+'usercssyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบ CSS ใหม่ของคุณก่อนบันทึก",
+'userjsyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบจาวาสคริปต์ใหม่ของคุณก่อนบันทึก",
'usercsspreview' => "'''อย่าลืมว่าคุณกำลังดูตัวอย่าง CSS ผู้ใช้ของคุณ'''
'''ยังไม่ได้ถูกบันทึก!'''",
'userjspreview' => "'''อย่าลืมว่าคุณกำลังทดสอบ/ดูตัวอย่างจาวาสคริปต์ผู้ใช้ของคุณ'''
'''ยังไม่ถูกบันทึก!'''",
'sitecsspreview' => "'''พึงระลึกว่าคุณกำลังแสดงตัวอย่าง CSS นี้เท่านั้น'''
-'''มัà¸\99ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81!'''",
+'''ยังไม่ได้ถูกบันทึก!'''",
'sitejspreview' => "'''พึงระลึกว่าคุณกำลังแสดงตัวอย่างโค้ดจาวาสคริปต์นี้เท่านั้น'''
-'''มัà¸\99ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aัà¸\99à¸\97ึà¸\81!'''",
-'userinvalidcssjstitle' => "'''à¸\84ำà¹\80à¸\95ืà¸à¸\99:''' à¹\84มà¹\88มีหà¸\99à¹\89าà¸\95า \"\$1\" หà¸\99à¹\89า .css à¹\81ละ .js à¸\97ีà¹\88à¸\9bรัà¸\9aà¹\81à¸\95à¹\88à¸\87à¹\80à¸à¸\87 à¹\83à¸\8aà¹\89à¸\95ัวà¸\9eิมà¸\9eà¹\8cà¹\80ลà¹\87à¸\81à¸\97ัà¹\89à¸\87หมà¸\94 à¹\80à¸\8aà¹\88à¸\99 à¹\83à¸\8aà¹\89 {{ns:user}}:Foo/vector.css à¹\81à¸\97à¸\99à¸\97ีà¹\88à¸\88ะà¹\80à¸\9bà¹\87à¸\99 {{ns:user}}:Foo/Vector.css",
-'updated' => '(à¸\9bรัà¸\9aà¸\9bรุà¸\87à¹\81ลà¹\89ว)',
-'note' => "'''à¸\84ำà¹\81à¸\99ะà¸\99ำ:'''",
-'previewnote' => "'''พึงระลึกว่านี่เป็นเพียงตัวอย่างเท่านั้น'''
+'''ยังไม่ได้ถูกบันทึก!'''",
+'userinvalidcssjstitle' => "'''à¸\84ำà¹\80à¸\95ืà¸à¸\99:''' à¹\84มà¹\88มีหà¸\99à¹\89าà¸\95า \"\$1\" หà¸\99à¹\89า .css à¹\81ละ .js à¸\97ีà¹\88à¸\9bรัà¸\9aà¹\81à¸\95à¹\88à¸\87à¹\80à¸à¸\87 à¹\83à¸\8aà¹\89à¸\95ัวà¹\80ลà¹\87à¸\81à¸\97ัà¹\89à¸\87หมà¸\94 à¹\80à¸\8aà¹\88à¸\99 {{ns:user}}:Foo/vector.css มิà¹\83à¸\8aà¹\88 {{ns:user}}:Foo/Vector.css",
+'updated' => '(ปรับแล้ว)',
+'note' => "'''หมายà¹\80หà¸\95ุ:'''",
+'previewnote' => "'''à¸\9eึà¸\87ระลึà¸\81วà¹\88าà¸\99ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¹\80à¸\9eียà¸\87à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวà¸à¸¢à¹\88าà¸\87à¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99'''
การเปลี่ยนแปลงของคุณยังไม่ได้ถูกบันทึก!",
'continue-editing' => 'ไปยังพื้นที่แก้ไข',
-'previewconflict' => 'à¸\81ารà¹\81สà¸\94à¸\87à¸\9cลสà¹\88วà¸\99à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\95ัวà¸à¸¢à¹\88าà¸\87à¸\82à¸à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\94à¹\89าà¸\99à¸\9aà¸\99 à¸\96à¹\89าà¸\81à¸\94à¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\81สà¸\94à¸\87à¸\9cลà¸\88ะà¹\81สà¸\94à¸\87à¹\83à¸\99ลัà¸\81ษà¸\93ะà¸\99ีà¹\89à¸\97ัà¸\99à¸\97ี',
-'session_fail_preview' => "'''à¸\82à¸à¸à¸ ัย à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88à¸à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\80à¸\8aืà¹\88à¸à¸¡à¸\95à¹\88à¸à¸ªà¸¹à¸\8dหาย
-à¹\83หà¹\89à¸\97à¸\94ลà¸à¸\87à¹\81à¸\81à¹\89à¹\84à¸\82à¸à¸µà¸\81à¸\84รัà¹\89à¸\87หà¸\99ึà¹\88à¸\87 à¸\96à¹\89ายัà¸\87à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94à¹\89 à¹\83หà¹\89ลà¸à¸\87ลà¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8cà¹\81ละลà¹\87à¸à¸\81à¸à¸´à¸\99à¸\81ลัà¸\9aมาà¸à¸µà¸\81à¸\84รัà¹\89à¸\87'''",
-'session_fail_preview_html' => "'''à¸\82à¸à¸à¸ ัย à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88à¸à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\80à¸\8aืà¹\88à¸à¸¡à¸\95à¹\88à¸สูญหาย'''
+'previewconflict' => 'à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวà¸à¸¢à¹\88าà¸\87à¸\99ีà¹\89สะà¸\97à¹\89à¸à¸\99à¸\82à¹\89à¸à¸\84วามà¹\83à¸\99à¸\9eืà¹\89à¸\99à¸\97ีà¹\88à¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¹\89à¸à¸\84วามสà¹\88วà¸\99à¸\9aà¸\99à¸\8bึà¹\88à¸\87à¸\88ะà¸\9bราà¸\81à¸\8fหาà¸\81à¸\84ุà¸\93à¹\80ลืà¸à¸\81à¸\9aัà¸\99à¸\97ึà¸\81',
+'session_fail_preview' => "'''à¸\82à¸à¸à¸ ัย à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88à¸à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88à¸à¸ªà¸²à¸£à¸ªà¸¹à¸\8dหาย'''
+à¹\82à¸\9bรà¸\94à¸\97à¸\94ลà¸à¸\87à¸à¸µà¸\81à¸\84รัà¹\89à¸\87 หาà¸\81ยัà¸\87à¹\80สียà¸à¸¢à¸¹à¹\88 ลà¸à¸\87[[Special:UserLogout|ลà¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8c]]à¹\81ละลà¹\87à¸à¸\81à¸à¸´à¸\99à¸\81ลัà¸\9aมา",
+'session_fail_preview_html' => "'''à¸\82à¸à¸à¸ ัย à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\95à¹\88à¸à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88à¸à¸ªà¸²à¸£สูญหาย'''
-''à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81 {{SITENAME}} à¹\83à¸\8aà¹\89รูà¸\9bà¹\81à¸\9aà¸\9aà¹\80à¸à¸\8aà¸\97ีà¹\80à¸à¹\87มà¹\81à¸à¸¥à¸¥à¹\89วà¸\99 à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวà¸à¸¢à¹\88าà¸\87à¸\88ะà¸\96ูà¸\81à¸\8bà¹\88à¸à¸\99à¹\84วà¹\89à¹\80à¸\9eืà¹\88à¸à¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99à¸\81ารà¹\82à¸\95มตีด้วยจาวาสคริปต์''
+''à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81 {{SITENAME}} à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\80à¸à¸\8aà¸\97ีà¹\80à¸à¹\87มà¹\81à¸à¸¥à¸¥à¹\89วà¸\99 à¸\81ารà¹\81สà¸\94à¸\87à¸\95ัวà¸à¸¢à¹\88าà¸\87à¸\88ะà¸\96ูà¸\81à¸\8bà¹\88à¸à¸\99à¹\84วà¹\89à¹\80à¸\9eืà¹\88à¸à¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99à¸\81ารà¹\82à¸\88มตีด้วยจาวาสคริปต์''
-'''à¸\96à¹\89าà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\84รัà¹\89à¸\87à¸\99ีà¹\89à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87 à¹\83หà¹\89à¸\97à¸\94ลà¸à¸\87à¹\81à¸\81à¹\89à¹\84à¸\82à¸à¸µà¸\81à¸\84รัà¹\89à¸\87หà¸\99ึà¹\88à¸\87 à¸\96à¹\89ายัà¸\87à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94à¹\89 à¹\83หà¹\89ลà¸à¸\87[[Special:UserLogout|ลà¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8c]]à¹\81ละลà¹\87à¸à¸\81à¸à¸´à¸\99à¸\81ลัà¸\9aมาà¸à¸µà¸\81à¸\84รัà¹\89à¸\87'''",
-'token_suffix_mismatch' => "'''à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¹\80à¸\84รืà¹\88à¸à¸\87ลูà¸\81à¸\82à¹\88ายà¸\97ีà¹\88à¸\84ุà¸\93à¹\83à¸\8aà¹\89à¸à¸¢à¸¹à¹\88à¹\84à¸\94à¹\89à¸\97ำลายรูà¸\9bà¹\81à¸\9aà¸\9aà¹\80à¸\84รืà¹\88à¸à¸\87หมายวรรà¸\84à¸\95à¸à¸\99à¹\83à¸\99à¸\95ราสารà¸\9bระà¸\88ำà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82 (edit token)'''
-ระà¸\9aà¸\9aà¹\84มà¹\88รัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\84ุà¸\93à¹\80à¸\9eืà¹\88à¸à¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¸\82à¸à¸\87à¸\82à¹\89à¸à¸¡à¸¹à¸¥
-à¹\83à¸\99à¸\9aาà¸\87à¸\84รัà¹\89à¸\87à¸\9bัà¸\8dหาà¸\99ีà¹\89à¸\88ะà¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¸\96à¹\89าคุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
+'''หาà¸\81à¸\99ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\84วามà¸\9eยายามà¹\81à¸\81à¹\89à¹\84à¸\82à¹\82à¸\94ยà¸\8aà¸à¸\9a à¹\82à¸\9bรà¸\94ลà¸à¸\87à¸à¸µà¸\81à¸\84รัà¹\89à¸\87หà¸\99ึà¹\88à¸\87''' หาà¸\81ยัà¸\87à¹\80สียà¸à¸¢à¸¹à¹\88 ลà¸à¸\87[[Special:UserLogout|ลà¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8c]]à¹\81ละลà¹\87à¸à¸\81à¸à¸´à¸\99à¸\81ลัà¸\9aมา",
+'token_suffix_mismatch' => "'''à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¹\80à¸\84รืà¹\88à¸à¸\87ลูà¸\81à¸\82à¹\88ายà¸\97ีà¹\88à¸\84ุà¸\93à¹\83à¸\8aà¹\89à¸\97ำà¹\83หà¹\89à¸à¸±à¸\81à¸\82ระà¹\80à¸\84รืà¹\88à¸à¸\87หมายวรรà¸\84à¸\95à¸à¸\99à¹\83à¸\99à¸\95ราสารà¸\9bระà¸\88ำà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82 (edit token) à¹\80สีย'''
+à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¸\96ูà¸\81à¸\9bà¸\8fิà¹\80สà¸\98à¹\80à¸\9eืà¹\88à¸à¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99à¸\81ารวิà¸\9aัà¸\95ิà¸\82à¸à¸\87à¸\82à¹\89à¸à¸\84วามหà¸\99à¹\89า
+à¸\9aาà¸\87à¸\84รัà¹\89à¸\87à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\99ีà¹\89à¸\82ึà¹\89à¸\99à¹\80มืà¹\88à¸คุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
'edit_form_incomplete' => "'''แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง'''",
'editing' => 'กำลังแก้ไข $1',
'creating' => 'กำลังสร้าง $1',
'editingsection' => 'กำลังแก้ไข $1 (เฉพาะส่วน)',
-'editingcomment' => 'à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82 $1 (à¸\95à¸นใหม่)',
+'editingcomment' => 'à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82 $1 (สà¹\88วนใหม่)',
'editconflict' => 'แก้ไขชนกัน: $1',
'explainconflict' => "ใครบางคนได้เปลี่ยนแปลงหน้านี้ตั้งแต่คุณกำลังแก้ไข
พื้นที่ข้อความส่วนบนมีข้อความหน้าที่มีอยู่ในปัจจุบัน
'rev-deleted-comment' => '(คำอธิบายอย่างย่อถูกลบออก)',
'rev-deleted-user' => '(ชื่อผู้ใช้ถูกลบออก)',
'rev-deleted-event' => '(ปฏิบัติการปูมถูกลบออก)',
-'rev-deleted-user-contribs' => '[à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89หรืà¸à¸«à¸¡à¸²à¸¢à¹\80ลà¸\82ไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]',
-'rev-deleted-text-permission' => "รุà¹\88à¸\99à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9a'''
+'rev-deleted-user-contribs' => '[à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89หรืà¸à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88ไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]',
+'rev-deleted-text-permission' => "รุ่นหน้านี้'''ถูกลบ'''
รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-'rev-deleted-text-unhide' => "รุà¹\88à¸\99à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9a'''
+'rev-deleted-text-unhide' => "รุ่นหน้านี้'''ถูกลบ'''
รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]
คุณยังสามารถ[$1 ดูรุ่นนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-'rev-suppressed-text-unhide' => "รุà¹\88à¸\99à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ยัà¸\9aยัà¹\89à¸\87'''
+'rev-suppressed-text-unhide' => "รุ่นหน้านี้'''ถูกยับยั้ง'''
รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]
คุณยังสามารถ[$1 ดูรุ่นนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-'rev-deleted-text-view' => "รุà¹\88à¸\99à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9a'''
+'rev-deleted-text-view' => "รุ่นหน้านี้'''ถูกลบ'''
คุณสามารถดูรุ่นนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-'rev-suppressed-text-view' => "รุà¹\88à¸\99à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ยัà¸\9aยัà¹\89à¸\87'''
+'rev-suppressed-text-view' => "รุ่นหน้านี้'''ถูกยับยั้ง'''
คุณสามารถดูรุ่นนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
-'rev-deleted-no-diff' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80รียà¸\81à¸\94ูà¸\84วามà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงนี้ เพราะมีบางรุ่น'''ถูกลบ'''
+'rev-deleted-no-diff' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80รียà¸\81à¸\94ูà¸\9cลà¸\95à¹\88างนี้ เพราะมีบางรุ่น'''ถูกลบ'''
รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-'rev-suppressed-no-diff' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87รุà¹\88à¸\99à¸\97ีà¹\88à¹\80ลืà¸à¸\81à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81มีà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87รุà¹\88à¸\99ที่'''ถูกลบ'''",
-'rev-deleted-unhide-diff' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81ต่างนี้'''ถูกลบ'''
+'rev-suppressed-no-diff' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\94ูà¸\9cลà¸\95à¹\88าà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\80à¸\9eราะมีà¸\9cลà¸\95à¹\88าà¸\87หà¸\99ึà¹\88à¸\87ที่'''ถูกลบ'''",
+'rev-deleted-unhide-diff' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87à¸\9cลต่างนี้'''ถูกลบ'''
รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]
-à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\84วามà¹\81à¸\95à¸\81ต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-'rev-suppressed-unhide-diff' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81ต่างนี้'''ถูกยับยั้ง'''
+à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\9cลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+'rev-suppressed-unhide-diff' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87à¸\9cลต่างนี้'''ถูกยับยั้ง'''
รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]
-à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\84วามà¹\81à¸\95à¸\81ต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
-'rev-deleted-diff-view' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81ต่างนี้'''ถูกลบ'''
-à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81ต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
-'rev-suppressed-diff-view' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81ต่างนี้'''ถูกยับยั้ง'''
-à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81ต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
+à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\9cลต่างนี้]ได้ถ้าคุณต้องการดำเนินต่อ",
+'rev-deleted-diff-view' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87à¸\9cลต่างนี้'''ถูกลบ'''
+à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\9cลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
+'rev-suppressed-diff-view' => "รุà¹\88à¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87à¸\9cลต่างนี้'''ถูกยับยั้ง'''
+à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\9cลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]",
'rev-delundel' => 'แสดง/ซ่อน',
'rev-showdeleted' => 'แสดง',
'revisiondelete' => 'ลบ/กู้คืนรุ่น',
'revdelete-nooldid-title' => 'ไม่มีรุ่นที่ต้องการ',
'revdelete-nooldid-text' => 'คุณมิได้เจาะจงรุ่นเป้าหมายเพื่อดำเนินการฟังก์ชันนี้ หรือไม่มีรุ่นที่เจาะจง หรือคุณกำลังพยายามซ่อนรุ่นปัจจุบันอย่างใดอย่างหนึ่ง',
'revdelete-nologtype-title' => 'ไม่ได้ระบุประเภทของปูม',
-'revdelete-nologtype-text' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87à¸\9bระà¹\80ภà¸\97à¸\82à¸à¸\87à¸\9bูมà¹\80à¸\9eืà¹\88à¸à¸\94ำà¹\80à¸\99ิà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ีà¹\89à¸\95à¹\88à¸',
-'revdelete-nologid-title' => 'à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\99รายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ไม่ถูกต้อง',
-'revdelete-nologid-text' => 'à¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87รายà¸\81ารà¸\9bูมà¹\80à¸\9bà¹\89าหมายà¹\80à¸\9eืà¹\88à¸à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\99ีà¹\89 หรืà¸à¹\84มà¹\88มีรายà¸\81ารที่เจาะจงอย่างใดอย่างหนึ่ง',
+'revdelete-nologtype-text' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87à¸\9bระà¹\80ภà¸\97à¸\82à¸à¸\87à¸\9bูมà¸\97ีà¹\88à¸\88ะà¸\94ำà¹\80à¸\99ิà¸\99à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ีà¹\89',
+'revdelete-nologid-title' => 'หà¸\99à¹\88วยà¸\9bูมไม่ถูกต้อง',
+'revdelete-nologid-text' => 'à¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¹\80à¸\88าะà¸\88à¸\87รายà¸\81ารà¸\9bูมà¹\80à¸\9bà¹\89าหมายà¹\80à¸\9eืà¹\88à¸à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\99ีà¹\89 หรืà¸à¹\84มà¹\88มีหà¸\99à¹\88วยที่เจาะจงอย่างใดอย่างหนึ่ง',
'revdelete-no-file' => 'ไม่มีไฟล์ที่ระบุ',
'revdelete-show-file-confirm' => 'คุณแน่ใจที่จะดูรุ่นที่ถูกลบของไฟล์ "<nowiki>$1</nowiki>" เมื่อวันที่ $2 เวลา $3 หรือไม่',
'revdelete-show-file-submit' => 'ใช่',
'logdelete-selected' => "'''{{PLURAL:$1|เหตุการณ์ปูมที่เลือก|เหตุการณ์ปูมที่เลือก}} :'''",
'revdelete-text' => "'''รุ่นการปรับปรุงและเหตุการณ์ที่ถูกลบยังปรากฏในประวัติและปูมของหน้า แต่สาธารณะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้'''
ผู้ดูแลระบบคนอื่นบน {{SITENAME}} ยังสามารถเข้าถึงเนื้อหาที่ถูกซ่อน และสามารถกู้คืนอีกครั้งในลักษณะเดิมเช่นนี้ เว้นแต่จะมีการกำหนดการจำกัดเพิ่มเติม",
-'revdelete-confirm' => 'à¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93มีà¹\80à¸\88à¸\95à¸\99าลà¸\9aà¸\88ริà¸\87 à¹\81ละà¹\80à¸\82à¹\89าà¹\83à¸\88à¸\9cลà¸\81ระà¸\97à¸\9a และกระทำภายใต้[[{{MediaWiki:Policy-url}}|นโยบาย]]',
+'revdelete-confirm' => 'à¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93มีà¹\80à¸\88à¸\95à¸\99าลà¸\9aà¸\88ริà¸\87 à¹\81ละà¹\80à¸\82à¹\89าà¹\83à¸\88à¸\9cลลัà¸\9eà¸\98à¹\8c และกระทำภายใต้[[{{MediaWiki:Policy-url}}|นโยบาย]]',
'revdelete-suppress-text' => "การระงับควรใช้ '''เฉพาะ''' กรณีต่อไปนี้:
* ข้อมูลที่อาจหมิ่นประมาท
* ข้อมูลส่วนบุคคลที่ไม่เหมาะสม
'revdelete-hide-image' => 'ซ่อนเนื้อหาไฟล์',
'revdelete-hide-name' => 'ซ่อนปฏิบัติการและเป้าหมาย',
'revdelete-hide-comment' => 'ซ่อนคำอธิบายอย่างย่อ',
-'revdelete-hide-user' => 'à¸\8bà¹\88à¸à¸\99à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89/หมายà¹\80ลà¸\82ไอพีผู้เขียน',
+'revdelete-hide-user' => 'à¸\8bà¹\88à¸à¸\99à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89/à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88ไอพีผู้เขียน',
'revdelete-hide-restricted' => 'ระงับข้อมูลจากผู้ดูแลระบบเช่นเดียวกับผู้ใช้อื่น',
'revdelete-radio-same' => '(ไม่เปลี่ยนแปลง)',
'revdelete-radio-set' => 'ใช่',
'revdelete-show-no-access' => 'เกิดความผิดพลาดในการแสดงรุ่นเมื่อวันที่ $2 เวลา $1: ฉบับปรับปรุงนี้ถูกกำหนดให้ "ถูกจำกัด"
คุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว',
'revdelete-modify-no-access' => 'เกิดความผิดพลาดในการแก้ไขรุ่นการแก้ไขเมื่อวันที่ $2 เวลา $1: รุ่นการแก้ไขนี้ถูกกำหนดให้ "ถูกจำกัด"
-à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิà¹\8cà¹\80à¸\82à¹\89าà¸\96ึà¸\87รุà¹\88à¸\99à¸\94ัà¸\87à¸\81ลà¹\88าว',
-'revdelete-modify-missing' => 'à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\89à¸\9aัà¸\9aà¸\9bรัà¸\87à¸\9bรุà¸\87หมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!',
-'revdelete-no-change' => "'''à¸\84ำà¹\80à¸\95ืà¸à¸\99:''' รุà¹\88à¸\99à¹\80มืà¹\88à¸à¸§à¸±à¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1 มีà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\97ัศà¸\99วิสัยà¸\95ามà¸\97ีà¹\88à¸\82à¸à¸à¸¢à¸¹à¹\88à¹\81ลà¹\89ว",
-'revdelete-concurrent-change' => 'à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99à¹\80มืà¹\88à¸à¸§à¸±à¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: มีผู้อื่นเปลี่ยนสถานะของรุ่นขณะที่คุณพยายามแก้ไข
+คุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว',
+'revdelete-modify-missing' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89à¸à¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99หมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!',
+'revdelete-no-change' => "'''คำเตือน:''' รุ่นเมื่อวันที่ $2 เวลา $1 ตั้งค่าทัศนวิสัยตามที่ขออยู่แล้ว",
+'revdelete-concurrent-change' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89à¸à¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99à¹\80มืà¹\88à¸à¸§à¸±à¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸\94ูà¹\80หมืà¸à¸\99มีผู้อื่นเปลี่ยนสถานะของรุ่นขณะที่คุณพยายามแก้ไข
กรุณาตรวจสอบปูม',
-'revdelete-only-restricted' => 'à¹\80à¸\81ิà¸\94à¸\84วามผิดพลาดในการซ่อนรุ่นเมื่อวันที่ $2 เวลา $1: คุณไม่สามารถยับยั้งผู้ดูแลระบบมิให้ดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย',
+'revdelete-only-restricted' => 'à¹\80à¸\81ิà¸\94à¸\82à¹\89à¸ผิดพลาดในการซ่อนรุ่นเมื่อวันที่ $2 เวลา $1: คุณไม่สามารถยับยั้งผู้ดูแลระบบมิให้ดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย',
'revdelete-reason-dropdown' => '*เหตุผลการลบทั่วไป
** ละเมิดลิขสิทธิ์
** ความเห็นไม่เหมาะสมหรือข้อมูลส่วนบุคคล
# History merging
'mergehistory' => 'ประวัติการรวมหน้า',
-'mergehistory-header' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¹\84วà¹\89à¹\83หà¹\89à¸\84ุà¸\93à¹\83à¸\8aà¹\89รวมรุà¹\88à¸\99à¸\95à¹\88าà¸\87à¹\86 à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87หà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87 à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¹\83หมà¹\88.
-à¸\81à¹\88à¸à¸\99à¸\94ำà¹\80à¸\99ิà¸\99à¸\81าร à¸\84วรà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88à¸\81à¹\88à¸à¸\99วà¹\88าà¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\99ีà¹\89à¸\88ะà¹\84มà¹\88à¸\97ำà¹\83หà¹\89à¸\84วามà¸\84วามà¸\95à¹\88à¸à¹\80à¸\99ืà¹\88à¸à¸\87à¸\82à¸à¸\87à¸\9bระวัà¸\95ิหà¸\99à¹\89าà¹\80à¸\81à¹\88าà¹\86 à¹\80สียà¹\84à¸\9b.',
+'mergehistory-header' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¹\84วà¹\89à¹\83หà¹\89à¸\84ุà¸\93à¹\83à¸\8aà¹\89รวมรุà¹\88à¸\99à¹\83à¸\99à¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87หà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87หà¸\99ึà¹\88à¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¹\83หมà¹\88
+à¸\81à¹\88à¸à¸\99à¸\94ำà¹\80à¸\99ิà¸\99à¸\81าร à¸\84วรà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88à¸\81à¹\88à¸à¸\99วà¹\88าà¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\99ีà¹\89ยัà¸\87รัà¸\81ษาà¸\84วามà¸\95à¹\88à¸à¹\80à¸\99ืà¹\88à¸à¸\87à¸\82à¸à¸\87à¸\9bระวัà¸\95ิหà¸\99à¹\89าà¹\80à¸\81à¹\88า',
'mergehistory-box' => 'รวมรุ่นของหน้าทั้งสอง:',
'mergehistory-from' => 'หน้าต้นทาง:',
'mergehistory-into' => 'หน้าปลายทาง:',
'mergehistory-fail' => 'ไม่สามารถรวมประวัติการแก้ไขได้ โปรดตรวจสอบค่าตัวแปรหน้าและเวลาอีกครั้ง',
'mergehistory-no-source' => 'ไม่มีหน้าต้นทาง $1 อยู่ในสารบบ',
'mergehistory-no-destination' => 'ไม่มีหน้าปลายทาง $1 อยู่ในสารบบ',
-'mergehistory-invalid-source' => 'หัวà¹\80รืà¹\88à¸à¸\87à¸\82องหน้าต้นทางต้องสมเหตุสมผล',
-'mergehistory-invalid-destination' => 'à¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87à¸\82à¸à¸\87หà¸\99à¹\89าà¸\9bลายà¸\97าà¸\87à¸\95à¹\89à¸à¸\87สมà¹\80หà¸\95ุสมà¸\9cล',
-'mergehistory-autocomment' => 'ยà¹\89าย [[:$1]] à¹\84à¸\9bยัà¸\87 [[:$2]]',
-'mergehistory-comment' => 'ยà¹\89าย [[:$1]] à¹\84à¸\9bยัà¸\87 [[:$2]]: $3',
+'mergehistory-invalid-source' => 'à¸\8aืà¹\88à¸à¹\80รืà¹\88องหน้าต้นทางต้องสมเหตุสมผล',
+'mergehistory-invalid-destination' => 'ชื่อเรื่องหน้าปลายทางต้องสมเหตุสมผล',
+'mergehistory-autocomment' => 'รวม [[:$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[:$2]]',
+'mergehistory-comment' => 'รวม [[:$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[:$2]]: $3',
'mergehistory-same-destination' => 'หน้าต้นทางและปลายทางเป็นหน้าเดียวกันไม่ได้',
'mergehistory-reason' => 'เหตุผล:',
# Merge log
'mergelog' => 'ปูมการรวมหน้า',
-'pagemerge-logentry' => 'ยà¹\89าย [[$1]] à¹\84à¸\9bยัà¸\87 [[$2]] (รุ่นขึ้นอยู่กับ $3)',
+'pagemerge-logentry' => 'รวม [[$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[$2]] (รุ่นขึ้นอยู่กับ $3)',
'revertmerge' => 'ยกเลิกการรวมหน้า',
-'mergelogpagetext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารลà¹\88าสุà¸\94à¸\82à¸à¸\87à¸\81ารรวมà¸\9bระวัà¸\95ิหà¸\99à¹\89าหà¸\99ึà¹\88à¸\87à¹\80à¸\82à¹\89าà¸\81ัà¸\9aà¸à¸µà¸\81หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87',
+'mergelogpagetext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารรวมà¸\9bระวัà¸\95ิà¸\82à¸à¸\87หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87à¹\80à¸\82à¹\89าà¸\81ัà¸\9aà¸\82à¸à¸\87à¸à¸µà¸\81หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87ลà¹\88าสุà¸\94',
# Diffs
'history-title' => 'ประวัติรุ่นปรับปรุงของ "$1"',
-'difference-title' => 'à¸\84วามà¹\81à¸\95à¸\81ต่างระหว่างรุ่นของ "$1"',
-'difference-title-multipage' => 'à¸\84วามà¹\81à¸\95à¸\81ต่างระหว่างหน้า "$1" และ "$2"',
-'difference-multipage' => '(à¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87หà¸\99à¹\89าà¸\95à¹\88าà¸\87 à¹\86)',
+'difference-title' => 'à¸\9cลต่างระหว่างรุ่นของ "$1"',
+'difference-title-multipage' => 'à¸\9cลต่างระหว่างหน้า "$1" และ "$2"',
+'difference-multipage' => '(à¸\9cลà¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87หà¸\99à¹\89า)',
'lineno' => 'แถว $1:',
'compareselectedversions' => 'เปรียบเทียบสองรุ่นที่เลือก',
'showhideselectedversions' => 'แสดง/ซ่อนรุ่นที่เลือก',
'editundo' => 'ย้อน',
-'diff-multi' => '(มิได้แสดง $1 รุ่นระหว่างรุ่นที่เปรียบเทียบโดย{{PLURAL:$2|ผู้ใช้คนหนึ่ง|ผู้ใช้ $2 คน}})',
-'diff-multi-manyusers' => '(มิได้แสดง $1 รุ่นระหว่างรุ่นที่เปรียบเทียบโดยผู้ใช้กว่า $2 คน)',
+'diff-multi' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดย{{PLURAL:$2|ผู้ใช้คนหนึ่ง|ผู้ใช้ $2 คน}})',
+'diff-multi-manyusers' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้กว่า $2 คน)',
+'difference-missing-revision' => 'ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)
+
+โดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบไปแล้ว
+ดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]',
# Search results
'searchresults' => 'ผลการค้นหา',
'searchresults-title' => 'ผลการค้นหาสำหรับ "$1"',
-'searchresulttext' => 'สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการค้น {{SITENAME}} ดูที่ [[{{MediaWiki:Helppage}}|{{int:help}}]]',
-'searchsubtitle' => 'à¸\84ุà¸\93à¹\84à¸\94à¹\89สืà¸\9aà¸\84à¹\89à¸\99หา \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|à¸\97ุà¸\81หà¸\99à¹\89าà¸\97ีà¹\88à¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วย "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|à¸\97ุà¸\81หà¸\99à¹\89าà¸\97ีà¹\88à¹\82ยà¸\87มาà¸\97ีà¹\88 "$1"]])',
-'searchsubtitleinvalid' => "à¸\84à¹\89à¸\99หาà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9a '''$1'''",
-'toomanymatches' => 'พบตรงกันมากเกินไป กรุณาใช้คำค้นหาอื่น',
+'searchresulttext' => 'สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการค้นหา {{SITENAME}} ดูที่ [[{{MediaWiki:Helppage}}|{{int:help}}]]',
+'searchsubtitle' => 'คุณได้ค้นหา \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|ทุกหน้าที่ขึ้นต้นด้วย "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|ทุกหน้าที่โยงมาที่ "$1"]])',
+'searchsubtitleinvalid' => "à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\84à¹\89à¸\99หาà¸\84ำวà¹\88า '''$1'''",
+'toomanymatches' => 'à¸\9eà¸\9aà¸\95รà¸\87à¸\81ัà¸\99มาà¸\81à¹\80à¸\81ิà¸\99à¹\84à¸\9b à¸\81รุà¸\93าลà¸à¸\87à¹\83à¸\8aà¹\89à¸\84ำà¸\84à¹\89à¸\99หาà¸à¸·à¹\88à¸\99',
'titlematches' => 'พบชื่อเรื่องหน้าตรงกัน',
'notitlematches' => 'ไม่พบชื่อเรื่องหน้าตรงกัน',
'textmatches' => 'พบคำนี้ในหน้า',
'searchmenu-exists' => "'''มีหน้าชื่อ \"[[:\$1]]\" บนวิกินี้'''",
'searchmenu-new' => "'''สร้างหน้า \"[[:\$1]]\" บนวิกินี้'''",
'searchhelp-url' => 'Help:สารบัญ',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|สืà¸\9aà¸\84à¹\89à¸\99หน้าที่มีคำขึ้นต้นนี้]]',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à¸\84à¹\89à¸\99à¸\94ูหน้าที่มีคำขึ้นต้นนี้]]',
'searchprofile-articles' => 'หน้าเนื้อหา',
'searchprofile-project' => 'คำอธิบายและหน้าโครงการ',
'searchprofile-images' => 'มัลติมีเดีย',
'search-interwiki-default' => '$1 ผลลัพธ์:',
'search-interwiki-more' => '(เพิ่มเติม)',
'search-relatedarticle' => 'สัมพันธ์',
-'mwsuggest-disable' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารà¹\81à¸\99ะà¸\99ำà¹\83à¸\99ลัà¸\81ษà¸\93ะà¹\80à¸à¹\81à¸\88à¹\87à¸\81à¸\8bà¹\8c',
-'searcheverything-enable' => 'สืà¸\9aà¸\84à¹\89à¸\99à¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\97ัà¹\89à¸\87หมà¸\94',
+'mwsuggest-disable' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¹\80สà¸\99à¸à¹\81à¸\99ะà¸\81ารà¸\84à¹\89à¸\99หา',
+'searcheverything-enable' => 'à¸\84à¹\89à¸\99หาà¹\83à¸\99à¸\97ุà¸\81à¹\80à¸\99มสà¹\80à¸\9bà¸\8b',
'searchrelated' => 'สัมพันธ์',
'searchall' => 'ทั้งหมด',
-'showingresults' => "à¹\81สà¸\94à¸\87 $1 รายà¸\81าร à¹\80ริà¹\88มà¸\95à¹\89à¸\99à¸\88าà¸\81รายการที่ '''$2'''",
-'showingresultsnum' => "à¹\81สà¸\94à¸\87 $3 รายà¸\81าร à¹\80ริà¹\88มà¸\95à¹\89à¸\99à¸\88าà¸\81รายการที่ '''$2'''",
-'showingresultsheader' => "{{PLURAL:$5|à¸\9cลà¸\81ารสืà¸\9aà¸\84à¹\89à¸\99 '''$1''' à¸\88าà¸\81 '''$3'''|à¸\9cลà¸\81ารสืà¸\9aà¸\84à¹\89à¸\99 '''$1 - $2''' จาก '''$3'''}} สำหรับ '''$4'''",
-'nonefound' => "'''à¸\84ำà¹\80à¸\95ืà¸à¸\99''': มีà¹\80à¸\9eียà¸\87à¸\9aาà¸\87à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\97ีà¹\88à¸\88ะà¸\96ูà¸\81à¸\84à¹\89à¸\99โดยปริยาย
-ลà¸à¸\87à¹\80ลืà¸à¸\81à¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\81ารà¸\84à¹\89à¸\99หาà¸\94à¹\89วย ''all:'' สำหรัà¸\9aà¸\84à¹\89à¸\99à¹\80à¸\99ืà¹\89à¸à¸«à¸²à¸\97ัà¹\89à¸\87หมà¸\94 (รวมหà¸\99à¹\89าà¸à¸ ิà¸\9bราย à¹\81มà¹\88à¹\81à¸\9aà¸\9a ฯลฯ) หรืà¸à¹\80ลืà¸à¸\81เนมสเปซที่ต้องการ",
-'search-nonefound' => 'à¹\84มà¹\88มีà¸\9cลลัà¸\9eà¸\98à¹\8cà¸\95ามà¸\84ำà¸\84à¹\89à¸\99à¸\97ีà¹\88à¸\81ำหà¸\99à¸\94',
+'showingresults' => "à¹\81สà¸\94à¸\87 $1 รายà¸\81าร à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88รายการที่ '''$2'''",
+'showingresultsnum' => "à¹\81สà¸\94à¸\87 $3 รายà¸\81าร à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88รายการที่ '''$2'''",
+'showingresultsheader' => "{{PLURAL:$5|à¸\9cลà¸\81ารà¸\84à¹\89à¸\99หา '''$1''' à¸\88าà¸\81 '''$3'''|à¸\9cลà¸\81ารà¸\84à¹\89à¸\99หา '''$1 - $2''' จาก '''$3'''}} สำหรับ '''$4'''",
+'nonefound' => "'''à¸\84ำà¹\80à¸\95ืà¸à¸\99''': มีà¹\80à¸\9eียà¸\87à¸\9aาà¸\87à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¹\80à¸\97à¹\88าà¸\99ัà¹\89à¸\99à¸\97ีà¹\88à¸\88ะà¸\96ูà¸\81à¸\84à¹\89à¸\99หาโดยปริยาย
+ลà¸à¸\87à¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\81ารà¸\84à¹\89à¸\99หาà¸\94à¹\89วย ''all:'' à¹\80à¸\9eืà¹\88à¸à¸\84à¹\89à¸\99หาà¹\80à¸\99ืà¹\89à¸à¸«à¸²à¸\97ัà¹\89à¸\87หมà¸\94 (รวมหà¸\99à¹\89าà¸à¸ ิà¸\9bราย à¹\81มà¹\88à¹\81à¸\9aà¸\9a ฯลฯ) หรืà¸à¹\83à¸\8aà¹\89à¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99เนมสเปซที่ต้องการ",
+'search-nonefound' => 'à¹\84มà¹\88มีà¸\9cลลัà¸\9eà¸\98à¹\8cà¸\95รà¸\87à¸\81ัà¸\9aà¸\84ำà¸\84à¹\89à¸\99',
'powersearch' => 'ค้นหาระดับสูง',
'powersearch-legend' => 'ค้นหาระดับสูง',
'powersearch-ns' => 'ค้นหาในเนมสเปซ:',
'powersearch-togglelabel' => 'เลือก:',
'powersearch-toggleall' => 'ทั้งหมด',
'powersearch-togglenone' => 'ไม่เลือก',
-'search-external' => 'à¸\84à¹\89à¸\99หาà¸\88าà¸\81ภายà¸\99à¸à¸\81',
-'searchdisabled' => 'ระà¸\9aà¸\9aà¸\81ารà¸\84à¹\89à¸\99หาà¹\83à¸\99 {{SITENAME}} à¹\84มà¹\88à¹\80à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99 à¸\84ุà¸\93สามารà¸\96à¸\84à¹\89à¸\99หาà¹\83à¸\99à¸\81ูà¹\80à¸\81ิลหรืà¸à¹\80à¸\8bิรà¹\8cà¸\8aà¹\80à¸à¸\99à¸\88ิà¸\99à¸à¸·à¹\88à¸\99 à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเก่า',
+'search-external' => 'ค้นหาภายนอก',
+'searchdisabled' => 'à¸\81ารà¸\84à¹\89à¸\99หา {{SITENAME}} à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 à¸\84ุà¸\93สามารà¸\96à¸\84à¹\89à¸\99หาà¸\9cà¹\88าà¸\99à¸\81ูà¹\80à¸\81ิลหรืà¸à¹\80à¸\8bิรà¹\8cà¸\8aà¹\80à¸à¸\99à¸\88ิà¸\99à¸à¸·à¹\88à¸\99à¹\83à¸\99à¹\80วลาà¹\84มà¹\88à¸\99าà¸\99 à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าà¸\94ัà¸\8aà¸\99ีเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเก่า',
# Quickbar
'qbsettings' => 'แถบพิเศษ',
'qbsettings-none' => 'ไม่มี',
-'qbsettings-fixedleft' => 'à¸à¸¢à¸¹à¹\88ทางซ้าย',
-'qbsettings-fixedright' => 'à¸à¸¢à¸¹à¹\88ทางขวา',
+'qbsettings-fixedleft' => 'à¸\95รึà¸\87à¹\84วà¹\89ทางซ้าย',
+'qbsettings-fixedright' => 'à¸\95รึà¸\87à¹\84วà¹\89ทางขวา',
'qbsettings-floatingleft' => 'ด้านซ้าย',
'qbsettings-floatingright' => 'ด้านขวา',
'prefs-datetime' => 'วันที่และเวลา',
'prefs-labs' => 'คุณสมบัติทดลอง',
'prefs-user-pages' => 'หน้าผู้ใช้',
-'prefs-personal' => 'รายละà¹\80à¸à¸µà¸¢à¸\94ผู้ใช้',
+'prefs-personal' => 'à¹\82à¸\9eรà¹\84à¸\9fลà¹\8cผู้ใช้',
'prefs-rc' => 'ปรับปรุงล่าสุด',
'prefs-watchlist' => 'รายการเฝ้าดู',
'prefs-watchlist-days' => 'จำนวนวันที่แสดงในรายการเฝ้าดู:',
'prefs-resetpass' => 'เปลี่ยนรหัสผ่าน',
'prefs-changeemail' => 'เปลี่ยนที่อยู่อีเมล',
'prefs-setemail' => 'ตั้งที่อยู่อีเมล',
-'prefs-email' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าอีเมล',
+'prefs-email' => 'à¸\95ัวà¹\80ลืà¸à¸\81อีเมล',
'prefs-rendering' => 'รูปลักษณ์',
'saveprefs' => 'บันทึก',
'resetprefs' => 'ล้างการเปลี่ยนแปลงที่ยังไม่บันทึก',
'prefs-edit-boxsize' => 'ขนาดหน้าจอกล่องแก้ไข',
'rows' => 'แถว:',
'columns' => 'คอลัมน์:',
-'searchresultshead' => 'สืà¸\9aà¸\84à¹\89à¸\99',
-'resultsperpage' => 'รายà¸\81ารต่อหน้า:',
-'stub-threshold' => 'à¸\82ีà¸\94à¹\81à¸\9aà¹\88à¸\87สำหรัà¸\9a <a href="#" class="stub">รูà¸\9bà¹\81à¸\9aà¸\9aà¹\82à¸\84รà¸\87</a> (à¸\84วามยาวà¸\9aà¸\97à¸\84วาม):',
-'stub-threshold-disabled' => 'à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99',
+'searchresultshead' => 'à¸\84à¹\89à¸\99หา',
+'resultsperpage' => 'à¸\81ารà¹\80à¸\9bิà¸\94à¸\94ูต่อหน้า:',
+'stub-threshold' => 'à¸\82ีà¸\94à¹\81à¸\9aà¹\88à¸\87สำหรัà¸\9a <a href="#" class="stub">ลิà¸\87à¸\81à¹\8cà¹\82à¸\84รà¸\87</a> (à¹\84à¸\9aà¸\95à¹\8c):',
+'stub-threshold-disabled' => 'ปิดใช้งาน',
'recentchangesdays' => 'จำนวนวันที่แสดงในปรับปรุงล่าสุด:',
'recentchangesdays-max' => 'มากสุด $1 วัน',
'recentchangescount' => 'จำนวนการแก้ไขที่แสดงโดยปริยาย:',
'prefs-custom-css' => 'สไตล์ชีตปรับแต่งเอง',
'prefs-custom-js' => 'จาวาสคริปต์ปรับแต่งเอง',
'prefs-common-css-js' => 'CSS / จาวาสคริปต์ที่ใช้ร่วมกันกับทุกหน้าตา:',
-'prefs-reset-intro' => 'à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\82à¸à¸\87à¸\84ุà¸\93à¸\81ลัà¸\9aà¹\80à¸\9bà¹\87à¸\99à¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99à¸\82à¸à¸\87à¹\84à¸\8bà¸\95à¹\8cใหม่
-à¹\80มืà¹\88à¸à¸¥à¹\89าà¸\87à¹\81ลà¹\89วà¸\88ะà¹\84มà¹\88สามารà¸\96ยà¹\89à¸à¸\99กลับได้',
+'prefs-reset-intro' => 'à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89หà¸\99à¹\89าà¸\99ีà¹\89à¸\95ัà¹\89à¸\87à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\82à¸à¸\87à¸\84ุà¸\93à¸\81ลัà¸\9aà¹\84à¸\9bยัà¸\87à¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99à¸\82à¸à¸\87à¹\80วà¹\87à¸\9aใหม่
+à¸\8bึà¹\88à¸\87à¹\84มà¹\88สามารà¸\96à¸\97ำกลับได้',
'prefs-emailconfirm-label' => 'การยืนยันอีเมล:',
-'prefs-textboxsize' => 'à¸\82à¸\99าà¸\94à¸\82à¸à¸\87หà¸\99à¹\89าà¸\95à¹\88าà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82',
+'prefs-textboxsize' => 'ขนาดหน้าต่างแก้ไข',
'youremail' => 'อีเมล:',
'username' => '{{GENDER:$1|ชื่อผู้ใช้}}:',
'uid' => 'รหัสประจำตัว{{GENDER:$1|ผู้ใช้}}:',
'prefs-memberingroups' => '{{GENDER:$2|สมาชิก}}ใน{{PLURAL:$1|กลุ่ม|กลุ่ม}}:',
-'prefs-registration' => 'วัà¸\99à¹\80วลาà¸\97ีà¹\88ลงทะเบียน:',
+'prefs-registration' => 'à¹\80วลาลงทะเบียน:',
'yourrealname' => 'ชื่อจริง:',
'yourlanguage' => 'ภาษา:',
'yourvariant' => 'อักษรต่างรูปของเนื้อหา:',
'yournick' => 'ลายเซ็น:',
-'prefs-help-signature' => 'à¸\84วามà¹\80หà¹\87à¸\99à¹\83à¸\99หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\84วรà¸\88ะลà¸\87ลายà¹\80à¸\8bà¹\87à¸\99à¸\94à¹\89วย "<nowiki>~~~~</nowiki>" à¸\8bึà¹\88à¸\87à¸\88ะà¸\96ูà¸\81à¹\81à¸\9bลà¸\87à¹\80à¸\9bà¹\87à¸\99ลายà¹\80à¸\8bà¹\87à¸\99และตราเวลา',
-'badsig' => 'ลายà¹\80à¸\8bà¹\87à¸\99à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸\9cิà¸\94à¸\9eลาà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สà¸à¸\9aà¸\84ำสัà¹\88à¸\87เอชทีเอ็มแอล',
+'prefs-help-signature' => 'à¸\84วามà¹\80หà¹\87à¸\99à¹\83à¸\99หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\84วรลà¸\87ลายà¹\80à¸\8bà¹\87à¸\99à¸\94à¹\89วย "<nowiki>~~~~</nowiki>" à¸\8bึà¹\88à¸\87à¸\88ะà¸\96ูà¸\81à¹\81à¸\9bลà¸\87à¹\80à¸\9bà¹\87à¸\99ลายà¹\80à¸\8bà¹\87à¸\99à¸\82à¸à¸\87à¸\84ุà¸\93และตราเวลา',
+'badsig' => 'ลายà¹\80à¸\8bà¹\87à¸\99à¸\94ิà¸\9aà¹\84มà¹\88สมà¹\80หà¸\95ุสมà¸\9cล à¸\95รวà¸\88สà¸à¸\9aà¸\9bà¹\89ายระà¸\9aุเอชทีเอ็มแอล',
'badsiglength' => 'ลายเซ็นของคุณยาวเกินไป ต้องยาวไม่เกิน $1 ตัวอักษร',
'yourgender' => 'เพศ:',
'gender-unknown' => 'ไม่ระบุ',
'gender-male' => 'ชาย',
'gender-female' => 'หญิง',
-'prefs-help-gender' => 'à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\80สริม: à¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88à¸à¹\83หà¹\89à¸\8bà¸à¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¹\81ยà¸\81à¹\81ยะà¹\80à¸\9eศà¸\82à¸à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89 à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\99ีà¹\89à¸\88ะà¹\80à¸\9bà¹\87à¸\99à¸\97ีà¹\88à¹\80à¸\9bิà¸\94à¹\80à¸\9cย',
+'prefs-help-gender' => 'à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\80สริม: à¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88à¸à¹\83หà¹\89à¸\8bà¸à¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¹\81ยà¸\81à¹\81ยะà¹\80à¸\9eศà¸\82à¸à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89 à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\99ีà¹\89à¸\88ะà¹\80à¸\9bิà¸\94à¹\80à¸\9cยà¸\95à¹\88à¸à¸ªà¸²à¸\98ารà¸\93ะ',
'email' => 'อีเมล',
-'prefs-help-realname' => 'à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89à¸à¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88à¸à¸\88ริà¸\87 à¸\96à¹\89าà¸\84ุà¸\93à¹\80ลืà¸à¸\81à¸\97ีà¹\88à¸\88ะà¹\83à¸\8aà¹\89à¸\8aืà¹\88à¸à¸\88ริà¸\87 à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88à¸à¹\83หà¹\89à¹\80à¸\81ียรà¸\95ิà¹\81à¸\81à¹\88à¸\87าà¸\99à¸\82à¸à¸\87à¸\84ุà¸\93',
-'prefs-help-email' => 'à¹\84มà¹\88à¸\95à¹\89à¸à¸\87à¹\83สà¹\88à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มล à¹\81à¸\95à¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99สำหรัà¸\9aà¸\81ารà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\80มืà¹\88à¸à¸\84ุà¸\93ลืมรหัสà¸\9cà¹\88าà¸\99à¸\82à¸à¸\87à¸\84ุà¸\93',
+'prefs-help-realname' => 'ไม่จำเป็นต้องใช้ชื่อจริง ถ้าคุณเลือกใช้ชื่อจริง จะใช้เพื่อให้เกียรติแก่งานของคุณ',
+'prefs-help-email' => 'à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89à¸à¸\87à¹\83สà¹\88à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มล à¹\81à¸\95à¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99สำหรัà¸\9aà¸\81ารà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\80มืà¹\88à¸à¸\84ุà¸\93ลืมรหัสà¸\9cà¹\88าà¸\99',
'prefs-help-email-others' => 'คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ
ที่อยู่อีเมลของคุณไม่ถูกเปิดเผยเมื่อผู้ใช้อื่นติดต่อคุณ',
'prefs-help-email-required' => 'ต้องการที่อยู่อีเมล',
'prefs-info' => 'ข้อมูลเบื้องต้น',
-'prefs-i18n' => 'ระà¸\9aà¸\9aภาษาหรืà¸à¹\80à¸\82à¸\95à¸\9eืà¹\89à¸\99à¸\97ีà¹\88',
+'prefs-i18n' => 'สาà¸\81ลวิวัà¸\95à¸\99à¹\8c',
'prefs-signature' => 'ลายเซ็น',
'prefs-dateformat' => 'รูปแบบวันที่',
'prefs-timeoffset' => 'ส่วนต่างเวลา',
-'prefs-advancedediting' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-advancedrc' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-advancedrendering' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-advancedsearchoptions' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-advancedwatchlist' => 'à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าขั้นสูง',
-'prefs-displayrc' => 'à¸\84à¹\88าà¸\81ารà¹\81สà¸\94à¸\87à¸\9cล',
-'prefs-displaysearchoptions' => 'à¸\84à¹\88าà¸\81ารà¹\81สà¸\94à¸\87à¸\9cล',
-'prefs-displaywatchlist' => 'à¸\84à¹\88าà¸\81ารà¹\81สà¸\94à¸\87à¸\9cล',
-'prefs-diffs' => 'à¹\81à¸\95à¸\81ต่าง',
-
-# User preference: e-mail validation using jQuery
+'prefs-advancedediting' => 'à¸\95ัวà¹\80ลืà¸à¸\81ขั้นสูง',
+'prefs-advancedrc' => 'à¸\95ัวà¹\80ลืà¸à¸\81ขั้นสูง',
+'prefs-advancedrendering' => 'à¸\95ัวà¹\80ลืà¸à¸\81ขั้นสูง',
+'prefs-advancedsearchoptions' => 'à¸\95ัวà¹\80ลืà¸à¸\81ขั้นสูง',
+'prefs-advancedwatchlist' => 'à¸\95ัวà¹\80ลืà¸à¸\81ขั้นสูง',
+'prefs-displayrc' => 'à¸\95ัวà¹\80ลืà¸à¸\81à¸\9cลà¹\81สà¸\94à¸\87',
+'prefs-displaysearchoptions' => 'à¸\95ัวà¹\80ลืà¸à¸\81à¸\9cลà¹\81สà¸\94à¸\87',
+'prefs-displaywatchlist' => 'à¸\95ัวà¹\80ลืà¸à¸\81à¸\9cลà¹\81สà¸\94à¸\87',
+'prefs-diffs' => 'à¸\9cลต่าง',
+
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'ที่อยู่อีเมลดูถูกต้อง',
'email-address-validity-invalid' => 'ป้อนที่อยู่อีเมลที่ถูกต้อง',
'userrights-editusergroup' => 'แก้ไขกลุ่มผู้ใช้',
'saveusergroups' => 'ตกลง',
'userrights-groupsmember' => 'สมาชิกในกลุ่ม:',
-'userrights-groupsmember-auto' => 'สมาà¸\8aิà¸\81à¹\82à¸\94ยà¸\99ัยของ:',
-'userrights-groups-help' => 'คุณสามารถเปลี่ยนแปลงกลุ่มที่ผู้ใช้รายนี้อยู่ใน:
-* à¸\81ลà¹\88à¸à¸\87à¸\97ีà¹\88à¸\96ูà¸\81à¹\80ลืà¸à¸\81หมายà¸\84วามวà¹\88าผู้ใช้อยู่ในกลุ่มนั้น
-* à¸\81ลà¹\88à¸à¸\87à¸\97ีà¹\88à¹\84มà¹\88à¸\96ูà¸\81à¹\80ลืà¸à¸\81หมายà¸\84วามวà¹\88าผู้ใช้ไม่ได้อยู่ในกลุ่มนั้น
-* à¹\80à¸\84รืà¹\88à¸à¸\87หมาย * à¸\8aีà¹\89วà¹\88าà¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸à¸²à¸\81ลุà¹\88มà¸\99ัà¹\89à¸\99à¸à¸à¸\81à¹\84à¸\94à¹\89à¹\80มืà¹\88à¸à¹\83à¸\94à¸\81à¹\87à¸\95ามà¸\97ีà¹\88คุณเพิ่มกลุ่มนั้นไปแล้ว หรือกลับกัน',
+'userrights-groupsmember-auto' => 'สมาà¸\8aิà¸\81à¹\82à¸\94ยà¸\9bริยายของ:',
+'userrights-groups-help' => 'คุณสามารถเปลี่ยนแปลงกลุ่มที่ผู้ใช้รายนี้อยู่:
+* à¸\81ลà¹\88à¸à¸\87à¸\97ีà¹\88มีà¹\80à¸\84รืà¹\88à¸à¸\87หมายà¸\96ูà¸\81 หมายà¸\84วามวà¹\88า ผู้ใช้อยู่ในกลุ่มนั้น
+* à¸\81ลà¹\88à¸à¸\87à¸\97ีà¹\88à¹\84มà¹\88มีà¹\80à¸\84รืà¹\88à¸à¸\87หมายà¸\96ูà¸\81 หมายà¸\84วามวà¹\88า ผู้ใช้ไม่ได้อยู่ในกลุ่มนั้น
+* à¹\80à¸\84รืà¹\88à¸à¸\87หมาย * à¸\8aีà¹\89วà¹\88าà¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¸\99ำà¸\81ลุà¹\88มà¸\99ัà¹\89à¸\99à¸à¸à¸\81à¹\84à¸\94à¹\89à¹\80มืà¹\88à¸คุณเพิ่มกลุ่มนั้นไปแล้ว หรือกลับกัน',
'userrights-reason' => 'เหตุผล:',
-'userrights-no-interwiki' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82สิà¸\97à¸\98ิà¸\82à¸à¸\87ผู้ใช้บนวิกิอื่น',
-'userrights-nodatabase' => 'ไม่มีฐานข้อมูล $1 อยู่ หรือ ฐานข้อมูลอยู่บนเครื่องอื่น',
+'userrights-no-interwiki' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\81à¸\81à¹\89à¹\84à¸\82สิà¸\97à¸\98ิผู้ใช้บนวิกิอื่น',
+'userrights-nodatabase' => 'ไม่มีฐานข้อมูล $1 อยู่ หรือฐานข้อมูลอยู่บนเครื่องอื่น',
'userrights-nologin' => 'คุณต้อง[[Special:UserLogin|ล็อกอิน]]ด้วยบัญชีผู้ดูแลระบบก่อน จึงจะกำหนดสิทธิผู้ใช้ได้',
'userrights-notallowed' => 'บัญชีของคุณไม่ได้รับอนุญาตให้เพิ่มหรือลดสิทธิของผู้ใช้',
'userrights-changeable-col' => 'กลุ่มที่คุณสามารถเปลี่ยนได้',
# Groups
'group' => 'กลุ่ม:',
-'group-user' => 'ผู้ใช้ใหม่',
+'group-user' => 'ผู้ใช้',
'group-autoconfirmed' => 'ผู้ใช้ทั่วไป',
'group-bot' => 'บอต',
-'group-sysop' => 'ผู้ดูแล',
+'group-sysop' => 'ผู้ดูแลระบบ',
'group-bureaucrat' => 'ผู้ดูแลสิทธิแต่งตั้ง',
-'group-suppress' => 'à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\94ัà¸\9aสูà¸\87',
+'group-suppress' => 'à¸\9cูà¹\89à¸\94ูà¹\81ลà¸\9bระวัà¸\95ิ',
'group-all' => '(ทั้งหมด)',
-'group-user-member' => '{{GENDER:$1|ผู้ใช้ใหม่}}',
+'group-user-member' => '{{GENDER:$1|ผู้ใช้}}',
'group-autoconfirmed-member' => '{{GENDER:$1|ผู้ใช้ทั่วไป}}',
'group-bot-member' => '{{GENDER:$1|บอต}}',
'group-sysop-member' => '{{GENDER:$1|ผู้ดูแลระบบ}}',
'group-bureaucrat-member' => '{{GENDER:$1|ผู้ดูแลสิทธิแต่งตั้ง}}',
-'group-suppress-member' => '{{GENDER:$1|oversight}}',
+'group-suppress-member' => '{{GENDER:$1|ผู้ดูแลประวัติ}}',
'grouppage-user' => '{{ns:project}}:ผู้ใช้',
'grouppage-autoconfirmed' => '{{ns:project}}:ผู้ใช้ทั่วไป',
'grouppage-bot' => '{{ns:project}}:บอต',
'grouppage-sysop' => '{{ns:project}}:ผู้ดูแล',
'grouppage-bureaucrat' => '{{ns:project}}:ผู้ดูแลสิทธิแต่งตั้ง',
-'grouppage-suppress' => '{{ns:project}}:à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\94ัà¸\9aสูà¸\87',
+'grouppage-suppress' => '{{ns:project}}:à¸\9cูà¹\89à¸\94ูà¹\81ลà¸\9bระวัà¸\95ิ',
# Rights
'right-read' => 'อ่านหน้า',
'right-createpage' => 'สร้างหน้า (ที่ไม่ใช่หน้าอภิปราย)',
'right-createtalk' => 'สร้างหน้าอภิปราย',
'right-createaccount' => 'สร้างบัญชีผู้ใช้ใหม่',
-'right-minoredit' => 'ทำเครื่องหมายการแก้ไขเล็กน้อย',
+'right-minoredit' => 'à¸\97ำà¹\80à¸\84รืà¹\88à¸à¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89à¸à¸¢',
'right-move' => 'ย้ายหน้า',
'right-move-subpages' => 'ย้ายหน้าพร้อมหน้าย่อย',
'right-move-rootuserpages' => 'ย้ายหน้าผู้ใช้หลัก',
'right-upload_by_url' => 'อัปโหลดไฟล์จากยูอาร์แอล',
'right-purge' => 'ล้างแคชของเว็บไซต์โดยไม่มีการยืนยัน',
'right-autoconfirmed' => 'แก้ไขหน้าที่ถูกกึ่งล็อก',
-'right-bot' => 'à¸\81ำหà¸\99à¸\94วà¹\88าà¹\80à¸\9bà¹\87à¸\99à¸\81ระà¸\9aวà¸\99à¸\81ารà¸à¸±à¸\95à¹\82à¸\99มัà¸\95ิ',
-'right-nominornewtalk' => 'à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89à¸à¸¢à¸\97ีà¹\88หà¸\99à¹\89าสà¸\99à¸\97à¸\99าà¸\97ีà¹\88à¸\97ำà¹\83หà¹\89à¸\81ารà¹\80à¸\95ืà¸à¸\99ข้อความใหม่ปรากฏ',
+'right-bot' => 'กำหนดเป็นกระบวนการอัตโนมัติ',
+'right-nominornewtalk' => 'à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89à¸à¸¢à¹\83à¸\99หà¸\99à¹\89าà¸à¸ ิà¸\9bรายà¸\97ีà¹\88à¸\97ำà¹\83หà¹\89à¸\81ารà¹\81à¸\88à¹\89à¸\87ข้อความใหม่ปรากฏ',
'right-apihighlimits' => 'ใช้ข้อจำกัดที่สูงขึ้นในคำสั่งเอพีไอ',
'right-writeapi' => 'ใช้การเขียนเอพีไอ',
'right-delete' => 'ลบหน้า',
'right-bigdelete' => 'ลบหน้าที่มีประวัติขนาดใหญ่',
-'right-deletelogentry' => 'ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รายà¸\81ารปูมที่เจาะจง',
-'right-deleterevision' => 'ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\97ีà¹\88à¹\80à¸\88าะà¸\88à¸\87à¸\82à¸à¸\87หà¸\99à¹\89าà¸\95à¹\88าà¸\87 à¹\86',
-'right-deletedhistory' => 'à¸\94ูรายà¸\81ารประวัติที่ถูกลบ โดยไม่มีข้อความที่เกี่ยวข้อง',
-'right-deletedtext' => 'à¹\80รียà¸\81à¸\94ูà¸\82à¹\89à¸à¸\84วามà¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\81ละà¸\84วามเปลี่ยนแปลงระหว่างรุ่นที่ถูกลบ',
+'right-deletelogentry' => 'ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99หà¸\99à¹\88วยปูมที่เจาะจง',
+'right-deleterevision' => 'ลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\88ำà¹\80à¸\9eาะà¸\82à¸à¸\87หà¸\99à¹\89า',
+'right-deletedhistory' => 'à¸\94ูหà¸\99à¹\88วยประวัติที่ถูกลบ โดยไม่มีข้อความที่เกี่ยวข้อง',
+'right-deletedtext' => 'à¸\94ูà¸\82à¹\89à¸à¸\84วามà¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\81ละà¸\81ารเปลี่ยนแปลงระหว่างรุ่นที่ถูกลบ',
'right-browsearchive' => 'ค้นหาหน้าที่ถูกลบ',
-'right-undelete' => 'à¹\80รียà¸\81คืนหน้า',
+'right-undelete' => 'à¸\81ูà¹\89คืนหน้า',
'right-suppressrevision' => 'ดูและกู้คืนรุ่นที่ซ่อนจากผู้ดูแลระบบ',
'right-suppressionlog' => 'ดูปูมส่วนตัว',
-'right-block' => 'à¸\9aลà¹\87à¸à¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸à¸·à¹\88à¸\99มิà¹\83หà¹\89แก้ไข',
-'right-blockemail' => 'à¸\9aลà¹\87à¸à¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89มิà¹\83ห้ส่งอีเมล',
-'right-hideuser' => 'à¸\9aลà¹\87à¸à¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\81ละà¸\8bà¹\88à¸à¸\99à¹\84มà¹\88à¹\83หà¹\89à¸\9cูà¹\89à¸à¸·à¹\88à¸\99เห็น',
-'right-ipblock-exempt' => 'à¸\9cà¹\88าà¸\99à¸\81ารà¸\9aลà¹\87à¸à¸\81หมายà¹\80ลà¸\82à¹\84à¸à¸\9eี à¸\9aลà¹\87à¸à¸\81à¹\81à¸\9aà¸\9aà¸à¸±à¸\95à¹\82à¸\99มัà¸\95ิ à¹\81ละà¸\9aลà¹\87à¸à¸\81à¹\80à¸\9bà¹\87à¸\99ช่วง',
-'right-proxyunbannable' => 'à¸\9cà¹\88าà¸\99à¸\81ารà¸\9aลà¹\87à¸à¸\81à¹\81à¸\9aà¸\9aอัตโนมัติของพร็อกซี',
-'right-unblockself' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารบล็อกตนเอง',
+'right-block' => 'à¸\9aลà¹\87à¸à¸\81มิà¹\83หà¹\89à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸à¸·à¹\88à¸\99แก้ไข',
+'right-blockemail' => 'à¸\9aลà¹\87à¸à¸\81มิà¹\83หà¹\89à¸\9cูà¹\89à¹\83à¸\8a้ส่งอีเมล',
+'right-hideuser' => 'à¸\9aลà¹\87à¸à¸\81à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89 à¸\8bà¹\88à¸à¸\99à¹\84มà¹\88à¹\83หà¹\89สาà¸\98ารà¸\93ะเห็น',
+'right-ipblock-exempt' => 'à¸à¹\89à¸à¸¡à¸\81ารà¸\9aลà¹\87à¸à¸\81à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eี à¸\9aลà¹\87à¸à¸\81à¸à¸±à¸\95à¹\82à¸\99มัà¸\95ิ à¹\81ละà¸\9aลà¹\87à¸à¸\81ช่วง',
+'right-proxyunbannable' => 'à¹\80ลีà¹\88ยà¸\87à¸\81ารà¸\9aลà¹\87à¸à¸\81อัตโนมัติของพร็อกซี',
+'right-unblockself' => 'à¸\9bลà¸\94บล็อกตนเอง',
'right-protect' => 'เปลี่ยนระดับการล็อกและแก้ไขหน้าที่ถูกล็อก',
-'right-editprotected' => 'à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87à¸à¸\81 (ที่ไม่ล็อกแบบสืบทอด)',
-'right-editinterface' => 'à¹\81à¸\81à¹\89à¹\84à¸\82à¸à¸´à¸\99à¹\80à¸\95à¸à¸£à¹\8cà¹\80à¸\9fà¸\8bà¸\82à¸à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89',
-'right-editusercssjs' => 'แก้ไข CSS และ JS ของผู้ใช้คนอื่น',
-'right-editusercss' => 'แก้ไข CSS ของผู้ใช้คนอื่น',
-'right-edituserjs' => 'แก้ไข JS ของผู้ใช้คนอื่น',
-'right-rollback' => 'ยà¹\89à¸à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ลà¹\88าสุà¸\94à¸\97ีà¹\88à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¹\82à¸\94ยà¹\80à¸\89à¸\9eาะà¸à¸¢à¹\88าà¸\87รวà¸\94à¹\80รà¹\87ว',
+'right-editprotected' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87à¸à¸\81à¹\80à¸\95à¹\87มà¸\97ีà¹\88 (ที่ไม่ล็อกแบบสืบทอด)',
+'right-editinterface' => 'แก้ไขอินเตอร์เฟซผู้ใช้',
+'right-editusercssjs' => 'แก้ไขไฟล์ CSS และจาวาสคริปต์ของผู้ใช้อื่น',
+'right-editusercss' => 'แก้ไขไฟล์ CSS ของผู้ใช้อื่น',
+'right-edituserjs' => 'แก้ไขไฟล์จาวาสคริปต์ของผู้ใช้อื่น',
+'right-rollback' => 'ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว',
'right-markbotedits' => 'ทำเครื่องหมายการย้อนว่าเป็นการแก้ไขโดยบอต',
-'right-noratelimit' => 'à¹\84มà¹\88มีà¸\9cลà¸\81ระà¸\97à¸\9aà¸\88าà¸\81à¸\81ารà¸\88ำà¸\81ัà¸\94สิà¸\97à¸\98ิà¸\95ามà¹\80วลา',
+'right-noratelimit' => 'à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\9cลà¸\81ระà¸\97à¸\9aà¸\88าà¸\81à¸\82ีà¸\94à¸\88ำà¸\81ัà¸\94à¸à¸±à¸\95รา',
'right-import' => 'นำเข้าหน้าจากวิกิอื่น',
'right-importupload' => 'นำเข้าหน้าจากไฟล์ที่อัปโหลด',
'right-patrol' => 'ทำเครื่องหมายการแก้ไขของผู้อื่นว่าตรวจสอบแล้ว',
-'right-autopatrol' => 'à¸\95ัà¹\89à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\95à¸\99à¹\80à¸à¸\87วà¹\88าตรวจสอบแล้วอัตโนมัติ',
+'right-autopatrol' => 'à¹\83หà¹\89à¸\97ำà¹\80à¸\84รืà¹\88à¸à¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\95à¸\99à¹\80à¸à¸\87à¹\80à¸\9bà¹\87à¸\99ตรวจสอบแล้วอัตโนมัติ',
'right-patrolmarks' => 'ดูการเปลี่ยนแปลงล่าสุดของการทำเครื่องหมายตรวจสอบ',
'right-unwatchedpages' => 'ดูรายการหน้าที่ไม่มีผู้เฝ้าดู',
-'right-mergehistory' => 'รวมà¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89า',
+'right-mergehistory' => 'รวมประวัติหน้า',
'right-userrights' => 'แก้ไขสิทธิผู้ใช้ทั้งหมด',
'right-userrights-interwiki' => 'แก้ไขสิทธิผู้ใช้ของผู้ใช้บนวิกิอื่น',
'right-siteadmin' => 'ล็อกและปลดล็อกฐานข้อมูล',
'right-passwordreset' => 'ดูอีเมลตั้งรหัสผ่านใหม่',
# Special:Log/newusers
-'newuserlogpage' => 'à¸\9bูมà¸\81ารสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
-'newuserlogpagetext' => 'à¸\99ีà¹\88à¸\84ืà¸à¸\9bูมà¸\81ารสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
+'newuserlogpage' => 'ปูมการสร้างผู้ใช้',
+'newuserlogpagetext' => 'นี่คือปูมการสร้างผู้ใช้',
# User rights log
'rightslog' => 'ปูมสิทธิผู้ใช้',
'action-createpage' => 'สร้างหน้า',
'action-createtalk' => 'สร้างหน้าอภิปราย',
'action-createaccount' => 'สร้างบัญชีผู้ใช้นี้',
-'action-minoredit' => 'เป็นการแก้ไขเล็กน้อย',
+'action-minoredit' => 'à¸\97ำà¹\80à¸\84รืà¹\88à¸à¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89à¸à¸¢',
'action-move' => 'ย้ายหน้านี้',
'action-move-subpages' => 'ย้ายหน้านี้ รวมทั้งหน้าย่อย',
'action-move-rootuserpages' => 'ย้ายหน้าผู้ใช้หลัก',
'action-deletedhistory' => 'ดูประวัติที่ถูกลบของหน้านี้',
'action-browsearchive' => 'ค้นหาหน้าที่ถูกลบ',
'action-undelete' => 'กู้คืนหน้านี้',
-'action-suppressrevision' => 'à¸\95รวà¸\88à¸\94ูและกู้คืนรุ่นที่ซ่อนอยู่นี้',
-'action-suppressionlog' => 'ดูปูมส่วนตัว',
+'action-suppressrevision' => 'à¸\97à¸\9aà¸\97วà¸\99และกู้คืนรุ่นที่ซ่อนอยู่นี้',
+'action-suppressionlog' => 'ดูปูมส่วนตัวนี้',
'action-block' => 'บล็อกผู้ใช้รายนี้มิให้แก้ไข',
'action-protect' => 'เปลี่ยนระดับการล็อกสำหรับหน้านี้',
+'action-rollback' => 'ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว',
'action-import' => 'นำเข้าหน้านี้จากวิกิอื่น',
-'action-importupload' => 'à¸\99ำà¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89à¸\88าà¸\81à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸à¸±à¸\9bà¹\82หลà¸\94à¹\81ลà¹\89ว',
-'action-patrol' => 'ทำเครื่องหมายการแก้ไขของผู้ใช้อื่นว่าตรวจแล้ว',
-'action-autopatrol' => 'ทำเครื่องหมายการแก้ไขของคุณว่าตรวจแล้ว',
+'action-importupload' => 'à¸\99ำà¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89à¸\88าà¸\81à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8c',
+'action-patrol' => 'à¸\97ำà¹\80à¸\84รืà¹\88à¸à¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸à¸·à¹\88à¸\99วà¹\88าà¸\95รวà¸\88สà¸à¸\9aà¹\81ลà¹\89ว',
+'action-autopatrol' => 'à¸\97ำà¹\80à¸\84รืà¹\88à¸à¸\87หมายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\84ุà¸\93วà¹\88าà¸\95รวà¸\88สà¸à¸\9aà¹\81ลà¹\89ว',
'action-unwatchedpages' => 'ดูรายการหน้าที่ไม่มีผู้เฝ้าดู',
'action-mergehistory' => 'รวมประวัติหน้านี้',
'action-userrights' => 'แก้ไขสิทธิผู้ใช้ทั้งหมด',
-'action-userrights-interwiki' => 'à¹\81à¸\81à¹\89à¹\84à¸\82สิà¸\97à¸\98ิà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9aวิà¸\81ิà¸\99ีà¹\89',
+'action-userrights-interwiki' => 'à¹\81à¸\81à¹\89à¹\84à¸\82สิà¸\97à¸\98ิà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82à¸à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9aà¸\99วิà¸\81ิà¸à¸·à¹\88à¸\99',
'action-siteadmin' => 'ล็อกหรือปลดล็อกฐานข้อมูล',
'action-sendemail' => 'ส่งอีเมล',
'nchanges' => '$1 การแก้ไข',
'recentchanges' => 'ปรับปรุงล่าสุด',
'recentchanges-legend' => 'ตัวเลือกปรับปรุงล่าสุด',
-'recentchanges-summary' => 'à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารลà¹\88าสุà¸\94à¸\97ีà¹\88มีà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87',
-'recentchanges-feed-description' => 'à¸\9fีà¸\94à¸\99ีà¹\89à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94',
-'recentchanges-label-newpage' => 'à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\81ารสรà¹\89าà¸\87หà¸\99à¹\89าà¹\83หมà¹\88',
+'recentchanges-summary' => 'à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89',
+'recentchanges-feed-description' => 'à¸\95ิà¸\94à¸\95ามà¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94à¹\83à¸\99วิà¸\81ิà¸\99ีà¹\89à¹\83à¸\99à¸\9fีà¸\94à¸\99ีà¹\89',
+'recentchanges-label-newpage' => 'การแก้ไขนี้สร้างหน้าใหม่',
'recentchanges-label-minor' => 'เป็นการแก้ไขเล็กน้อย',
'recentchanges-label-bot' => 'การแก้ไขนี้กระทำโดยบอต',
'recentchanges-label-unpatrolled' => 'การแก้ไขนี้ยังไม่ได้ตรวจสอบ',
'rcnote' => "รายการด้านล่างคือการแก้ไข {{PLURAL:$1|'''1''' รายการ|ล่าสุด '''$1''' รายการ}} ในช่วง '''$2''' วันที่ผ่านมา จนถึง $5, $4",
-'rcnotefrom' => "à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88 '''$2''' (à¹\81สà¸\94à¸\87 '''$1''' รายการ)",
-'rclistfrom' => 'แสดงการเปลี่ยนแปลงตั้งแต่ $1',
+'rcnotefrom' => "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88 '''$2''' (มาà¸\81สุà¸\94 '''$1''' รายการ)",
+'rclistfrom' => 'à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83หมà¹\88à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88 $1',
'rcshowhideminor' => '$1การแก้ไขเล็กน้อย',
'rcshowhidebots' => '$1บอต',
'rcshowhideliu' => '$1ผู้ใช้ล็อกอิน',
'rc_categories_any' => 'ใด ๆ',
'rc-change-size-new' => '$1 ไบต์หลังปรับปรุง',
'newsectionsummary' => '/* $1 */ หัวข้อใหม่',
-'rc-enhanced-expand' => 'à¹\81สà¸\94à¸\87รายละà¹\80à¸à¸µà¸¢à¸\94 (à¸\95à¹\89à¸à¸\87à¹\83à¸\8aà¹\89à¸\88าวาสà¸\84ริà¸\9bà¸\95à¹\8c)',
+'rc-enhanced-expand' => 'แสดงรายละเอียด (จาวาสคริปต์)',
'rc-enhanced-hide' => 'ซ่อนรายละเอียด',
'rc-old-title' => 'เดิมถูกสร้างในชื่อ "$1"',
'recentchangeslinked-toolbox' => 'การปรับปรุงที่เกี่ยวโยง',
'recentchangeslinked-title' => 'การปรับปรุงที่โยงมายัง "$1"',
'recentchangeslinked-noresult' => 'ไม่มีการเปลี่ยนแปลงในหน้าที่ถูกโยงไป ในช่วงเวลาที่กำหนด',
-'recentchangeslinked-summary' => "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายการปรับปรุงล่าสุดของหน้าที่ถูกโยงไป (หรือไปยังหน้าต่าง ๆ ของหมวดหมู่ที่กำหนด) โดยหน้าที่อยู่ใน[[Special:Watchlist|รายการเฝ้าดู]]แสดงเป็น'''ตัวหนา'''",
+'recentchangeslinked-summary' => "หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99รายการปรับปรุงล่าสุดของหน้าที่ถูกโยงไป (หรือไปยังหน้าต่าง ๆ ของหมวดหมู่ที่กำหนด) โดยหน้าที่อยู่ใน[[Special:Watchlist|รายการเฝ้าดู]]แสดงเป็น'''ตัวหนา'''",
'recentchangeslinked-page' => 'ชื่อหน้า:',
'recentchangeslinked-to' => 'แสดงการเปลี่ยนแปลงที่เชื่อมโยงมายังหน้านี้แทน',
'upload' => 'อัปโหลดไฟล์',
'uploadbtn' => 'อัปโหลดไฟล์',
'reuploaddesc' => 'ยกเลิกการอัปโหลดและกลับไปยังแบบอัปโหลด',
-'upload-tryagain' => 'สà¹\88à¸\87à¸\84ำà¸à¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\9bรัà¸\9aà¹\81à¸\95à¹\88à¸\87แล้ว',
+'upload-tryagain' => 'สà¹\88à¸\87à¸\84ำà¸à¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\94ัà¸\94à¹\81à¸\9bรแล้ว',
'uploadnologin' => 'ไม่ได้ล็อกอิน',
'uploadnologintext' => 'ต้อง[[Special:UserLogin|ล็อกอิน]]ก่อนจึงจะอัปโหลดไฟล์ได้',
'upload_directory_missing' => 'ไดเรกทอรีสำหรับอัปโหลด ($1) หายไป และเว็บเซิร์ฟเวอร์ไม่สามารถสร้างได้',
-'upload_directory_read_only' => 'à¹\84มà¹\88สามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\83à¸\99à¹\84à¸\94à¹\80รà¸\81à¸\97à¸à¸£à¸µ ($1) à¸\9bัà¸\8dหาà¹\80à¸\81ิà¸\94à¸\97ีà¹\88à¹\80วà¹\87à¸\9aà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วà¸à¸£à¹\8c',
-'uploaderror' => 'à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\80à¸\81ิà¸\94à¸\82à¹\89à¸à¸\9cิà¸\94à¸\9eลาà¸\94',
+'upload_directory_read_only' => 'à¹\80วà¹\87à¸\9aà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วà¸à¸£à¹\8cà¹\84มà¹\88สามารà¸\96à¹\80à¸\81à¹\87à¸\9aà¸\82à¹\89à¸à¸¡à¸¹à¸¥à¹\83à¸\99à¹\84à¸\94à¹\80รà¸\81à¸\97à¸à¸£à¸µ ($1)',
+'uploaderror' => 'การอัปโหลดผิดพลาด',
'upload-recreate-warning' => "'''คำเตือน: ไฟล์ชื่อนั้นถูกลบหรือเปลี่ยนชื่อแล้ว'''
ปูมการลบและปูมการย้ายของหน้านี้ถูกนำมาไว้ด้านล่างเพื่อความสะดวก:",
'uploadtext' => "กรุณาใช้แบบด้านล่างในการอัปโหลดไฟล์
-สำหรัà¸\9aà¸\81ารà¸\94ูหรืà¸à¸\81ารà¸\84à¹\89à¸\99หาà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\80à¸\84ยà¸à¸±à¸\9bà¹\82หลà¸\94à¸\81à¹\88à¸à¸\99หà¸\99à¹\89าà¸\99ีà¹\89 à¹\83หà¹\89à¹\84à¸\9bà¸\97ีà¹\88[[Special:FileList|รายà¸\8aืà¹\88à¸ไฟล์ที่ถูกอัปโหลด]] การอัปโหลดและการอัปโหลดซ้ำดูได้ที่[[Special:Log/upload|ปูมการอัปโหลด]] และการลบไฟล์ดูได้ที่[[Special:Log/delete|ปูมการลบ]]
+สำหรัà¸\9aà¸\81ารà¸\94ูหรืà¸à¸\81ารà¸\84à¹\89à¸\99หาà¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\80à¸\84ยà¸à¸±à¸\9bà¹\82หลà¸\94à¸\81à¹\88à¸à¸\99หà¸\99à¹\89าà¸\99ีà¹\89 à¹\83หà¹\89à¹\84à¸\9bà¸\97ีà¹\88[[Special:FileList|รายà¸\81ารไฟล์ที่ถูกอัปโหลด]] การอัปโหลดและการอัปโหลดซ้ำดูได้ที่[[Special:Log/upload|ปูมการอัปโหลด]] และการลบไฟล์ดูได้ที่[[Special:Log/delete|ปูมการลบ]]
ถ้าต้องการแทรกไฟล์ลงในหน้าหนึ่ง ๆ ให้ใช้คำสั่งหนึ่งในรูปแบบต่อไปนี้
* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' เพื่อใช้รูปขนาดเต็ม
* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|ข้อความอธิบาย]]</nowiki></code>''' เพื่อใช้รูปย่อขนาดกว้าง 200 พิกเซลในกล่องที่จัดชิดซ้าย โดยมี \"ข้อความอธิบาย\" เป็นคำบรรยายใต้ภาพ
* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' สำหรับการเชื่อมโยงไฟล์โดยตรง โดยไม่ปรากฏไฟล์นั้นออกมา",
-'upload-permitted' => 'à¸\8aà¸\99ิà¸\94à¸\82à¸à¸\87à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸à¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89: $1',
-'upload-preferred' => 'à¸\8aà¸\99ิà¸\94à¸\82à¸à¸\87à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84วรà¹\83à¸\8aà¹\89: $1',
-'upload-prohibited' => 'à¸\8aà¸\99ิà¸\94à¸\82à¸à¸\87à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\84มà¹\88à¸à¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89: $1',
+'upload-permitted' => 'à¸\8aà¸\99ิà¸\94à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸à¸\99ุà¸\8dาà¸\95: $1',
+'upload-preferred' => 'ชนิดไฟล์ที่ควรใช้: $1',
+'upload-prohibited' => 'à¸\8aà¸\99ิà¸\94à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\84มà¹\88à¸à¸\99ุà¸\8dาà¸\95: $1',
'uploadlog' => 'ปูมการอัปโหลด',
'uploadlogpage' => 'ปูมการอัปโหลด',
-'uploadlogpagetext' => 'รายการแสดงไฟล์ที่อัปโหลดล่าสุด',
+'uploadlogpagetext' => 'ด้านล่างเป็นรายการการอัปโหลดไฟล์ล่าสุด
+ดูภาพรวมที่ [[Special:NewFiles|แกลอรีไฟล์ใหม่]]',
'filename' => 'ชื่อไฟล์',
'filedesc' => 'รายละเอียดไฟล์',
'fileuploadsummary' => 'รายละเอียดไฟล์:',
-'filereuploadsummary' => 'à¹\84à¸\9fลà¹\8cà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87:',
+'filereuploadsummary' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\84à¸\9fลà¹\8c:',
'filestatus' => 'สถานะลิขสิทธิ์:',
'filesource' => 'แหล่งที่มา:',
'uploadedfiles' => 'ไฟล์ที่อัปโหลดแล้ว',
'ignorewarning' => 'บันทึกไฟล์โดยละเลยคำเตือน',
-'ignorewarnings' => 'à¹\84มà¹\88à¹\81สà¸\94à¸\87à¸\84ำà¹\80à¸\95ืà¸à¸\99',
+'ignorewarnings' => 'ละà¹\80ลยà¸\84ำà¹\80à¸\95ืà¸à¸\99à¸\97ัà¹\89à¸\87หมà¸\94',
'minlength1' => 'ชื่อไฟล์ต้องมีตัวอักษรอย่างน้อยหนึ่งตัว',
-'illegalfilename' => 'à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8c "$1" มีà¸\95ัวà¸à¸±à¸\81ษรà¸\97ีà¹\88à¹\84มà¹\88à¸à¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¸\9bราà¸\81à¸\8fà¹\83à¸\99à¸\8aืà¹\88ภà¸\81รุà¸\93าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¹\81ละอัปโหลดอีกครั้ง',
+'illegalfilename' => 'à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8c "$1" มีà¸à¸±à¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88à¸à¸\99ุà¸\8dาà¸\95à¹\83à¸\99à¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87หà¸\99à¹\89า à¸\81รุà¸\93าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¹\81ละลà¸à¸\87อัปโหลดอีกครั้ง',
'filename-toolong' => 'ชื่อไฟล์ไม่อาจยาวกว่า 240 ไบต์',
'badfilename' => 'ชื่อไฟล์ถูกเปลี่ยนเป็น "$1"',
-'filetype-mime-mismatch' => 'นามสกุลไฟล์ ".$1" ไม่ตรงกับชนิด MIME ของแฟ้มที่ตรวจพบ ($2)',
+'filetype-mime-mismatch' => 'นามสกุลไฟล์ ".$1" ไม่ตรงกับชนิดไมม์ของไฟล์ที่ตรวจพบ ($2)',
'filetype-badmime' => 'ไม่อนุญาตให้อัปโหลดไฟล์ที่เป็นไมม์ชนิด "$1"',
-'filetype-bad-ie-mime' => 'ไม่สามารถอัปโหลดไฟล์นี้เนื่องจาก Internet Explorer จะตรวจจับว่าเป็น "$1" ซึ่งเป็นชนิดไฟล์ที่ไม่อนุญาตและอาจเป็นอันตราย',
+'filetype-bad-ie-mime' => 'ไม่สามารถอัปโหลดไฟล์นี้เนื่องจากอินเทอร์เน็ตเอกซ์พลอเรอร์จะตรวจจับว่าเป็น "$1" ซึ่งเป็นชนิดไฟล์ที่ไม่อนุญาตและอาจเป็นอันตราย',
'filetype-unwanted-type' => "{{PLURAL:\$3|ไฟล์|ไฟล์}}ชนิด '''\".\$1\"''' เป็นไฟล์ที่ไม่สามารถอัปโหลดได้ ไฟล์ที่สามารถใช้ได้ ได้แก่ \$2",
'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL: $4|เป็นชนิดไฟล์ที่ไม่อนุญาต|เป็นชนิดไฟล์ที่ไม่อนุญาต}}
-{{PLURAL: $3|ชนิดไฟล์|ชนิดไฟล์}}ที่อนุญาตคือ $2',
+{{PLURAL:$3|ชนิดไฟล์|ชนิดไฟล์}}ที่อนุญาตคือ $2',
'filetype-missing' => 'นามสกุลไฟล์หายไป (เช่น ".jpg")',
-'empty-file' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93สà¹\88à¸\87มาà¸\99ัà¹\89à¸\99à¹\84มà¹\88มีà¸\82à¹\89à¸à¸¡à¸¹à¸¥',
+'empty-file' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93สà¹\88à¸\87มาà¸\99ัà¹\89à¸\99วà¹\88าà¸\87',
'file-too-large' => 'ไฟล์ที่คุณส่งมามีขนาดใหญ่เกินไป',
'filename-tooshort' => 'ชื่อไฟล์สั้นเกินไป',
-'filetype-banned' => 'à¹\84à¸\9fลà¹\8cà¸\9bระà¹\80ภà¸\97นี้ถูกห้าม',
+'filetype-banned' => 'à¹\84à¸\9fลà¹\8cà¸\8aà¸\99ิà¸\94นี้ถูกห้าม',
'verification-error' => 'ไฟล์นี้ไม่ผ่านการพิสูจน์ยืนยันไฟล์',
'hookaborted' => 'สิ่งที่คุณพยายามปรับเปลี่ยนถูกยกเลิกโดยส่วนขยาย',
'illegal-filename' => 'ชื่อไฟล์นี้ไม่ได้รับอนุญาต',
'unknown-error' => 'เกิดข้อผิดพลาดไม่ทราบสาเหตุ',
'tmp-create-error' => 'ไม่สามารถสร้างไฟล์ชั่วคราว',
'tmp-write-error' => 'เกิดข้อผิดพลาดในการเขียนไฟล์ชั่วคราว',
-'large-file' => 'ไฟล์ไม่ควรมีขนาดใหญ่กว่า $1 ไฟล์นี้มีขนาด $2',
-'largefileserver' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88าà¸\84à¹\88าà¸\97ีà¹\88à¸à¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89',
-'emptyfile' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸à¸±à¸\9bà¹\82หลà¸\94มาà¹\80หมืà¸à¸\99à¹\84à¸\9fลà¹\8cวà¹\88าà¸\87 à¸à¸²à¸\88à¹\80à¸\81ิà¸\94à¸\88าà¸\81à¸\9bัà¸\8dหาà¸\9eิมà¸\9eà¹\8cà¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¸\9cิà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สà¸à¸\9aà¹\84à¸\9fลà¹\8cà¸à¸µà¸\81à¸\84รัà¹\89à¸\87 à¹\81ละà¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\95à¹\89à¸à¸\87à¸\81ารà¸\97ีà¹\88à¸\88ะà¸à¸±à¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89',
-'windows-nonascii-filename' => 'วิà¸\81ิà¸\99ีà¹\89à¹\84มà¹\88รà¸à¸\87รัà¸\9aà¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีà¸\95ัวà¸à¸±à¸\81ษรพิเศษ',
+'large-file' => 'à¹\81à¸\99ะà¸\99ำวà¹\88าà¹\84à¸\9fลà¹\8cà¹\84มà¹\88à¸\84วรมีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88า $1 à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¸\99าà¸\94 $2',
+'largefileserver' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88าà¸\97ีà¹\88à¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วà¸à¸£à¹\8cà¸à¸\99ุà¸\8dาà¸\95',
+'emptyfile' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93à¸à¸±à¸\9bà¹\82หลà¸\94à¹\80หมืà¸à¸\99à¹\80à¸\9bà¹\87à¸\99à¹\84à¸\9fลà¹\8cวà¹\88าà¸\87 à¸à¸²à¸\88à¹\80à¸\81ิà¸\94à¸\88าà¸\81à¸\9bัà¸\8dหาà¸\9eิมà¸\9eà¹\8cà¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¸\9cิà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สà¸à¸\9aวà¹\88า à¸\84ุà¸\93à¸\95à¹\89à¸à¸\87à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\88ริà¸\87 à¹\86',
+'windows-nonascii-filename' => 'วิà¸\81ิà¸\99ีà¹\89à¹\84มà¹\88รà¸à¸\87รัà¸\9aà¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88มีà¸à¸±à¸\81à¸\82ระพิเศษ',
'fileexists' => 'มีไฟล์ชื่อนี้อยู่แล้ว กรุณาตรวจสอบ <strong>[[:$1]]</strong> หากคุณไม่แน่ใจว่าต้องการเปลี่ยนแปลงไฟล์นี้หรือไม่ [[$1|thumb]]',
-'filepageexists' => 'หà¸\99à¹\89าà¸\84ำà¸à¸\98ิà¸\9aายสำหรัà¸\9aà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81สรà¹\89าà¸\87à¹\84วà¹\89à¹\81ลà¹\89วà¸\97ีà¹\88 <strong>[[:$1]]</strong> à¹\81à¸\95à¹\88à¹\84à¸\9fลà¹\8cà¸\8aืà¹\88à¸à¸\99ีà¹\89à¹\84มà¹\88มีà¸à¸¢à¸¹à¹\88à¹\83à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99
-สาระสำà¸\84ัà¸\8dà¸\97ีà¹\88à¸\84ุà¸\93à¸\9aัà¸\99à¸\97ึกจะไม่ปรากฏบนหน้าคำอธิบาย
-à¹\80à¸\9eืà¹\88à¸à¹\83หà¹\89สาระสำà¸\84ัà¸\8dปรากฏขึ้น คุณจำเป็นต้องแก้ไขด้วยตนเอง
+'filepageexists' => 'หน้าคำอธิบายสำหรับไฟล์นี้ได้ถูกสร้างแล้วที่ <strong>[[:$1]]</strong> แต่ไฟล์ชื่อนี้ไม่มีอยู่ในปัจจุบัน
+à¸\84ำà¸à¸\98ิà¸\9aายà¸à¸¢à¹\88าà¸\87ยà¹\88à¸à¸\97ีà¹\88à¸\84ุà¸\93à¸\81รà¸กจะไม่ปรากฏบนหน้าคำอธิบาย
+à¹\80à¸\9eืà¹\88à¸à¹\83หà¹\89à¸\84ำà¸à¸\98ิà¸\9aายà¸à¸¢à¹\88าà¸\87ยà¹\88à¸ปรากฏขึ้น คุณจำเป็นต้องแก้ไขด้วยตนเอง
[[$1|thumb]]',
-'fileexists-extension' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\82หลà¸\94มีà¸\8aืà¹\88à¸à¹\83à¸\81ลà¹\89à¹\80à¸\84ียà¸\87: [[$2|thumb]]
+'fileexists-extension' => 'มีà¹\84à¸\9fลà¹\8cà¸\8aืà¹\88à¸à¸\84ลà¹\89ายà¸\81ัà¸\99: [[$2|thumb]]
* ชื่อไฟล์ที่กำลังอัปโหลด: <strong>[[:$1]]</strong>
-* ชื่อไฟล์ที่มีอยู่แล้ว: <strong>[[:$2]]</strong>
-à¸\81รุà¸\93าà¹\80ลืà¸à¸\81à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¹\83หมà¹\88',
-'fileexists-thumbnail-yes' => "ไฟล์นี้ดูเหมือนจะเป็นภาพที่ถูกลดขนาดมา ''(รูปย่อ)''
+* ชื่อไฟล์ที่มีอยู่: <strong>[[:$2]]</strong>
+à¸\81รุà¸\93าà¹\80ลืà¸à¸\81à¸\8aืà¹\88à¸à¸à¸·à¹\88à¸\99',
+'fileexists-thumbnail-yes' => "ไฟล์นี้ดูเหมือนจะเป็นภาพที่ถูกลดขนาด ''(รูปย่อ)''
[[$1|thumb]]
กรุณาตรวจสอบไฟล์ <strong>[[:$1]]</strong>
-à¸\96à¹\89าà¸\95รวà¸\88สà¸à¸\9aà¹\81ลà¹\89วà¹\81ละà¸\9eà¸\9aวà¹\88าà¹\80à¸\9bà¹\87à¸\99ภาà¸\9eà¹\80à¸\94ียวà¸\81ัà¸\99à¸\81ัà¸\9aภาà¸\9eต้นฉบับ ไฟล์นั้นไม่จำเป็นต้องอัปโหลดเพิ่ม",
+à¸\96à¹\89าà¸\95รวà¸\88สà¸à¸\9aà¹\81ลà¹\89วà¹\81ละà¸\9eà¸\9aวà¹\88าà¹\80à¸\9bà¹\87à¸\99ภาà¸\9eà¸\82à¸\99าà¸\94à¹\80à¸\94ียวà¸\81ัà¸\9aต้นฉบับ ไฟล์นั้นไม่จำเป็นต้องอัปโหลดเพิ่ม",
'file-thumbnail-no' => "ชื่อไฟล์ขึ้นต้นด้วย <strong>$1</strong>
-ภาพนี้ดูเหมือนว่าจะเป็นภาพที่ถูกลดขนาดมา ''(thumbnail)''
-ถ้าคุณมีไฟล์ต้นฉบับขนาดใหญ่กว่านี้ กรุณาอัปโหลดไฟล์ต้นฉบับ หรือเปลี่ยนชื่อไฟล์ด้วย",
-'fileexists-forbidden' => 'ไฟล์ชื่อนี้มีอยู่แล้วในระบบ และไม่สามารถอัปโหลดทับได้
-หากคุณยังคงต้องการอัปโหลดไฟล์ของคุณ กรุณาย้อนกลับและใช้ชื่อใหม่ [[ไฟล์:$1|thumb|center|$1]]',
+ภาพนี้ดูเหมือนว่าจะเป็นภาพที่ถูกลดขนาด ''(thumbnail)''
+ถ้าคุณมีภาพนี้ในความละเอียดเต็ม ให้อัปโหลดภาพนี้ มิฉะนั้นแล้วโปรดเปลี่ยนชื่อไฟล์",
+'fileexists-forbidden' => 'มีไฟล์ชื่อนี้แล้ว และไม่สามารถเขียนทับได้
+หากคุณยังต้องการอัปโหลดไฟล์ของคุณ กรุณาย้อนกลับและใช้ชื่อใหม่
+[[ไฟล์:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'ไฟล์ที่ใช้ชื่อนี้มีอยู่แล้วในระบบเก็บไฟล์ในส่วนกลาง
ถ้าคุณยังคงต้องการอัปโหลดไฟล์ของคุณ กรุณาย้อนกลับไปตั้งชื่อใหม่
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'ไฟล์นี้ซ้ำกับ{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้:',
-'file-deleted-duplicate' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\95รà¸\87à¸\81ัà¸\9aà¸\8aืà¹\88à¸à¸\99ีà¹\89 ([[:$1]]) à¹\80à¸\84ยà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¸\81à¹\88à¸à¸\99หà¸\99à¹\89า
+'file-deleted-duplicate' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\80หมืà¸à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89 ([[:$1]]) à¹\80à¸\84ยà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¸\81à¹\88à¸à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\81ลà¹\89ว
คุณควรตรวจสอบว่าประวัติการลบของไฟล์ก่อนดำเนินการอัปโหลดใหม่',
'uploadwarning' => 'คำเตือนการอัปโหลด',
'uploadwarning-text' => 'กรุณาแก้ไขคำอธิบายไฟล์ด้านล่างนี้ แล้วลองใหม่อีกครั้ง',
'savefile' => 'บันทึกไฟล์',
'uploadedimage' => 'อัปโหลด "[[$1]]"',
'overwroteimage' => 'อัปโหลดรุ่นใหม่ของ "[[$1]]"',
-'uploaddisabled' => 'à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99อัปโหลด',
-'copyuploaddisabled' => 'à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\82à¸\94ย URL à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84วà¹\89',
-'uploadfromurl-queued' => 'à¸\81ารà¸à¸±à¸\9eà¹\82หลà¸\94à¸\82à¸à¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\88ัà¸\94à¹\83à¸\99คิวแล้ว',
-'uploaddisabledtext' => 'à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99',
-'php-uploaddisabledtext' => 'à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\83à¸\99 PHP
+'uploaddisabled' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารอัปโหลด',
+'copyuploaddisabled' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\82à¸\94ยยูà¸à¸²à¸£à¹\8cà¹\81à¸à¸¥',
+'uploadfromurl-queued' => 'à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¸\82à¸à¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\88ัà¸\94คิวแล้ว',
+'uploaddisabledtext' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8c',
+'php-uploaddisabledtext' => 'à¹\80à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8cà¹\83à¸\99à¸\9eีà¹\80à¸à¸\8aà¸\9eี
กรุณาตรวจสอบการตั้งค่า file_uploads',
'uploadscripted' => 'ไฟล์นี้มีส่วนประกอบของโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้เกิดความผิดพลาดในการแสดงผลของเว็บเบราว์เซอร์',
'uploadvirus' => 'ไฟล์นี้มีไวรัส! รายละเอียด: $1',
'upload-source' => 'ไฟล์ต้นทาง',
'sourcefilename' => 'ชื่อไฟล์ต้นทาง:',
-'sourceurl' => 'URL ที่มา:',
-'destfilename' => 'à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\95à¹\89à¸à¸\87à¸\81าร:',
+'sourceurl' => 'ยูอาร์แอลที่มา:',
+'destfilename' => 'à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¸\9bลายà¸\97าà¸\87:',
'upload-maxfilesize' => 'ขนาดไฟล์ที่ใหญ่ที่สุดที่อนุญาต: $1',
'upload-description' => 'คำอธิบายไฟล์',
'upload-options' => 'ตัวเลือกอัปโหลด',
'watchthisupload' => 'เฝ้าดูไฟล์นี้',
-'filewasdeleted' => 'à¹\84à¸\9fลà¹\8cà¹\83à¸\99à¸\8aืà¹\88à¸à¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸à¸±à¸\9bà¹\82หลà¸\94à¸\81à¹\88à¸à¸\99หà¸\99à¹\89าà¹\81ละà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¹\81ลà¹\89ว à¸\81รุà¸\93าà¸\95รวà¸\88สà¸à¸\9a $1 à¸\81à¹\88à¸à¸\99à¸\97ีà¹\88à¸\88ะà¸à¸±à¸\9bà¹\82หลà¸\94à¹\83หมà¹\88อีกครั้ง',
-'filename-bad-prefix' => "à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\88ะà¸à¸±à¸\9bà¹\82หลà¸\94à¹\80à¸\82à¹\89ามาà¸\99ีà¹\89มีà¸\8aืà¹\88à¸à¸\97ีà¹\88à¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วย '''\"\$1\"''' à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88à¸à¸\97ีà¹\88à¹\84มà¹\88สืà¹\88à¸à¸\84วามหมายà¹\83à¸\94 à¹\86 à¸\97ีà¹\88à¹\82à¸\94ยà¸\9bà¸\81à¸\95ิà¹\81ลà¹\89วà¸\8aืà¹\88à¸à¸\99ีà¹\89à¸\88ะà¸\96ูà¸\81à¸\95ัà¹\89à¸\87à¹\82à¸\94ยà¸\81ลà¹\89à¸à¸\87à¸\96à¹\88ายรูà¸\9bà¸\94ิà¸\88ิà¸\97ัลà¸à¸±à¸\95à¹\82à¸\99มัà¸\95ิ à¸\81รุà¸\93าà¸\95ัà¹\89à¸\87à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¹\83หมà¹\88à¸\97ีà¹\88สื่อความหมายกว่าเดิม",
+'filewasdeleted' => 'à¹\84à¸\9fลà¹\8cà¸\8aืà¹\88à¸à¸\99ีà¹\89à¸\96ูà¸\81à¸à¸±à¸\9bà¹\82หลà¸\94à¸\81à¹\88à¸à¸\99หà¸\99à¹\89าà¹\81ละà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¹\81ลà¹\89ว à¸\81รุà¸\93าà¸\95รวà¸\88สà¸à¸\9a $1 à¸\81à¹\88à¸à¸\99à¸à¸±à¸\9bà¹\82หลà¸\94อีกครั้ง',
+'filename-bad-prefix' => "à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¸à¸±à¸\9bà¹\82หลà¸\94à¸\82à¹\89à¸\99à¸\95à¹\89à¸\99à¸\94à¹\89วย '''\"\$1\"''' à¸\8bึà¹\88à¸\87à¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88à¸à¸\97ีà¹\88à¹\84มà¹\88สืà¹\88à¸à¸\84วามหมายà¹\83à¸\94 à¹\86 à¸\97ีà¹\88à¹\82à¸\94ยà¸\9bà¸\81à¸\95ิà¹\81ลà¹\89วà¸\81ลà¹\89à¸à¸\87à¸\96à¹\88ายรูà¸\9bà¸\94ิà¸\88ิà¸\97ัลà¸\95ัà¹\89à¸\87à¹\83หà¹\89à¸à¸±à¸\95à¹\82à¸\99มัà¸\95ิ à¸\81รุà¸\93าà¸\95ัà¹\89à¸\87à¸\8aืà¹\88à¸à¹\84à¸\9fลà¹\8cà¹\83หมà¹\88à¹\83หà¹\89สื่อความหมายกว่าเดิม",
'upload-success-subj' => 'อัปโหลดสำเร็จ',
'upload-success-msg' => 'การอัปโหลดของคุณจาก [$2] สำเร็จแล้ว และสามารถใช้ไฟล์ได้ที่นี่: [[:{{ns:file}}:$1]]',
'upload-failure-subj' => 'ปัญหาการอัปโหลด',
$1',
'upload-warning-subj' => 'คำเตือนการอัปโหลด',
-'upload-warning-msg' => 'à¸\9eà¸\9aà¸\9bัà¸\8dหาà¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¸\82à¸à¸\87à¸\84ุà¸\93à¸\88าà¸\81 [$2] à¸\84ุà¸\93à¸à¸²à¸\88à¸\81ลัà¸\9aà¹\84à¸\9bยัà¸\87[[Special:Upload/stash/$1|à¸\9fà¸à¸£à¹\8cมอัปโหลด]]เพื่อแก้ไขปัญหานี้',
+'upload-warning-msg' => 'à¸\9eà¸\9aà¸\9bัà¸\8dหาà¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¸\82à¸à¸\87à¸\84ุà¸\93à¸\88าà¸\81 [$2] à¸\84ุà¸\93à¸à¸²à¸\88à¸\81ลัà¸\9aà¹\84à¸\9bยัà¸\87[[Special:Upload/stash/$1|à¹\81à¸\9aà¸\9aอัปโหลด]]เพื่อแก้ไขปัญหานี้',
'upload-proto-error' => 'โพรโทคอลไม่ถูกต้อง',
'upload-proto-error-text' => 'การอัปโหลดโดยตรงจากเว็บต้องการยูอาร์แอลที่ขึ้นต้นด้วย <code>http://</code> หรือ <code>ftp://</code>',
'upload-file-error' => 'เกิดความผิดพลาดภายใน',
-'upload-file-error-text' => 'เกิดความผิดพลาดภายใน จากปัญหาการสร้างไฟล์ชั่วคราวที่เซิร์ฟเวอร์ กรุณาติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]',
-'upload-misc-error' => 'à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸à¸±à¸\9bà¹\82หลà¸\94',
-'upload-misc-error-text' => 'à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาระหวà¹\88าà¸\87à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สà¸à¸\9aวà¹\88ายูà¸à¸²à¸£à¹\8cà¹\81à¸à¸¥à¸\99ัà¹\89à¸\99à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87 à¸\96à¹\89ายัà¸\87à¸\84à¸\87มีà¸\9bัà¸\8dหาà¹\83หà¹\89à¸\95ิà¸\94à¸\95à¹\88à¸à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a',
-'upload-too-many-redirects' => 'URL ที่ระบุมีการเปลี่ยนทางมากเกินไป',
+'upload-file-error-text' => 'เกิดความผิดพลาดภายในขณะพยายามสร้างไฟล์ชั่วคราวบนเซิร์ฟเวอร์ กรุณาติดต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]]',
+'upload-misc-error' => 'à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸à¸±à¸\9bà¹\82หลà¸\94à¹\82à¸\94ยà¹\84มà¹\88à¸\97ราà¸\9aสาà¹\80หà¸\95ุ',
+'upload-misc-error-text' => 'à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\84มà¹\88à¸\97ราà¸\9aสาà¹\80หà¸\95ุระหวà¹\88าà¸\87à¸à¸±à¸\9bà¹\82หลà¸\94 à¸\81รุà¸\93าà¸\95รวà¸\88สà¸à¸\9aวà¹\88ายูà¸à¸²à¸£à¹\8cà¹\81à¸à¸¥à¸\99ัà¹\89à¸\99à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87à¹\81ละà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\84à¸\94à¹\89 à¹\81ละลà¸à¸\87à¸à¸µà¸\81à¸\84รัà¹\89à¸\87 à¸\96à¹\89ายัà¸\87มีà¸\9bัà¸\8dหา à¹\83หà¹\89à¸\95ิà¸\94à¸\95à¹\88à¸[[Special:ListUsers/sysop|à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a]]',
+'upload-too-many-redirects' => 'ยูอาร์แอลที่ระบุมีการเปลี่ยนทางมากเกินไป',
'upload-unknown-size' => 'ไม่ทราบขนาด',
-'upload-http-error' => 'เกิดข้อผิดพลาด HTTP: $1',
+'upload-http-error' => 'เกิดข้อผิดพลาดเอชทีทีพี: $1',
+'upload-copy-upload-invalid-domain' => 'การอัปโหลดสำเนาไม่สามารถทำได้จากโดเมนนี้',
# File backend
'backend-fail-backup' => 'ไม่สามารถสำรองข้อมูลไฟล์ $1.',
-'backend-fail-notexists' => 'à¹\84มà¹\88à¸\9eà¸\9aà¹\84à¸\9fลà¹\8c $1 à¸\97ีà¹\88à¸\95à¹\89à¸à¸\87à¸\81าร',
+'backend-fail-notexists' => 'à¹\84มà¹\88มีà¹\84à¸\9fลà¹\8c $1',
'backend-fail-delete' => 'ไม่สามารถลบไฟล์ $1 ได้',
'backend-fail-alreadyexists' => 'มีไฟล์ "$1" อยู่แล้ว',
'backend-fail-store' => 'ไม่สามารถเก็บไฟล์ "$1" ที่ "$2" ได้',
เซิร์ฟเวอร์ของคุณอาจไม่ได้ถูกตั้งให้ส่งข้อมูลนี้
หรือเซิร์ฟเวอร์อาจเป็นแบบ CGI-based และไม่สนับสนุนข้อมูล img_auth
ดูที่ https://www.mediawiki.org/wiki/Manual:Image_Authorization',
-'img-auth-notindir' => 'à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸\97ีà¹\88รà¹\89à¸à¸\87à¸\82à¸à¹\84มà¹\88à¹\84à¸\94à¹\89à¸à¸¢à¸¹à¹\88à¹\83à¸\99à¹\84à¸\94à¹\80รà¹\87à¸\81à¸\97à¸à¸£à¸µà¸à¸±à¸\9eà¹\82หลà¸\94à¸\97ีà¹\88à¸\81ำหà¸\99à¸\94à¹\84à¹\89วà¹\89',
+'img-auth-notindir' => 'ที่อยู่ที่ร้องขอไม่ได้อยู่ในไดเร็กทอรีอัพโหลดที่กำหนดไว้',
'img-auth-badtitle' => 'ไม่สามารถสร้างชื่อเรื่องที่ถูกต้องจาก "$1" ได้',
-'img-auth-nologinnWL' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¸\87à¸\8aืà¹\88à¸à¹\80à¸\82à¹\89าà¹\83à¸\8aà¹\89และ "$1" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ดี (whitelist)',
+'img-auth-nologinnWL' => 'à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87à¸à¸\81à¸à¸´à¸\99และ "$1" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ดี (whitelist)',
'img-auth-nofile' => 'ไม่มีไฟล์ "$1"',
'img-auth-isdir' => 'คุณกำลังพยายามเข้าถึงไดเร็กทอรี "$1"
ซึ่งคุณสามารถเข้าถึงได้เฉพาะไฟล์เท่านั้น',
'upload-curl-error28' => 'เวลาอัปโหลดถูกตัด',
'upload-curl-error28-text' => 'เว็บไซต์นี้ใช้เวลานานเกินไปในการเชื่อมต่อ กรุณาตรวจสอบว่าเว็บนี้ยังใช้งานได้ตามปกติ หรืออาจจะรอสักครู่แล้วลองอัปโหลดใหม่',
-'license' => 'ลิà¸\82สิà¸\97à¸\98ิà¹\8c:',
-'license-header' => 'à¸\81ารà¸à¸\99ุà¸\8dาà¸\95à¹\82à¸\94ยà¹\80à¸\88à¹\89าà¸\82à¸à¸\87ลิà¸\82สิà¸\97à¸\98ิà¹\8c',
+'license' => 'à¸\81ารà¸à¸\99ุà¸\8dาà¸\95à¹\83à¸\8aà¹\89สิà¸\97à¸\98ิ:',
+'license-header' => 'à¸\81ารà¸à¸\99ุà¸\8dาà¸\95à¹\83à¸\8aà¹\89สิà¸\97à¸\98ิ',
'nolicense' => 'ไม่ได้เลือก',
'license-nopreview' => '(ไม่สามารถแสดงตัวอย่าง)',
-'upload_source_url' => ' (ยูà¸à¸²à¸£à¹\8cà¹\81à¸à¸¥à¸\97ีà¹\88à¸\9aุà¸\84à¸\84ลà¸\97ัà¹\88วà¹\84à¸\9bสามารถเข้าถึงได้)',
+'upload_source_url' => ' (ยูà¸à¸²à¸£à¹\8cà¹\81à¸à¸¥à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87à¸\97ีà¹\88สาà¸\98ารà¸\93ะสามารถเข้าถึงได้)',
'upload_source_file' => ' (ไฟล์จากคอมพิวเตอร์คุณ)',
# Special:ListFiles
'filehist-comment' => 'ความเห็น',
'filehist-missing' => 'ไฟล์หายไป',
'imagelinks' => 'การใช้ไฟล์',
-'linkstoimage' => '$1 หน้าลิงก์มายังไฟล์นี้:',
-'linkstoimage-more' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87มาà¸\81à¸\81วà¹\88า $1 à¹\81หà¹\88à¸\87
-รายà¸\81ารà¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87 $1 à¹\81หà¹\88à¸\87แรกที่มายังไฟล์นี้เท่านั้น
-à¸\94ูà¹\80à¸\9eิà¹\88มà¹\84à¸\94à¹\89à¸\97ีà¹\88[[Special:WhatLinksHere/$2|รายà¸\8aืà¹\88à¸เต็ม]]',
-'nolinkstoimage' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cมาไฟล์นี้',
-'morelinkstoimage' => 'à¸\94ู[[Special:WhatLinksHere/$1|หà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8c]]มายังไฟล์นี้เพิ่มเติม',
-'linkstoimage-redirect' => '$1 (à¹\81à¸\9fà¹\89มเปลี่ยนทาง) $2',
-'duplicatesoffile' => '$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่ม]]):',
+'linkstoimage' => 'มี $1 หน้าเชื่อมโยงมายังไฟล์นี้:',
+'linkstoimage-more' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีหà¸\99à¹\89าà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87มาà¸\81วà¹\88า $1 หà¸\99à¹\89า
+รายà¸\81ารà¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87 $1 หà¸\99à¹\89าแรกที่มายังไฟล์นี้เท่านั้น
+à¸\94ูà¹\80à¸\9eิà¹\88มà¹\84à¸\94à¹\89à¸\97ีà¹\88[[Special:WhatLinksHere/$2|รายà¸\81ารเต็ม]]',
+'nolinkstoimage' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87มายัà¸\87ไฟล์นี้',
+'morelinkstoimage' => 'à¸\94ู[[Special:WhatLinksHere/$1|à¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87]]มายังไฟล์นี้เพิ่มเติม',
+'linkstoimage-redirect' => '$1 (à¹\84à¸\9fลà¹\8cเปลี่ยนทาง) $2',
+'duplicatesoffile' => '$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่มเติม]]):',
'sharedupload' => 'ไฟล์นี้มาจาก $1 และอาจมีการใช้ในโครงการอื่น',
-'sharedupload-desc-there' => 'ไฟล์นี้มาจาก $1 และอาจถูกใช้บนโครงการอื่น ๆ
-กรุณาดู [หน้าคำอธิบายของไฟล์ $2] สำหรับข้อมูลเพิ่มเติม',
+'sharedupload-desc-there' => 'ไฟล์นี้มาจาก $1 และอาจถูกใช้บนโครงการอื่น
+กรุณาดู[หน้าคำอธิบายไฟล์ $2] สำหรับข้อมูลเพิ่มเติม',
'sharedupload-desc-here' => 'ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น
-à¸\84ำà¸à¸\98ิà¸\9aายà¹\83à¸\99[$2 หà¸\99à¹\89าà¹\84à¸\9fลà¹\8c]à¹\84à¸\94à¹\89แสดงไว้ข้างล่างนี้',
-'sharedupload-desc-edit' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละà¸à¸²à¸\88มีà¸\81ารà¹\83à¸\8aà¹\89à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารà¸à¸·à¹\88à¸\99 à¹\86 à¸à¸µà¸\81
-หากคุณต้องการแก้ไขคำอธิบาย ให้ดำเนินการ[$2 ที่นี่]',
-'sharedupload-desc-create' => 'ไฟล์นี้มาจาก $1 และอาจมีการใช้ไฟล์นี้ในโครงการอื่น ๆ อีก
-หากคุณต้องการแก้ไขคำอธิบาย ให้ดำเนินการ[$2 ที่นี่]',
+à¸\84ำà¸à¸\98ิà¸\9aายà¹\83à¸\99[$2 หà¸\99à¹\89าà¸\84ำà¸à¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c]แสดงไว้ข้างล่างนี้',
+'sharedupload-desc-edit' => 'à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละà¸à¸²à¸\88มีà¹\83à¸\8aà¹\89à¹\83à¸\99à¹\82à¸\84รà¸\87à¸\81ารà¸à¸·à¹\88à¸\99
+หากคุณต้องการแก้ไขคำอธิบาย ให้ดำเนินการบน[$2 หน้าคำอธิบายไฟล์]',
+'sharedupload-desc-create' => 'ไฟล์นี้มาจาก $1 และอาจมีการใช้ไฟล์นี้ในโครงการอื่น
+หากคุณต้องการแก้ไขคำอธิบาย ให้ดำเนินการบน[$2 หน้าคำอธิบายไฟล์]',
'filepage-nofile' => 'ไม่มีไฟล์ชื่อนี้',
'filepage-nofile-link' => 'ไม่มีไฟล์ชื่อนี้ แต่คุณสามารถ[$1 อัปโหลด]ได้',
'uploadnewversion-linktext' => 'อัปโหลดรุ่นใหม่ของไฟล์นี้',
# File deletion
'filedelete' => 'ลบ $1',
'filedelete-legend' => 'ลบไฟล์',
-'filedelete-intro' => "à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\88ะลà¸\9aà¹\84à¸\9fลà¹\8c '''[[Media:$1|$1]]''' à¹\84à¸\9bà¸\9eรà¹\89à¸à¸¡à¸\81ัà¸\9aà¸\9bระวัà¸\95ิของไฟล์นี้",
+'filedelete-intro' => "à¸\84ุà¸\93à¸\81ำลัà¸\87ลà¸\9aà¹\84à¸\9fลà¹\8c '''[[Media:$1|$1]]''' à¸\9eรà¹\89à¸à¸¡à¸\81ัà¸\9aà¸\9bระวัà¸\95ิà¸\97ัà¹\89à¸\87หมà¸\94ของไฟล์นี้",
'filedelete-intro-old' => "คุณกำลังลบ '''[[Media:$1|$1]]''' รุ่น [$4 $3, $2]",
'filedelete-comment' => 'เหตุผล:',
'filedelete-submit' => 'ลบ',
** ละเมิดลิขสิทธิ์
** ไฟล์ซ้ำ',
'filedelete-edit-reasonlist' => 'แก้ไขเหตุผลการลบ',
-'filedelete-maintenance' => 'à¸\9bิà¸\94à¸\81ารลà¸\9aà¹\81ละà¹\80รียà¸\81à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cà¹\84วà¹\89à¸\8aัà¹\88วà¸\84ราว à¹\83à¸\99ระหวà¹\88าà¸\87à¸\81ารà¸\8bà¹\88à¸à¸¡à¸\9aำรุà¸\87',
+'filedelete-maintenance' => 'à¸\81ารลà¸\9aà¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99à¹\84à¸\9fลà¹\8cà¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\8aัà¹\88วà¸\84ราวระหวà¹\88าà¸\87à¸\81ารà¸\9aำรุà¸\87รัà¸\81ษา',
'filedelete-maintenance-title' => 'ไม่สามารถลบไฟล์',
# MIME search
'mimesearch' => 'ค้นหาตามชนิดไมม์',
-'mimesearch-summary' => 'หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ (MIME) ของแต่ละไฟล์ ใส่ค่า: contenttype/subtype เช่น <code>image/jpeg</code>.',
+'mimesearch-summary' => 'หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ของแต่ละไฟล์
+ใส่ค่า: contenttype/subtype เช่น <code>image/jpeg</code>',
'mimetype' => 'ชนิดไมม์:',
'download' => 'ดาวน์โหลด',
# Unused templates
'unusedtemplates' => 'แม่แบบไม่ได้ใช้',
-'unusedtemplatestext' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารà¸\9aà¸\97à¸\84วามà¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8b {{ns:template}} à¸\8bึà¹\88à¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81รวมà¸à¸¢à¸¹à¹\88à¹\83à¸\99หà¸\99à¹\89าà¸à¸·à¹\88à¸\99 à¸\81à¹\88à¸à¸\99à¸\97ีà¹\88à¸\88ะลà¸\9aสà¹\88วà¸\99à¸\99ีà¹\89à¹\83หà¹\89à¸\97ำà¸\81ารà¸\95รวà¸\88สà¸à¸\9aหà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cมาà¸\81à¹\88à¸à¸\99à¸\97ุà¸\81à¸\84รัà¹\89à¸\87',
-'unusedtemplateswlh' => 'ลิà¸\87à¸\81à¹\8cมา',
+'unusedtemplatestext' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94à¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8b {{ns:template}} à¸\8bึà¹\88à¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¸\96ูà¸\81รวมà¸à¸¢à¸¹à¹\88à¹\83à¸\99หà¸\99à¹\89าà¸à¸·à¹\88à¸\99 à¸à¸¢à¹\88าลืมà¸\95รวà¸\88สà¸à¸\9aà¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87มายัà¸\87à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸à¸·à¹\88à¸\99à¸\81à¹\88à¸à¸\99ลà¸\9a',
+'unusedtemplateswlh' => 'à¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¸à¸·à¹\88à¸\99',
# Random page
'randompage' => 'สุ่มหน้า',
'statistics-views-total-desc' => 'ไม่นับรวมจำนวนการเข้าชมหน้าที่ไม่มีอยู่และหน้าพิเศษ',
'statistics-views-peredit' => 'จำนวนการเข้าดูต่อการแก้ไข:',
'statistics-users' => '[[Special:ListUsers|ผู้ใช้]]ลงทะเบียน',
-'statistics-users-active' => 'à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88ยัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82à¸à¸¢à¸¹à¹\88',
+'statistics-users-active' => 'à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88ยัà¸\87มีà¸\84วามà¹\80à¸\84ลืà¹\88à¸à¸\99à¹\84หว',
'statistics-users-active-desc' => 'ผู้ใช้ที่ดำเนินปฏิบัติการในช่วง $1 วันที่ผ่านมา',
'statistics-mostpopular' => 'หน้าที่มีการเข้าชมมากที่สุด',
-'disambiguations' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¸\81ัà¸\9aหน้าแก้ความกำกวม',
+'disambiguations' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หน้าแก้ความกำกวม',
'disambiguationspage' => 'Template:แก้กำกวม',
-'disambiguations-text' => "หà¸\99à¹\89าà¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89มีà¸à¸¢à¹\88าà¸\87à¸\99à¹\89à¸à¸¢à¸«à¸\99ึà¹\88à¸\87ลิà¸\87à¸\81à¹\8cà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¹\84à¸\9bยัà¸\87'''หà¸\99à¹\89าà¸\84วามà¸\81ำà¸\81วม'''
-à¸\8bึà¹\88à¸\87à¸à¸²à¸\88à¸\95à¹\89à¸à¸\87ลิà¸\87à¸\81à¹\8cà¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\80หมาะสมแทน<br />
-หà¸\99à¹\89าà¹\83à¸\94à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cมาà¸\88าà¸\81 [[MediaWiki:Disambiguationspage]] หà¸\99à¹\89าà¹\80หลà¹\88าà¸\99ัà¹\89à¸\99à¸\88ะà¸\96ูà¸\81à¸\99ัà¸\9aรวมเป็นหน้าความกำกวม",
+'disambiguations-text' => "หà¸\99à¹\89าà¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89มีà¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¹\84à¸\9bยัà¸\87'''หà¸\99à¹\89าà¸\84วามà¸\81ำà¸\81วม'''à¸à¸¢à¹\88าà¸\87à¸\99à¹\89à¸à¸¢à¸«à¸\99ึà¹\88à¸\87à¹\81หà¹\88à¸\87
+à¸\8bึà¹\88à¸\87à¸à¸²à¸\88à¸\95à¹\89à¸à¸\87à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\80หมาะสมà¸\81วà¹\88าแทน<br />
+หà¸\99à¹\89าà¹\83à¸\94à¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\97ีà¹\88à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87มาà¸\88าà¸\81 [[MediaWiki:Disambiguationspage]] à¸\88ะà¸\96ูà¸\81à¸\99ัà¸\9aเป็นหน้าความกำกวม",
'doubleredirects' => 'หน้าเปลี่ยนทางซ้ำซ้อน',
-'doubleredirectstext' => 'หน้านี้แสดงรายการชื่อที่เปลี่ยนทางไปยังหน้าเปลี่ยนทางอื่น
-แต่ละแถวคือลิงก์ของการเปลี่ยนทางครั้งแรกและครั้งที่สอง พร้อมกับหน้าปลายทางของการเปลี่ยนทางครั้งที่สอง ซึ่งควรแก้ไขการเปลี่ยนทางครั้งแรกเป็นหน้าปลายทางดังกล่าว
-รายการที่ <del>ขีดฆ่า</del> คือรายการที่แก้ไขแล้ว',
-'double-redirect-fixed-move' => '[[$1]] ถูกเปลี่ยนชื่อแล้ว และเปลี่ยนทางไปยัง [[$2]]',
+'doubleredirectstext' => 'หน้านี้แสดงรายการหน้าที่เปลี่ยนทางไปยังหน้าเปลี่ยนทางอื่น
+แต่ละแถวมีการเชื่อมโยงไปยังการเปลี่ยนทางครั้งแรกและครั้งที่สอง เช่นเดียวกับเป้าหมายของการเปลี่ยนทางครั้งที่สอง ซึ่งมักเป็นหน้าเป้าหมาย "ที่แท้จริง" ที่การเปลี่ยนแปลงครั้งแรกควรชี้ไป
+หน่วยที่<del>ขีดฆ่า</del> คือ รายการที่ได้แก้ไขแล้ว',
+'double-redirect-fixed-move' => '[[$1]] ได้ย้ายแล้ว
+ขณะนี้เปลี่ยนทางไปยัง [[$2]]',
'double-redirect-fixed-maintenance' => 'การแก้ไขการเปลี่ยนทางซ้ำซ้อนจาก [[$1]] ไปยัง [[$2]]',
-'double-redirect-fixer' => 'Redirect fixer',
+'double-redirect-fixer' => 'ตัวซ่อมหน้าเปลี่ยนทาง',
'brokenredirects' => 'หน้าเปลี่ยนทางเสีย',
-'brokenredirectstext' => 'หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\84มà¹\88มี:',
+'brokenredirectstext' => 'หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¹\84à¸\9bยัà¸\87หà¸\99à¹\89าà¸\97ีà¹\88ยัà¸\87à¹\84มà¹\88à¸\96ูà¸\81สรà¹\89าà¸\87:',
'brokenredirects-edit' => 'แก้ไข',
'brokenredirects-delete' => 'ลบ',
'withoutinterwiki' => 'หน้าที่ไม่มีลิงก์ข้ามภาษา',
'withoutinterwiki-summary' => 'หน้าต่อไปนี้ไม่มีลิงก์ข้ามไปภาษาอื่น',
-'withoutinterwiki-legend' => 'à¸\84ำà¸\99ำหà¸\99à¹\89า',
+'withoutinterwiki-legend' => 'à¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99',
'withoutinterwiki-submit' => 'แสดง',
-'fewestrevisions' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82น้อยสุด',
+'fewestrevisions' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีรุà¹\88à¸\99น้อยสุด',
# Miscellaneous special pages
'nbytes' => '$1 ไบต์',
'ncategories' => '$1 หมวดหมู่',
-'nlinks' => '$1 {{PLURAL:$1|ลิงก์|ลิงก์}}',
+'ninterwikis' => '$1 ลิงก์ข้ามโครงการ',
+'nlinks' => '$1 ลิงก์',
'nmembers' => '$1 หน้า',
-'nrevisions' => '$1 à¸\84รัà¹\89à¸\87',
+'nrevisions' => '$1 รุà¹\88à¸\99',
'nviews' => '$1 ครั้ง',
'nimagelinks' => 'ใช้ใน $1 {{PLURAL: $1|หน้า|หน้า}}',
'ntransclusions' => 'ใช้ใน $1 {{PLURAL: $1|หน้า|หน้า}}',
-'specialpage-empty' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¸\97ีà¹\88à¹\80รียà¸\81à¸\94ู',
+'specialpage-empty' => 'à¹\84มà¹\88มีà¸\9cลลัà¸\9eà¸\98à¹\8cรายà¸\87าà¸\99à¸\99ีà¹\89',
'lonelypages' => 'หน้าสุดทาง',
'lonelypagestext' => 'หน้าต่อไปนี้ไม่มีการเชื่อมโยงหรือถูกรวมไว้ในหน้าอื่นใน {{SITENAME}}',
'uncategorizedpages' => 'หน้าที่ไม่ได้จัดหมวดหมู่',
'popularpages' => 'หน้าที่มีการเข้าดูมาก',
'wantedcategories' => 'หมวดหมู่ที่ต้องการ',
'wantedpages' => 'หน้าที่ต้องการ',
-'wantedpages-badtitle' => 'ชื่อเรื่อง $1 ไม่ถูกต้องในรายการผลลัพธ์',
+'wantedpages-badtitle' => 'ชื่อเรื่องไม่สมเหตุสมผลในเซตผลลัพธ์: $1',
'wantedfiles' => 'ไฟล์ที่ต้องการ',
'wantedtemplates' => 'แม่แบบที่ต้องการ',
-'mostlinked' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารลิà¸\87à¸\81à¹\8cหามาà¸\81',
-'mostlinkedcategories' => 'หมวà¸\94หมูà¹\88à¸\97ีà¹\88มีà¸\81ารà¹\82ยà¸\87หามาà¸\81',
-'mostlinkedtemplates' => 'à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\97ีà¹\88à¹\83à¸\8aà¹\89มาà¸\81',
-'mostcategories' => 'หน้าที่มีหมวดหมู่มาก',
-'mostimages' => 'ภาà¸\9eà¸\97ีà¹\88à¹\83à¸\8aà¹\89มาà¸\81',
-'mostinterwikis' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามภาษามากที่สุด',
-'mostrevisions' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82มาà¸\81',
-'prefixindex' => 'หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94à¸\95ามà¸\94ัà¸\8aà¸\99ีคำขึ้นต้น',
-'prefixindex-namespace' => 'à¸\97ุà¸\81หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99 ($1 à¹\80à¸\99มสà¹\80à¸\9bà¸\8b)',
-'shortpages' => 'หน้าสั้นมาก',
-'longpages' => 'หน้ายาวมาก',
+'mostlinked' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87หามาà¸\81à¸\97ีà¹\88สุà¸\94',
+'mostlinkedcategories' => 'หมวà¸\94หมูà¹\88à¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87หามาà¸\81à¸\97ีà¹\88สุà¸\94',
+'mostlinkedtemplates' => 'à¹\81มà¹\88à¹\81à¸\9aà¸\9aà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87หามาà¸\81à¸\97ีà¹\88สุà¸\94',
+'mostcategories' => 'หน้าที่มีหมวดหมู่มากที่สุด',
+'mostimages' => 'ภาà¸\9eà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87หามาà¸\81à¸\97ีà¹\88สุà¸\94',
+'mostinterwikis' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามà¹\82à¸\84รà¸\87à¸\81ารมากที่สุด',
+'mostrevisions' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีรุà¹\88à¸\99มาà¸\81à¸\97ีà¹\88สุà¸\94',
+'prefixindex' => 'à¸\97ุà¸\81หà¸\99à¹\89าà¸\9eรà¹\89à¸à¸¡คำขึ้นต้น',
+'prefixindex-namespace' => 'à¸\97ุà¸\81หà¸\99à¹\89าà¸\9eรà¹\89à¸à¸¡à¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99 (à¹\80à¸\99มสà¹\80à¸\9bà¸\8b $1)',
+'shortpages' => 'หน้าสั้น',
+'longpages' => 'หน้ายาว',
'deadendpages' => 'หน้าสุดทาง',
-'deadendpagestext' => 'หà¸\99à¹\89าà¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¹\84มà¹\88à¹\84à¸\94à¹\89ลิà¸\87à¸\81à¹\8cไปหน้าอื่นใน {{SITENAME}}',
-'protectedpages' => 'หน้าถูกล็อก',
-'protectedpages-indef' => 'à¸\81ารลà¹\87à¸à¸\81à¹\81à¸\9aà¸\9aà¹\84มà¹\88à¸\88ำà¸\81ัดเท่านั้น',
+'deadendpagestext' => 'หà¸\99à¹\89าà¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¹\84มà¹\88à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87ไปหน้าอื่นใน {{SITENAME}}',
+'protectedpages' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87à¸à¸\81',
+'protectedpages-indef' => 'à¸\81ารลà¹\87à¸à¸\81à¹\81à¸\9aà¸\9aà¹\84มà¹\88มีà¸\81ำหà¸\99ดเท่านั้น',
'protectedpages-cascade' => 'การล็อกแบบสืบทอดเท่านั้น',
-'protectedpagestext' => 'หà¸\99à¹\89าà¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87à¸à¸\81หà¹\89ามà¹\81à¸\81à¹\89à¹\84à¸\82หรืà¸à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88à¸',
-'protectedpagesempty' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¹\83à¸\94à¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87à¸à¸\81à¸\95ามà¸\84à¹\88าà¸\97ีà¹\88à¹\80ลืà¸à¸\81',
+'protectedpagestext' => 'หà¸\99à¹\89าà¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87à¸à¸\81มิà¹\83หà¹\89ยà¹\89ายหรืà¸à¹\81à¸\81à¹\89à¹\84à¸\82',
+'protectedpagesempty' => 'à¸\82à¸\93ะà¸\99ีà¹\89à¹\84มà¹\88มีหà¸\99à¹\89าà¹\83à¸\94à¸\96ูà¸\81ลà¹\87à¸à¸\81à¸\95ามà¸\9eารามิà¹\80à¸\95à¸à¸£à¹\8cà¹\80หลà¹\88าà¸\99ีà¹\89',
'protectedtitles' => 'ชื่อเรื่องที่ถูกป้องกัน',
'protectedtitlestext' => 'ชื่อเรื่องต่อไปนี้ถูกป้องกันมิให้สร้าง',
-'protectedtitlesempty' => 'à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88มีหัวà¹\80รืà¹\88à¸à¸\87à¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99à¸\94à¹\89วยà¸\84à¹\88าà¸\95à¹\88à¸à¹\84à¸\9bนี้',
+'protectedtitlesempty' => 'à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¹\84มà¹\88มีหัวà¹\80รืà¹\88à¸à¸\87à¸\97ีà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99à¸\94à¹\89วยà¸\9eารามิà¹\80à¸\95à¸à¸£à¹\8cà¹\80หลà¹\88านี้',
'listusers' => 'รายนามผู้ใช้',
'listusers-editsonly' => 'แสดงเฉพาะผู้ใช้ที่มีการแก้ไข',
'listusers-creationsort' => 'เรียงลำดับตามวันสร้าง',
'move' => 'เปลี่ยนชื่อ',
'movethispage' => 'เปลี่ยนชื่อหน้านี้',
'unusedimagestext' => 'ไฟล์ต่อไปนี้มีอยู่ แต่ไม่มีการเรียกใช้ในหน้าใด ๆ เลย
-หมายà¹\80หà¸\95ุวà¹\88า à¹\80วà¹\87à¸\9aà¹\84วà¸\95à¹\8cà¸à¸·à¹\88à¸\99à¸à¸²à¸\88ลิà¸\87à¸\81à¹\8cมายัà¸\87à¹\84à¸\9fลà¹\8cà¸\94à¹\89วยยูà¸à¸²à¸£à¹\8cà¹\81à¸à¸¥à¹\82à¸\94ยà¸\95รà¸\87 à¸\89ะà¸\99ัà¹\89à¸\99à¸\88ึà¸\87à¸à¸²à¸\88ยัà¸\87มีà¸\8aืà¹\88à¸อยู่ที่นี่แม้จะมีการใช้อย่างต่อเนื่อง',
-'unusedcategoriestext' => 'หมวดหมู่ต่อไปนี้ยังมีอยู่ถึงแม้ว่าจะไม่มีว่าไม่มีหน้าไหนหรือบทความไหนใช้ส่วนนี้',
-'notargettitle' => 'à¹\84มà¹\88à¸\9eà¸\9aหà¸\99à¹\89าà¸\9bลายà¸\97าà¸\87',
+หมายà¹\80หà¸\95ุวà¹\88า à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸à¸·à¹\88à¸\99à¸à¸²à¸\88à¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87มายัà¸\87à¹\84à¸\9fลà¹\8cà¸\94à¹\89วยยูà¸à¸²à¸£à¹\8cà¹\81à¸à¸¥à¹\82à¸\94ยà¸\95รà¸\87 à¸\89ะà¸\99ัà¹\89à¸\99à¸\88ึà¸\87à¸\8aืà¹\88à¸à¸à¸²à¸\88ยัà¸\87à¹\81สà¸\94à¸\87รายà¸\81ารอยู่ที่นี่แม้จะมีการใช้อย่างต่อเนื่อง',
+'unusedcategoriestext' => 'หมวดหมู่ต่อไปนี้ยังมีอยู่ แม้ไม่มีหน้าอื่นหรือหมวดหมู่ใดใช้ส่วนนี้',
+'notargettitle' => 'à¹\84มà¹\88à¸\9eà¸\9aà¹\80à¸\9bà¹\89าหมาย',
'notargettext' => 'คุณมิได้ระบุหน้าหรือผู้ใช้เป้าหมายที่จะดำเนินการฟังก์ชันนี้',
'nopagetitle' => 'ไม่มีหน้าเป้าหมายดังกล่าว',
'nopagetext' => 'หน้าเป้าหมายที่คุณระบุไม่มีอยู่',
'pager-newer-n' => 'ใหม่กว่า $1',
'pager-older-n' => 'เก่ากว่า $1',
-'suppress' => 'Oversight',
-'querypage-disabled' => 'หà¸\99à¹\89าà¸\9eิà¹\80ศษà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\94à¹\89วยà¹\80หà¸\95ุà¸\9cลà¸\94à¹\89าà¸\99à¸\9bระสิà¸\97à¸\98ิภาà¸\9e',
+'suppress' => 'ผู้ดูแลประวัติ',
+'querypage-disabled' => 'หà¸\99à¹\89าà¸\9eิà¹\80ศษà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81มีà¸\9bระสิà¸\97à¸\98ิภาà¸\9eà¸\95à¹\88ำ',
# Book sources
-'booksources' => 'à¸\84à¹\89à¸\99หาหนังสือ',
-'booksources-search-legend' => 'ค้นหาหนังสือ',
+'booksources' => 'à¹\81หลà¹\88à¸\87หนังสือ',
+'booksources-search-legend' => 'à¸\84à¹\89à¸\99หาà¹\81หลà¹\88à¸\87หà¸\99ัà¸\87สืà¸',
'booksources-go' => 'ค้นหา',
-'booksources-text' => 'รายà¸\81ารà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\81สà¸\94à¸\87à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸\97ีà¹\88à¸\82ายหà¸\99ัà¸\87สืà¸à¹\83หมà¹\88หรืà¸à¸«à¸\99ัà¸\87สืà¸à¹\83à¸\8aà¹\89à¹\81ลà¹\89ว à¸\8bึà¹\88à¸\87à¸à¸²à¸\88มีà¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\82à¸à¸\87หà¸\99ัà¸\87สืà¸à¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¸\84à¹\89à¸\99หา:',
+'booksources-text' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\8aืà¹\88à¸à¸¡à¹\82ยà¸\87à¹\84à¸\9bยัà¸\87à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸à¸·à¹\88à¸\99à¸\97ีà¹\88à¸\82ายหà¸\99ัà¸\87สืà¸à¹\83หมà¹\88à¹\81ละหà¸\99ัà¸\87สืà¸à¹\83à¸\8aà¹\89à¹\81ลà¹\89ว à¹\81ละà¸à¸²à¸\88มีสารสà¸\99à¹\80à¸\97ศà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิมà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aหà¸\99ัà¸\87สืà¸à¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87มà¸à¸\87หา:',
'booksources-invalid-isbn' => 'รหัส ISBN ที่ให้ไว้ไม่ถูกต้อง กรุณาตรวจสอบจากต้นฉบับอีกครั้ง',
# Special:Log
'alllogstext' => 'การแสดงผลรวมปูมที่มีทั้งหมดของ {{SITENAME}}
คุณสามารถค้นหาให้ละเอียดขึ้นโดยเลือกประเภทปูม ชื่อผู้ใช้หรือหน้าที่ต้องการ (ไวต่ออักษรใหญ่เล็ก)',
'logempty' => 'ไม่พบรายการตรงกันในปูม',
-'log-title-wildcard' => 'à¸\84à¹\89à¸\99หาà¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87à¸\94à¹\89วยà¸\84ำà¸\82ึà¹\89à¸\99à¸\95à¹\89à¸\99',
-'showhideselectedlogentries' => 'à¹\81สà¸\94à¸\87/à¸\8bà¹\88à¸à¸\99รายà¸\81ารปูมที่เลือก',
+'log-title-wildcard' => 'à¸\84à¹\89à¸\99หาà¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87à¸\94à¹\89วยà¸\82à¹\89à¸à¸\84วามà¸\99ีà¹\89',
+'showhideselectedlogentries' => 'à¹\81สà¸\94à¸\87/à¸\8bà¹\88à¸à¸\99หà¸\99à¹\88วยปูมที่เลือก',
# Special:AllPages
'allpages' => 'ทุกหน้า',
'alphaindexline' => '$1 ถึง $2',
'nextpage' => 'ถัดไป ($1)',
'prevpage' => 'ก่อนหน้า ($1)',
-'allpagesfrom' => 'à¹\80ริà¹\88มà¹\81สà¸\94à¸\87à¸\9cลจาก:',
-'allpagesto' => 'à¸\88à¸\9aà¸\81ารà¹\81สà¸\94à¸\87à¸\9cลที่:',
+'allpagesfrom' => 'à¹\81สà¸\94à¸\87หà¸\99à¹\89าà¹\82à¸\94ยà¹\80ริà¹\88มจาก:',
+'allpagesto' => 'à¹\81สà¸\94à¸\87หà¸\99à¹\89าà¸\88à¸\9aที่:',
'allarticles' => 'ทุกหน้า',
-'allinnamespace' => 'หน้าทุกหน้า ($1 เนมสเปซ)',
-'allnotinnamespace' => 'หน้าทุกหน้า (ไม่อยู่ใน $1 เนมสเปซ)',
+'allinnamespace' => 'หน้าทุกหน้า (เนมสเปซ $1)',
+'allnotinnamespace' => 'หน้าทุกหน้า (ไม่อยู่ในเนมสเปซ $1)',
'allpagesprev' => 'ก่อนหน้า',
'allpagesnext' => 'ถัดไป',
-'allpagessubmit' => 'à¸\84à¹\89à¸\99หา',
+'allpagessubmit' => 'à¸\94ู',
'allpagesprefix' => 'แสดงหน้าที่ขึ้นต้นด้วย:',
'allpagesbadtitle' => 'ชื่อเรื่องนี้ไม่ถูกต้อง อาจสะกดผิด ลิงก์มาจากภาษาอื่นหรือวิกิอื่น หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้',
'allpages-bad-ns' => '{{SITENAME}} ไม่มีเนมสเปซ "$1"',
# Special:Categories
'categories' => 'หมวดหมู่',
-'categoriespagetext' => '{{PLURAL:$1|หมวà¸\94หมูà¹\88à¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89}}มีหà¸\99à¹\89าหรืà¸à¸ªà¸·à¹\88à¸à¸\95à¹\88าà¸\87ๆ
+'categoriespagetext' => '{{PLURAL:$1|หมวà¸\94หมูà¹\88à¸\99ีà¹\89|หมวà¸\94หมูà¹\88à¸\95à¹\88à¸à¹\84à¸\9bà¸\99ีà¹\89}}มีหà¸\99à¹\89าหรืà¸à¸ªà¸·à¹\88à¸à¸\95à¹\88าà¸\87 ๆ
[[Special:UnusedCategories|หมวดหมู่ที่ไม่ได้ใช้]]จะไม่แสดงในที่นี้
-ดูเพิ่มที่[[Special:WantedCategories|หมวดหมู่ที่ต้องการ]]',
-'categoriesfrom' => 'à¹\81สà¸\94à¸\87หมวà¸\94หมูà¹\88à¹\82à¸\94ยà¹\80ริà¹\88มà¸\88าà¸\81:',
+ดูเพิ่มที่ [[Special:WantedCategories|หมวดหมู่ที่ต้องการ]]',
+'categoriesfrom' => 'แสดงหมวดหมู่เริ่มจาก:',
'special-categories-sort-count' => 'เรียงตามจำนวน',
'special-categories-sort-abc' => 'เรียงตามตัวอักษร',
'sp-deletedcontributions-contribs' => 'เรื่องที่เขียน',
# Special:LinkSearch
-'linksearch' => 'à¸\84à¹\89à¸\99หาลิà¸\87à¸\81à¹\8cà¸\88าà¸\81ภายà¸\99à¸à¸\81à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8c',
+'linksearch' => 'à¸\84à¹\89à¸\99หาลิà¸\87à¸\81à¹\8cภายà¸\99à¸à¸\81',
'linksearch-pat' => 'รูปแบบการค้นหา:',
'linksearch-ns' => 'เนมสเปซ:',
-'linksearch-ok' => 'สืà¸\9aà¸\84à¹\89à¸\99',
-'linksearch-text' => 'à¸à¸±à¸\81à¸\82ระà¸\95ัวà¹\81à¸\97à¸\99à¹\80à¸\8aà¹\88à¸\99 "*.wikipedia.org" สามารà¸\96à¹\83à¸\8aà¹\89ได้
+'linksearch-ok' => 'à¸\84à¹\89à¸\99หา',
+'linksearch-text' => 'สามารà¸\96à¹\83à¸\8aà¹\89à¸\95ัวà¹\81à¸\97à¸\99à¹\80à¸\8aà¹\88à¸\99 "*.wikipedia.org" ได้
ต้องการโดเมนระดับบนสุดเป็นอย่างน้อย เช่น "*.org"<br />
-à¹\82à¸\9eรà¹\82à¸\97à¸\84à¸à¸¥à¸\97ีà¹\88รà¸à¸\87รัà¸\9a: <code>$1</code> (à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายà¹\80à¸\9bà¹\89น http:// หากไม่ระบุโพรโทคอล)',
+à¹\82à¸\9eรà¹\82à¸\97à¸\84à¸à¸¥à¸\97ีà¹\88รà¸à¸\87รัà¸\9a: <code>$1</code> (à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายà¹\80à¸\9bà¹\87น http:// หากไม่ระบุโพรโทคอล)',
'linksearch-line' => '$1 ถูกลิงก์จาก $2',
-'linksearch-error' => 'à¹\80à¸\84รืà¹\88à¸à¸\87หมายà¹\81à¸\97à¸\99à¸à¸±à¸\81à¸\82ระ (wildcard) à¸à¸¢à¸¹à¹\88หà¸\99à¹\89าà¸\8aืà¹\88à¸à¹\82ฮสà¸\95à¹\8cà¹\84à¸\94à¹\89เท่านั้น',
+'linksearch-error' => 'à¸à¸±à¸\81à¸\82ระà¸\95ัวà¹\81à¸\97à¸\99à¸à¸¢à¸¹à¹\88à¹\84à¸\94à¹\89à¹\80à¸\89à¸\9eาะหà¸\99à¹\89าà¸\8aืà¹\88à¸à¹\82ฮสà¸\95à¹\8cเท่านั้น',
# Special:ListUsers
-'listusersfrom' => 'à¹\81สà¸\94à¸\87à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\82à¸\94ยà¹\80ริà¹\88มà¸\95à¹\89à¸\99จาก:',
+'listusersfrom' => 'à¹\81สà¸\94à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\80ริà¹\88มจาก:',
'listusers-submit' => 'แสดง',
-'listusers-noresult' => 'à¹\84มà¹\88à¸\9eà¸\9aà¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\95à¹\89à¸à¸\87à¸\81าร',
+'listusers-noresult' => 'à¹\84มà¹\88à¸\9eà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
'listusers-blocked' => '(ถูกบล็อก)',
# Special:ActiveUsers
-'activeusers' => 'รายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9bระà¸\88ำ',
-'activeusers-intro' => 'à¸\99ีà¹\88à¸\84ืà¸à¸£à¸²à¸¢à¸\99ามà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ิà¸\88à¸\81รรมà¹\83à¸\94 à¹\86 à¹\83à¸\99 $1 วันที่ผ่านมา',
+'activeusers' => 'รายà¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\84วามà¹\80à¸\84ลืà¹\88à¸à¸\99à¹\84หว',
+'activeusers-intro' => 'à¸\99ีà¹\88à¸\84ืà¸à¸£à¸²à¸¢à¸\81ารà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\81ิà¸\88à¸\81รรมà¹\83à¸\94 à¹\86 à¹\83à¸\99à¸\8aà¹\88วà¸\87 $1 วันที่ผ่านมา',
'activeusers-count' => '{{PLURAL:$1|ปฏิบัติการล่าสุด|ปฏิบัติการล่าสุด $1 รายการ}} ในช่วง $3 วันที่ผ่านมา',
-'activeusers-from' => 'à¹\81สà¸\94à¸\87à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\82à¸\94ยเริ่มจาก:',
+'activeusers-from' => 'à¹\81สà¸\94à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89เริ่มจาก:',
'activeusers-hidebots' => 'ซ่อนบอต',
'activeusers-hidesysops' => 'ซ่อนผู้ดูแลระบบ',
-'activeusers-noresult' => 'à¹\84มà¹\88à¸\9eà¸\9aà¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89',
+'activeusers-noresult' => 'ไม่พบผู้ใช้',
# Special:ListGroupRights
-'listgrouprights' => 'สิทธิของกลุ่มผู้ใช้',
-'listgrouprights-summary' => 'รายชื่อกลุ่มผู้ใช้ต่อไปนี้ถูกกำหนดไว้บน {{SITENAME}} โดยมีสิทธิการเข้าถึงที่เกี่ยวข้อง และอาจมี[[{{MediaWiki:Listgrouprights-helppage}}|ข้อมูลเพิ่มเติม]]เกี่ยวกับสิทธิของแต่ละบุคคล',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">สิทธิ์ที่ถูกให้</span>
-* <span class="listgrouprights-revoked">สิทธิ์ที่ถูกยกเลิก</span>',
+'listgrouprights' => 'สิทธิกลุ่มผู้ใช้',
+'listgrouprights-summary' => 'ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง
+อาจมี[[{{MediaWiki:Listgrouprights-helppage}}|ข้อมูลเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">สิทธิที่ได้รับแต่งตั้ง</span>
+* <span class="listgrouprights-revoked">สิทธิที่ถูกเพิกถอน</span>',
'listgrouprights-group' => 'กลุ่ม',
'listgrouprights-rights' => 'สิทธิ',
-'listgrouprights-helppage' => 'Help:สิà¸\97à¸\98ิà¸\82à¸à¸\87à¸\81ลุà¹\88ม',
-'listgrouprights-members' => '(รายà¸\8aืà¹\88à¸สมาชิก)',
-'listgrouprights-addgroup' => 'สามารà¸\96à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88มà¸\99ีà¹\89|à¸\81ลุà¹\88มà¹\80หลà¹\88าà¸\99ีà¹\89}}à¹\84à¸\94à¹\89: $1',
-'listgrouprights-removegroup' => 'สามารà¸\96ลà¸\9a{{PLURAL:$2|à¸\81ลุà¹\88มà¸\99ีà¹\89|à¸\81ลุà¹\88มà¹\80หลà¹\88าà¸\99ีà¹\89}}à¹\84à¸\94à¹\89: $1',
-'listgrouprights-addgroup-all' => 'สามารà¸\96à¹\80à¸\9eิà¹\88มà¸\81ลุà¹\88มà¸\97ัà¹\89à¸\87หมà¸\94à¹\84à¸\94à¹\89',
-'listgrouprights-removegroup-all' => 'สามารà¸\96ลà¸\9aà¸\81ลุà¹\88มà¸\97ัà¹\89à¸\87หมà¸\94à¹\84à¸\94à¹\89',
-'listgrouprights-addgroup-self' => 'à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}à¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89: $1',
-'listgrouprights-removegroup-self' => 'ลà¸\9a{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}à¸à¸à¸\81à¸\88าà¸\81à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89: $1',
-'listgrouprights-addgroup-self-all' => 'à¹\80à¸\9eิà¹\88มà¸\97ุà¸\81à¸\81ลุà¹\88มà¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89นี้',
-'listgrouprights-removegroup-self-all' => 'ลà¸\9aà¸\97ุà¸\81à¸\81ลุà¹\88มà¸à¸à¸\81à¸\88าà¸\81à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89นี้',
-
-# E-mail user
-'mailnologin' => 'à¹\84มà¹\88มีà¸\81ารสà¹\88à¸\87à¸à¸µà¹\80มล',
-'mailnologintext' => 'à¸\95à¹\89à¸à¸\87à¸\81ารà¸\97ำ[[Special:UserLogin|ลà¹\87à¸à¸\81à¸à¸´à¸\99]]à¹\81ละà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸à¸µà¹\80มลà¹\83à¸\99สà¹\88วà¸\99[[Special:Preferences|à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า]] à¹\80à¸\9eืà¹\88à¸à¸\88ะสà¹\88à¸\87à¸à¸µà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\84à¸\99อื่น',
+'listgrouprights-helppage' => 'Help:สิทธิกลุ่ม',
+'listgrouprights-members' => '(รายà¸\81ารสมาชิก)',
+'listgrouprights-addgroup' => 'à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88มà¸\99ีà¹\89|à¸\81ลุà¹\88มà¹\80หลà¹\88าà¸\99ีà¹\89}}: $1',
+'listgrouprights-removegroup' => 'à¸\99ำ{{PLURAL:$2|à¸\81ลุà¹\88มà¸\99ีà¹\89|à¸\81ลุà¹\88มà¹\80หลà¹\88าà¸\99ีà¹\89}}à¸à¸à¸\81: $1',
+'listgrouprights-addgroup-all' => 'à¹\80à¸\9eิà¹\88มà¸\81ลุà¹\88มà¸\97ัà¹\89à¸\87หมà¸\94',
+'listgrouprights-removegroup-all' => 'à¸\99ำà¸\81ลุà¹\88มà¸\97ัà¹\89à¸\87หมà¸\94à¸à¸à¸\81',
+'listgrouprights-addgroup-self' => 'à¹\80à¸\9eิà¹\88ม{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}à¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\9aัà¸\8dà¸\8aี: $1',
+'listgrouprights-removegroup-self' => 'ลà¸\9a{{PLURAL:$2|à¸\81ลุà¹\88ม|à¸\81ลุà¹\88ม}}à¸à¸à¸\81à¸\88าà¸\81à¸\9aัà¸\8dà¸\8aี: $1',
+'listgrouprights-addgroup-self-all' => 'à¹\80à¸\9eิà¹\88มà¸\97ุà¸\81à¸\81ลุà¹\88มà¹\80à¸\82à¹\89าà¹\84à¸\9bà¹\83à¸\99à¸\9aัà¸\8dà¸\8aีนี้',
+'listgrouprights-removegroup-self-all' => 'à¸\99ำà¸\97ุà¸\81à¸\81ลุà¹\88มà¸à¸à¸\81à¸\88าà¸\81à¸\9aัà¸\8dà¸\8aีนี้',
+
+# Email user
+'mailnologin' => 'à¹\84มà¹\88มีà¸\97ีà¹\88à¸à¸¢à¸¹à¹\88สà¹\88à¸\87',
+'mailnologintext' => 'à¸\84ุà¸\93à¸\95à¹\89à¸à¸\87[[Special:UserLogin|ลà¹\87à¸à¸\81à¸à¸´à¸\99]]à¹\81ละมีà¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¸à¸µà¹\80มลà¸\97ีà¹\88สมà¹\80หà¸\95ุสมà¸\9cลà¹\83à¸\99[[Special:Preferences|à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า]]à¸\82à¸à¸\87à¸\84ุà¸\93 à¹\83à¸\99à¸\81ารสà¹\88à¸\87à¸à¸µà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89อื่น',
'emailuser' => 'ส่งอีเมลหาผู้ใช้นี้',
'emailuser-title-target' => 'ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}',
'emailuser-title-notarget' => 'อีเมลผู้ใช้',
'emailpage' => 'อีเมลผู้ใช้',
-'emailpagetext' => 'à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\9fà¸à¸£à¹\8cมà¸\94à¹\89าà¸\99ลà¹\88าà¸\87สà¹\88à¸\87à¸à¸µà¹\80มลหา{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}à¸\99ีà¹\89
+'emailpagetext' => 'คุณสามารถใช้แบบด้านล่างส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้
ที่อยู่อีเมลที่คุณกรอกใน[[Special:Preferences|การตั้งค่าส่วนตัวของคุณ]]จะปรากฏเป็นที่อยู่ "จาก" ของอีเมล ซึ่งผู้รับสามารถตอบกลับคุณได้โดยตรง',
'usermailererror' => 'การส่งอีเมลผิดพลาด:',
'defemailsubject' => 'อีเมล {{SITENAME}} จากผู้ใช้ "$1"',
-'usermaildisabled' => 'สà¹\88à¸\87à¸à¸µà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99',
-'usermaildisabledtext' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87à¸à¸µà¹\80มลà¹\84à¸\9bหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸à¸·à¹\88à¸\99à¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89',
+'usermaildisabled' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารสà¹\88à¸\87à¸à¸µà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
+'usermaildisabledtext' => 'คุณไม่สามารถส่งอีเมลหาผู้ใช้อื่นบนวิกินี้',
'noemailtitle' => 'ไม่มีที่อยู่อีเมล',
'noemailtext' => 'ผู้ใช้คนนี้ระบุที่อยู่อีเมลไม่ถูกต้อง',
'nowikiemailtitle' => 'ไม่อนุญาตให้ใช้อีเมล',
'nowikiemailtext' => 'ผู้ใช้คนนี้เลือกไม่รับอีเมลจากผู้ใช้อื่น',
'emailnotarget' => 'ไม่มีชื่อผู้ใช้ของผู้รับหรือชื่อผู้ใช้ไม่ถูกต้อง',
'emailtarget' => 'กรอกชื่อผู้ใช้ของผู้รับ',
-'emailusername' => 'ชื่อผู้ใช้ :',
+'emailusername' => 'ชื่อผู้ใช้:',
'emailusernamesubmit' => 'ส่ง',
'email-legend' => 'ส่งอีเมลถึงผู้ใช้ {{SITENAME}} อีกคน',
'emailfrom' => 'จาก:',
'watchnologin' => 'ไม่ได้ล็อกอิน',
'watchnologintext' => 'ต้อง[[Special:UserLogin|ล็อกอิน]]เพื่อแก้ไขรายการเฝ้าดูของคุณ',
'addwatch' => 'เพิ่มเข้ารายการเฝ้าดู',
-'addedwatchtext' => 'หà¸\99à¹\89า "[[:$1]]" à¸\96ูà¸\81à¹\80à¸\9eิà¹\88มà¹\80à¸\82à¹\89า[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82à¸à¸\87à¸\84ุà¸\93 à¸\96à¹\89ามีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89 à¹\81ละหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89à¸à¸\87à¸\88ะà¹\81สà¸\94à¸\87รายการด้านล่าง',
+'addedwatchtext' => 'หà¸\99à¹\89า "[[:$1]]" à¹\84à¸\94à¹\89à¹\80à¸\9eิà¹\88มลà¸\87à¹\83à¸\99[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82à¸à¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89หรืà¸à¸«à¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89à¸à¸\87à¸\88ะà¹\81สà¸\94à¸\87à¹\83à¸\99รายการด้านล่าง',
'removewatch' => 'นำออกจากรายการเฝ้าดู',
'removedwatchtext' => 'หน้า "[[:$1]]" ถูกนำออกจาก[[Special:Watchlist|รายการเฝ้าดูของคุณ]]',
'watch' => 'เฝ้าดู',
'unwatch' => 'เลิกเฝ้าดู',
'unwatchthispage' => 'เลิกเฝ้าดูหน้านี้',
'notanarticle' => 'ไม่ใช่หน้าเนื้อหา',
-'notvisiblerev' => 'รุà¹\88à¸\99à¸\94ัà¸\87à¸\81ลà¹\88าวà¸\96ูà¸\81ลà¸\9aà¹\80รียà¸\9aรà¹\89à¸à¸¢แล้ว',
-'watchnochange' => 'à¹\84มà¹\88มีหà¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93à¹\80à¸\9dà¹\89าà¸\94ูà¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82ในระยะเวลาที่แสดง',
+'notvisiblerev' => 'รุà¹\88à¸\99ลà¹\88าสุà¸\94à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸à¸µà¸\81à¸\84à¸\99à¸\96ูà¸\81ลà¸\9aแล้ว',
+'watchnochange' => 'à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93à¹\80à¸\9dà¹\89าà¸\94ูในระยะเวลาที่แสดง',
'watchlist-details' => 'มี $1 หน้าในรายการเฝ้าดูของคุณ ไม่รวมหน้าอภิปราย',
'wlheader-enotif' => '* แจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
'wlheader-showupdated' => "* หน้าที่มีการเปลี่ยนแปลงตั้งแต่การเข้าชมครั้งล่าสุดของคุณแสดงใน'''ตัวหนา'''",
'watchmethod-recent' => 'ตรวจสอบการปรับปรุงล่าสุดกับหน้าเฝ้าดู',
'watchmethod-list' => 'ตรวจสอบหน้าเฝ้าดูกับการแก้ไขล่าสุด',
'watchlistcontains' => 'รายการเฝ้าดูของคุณมี $1 หน้า',
-'iteminvalidname' => "à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\8aืà¹\88à¸à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87à¸\81ัà¸\9a '$1'...",
-'wlnote' => "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82{{PLURAL:$1|สุà¸\94à¸\97à¹\89าย|ล่าสุด '''$1''' รายการ}} ใน{{PLURAL:$2|ชั่วโมง|ช่วง '''$2''' ชั่วโมง}}ที่ผ่านมา จนถึง $3, $4",
-'wlshowlast' => 'แสดงล่าสุดใน $1 ชั่วโมง $2 วัน $3',
+'iteminvalidname' => "à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\81ัà¸\9aรายà¸\81าร '$1' à¸\8aืà¹\88à¸à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89à¸à¸\87...",
+'wlnote' => "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82{{PLURAL:$1|ลà¹\88าสุà¸\94|ล่าสุด '''$1''' รายการ}} ใน{{PLURAL:$2|ชั่วโมง|ช่วง '''$2''' ชั่วโมง}}ที่ผ่านมา จนถึง $3, $4",
+'wlshowlast' => 'แสดง $1 ชั่วโมง $2 วันล่าสุด $3',
'watchlist-options' => 'ตัวเลือกรายการเฝ้าดู',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'เฝ้าดู...',
'unwatching' => 'เลิกเฝ้าดู...',
+'watcherrortext' => 'เกิดข้อผิดพลาดขณะเปลี่ยนแปลงการตั้งค่ารายการเฝ้าดูของคุณ เพราะ "$1"',
'enotif_mailer' => 'แจ้งการแก้ไขจาก {{SITENAME}}',
'enotif_reset' => 'ทำเครื่องหมายว่าชมทุกหน้าแล้ว',
'enotif_impersonal_salutation' => 'ผู้ใช้งาน {{SITENAME}}',
-'enotif_subject_deleted' => '{{SITENAME}} หน้า $1 ถูกลบแล้วโดย {{gender:$2|$2}}',
-'enotif_subject_created' => '{{SITENAME}} หน้า $1 ถูกสร้างแล้วโดย {{gender:$2|$2}}',
-'enotif_subject_moved' => '{{SITENAME}} หน้า $1 ได้ย้ายแล้วโดย {{gender:$2|$2}}',
-'enotif_subject_changed' => '{{SITENAME}} หน้า $1 ได้เปลี่ยนแล้วโดย {{gender:$2|$2}}',
-'enotif_lastvisited' => 'ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่ครั้งล่าสุดที่คุณเข้าชม',
+'enotif_subject_deleted' => 'หน้า $1 บน {{SITENAME}} ถูกลบโดย {{gender:$2|$2}}',
+'enotif_subject_created' => 'หน้า $1 บน {{SITENAME}} ถูกสร้างโดย {{gender:$2|$2}}',
+'enotif_subject_moved' => 'หน้า $1 บน {{SITENAME}} ถูกย้ายโดย {{gender:$2|$2}}',
+'enotif_subject_restored' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|กู้คืน}}โดย $2',
+'enotif_subject_changed' => 'หน้า $1 บน {{SITENAME}} มีการเปลี่ยนแปลงโดย {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|ลบ}}เมื่อ $PAGEEDITDATE โดย $2 ดู $3',
+'enotif_body_intro_created' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|สร้าง}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
+'enotif_body_intro_moved' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|เปลี่ยนชื่อ}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
+'enotif_body_intro_restored' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|กู้คืน}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
+'enotif_body_intro_changed' => 'หน้า $1 บน {{SITENAME}} ถูก{{GENDER:$2|เปลี่ยนแปลง}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
+'enotif_lastvisited' => 'ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่คุณเข้าชมครั้งล่าสุด',
'enotif_lastdiff' => 'ดู $1 เพื่อดูการเปลี่ยนแปลงนี้',
'enotif_anon_editor' => 'ผู้ใช้นิรนาม $1',
'enotif_body' => 'เรียน $WATCHINGUSERNAME
'deletepage' => 'ลบหน้า',
'confirm' => 'ยืนยัน',
'excontent' => "เนื้อหาเดิม: '$1'",
-'excontentauthor' => "à¹\80à¸\99ืà¹\89à¸à¸«à¸²à¹\80à¸\94ิม: '$1' (à¹\81ละมีà¸\9cูà¹\89à¹\80à¸\82ียà¸\99à¸\84à¸\99à¹\80à¸\94ียว à¸\84ืภ'[[Special:Contributions/$2|$2]]')",
+'excontentauthor' => "เนื้อหาเดิม: '$1' (และผู้เขียนคนเดียว คือ '[[Special:Contributions/$2|$2]]')",
'exbeforeblank' => "เนื้อหาก่อนถูกทำว่างคือ: '$1'",
'exblank' => 'หน้าว่าง',
'delete-confirm' => 'ลบ "$1"',
'delete-legend' => 'ลบ',
-'historywarning' => 'คำเตือน: หน้าที่คุณกำลังจะลบ มีประวัติการแก้ไขโดยประมาณ $1 {{PLURAL:$1|รุ่น}}:',
+'historywarning' => "'''คำเตือน:'''' หน้าที่คุณกำลังลบมีประวัติการแก้ไขประมาณ $1 {{PLURAL:$1|รุ่น}}:",
'confirmdeletetext' => 'คุณกำลังลบหน้า รวมทั้งประวัติทั้งหมดของหน้า
-à¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93à¹\80à¸\88à¸\95à¸\99า à¹\81ละà¸\84ุà¸\93à¹\80à¸\82à¹\89าà¹\83à¸\88à¸\9cลà¸\81ระà¸\97à¸\9a à¹\81ละà¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89สà¸à¸\94à¸\84ลà¹\89à¸à¸\87à¸\81ัà¸\9a[[{{MediaWiki:Policy-url}}|à¸\99à¹\82ยà¸\9aาย]]',
+กรุณายืนยันว่าคุณเจตนา เข้าใจผลกระทบ และการกระทำนี้สอดคล้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]',
'actioncomplete' => 'ปฏิบัติการสำเร็จ',
'actionfailed' => 'ปฏิบัติการล้มเหลว',
'deletedtext' => '"$1" ถูกลบ
'rollback-success' => 'ย้อนรุ่นที่แก้ไขโดย $1 ไปยังรุ่นล่าสุดโดย $2',
# Edit tokens
-'sessionfailure-title' => 'Session นี้ล้มเหลว',
-'sessionfailure' => 'เหมือนจะมีปัญหาเกี่ยวการล็อกอินในช่วงเวลานี้ เกิดจากทางระบบป้องกันการลักลอบการขโมยล็อกอิน กรุณาย้อนกลับไปหน้าก่อนหน้า และลองโหลดใหม่อีกครั้ง',
+'sessionfailure-title' => 'ช่วงเวลาสื่อสารล้มเหลว',
+'sessionfailure' => 'ดูเหมือนมีปัญหากับช่วงเวลาสื่อสารล็อกอินของคุณ
+การกระทำนี้ถูกยกเลิกเป็นการป้องกันการลักลอบช่วงเวลาสื่อสารไว้ก่อน
+กลับไปหน้าที่แล้ว โหลดหน้าใหม่ แล้วลองอีกครั้ง',
# Protect
'protectlogpage' => 'ปูมการล็อก',
-'protectlogtext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¸\84ืà¸à¸£à¸²à¸¢à¸\81ารà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99หน้า
-à¸\94ู[[Special:ProtectedPages|รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81à¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99]]สำหรัà¸\9aà¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99หà¸\99à¹\89าในปัจจุบัน',
-'protectedarticle' => 'à¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99 "[[$1]]"',
-'modifiedarticleprotection' => 'à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81สำหรัà¸\9a "[[$1]]"',
-'unprotectedarticle' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99จาก "[[$1]]" แล้ว',
+'protectlogtext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\81ารลà¹\87à¸à¸\81หน้า
+à¸\94ู[[Special:ProtectedPages|รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¸\96ูà¸\81ลà¹\87à¸à¸\81]]สำหรัà¸\9aà¸\81ารลà¹\87à¸à¸\81หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\9cลà¸à¸¢à¸¹à¹\88ในปัจจุบัน',
+'protectedarticle' => 'ลà¹\87à¸à¸\81 "[[$1]]"',
+'modifiedarticleprotection' => 'à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81à¸\82à¸à¸\87 "[[$1]]"',
+'unprotectedarticle' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารลà¹\87à¸à¸\81จาก "[[$1]]" แล้ว',
'movedarticleprotection' => 'ย้ายการตั้งค่าการล็อกจาก "[[$2]]" ไปยัง "[[$1]]"',
'protect-title' => 'กำลังล็อกหน้า "$1"',
-'protect-title-notallowed' => 'à¸\94ูระà¸\94ัà¸\9aà¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99ของ "$1"',
+'protect-title-notallowed' => 'à¸\94ูระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81ของ "$1"',
'prot_1movedto2' => '[[$1]] ถูกเปลี่ยนชื่อเป็น [[$2]]',
-'protect-badnamespace-title' => 'à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99ไม่ได้',
+'protect-badnamespace-title' => 'à¹\80à¸\99มสà¹\80à¸\9bà¸\8bลà¹\87à¸à¸\81ไม่ได้',
'protect-badnamespace-text' => 'หน้าในเนมสเปซนี้ไม่สามารถป้องกันได้',
+'protect-norestrictiontypes-text' => 'หน้านี้ไม่สามารถถูกล็อก เพราะไม่มีประเภทการจำกัดที่ใช้ได้',
+'protect-norestrictiontypes-title' => 'หน้าที่ล็อกไม่ได้',
'protect-legend' => 'ยืนยันการล็อก',
'protectcomment' => 'เหตุผล:',
'protectexpiry' => 'หมดอายุ:',
'protect_expiry_invalid' => 'เวลาหมดอายุไม่ถูกต้อง',
'protect_expiry_old' => 'เวลาหมดอายุผ่านมาแล้ว',
-'protect-unchain-permissions' => 'à¸\9bลà¸\94ลà¹\87à¸à¸\81à¸\95ัวà¹\80ลืà¸à¸\81à¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99อื่น ๆ',
-'protect-text' => "à¸\94ูà¹\81ละà¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81สำหรัà¸\9aหà¸\99à¹\89า '''$1'''.",
-'protect-locked-blocked' => "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81หà¸\99à¹\89าà¸\82à¸\93ะà¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87à¸à¸\81à¹\84à¸\94à¹\89 à¸\94ูระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81à¸\82à¸à¸\87หà¸\99à¹\89า '''$1''':",
-'protect-locked-dblock' => "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81หà¸\99à¹\89าà¹\84à¸\94à¹\89à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¸\90าà¸\99à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\96ูà¸\81ลà¹\87à¸à¸\81 à¸\94ูระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81à¸\82à¸à¸\87หà¸\99à¹\89า '''$1''':",
-'protect-locked-access' => "à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81หà¸\99à¹\89าà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¸\84ุà¸\93à¹\84มà¹\88มีสิà¸\97à¸\98ิ à¸\94ูระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81à¸\82à¸à¸\87หà¸\99à¹\89า '''$1''':",
-'protect-cascadeon' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87à¸à¸\81à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87{{PLURAL:$1|หà¸\99à¹\89า|หà¸\99à¹\89า}}à¸\97ีà¹\88à¸\96ูà¸\81ล็อกแบบสืบทอด
+'protect-unchain-permissions' => 'à¸\9bลà¸\94ลà¹\87à¸à¸\81à¸\95ัวà¹\80ลืà¸à¸\81à¸\81ารลà¹\87à¸à¸\81อื่น ๆ',
+'protect-text' => "à¸\97ีà¹\88à¸\99ีà¹\88à¸\84ุà¸\93สามารà¸\96à¸\94ูà¹\81ละà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81à¸\82à¸à¸\87หà¸\99à¹\89า '''$1''' à¹\84à¸\94à¹\89",
+'protect-locked-blocked' => "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81หà¸\99à¹\89าà¸\82à¸\93ะà¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87à¸à¸\81à¹\84à¸\94à¹\89 à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82à¸à¸\87หà¸\99à¹\89า '''$1''' à¸\84ืà¸:",
+'protect-locked-dblock' => "à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81à¹\84à¸\94à¹\89à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¸\90าà¸\99à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\96ูà¸\81ลà¹\87à¸à¸\81 à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82à¸à¸\87หà¸\99à¹\89า '''$1''' à¸\84ืà¸:",
+'protect-locked-access' => "à¸\9aัà¸\8dà¸\8aีà¸\82à¸à¸\87à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸à¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81หà¸\99à¹\89า à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99à¸\82à¸à¸\87หà¸\99à¹\89า '''$1''' à¸\84ืà¸:",
+'protect-cascadeon' => 'หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87à¸à¸\81à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99หà¸\99ึà¹\88à¸\87à¸\82à¸à¸\87{{PLURAL:$1|หà¸\99à¹\89า|หà¸\99à¹\89า}}à¸\97ีà¹\88à¹\80à¸\9bิà¸\94à¸\81ารล็อกแบบสืบทอด
คุณสามารถเปลี่ยนระดับการล็อกได้ แต่จะไม่มีผลต่อการล็อกแบบสืบทอด',
'protect-default' => 'อนุญาตผู้ใช้ทั้งหมด',
'protect-fallback' => 'อนุญาตเฉพาะผู้ใช้ที่มีสิทธิ "$1"',
-'protect-level-autoconfirmed' => 'à¸\9aลà¹\87à¸à¸\81à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\83หมà¹\88à¹\81ละà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99',
+'protect-level-autoconfirmed' => 'à¸à¸\99ุà¸\8dาà¸\95à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89ยืà¸\99ยัà¸\99à¸à¸±à¸\95à¹\82à¸\99มัà¸\95ิ',
'protect-level-sysop' => 'อนุญาตเฉพาะผู้ดูแลระบบ',
'protect-summary-cascade' => 'สืบทอด',
'protect-expiring' => 'หมดอายุ $1 (UTC)',
'protect-expiring-local' => 'หมดอายุ $1',
'protect-expiry-indefinite' => 'ไม่มีกำหนด',
'protect-cascade' => 'ล็อกหน้าที่เป็นส่วนหนึ่งของหน้านี้ (ล็อกแบบสืบทอด)',
-'protect-cantedit' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89 à¹\80à¸\99ืà¹\88à¸à¸\87à¸\88าà¸\81à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82สิà¹\88à¸\87à¸\99ัà¹\89à¸\99',
+'protect-cantedit' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81à¸\82à¸à¸\87หà¸\99à¹\89าà¸\99ีà¹\89 à¹\80à¸\9eราะà¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aà¸à¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82ระà¸\94ัà¸\9aà¸\81ารลà¹\87à¸à¸\81',
'protect-othertime' => 'ระยะเวลาอื่น:',
'protect-othertime-op' => 'ระยะเวลาอื่น',
'protect-existing-expiry' => 'ระยะเวลาการป้องกัน: $3, $2',
-'protect-otherreason' => 'เหตุผลอื่นเพิ่มเติม:',
-'protect-otherreason-op' => 'สาà¹\80หà¸\95ุอื่น',
+'protect-otherreason' => 'เหตุผลอื่น/เพิ่มเติม:',
+'protect-otherreason-op' => 'à¹\80หà¸\95ุà¸\9cลอื่น',
'protect-dropdown' => '* เหตุผลการป้องกันทั่วไป
** การก่อกวนจำนวนมาก
** สแปมจำนวนมาก
'restriction-upload' => 'อัปโหลด',
# Restriction levels
-'restriction-level-sysop' => 'ลà¹\87à¸à¸\81à¹\80à¸\95à¹\87มà¸\97ีà¹\88',
-'restriction-level-autoconfirmed' => 'ลà¹\87à¸à¸\81à¸\9cูà¹\89à¹\84มà¹\88ลà¹\87à¸à¸\81à¸à¸´à¸\99',
-'restriction-level-all' => 'ระดับ',
+'restriction-level-sysop' => 'ลà¹\87à¸à¸\81สมà¸\9aูรà¸\93à¹\8c',
+'restriction-level-autoconfirmed' => 'à¸\81ึà¹\88à¸\87ลà¹\87à¸à¸\81',
+'restriction-level-all' => 'à¸\97ุà¸\81ระà¸\94ัà¸\9a',
# Undelete
'undelete' => 'ดูหน้าที่ถูกลบ',
'undeletepage' => 'ดูและกู้คืนหน้าที่ถูกลบ',
-'undeletepagetitle' => "'''ต่อไปนี้เป็นรุ่นการแก้ไขของ [[:$1|$1]] ที่ถูกลบ'''",
-'viewdeletedpage' => 'หน้าที่ถูกลบ',
-'undeletepagetext' => '{{PLURAL:$1|หน้า|หน้า}}ต่อไปนี้ถูกลบไปแล้ว แต่ยังคงอยู่ในกรุซึ่งสามารถเรียกคืนได้ กรุข้อมูลอาจถูกลบเป็นระยะ',
-'undelete-fieldset-title' => 'กู้คืนรุ่นต่าง ๆ',
+'undeletepagetitle' => "'''ต่อไปนี้เป็นรุ่นการแก้ไขที่ถูกลบของ [[:$1|$1]]'''",
+'viewdeletedpage' => 'ดูหน้าที่ถูกลบ',
+'undeletepagetext' => '{{PLURAL:$1||$1 }}หน้าต่อไปนี้ถูกลบไปแล้ว แต่เนื้อหายังคงอยู่ในกรุและสามารถกู้คืนได้
+กรุอาจถูกลบเป็นระยะได้',
+'undelete-fieldset-title' => 'กู้คืนรุ่น',
'undeleteextrahelp' => "ถ้าต้องการกู้ประวัติของหน้าคืนทั้งหมด ไม่ต้องเลือกกล่องใดเลย แล้วกดปุ่ม '''''กู้คืน'''''
ถ้าต้องการกู้ประวัติคืนเฉพาะบางส่วน ให้เลือกกล่องที่มีประวัติส่วนที่ต้องการกู้ แล้วกด'''''กู้คืน'''''
กด '''''ล้างค่า''''' เพื่อลบค่าในกล่องความเห็นและกล่องตัวเลือกทั้งหมด",
'undeleterevisions' => '$1 รุ่นการแก้ไขถูกเก็บไว้',
'undeletehistory' => 'เมื่อคุณกู้หน้าใดหน้าหนึ่ง รุ่นทั้งหมดจะถูกกู้คืนไปยังประวัติ หากมีหน้าใหม่ในชื่อเดียวกันถูกสร้างขึ้นหลังจากการลบ รุ่นที่กู้คืนนั้นจะปรากฏในประวัติที่มีมาก่อน',
-'undeleterevdel' => 'จะกู้คืนไม่ได้หากการกู้คืนนั้นส่งผลให้รุ่นล่าสุดของหน้าหรือไฟล์ถูกลบไปบางส่วน ในกรณีเช่นนั้น คุณต้องไม่เลือกหรือแสดงรุ่นใหม่สุดที่ถูกลบไปก่อน',
-'undeletehistorynoadmin' => 'หน้านี้ถูกลบก่อนหน้านี้ โดยสาเหตุการลบและรายชื่อผู้ร่วมแก้ไขก่อนหน้าแสดงผลด้านล่าง สำหรับข้อมูลที่ถูกลบจะดูได้เฉพาะผู้ดูแลระบบ',
+'undeleterevdel' => 'จะกู้คืนไม่ได้หากการกู้คืนนั้นส่งผลให้รุ่นล่าสุดของหน้าหรือไฟล์ถูกลบไปบางส่วน
+ในกรณีเช่นนั้น คุณต้องไม่เลือกหรือแสดงรุ่นใหม่สุดที่ถูกลบไปก่อน',
+'undeletehistorynoadmin' => 'หน้านี้ถูกลบไปแล้ว
+มีสาเหตุการลบแสดงไว้ในคำอธิบายอย่างย่อข้างล่าง ร่วมกับรายละเอียดผู้ใช้ที่เคยแก้ไขหน้านี้ก่อนลบ
+ข้อความแท้จริงของรุ่นที่ถูกลบดูได้เฉพาะผู้ดูแลระบบ',
'undelete-revision' => 'รุ่นที่ถูกลบของหน้า $1 (ตั้งแต่ $4 เมื่อ $5) โดย $3:',
'undeleterevision-missing' => 'รุ่นไม่ถูกต้องหรือสูญหาย
คุณอาจมีลิงก์เสีย หรือรุ่นอาจถูกกู้คืนหรือนำออกจากกรุ',
'undelete-nodiff' => 'ไม่พบรุ่นก่อนหน้า',
'undeletebtn' => 'กู้คืน',
'undeletelink' => 'ดู/กู้คืน',
-'undeleteviewlink' => 'à¹\80รียà¸\81à¸\94ู',
-'undeletereset' => 'ลà¹\89าà¸\87à¸\84à¹\88า',
-'undeleteinvert' => 'à¸\81ลัà¸\9aà¸\84à¹\88าà¸\97ีà¹\88เลือก',
+'undeleteviewlink' => 'ดู',
+'undeletereset' => 'à¸\95ัà¹\89à¸\87à¹\83หมà¹\88',
+'undeleteinvert' => 'à¸\81ลัà¸\9aà¸\81ารเลือก',
'undeletecomment' => 'เหตุผล:',
'undeletedrevisions' => '$1 รุ่นการแก้ไขถูกกู้คืน',
'undeletedrevisions-files' => '$1 รุ่น และ $2 ไฟล์ถูกกู้คืน',
'undelete-header' => 'ดู [[Special:Log/delete|ปูมการลบ]] สำหรับหน้าที่ถูกลบล่าสุด',
'undelete-search-title' => 'ค้นหาหน้าที่ถูกลบ',
'undelete-search-box' => 'ค้นหาหน้าที่ถูกลบ',
-'undelete-search-prefix' => 'à¸\84à¹\89à¸\99หาหà¸\99à¹\89าà¸\97ีà¹\88à¹\80ริà¹\88มต้นด้วย:',
-'undelete-search-submit' => 'สืà¸\9aà¸\84à¹\89à¸\99',
+'undelete-search-prefix' => 'à¸\84à¹\89à¸\99หาหà¸\99à¹\89าà¸\97ีà¹\88à¸\82ึà¹\89à¸\99ต้นด้วย:',
+'undelete-search-submit' => 'à¸\84à¹\89à¸\99หา',
'undelete-no-results' => 'ไม่พบหน้าที่ตรงกันในกรุการลบ',
-'undelete-filename-mismatch' => 'ไม่สามารถกู้คืนไฟล์ $1: ชื่อไฟล์ไม่ถูกต้อง',
-'undelete-bad-store-key' => 'ไม่สามารถกู้คืนไฟล์ $1: ไม่มีไฟล์ก่อนที่จะถูกลบ',
-'undelete-cleanup-error' => 'เกิดปัญหาการลบไฟล์เก่า "$1"',
-'undelete-missing-filearchive' => 'ไม่สามารถกู้คืนไฟล์เก่ารุ่น $1 เพราะไม่มีไฟล์อยู่ในฐานข้อมูล ไฟล์อาจถูกกู้คืนไปแล้ว',
-'undelete-error' => 'เกิดข้อผิดพลาด ไม่สามารถลบหน้าเวปได้',
-'undelete-error-short' => 'เกิดปัญหาในการกู้คืนไฟล์: $1',
-'undelete-error-long' => 'เกิดความผิดพลาดระหว่างการลบไฟล์:
+'undelete-filename-mismatch' => 'ไม่สามารถกู้คืนรุ่นไฟล์ที่มีตราเวลา $1: ชื่อไฟล์ไม่ตรง',
+'undelete-bad-store-key' => 'ไม่สามารถกู้คืนรุ่นไฟล์ที่มีตราเวลา $1: ไฟล์สูญหายก่อนถูกลบ',
+'undelete-cleanup-error' => 'เกิดความผิดพลาดในการลบไฟล์กรุที่ไม่ใช้แล้ว "$1"',
+'undelete-missing-filearchive' => 'ไม่สามารถกู้คืนไฟล์เก่าหมายเลข $1 เพราะไม่มีข้อมูลในฐานข้อมูล
+ไฟล์อาจถูกกู้คืนไปแล้ว',
+'undelete-error' => 'เกิดข้อผิดพลาดในการกู้คืนหน้า',
+'undelete-error-short' => 'เกิดข้อผิดพลาดในการกู้คืนไฟล์: $1',
+'undelete-error-long' => 'เกิดข้อผิดพลาดขณะกู้คืนไฟล์:
$1',
-'undelete-show-file-confirm' => 'à¹\81à¸\99à¹\88à¹\83à¸\88หรืà¸à¹\84มà¹\88วà¹\88าà¸\84ุà¸\93à¸\95à¹\89à¸à¸\87à¸\81ารà¸\88ะà¸\94ูรุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¹\84à¸\9b สำหรัà¸\9aไฟล์ "<nowiki>$1</nowiki>" ตั้งแต่ $2 เมื่อ $3',
+'undelete-show-file-confirm' => 'à¸\84ุà¸\93à¹\81à¸\99à¹\88à¹\83à¸\88หรืà¸à¸§à¹\88าà¸\95à¹\89à¸à¸\87à¸\81ารà¸\94ูรุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¸\82à¸à¸\87ไฟล์ "<nowiki>$1</nowiki>" ตั้งแต่ $2 เมื่อ $3',
'undelete-show-file-submit' => 'ใช่',
# Namespace form on various pages
'month' => 'จากเดือน (และก่อนหน้า):',
'year' => 'จากปี (และก่อนหน้า):',
-'sp-contributions-newbies' => 'à¹\81สà¸\94à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ใหม่เท่านั้น',
-'sp-contributions-newbies-sub' => 'สำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89ใหม่',
+'sp-contributions-newbies' => 'à¹\81สà¸\94à¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82à¸à¸\87à¸\9aัà¸\8dà¸\8aีใหม่เท่านั้น',
+'sp-contributions-newbies-sub' => 'สำหรัà¸\9aà¸\9aัà¸\8dà¸\8aีใหม่',
'sp-contributions-newbies-title' => 'เรื่องที่เขียนโดยบัญชีใหม่',
'sp-contributions-blocklog' => 'ปูมการบล็อก',
'sp-contributions-deleted' => 'การแก้ไขที่ถูกลบ',
** ใส่ข้อมูลเท็จ
** ลบเนื้อหาในหน้าออก
** ใส่ลิงก์สแปม
-** ใส่ข้อความขยะเข้ามา
-** à¸\84ุà¸\81à¸\84ามà¸\9cูà¹\89à¸à¸·à¹\88น
-** à¸\81à¹\88à¸à¸\81วà¸\99à¸\9cูà¹\89à¸à¸·à¹\88à¸\99
-** à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\84มà¹\88สุภาà¸\9eหรืà¸à¹\84มà¹\88à¸\84วรà¹\83à¸\8a้',
+** à¹\83สà¹\88à¸\82à¹\89à¸à¸\84วามà¹\84รà¹\89สาระ/à¸\82ยะà¹\80à¸\82à¹\89ามา
+** à¸\9eฤà¸\95ิà¸\81รรมà¸\82à¹\88มà¸\82ูà¹\88/รัà¸\87à¸\84วาน
+** à¹\83à¸\8aà¹\89หลายà¸\9aัà¸\8dà¸\8aีà¹\83à¸\99à¸\97าà¸\87à¸\97ีà¹\88à¸\9cิà¸\94
+** à¸\8aืà¹\88à¸à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\84มà¹\88à¸à¸²à¸\88ยà¸à¸¡à¸£à¸±à¸\9aà¹\84à¸\94้',
'ipb-hardblock' => 'ป้องกันไม่ให้ผู้ใช้ล็อกอินแก้ไขจากเลขที่อยู่ไอพีนี้',
'ipbcreateaccount' => 'ป้องกันการสร้างบัญชี',
'ipbemailban' => 'ป้องกันมิให้ผู้ใช้ส่งอีเมล',
'ipb-change-block' => 'บล็อกผู้ใช้อีกครั้งด้วยการตั้งค่าเหล่านี้',
'ipb-confirm' => 'ยืนยันการบล็อก',
'badipaddress' => 'เลขที่อยู่ไอพีไม่ถูกต้อง',
-'blockipsuccesssub' => 'à¸\9aลà¹\87à¸à¸\81สำà¹\80รà¹\87à¸\88',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] à¸\96ูà¸\81à¸\9aลà¹\87à¸à¸\81<br />
-ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก',
+'blockipsuccesssub' => 'à¸\9aลà¹\87à¸à¸\81à¹\80รียà¸\9aรà¹\89à¸à¸¢',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] à¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aลà¹\87à¸à¸\81à¹\81ลà¹\89ว<br />
+ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อกดังกล่าว',
'ipb-blockingself' => 'คุณกำลังบล็อกตัวเอง! แน่ใจแล้วหรือว่าต้องการทำอย่างนั้น',
+'ipb-confirmhideuser' => 'คุณกำลังบล็อกผู้ใช้โดยเป็นผู้ใช้ "ซ่อนผู้ใช้" ซึ่งจะระงับชื่อผู้ใช้ในรายการและหน่วยปูมทั้งหมด คุณแน่ใจหรือว่าต้องการดำเนินการเช่นนั้น',
'ipb-edit-dropdown' => 'แก้ไขสาเหตุการบล็อก',
-'ipb-unblock-addr' => 'à¹\80ลิà¸\81บล็อก $1',
-'ipb-unblock' => 'à¹\80ลิà¸\81บล็อกผู้ใช้หรือเลขที่อยู่ไอพี',
+'ipb-unblock-addr' => 'à¸\9bลà¸\94บล็อก $1',
+'ipb-unblock' => 'à¸\9bลà¸\94บล็อกผู้ใช้หรือเลขที่อยู่ไอพี',
'ipb-blocklist' => 'ดูการบล็อกปัจจุบัน',
'ipb-blocklist-contribs' => 'ผลงานเขียนโดย $1',
'unblockip' => 'ปลดบล็อกผู้ใช้',
-'unblockiptext' => 'à¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87สำหรัà¸\9aคืนสิทธิการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก',
+'unblockiptext' => 'à¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88à¸คืนสิทธิการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก',
'ipusubmit' => 'ยกเลิกการบล็อกนี้',
'unblocked' => '[[User:$1|$1]] ถูกบล็อก',
'unblocked-range' => '$1 ถูกปลดบล็อกแล้ว',
'blocklist-userblocks' => 'ซ่อนบล็อกบัญชี',
'blocklist-tempblocks' => 'ซ่อนบล็อกชั่วคราว',
'blocklist-addressblocks' => 'ซ่อนบล็อกไอพีเดียว',
+'blocklist-rangeblocks' => 'ซ่อนการบล็อกช่วง',
'blocklist-timestamp' => 'ตราเวลา',
'blocklist-target' => 'เป้าหมาย',
'blocklist-expiry' => 'หมดอายุ',
'blocklist-by' => 'ผู้ดูแลระบบที่บล็อก',
'blocklist-params' => 'พารามิเตอร์การบล็อก',
'blocklist-reason' => 'เหตุผล',
-'ipblocklist-submit' => 'สืà¸\9aà¸\84à¹\89à¸\99',
-'ipblocklist-localblock' => 'à¸\81ารสà¸\81ัà¸\94à¸\81ัà¹\89à¸\99ภายในวิกินี้',
-'ipblocklist-otherblocks' => '{{PLURAL:$1|à¸\81ารสà¸\81ัà¸\94à¸\81ัà¹\89à¸\99}}à¸à¸·à¹\88à¸\99à¹\86',
+'ipblocklist-submit' => 'à¸\84à¹\89à¸\99หา',
+'ipblocklist-localblock' => 'à¸\81ารà¸\9aลà¹\87à¸à¸\81ในวิกินี้',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|à¸\81ารà¸\9aลà¹\87à¸à¸\81}}à¸à¸·à¹\88à¸\99',
'infiniteblock' => 'ไม่มีกำหนด',
'expiringblock' => 'หมดอายุ $1 เวลา $2',
'anononlyblock' => 'ไม่ล็อกอินเท่านั้น',
'noautoblockblock' => 'ยกเลิกการบล็อกอัตโนมัติ',
-'createaccountblock' => 'à¸\9aลà¹\87à¸à¸\81การสร้างบัญชีผู้ใช้ใหม่',
-'emailblock' => 'à¸\9aลà¹\87à¸à¸\81à¸\81ารสà¹\88à¸\87อีเมล',
-'blocklist-nousertalk' => 'à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸à¸ ิà¸\9bรายของตนเอง',
+'createaccountblock' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99การสร้างบัญชีผู้ใช้ใหม่',
+'emailblock' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99อีเมล',
+'blocklist-nousertalk' => 'à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89ของตนเอง',
'ipblocklist-empty' => 'รายการบล็อกว่าง',
'ipblocklist-no-results' => 'เลขที่อยู่ไอพีหรือชื่อผู้ใช้ที่ต้องการไม่ได้ถูกบล็อก',
'blocklink' => 'บล็อก',
# Move page
'move-page' => 'ย้าย $1',
'move-page-legend' => 'เปลี่ยนชื่อ',
-'movepagetext' => "à¸\81ารà¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\88ะà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88à¸à¸«à¸\99à¹\89า à¹\81ละยà¹\89ายà¸\9bระวัà¸\95ิà¸\97ัà¹\89à¸\87หมà¸\94à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87ใหม่
+'movepagetext' => "à¸\81ารà¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\88ะสà¹\88à¸\87à¸\9cลà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88à¸à¸«à¸\99à¹\89า à¹\81ละยà¹\89ายà¸\9bระวัà¸\95ิà¸\97ัà¹\89à¸\87หมà¸\94à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88à¸ใหม่
ชื่อเรื่องเก่าจะกลายเป็นหน้าเปลี่ยนทางไปยังชื่อเรื่องใหม่
คุณสามารถปรับให้หน้าเปลี่ยนทางที่ชี้ไปยังชื่อเรื่องเดิมได้อัตโนมัติ
แต่หากคุณเลือกไม่ทำเช่นนั้น ให้แน่ใจว่าตรวจสอบ[[Special:DoubleRedirects|หน้าเปลี่ยนทางซ้ำซ้อน]]หรือ[[Special:BrokenRedirects|หน้าเปลี่ยนทางที่เสีย]]
คุณเป็นผู้รับผิดชอบเพื่อให้แน่ใจว่าลิงก์ต่าง ๆ ยังชี้ไปยังที่ที่สมควร
-โปรดทราบว่าหน้าดังกล่าวจะ'''ไม่'''ถูกย้าย ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่อยู่แล้ว เว้นแต่เป็นหน้าเปลี่ยนทาง และไม่มีประวัติการแก้ไขในอดีต
+à¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าหà¸\99à¹\89าà¸\94ัà¸\87à¸\81ลà¹\88าวà¸\88ะ'''à¹\84มà¹\88'''à¸\96ูà¸\81ยà¹\89าย à¸\96à¹\89ามีหà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87à¹\83หมà¹\88à¸à¸¢à¸¹à¹\88à¹\81ลà¹\89ว à¹\80วà¹\89à¸\99à¹\81à¸\95à¹\88หà¸\99à¹\89าà¸\99ัà¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87 à¹\81ละà¹\84มà¹\88มีà¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\99à¸à¸\94ีà¸\95
ซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้ากลับเป็นชื่อเดิมได้หากคุณทำผิดพลาด และคุณไม่สามารถเขียนทับหน้าที่มีอยู่แล้วได้
'''คำเตือน!'''
# Namespace 8 related
'allmessages' => 'ข้อความของระบบ',
'allmessagesname' => 'ชื่อ',
-'allmessagesdefault' => 'ข้อความตั้งต้น',
+'allmessagesdefault' => 'à¸\82à¹\89à¸à¸\84วามà¸\95ามà¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99',
'allmessagescurrent' => 'ข้อความปัจจุบัน',
'allmessagestext' => 'รายการข้อความของระบบ อยู่ในเนมสเปซมีเดียวิกิ
กรุณาไปที่ [//www.mediawiki.org/wiki/Localisation มีเดียวิกิ] และ [//translatewiki.new translatewiki.net] ถ้าคุณยังอยากที่จะแปลข้อความของระบบมีเดียวิกิ',
# Thumbnails
'thumbnail-more' => 'ขยาย',
-'filemissing' => 'à¹\84มà¹\88à¹\80à¸\88à¸à¹\84à¸\9fลà¹\8c',
+'filemissing' => 'à¹\84à¸\9fลà¹\8cสูà¸\8dหาย',
'thumbnail_error' => 'เกิดปัญหาไม่สามารถทำรูปย่อได้: $1',
'djvu_page_error' => 'หน้าเดจาวู (DjVu) เกินขนาด',
'djvu_no_xml' => 'ไม่สามารถส่งเอกซ์เอ็มแอล (XML) สำหรับไฟล์เดจาวู (DjVu)',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'หน้าผู้ใช้ของคุณ',
-'tooltip-pt-anonuserpage' => 'หà¸\99à¹\89าà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82à¸à¸\87หมายà¹\80ลà¸\82à¹\84à¸à¸\9eีà¸\97ีà¹\88แก้ไข',
+'tooltip-pt-anonuserpage' => 'หà¸\99à¹\89าà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82à¸à¸\87à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\83à¸\8aà¹\89แก้ไข',
'tooltip-pt-mytalk' => 'หน้าอภิปรายของคุณ',
-'tooltip-pt-anontalk' => 'à¸\9eูà¸\94à¸\84ุยà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\88าà¸\81หมายà¹\80ลà¸\82à¹\84à¸à¸\9eี',
+'tooltip-pt-anontalk' => 'à¸\9eูà¸\94à¸\84ุยà¹\80à¸\81ีà¹\88ยวà¸\81ัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88à¸à¸¢à¸¹à¹\88à¹\84à¸à¸\9eีà¸\99ีà¹\89',
'tooltip-pt-preferences' => 'ตั้งค่าการใช้งานส่วนตัว',
-'tooltip-pt-watchlist' => 'รายà¸\81ารà¸\97ีà¹\88เฝ้าดูการแก้ไข',
+'tooltip-pt-watchlist' => 'รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93เฝ้าดูการแก้ไข',
'tooltip-pt-mycontris' => 'รายการหน้าที่คุณเขียน',
'tooltip-pt-login' => 'ไม่จำเป็นต้องล็อกอินในการแก้ไข แต่แนะนำอย่างยิ่งให้ล็อกอิน',
'tooltip-pt-anonlogin' => 'ไม่จำเป็นต้องล็อกอินในการแก้ไข แต่แนะนำอย่างยิ่งให้ล็อกอิน',
'notacceptable' => 'เซิร์ฟเวอร์ของวิกิไม่สามารถให้ข้อมูลในรูปแบบที่ไคลเอนต์สามารถอ่านได้',
# Attribution
-'anonymous' => '{{PLURAL:$1|ผู้ใช้}}นิรนามของ {{SITENAME}}',
+'anonymous' => '{{PLURAL:$1|ผู้ใช้|ผู้ใช้}}นิรนามของ{{SITENAME}}',
'siteuser' => 'ผู้ใช้ $1 จาก {{SITENAME}}',
'anonuser' => 'ผู้ใช้นิรนามจาก {{SITENAME}} $1',
'lastmodifiedatby' => 'แก้ไขล่าสุดเมื่อเวลา $2 $1 โดย $3',
# Spam protection
'spamprotectiontitle' => 'ตัวกรองป้องกันสแปม',
-'spamprotectiontext' => 'หน้าที่คุณต้องการบันทึกโดนบล็อกด้วยตัวกรองสแปม ซึ่งอาจเกิดจากมีลิงก์ไปยังเว็บไซต์ภายนอกที่อยู่ในบัญชีดำ',
-'spamprotectionmatch' => 'ข้อความต่อไปนี้ได้ทำให้ตัวกรองสแปมของเราทำงาน: $1',
+'spamprotectiontext' => 'ข้อความที่คุณต้องการบันทึกถูกตัวกรองสแปมบล็อก
+อาจเกิดจากลิงก์ไปยังเว็บไซต์ภายนอกที่ถูกขึ้นบัญชีดำ',
+'spamprotectionmatch' => 'ข้อความต่อไปนี้กระตุ้นให้ตัวกรองสแปมของเราทำงาน: $1',
'spambot_username' => 'กวาดล้างมีเดียวิกิสแปม',
'spam_reverting' => 'ย้อนกลับไปรุ่นก่อนหน้าที่ไม่มีลิงก์ไปยังเว็บ $1',
'spam_blanking' => 'รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)',
+'spam_deleting' => 'ทุกรุ่นที่มีลิงก์ไปยัง $1 กำลังลบ',
# Info page
'pageinfo-title' => 'ข้อมูลสำหรับ "$1"',
'pageinfo-robot-policy' => 'สถานะเสิร์ชเอนจิน',
'pageinfo-views' => 'จำนวนการเข้าดู',
'pageinfo-watchers' => 'จำนวนผู้เข้าดูหน้า',
+'pageinfo-few-watchers' => '{{PLURAL:$1|ผู้เฝ้าดู|ผู้เฝ้าดู}}น้อยกว่า $1 คน',
'pageinfo-redirects-name' => 'หน้าเปลี่ยนทางมายังหน้านี้',
'pageinfo-subpages-name' => 'หน้าย่อยของหน้านี้',
'pageinfo-subpages-value' => '$1 ($2 หน้าเปลี่ยนทาง; $3 หน้าไม่เปลี่ยนทาง)',
'showhidebots' => '($1 บอต)',
'noimages' => 'ไม่มีให้ดู',
'ilsubmit' => 'สืบค้น',
-'bydate' => 'วันที่',
+'bydate' => 'à¸\95ามวัà¸\99à¸\97ีà¹\88',
'sp-newimages-showfrom' => 'แสดงภาพใหม่เริ่มต้นจาก $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'monthsall' => 'ทั้งหมด',
'limitall' => 'ทั้งหมด',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'ยืนยันอีเมล',
'confirmemail_noemail' => 'ไม่ได้ใส่อีเมลในส่วน [[Special:Preferences|การตั้งค่าส่วนตัว]]',
-'confirmemail_text' => 'ถ้าต้องการใช้คำสั่งพิเศษในด้านอีเมสล จำเป็นต้องใส่ค่าอีเมลก่อน โดยกดที่ปุ่มด้านล่าง และทางระบบจะส่งไปที่อีเมลนี้ ในอีเมลจะมีลิงก์ซึ่งมีรหัสสำหรับยืนยันอีเมล',
-'confirmemail_pending' => 'รหัสยืนยันได้ถูกส่งไปที่อีเมลของคุณ ถ้าได้สร้างบัญชีเร็วนี้ ให้รอซักครู่ก่อนที่จะขอรหัสอีกครั้งหนึ่ง',
-'confirmemail_send' => 'ส่งรหัสยืนยันผ่านทางอีเมล',
-'confirmemail_sent' => 'อีเมลยืนยันได้ส่งเรียบร้อย',
-'confirmemail_oncreate' => 'รหัสยืนยันได้ถูกส่งไปที่อีเมล อย่างไรก็ตามรหัสนี้ไม่จำเป็นสำหรับการล็อกอิน เว้นเสียแต่ว่าต้องการใช้คำสั่งพิเศษในด้านอีเมลของวิกินี้',
-'confirmemail_sendfailed' => 'ขออภัย {{SITENAME}} ไม่สามารถส่งอีเมลให้คุณยืนยันการใช้งานได้
-กรุณาตรวจสอบอีเมลว่าถูกต้อง และไม่มีอักขระที่ไม่สามารถใช้ได้
+'confirmemail_text' => '{{SITENAME}} กำหนดให้คุณตรวจสอบความสมเหตุสมผลของที่อยู่อีเมลของคุณก่อนใช้คุณลักษณะอีเมล
+เปิดใช้งานปุ่มด้านล่างเพื่อส่งเมลยืนยันไปยังที่อยู่ของคุณ
+เมลจะรวมลิงก์ซึ่งมีรหัส
+โหลดลิงก์ในเบราว์เซอร์ของคุณเพื่อยืนยันว่าที่อยู่อีเมลของคุณสมเหตุสมผล',
+'confirmemail_pending' => 'รหัสยืนยันถูกอีเมลไปหาคุณแล้ว
+ถ้าคุณเพิ่งสร้างบัญชี คุณอาจอยากรอสักครู่ให้ส่งไปถึงก่อนพยายามขอรหัสใหม่',
+'confirmemail_send' => 'ส่งรหัสยืนยันทางอีเมล',
+'confirmemail_sent' => 'ส่งอีเมลยืนยันแล้ว',
+'confirmemail_oncreate' => 'รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ
+รหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้',
+'confirmemail_sendfailed' => '{{SITENAME}} ไม่สามารถส่งเมลยืนยันได้
+โปรดตรวจสอบที่อยู่อีเมลว่าไม่มีอักขระที่ไม่สมเหตุสมผล
ข้อความตีกลับ: $1',
-'confirmemail_invalid' => 'รหัสยืนยันไม่ถูกต้อง หรือรหัสหมดอายุ',
-'confirmemail_needlogin' => 'ต้องทำการ $1 เพื่อยืนยันอีเมลของคุณว่าถูกต้อง',
-'confirmemail_success' => 'อีเมลคุณได้รับการยืนยันแล้ว คุณอาจจะล็อกอินและมีความสุขกับวิกิ',
+'confirmemail_invalid' => 'รหัสยืนยันไม่ถูกต้อง
+รหัสอาจหมดอายุแล้ว',
+'confirmemail_needlogin' => 'ต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ',
+'confirmemail_success' => 'อีเมลคุณได้รับการยืนยันแล้ว ขณะนี้คุณสามารถ[[Special:UserLogin|ล็อกอิน]]และมีความสุขกับวิกินี้',
'confirmemail_loggedin' => 'อีเมลคุณได้รับการยืนยันแล้ว',
-'confirmemail_error' => 'มีà¸\9bัà¸\8dหาà¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¹\83à¸\99à¸\81ารยืà¸\99ยัà¸\99à¸à¸µà¹\80มล',
-'confirmemail_subject' => '{{SITENAME}} ยืนยันการใช้งานอีเมล',
+'confirmemail_error' => 'à¹\80à¸\81ิà¸\94à¸\9bัà¸\8dหาà¸\82à¸\93ะà¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารยืà¸\99ยัà¸\99à¸\82à¸à¸\87à¸\84ุà¸\93',
+'confirmemail_subject' => 'การยืนยันที่อยู่อีเมล {{SITENAME}}',
'confirmemail_body' => 'ใครบางคน ซึ่งอาจจะเป็นคุณ จากหมายเลขไอพี $1 ได้ลงทะเบียนในชื่อ "$2" โดยใช้อีเมลนี้ที่ {{SITENAME}}
เพื่อยืนยันว่าบัญชีผู้ใช้นี้เป็นของคุณอย่างแน่อน และใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} กดลิงก์นี้ในเว็บเบราวเซอร์ของคุณ:
[[Special:Preferences|{{SITENAME}} tercihlerinizi]] değiştirmeyi unutmayın.',
'yourname' => 'Kullanıcı adı:',
'yourpassword' => 'Parola:',
-'yourpasswordagain' => 'Parolayı yeniden yaz:',
+'yourpasswordagain' => 'Parolayı yeniden girin:',
'remembermypassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
'securelogin-stick-https' => "Giriş yaptıktan sonra HTTPS'e bağlı kal",
'yourdomainname' => 'Alan adınız:',
'logout' => 'Oturumu kapat',
'userlogout' => 'Oturumu kapat',
'notloggedin' => 'Oturum açık değil',
-'nologin' => "Kayıtlı değil misiniz? '''$1'''",
+'nologin' => 'Bir hesabınız yok mu? $1.',
'nologinlink' => 'Hesap oluşturun',
'createaccount' => 'Hesap oluştur',
-'gotaccount' => "Çoktan kayıt oldunuz mu? '''$1'''.",
+'gotaccount' => 'Zaten bir hesabınız var mı? $1.',
'gotaccountlink' => 'Oturum açın',
'userlogin-resetlink' => 'Giriş bilgilerinizi mi unuttunuz?',
'createaccountmail' => 'Geçici bir rastgele şifre kullan ve şifreyi aşağıda belirtilen e-posta adresine gönder',
'loginlanguagelabel' => 'Dil: $1',
'suspicious-userlogout' => 'Çıkış isteğiniz reddedildi çünkü bozuk bir tarayıcı ya da önbellekli vekil tarafından gönerilmiş gibi görünüyor.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => "PHP's mail() fonksiyonunda bilinmeyen hata",
'user-mail-no-addy' => 'Bir e-posta adresi olmadan e-posta göndermeye çalıştı.',
'italic_tip' => 'Eğik yazı',
'link_sample' => 'Bağlantı başlığı',
'link_tip' => 'İç bağlantı',
-'extlink_sample' => 'http://www.example.com adres açıklaması',
+'extlink_sample' => 'http://www.example.com bağlantı başlığı',
'extlink_tip' => 'Dış bağlantı (Adresin önüne http:// koymayı unutmayın)',
'headline_sample' => 'Başlık metni',
'headline_tip' => '2. seviye başlık',
'revisionasof' => '$1 tarihindeki hâli',
'revision-info' => '$2 tarafından oluşturulmuş $1 tarihli sürüm',
'previousrevision' => '← Önceki hâli',
-'nextrevision' => 'Sonraki hali →',
+'nextrevision' => 'Sonraki hâli →',
'currentrevisionlink' => 'en güncel halini göster',
'cur' => 'fark',
'next' => 'sonraki',
'search-interwiki-default' => '$1 sonuçlar:',
'search-interwiki-more' => '(daha çok)',
'search-relatedarticle' => 'ilgili',
-'mwsuggest-disable' => 'AJAX önerilerini devre dışı bırak',
+'mwsuggest-disable' => 'Arama önerilerini devre dışı bırak',
'searcheverything-enable' => 'Tüm ad alanlarında ara',
'searchrelated' => 'ilgili',
'searchall' => 'hepsi',
'prefs-help-gender' => 'İsteğe bağlı: Yazılım tarafından doğru cinsiyet adreslemesi için kullanılır. Bu bilgi umumi olacaktır.',
'email' => 'E-posta',
'prefs-help-realname' => '* Gerçek isim (isteğe bağlı): eğer gerçek isminizi vermeyi seçerseniz, çalışmanızı size atfederken kullanılacaktır.',
-'prefs-help-email' => 'E-posta adresi isteğe bağlıdır; ancak eğer parolanızı unutursanız e-posta adresinize yeni parola gönderilmesine olanak sağlar.',
+'prefs-help-email' => 'E-posta adresi isteğe bağlıdır; ancak parolanızı unutmanız durumunda parola sıfırlamak için gerekecektir.',
'prefs-help-email-others' => 'Ayrıca kullanıcı sayfanızdaki bir bağlantı yoluyla diğer kullanıcıların size e-posta atmasına izin vermeyi seçebilirsiniz.
Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz açıklanmaz.',
'prefs-help-email-required' => 'E-posta adresi gerekmektedir.',
'prefs-displaywatchlist' => 'Görüntüleme seçenekleri',
'prefs-diffs' => 'Farklar',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-posta adresi geçerli görünüyor',
'email-address-validity-invalid' => 'Geçerli bir e-posta adresi girin',
'listgrouprights-addgroup-self-all' => 'Kendi hesabına tüm grupları ekleyebilir',
'listgrouprights-removegroup-self-all' => 'Kendi hesabından tüm grupları çıkarabilir',
-# E-mail user
+# Email user
'mailnologin' => 'Gönderi adresi yok.',
'mailnologintext' => 'Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.',
'emailuser' => 'Bu kullanıcıya e-posta gönder',
'nocontribs' => 'Bu kriterlere uyan değişiklik bulunamadı',
'uctop' => '(son)',
'month' => 'Ay:',
-'year' => 'Yıl:',
+'year' => 'Bu yıla kadar (ve önceki yıllar):',
'sp-contributions-newbies' => 'Sadece yeni kullanıcıların katkılarını göster',
'sp-contributions-newbies-sub' => 'Yeni kullanıcılar için',
'monthsall' => 'hepsi',
'limitall' => 'tümü',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'E-posta adresini onayla',
'confirmemail_noemail' => '[[Special:Preferences|Kullanıcı tercihlerinizde]] tanımlanmış uygun bir e-posta adresiniz yok.',
'confirmemail_text' => "Viki'nin e-posta işlevlerini kullanmabilmek için, önce e-posta adresinizin doğrulanması gerekiyor.
'autosumm-blank' => 'Sayfayı boşalttı',
'autosumm-replace' => "Sayfa içeriği '$1' ile değiştiriliyor",
'autoredircomment' => '[[$1]] sayfasına yönlendirildi',
-'autosumm-new' => "Sayfa oluşturdu, içeriği: '$1'",
+'autosumm-new' => 'Yeni sayfa: "$1"',
# Live preview
'livepreview-loading' => 'Yükleniyor...',
Сез {{SITENAME}} проектында аноним рәвештә кала яисә шул ук яки башка исем белән яңадан <span class='plainlinks'>[$1 керә]</span> аласыз.
Кайбер битләр Сез кергән кебек күрсәтелергә мөмкин. Моны бетерү өчен браузер кэшын чистартыгыз.",
+'welcomeuser' => 'Хуш килдегез, $1!',
'yourname' => 'Кулланучы исеме:',
'yourpassword' => 'Серсүз:',
'yourpasswordagain' => 'Серсүзне кабат кертү:',
'loginlanguagelabel' => 'Тел: $1',
'suspicious-userlogout' => 'Сезнең эшчәнлекне бетерү соравыгыз кире кагылды, чөнки ул ялгыш браузер яисә кэшлаучы прокси аша җибәрелергэ мөмкин.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'PHP mail() функциясендә билгесез хата',
'user-mail-no-addy' => 'Электрон почта адресыннан башка электрон хат җибәрмәкче булды',
'changeemail-oldemail' => 'Хәзерге электрон әрҗә адресы:',
'changeemail-newemail' => 'Яңа электрон почта адресы:',
'changeemail-none' => '(юк)',
+'changeemail-password' => '«{{SITENAME}}» проекты өчен серсүзегез:',
'changeemail-submit' => 'E-mail адресын үзгәртү',
'changeemail-cancel' => 'Баш тарту',
Мондый хаталар аноним web-проксилар кулланганда килеп чыгарга мөмкин.",
'edit_form_incomplete' => "'''Төзәтү кырларының кайбер өлешләре серверга барып ирешмәде. Сезнең үзгәртүләр бозылмаганмы - игътибар белән тикшерегез һәм яңадан җибәреп карагыз.'''",
'editing' => '«$1» битен үзгәртү',
+'creating' => '«$1» битен ясау',
'editingsection' => '«$1» битендә бүлек үзгәртүе',
'editingcomment' => '«$1» битен үзгәртү (яңа бүлек)',
'editconflict' => 'Үзгәртү конфликты: $1',
'allpagesnext' => 'Киләсе',
'allpagessubmit' => 'Башкару',
'allpagesprefix' => 'Алкушымчалы битләрне күрсәтү:',
+'allpages-hide-redirects' => 'Юнәлтүләрне яшер',
# Special:Categories
'categories' => 'Төркемнәр',
'listgrouprights-helppage' => 'Help:Төркемнәрнең хокуклары',
'listgrouprights-members' => '(төркем исемлеге)',
-# E-mail user
+# Email user
'emailuser' => 'Бу кулланучыга хат',
'emailuser-title-target' => '{{GENDER:$1|Кулланучыга}} электрон хат язу',
'emailuser-title-notarget' => 'Кулланучыга хат җибәрү',
'hijri-calendar-m7' => 'Раҗәб',
'hijri-calendar-m9' => 'Рамазан',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|бәхәс]])',
+
# Core parser functions
'duplicate-defaultsort' => 'Игътибар. Уйланма куелган "$2" бүлгәләү ачкычы элеккеге уйланма куелган "$1" бүлгәләү ачкычын үзгәртә.',
* @author AlexSm
* @author Andrijko Z.
* @author Arturyatsko
+ * @author AtUkr
* @author Base
* @author Dim Grits
* @author DixonD
'loginlanguagelabel' => 'Мова: $1',
'suspicious-userlogout' => 'Ваш запит на завершення сеанса відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Невідома помилка в PHP-mail() функції',
'user-mail-no-addy' => 'Спроба надсилання електронної пошти без зазначеної адреси електронної пошти.',
'user-mail-no-body' => 'Спроба надіслати електронного листа з порожнім або надто коротким вмістом.',
'prefs-displaywatchlist' => 'Налаштування показу',
'prefs-diffs' => 'Різниці версій',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Адреса електронної пошти є чинною',
'email-address-validity-invalid' => 'Введіть чинну адресу електронної пошти',
Ймовірно, вони повинні вказувати на відповідну конкретну статтю.<br />
Сторінка вважається багатозначною, якщо на ній розміщений шаблон, назва якого є на сторінці [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Сторінки з перевизначеними властивостями',
+'pageswithprop-legend' => 'Сторінки з перевизначеними властивостями',
+'pageswithprop-text' => 'Тут перераховані сторінки, у яких були вручну перевизначені окремі властивості.',
+'pageswithprop-prop' => 'Назва властивості:',
+'pageswithprop-submit' => 'Перейти',
+
'doubleredirects' => 'Подвійні перенаправлення',
'doubleredirectstext' => 'На цій сторінці наведено список перенаправлень на інші перенаправлення.
Кожен рядок містить посилання на перше та друге перенаправлення, а також перший рядок тексту другого перенаправлення, що зазвичай містить «реальне» перенаправлення на необхідну сторінку, куди повинно вказувати й перше перенаправлення.
'listgrouprights-addgroup-self-all' => 'Може додавати всі групи до свого облікового запису',
'listgrouprights-removegroup-self-all' => 'може вилучати всі групи зі свого облікового запису',
-# E-mail user
+# Email user
'mailnologin' => 'Відсутня адреса для відправки',
'mailnologintext' => 'Ви повинні [[Special:UserLogin|ввійти до системи]] і мати підтверджену адресу електронної пошти у ваших [[Special:Preferences|налаштуваннях]], щоб мати змогу надсилати електронну пошту іншим користувачам.',
'emailuser' => 'Надіслати листа',
'importinterwiki' => 'Міжвікі імпорт',
'import-interwiki-text' => 'Вкажіть вікі й назву імпортованої сторінки.
Дати змін й імена авторів буде збережено.
-Ð\92Ñ\81Ñ\96 опеÑ\80аÑ\86Ñ\96Ñ\97 межвÑ\96кÑ\96 імпорту реєструються в [[Special:Log/import|відповідному протоколі]].',
+УÑ\81Ñ\96 опеÑ\80аÑ\86Ñ\96Ñ\97 мÑ\96жвÑ\96кÑ\96-імпорту реєструються в [[Special:Log/import|відповідному протоколі]].',
'import-interwiki-source' => 'Вікі/сторінка-джерело',
'import-interwiki-history' => 'Копіювати всю історію змін цієї сторінки',
'import-interwiki-templates' => 'Включити всі шаблони',
'monthsall' => 'всі',
'limitall' => 'усі',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Підтвердження адреси ел. пошти',
'confirmemail_noemail' => 'Ви не зазначили коректну адресу електронної пошти у ваших [[Special:Preferences|налаштуваннях користувача]].',
'confirmemail_text' => 'Вікі-двигун потребує підтвердження адреси електронної пошти перед початком роботи. Натисніть на кнопку, щоб за вказаною адресою одержати листа, який міститиме посилання на спеціальну сторінку, після відкриття якої у браузері адреса електронної пошти буде вважатися підтвердженою.',
'version-entrypoints' => 'URL-адреса точки входу',
'version-entrypoints-header-entrypoint' => 'Точка входу',
'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях до статей]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Шлях до скриптів]',
# Special:FilePath
'filepath' => 'Шлях до файлу',
$messages = array(
# User preference toggles
'tog-underline' => 'Havolalarning tagiga chizish:',
-'tog-justify' => "Matnni sahifaning eni bo'yicha tekislash",
-'tog-hideminor' => "Yangi oʻzgarishlar ro'yxatida kichik tahrirlarni yashirish",
-'tog-hidepatrolled' => 'Yangi oʻzgarishlar roʻyxatida patrullangan tahrirlarni yashirish',
-'tog-newpageshidepatrolled' => "Yangi sahifalar ro'yxatida patrullangan sahifalarni yashirish",
-'tog-numberheadings' => 'Sarlavhalarni avtomatik tarzda raqamlash',
-'tog-showtoolbar' => "Tahrirlash vaqtida yuqorigi unsurlar darchasini ko'rsatish (JavaScript)",
-'tog-editsection' => "[tahrir] havolasini har bir seksiyada ko'rsatish",
-'tog-showtoc' => "Mundarijani ko'rsatish (3 ta sarlavhadan ko'p bo'lgan sahifalar uchun)",
-'tog-rememberpassword' => 'Hisob ma’lumotlarini ushbu kompyuterda eslab qolish (eng ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
+'tog-justify' => 'Matnni sahifaning eni boʻyicha tekislash',
+'tog-hideminor' => 'Yangi oʻzgarishlar roʻyxatida kichik tahrirlarni yashirish',
+'tog-hidepatrolled' => 'Yangi oʻzgarishlar roʻyxatida tekshirilgan tahrirlarni yashirish',
+'tog-newpageshidepatrolled' => 'Yangi sahifalar roʻyxatida tekshirilgan sahifalarni yashirish',
+'tog-extendwatchlist' => 'Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi',
+'tog-usenewrc' => 'Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)',
+'tog-numberheadings' => 'Sarlavhalarni avtomatik raqamlash',
+'tog-showtoolbar' => 'Tahrirlash asboblari joylashgan yoʻlakchani koʻrsatish (JavaScript orqali)',
+'tog-editondblclick' => 'Sichqoncha tugmasini ikki martagina bosib tahrirlashni boshlash',
+'tog-editsection' => '[tahrir] havolasini har bir boʻlim boshida koʻrsatish',
+'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasi bilan bosib tahrirlashni boshlash',
+'tog-showtoc' => 'Mundarijani koʻrsatish (3 tadan koʻproq sarlavha bor sahifalarda)',
+'tog-rememberpassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
'tog-watchcreations' => 'Men yaratgan sahifalarni va yuklagan fayllarni kuzatuv roʻyxatimga qoʻsh',
'tog-watchdefault' => 'Men tahrirlagan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
'tog-watchmoves' => 'Men koʻchirgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
-'tog-watchdeletion' => 'Men yoʻqotgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
-'tog-minordefault' => "Boshlang'ich holatga barcha tahrirlarni kamahamiyatli qilib belgilash",
-'tog-previewontop' => "Oldindan ko'rishni tahrirlash oynasi oldiga joylashtirish",
-'tog-previewonfirst' => "Tahrirlashga o'tishda batafsil ko'rinishni ko'rsatish",
-'tog-nocache' => "Brauzerda sahifalarni keshda saqlashni o'chirish",
+'tog-watchdeletion' => 'Men oʻchirgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
+'tog-minordefault' => 'Sukut boʻyicha barcha tahrirlarimni «kichik tahrir» etib belgilash',
+'tog-previewontop' => 'Tahrir oynasi tepasida koʻrib chiqish',
+'tog-previewonfirst' => 'Tahrirlashga oʻtiboq koʻrib chiqishni boshlash',
+'tog-nocache' => 'Brauzer sahifalarni kesh xotirasida saqlamasin',
'tog-enotifwatchlistpages' => 'Kuzatuv roʻyxatimdagi sahifa yoki fayllar oʻzgartirilsa, e-pochtamga bu haqda xat yuborilsin',
'tog-enotifusertalkpages' => 'Munozara sahifam oʻzgartirilsa, e-pochtamga bu haqda xat yuborilsin',
+'tog-enotifminoredits' => 'Kichik tahrir qilinsa ham e-pochtamga bu haqda xat yuborilsin',
+'tog-enotifrevealaddr' => 'Xabar beruvchi xatlarda e-pochta manzilim koʻrsatilsin',
+'tog-shownumberswatching' => 'Sahifani kuzatuv roʻyxatiga olgan foydalanuvchilar sonini koʻrsatish',
'tog-oldsig' => 'Joriy imzo:',
-'tog-fancysig' => 'Imzoni wikimatn sifatida qara (avtomatik ishoratsiz)',
-'tog-showjumplinks' => '"ga o\'tish" yordamchi havolalarini yoqish',
-'tog-ccmeonemails' => 'Men boshqa foydalanuvchilarga yuborayotgan xatnig nusxasi oʻzimning e-pochtamga ham yuborilsin',
+'tog-fancysig' => 'Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)',
+'tog-externaleditor' => 'Sukut boʻyicha tashqi tahrirlash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors More batafsil])',
+'tog-externaldiff' => 'Sukut boʻyicha tashqi taqqoslash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors More batafsil])',
+'tog-showjumplinks' => 'yordamchi "tez oʻtish" havolalarini yoqish',
+'tog-uselivepreview' => 'Tez koʻrib chiqish (JavaScript orqali) (sinovda)',
+'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatilsin',
+'tog-watchlisthideown' => 'Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthidebots' => 'Botlar qilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthideminor' => 'Kichik tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthideliu' => 'Tizimga kirgan foydalanuvchilar tahrirlari kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthideanons' => 'Anonim foydalanuvchilar tahrirlari kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-watchlisthidepatrolled' => 'Tekshirilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
+'tog-ccmeonemails' => 'Boshqa ishtirokchilarga yozgan xatimning nusxasi oʻzimning e-pochtamga joʻnatilsin.',
+'tog-diffonly' => 'Versiyalar taqqoslanayotganda, pastda sahifa matni koʻrsatilmasin',
'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
'tog-noconvertlink' => "Sarlavhaga aylantirish dastagini o'chirib qo'yish",
+'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosini koʻrsatish kerak emas',
'underline-always' => 'Har doim',
'underline-never' => 'Hech qachon',
'underline-default' => 'Brauzer moslamari boʻyicha',
# Font style option in Special:Preferences
-'editfont-style' => 'Tahrirlash maydoni bosma harflari turi',
+'editfont-style' => 'Tahrirlash maydonidagi shrift turi:',
'editfont-default' => 'Brauzer moslamari boʻyicha',
-'editfont-monospace' => 'Monoenli bosma harflar',
-'editfont-sansserif' => 'Sans-serif bosma harflari',
-'editfont-serif' => 'Serif bosma harflari',
+'editfont-monospace' => 'Teng enli shrift (Monospaced)',
+'editfont-sansserif' => 'Kertiksiz shrift (Sans-serif)',
+'editfont-serif' => 'Kertikli shrift (Serif)',
# Dates
'sunday' => 'Yakshanba',
'dec' => 'dek',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Turkum|Turkumlar}}',
+'pagecategories' => '{{PLURAL:$1|Turkum}}',
'category_header' => '"$1" turkumidagi maqolalar.',
'subcategories' => 'Ostturkumlar',
'category-media-header' => '"$1" turkumidagi fayllar',
'category-empty' => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
-'hidden-categories' => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
+'hidden-categories' => '{{PLURAL:$1|Yashirin turkum}}',
'hidden-category-category' => 'Yashirin turkumlar',
-'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
-'category-article-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta sahifa mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}}, hammasi boʻlib $2 ta sahifa mavjud.}}',
-'category-file-count' => "{{PLURAL:$2|Ushbu turkum faqat bitta faylga ega.|Ushbu turkumdagi $2 ta fayldan quyidagi $1 tasi ko'rsatildi.}}",
+'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Quyida ushbu turkumga kiruvchi $2 ta ostturkumdan $1 tasi koʻrsatilgan.}}',
+'category-subcat-count-limited' => 'Ushbu turkumda $1 ta ostturkum mavjud.',
+'category-article-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta sahifa mavjud.|Quyida ushbu turkumga kiruvchi $2 ta sahifadan $1 tasi koʻrsatilgan.}}',
+'category-article-count-limited' => 'Ushbu turkumda $1 ta sahifa mavjud.',
+'category-file-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta fayl mavjud.|Quyida ushbu turkumga kiruvchi $2 ta fayldan $1 tasi koʻrsatilgan.}}',
+'category-file-count-limited' => 'Ushbu turkumda $1 ta fayl mavjud.',
'listingcontinuesabbrev' => 'davomi',
'index-category' => 'Indekslanadigan sahifalar',
'noindex-category' => 'Indekslanmaydigan sahifalar',
-'broken-file-category' => 'Ishlamaydigan fayl havolalariga ega sahifalar',
+'broken-file-category' => 'Ishlamaydigan fayl havolalari bor sahifalar',
'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu',
'newwindow' => '(yangi oynada ochiladi)',
'cancel' => 'Bekor qilish',
'moredotdotdot' => 'Batafsil...',
+'morenotlisted' => 'Boshqa hech nima yoʻq...',
'mypage' => 'Sahifa',
-'mytalk' => 'Munozaram',
-'anontalk' => 'Bu IP uchun suhbat',
+'mytalk' => 'Munozara',
+'anontalk' => 'Ushbu IP-manzil munozarasi',
'navigation' => 'Saytda harakatlanish',
'and' => ' va',
# Cologne Blue skin
'qbfind' => 'Qidiruv',
-'qbbrowse' => "Ko'rish",
+'qbbrowse' => 'Koʻrish',
'qbedit' => 'Tahrirlash',
-'qbpageoptions' => 'Ushbu sahifa',
-'qbmyoptions' => 'Mening sahifalarim',
+'qbpageoptions' => 'Ushbu sahifa moslamalari',
+'qbmyoptions' => 'Moslamalarim',
'qbspecialpages' => 'Maxsus sahifalar',
'faq' => 'TSS',
'faqpage' => 'Project:TSS',
'vector-action-move' => 'Ko‘chirish',
'vector-action-protect' => 'Himoyalash',
'vector-action-undelete' => 'Tiklash',
-'vector-action-unprotect' => "Himoyani o'zgartirish",
-'vector-simplesearch-preference' => 'Soddalashtirilgan qidiruv uskunasini yoqish (faqat "Vektor" tashqi ko\'rinishi uchun)',
+'vector-action-unprotect' => 'Himoyalashni oʻzgartirish',
+'vector-simplesearch-preference' => 'Soddalashtirilgan qidiruv qatorini koʻrsat (faqat «Vektorli» tashqi koʻrinish uchun)',
'vector-view-create' => 'Yaratish',
'vector-view-edit' => 'Tahrirlash',
'vector-view-history' => 'Tarix',
'vector-view-view' => 'Mutolaa',
-'vector-view-viewsource' => "Manbasini ko'rish",
+'vector-view-viewsource' => 'Manbasini koʻrish',
'actions' => 'Amallar',
'namespaces' => 'Nomfazolar',
'variants' => 'Variantlar',
+'navigation-heading' => 'Navigatsiya',
'errorpagetitle' => 'Xato',
'returnto' => '$1 sahifasiga qaytish.',
-'tagline' => '{{SITENAME}} dan',
+'tagline' => '{{SITENAME}} dan olingan',
'help' => 'Yordam',
'search' => 'Qidiruv',
'searchbutton' => 'Qidirish',
-'go' => "O'tish",
+'go' => 'Oʻtish',
'searcharticle' => 'O‘tish',
'history' => 'Sahifa tarixi',
'history_short' => 'Tarix',
-'updatedmarker' => 'mening oxirgi tashrifimdan keyin yangilandi',
+'updatedmarker' => 'oxirgi tashrifimdan keyingi oʻzgarishlar',
'printableversion' => 'Bosma uchun versiya',
'permalink' => 'Doimiy ishorat',
-'print' => 'Chop et',
+'print' => 'Chop etish',
'view' => 'Koʻrish',
'edit' => 'Tahrirlash',
'create' => 'Yaratish',
-'editthispage' => 'Sahifani tahrirlash',
+'editthispage' => 'Ushbu sahifani tahrirlash',
'create-this-page' => 'Ushbu sahifani yaratish',
'delete' => 'O‘chirish',
'deletethispage' => 'Ushbu sahifani o‘chirish',
-'undelete_short' => '{{PLURAL:$1|tahrir|$1 tahrirlar}}ni tiklash',
-'viewdeleted_short' => "{{PLURAL:$1|o'chirilgan tahrir|$1 ta o'chirilgan tahrirlar}}ni ko'rish",
+'undelete_short' => '$1 ta tahrirni tiklash',
+'viewdeleted_short' => '$1 ta oʻchirilgan tahrirni koʻrish',
'protect' => 'Himoyalash',
-'protect_change' => 'o‘zgartirish',
+'protect_change' => 'Oʻzgartirish',
'protectthispage' => 'Ushbu sahifani himoyalash',
'unprotect' => 'Himoyadan chiqarish',
-'unprotectthispage' => "Ushbu sahifaning himoyasini o'zgaritish",
+'unprotectthispage' => 'Ushbu sahifaning himoyasini oʻzgaritish',
'newpage' => 'Yangi sahifa',
'talkpage' => 'Bu sahifa haqida munozara',
-'talkpagelinktext' => 'munozara',
+'talkpagelinktext' => 'Munozara',
'specialpage' => 'Maxsus sahifa',
'personaltools' => 'Shaxsiy uskunalar',
'postcomment' => 'Yangi boʻlim',
-'articlepage' => 'Sahifani ko‘rish',
+'articlepage' => 'Maqolani koʻrib chiqish',
'talk' => 'Munozara',
-'views' => 'Ko‘rinishlar',
+'views' => 'Qarashlar',
'toolbox' => 'Asboblar',
-'userpage' => "Foydalanuvchi sahifasini ko'rish",
-'projectpage' => "Loyiha sahifasini ko'rish",
-'imagepage' => "Fayl sahifasini ko'rish",
-'mediawikipage' => "Xabar sahifasini ko'rsatish",
-'templatepage' => "Andoza sahifasini ko'rish",
+'userpage' => 'Foydalanuvchi sahifasini koʻrish',
+'projectpage' => 'Loyiha sahifasini koʻrish',
+'imagepage' => 'Fayl sahifasini koʻrish',
+'mediawikipage' => 'Xabar sahifasini koʻrsatish',
+'templatepage' => 'Andoza sahifasini koʻrish',
'viewhelppage' => 'Yordam olish',
-'categorypage' => 'Turkum sahifasi',
+'categorypage' => 'Turkum sahifasini koʻrish',
'viewtalkpage' => 'Munozarani koʻrish',
'otherlanguages' => 'Boshqa tillarda',
'redirectedfrom' => '($1dan yoʻnaltirildi)',
'redirectpagesub' => 'Yoʻnaltiruvchi sahifa',
-'lastmodifiedat' => 'Bu sahifa oxirgi marta $2, $1 sanasida tahrirlangan.',
+'lastmodifiedat' => 'Bu sahifa oxirgi marta $1 soat $2 da tahrirlangan.',
'viewcount' => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
'protectedpage' => 'Himoyalangan sahifa',
'jumpto' => 'Oʻtish:',
'jumptonavigation' => 'saytda harakatlanish',
'jumptosearch' => 'qidiruv',
-'pool-timeout' => "Muhosara (to'sish) ni kutish vaqti tugadi",
-'pool-queuefull' => "So'rovlar jamlanmasi to'ldi",
-'pool-errorunknown' => "Noma'lum xato",
+'view-pool-error' => 'Uzr, ayni paytda serverlarga ortiqcha yuk tushgan.
+Bu sahifaga birdaniga koʻpchilik kirmoqchi boʻldi.
+Iltimos, biroz kutib turing va keyin yangitdan kirishga urinib koʻring.
+
+$1',
+'pool-timeout' => 'Toʻsishni kutish vaqti tugadi',
+'pool-queuefull' => 'Soʻrovlar jamlanmasi toʻldi',
+'pool-errorunknown' => 'Nomaʼlum xato',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
'aboutsite' => '{{SITENAME}} haqida',
'aboutpage' => 'Project:Haqida',
-'copyright' => 'Kontent $1 ostidadir.',
+'copyright' => 'Keltirilgan maʼlumotlar $1 orqali tarqatilmoqda.',
'copyrightpage' => '{{ns:project}}:Mualliflik huquqlari',
'currentevents' => 'Joriy hodisalar',
'currentevents-url' => 'Project:Joriy hodisalar',
'yourname' => 'Foydalanuvchi nomi',
'yourpassword' => 'Maxfiy soʻz',
'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
-'remembermypassword' => 'Hisob ma’lumotlarini ushbu kompyuterda eslab qolish (eng ko‘pi bilan $1 {{PLURAL:$1|kun|kun}} uchun)',
+'remembermypassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
'securelogin-stick-https' => "Kirgandan keyin HTTPS bo'yicha ulanishni davom ettirish",
'yourdomainname' => 'Sizning domeningiz:',
'password-change-forbidden' => "Siz bu vikida maxfiy so'zni o'zgartira olmaysiz.",
'listgrouprights-helppage' => 'Help:Guruhlar huquqlari',
'listgrouprights-members' => '(a’zolar ro‘yxati)',
-# E-mail user
+# Email user
'emailuser' => 'Foydalanuvchiga maktub',
'emailuser-title-target' => 'Ushbu {{GENDER:$1|foydalanuvchi}}ga maktub joʻnatish',
'emailuser-title-notarget' => 'Foydalanuvchiga elektron maktub yozish',
'defemailsubject' => '{{SITENAME}} — $1 tomonidan maktub',
'usermaildisabled' => 'Foydalanuvchi elektron pochtasi o‘chirilgan',
'noemailtitle' => 'Elektron pochta manzili mavjud emas',
-'noemailtext' => "Bu foydalanuvchi e-mail manzil ko'rsatgani yo'q.",
+'noemailtext' => 'Bu foydalanuvchi e-mail manzil koʻrsatgani yoʻq.',
'nowikiemailtitle' => 'Maktub joʻnatishga ruxsat yoʻq',
'emailtarget' => 'Oluvchi ishtirokchining ismini kiriting',
'emailusername' => 'Ishtirokchi nomi:',
'emailsubject' => 'Sarlavha:',
'emailmessage' => 'Xabar',
'emailsend' => 'Joʻnatish',
-'emailccme' => 'Maktub nusxasini menga joʻnatish',
+'emailccme' => 'Maktub nusxasi mening elektron pochtamga joʻnatilsin',
'emailccsubject' => '$1ga maktubingizning nusxasi: $2',
'emailsent' => "Xat jo'natildi",
'emailsenttext' => "Sizning elektron maktubingiz jo'natildi.",
Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmaslik\" yozuvini bosing.",
'removewatch' => "Kuzatuv ro'yxatidan o'chirish",
-'removedwatchtext' => '"[[:$1]]" sahifasi kuzatuv ro\'yxatingizdan o\'chirildi.',
+'removedwatchtext' => '"[[:$1]]" sahifasi [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.',
'watch' => 'Kuzatish',
'watchthispage' => 'Sahifani kuzatish',
'unwatch' => 'Kuzatmaslik',
'userpage' => 'Xem trang thành viên',
'projectpage' => 'Xem trang dự án',
'imagepage' => 'Xem trang tập tin',
-'mediawikipage' => 'Thông báo giao diện',
+'mediawikipage' => 'Thông điệp giao diện',
'templatepage' => 'Trang bản mẫu',
'viewhelppage' => 'Trang trợ giúp',
'categorypage' => 'Trang thể loại',
'nstab-special' => 'Trang đặc biệt',
'nstab-project' => 'Dự án',
'nstab-image' => 'Tập tin',
-'nstab-mediawiki' => 'Thông báo',
+'nstab-mediawiki' => 'Thông điệp',
'nstab-template' => 'Bản mẫu',
'nstab-help' => 'Trợ giúp',
'nstab-category' => 'Thể loại',
'enterlockreason' => 'Nêu lý do khóa, cùng với thời hạn khóa',
'readonlytext' => 'Cơ sở dữ liệu hiện đã bị khóa không nhận trang mới và các điều chỉnh khác, có lẽ để bảo trì cơ sở dữ liệu định kỳ, một thời gian ngắn nữa nó sẽ trở lại bình thường.
-Quản lý viên khóa nó đã đưa ra lời giải thích sau: $1',
+Bảo quản viên khóa nó đã đưa ra lời giải thích sau: $1',
'missing-article' => 'Cơ sở dữ liệu không tìm thấy văn bản của trang lẽ ra phải có, trang Normal 0 false false false EN-US X-NONE X-NONE MicrosoftInternetExplorer4 “$1” $2.
Điều này thường xảy ra do nhấn vào liên kết khác biệt phiên bản đã quá lâu hoặc liên kết lịch sử của một trang đã bị xóa.
'protectedpagetext' => 'Trang này đã bị khóa không cho sửa đổi hoặc tác động khác.',
'viewsourcetext' => 'Bạn vẫn có thể xem và chép xuống mã nguồn của trang này:',
'viewyourtext' => "Bạn vẫn có thể xem và chép xuống mã nguồn '''các sửa đổi của bạn''' tại trang này:",
-'protectedinterface' => 'Trang này cung cấp một thông báo trong giao diện phần mềm, và bị khóa để tránh phá hoại. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.',
-'editinginterface' => "'''Lưu ý:''' Bạn đang sửa chữa một trang dùng để cung cấp thông báo giao diện cho phần mềm. Những thay đổi tại trang này sẽ ảnh hưởng đến giao diện của rất nhiều người dùng wiki này. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.",
+'protectedinterface' => 'Trang này cung cấp một thông điệp trong giao diện phần mềm, và bị khóa để tránh phá hoại. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.',
+'editinginterface' => "'''Lưu ý:''' Bạn đang sửa chữa một trang dùng để cung cấp thông điệp giao diện cho phần mềm. Những thay đổi tại trang này sẽ ảnh hưởng đến giao diện của rất nhiều người dùng wiki này. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.",
'sqlhidden' => '(đã giấu truy vấn SQL)',
'cascadeprotected' => 'Trang này đã bị khóa không cho sửa đổi, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} đã bị khóa với tùy chọn “khóa theo tầng” được kích hoạt:
$2',
'createaccount-title' => 'Tài khoản mới tại {{SITENAME}}',
'createaccount-text' => 'Ai đó đã tạo một tài khoản với tên $2 tại {{SITENAME}} ($4). Mật khẩu của "$2" là "$3". Bạn nên đăng nhập và đổi mật khẩu ngay bây giờ.
-Xin hãy bỏ qua thông báo này nếu tài khoản này không phải do bạn tạo ra.',
+Xin hãy bỏ qua thông điệp này nếu tài khoản này không phải do bạn tạo ra.',
'usernamehasherror' => 'Tên người dùng không thể chứa dấu rào',
'login-throttled' => 'Bạn đã thử quá nhiều mật khẩu của tài khoản này.
Xin hãy đợi chốc lát rồi thử lại.',
'loginlanguagelabel' => 'Ngôn ngữ: $1',
'suspicious-userlogout' => 'Đã bỏ qua yêu cầu đăng xuất bạn, hình như được gửi từ trình duyệt hoặc máy proxy nhớ đệm hư.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Lỗi không rõ trong hàm PHP mail()',
'user-mail-no-addy' => 'Không có địa chỉ để gửi thư điện tử đến',
'user-mail-no-body' => 'Không thể gửi thư điện tử rỗng hoặc có nội dung ngắn một cách vô lý.',
Không thể lưu trang.",
'readonlywarning' => "'''CẢNH BÁO: Cơ sở dữ liệu đã bị khóa để bảo dưỡng, do đó bạn không thể lưu các sửa đổi của mình. Bạn nên cắt-dán đoạn bạn vừa sửa vào một tập tin và lưu nó lại để sửa đổi sau này.'''
-Quản lý viên khi khóa dữ liệu đã đưa ra lý do: $1",
+Bảo quản viên khi khóa dữ liệu đã đưa ra lý do: $1",
'protectedpagewarning' => "'''Cảnh báo: Trang này đã bị khóa và chỉ có các thành viên có quyền quản lý mới có thể sửa được.'''
Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
'semiprotectedpagewarning' => "'''Lưu ý:''' Trang này đã bị khóa nên chỉ có các thành viên có tài khoản mới có thể sửa đổi được.
'expensive-parserfunction-category' => 'Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao',
'post-expand-template-inclusion-warning' => 'Cảnh báo: Kích thước bản mẫu nhúng vào quá lớn.
Một số bản mẫu sẽ không được đưa vào.',
-'post-expand-template-inclusion-category' => 'Những trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép',
-'post-expand-template-argument-warning' => 'Cảnh báo: Trang này có chứa ít nhất một giá trị bản mẫu có kích thước bung ra quá lớn.
-Những giá trị này sẽ bị bỏ đi.',
-'post-expand-template-argument-category' => 'Những trang có chứa những giá trị bản mẫu bị loại bỏ',
+'post-expand-template-inclusion-category' => 'Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép',
+'post-expand-template-argument-warning' => 'Cảnh báo: Trang này có chứa ít nhất một tham số bản mẫu có kích thước bung ra quá lớn.
+Những tham số này sẽ bị bỏ đi.',
+'post-expand-template-argument-category' => 'Trang có chứa tham số bản mẫu bị loại bỏ',
'parser-template-loop-warning' => 'Phát hiện bản mẫu lặp vòng: [[$1]]',
'parser-template-recursion-depth-warning' => 'Bản mẫu đã vượt quá giới hạn về độ sâu đệ quy ($1)',
'language-converter-depth-warning' => 'Đã vượt quá giới hạn độ sâu của bộ chuyển đổi ngôn ngữ ($1)',
'last' => 'trước',
'page_first' => 'đầu',
'page_last' => 'cuối',
-'histlegend' => 'Chọn so sánh: đánh dấu để chọn các phiên bản để so sánh rồi nhấn enter hoặc nút ở dưới.<br />
-Chú giải: (hiện) = khác với phiên bản hiện hành,
-(trước) = khác với phiên bản trước, n = sửa đổi nhỏ.',
+'histlegend' => "Chọn so sánh: Đánh dấu để chọn các phiên bản để so sánh rồi nhấn Enter hoặc nút ở dưới.<br />
+Chú giải: '''({{int:cur}})''' = khác với phiên bản hiện hành, '''({{int:last}})''' = khác với phiên bản trước, '''{{int:minoreditletter}}''' = sửa đổi nhỏ.",
'history-fieldset-title' => 'Tìm trong lịch sử',
'history-show-deleted' => 'Chỉ bị xóa',
'histfirst' => 'Cũ nhất',
'prefs-displaywatchlist' => 'Tùy chọn hiển thị',
'prefs-diffs' => 'Khác biệt',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Có vẻ hợp lệ',
'email-address-validity-invalid' => 'Yêu cầu địa chỉ hợp lệ!',
'disambiguationspage' => 'Template:disambig',
'disambiguations-text' => "Các trang này có liên kết đến ít nhất một '''trang định hướng''', những trang này có thể có liên kết đến các trang đúng nghĩa hơn.<br />Các trang định hướng là trang sử dụng những bản mẫu được liệt kê ở [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Trang có thuộc tính trang',
+'pageswithprop-legend' => 'Các trang có thuộc tính trang',
+'pageswithprop-text' => 'Trang này liệt kê các trang sử dụng một thuộc tính trang nào đó.',
+'pageswithprop-prop' => 'Tên thuộc tính:',
+'pageswithprop-submit' => 'Xem',
+
'doubleredirects' => 'Đổi hướng kép',
'doubleredirectstext' => 'Trang này liệt kê các trang đổi hướng đến một trang đổi hướng khác.
Mỗi hàng có chứa các liên kết đến trang đổi hướng thứ nhất và thứ hai, cũng như mục tiêu của trang đổi hướng thứ hai, thường là trang đích “thực sự”, là nơi mà trang đổi hướng đầu tiên nên trỏ đến.
'mostlinked' => 'Trang được liên kết đến nhiều nhất',
'mostlinkedcategories' => 'Thể loại có nhiều trang nhất',
'mostlinkedtemplates' => 'Bản mẫu được liên kết đến nhiều nhất',
-'mostcategories' => 'Các trang có nhiều thể loại nhất',
+'mostcategories' => 'Trang có nhiều thể loại nhất',
'mostimages' => 'Tập tin được liên kết đến nhiều nhất',
-'mostinterwikis' => 'Các trang có nhiều liên kết liên wiki nhất',
-'mostrevisions' => 'Các trang được sửa đổi nhiều lần nhất',
+'mostinterwikis' => 'Trang có nhiều liên kết liên wiki nhất',
+'mostrevisions' => 'Trang được sửa đổi nhiều lần nhất',
'prefixindex' => 'Tất cả các trang trùng với tiền tố',
'prefixindex-namespace' => 'Tất cả các trang trùng với tiền tố (không gian $1)',
'shortpages' => 'Trang ngắn nhất',
'protectedpages-cascade' => 'Chỉ hiển thị khóa theo tầng',
'protectedpagestext' => 'Các trang này bị khóa không cho sửa đổi hay di chuyển',
'protectedpagesempty' => 'Hiện không có trang nào bị khóa với các thông số này.',
-'protectedtitles' => 'Các tựa trang được bảo vệ',
+'protectedtitles' => 'Tên trang bị khóa',
'protectedtitlestext' => 'Các tựa trang sau đây đã bị khóa không cho tạo mới',
'protectedtitlesempty' => 'Không có tựa trang nào bị khóa với các thông số như vậy.',
'listusers' => 'Danh sách thành viên',
'listusers-creationsort' => 'Xếp theo ngày khởi tạo',
'usereditcount' => '$1 {{PLURAL:$1|sửa đổi|sửa đổi}}',
'usercreated' => '{{GENDER:$3}}mở $1 lúc $2',
-'newpages' => 'Các trang mới nhất',
+'newpages' => 'Trang mới',
'newpages-username' => 'Tên người dùng:',
-'ancientpages' => 'Các trang cũ nhất',
+'ancientpages' => 'Trang cũ nhất',
'move' => 'Di chuyển',
'movethispage' => 'Di chuyển trang này',
'unusedimagestext' => 'Các tập tin sau tồn tại nhưng chưa được nhúng vào trang nào.
'listgrouprights-addgroup-self-all' => 'Có thể đưa tài khoản của chính mình vào tất cả các nhóm',
'listgrouprights-removegroup-self-all' => 'Có thể loại tài khoản của chính mình ra khỏi tất cả các nhóm',
-# E-mail user
+# Email user
'mailnologin' => 'Không có địa chỉ gửi thư',
'mailnologintext' => 'Bạn phải [[Special:UserLogin|đăng nhập]] và khai báo một địa chỉ thư điện tử hợp lệ trong phần [[Special:Preferences|tùy chọn cá nhân]] thì mới gửi được thư cho người khác.',
'emailuser' => 'Gửi thư cho người này',
'emailuserfooter' => 'Thư điện tử này được $1 gửi đến $2 thông qua chức năng “Gửi thư cho người này” của {{SITENAME}}.',
# User Messenger
-'usermessage-summary' => 'Đang để lại thông báo hệ thống.',
-'usermessage-editor' => 'Trình thông báo hệ thống',
+'usermessage-summary' => 'Đang để lại thông điệp hệ thống.',
+'usermessage-editor' => 'Trình thông điệp hệ thống',
# Watchlist
'watchlist' => 'Danh sách theo dõi',
'unblocked' => '[[User:$1|$1]] đã hết bị cấm',
'unblocked-range' => '$1 đã được bỏ cấm',
'unblocked-id' => '$1 đã hết bị cấm',
-'blocklist' => 'Những người dùng bị cấm',
-'ipblocklist' => 'Những người dùng bị cấm',
+'blocklist' => 'Người dùng bị cấm',
+'ipblocklist' => 'Người dùng bị cấm',
'ipblocklist-legend' => 'Tìm một thành viên bị cấm',
'blocklist-userblocks' => 'Ẩn tác vụ cấm tài khoản',
'blocklist-tempblocks' => 'Ẩn tác vụ cấm có thời hạn',
'export-pagelinks' => 'Gồm cả các trang liên kết sâu đến:',
# Namespace 8 related
-'allmessages' => 'Thông báo hệ thống',
-'allmessagesname' => 'Tên thông báo',
+'allmessages' => 'Thông điệp hệ thống',
+'allmessagesname' => 'Tên thông điệp',
'allmessagesdefault' => 'Nội dung mặc định',
'allmessagescurrent' => 'Nội dung hiện thời',
-'allmessagestext' => 'Đây là toàn bộ thông báo hệ thống có trong không gian tên MediaWiki.
-Mời vào [//www.mediawiki.org/wiki/Localisation Địa phương hóa MediaWiki] và [//translatewiki.net translatewiki.net] nếu bạn muốn đóng góp dịch chung cả MediaWiki.',
+'allmessagestext' => 'Đây là toàn bộ thông điệp hệ thống có trong không gian tên MediaWiki.
+Mời vào [//www.mediawiki.org/wiki/Localisation?uselang=vi Địa phương hóa MediaWiki] và [//translatewiki.net/wiki/?uselang=vi translatewiki.net] nếu bạn muốn đóng góp dịch chung cả MediaWiki.',
'allmessagesnotsupportedDB' => "Trang này không dùng được vì biến '''\$wgUseDatabaseMessages''' đã bị tắt.",
'allmessages-filter-legend' => 'Bộ lọc',
'allmessages-filter' => 'Lọc theo tình trạng sửa đổi:',
'tooltip-t-specialpages' => 'Danh sách các trang đặc biệt',
'tooltip-t-print' => 'Bản để in ra của trang',
'tooltip-t-permalink' => 'Liên kết thường trực đến phiên bản này của trang',
-'tooltip-ca-nstab-main' => 'Xem trang nội dung này',
-'tooltip-ca-nstab-user' => 'Xem trang về người này',
+'tooltip-ca-nstab-main' => 'Xem trang nội dung',
+'tooltip-ca-nstab-user' => 'Xem trang cá nhân',
'tooltip-ca-nstab-media' => 'Xem trang phương tiện',
'tooltip-ca-nstab-special' => 'Đây là một trang đặc biệt, bạn không thể sửa đổi nó.',
'tooltip-ca-nstab-project' => 'Xem trang dự án',
'tooltip-ca-nstab-image' => 'Xem trang miêu tả tập tin',
-'tooltip-ca-nstab-mediawiki' => 'Xem thông báo hệ thống',
+'tooltip-ca-nstab-mediawiki' => 'Xem thông điệp hệ thống',
'tooltip-ca-nstab-template' => 'Xem bản mẫu',
'tooltip-ca-nstab-help' => 'Xem trang trợ giúp',
'tooltip-ca-nstab-category' => 'Xem trang thể loại',
'monthsall' => 'tất cả',
'limitall' => 'tất cả',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Xác nhận thư điện tử',
'confirmemail_noemail' => 'Bạn chưa đưa vào địa chỉ thư điện tử hợp lệ ở [[Special:Preferences|tùy chọn cá nhân]].',
'confirmemail_text' => '{{SITENAME}} đòi hỏi bạn xác minh thư điện tử của mình
* <strong class="mw-specialpagerestricted">Trang đặc biệt được hạn chế.</strong>
* <span class="mw-specialpagecached">Trang đặc biệt được lấy từ vùng nhớ đệm (có thể lỗi thời).</span>',
'specialpages-group-maintenance' => 'Báo cáo bảo quản',
-'specialpages-group-other' => 'Những trang đặc biệt khác',
+'specialpages-group-other' => 'Trang đặc biệt khác',
'specialpages-group-login' => 'Đăng nhập / Mở tài khoản',
'specialpages-group-changes' => 'Thay đổi gần đây và nhật trình',
'specialpages-group-media' => 'Báo cáo và tải lên phương tiện',
#Hãy đặt các mẩu biểu thức chính quy ở phía trên dòng này. Hãy để yên dòng này</pre>',
# Special:Tags
-'tags' => 'Các thẻ đánh dấu thay đổi hợp lệ',
+'tags' => 'Thẻ đánh dấu thay đổi hợp lệ',
'tag-filter' => 'Bộ lọc [[Special:Tags|thẻ]]:',
'tag-filter-submit' => 'Bộ lọc',
'tags-title' => 'Thẻ đánh dấu',
'duration-centuries' => '$1 thế kỷ',
'duration-millennia' => '$1 thiên niên kỷ',
+# Image rotation
+'rotate-comment' => 'Đã quay hình $1 độ theo chiều kim đồng hồ',
+
);
'gotaccount' => '¿Mayda kana akawnt? $1.',
'gotaccountlink' => 'Sakob',
'userlogin-resetlink' => 'Nangalimot han imo detalye han pagsakob?',
-'createaccountmail' => 'Ha e-mail',
+'createaccountmail' => 'Gamiti hin temporaryo nga bisan ano nag password ngan igpadangat ngada ha e-mail address nga nakasurat ha ubos',
'createaccountreason' => 'Rason:',
'badretype' => 'Diri naangay an mga tigaman-pagsulod nga im ginbutang',
'userexists' => 'An agnay hiton gumaramit nga im ginbutang in gingamit na.
'passwordremindertitle' => 'Bag-o nga diri-pirmihan nga tigaman-pagsulod para han {{SITENAME}}',
'noemail' => 'Waray e-mail nga adres nga ginrekord para han nágámit "$1".',
'noemailcreate' => 'Kinahanglan nim maghatag hin may hinungdan nga e-mail address',
+'passwordsent' => 'Uska bag-o nga password in ginpadangat ha e-mail address nga nakarehistro kan "$1".
+Alayon paglog-in utro kahuman mo makarawat ini.',
+'blocked-mailpassword' => 'An imo IP address in ginpugong ha pag-edit, ngan tungod hini in diri gintutugotan paggamit han password recovery function para malikyan an abuso.',
+'eauthentsent' => 'Uska kompirmasyon nga e-mail in ginpadangan ha gin-ngaranan nga e-mail address.
+San-o matagan pa hin iba nga e-mail para ha imo akawnt, kinahanglan mo sundon an mga surundan nga nakasurat ha e-mail, para makompirma nga imo gud ito akawnt.',
'mailerror' => 'Sayop han pagpadangat hin surat: $1',
'emailauthenticated' => 'Ginpamatuod an imo e-mail adres han $2 ha $3.',
'emailconfirmlink' => 'Igkompirma an imo e-mail address',
'login-abort-generic' => 'An imo paglog-in in diri malinamposon - Naundang',
'loginlanguagelabel' => 'Pinulongan: $1',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Waray kasabti ha kanan PHP mail() function.',
# Change password dialog
'oldpassword' => 'Daan nga tigaman-pagsulod:',
'newpassword' => 'Bag-o nga tigaman-pagsulod:',
'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
+'resetpass_submit' => 'Igbutang an password ngan log in',
'resetpass_success' => 'Malinamposon nga nasalyuan na an imo tigaman-pagsulod!
Ikaw in naglalog-in yana...',
'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
'edit-already-exists' => 'Diri nakakahimo hin bag-o nga pakli.
Aada na ito.',
'defaultmessagetext' => 'Aada-nga-daan nga teksto han mensahe',
+'invalid-content-data' => 'Sayop nga sulod nga datos',
'content-not-allowed-here' => 'An sulod nga "$1" in diri gintutugotan ha pakli nga [[$2]]',
# Content models
'rev-showdeleted' => 'igpakita',
'revisiondelete' => 'Pagpara/pagtanggal han pagpara nga mga rebisyon',
'revdelete-nologtype-title' => 'Waray ginhatag nga klase hit talaan',
+'revdelete-nologid-title' => 'Sayop nga log entry',
'revdelete-show-file-confirm' => 'Sigurado ka nga gusto mo makita an ginpara nga pagliwat han file "<nowiki>$1</nowiki>" tikang $2 ha $3?',
'revdelete-show-file-submit' => 'Oo',
'revdelete-hide-text' => 'Tagoon an rebisyon han teksto',
'prefs-displaywatchlist' => 'Mga pirilion hiunong han ginpapakita',
'prefs-diffs' => 'Mga kaibhan',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mail address in baga puydi',
# User rights
'listgrouprights-addgroup-all' => 'Igdugang ngatanan nga mga hugpo',
'listgrouprights-removegroup-all' => 'Igtanggal ngatanan nga mga hugpo',
-# E-mail user
+# Email user
'emailuser' => 'Ig-e-mail ini nga gumaramit',
'emailuser-title-target' => 'Ig-E-mail ini nga {{HENERO:$1|gumaramit}}',
'emailuser-title-notarget' => 'Gumaramit han e-mail',
'monthsall' => 'ngatanan',
'limitall' => 'ngatanan',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Igkompirma an e-mail address',
'confirmemail_sent' => 'Ginpadara an kompirmasyon han e-mail.',
'confirmemail_needlogin' => 'Kinahanglanon mo hin $1 para makakompirma han imo e-mail address.',
'january-gen' => 'יאנואר',
'february-gen' => 'פעברואר',
'march-gen' => 'מערץ',
-'april-gen' => 'אפריל',
+'april-gen' => 'אַפּריל',
'may-gen' => 'מיי',
'june-gen' => 'יוני',
'july-gen' => 'יולי',
'loginlanguagelabel' => 'שפראך: $1',
'suspicious-userlogout' => ' אײַער בקשה אַרויסלאָגירן זיך איז אפגעלייגט געווארן ווייַל אייגנטלעך איז זי געשיקט דורך אַ צעבראכענעם בלעטערער אָדער א פראקסי מיט א זאפאס.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'אומבאַקאַנט טעות אין()mail פֿונקציע פֿון PHP.',
'user-mail-no-addy' => 'געפרוווט צו שיקן ע-פּאָסט אָן אַן ע-פּאָסט אַדרעס.',
'user-mail-no-body' => 'האט פרובירט צו שיקן א בליצבריוו וואס זיין אינהאלט איז ליידיק אדער גאר קורץ.',
'prefs-displaywatchlist' => 'ווײַזן אפציעס',
'prefs-diffs' => 'צווישנשיידן',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'ע-פּאָסט אַדרעס זעט אויס גילטיק',
'email-address-validity-invalid' => 'לייגט אַרײַן א גילטיקן ע־פאסט אַדרעס',
'prevpage' => 'פֿריִערדיקער בלאַט ($1)',
'allpagesfrom' => 'ווייזן בלעטער אנגעהויבן פון:',
'allpagesto' => 'ווייזן בלעטער ביז:',
-'allarticles' => '×\90Ö·×\9c×¢ ×\90ַר×\98×\99ק×\9c×¢×\9f',
-'allinnamespace' => 'אלע בלעטער ($1 נאָמענטייל )',
-'allnotinnamespace' => 'אלע בלעטער (נישט אין נאמענטייל $1)',
+'allarticles' => '×\90Ö·×\9c×¢ ×\91×\9c×¢×\98ער',
+'allinnamespace' => 'אַלע בלעטער ($1 נאָמענטייל )',
+'allnotinnamespace' => 'אַלע בלעטער (נישט אין $1 נאָמענטייל)',
'allpagesprev' => 'פריערדיגע',
'allpagesnext' => 'נעקסט',
'allpagessubmit' => 'גיי',
'listgrouprights-addgroup-self-all' => 'צולייגן אַלע גרופעס צו אייגענער קאנטע',
'listgrouprights-removegroup-self-all' => 'אראָפנעמען אַלע גרופעס פֿון אייגענער קאנטע',
-# E-mail user
+# Email user
'mailnologin' => 'נישטא קיין אדרעס צו שיקן',
'mailnologintext' => 'איר ברויכט זײַן [[Special:UserLogin|אַרײַנלאגירט]] און האָבן א גילטיגן ע־פאסט אַדרעס אין אײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פאסט צו אַנדערע באַניצער.',
'emailuser' => 'שיקן ע-פאסט צו דעם באַניצער',
'tooltip-pt-anonlogin' => "עס איז רעקאָמענדירט זיך אײַנשרײַבן; ס'איז אָבער נישט קײַן פֿליכט",
'tooltip-pt-logout' => 'ארויסלאגירן',
'tooltip-ca-talk' => 'שמועס וועגן דעם אינהאַלט בלאַט',
-'tooltip-ca-edit' => "איר קענט ענדערן דעם בלאט. ביטע באניצט דעם ''פֿאָרויסדיקער אויסקוק'' קנעפל בעפֿארן אפהיטן",
+'tooltip-ca-edit' => "איר קענט ענדערן דעם בלאט. ביטע באניצט דעם ''פֿארויסקוק'' קנעפל בעפֿארן אפהיטן",
'tooltip-ca-addsection' => 'אָנהייבן א נײַע אָפטיילונג',
'tooltip-ca-viewsource' => 'דאס איז א פֿארשלאסענער בלאט, איר קענט נאר באַקוקן זיין מקור',
'tooltip-ca-history' => 'פריערדיגע ווערסיעס פון דעם בלאט.',
'spamprotectiontitle' => 'ספעם באשיצונג פילטער',
'spambot_username' => 'מעדיעוויקי ספאם פוצן',
'spam_reverting' => 'צוריקגעשטעלט צו דער לעצטער ווערסיע אן לינקען צו $1',
+'spam_blanking' => 'אלע רעוויזיעס האבן לינקען צו $1, אויסליידיקן',
'spam_deleting' => 'אלע רעוויזיעס האבן לינקען צו $1, אויסמעקן',
# Info page
'pageinfo-robot-noindex' => 'נישט אינדעקסירבאר',
'pageinfo-views' => 'צאַל קוקן',
'pageinfo-watchers' => '!צאָל בלאט אויפֿפאַסער',
+'pageinfo-few-watchers' => 'ווינציקער ווי $1 {{PLURAL:$1|אויפֿפאסער}}',
'pageinfo-redirects-name' => 'ווײַטערפירונגען צו דעם בלאט',
'pageinfo-subpages-name' => 'אונטערבלעטער פון דעם בלאט',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ווײַטערפירונג|ווײַטערפירונגען}}; $3 {{PLURAL:$3|סתם בלאט|סתם בלעטער}})',
'pageinfo-magic-words' => '{{PLURAL:$1|מאגיש ווארט|מאגישע ווערטער}} ($1)',
'pageinfo-hidden-categories' => 'באהאלטענע {{PLURAL:$1|קאטעגאריע|קאטעגאריעס}} ($1)',
'pageinfo-templates' => ' {{PLURAL:$1|אריבערגעשלאסענער מוסטער|אריבערגשלאסענע מוסטערן}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|בלאט|בלעטער}} אריבעגעשלאסן אויף ($1)',
'pageinfo-toolboxlink' => 'בלאַט־אינפֿארמאַציע',
'pageinfo-redirectsto' => 'פירט ווײַטער צו',
'pageinfo-redirectsto-info' => 'אינפֿארמאַציע',
'pageinfo-contentpage' => 'געציילט ווי אן אינהאלט בלאט',
'pageinfo-contentpage-yes' => 'יאָ',
+'pageinfo-protect-cascading' => 'שיצונגען קאסקאדירן פון דאנעט',
'pageinfo-protect-cascading-yes' => 'יאָ',
+'pageinfo-protect-cascading-from' => 'שיצונגען קאסקאדירן פון',
'pageinfo-category-info' => 'קאטעגאריע אינפארמאציע',
'pageinfo-category-pages' => 'צאָל בלעטער',
'pageinfo-category-subcats' => 'צאָל אונטערקאטעגאריעס',
'exif-sharpness' => 'שארף',
'exif-devicesettingdescription' => 'אפאראט שטעלונגען אראפמאלונג',
'exif-imageuniqueid' => 'בילד־ID',
+'exif-gpsversionid' => 'GPS טאַג ווערסיע',
'exif-gpslatituderef' => 'צפון אדער דרום גארטל־ליניע',
'exif-gpslatitude' => 'גארטל־ליניע',
'exif-gpslongituderef' => 'מזרח אדער מערב לענג',
'exif-gpstimestamp' => 'GPS צייט (אטאם־זייגער)',
'exif-gpssatellites' => 'סאטעליטן געניצט פאר מעסטן',
'exif-gpsstatus' => 'אויפנעמער סטאטוס',
+'exif-gpsmeasuremode' => 'מעסטן מאדע',
'exif-gpsdop' => 'מאס פוקנטליכקייט',
'exif-gpsspeedref' => 'גיך איינהייט',
'exif-gpsspeed' => 'גיך פון GPS־אויפֿנעמער',
'exif-sharpness-1' => 'ווייך',
'exif-sharpness-2' => 'הארט',
-'exif-subjectdistancerange-0' => '×\90×\95×\9e×\91×\90Ö·×\95×\95×\99סט',
+'exif-subjectdistancerange-0' => '×\90×\95×\9e×\91×\90Ö·×\95×\95×\90×\95סט',
'exif-subjectdistancerange-1' => 'מאקרא',
'exif-subjectdistancerange-2' => 'נאנטע ווייזונג',
'exif-subjectdistancerange-3' => 'ווײַטע ווײַזונג',
'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|מעטער|מעטער}} איבערן ים־שפיגלl',
'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|מעטער|מעטער}} אונטערן ים־שפיגל',
+'exif-gpsstatus-a' => "מ'האלט אינמיטן מעסטן",
+
# Pseudotags used for GPSSpeedRef
'exif-gpsspeed-k' => 'ק"מ אין א שעה',
'exif-gpsspeed-m' => 'מייל פער שעה',
'monthsall' => 'אלע',
'limitall' => 'אַלע',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'באַשטעטיקט בליצפּאָסט אַדרעס',
'confirmemail_noemail' => 'איר האט נישט קיין גוטן בליצבריוו אַדרעס אין אײַער [[Special:Preferences|באניצער פרעפֿערענצן]].',
'confirmemail_text' => 'די וויקי פארלאנגט אז איר זאלט באשטעטיגן אייער בליצפאסט אדרעס איידער איר באניצט זיך מיט דער ע-פאסט באדינסט. דרוקט אויפן קנעפל אונטן כדי צו שיקן א באשטעטיגונג קאד צו אייער אדרעס. לאדט אן דעם לינק אין אייער בלעטערער צו באשטעטיגן אז אייער אדרעס איז גילטיג.',
'version' => 'ווערסיע',
'version-extensions' => 'אינסטאלירטע פארברייטערונגען',
'version-specialpages' => 'ספעציעלע בלעטער',
+'version-parserhooks' => 'פארזער פארברייטונגען',
'version-variables' => 'וואַריאַבלען',
'version-skins' => 'באניצער־אייבערפלאכן',
'version-other' => 'אנדער',
'loginlanguagelabel' => 'Èdè: $1',
'suspicious-userlogout' => 'Ìtọrọ tí ẹ ṣe láti bọ́sóde jẹ̀ kíkọ̀ nítorípé ó dà bí pé ó jẹ́ fífiránṣẹ́ látọ̀dọ̀ awòtakùn (browser) àìdára tàbí ẹ̀rọ-ìwọ̀fà ìmúpamọ́ onígbàdíẹ̀.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Àsìṣe àìmọ̀ nínú ìgbéṣe mail() ti PHP',
'user-mail-no-addy' => 'Ó fẹ́ fi e-mail ránṣẹ́ láìsí àdírẹ́sì e-mail.',
'prefs-displaywatchlist' => 'Ìfihàn àwọn àṣàyàn',
'prefs-diffs' => 'Àwọn ìyàtọ̀',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Àdírẹ́ẹ̀sì e-mail dà bí èyí tótọ́',
'email-address-validity-invalid' => 'Ẹ tẹ e-mail tótọ́',
'listgrouprights-addgroup-self-all' => 'Ìfikún gbogbo ẹgbẹ́ mọ́ àpamọ́ araẹni',
'listgrouprights-removegroup-self-all' => 'Ìyọkúrò gbogbo ẹgbẹ́ kúrò nínú àpamọ́ araẹni',
-# E-mail user
+# Email user
'mailnologin' => 'Kò sí àdírẹ́sì àfiránṣẹ́',
'mailnologintext' => 'Ẹ gbọ́dọ̀ ti [[Special:UserLogin|wọlé]] kí ẹ sì ní àdírẹ́ẹ̀sì e-mail oníìbámu nínú [[Special:Preferences|àwọn ìfẹ́ràn]] yín láti le baà le fi e-mail ránṣẹ́ sí àwọn onísẹ míràn.',
'emailuser' => 'Ẹ fi e-mail ránṣẹ́ sí oníṣe yìí',
'usermessage-editor' => 'Sìstẹ́mú olúránṣẹ́',
# Watchlist
-'watchlist' => 'Ìmójútó mi',
+'watchlist' => 'Ìmójútó',
'mywatchlist' => 'Ìmójútó',
'watchlistfor2' => 'Fún $1 $2',
'nowatchlist' => 'Ẹ kò ní ohun kankan nínú ìmójútó yín.',
'protect-default' => 'Ẹ gba gbogbo àwọn oníṣe láàyè',
'protect-fallback' => 'Ìyọ̀nda "$1" pọn dandan',
'protect-level-autoconfirmed' => 'Dínà àwọn oníṣe tuntun àti tíkòforúkọ sílẹ́',
-'protect-level-sysop' => 'Alámùójútó nìkan',
+'protect-level-sysop' => 'Gba àwọn alámùójútó nìkan láyè',
'protect-summary-cascade' => 'títẹ̀léra',
'protect-expiring' => 'parí ní $1 (UTC)',
'protect-expiring-local' => 'yíò parí ní $1',
'pageinfo-protect-cascading' => 'Àbò bẹ̀rẹ̀ láti ibí',
'pageinfo-protect-cascading-yes' => 'Bẹ́ẹ̀ni',
'pageinfo-protect-cascading-from' => 'Àbò bẹ̀rẹ̀ láti',
+'pageinfo-category-pages' => 'Iye àwọn ojúewé',
+'pageinfo-category-files' => 'Iye àwọn fáìlì',
# Patrolling
'markaspatrolleddiff' => 'Ìṣààmí sí bíi sísọ́',
'monthsall' => 'gbogbo',
'limitall' => 'gbogbo',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => "Ṣè'múdájú àdírẹ́ẹ̀sì e-mail",
'confirmemail_noemail' => 'Ẹ kò tíì ṣètò àdírẹ́ẹ̀sì e-mail tó tótọ́ nínú [[Special:Preferences|ìfẹ́ràn oníṣe]] yín.',
'confirmemail_send' => 'Fi àmìọ̀rọ̀ ìmúdájú ránṣẹ́',
'specialpages-group-highuse' => 'Àwọn ojúewé ìlò gíga',
'specialpages-group-pages' => 'Àkójọ àwọn ojúewé',
'specialpages-group-pagetools' => 'Àwọn irinṣẹ́ ojúewé',
-'specialpages-group-wiki' => 'Àwọn irinṣẹ́ àti dátà wiki',
+'specialpages-group-wiki' => 'Àwọn irinṣẹ́ àti dátà',
'specialpages-group-redirects' => 'Ìtúnjúwe àwọn ojúewé pàtàkì',
'specialpages-group-spam' => 'Irínṣẹ́ spam',
'loginlanguagelabel' => '语言:$1',
'suspicious-userlogout' => '注销请求被拒绝,因为它似乎是由有设计缺陷的浏览器或缓存代理发出的。',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => '在 PHP 的 mail() 函数中的未知错误',
'user-mail-no-addy' => '尝试发送邮件而不附带电子邮件地址。',
'user-mail-no-body' => '试图发送空的或者主体短得不合理的电子邮件。',
'passwordreset-text' => '完成该表格以接收你账户信息的邮件提醒。',
'passwordreset-legend' => '重置密码',
'passwordreset-disabled' => '此wiki已经禁用密码重置。',
-'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据块之一}}',
+'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据项之一}}',
'passwordreset-username' => '用户名:',
'passwordreset-domain' => '域:',
'passwordreset-capture' => '查看生成的电子邮件吗?',
'history-fieldset-title' => '浏览历史',
'history-show-deleted' => '仅被删除的',
'histfirst' => '最早',
-'histlast' => '最后',
+'histlast' => '最新',
'historysize' => '($1字节)',
'historyempty' => '(空)',
'prefs-displaywatchlist' => '显示',
'prefs-diffs' => '差异对比',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => '电子邮件地址有效',
'email-address-validity-invalid' => '请输入有效的电子邮件地址',
'disambiguationspage' => 'Template:消歧义',
'disambiguations-text' => "以下的页面都有到'''消歧义页'''的链接,但它们可能可以链接到更适当的页面。<br />一个页面如果使用了[[MediaWiki:Disambiguationspage]]内的模板,则会被视为消歧义页。",
+'pageswithprop-prop' => '属性名称:',
+'pageswithprop-submit' => '提交',
+
'doubleredirects' => '双重重定向页',
'doubleredirectstext' => '本页面列出重定向至其他重定向页的页面。每行含有第一及第二重定向的链接和第二重定向的目标(通常是第一重定向应该指向的“真实”目标页面)。<del>带删除线的</del>条目已被解决。',
'double-redirect-fixed-move' => '[[$1]]已被移动。它现在重定向至[[$2]]。',
'listgrouprights-addgroup-self-all' => '添加所有用户组至自己的账户',
'listgrouprights-removegroup-self-all' => '删除自己的账户的所有用户组',
-# E-mail user
+# Email user
'mailnologin' => '无电子邮件地址',
'mailnologintext' => '你必须[[Special:UserLogin|登录]]并在你的[[Special:Preferences|系统设置]]中拥有有效的电子邮件地址才能向其他用户发送电子邮件。',
'emailuser' => '电邮联系',
'monthsall' => '全部',
'limitall' => '全部',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => '确认邮箱地址',
'confirmemail_noemail' => '你还没有在你的[[Special:Preferences|系统设置]]中设置有效的电子邮件地址。',
'confirmemail_text' => '{{SITENAME}}要求您在使用邮件功能之前验证您的邮箱地址。
'loginlanguagelabel' => '語言:$1',
'suspicious-userlogout' => '您登出的要求已經被拒絕,因為它可能是由已損壞的瀏覽器或者快取代理傳送。',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => '在 PHP 的 mail() 參數中的未知錯誤',
'user-mail-no-addy' => '嘗試不帶電郵地址發送電郵。',
'user-mail-no-body' => '試圖發送空的或主體不合理短的電子郵件。',
'showingresults' => '下面顯示從第 <b>$2</b> 條開始的 <b>$1</b> 條結果:',
'showingresultsnum' => "下面顯示從第 '''$2''' 條開始的 '''{{PLURAL:$3|1|$3}}''' 條結果。",
'showingresultsheader' => "對'''$4'''的{{PLURAL:$5|第'''$1'''至第'''$3'''項結果|第'''$1 - $2'''項,共'''$3'''項結果}}",
-'nonefound' => "'''注意''': 只有一些名字空間是會作為預設搜尋。嘗試''all:''去搜尋全部的頁面(包埋討論頁面、模板等),或可用需要的名字空間作為前綴。",
+'nonefound' => "'''注意:'''只有一些名字空間是會作為預設搜尋。嘗試''all:''去搜尋全部的頁面(包埋討論頁面、模板等),或可用需要的名字空間作為前綴。",
'search-nonefound' => '在查詢中無結果相符。',
'powersearch' => '進階搜尋',
'powersearch-legend' => '進階搜尋',
'prefs-displaywatchlist' => '顯示選項',
'prefs-diffs' => '差異',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => '電子郵件地址有效',
'email-address-validity-invalid' => '請提供一個有效的電子郵件地址',
'filehist-filesize' => '檔案大小',
'filehist-comment' => '註解',
'filehist-missing' => '檔案遺失',
-'imagelinks' => 'æ\96\87件使用情況',
+'imagelinks' => 'æª\94æ¡\88使用情況',
'linkstoimage' => '以下的$1個頁面連接到本檔案:',
'linkstoimage-more' => '多於$1個頁面連接到這個檔案。
下面的清單只列示了連去這個檔案的最首$1個頁面。
Template:消除歧義',
'disambiguations-text' => "以下的頁面都有至少一個連到'''消歧義頁'''的鏈接,但它們應鏈接到合適的頁面。<br />一個頁面如果使用了[[MediaWiki:Disambiguationspage]]內的模板,則會被視為消歧義頁。",
+'pageswithprop' => '有頁面屬性的頁面',
+'pageswithprop-legend' => '有頁面屬性的頁面',
+'pageswithprop-text' => '此頁列出所有頁面使用了特定的頁面屬性。',
+'pageswithprop-prop' => '屬性名稱:',
+'pageswithprop-submit' => '進入',
+
'doubleredirects' => '雙重重定向頁面',
'doubleredirectstext' => '這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是"真正"的目標頁面,也就是第一個重定向頁面應該指向的頁面。
<del>已劃去</del>的為已經解決之項目。',
'listgrouprights-addgroup-self-all' => '在自己的賬戶中加入所有群組',
'listgrouprights-removegroup-self-all' => '在自己的賬戶中移除所有群組',
-# E-mail user
+# Email user
'mailnologin' => '無電郵地址',
'mailnologintext' => '您必須先[[Special:UserLogin|登入]]
並在[[Special:Preferences|偏好設定]]
'monthsall' => '全部',
'limitall' => '全部',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => '確認郵箱位址',
'confirmemail_noemail' => '您沒有在您的[[Special:Preferences|用戶設定]]裡面輸入一個有效的 email 位址。',
'confirmemail_text' => '{{SITENAME}}要求您在使用郵件功能之前驗證您的郵箱位址。
'scarytranscludetoolong' => '[URL 地址太長]',
# Delete conflict
-'deletedwhileediting' => '警告: 此頁在您開始編輯之後已經被刪除﹗',
+'deletedwhileediting' => "'''警告:'''此頁在您開始編輯之後已經被刪除﹗",
'confirmrecreate' => "在您開始編輯這個頁面後,用戶[[User:$1|$1]] ([[User talk:$1|對話]])以下列原因刪除了這個頁面:
: ''$2''
請確認在您重新創建頁面前三思。",
'duration-centuries' => '$1個世紀',
'duration-millennia' => '$1千年',
+# Image rotation
+'rotate-comment' => '順時針旋轉圖像$1{{PLURAL:$1|度|度}}',
+
);
define( 'MEDIAWIKI', true );
$wgCommandLineMode = true;
+
# Turn off output buffering if it's on
- @ob_end_flush();
+ while( ob_get_level() > 0 ) {
+ ob_end_flush();
+ }
$this->validateParamsAndArgs();
}
doc:
php mwdocgen.php --all
- @echo 'Doc generation done. Look at ./docs/html/'
+ ./mwjsduck-gen
+ @echo 'PHP documentation (by Doxygen) in ./docs/html/'
+ @echo 'JS documentation (by JSDuck) in ./docs/js/'
man:
php mwdocgen.php --all --generate-man
runJobs.php
Immediately complete all jobs in the job queue
- stats.php
+ showCacheStats.php
Show all statistics stored in the cache
undelete.php
Update pages restriction to the new schema
userOptions.php
- Change user options
\ No newline at end of file
+ Change user options
--- /dev/null
+--
+-- Creates the pp_propname_page index on page_props
+--
+CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname, pp_page);
--- /dev/null
+<?php
+/**
+ * Removes all statistics tracking from the cache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to remove all statistics tracking from the cache.
+ *
+ * @ingroup Maintenance
+ */
+class ClearCacheStats extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Remove all statistics tracking from the cache";
+ }
+
+ public function execute() {
+ global $wgLocalDatabases, $wgMemc;
+ foreach ( $wgLocalDatabases as $db ) {
+ $wgMemc->delete( "$db:stats:request_with_session" );
+ $wgMemc->delete( "$db:stats:request_without_session" );
+ $wgMemc->delete( "$db:stats:pcache_hit" );
+ $wgMemc->delete( "$db:stats:pcache_miss_expired" );
+ $wgMemc->delete( "$db:stats:pcache_miss_absent" );
+ $wgMemc->delete( "$db:stats:pcache_miss_stub" );
+ $wgMemc->delete( "$db:stats:image_cache_hit" );
+ $wgMemc->delete( "$db:stats:image_cache_miss" );
+ $wgMemc->delete( "$db:stats:image_cache_update" );
+ $wgMemc->delete( "$db:stats:diff_cache_hit" );
+ $wgMemc->delete( "$db:stats:diff_cache_miss" );
+ $wgMemc->delete( "$db:stats:diff_uncacheable" );
+ $wgMemc->delete( "$db:stats:job-insert" );
+ $wgMemc->delete( "$db:stats:job-pop" );
+ }
+ }
+}
+
+$maintClass = "ClearCacheStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
--- /dev/null
+<?php
+/**
+ * Clear the cache of interwiki prefixes for all local wikis.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to clear the cache of interwiki prefixes for all local wikis.
+ *
+ * @ingroup Maintenance
+ */
+class ClearInterwikiCache extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Clear all interwiki links for all languages from the cache";
+ }
+
+ public function execute() {
+ global $wgLocalDatabases, $wgMemc;
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'interwiki', array( 'iw_prefix' ), false );
+ $prefixes = array();
+ foreach ( $res as $row ) {
+ $prefixes[] = $row->iw_prefix;
+ }
+
+ foreach ( $wgLocalDatabases as $db ) {
+ $this->output( "$db..." );
+ foreach ( $prefixes as $prefix ) {
+ $wgMemc->delete( "$db:interwiki:$prefix" );
+ }
+ $this->output( "done\n" );
+ }
+ }
+}
+
+$maintClass = "ClearInterwikiCache";
+require_once( RUN_MAINTENANCE_IF_MAIN );
+++ /dev/null
-<?php
-/**
- * Clear the cache of interwiki prefixes for all local wikis.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to clear the cache of interwiki prefixes for all local wikis.
- *
- * @ingroup Maintenance
- */
-class ClearInterwikiCache extends Maintenance {
-
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Clear all interwiki links for all languages from the cache";
- }
-
- public function execute() {
- global $wgLocalDatabases, $wgMemc;
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'interwiki', array( 'iw_prefix' ), false );
- $prefixes = array();
- foreach ( $res as $row ) {
- $prefixes[] = $row->iw_prefix;
- }
-
- foreach ( $wgLocalDatabases as $db ) {
- $this->output( "$db..." );
- foreach ( $prefixes as $prefix ) {
- $wgMemc->delete( "$db:interwiki:$prefix" );
- }
- $this->output( "done\n" );
- }
- }
-}
-
-$maintClass = "ClearInterwikiCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+++ /dev/null
-<?php
-/**
- * Removes all statistics tracking from the cache.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to remove all statistics tracking from the cache.
- *
- * @ingroup Maintenance
- */
-class clear_stats extends Maintenance {
-
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Remove all statistics tracking from the cache";
- }
-
- public function execute() {
- global $wgLocalDatabases, $wgMemc;
- foreach ( $wgLocalDatabases as $db ) {
- $wgMemc->delete( "$db:stats:request_with_session" );
- $wgMemc->delete( "$db:stats:request_without_session" );
- $wgMemc->delete( "$db:stats:pcache_hit" );
- $wgMemc->delete( "$db:stats:pcache_miss_expired" );
- $wgMemc->delete( "$db:stats:pcache_miss_absent" );
- $wgMemc->delete( "$db:stats:pcache_miss_stub" );
- $wgMemc->delete( "$db:stats:image_cache_hit" );
- $wgMemc->delete( "$db:stats:image_cache_miss" );
- $wgMemc->delete( "$db:stats:image_cache_update" );
- $wgMemc->delete( "$db:stats:diff_cache_hit" );
- $wgMemc->delete( "$db:stats:diff_cache_miss" );
- $wgMemc->delete( "$db:stats:diff_uncacheable" );
- $wgMemc->delete( "$db:stats:job-insert" );
- $wgMemc->delete( "$db:stats:job-pop" );
- }
- }
-}
-
-$maintClass = "clear_stats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
foreach ( $srcPathsRel as $srcPathRel ) {
$srcPaths[] = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
}
+ $t_start = microtime( true );
$fsFiles = $src->getLocalReferenceMulti( array( 'srcs' => $srcPaths, 'latest' => 1 ) );
+ $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
+ $this->output( "\nDownloaded these file(s) [{$ellapsed_ms}ms]:\n" .
+ implode( "\n", $srcPaths ) . "\n\n" );
}
// Determine what files need to be copied over...
* @file
* @ingroup Maintenance
* @author Rob Church <robchur@gmail.com>
+ * @author Pablo Castellano <pablo@anche.no>
*/
require_once( __DIR__ . '/Maintenance.php' );
*/
class CreateAndPromote extends Maintenance {
+ static $permitRoles = array( 'sysop', 'bureaucrat' );
+
public function __construct() {
parent::__construct();
- $this->mDescription = "Create a new user account";
- $this->addOption( "sysop", "Grant the account sysop rights" );
- $this->addOption( "bureaucrat", "Grant the account bureaucrat rights" );
+ $this->mDescription = "Create a new user account and/or grant it additional rights";
+ $this->addOption( "force", "If acccount exists already, just grant it rights or change password." );
+ foreach( self::$permitRoles as $role ) {
+ $this->addOption( $role, "Add the account to the {$role} group" );
+ }
$this->addArg( "username", "Username of new user" );
- $this->addArg( "password", "Password to set" );
+ $this->addArg( "password", "Password to set (not required if --force is used)", false);
}
public function execute() {
$username = $this->getArg( 0 );
$password = $this->getArg( 1 );
-
- $this->output( wfWikiID() . ": Creating and promoting User:{$username}..." );
+ $force = $this->hasOption( 'force' );
+ $inGroups = array();
$user = User::newFromName( $username );
if ( !is_object( $user ) ) {
$this->error( "invalid username.", true );
- } elseif ( 0 != $user->idForName() ) {
- $this->error( "account exists.", true );
}
- # Try to set the password
- try {
- $user->setPassword( $password );
- } catch ( PasswordError $pwe ) {
- $this->error( $pwe->getText(), true );
+ $exists = ( 0 !== $user->idForName() );
+
+ if ( $exists && !$force ) {
+ $this->error( "Account exists. Perhaps you want the --force option?", true );
+ } else if ( !$exists && !$password ) {
+ $this->error( "Argument <password> required!", false );
+ $this->maybeHelp( true );
+ } else if ( $exists ) {
+ $inGroups = $user->getGroups();
}
- # Insert the account into the database
- $user->addToDatabase();
- $user->saveSettings();
+ $promotions = array_diff( array_filter( self::$permitRoles, array( $this, 'hasOption' ) ), $inGroups );
- # Promote user
- if ( $this->hasOption( 'sysop' ) ) {
- $user->addGroup( 'sysop' );
+ if ( $exists && !$password && count( $promotions ) === 0 ) {
+ $this->output( "Account exists and nothing to do.\n" );
+ return;
+ } else if ( count( $promotions ) !== 0 ) {
+ $promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n";
+ if ( $exists ) {
+ $this->output( wfWikiID() . ": Promoting $promoText" );
+ } else {
+ $this->output( wfWikiID() . ": Creating and promoting $promoText" );
+ }
}
- if ( $this->hasOption( 'bureaucrat' ) ) {
- $user->addGroup( 'bureaucrat' );
+
+ if ( $password ) {
+ # Try to set the password
+ try {
+ $user->setPassword( $password );
+ if ( $exists ) {
+ $this->output( "Password set.\n" );
+ $user->saveSettings();
+ }
+ } catch ( PasswordError $pwe ) {
+ $this->error( $pwe->getText(), true );
+ }
}
- # Increment site_stats.ss_users
- $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
- $ssu->doUpdate();
+ if ( !$exists ) {
+ # Insert the account into the database
+ $user->addToDatabase();
+ $user->saveSettings();
+ }
+
+ # Promote user
+ array_map( array( $user, 'addGroup' ), $promotions );
+
+ if ( !$exists ) {
+ # Increment site_stats.ss_users
+ $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
+ $ssu->doUpdate();
+ }
$this->output( "done.\n" );
}
* @ingroup Maintenance
*/
class DeleteArchivedFilesImplementation {
- static public function doDelete( $output, $force ) {
+ public static function doDelete( $output, $force ) {
# Data should come off the master, wrapped in a transaction
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
* purgeRedundantText(). See Maintenance for a description of
* those methods.
*/
- static public function doDelete( $maint ) {
+ public static function doDelete( $maint ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
// Potentially debug globals
$maintenance->globals();
+ // Perform deferred updates.
+ DeferredUpdates::doUpdates( 'commit' );
+
// log profiling info
wfLogProfilingData();
+
+ // Commit and close up!
+ $factory = wfGetLBFactory();
+ $factory->commitMasterChanges();
+ $factory->shutdown();
} catch ( MWException $mwe ) {
echo( $mwe->getText() );
exit( 1 );
* @ingroup Maintenance
*/
-$initialTime = microtime( true );
$wgProfiler = array( 'class' => 'ProfilerSimpleText' );
error_reporting( E_ALL );
/**
** Randomly returns one element of the input array.
*/
- static public function chooseInput( array $input ) {
+ public static function chooseInput( array $input ) {
$randindex = wikiFuzz::randnum( count( $input ) - 1 );
return $input[$randindex];
}
* @param $start int
* @return int
*/
- static public function randnum( $finish, $start = 0 ) {
+ public static function randnum( $finish, $start = 0 ) {
return mt_rand( $start, $finish );
}
* Returns a mix of random text and random wiki syntax.
* @return string
*/
- static private function randstring() {
+ private static function randstring() {
$thestring = "";
for ( $i = 0; $i < 40; $i++ ) {
* or random data from "other".
* @return string
*/
- static private function makestring() {
+ private static function makestring() {
$what = wikiFuzz::randnum( 2 );
if ( $what == 0 ) {
return wikiFuzz::randstring();
* @param $matches
* @return string
*/
- static private function stringEscape( $matches ) {
+ private static function stringEscape( $matches ) {
return sprintf( "\\x%02x", ord( $matches[1] ) );
}
* @param $str string
* @return string
*/
- static public function makeTitleSafe( $str ) {
+ public static function makeTitleSafe( $str ) {
$legalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF";
return preg_replace_callback(
"/([^$legalTitleChars])/", 'wikiFuzz::stringEscape',
** Returns a string of fuzz text.
* @return string
*/
- static private function loop() {
+ private static function loop() {
switch ( wikiFuzz::randnum( 3 ) ) {
case 1: // an opening tag, with parameters.
$string = "";
* Returns one of the three styles of random quote: ', ", and nothing.
* @return string
*/
- static private function getRandQuote() {
+ private static function getRandQuote() {
switch ( wikiFuzz::randnum( 3 ) ) {
case 1 : return "'";
case 2 : return "\"";
* @param $maxtypes int
* @return string
*/
- static public function makeFuzz( $maxtypes = 2 ) {
+ public static function makeFuzz( $maxtypes = 2 ) {
$page = "";
for ( $k = 0; $k < $maxtypes; $k++ ) {
$page .= wikiFuzz::loop();
--- /dev/null
+<?php
+/**
+ * Print serialized output of MediaWiki config vars
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Tim Starling
+ * @author Antoine Musso
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Print serialized output of MediaWiki config vars
+ *
+ * @ingroup Maintenance
+ */
+class GetConfiguration extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Get serialized MediaWiki site configuration";
+ $this->addOption( 'settings', 'Space-separated list of wg* variables', true, true );
+ $this->addOption( 'format', 'PHP or JSON', true, true );
+ $this->addOption( 'wiki', 'Wiki ID', true, true );
+ }
+
+ public function execute() {
+ $res = array();
+ foreach ( explode( ' ', $this->getOption( 'settings' ) ) as $name ) {
+ if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
+ throw new MWException( "Variable '$name' does start with 'wg'." );
+ } elseif ( !isset( $GLOBALS[$name] ) ) {
+ throw new MWException( "Variable '$name' is not set." );
+ } elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) {
+ throw new MWException( "Variable '$name' includes non-array, non-scalar, items." );
+ }
+ $res[$name] = $GLOBALS[$name];
+ }
+
+ $out = null;
+ switch( $this->getOption( 'format' ) ) {
+ case 'PHP':
+ $out = serialize( $res );
+ break;
+ case 'JSON':
+ $out = FormatJson::encode( $res );
+ break;
+ default:
+ throw new MWException( "Invalid serialization format given." );
+ }
+ if ( !is_string( $out ) ) {
+ throw new MWException( "Failed to serialize the requested settings." );
+ }
+
+ $this->output( $out . "\n" );
+ }
+
+ private function isAllowedVariable( $value ) {
+ if ( is_array( $value ) ) {
+ foreach ( $value as $k => $v ) {
+ if ( !$this->isAllowedVariable( $v ) ) {
+ return false;
+ }
+ }
+ return true;
+ } elseif ( is_scalar( $value ) ) {
+ return true;
+ }
+ return false;
+ }
+}
+
+$maintClass = "GetConfiguration";
+require_once( RUN_MAINTENANCE_IF_MAIN );
+++ /dev/null
--- good
-ALTER TABLE user_groups ADD CONSTRAINT USER_GROUPS_FK1 FOREIGN KEY (ug_user) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE user_newtalk ADD CONSTRAINT USER_NEWTALK_FK1 FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- referenced value not found
-ALTER TABLE revision ADD CONSTRAINT REVISION_PAGE_FK FOREIGN KEY (rev_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
--- referenced value not found
-ALTER TABLE revision ADD CONSTRAINT REVISION_USER_FK FOREIGN KEY (rev_user) REFERENCES user(user_id) ON DELETE RESTRICT
-;
-
--- good
-ALTER TABLE page_restrictions ADD CONSTRAINT PAGE_RESTRICTIONS_PAGE_FK FOREIGN KEY (pr_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE page_props ADD CONSTRAINT PAGE_PROPS_PAGE_FK FOREIGN KEY (pp_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE archive ADD CONSTRAINT ARCHIVE_USER_FK FOREIGN KEY (ar_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- referenced value not found
-ALTER TABLE redirect ADD CONSTRAINT REDIRECT_FROM_FK FOREIGN KEY (rd_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- referenced value not found
-ALTER TABLE pagelinks ADD CONSTRAINT PAGELINKS_FROM_FK FOREIGN KEY (pl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE templatelinks ADD CONSTRAINT TEMPLATELINKS_FROM_FK FOREIGN KEY (tl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE imagelinks ADD CONSTRAINT IMAGELINKS_FROM_FK FOREIGN KEY (il_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE categorylinks ADD CONSTRAINT CATEGORYLINKS_FROM_FK FOREIGN KEY (cl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE externallinks ADD CONSTRAINT EXTERNALLINKS_FROM_FK FOREIGN KEY (el_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE langlinks ADD CONSTRAINT LANGLINKS_FROM_FK FOREIGN KEY (ll_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE ipblocks ADD CONSTRAINT IPBLOCKS_USER_FK FOREIGN KEY (ipb_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE ipblocks ADD CONSTRAINT IPBLOCKS_BY_FK FOREIGN KEY (ipb_by) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE image ADD CONSTRAINT IMAGE_USER_FK FOREIGN KEY (img_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_USER_FK FOREIGN KEY (oi_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_NAME_FK FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE filearchive ADD CONSTRAINT FILEARCHIVE_DELETED_USER_FK FOREIGN KEY (fa_deleted_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE filearchive ADD CONSTRAINT FILEARCHIVE_USER_FK FOREIGN KEY (fa_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE recentchanges ADD CONSTRAINT RECENTCHANGES_USER_FK FOREIGN KEY (rc_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE recentchanges ADD CONSTRAINT RECENTCHANGES_CUR_ID_FK FOREIGN KEY (rc_cur_id) REFERENCES page(page_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE watchlist ADD CONSTRAINT WATCHLIST_USER_FK FOREIGN KEY (wl_user) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE protected_titles ADD CONSTRAINT PROTECTED_TITLES_USER_FK FOREIGN KEY (pt_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE logging ADD CONSTRAINT LOGGING_USER_FK FOREIGN KEY (log_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
\ No newline at end of file
+++ /dev/null
---
--- patch-categorylinks-better-collation.sql
---
---
--- Track category inclusions *used inline*
--- This tracks a single level of category membership
--- (folksonomic tagging, really).
---
-CREATE TABLE categorylinks (
- cl_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- cl_to VARCHAR(255) NOT NULL,
- -- cl_sortkey has to be at least 86 wide
- -- in order to be compatible with the old MySQL schema from MW 1.10
- --cl_sortkey VARCHAR(86),
- cl_sortkey VARCHAR(230) FOR BIT DATA NOT NULL ,
- cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL ,
- cl_timestamp TIMESTAMP(3) NOT NULL,
- cl_collation VARCHAR(32) FOR BIT DATA NOT NULL ,
- cl_type VARCHAR(6) FOR BIT DATA NOT NULL
-);
+++ /dev/null
-CREATE UNIQUE INDEX change_tag_rc_tag ON change_tag (ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX change_tag_log_tag ON change_tag (ct_log_id,ct_tag);
-CREATE UNIQUE INDEX change_tag_rev_tag ON change_tag (ct_rev_id,ct_tag);
--- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX change_tag_tag_id ON change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
+++ /dev/null
--- A table to track tags for revisions, logs and recent changes.
-CREATE TABLE change_tag (
- ct_rc_id INTEGER,
- ct_log_id INTEGER,
- ct_rev_id INTEGER,
- ct_tag varchar(255) NOT NULL,
- ct_params CLOB(64K) INLINE LENGTH 4096
-);
+++ /dev/null
--- Rollup table to pull a LIST of tags simply
-CREATE TABLE tag_summary (
- ts_rc_id INTEGER,
- ts_log_id INTEGER,
- ts_rev_id INTEGER,
- ts_tags CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
+++ /dev/null
-CREATE TABLE valid_tag (
- vt_tag varchar(255) NOT NULL PRIMARY KEY
-);
+++ /dev/null
-ALTER TABLE categorylinks ADD cl_collation VARCHAR(32) FOR BIT DATA NOT NULL
+++ /dev/null
-ALTER TABLE categorylinks ADD cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL
+++ /dev/null
-ALTER TABLE categorylinks ADD cl_type VARCHAR(6) FOR BIT DATA NOT NULL
+++ /dev/null
-CREATE TABLE external_user (
- -- Foreign key to user_id
- eu_local_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-
- -- Some opaque identifier provided by the external database
- eu_external_id VARCHAR(255) NOT NULL
-);
+++ /dev/null
-CREATE TABLE ipblocks (
- ipb_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --DEFAULT nextval('ipblocks_ipb_id_val'),
- ipb_address VARCHAR(1024),
- ipb_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- ipb_by BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- ipb_by_text VARCHAR(255) NOT NULL DEFAULT '',
- ipb_reason VARCHAR(1024) NOT NULL,
- ipb_timestamp TIMESTAMP(3) NOT NULL,
- ipb_auto SMALLINT NOT NULL DEFAULT 0,
- ipb_anon_only SMALLINT NOT NULL DEFAULT 0,
- ipb_create_account SMALLINT NOT NULL DEFAULT 1,
- ipb_enable_autoblock SMALLINT NOT NULL DEFAULT 1,
- ipb_expiry TIMESTAMP(3) NOT NULL,
- ipb_range_start VARCHAR(1024),
- ipb_range_end VARCHAR(1024),
- ipb_deleted SMALLINT NOT NULL DEFAULT 0,
- ipb_block_email SMALLINT NOT NULL DEFAULT 0,
- ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0
-
-);
+++ /dev/null
-ALTER TABLE interwiki ADD iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL
+++ /dev/null
-CREATE TABLE interwiki (
- iw_prefix VARCHAR(32) NOT NULL UNIQUE,
- iw_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_wikiid varchar(64) NOT NULL,
- iw_local SMALLINT NOT NULL,
- iw_trans SMALLINT NOT NULL DEFAULT 0
-);
+++ /dev/null
-ALTER TABLE interwiki ADD iw_wikiid varchar(64) NOT NULL
+++ /dev/null
-CREATE TABLE "IWLINKS"
-(
-"IWL_FROM" INT NOT NULL ,
-"IWL_PREFIX" VARCHAR(20) FOR BIT DATA NOT NULL ,
-"IWL_TITLE" VARCHAR(255) FOR BIT DATA NOT NULL
-)
-;
+++ /dev/null
-CREATE TABLE l10n_cache (
- -- Language code
- lc_lang VARCHAR(32) NOT NULL,
- -- Cache key
- lc_key VARCHAR(255) NOT NULL,
- -- Value
- lc_value CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
+++ /dev/null
-CREATE TABLE log_search (
- -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
- ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
- -- The value of the ID
- ls_value varchar(255) NOT NULL,
- -- Key to log_id
- ls_log_id BIGINT NOT NULL default 0
-);
+++ /dev/null
-CREATE TABLE log_search (
- -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
- ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
- -- The value of the ID
- ls_value varchar(255) NOT NULL,
- -- Key to log_id
- ls_log_id BIGINT NOT NULL default 0
-);
+++ /dev/null
-CREATE TABLE logging (
- log_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --PRIMARY KEY DEFAULT nextval('log_log_id_seq'),
- log_type VARCHAR(32) NOT NULL,
- log_action VARCHAR(32) NOT NULL,
- log_timestamp TIMESTAMP(3) NOT NULL,
- log_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- -- Name of the user who performed this action
- log_user_text VARCHAR(255) NOT NULL default '',
- log_namespace SMALLINT NOT NULL,
- log_title VARCHAR(255) NOT NULL,
- log_page BIGINT,
- log_comment VARCHAR(255),
- log_params CLOB(64K) INLINE LENGTH 4096,
- log_deleted SMALLINT NOT NULL DEFAULT 0
-);
+++ /dev/null
-CREATE TABLE "MODULE_DEPS" (
-"MD_MODULE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MD_SKIN" VARCHAR(32) FOR BIT DATA NOT NULL ,
-"MD_DEPS" CLOB(16M) INLINE LENGTH 4096 NOT NULL
-)
-;
+++ /dev/null
-CREATE TABLE "MSG_RESOURCE"
-(
-"MR_RESOURCE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MR_LANG" VARCHAR(32) FOR BIT DATA NOT NULL ,
-"MR_BLOB" BLOB NOT NULL ,
-"MR_TIMESTAMP" TIMESTAMP(3) NOT NULL
-)
-;
+++ /dev/null
-CREATE TABLE "MSG_RESOURCE_LINKS"
-(
-"MRL_RESOURCE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MRL_MESSAGE" VARCHAR(255) FOR BIT DATA NOT NULL
-)
-;
+++ /dev/null
-CREATE TABLE redirect (
- rd_from BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --REFERENCES page(page_id) ON DELETE CASCADE,
- rd_namespace SMALLINT NOT NULL DEFAULT 0,
- rd_title VARCHAR(255) NOT NULL DEFAULT '',
- rd_interwiki varchar(32),
- rd_fragment VARCHAR(255)
-);
+++ /dev/null
-CREATE TABLE site_stats (
- ss_row_id BIGINT NOT NULL UNIQUE,
- ss_total_views BIGINT DEFAULT 0,
- ss_total_edits BIGINT DEFAULT 0,
- ss_good_articles BIGINT DEFAULT 0,
- ss_total_pages INTEGER DEFAULT -1,
- ss_users INTEGER DEFAULT -1,
- ss_active_users INTEGER DEFAULT -1,
- ss_admins INTEGER DEFAULT -1,
- ss_images INTEGER DEFAULT 0
-);
+++ /dev/null
-CREATE TABLE updatelog (
- ul_key VARCHAR(255) NOT NULL PRIMARY KEY
-);
+++ /dev/null
-CREATE UNIQUE INDEX "UQ61_MSG_RESOURCE_LINKS" ON "MSG_RESOURCE_LINKS"
-(
-"MRL_MESSAGE",
-"MRL_RESOURCE"
-)
-ALLOW REVERSE SCANS
-;
+++ /dev/null
-CREATE UNIQUE INDEX "UQ81_MSG_RESOURCE" ON "MSG_RESOURCE"
-(
-"MR_RESOURCE"
-,"MR_LANG"
-)
-ALLOW REVERSE SCANS
-;
+++ /dev/null
-CREATE UNIQUE INDEX "UQ96_MODULE_DEPS" ON "MODULE_DEPS"
-(
-"MD_MODULE"
-,"MD_SKIN"
-)
-ALLOW REVERSE SCANS
-;
+++ /dev/null
-CREATE TABLE user_properties (
- -- Foreign key to user.user_id
- up_user BIGINT NOT NULL,
-
- -- Name of the option being saved. This is indexed for bulk lookup.
- up_property VARCHAR(32) FOR BIT DATA NOT NULL,
-
- -- Property value as a string.
- up_value CLOB(64K) INLINE LENGTH 4096
-);
+++ /dev/null
--- IBM DB2
-
--- SQL to create the initial tables for the MediaWiki database.
--- This is read and executed by the install script; you should
--- not have to run it by itself unless doing a manual install.
-
--- Notes:
--- * DB2 will convert all table and column names to all caps internally.
--- * DB2 has a 32k limit on SQL filesize, so it may be necessary
--- to split this into two files soon.
-
-
-CREATE TABLE user (
- -- Needs to start with 0
- user_id BIGINT
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
- user_name VARCHAR(255) NOT NULL UNIQUE,
- user_real_name VARCHAR(255),
- user_password VARCHAR(1024),
- user_newpassword VARCHAR(1024),
- user_newpass_time TIMESTAMP(3),
- user_token VARCHAR(255),
- user_email VARCHAR(1024),
- user_email_token VARCHAR(255),
- user_email_token_expires TIMESTAMP(3),
- user_email_authenticated TIMESTAMP(3),
- -- obsolete, replace by user_properties table
- -- user_options CLOB(64K) INLINE LENGTH 4096,
- user_touched TIMESTAMP(3),
- user_registration TIMESTAMP(3),
- user_editcount INTEGER
-);
-CREATE INDEX user_email_token_idx
- ON user (user_email_token);
-CREATE UNIQUE INDEX user_include_idx
- ON user (user_id)
- INCLUDE (user_name, user_real_name, user_password, user_newpassword,
- user_newpass_time, user_token,
- user_email, user_email_token, user_email_token_expires,
- user_email_authenticated,
- user_touched, user_registration, user_editcount);
-CREATE UNIQUE INDEX user_email
- ON user (user_email);
-
-
-
--- Create a dummy user to satisfy fk contraints especially with revisions
-INSERT INTO user(
- user_name, user_real_name, user_password, user_newpassword, user_newpass_time,
- user_email, user_email_authenticated, user_token, user_registration, user_editcount
-)
-VALUES (
- 'Anonymous', '', NULL, NULL, CURRENT_TIMESTAMP,
- NULL, NULL, NULL, CURRENT_TIMESTAMP, 0
-);
-
-
-
-CREATE TABLE user_groups (
- ug_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- ug_group VARCHAR(255) NOT NULL
-);
-CREATE INDEX user_groups_unique
- ON user_groups (ug_user, ug_group);
-
-
-
-CREATE TABLE user_newtalk (
- -- registered users key
- user_id BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- -- anonymous users key
- user_ip VARCHAR(40),
- user_last_timestamp TIMESTAMP(3)
-);
-CREATE INDEX user_newtalk_id_idx
- ON user_newtalk (user_id);
-CREATE INDEX user_newtalk_ip_idx
- ON user_newtalk (user_ip);
-CREATE UNIQUE INDEX user_newtalk_include_idx
- ON user_newtalk (user_id, user_ip)
- INCLUDE (user_last_timestamp);
-
-
-
-CREATE TABLE page (
- page_id BIGINT
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- page_namespace SMALLINT NOT NULL,
- page_title VARCHAR(255) NOT NULL,
- page_restrictions VARCHAR(1024),
- page_counter BIGINT NOT NULL DEFAULT 0,
- page_is_redirect SMALLINT NOT NULL DEFAULT 0,
- page_is_new SMALLINT NOT NULL DEFAULT 0,
- page_random NUMERIC(15,14) NOT NULL,
- page_touched TIMESTAMP(3),
- page_latest BIGINT NOT NULL, -- FK?
- page_len BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX page_unique_name
- ON page (page_namespace, page_title);
-CREATE INDEX page_random_idx
- ON page (page_random);
-CREATE INDEX page_len_idx
- ON page (page_len);
-CREATE UNIQUE INDEX page_id_include
- ON page (page_id)
- INCLUDE (page_namespace, page_title, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
-CREATE UNIQUE INDEX page_name_include
- ON page (page_namespace, page_title)
- INCLUDE (page_id, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
-
-
-
-CREATE TABLE revision (
- rev_id BIGINT
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- rev_page BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page (page_id) ON DELETE CASCADE,
- rev_text_id BIGINT, -- FK
- rev_comment VARCHAR(1024),
- rev_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE RESTRICT,
- rev_user_text VARCHAR(255) NOT NULL,
- rev_timestamp TIMESTAMP(3) NOT NULL,
- rev_minor_edit SMALLINT NOT NULL DEFAULT 0,
- rev_deleted SMALLINT NOT NULL DEFAULT 0,
- rev_len BIGINT,
- rev_parent_id BIGINT DEFAULT NULL,
- rev_sha1 VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE UNIQUE INDEX revision_unique
- ON revision (rev_page, rev_id);
-CREATE INDEX rev_text_id_idx
- ON revision (rev_text_id);
-CREATE INDEX rev_timestamp_idx
- ON revision (rev_timestamp);
-CREATE INDEX rev_user_idx
- ON revision (rev_user);
-CREATE INDEX rev_user_text_idx
- ON revision (rev_user_text);
-
-
-
-CREATE TABLE text ( -- replaces reserved word 'text'
- old_id INTEGER
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- old_text CLOB(16M) INLINE LENGTH 4096,
- old_flags VARCHAR(1024)
-);
-
-
-
-CREATE TABLE page_restrictions (
- pr_id BIGINT
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- pr_page INTEGER NOT NULL DEFAULT 0,
- --(used to be nullable)
- -- REFERENCES page (page_id) ON DELETE CASCADE,
- pr_type VARCHAR(60) NOT NULL,
- pr_level VARCHAR(60) NOT NULL,
- pr_cascade SMALLINT NOT NULL,
- pr_user INTEGER,
- pr_expiry TIMESTAMP(3)
- --PRIMARY KEY (pr_page, pr_type)
-);
---ALTER TABLE page_restrictions ADD CONSTRAINT page_restrictions_pk PRIMARY KEY (pr_page, pr_type);
-CREATE UNIQUE INDEX pr_pagetype
- ON page_restrictions (pr_page, pr_type);
-CREATE INDEX pr_typelevel
- ON page_restrictions (pr_type, pr_level);
-CREATE INDEX pr_level
- ON page_restrictions (pr_level);
-CREATE INDEX pr_cascade
- ON page_restrictions (pr_cascade);
-
-
-
-CREATE TABLE page_props (
- pp_page INTEGER NOT NULL DEFAULT 0,
- -- REFERENCES page (page_id) ON DELETE CASCADE,
- pp_propname VARCHAR(255) NOT NULL,
- pp_value CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- PRIMARY KEY (pp_page, pp_propname)
-);
-CREATE INDEX page_props_propname
- ON page_props (pp_propname);
-
-
-
-CREATE TABLE archive (
- ar_namespace SMALLINT NOT NULL,
- ar_title VARCHAR(255) NOT NULL,
- ar_text CLOB(16M) INLINE LENGTH 4096,
- ar_comment VARCHAR(1024),
- ar_user BIGINT NOT NULL,
- -- no foreign keys in MySQL
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- ar_user_text VARCHAR(255) NOT NULL,
- ar_timestamp TIMESTAMP(3) NOT NULL,
- ar_minor_edit SMALLINT NOT NULL DEFAULT 0,
- ar_flags VARCHAR(1024),
- ar_rev_id INTEGER,
- ar_text_id INTEGER,
- ar_deleted SMALLINT NOT NULL DEFAULT 0,
- ar_len INTEGER,
- ar_page_id INTEGER,
- ar_parent_id INTEGER,
- ar_sha1 VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX archive_name_title_timestamp
- ON archive (ar_namespace, ar_title, ar_timestamp);
-CREATE INDEX archive_user_text
- ON archive (ar_user_text);
-
-
-
-CREATE TABLE redirect (
- rd_from BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --REFERENCES page(page_id) ON DELETE CASCADE,
- rd_namespace SMALLINT NOT NULL DEFAULT 0,
- rd_title VARCHAR(255) NOT NULL DEFAULT '',
- rd_interwiki VARCHAR(32),
- rd_fragment VARCHAR(255)
-);
-CREATE INDEX redirect_ns_title
- ON redirect (rd_namespace, rd_title, rd_from);
-
-
-CREATE TABLE pagelinks (
- pl_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- pl_namespace SMALLINT NOT NULL,
- pl_title VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX pagelink_unique
- ON pagelinks (pl_from, pl_namespace, pl_title);
-
-
-
-CREATE TABLE templatelinks (
- tl_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- tl_namespace SMALLINT NOT NULL,
- tl_title VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX templatelinks_unique
- ON templatelinks (tl_namespace, tl_title, tl_from);
-CREATE UNIQUE INDEX tl_from_idx
- ON templatelinks (tl_from, tl_namespace, tl_title);
-
-
-
-CREATE TABLE imagelinks (
- il_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- il_to VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX il_from_idx
- ON imagelinks (il_to, il_from);
-CREATE UNIQUE INDEX il_to_idx
- ON imagelinks (il_from, il_to);
-
-
-
-CREATE TABLE categorylinks (
- cl_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- cl_to VARCHAR(255) NOT NULL,
- -- cl_sortkey has to be at least 86 wide
- -- in order to be compatible with the old MySQL schema from MW 1.10
- --cl_sortkey VARCHAR(86),
- cl_sortkey VARCHAR(230) FOR BIT DATA NOT NULL,
- cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL,
- cl_timestamp TIMESTAMP(3) NOT NULL,
- cl_collation VARCHAR(32) FOR BIT DATA NOT NULL,
- cl_type VARCHAR(6) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX cl_from
- ON categorylinks (cl_from, cl_to);
-CREATE INDEX cl_sortkey
- ON categorylinks (cl_to, cl_sortkey, cl_from);
-
-
-
-CREATE TABLE externallinks (
- el_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- el_to VARCHAR(1024) NOT NULL,
- el_index VARCHAR(1024) NOT NULL
-);
-CREATE INDEX externallinks_from_to
- ON externallinks (el_from, el_to);
-CREATE INDEX externallinks_index
- ON externallinks (el_index);
-
-
-
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE external_user (
- -- Foreign key to user_id
- eu_local_id BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-
- -- Some opaque identifier provided by the external database
- eu_external_id VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX eu_external_id_idx
- ON external_user (eu_external_id)
- INCLUDE (eu_local_id);
-CREATE UNIQUE INDEX eu_local_id_idx
- ON external_user (eu_local_id)
- INCLUDE (eu_external_id);
-
-
-
-CREATE TABLE langlinks (
- ll_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page (page_id) ON DELETE CASCADE,
- ll_lang VARCHAR(20),
- ll_title VARCHAR(255)
-);
-CREATE UNIQUE INDEX langlinks_unique
- ON langlinks (ll_from, ll_lang);
-CREATE INDEX langlinks_lang_title
- ON langlinks (ll_lang, ll_title);
-
-
-
-CREATE TABLE site_stats (
- ss_row_id BIGINT NOT NULL UNIQUE,
- ss_total_views BIGINT DEFAULT 0,
- ss_total_edits BIGINT DEFAULT 0,
- ss_good_articles BIGINT DEFAULT 0,
- ss_total_pages INTEGER DEFAULT -1,
- ss_users INTEGER DEFAULT -1,
- ss_active_users INTEGER DEFAULT -1,
- ss_admins INTEGER DEFAULT -1,
- ss_images INTEGER DEFAULT 0
-);
-
-
-
-CREATE TABLE hitcounter (
- hc_id BIGINT NOT NULL
-);
-
-
-
-CREATE TABLE ipblocks (
- ipb_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- ipb_address VARCHAR(1024),
- ipb_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- ipb_by BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- ipb_by_text VARCHAR(255) NOT NULL DEFAULT '',
- ipb_reason VARCHAR(1024) NOT NULL,
- ipb_timestamp TIMESTAMP(3) NOT NULL,
- ipb_auto SMALLINT NOT NULL DEFAULT 0,
- ipb_anon_only SMALLINT NOT NULL DEFAULT 0,
- ipb_create_account SMALLINT NOT NULL DEFAULT 1,
- ipb_enable_autoblock SMALLINT NOT NULL DEFAULT 1,
- ipb_expiry TIMESTAMP(3) NOT NULL,
- ipb_range_start VARCHAR(1024),
- ipb_range_end VARCHAR(1024),
- ipb_deleted SMALLINT NOT NULL DEFAULT 0,
- ipb_block_email SMALLINT NOT NULL DEFAULT 0,
- ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0,
- ipb_parent_block_id INTEGER DEFAULT NULL
- -- REFERENCES ipblocks(ipb_id) ON DELETE SET NULL
-
-);
-CREATE INDEX ipb_address
- ON ipblocks (ipb_address);
-CREATE INDEX ipb_user
- ON ipblocks (ipb_user);
-CREATE INDEX ipb_range
- ON ipblocks (ipb_range_start, ipb_range_end);
-
-
-
-CREATE TABLE image (
- img_name VARCHAR(255) NOT NULL
- PRIMARY KEY,
- img_size BIGINT NOT NULL,
- img_width INTEGER NOT NULL,
- img_height INTEGER NOT NULL,
- img_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- img_bits SMALLINT,
- img_media_type VARCHAR(255),
- img_major_mime VARCHAR(255) DEFAULT 'unknown',
- img_minor_mime VARCHAR(32) DEFAULT 'unknown',
- img_description VARCHAR(1024) NOT NULL DEFAULT '',
- img_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- img_user_text VARCHAR(255) NOT NULL DEFAULT '',
- img_timestamp TIMESTAMP(3),
- img_sha1 VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX img_size_idx
- ON image (img_size);
-CREATE INDEX img_timestamp_idx
- ON image (img_timestamp);
-CREATE INDEX img_sha1
- ON image (img_sha1);
-
-
-CREATE TABLE oldimage (
- oi_name VARCHAR(255) NOT NULL DEFAULT '',
- oi_archive_name VARCHAR(255) NOT NULL,
- oi_size BIGINT NOT NULL,
- oi_width INTEGER NOT NULL,
- oi_height INTEGER NOT NULL,
- oi_bits SMALLINT NOT NULL,
- oi_description VARCHAR(1024),
- oi_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- oi_user_text VARCHAR(255) NOT NULL,
- oi_timestamp TIMESTAMP(3) NOT NULL,
- oi_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- oi_media_type VARCHAR(255),
- oi_major_mime VARCHAR(255) NOT NULL DEFAULT 'unknown',
- oi_minor_mime VARCHAR(255) NOT NULL DEFAULT 'unknown',
- oi_deleted SMALLINT NOT NULL DEFAULT 0,
- oi_sha1 VARCHAR(255) NOT NULL DEFAULT ''
- --FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
-);
-CREATE INDEX oi_name_timestamp
- ON oldimage (oi_name, oi_timestamp);
-CREATE INDEX oi_name_archive_name
- ON oldimage (oi_name, oi_archive_name);
-CREATE INDEX oi_sha1
- ON oldimage (oi_sha1);
-
-
-
-CREATE TABLE filearchive (
- fa_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- fa_name VARCHAR(255) NOT NULL,
- fa_archive_name VARCHAR(255),
- fa_storage_group VARCHAR(255),
- fa_storage_key VARCHAR(64) DEFAULT '',
- fa_deleted_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- fa_deleted_timestamp TIMESTAMP(3) NOT NULL,
- fa_deleted_reason VARCHAR(255),
- fa_size BIGINT NOT NULL,
- fa_width INTEGER NOT NULL,
- fa_height INTEGER NOT NULL,
- fa_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- fa_bits SMALLINT,
- fa_media_type VARCHAR(255),
- fa_major_mime VARCHAR(255) DEFAULT 'unknown',
- fa_minor_mime VARCHAR(255) DEFAULT 'unknown',
- fa_description VARCHAR(1024) NOT NULL,
- fa_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- fa_user_text VARCHAR(255) NOT NULL,
- fa_timestamp TIMESTAMP(3),
- fa_deleted SMALLINT NOT NULL DEFAULT 0
-);
-CREATE INDEX fa_name_time
- ON filearchive (fa_name, fa_timestamp);
-CREATE INDEX fa_dupe
- ON filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX fa_notime
- ON filearchive (fa_deleted_timestamp);
-CREATE INDEX fa_nouser
- ON filearchive (fa_deleted_user);
-
-
-
-CREATE TABLE recentchanges (
- rc_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- rc_timestamp TIMESTAMP(3) NOT NULL,
- rc_cur_time TIMESTAMP(3) NOT NULL,
- rc_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- rc_user_text VARCHAR(255) NOT NULL,
- rc_namespace SMALLINT NOT NULL,
- rc_title VARCHAR(255) NOT NULL,
- rc_comment VARCHAR(255),
- rc_minor SMALLINT NOT NULL DEFAULT 0,
- rc_bot SMALLINT NOT NULL DEFAULT 0,
- rc_new SMALLINT NOT NULL DEFAULT 0,
- rc_cur_id BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE SET NULL,
- rc_this_oldid BIGINT NOT NULL,
- rc_last_oldid BIGINT NOT NULL,
- rc_type SMALLINT NOT NULL DEFAULT 0,
- rc_moved_to_ns SMALLINT,
- rc_moved_to_title VARCHAR(255),
- rc_patrolled SMALLINT NOT NULL DEFAULT 0,
- rc_ip VARCHAR(40), -- was CIDR type
- rc_old_len INTEGER,
- rc_new_len INTEGER,
- rc_deleted SMALLINT NOT NULL DEFAULT 0,
- rc_logid BIGINT NOT NULL DEFAULT 0,
- rc_log_type VARCHAR(255),
- rc_log_action VARCHAR(255),
- rc_params CLOB(64K) INLINE LENGTH 4096
-);
-CREATE INDEX rc_timestamp
- ON recentchanges (rc_timestamp);
-CREATE INDEX rc_namespace_title
- ON recentchanges (rc_namespace, rc_title);
-CREATE INDEX rc_cur_id
- ON recentchanges (rc_cur_id);
-CREATE INDEX new_name_timestamp
- ON recentchanges (rc_new, rc_namespace, rc_timestamp);
-CREATE INDEX rc_ip
- ON recentchanges (rc_ip);
-
-
-
-CREATE TABLE watchlist (
- wl_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- wl_namespace SMALLINT NOT NULL DEFAULT 0,
- wl_title VARCHAR(255) NOT NULL,
- wl_notificationtimestamp TIMESTAMP(3)
-);
-CREATE UNIQUE INDEX wl_user_namespace_title
- ON watchlist (wl_namespace, wl_title, wl_user);
-
-
-
-CREATE TABLE interwiki (
- iw_prefix VARCHAR(32) NOT NULL UNIQUE,
- iw_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_wikiid VARCHAR(64) NOT NULL,
- iw_local SMALLINT NOT NULL,
- iw_trans SMALLINT NOT NULL DEFAULT 0
-);
-
-
-
-CREATE TABLE querycache (
- qc_type VARCHAR(255) NOT NULL,
- qc_value BIGINT NOT NULL,
- qc_namespace INTEGER NOT NULL,
- qc_title VARCHAR(255) NOT NULL
-);
-CREATE INDEX querycache_type_value
- ON querycache (qc_type, qc_value);
-
-
-
-CREATE TABLE querycache_info (
- qci_type VARCHAR(255) UNIQUE NOT NULL,
- qci_timestamp TIMESTAMP(3)
-);
-
-
-
-CREATE TABLE querycachetwo (
- qcc_type VARCHAR(255) NOT NULL,
- qcc_value BIGINT NOT NULL DEFAULT 0,
- qcc_namespace INTEGER NOT NULL DEFAULT 0,
- qcc_title VARCHAR(255) NOT NULL DEFAULT '',
- qcc_namespacetwo INTEGER NOT NULL DEFAULT 0,
- qcc_titletwo VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX querycachetwo_type_value
- ON querycachetwo (qcc_type, qcc_value);
-CREATE INDEX querycachetwo_title
- ON querycachetwo (qcc_type, qcc_namespace, qcc_title);
-CREATE INDEX querycachetwo_titletwo
- ON querycachetwo (qcc_type, qcc_namespacetwo, qcc_titletwo);
-
-
-
-CREATE TABLE objectcache (
- keyname VARCHAR(255) NOT NULL UNIQUE, -- was nullable
- value CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- exptime TIMESTAMP(3) NOT NULL
-);
-CREATE INDEX objectcacache_exptime
- ON objectcache (exptime);
-
-
-
-CREATE TABLE transcache (
- tc_url VARCHAR(255) NOT NULL UNIQUE,
- tc_contents CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- tc_time TIMESTAMP(3) NOT NULL
-);
-
-
-
-CREATE TABLE logging (
- log_id BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- log_type VARCHAR(32) NOT NULL,
- log_action VARCHAR(32) NOT NULL,
- log_timestamp TIMESTAMP(3) NOT NULL,
- log_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- -- Name of the user who performed this action
- log_user_text VARCHAR(255) NOT NULL DEFAULT '',
- log_namespace SMALLINT NOT NULL,
- log_title VARCHAR(255) NOT NULL,
- log_page BIGINT,
- log_comment VARCHAR(255),
- log_params CLOB(64K) INLINE LENGTH 4096,
- log_deleted SMALLINT NOT NULL DEFAULT 0
-);
-CREATE INDEX logging_type_name
- ON logging (log_type, log_timestamp);
-CREATE INDEX logging_user_time
- ON logging (log_timestamp, log_user);
-CREATE INDEX logging_page_time
- ON logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX log_user_type_time
- ON logging (log_user, log_type, log_timestamp);
-CREATE INDEX log_page_id_time
- ON logging (log_page, log_timestamp);
-CREATE UNIQUE INDEX type_action
- ON logging (log_type, log_action, log_timestamp);
-
-
-
-CREATE TABLE trackbacks (
- tb_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- -- foreign key also in MySQL
- tb_page INTEGER,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- tb_title VARCHAR(255) NOT NULL,
- tb_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- tb_ex CLOB(64K) INLINE LENGTH 4096,
- tb_name VARCHAR(255)
-);
-CREATE INDEX trackback_page
- ON trackbacks (tb_page);
-
-
-
-CREATE TABLE job (
- job_id BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- job_cmd VARCHAR(255) NOT NULL,
- job_namespace SMALLINT NOT NULL,
- job_title VARCHAR(255) NOT NULL,
- job_params CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
-CREATE INDEX job_cmd_namespace_title
- ON job (job_cmd, job_namespace, job_title);
-
-
-
---TODO
---CREATE FUNCTION add_interwiki (TEXT, INT, SMALLINT) RETURNS INT LANGUAGE SQL AS
---$mw$
--- INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES ($1,$2,$3);
--- SELECT 1;
---$mw$;
-
-
-
--- hack implementation
--- should be replaced with OmniFind, Contains(), etc
-CREATE TABLE searchindex (
- si_page BIGINT NOT NULL,
- si_title VARCHAR(255) NOT NULL DEFAULT '',
- si_text CLOB NOT NULL
-);
-
-
-
--- This table is not used unless profiling is turned on
-CREATE TABLE profiling (
- pf_count INTEGER NOT NULL DEFAULT 0,
- pf_time NUMERIC(18,10) NOT NULL DEFAULT 0,
- pf_memory NUMERIC(18,10) NOT NULL DEFAULT 0,
- pf_name VARCHAR(255) NOT NULL,
- pf_server VARCHAR(255)
-);
-CREATE UNIQUE INDEX pf_name_server
- ON profiling (pf_name, pf_server);
-
-
-
-CREATE TABLE protected_titles (
- pt_namespace INTEGER NOT NULL,
- pt_title VARCHAR(255) NOT NULL,
- pt_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- pt_reason VARCHAR(1024),
- pt_timestamp TIMESTAMP(3) NOT NULL,
- pt_expiry TIMESTAMP(3),
- pt_create_perm VARCHAR(60) NOT NULL DEFAULT ''
-);
-CREATE UNIQUE INDEX protected_titles_unique
- ON protected_titles (pt_namespace, pt_title);
-
-
-
-CREATE TABLE updatelog (
- ul_key VARCHAR(255) NOT NULL
- PRIMARY KEY
-);
-
-
-
-CREATE TABLE category (
- cat_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- cat_title VARCHAR(255) NOT NULL,
- cat_pages INTEGER NOT NULL DEFAULT 0,
- cat_subcats INTEGER NOT NULL DEFAULT 0,
- cat_files INTEGER NOT NULL DEFAULT 0,
- cat_hidden SMALLINT NOT NULL DEFAULT 0
-);
-CREATE UNIQUE INDEX category_title
- ON category (cat_title);
-CREATE INDEX category_pages
- ON category (cat_pages);
-
-
-
--- A table to track tags for revisions, logs and recent changes.
-CREATE TABLE change_tag (
- ct_rc_id INTEGER,
- ct_log_id INTEGER,
- ct_rev_id INTEGER,
- ct_tag VARCHAR(255) NOT NULL,
- ct_params CLOB(64K) INLINE LENGTH 4096
-);
-CREATE UNIQUE INDEX change_tag_rc_tag
- ON change_tag (ct_rc_id, ct_tag);
-CREATE UNIQUE INDEX change_tag_log_tag
- ON change_tag (ct_log_id, ct_tag);
-CREATE UNIQUE INDEX change_tag_rev_tag
- ON change_tag (ct_rev_id, ct_tag);
--- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX change_tag_tag_id
- ON change_tag (ct_tag, ct_rc_id, ct_rev_id, ct_log_id);
-
-
-
--- Rollup table to pull a LIST of tags simply
-CREATE TABLE tag_summary (
- ts_rc_id INTEGER,
- ts_log_id INTEGER,
- ts_rev_id INTEGER,
- ts_tags CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
-CREATE UNIQUE INDEX tag_summary_rc_id
- ON tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id
- ON tag_summary (ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id
- ON tag_summary (ts_rev_id);
-
-
-
-CREATE TABLE valid_tag (
- vt_tag VARCHAR(255) NOT NULL
- PRIMARY KEY
-);
-
-
-
---
--- User preferences and perhaps other fun stuff. :)
--- Replaces the old user.user_options blob, with a couple nice properties:
---
--- 1) We only store non-default settings, so changes to the DEFAULTs
--- are now reflected for everybody, not just new accounts.
--- 2) We can more easily do bulk lookups, statistics, or modifications of
--- saved options since it's a sane table structure.
---
-CREATE TABLE user_properties (
- -- Foreign key to user.user_id
- up_user BIGINT NOT NULL,
- -- Name of the option being saved. This is indexed for bulk lookup.
- up_property VARCHAR(255) FOR BIT DATA NOT NULL,
- -- Property value as a string.
- up_value CLOB(64K) INLINE LENGTH 4096
-);
-CREATE UNIQUE INDEX user_properties_user_property
- ON user_properties (up_user, up_property);
-CREATE INDEX user_properties_property
- ON user_properties (up_property);
-
-CREATE TABLE log_search (
- -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
- ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
- -- The value of the ID
- ls_value VARCHAR(255) NOT NULL,
- -- Key to log_id
- ls_log_id BIGINT NOT NULL DEFAULT 0
-);
-CREATE UNIQUE INDEX ls_field_val
- ON log_search (ls_field, ls_value, ls_log_id);
-CREATE INDEX ls_log_id
- ON log_search (ls_log_id);
-
-
-
--- Table for storing localisation data
-CREATE TABLE l10n_cache (
- -- Language code
- lc_lang VARCHAR(32) NOT NULL,
- -- Cache key
- lc_key VARCHAR(255) NOT NULL,
- -- Value
- lc_value CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
-CREATE INDEX lc_lang_key
- ON l10n_cache (lc_lang, lc_key);
-
-
-
-CREATE TABLE msg_resource_links
-(
- mrl_resource VARCHAR(255) FOR BIT DATA NOT NULL,
- mrl_message VARCHAR(255) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX uq61_msg_resource_links
- ON msg_resource_links (mrl_message, mrl_resource);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE msg_resource
-(
- mr_resource VARCHAR(255) FOR BIT DATA NOT NULL,
- mr_lang VARCHAR(32) FOR BIT DATA NOT NULL,
- mr_blob CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- mr_timestamp TIMESTAMP(3) NOT NULL
-);
-CREATE UNIQUE INDEX uq81_msg_resource
- ON msg_resource (mr_resource, mr_lang);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE module_deps (
- md_module VARCHAR(255) FOR BIT DATA NOT NULL,
- md_skin VARCHAR(32) FOR BIT DATA NOT NULL,
- md_deps CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
-CREATE UNIQUE INDEX uq96_module_deps
- ON module_deps (md_module, md_skin);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE iwlinks
-(
- iwl_from INTEGER NOT NULL,
- iwl_prefix VARCHAR(20) FOR BIT DATA NOT NULL,
- iwl_title VARCHAR(255) FOR BIT DATA NOT NULL
-);
-
-
-
---
--- Store information about newly uploaded files before they're
--- moved into the actual filestore
---
-CREATE TABLE uploadstash (
- us_id BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- -- the user who uploaded the file.
- us_user BIGINT NOT NULL,
- -- file key. this is how applications actually search for the file.
- -- this might go away, or become the primary key.
- us_key VARCHAR(255) NOT NULL,
- -- the original path
- us_orig_path VARCHAR(255) NOT NULL,
- -- the temporary path at which the file is actually stored
- us_path VARCHAR(255) NOT NULL,
- -- which type of upload the file came from (sometimes)
- us_source_type VARCHAR(50),
- -- the date/time on which the file was added
- us_timestamp TIMESTAMP(3) NOT NULL,
- us_status VARCHAR(50) NOT NULL,
- -- file properties from File::getPropsFromPath. these may prove unnecessary.
- --
- us_size BIGINT NOT NULL,
- -- this hash comes from File::sha1Base36(), and is 31 characters
- us_sha1 VARCHAR(31) NOT NULL,
- us_mime VARCHAR(255),
- -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
- us_media_type VARCHAR(30)
- CONSTRAINT my_constraint
- CHECK (
- us_media_type in (
- 'UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA',
- 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'
- )
- ) DEFAULT NULL,
- -- image-specific properties
- us_image_width BIGINT,
- us_image_height BIGINT,
- us_image_bits INTEGER
-);
--- sometimes there's a delete for all of a user's stuff.
-CREATE INDEX us_user
- ON uploadstash (us_user);
--- pick out files by key, enforce key UNIQUEness
-CREATE UNIQUE INDEX us_key
- ON uploadstash (us_key);
--- the abandoned upload cleanup script needs this
-CREATE INDEX us_timestamp
- ON uploadstash (us_timestamp);
-
-
-
--- Stores the groups the user has once belonged to.
--- The user may still belong these groups. Check user_groups.
-CREATE TABLE user_former_groups (
- ufg_user BIGINT NOT NULL DEFAULT 0,
- ufg_group VARCHAR(16) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX ufg_user_group
- ON user_former_groups (ufg_user, ufg_group);
--- /dev/null
+<?php
+/**
+ * Re-initialise or update the site statistics table.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Brion Vibber
+ * @author Rob Church <robchur@gmail.com>
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to re-initialise or update the site statistics table
+ *
+ * @ingroup Maintenance
+ */
+class InitSiteStats extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Re-initialise the site statistics tables";
+ $this->addOption( 'update', 'Update the existing statistics (preserves the ss_total_views field)' );
+ $this->addOption( 'noviews', "Don't update the page view counter" );
+ $this->addOption( 'active', 'Also update active users count' );
+ $this->addOption( 'use-master', 'Count using the master database' );
+ }
+
+ public function execute() {
+ $this->output( "Refresh Site Statistics\n\n" );
+ $counter = new SiteStatsInit( $this->hasOption( 'use-master' ) );
+
+ $this->output( "Counting total edits..." );
+ $edits = $counter->edits();
+ $this->output( "{$edits}\nCounting number of articles..." );
+
+ $good = $counter->articles();
+ $this->output( "{$good}\nCounting total pages..." );
+
+ $pages = $counter->pages();
+ $this->output( "{$pages}\nCounting number of users..." );
+
+ $users = $counter->users();
+ $this->output( "{$users}\nCounting number of images..." );
+
+ $image = $counter->files();
+ $this->output( "{$image}\n" );
+
+ if ( !$this->hasOption( 'noviews' ) ) {
+ $this->output( "Counting total page views..." );
+ $views = $counter->views();
+ $this->output( "{$views}\n" );
+ }
+
+ if ( $this->hasOption( 'active' ) ) {
+ $this->output( "Counting active users..." );
+ $active = SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
+ $this->output( "{$active}\n" );
+ }
+
+ $this->output( "\nUpdating site statistics..." );
+
+ if ( $this->hasOption( 'update' ) ) {
+ $counter->update();
+ } else {
+ $counter->refresh();
+ }
+
+ $this->output( "done.\n" );
+ }
+}
+
+$maintClass = "InitSiteStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
+++ /dev/null
-<?php
-/**
- * Re-initialise or update the site statistics table.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @author Brion Vibber
- * @author Rob Church <robchur@gmail.com>
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to re-initialise or update the site statistics table
- *
- * @ingroup Maintenance
- */
-class InitStats extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Re-initialise the site statistics tables";
- $this->addOption( 'update', 'Update the existing statistics (preserves the ss_total_views field)' );
- $this->addOption( 'noviews', "Don't update the page view counter" );
- $this->addOption( 'active', 'Also update active users count' );
- $this->addOption( 'use-master', 'Count using the master database' );
- }
-
- public function execute() {
- $this->output( "Refresh Site Statistics\n\n" );
- $counter = new SiteStatsInit( $this->hasOption( 'use-master' ) );
-
- $this->output( "Counting total edits..." );
- $edits = $counter->edits();
- $this->output( "{$edits}\nCounting number of articles..." );
-
- $good = $counter->articles();
- $this->output( "{$good}\nCounting total pages..." );
-
- $pages = $counter->pages();
- $this->output( "{$pages}\nCounting number of users..." );
-
- $users = $counter->users();
- $this->output( "{$users}\nCounting number of images..." );
-
- $image = $counter->files();
- $this->output( "{$image}\n" );
-
- if ( !$this->hasOption( 'noviews' ) ) {
- $this->output( "Counting total page views..." );
- $views = $counter->views();
- $this->output( "{$views}\n" );
- }
-
- if ( $this->hasOption( 'active' ) ) {
- $this->output( "Counting active users..." );
- $active = SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
- $this->output( "{$active}\n" );
- }
-
- $this->output( "\nUpdating site statistics..." );
-
- if ( $this->hasOption( 'update' ) ) {
- $counter->update();
- } else {
- $counter->refresh();
- }
-
- $this->output( "done.\n" );
- }
-}
-
-$maintClass = "InitStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
--- /dev/null
+# See also:
+# - https://github.com/senchalabs/jsduck/wiki/Tags
+# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
+require 'jsduck/meta_tag'
+
+class ContextTag < JsDuck::MetaTag
+ def initialize
+ @name = 'context'
+ end
+
+ # @param tags All matches of this tag on one class.
+ def to_html(tags)
+ return '<h3 class="pa">Context</h3>' + render_long_context(tags.last)
+ end
+
+ def render_long_context(tag)
+ if tag =~ /\A([^\s]+)/m
+ name = $1
+ return format("`this` : {@link #{name}}")
+ end
+ end
+end
+
+class SeeTag < JsDuck::MetaTag
+ def initialize
+ @name = 'see'
+ @multiline = true
+ end
+
+ # @param tags All matches of this tag on one class.
+ def to_html(tags)
+ doc = []
+ doc << '<h3 class="pa">Related</h3>'
+ doc << [
+ '<ul>',
+ tags.map {|tag| render_long_see(tag) },
+ '</ul>',
+ ]
+ doc
+ end
+
+ def render_long_see(tag)
+ if tag =~ /\A([^\s]+)( .*)?\Z/m
+ name = $1
+ doc = $2 ? ': ' + $2 : ''
+ return [
+ '<li>',
+ format("{@link #{name}} #{doc}"),
+ '</li>'
+ ]
+ end
+ end
+end
--- /dev/null
+[
+ {
+ "name": "MediaWiki",
+ "groups": [
+ {
+ "name": "Base",
+ "classes": [
+ "mw",
+ "mw.Map",
+ "mw.Message",
+ "mw.loader",
+ "mw.html",
+ "mw.html.Cdata",
+ "mw.html.Raw"
+ ]
+ },
+ {
+ "name": "General",
+ "classes": [
+ "mw.Title",
+ "mw.notification",
+ "mw.util",
+ "mw.plugin.notify"
+ ]
+ },
+ {
+ "name": "API",
+ "classes": ["mw.Api*"]
+ }
+ ]
+ },
+ {
+ "name": "jQuery",
+ "groups": [
+ {
+ "name": "Core",
+ "classes": ["jQuery", "jQuery.Event", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR"]
+ },
+ {
+ "name": "Plugins",
+ "classes": ["jQuery.plugin.*"]
+ }
+ ]
+ },
+ {
+ "name": "Misc",
+ "groups": [
+ {
+ "name": "Native",
+ "classes": ["Array", "Boolean", "Date", "Function", "Number", "Object", "RegExp", "String"]
+ }
+ ]
+ }
+]
--- /dev/null
+{
+ "--title": "MediaWiki Code Documentation",
+ "--categories": "./categories.json",
+ "--meta-tags": "./MetaTags.rb",
+ "--warnings": ["-no_doc"],
+ "--builtin-classes": true,
+ "--output": "../../docs/js",
+ "--": [
+ "./external.js",
+ "../../resources/mediawiki/mediawiki.js",
+ "../../resources/mediawiki/mediawiki.util.js",
+ "../../resources/mediawiki/mediawiki.Title.js",
+ "../../resources/mediawiki/mediawiki.notify.js",
+ "../../resources/mediawiki/mediawiki.notification.js",
+ "../../resources/mediawiki.api",
+ "../../resources/jquery/jquery.localize.js"
+ ]
+}
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>MediaWiki Examples</title>
+ <script>
+ function loadInlineExample(code, options, callback) {
+ try {
+ document.body.innerHTML = '';
+ eval(code);
+ callback && callback(true);
+ } catch (e) {
+ document.body.innerHTML = document.createTextNode(e);
+ callback && callback(false, e);
+ }
+ }
+ </script>
+</head>
+<body></body>
+</html>
--- /dev/null
+/**
+ * @class jQuery
+ */
+
+/**
+ * @method ajax
+ * @return {jqXHR}
+ */
+
+/**
+ * @class jQuery.Event
+ */
+
+/**
+ * @class jQuery.Promise
+ */
+
+/**
+ * @class jQuery.Deferred
+ * @mixins jQuery.Promise
+ */
+
+/**
+ * @class jQuery.jqXHR
+ * @alternateClassName jqXHR
+ */
. "\n\n";
}
if ( !$ucdallPresent ) {
- $error = "Unable to find ucd.all.grouped.xml. "
+ $error .= "Unable to find ucd.all.grouped.xml. "
. "Download it, unzip, and specify its location with --data-dir=<DIR>. "
. "\n\n";
}
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
-
require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
+
/**
* Generates normalizer data files for Arabic and Malayalam.
* For NFC see includes/normal.
'deadendpages-summary',
'protectedpages-summary',
'disambiguations-summary',
+ 'pageswithprop-summary',
'doubleredirects-summary',
'lonelypages-summary',
'unusedtemplates-summary',
'disambiguationspage',
'disambiguations-text',
),
+ 'pageswithprop' => array(
+ 'pageswithprop',
+ 'pageswithprop-summary',
+ 'pageswithprop-legend',
+ 'pageswithprop-text',
+ 'pageswithprop-prop',
+ 'pageswithprop-submit',
+ ),
'doubleredirects' => array(
'doubleredirects',
'doubleredirects-summary',
'duration-centuries',
'duration-millennia'
),
+ 'rotation' => array(
+ 'rotate-comment',
+ ),
);
/** Comments for each block */
$wgBlockComments = array(
'sidebar' => "The sidebar for MonoBook is generated from this message, lines that do not
begin with * or ** are discarded, furthermore lines that do begin with ** and
-do not contain | are also discarded, but do not depend on this behaviour for
+do not contain | are also discarded, but do not depend on this behavior for
future releases. Also note that since each list value is wrapped in a unique
XHTML id it should only appear once and include characters that are legal
XHTML id names.",
'errors' => 'General errors',
'virus' => 'Virus scanner',
'login' => 'Login and logout pages',
- 'mail' => 'E-mail sending',
+ 'mail' => 'Email sending',
'passwordstrength' => 'JavaScript password checks',
'resetpass' => 'Change password dialog',
'passwordreset' => 'Special:PasswordReset',
'opensearch' => 'OpenSearch description',
'quickbar' => 'Quickbar',
'preferences' => 'Preferences page',
- 'preferences-email' => 'User preference: e-mail validation using jQuery',
+ 'preferences-email' => 'User preference: email validation using jQuery',
'userrights' => 'User rights',
'group' => 'Groups',
'group-member' => '',
'randomredirect' => 'Random redirect',
'statistics' => 'Statistics',
'disambiguations' => '',
+ 'pageswithprop' => '',
'doubleredirects' => '',
'brokenredirects' => '',
'withoutinterwiki' => '',
'activeusers' => 'Special:ActiveUsers',
'newuserlog' => 'Special:Log/newusers',
'listgrouprights' => 'Special:ListGroupRights',
- 'emailuser' => 'E-mail user',
+ 'emailuser' => 'Email user',
'usermessage' => 'User Messenger',
'watchlist' => 'Watchlist',
'watching' => 'Displayed when you click the "watch" button and it is in the process of watching',
'exif-urgency' => '',
'edit-externally' => 'External editor support',
'all' => "'all' in various places, this might be different for inflected languages",
- 'confirmemail' => 'E-mail address confirmation',
+ 'confirmemail' => 'Email address confirmation',
'scarytransclusion' => 'Scary transclusion',
'deleteconflict' => 'Delete conflict',
'unit-pixel' => '',
'apierrors' => 'API errors',
'duration' => 'Durations',
'cachedspecial' => 'SpecialCachedPage',
+ 'rotation' => 'Image rotation',
);
* @ingroup MaintenanceLanguage
*/
+if ( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
if ( !isset( $argv[1] ) ) {
print "Usage: php {$argv[0]} <filename>\n";
exit( 1 );
* @file
*/
+if ( PHP_SAPI != 'cli' ) {
+ die( "This filter can only be run from the command line.\n" );
+}
+
$source = file_get_contents( $argv[1] );
$regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
$replac = '${2} */ ${3} ${1} ${4}';
--- /dev/null
+#!/usr/bin/env sh
+jsduck --config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json && echo 'JSDuck execution finished.'
}
public function execute() {
- global $wgMemc;
+ global $wgJobTypesExcludedFromDefaultQueue;
- $type = false; // job type required/picked
+ // job type required/picked
if ( $this->hasOption( 'types' ) ) {
$types = explode( ' ', $this->getOption( 'types' ) );
} elseif ( $this->hasOption( 'type' ) ) {
$types = array( $this->getOption( 'type' ) );
} else {
- $types = JobQueueGroup::singleton()->getDefaultQueueTypes();
+ $types = false;
}
// Handle any required periodic queue maintenance
$this->executeReadyPeriodicTasks();
- $memcKey = 'jobqueue:dbs:v3';
- $pendingDbInfo = $wgMemc->get( $memcKey );
-
- // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
- // regenerate the cache. Use any available stale cache if another process is
- // currently regenerating the pending DB information.
- if ( !is_array( $pendingDbInfo )
- || ( time() - $pendingDbInfo['timestamp'] ) > 300 // 5 minutes
- || mt_rand( 0, 999 ) == 0
- ) {
- if ( $wgMemc->add( "$memcKey:rebuild", 1, 1800 ) ) { // lock
- $pendingDbInfo = array(
- 'pendingDBs' => $this->getPendingDbs(),
- 'timestamp' => time()
- );
- for ( $attempts=1; $attempts <= 25; ++$attempts ) {
- if ( $wgMemc->add( "$memcKey:lock", 1, 60 ) ) { // lock
- $wgMemc->set( $memcKey, $pendingDbInfo );
- $wgMemc->delete( "$memcKey:lock" ); // unlock
- break;
- }
- }
- $wgMemc->delete( "$memcKey:rebuild" ); // unlock
- }
- }
-
- if ( !is_array( $pendingDbInfo ) || !$pendingDbInfo['pendingDBs'] ) {
+ // Get all the queues with jobs in them
+ $pendingDBs = JobQueueAggregator::singleton()->getAllReadyWikiQueues();
+ if ( !count( $pendingDBs ) ) {
return; // no DBs with jobs or cache is both empty and locked
}
- $pendingDBs = $pendingDbInfo['pendingDBs']; // convenience
do {
$again = false;
// Flatten the tree of candidates into a flat list so that a random
// item can be selected, weighing each queue (type/db tuple) equally.
foreach ( $pendingDBs as $type => $dbs ) {
- if ( in_array( $type, $types ) ) {
+ if (
+ ( is_array( $types ) && in_array( $type, $types ) ) ||
+ ( $types === false && !in_array( $type, $wgJobTypesExcludedFromDefaultQueue ) )
+ ) {
foreach ( $dbs as $db ) {
$candidates[] = array( $type, $db );
}
return; // no jobs for this type
}
- list( $type, $db ) = $candidates[ mt_rand( 0, count( $candidates ) - 1 ) ];
- if ( !$this->checkJob( $type, $db ) ) { // queue is actually empty?
- $pendingDBs = $this->delistDB( $pendingDBs, $db, $type );
- // Update the cache to remove the outdated information.
- // Make sure that this does not race (especially with full rebuilds).
- if ( $wgMemc->add( "$memcKey:lock", 1, 60 ) ) { // lock
- $curInfo = $wgMemc->get( $memcKey );
- if ( is_array( $curInfo ) ) {
- $curInfo['pendingDBs'] =
- $this->delistDB( $curInfo['pendingDBs'], $db, $type );
- $wgMemc->set( $memcKey, $curInfo );
- // May as well make use of this newer information
- $pendingDBs = $curInfo['pendingDBs'];
- }
- $wgMemc->delete( "$memcKey:lock" ); // unlock
- }
+ list( $type, $db ) = $candidates[mt_rand( 0, count( $candidates ) - 1 )];
+ if ( JobQueueGroup::singleton( $db )->isQueueDeprioritized( $type ) ) {
+ $pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
$again = true;
}
} while ( $again );
}
}
- /**
- * Remove a type/DB entry from the list of queues with jobs
- *
- * @param $pendingDBs array
- * @param $db string
- * @param $type string
- * @return Array
- */
- private function delistDB( array $pendingDBs, $db, $type ) {
- $pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
- return $pendingDBs;
- }
-
- /**
- * Check if the specified database has a job of the specified type in it.
- * The type may be false to indicate "all".
- * @param $type string
- * @param $dbName string
- * @return bool
- */
- private function checkJob( $type, $dbName ) {
- return !JobQueueGroup::singleton( $dbName )->get( $type )->isEmpty();
- }
-
- /**
- * Get all databases that have a pending job
- * @return array
- */
- private function getPendingDbs() {
- global $wgLocalDatabases;
-
- $pendingDBs = array(); // (job type => (db list))
- foreach ( $wgLocalDatabases as $db ) {
- foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
- $pendingDBs[$type][] = $db;
- }
- }
-
- return $pendingDBs;
- }
-
/**
* Do all ready periodic jobs for all databases every 5 minutes (and .1% of the time)
* @return integer
);
ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_propname);
CREATE INDEX page_props_propname ON page_props (pp_propname);
+CREATE UNIQUE INDEX pp_propname_page ON page_props (pp_propname,pp_page);
CREATE TABLE archive (
ar_namespace SMALLINT NOT NULL,
--- /dev/null
+<?php
+/**
+ * Command line script to check for an open proxy at a specified location.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+if( PHP_SAPI != 'cli' ) {
+ die( 1 );
+}
+
+/**
+ *
+ */
+$output = '';
+
+/**
+ * Exit if there are not enough parameters, or if it's not command line mode
+ */
+if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $argv ) < 4 ) {
+ $output .= "Incorrect parameters\n";
+} else {
+ /**
+ * Get parameters
+ */
+ $ip = $argv[1];
+ $port = $argv[2];
+ $url = $argv[3];
+ $host = trim(`hostname`);
+ $output = "Connecting to $ip:$port, target $url, this hostname $host\n";
+
+ # Open socket
+ $sock = @fsockopen($ip, $port, $errno, $errstr, 5);
+ if ($errno == 0 ) {
+ $output .= "Connected\n";
+ # Send payload
+ $request = "GET $url HTTP/1.0\r\n";
+# $request .= "Proxy-Connection: Keep-Alive\r\n";
+# $request .= "Pragma: no-cache\r\n";
+# $request .= "Host: ".$url."\r\n";
+# $request .= "User-Agent: MediaWiki open proxy check\r\n";
+ $request .= "\r\n";
+ @fputs($sock, $request);
+ $response = fgets($sock, 65536);
+ $output .= $response;
+ @fclose($sock);
+ } else {
+ $output .= "No connection\n";
+ }
+}
+
+$output = escapeshellarg( $output );
+
+#`echo $output >> /home/tstarling/open/proxy.log`;
+++ /dev/null
-<?php
-/**
- * Command line script to check for an open proxy at a specified location.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-if( PHP_SAPI != 'cli' ) {
- die( 1 );
-}
-
-/**
- *
- */
-$output = '';
-
-/**
- * Exit if there are not enough parameters, or if it's not command line mode
- */
-if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $argv ) < 4 ) {
- $output .= "Incorrect parameters\n";
-} else {
- /**
- * Get parameters
- */
- $ip = $argv[1];
- $port = $argv[2];
- $url = $argv[3];
- $host = trim(`hostname`);
- $output = "Connecting to $ip:$port, target $url, this hostname $host\n";
-
- # Open socket
- $sock = @fsockopen($ip, $port, $errno, $errstr, 5);
- if ($errno == 0 ) {
- $output .= "Connected\n";
- # Send payload
- $request = "GET $url HTTP/1.0\r\n";
-# $request .= "Proxy-Connection: Keep-Alive\r\n";
-# $request .= "Pragma: no-cache\r\n";
-# $request .= "Host: ".$url."\r\n";
-# $request .= "User-Agent: MediaWiki open proxy check\r\n";
- $request .= "\r\n";
- @fputs($sock, $request);
- $response = fgets($sock, 65536);
- $output .= $response;
- @fclose($sock);
- } else {
- $output .= "No connection\n";
- }
-}
-
-$output = escapeshellarg( $output );
-
-#`echo $output >> /home/tstarling/open/proxy.log`;
global $wgParserCacheExpireTime;
$date = wfTimestamp( TS_MW, time() + $wgParserCacheExpireTime - intval( $inputAge ) );
} else {
- echo "Must specify either --expiredate or --age\n";
- exit( 1 );
+ $this->error( "Must specify either --expiredate or --age", 1 );
}
$english = Language::factory( 'en' );
- echo "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n";
+ $this->output( "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n" );
$pc = wfGetParserCacheStorage();
$success = $pc->deleteObjectsExpiringBefore( $date, array( $this, 'showProgress' ) );
if ( !$success ) {
- echo "\nCannot purge this kind of parser cache.\n";
- exit( 1 );
+ $this->error( "\nCannot purge this kind of parser cache.", 1 );
}
$this->showProgress( 100 );
- echo "\nDone\n";
+ $this->output( "\nDone\n" );
}
function showProgress( $percent ) {
$this->lastProgress = $percentString;
$stars = floor( $percent / 2 );
- echo '[' . str_repeat( '*', $stars ), str_repeat( '.', 50 - $stars ) . '] ' .
- "$percentString%\r";
+ $this->output( '[' . str_repeat( '*', $stars ) . str_repeat( '.', 50 - $stars ) . '] ' .
+ "$percentString%\r" );
}
}
$this->runJobsLog( "Executed $count periodic queue task(s)." );
}
+ $lastTime = time();
do {
$job = ( $type === false )
? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
- : $group->get( $type )->pop(); // job from a single queue
+ : $group->pop( $type ); // job from a single queue
if ( $job ) { // found a job
- // Perform the job (logging success/failure and runtime)...
- $t = microtime( true );
$this->runJobsLog( $job->toString() . " STARTING" );
- $status = $job->run();
- if ( !is_bool( $status ) ) {
- wfWarn( $job->getType() . " job failed to return a boolean." );
- $status = true; // sanity
+ // Run the job...
+ $t = microtime( true );
+ try {
+ $status = $job->run();
+ $error = $job->getLastError();
+ } catch ( MWException $e ) {
+ $status = false;
+ $error = get_class( $e ) . ': ' . $e->getMessage();
}
- if ( $status ) {
+ $timeMs = intval( ( microtime( true ) - $t ) * 1000 );
+
+ // Mark the job as done on success or when the job cannot be retried
+ if ( $status !== false || !$job->allowRetries() ) {
$group->ack( $job ); // done
}
- $t = microtime( true ) - $t;
- $timeMs = intval( $t * 1000 );
if ( !$status ) {
- $this->runJobsLog( $job->toString() . " t=$timeMs error={$job->error}" );
+ $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
} else {
$this->runJobsLog( $job->toString() . " t=$timeMs good" );
}
+
// Break out if we hit the job count or wall time limits...
if ( $maxJobs && ++$n >= $maxJobs ) {
break;
- }
- if ( $maxTime && ( time() - $startTime ) > $maxTime ) {
+ } elseif ( $maxTime && ( time() - $startTime ) > $maxTime ) {
break;
}
- // Don't let any slaves/backups fall behind...
+
+ // Don't let any queue slaves/backups fall behind
$group->get( $job->getType() )->waitForBackups();
+ // Don't let any of the main DB slaves get backed up
+ $timePassed = time() - $lastTime;
+ if ( $timePassed >= 5 || $timePassed < 0 ) {
+ wfWaitForSlaves();
+ }
}
} while ( $job ); // stop when there are no jobs
}
--- /dev/null
+<?php
+/**
+ * Show statistics from the cache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script that shows statistics from the cache.
+ *
+ * @ingroup Maintenance
+ */
+class ShowCacheStats extends Maintenance {
+
+ public function __construct() {
+ $this->mDescription = "Show statistics from the cache";
+ parent::__construct();
+ }
+
+ public function getDbType() {
+ return Maintenance::DB_NONE;
+ }
+
+ public function execute() {
+ global $wgMemc;
+
+ // Can't do stats if
+ if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
+ $this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
+ }
+ $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
+ $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
+ $total = $session + $noSession;
+ if ( $total == 0 ) {
+ $this->error( "You either have no stats or the cache isn't running. Aborting.", true );
+ }
+ $this->output( "Requests\n" );
+ $this->output( sprintf( "with session: %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
+ $this->output( sprintf( "without session: %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
+ $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
+
+
+ $this->output( "\nParser cache\n" );
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
+ $expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
+ $absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
+ $stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
+ $total = $hits + $expired + $absent + $stub;
+ if ( $total ) {
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "expired: %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
+ $this->output( sprintf( "absent: %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
+ $this->output( sprintf( "stub threshold: %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
+ $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
+ } else {
+ $this->output( "no statistics available\n" );
+ }
+
+ $this->output( "\nImage cache\n" );
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_hit' ) ) );
+ $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_miss' ) ) );
+ $updates = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_update' ) ) );
+ $total = $hits + $misses;
+ if ( $total ) {
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
+ $this->output( sprintf( "updates: %-10d\n", $updates ) );
+ } else {
+ $this->output( "no statistics available\n" );
+ }
+
+ $this->output( "\nDiff cache\n" );
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_hit' ) ) );
+ $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_miss' ) ) );
+ $uncacheable = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_uncacheable' ) ) );
+ $total = $hits + $misses + $uncacheable;
+ if ( $total ) {
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
+ $this->output( sprintf( "uncacheable: %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100 ) );
+ } else {
+ $this->output( "no statistics available\n" );
+ }
+ }
+}
+
+$maintClass = "ShowCacheStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
--- /dev/null
+<?php
+
+/**
+ * Show the cached statistics.
+ * Give out the same output as [[Special:Statistics]]
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Antoine Musso <hashar at free dot fr>
+ * Based on initSiteStats.php by:
+ * @author Brion Vibber
+ * @author Rob Church <robchur@gmail.com>
+ *
+ * @license GNU General Public License 2.0 or later
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to show the cached statistics.
+ *
+ * @ingroup Maintenance
+ */
+class ShowSiteStats extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Show the cached statistics";
+ }
+ public function execute() {
+ $fields = array(
+ 'ss_total_views' => 'Total views',
+ 'ss_total_edits' => 'Total edits',
+ 'ss_good_articles' => 'Number of articles',
+ 'ss_total_pages' => 'Total pages',
+ 'ss_users' => 'Number of users',
+ 'ss_images' => 'Number of images',
+ );
+
+ // Get cached stats from slave database
+ $dbr = wfGetDB( DB_SLAVE );
+ $stats = $dbr->selectRow( 'site_stats', '*', '', __METHOD__ );
+
+ // Get maximum size for each column
+ $max_length_value = $max_length_desc = 0;
+ foreach ( $fields as $field => $desc ) {
+ $max_length_value = max( $max_length_value, strlen( $stats->$field ) );
+ $max_length_desc = max( $max_length_desc, strlen( $desc ) ) ;
+ }
+
+ // Show them
+ foreach ( $fields as $field => $desc ) {
+ $this->output( sprintf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field ) );
+ }
+ }
+}
+
+$maintClass = "ShowSiteStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
+++ /dev/null
-<?php
-
-/**
- * Show the cached statistics.
- * Give out the same output as [[Special:Statistics]]
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @author Antoine Musso <hashar at free dot fr>
- * Based on initStats.php by:
- * @author Brion Vibber
- * @author Rob Church <robchur@gmail.com>
- *
- * @license GNU General Public License 2.0 or later
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to show the cached statistics.
- *
- * @ingroup Maintenance
- */
-class ShowStats extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Show the cached statistics";
- }
- public function execute() {
- $fields = array(
- 'ss_total_views' => 'Total views',
- 'ss_total_edits' => 'Total edits',
- 'ss_good_articles' => 'Number of articles',
- 'ss_total_pages' => 'Total pages',
- 'ss_users' => 'Number of users',
- 'ss_images' => 'Number of images',
- );
-
- // Get cached stats from slave database
- $dbr = wfGetDB( DB_SLAVE );
- $stats = $dbr->selectRow( 'site_stats', '*', '', __METHOD__ );
-
- // Get maximum size for each column
- $max_length_value = $max_length_desc = 0;
- foreach ( $fields as $field => $desc ) {
- $max_length_value = max( $max_length_value, strlen( $stats->$field ) );
- $max_length_desc = max( $max_length_desc, strlen( $desc ) ) ;
- }
-
- // Show them
- foreach ( $fields as $field => $desc ) {
- $this->output( sprintf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field ) );
- }
- }
-}
-
-$maintClass = "ShowStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
public function __construct() {
parent::__construct();
$this->mDescription = "Send SQL queries to a MediaWiki database";
+ $this->addOption( 'cluster', 'Use an external cluster by name', false, true );
}
public function execute() {
- $dbw = wfGetDB( DB_MASTER );
- if ( $this->hasArg() ) {
- $fileName = $this->getArg();
- $file = fopen( $fileName, 'r' );
+ // Get a DB handle (with this wiki's DB select) from the appropriate load balancer
+ if ( $this->hasOption( 'cluster' ) ) {
+ $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
+ $dbw = $lb->getConnection( DB_MASTER ); // master for external LB
+ } else {
+ $dbw = wfGetDB( DB_MASTER ); // master for primary LB for this wiki
+ }
+ if ( $this->hasArg( 0 ) ) {
+ $file = fopen( $this->getArg( 0 ), 'r' );
if ( !$file ) {
$this->error( "Unable to open input file", true );
}
$this->error( $e, $doDie );
}
}
+ wfWaitForSlaves();
}
/**
+++ /dev/null
-<?php
-/**
- * Show statistics from the cache.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script that shows statistics from the cache.
- *
- * @ingroup Maintenance
- */
-class CacheStats extends Maintenance {
-
- public function __construct() {
- $this->mDescription = "Show statistics from the cache";
- parent::__construct();
- }
-
- public function getDbType() {
- return Maintenance::DB_NONE;
- }
-
- public function execute() {
- global $wgMemc;
-
- // Can't do stats if
- if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
- $this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
- }
- $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
- $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
- $total = $session + $noSession;
- if ( $total == 0 ) {
- $this->error( "You either have no stats or the cache isn't running. Aborting.", true );
- }
- $this->output( "Requests\n" );
- $this->output( sprintf( "with session: %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
- $this->output( sprintf( "without session: %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
- $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
-
-
- $this->output( "\nParser cache\n" );
- $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
- $expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
- $absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
- $stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
- $total = $hits + $expired + $absent + $stub;
- if ( $total ) {
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
- $this->output( sprintf( "expired: %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
- $this->output( sprintf( "absent: %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
- $this->output( sprintf( "stub threshold: %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
- $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
- } else {
- $this->output( "no statistics available\n" );
- }
-
- $this->output( "\nImage cache\n" );
- $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_hit' ) ) );
- $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_miss' ) ) );
- $updates = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_update' ) ) );
- $total = $hits + $misses;
- if ( $total ) {
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
- $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
- $this->output( sprintf( "updates: %-10d\n", $updates ) );
- } else {
- $this->output( "no statistics available\n" );
- }
-
- $this->output( "\nDiff cache\n" );
- $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_hit' ) ) );
- $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_miss' ) ) );
- $uncacheable = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_uncacheable' ) ) );
- $total = $hits + $misses + $uncacheable;
- if ( $total ) {
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
- $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
- $this->output( sprintf( "uncacheable: %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100 ) );
- } else {
- $this->output( "no statistics available\n" );
- }
- }
-}
-
-$maintClass = "CacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
blob_id integer UNSIGNED NOT NULL AUTO_INCREMENT,
blob_text longblob,
PRIMARY KEY (blob_id)
-) ENGINE=MyISAM MAX_ROWS=100000000 AVG_ROW_LENGTH=100000;
-
+) ENGINE=InnoDB;
*
* Write the new URL to the text table and set the bt_moved flag.
*
- * This is done in a single transaction to provide restartable behaviour
+ * This is done in a single transaction to provide restartable behavior
* without data loss.
*
* The transaction is kept short to reduce locking.
$this->addOption( 'end', 'Ending journal ID', false, true );
$this->addOption( 'posdir', 'Directory to read/record journal positions', false, true );
$this->addOption( 'posdump', 'Just dump current journal position into the position dir.' );
+ $this->addOption( 'postime', 'For position dumps, get the ID at this time', false, true );
$this->addOption( 'verbose', 'Verbose mode', false, false, 'v' );
$this->setBatchSize( 50 );
}
if ( !$this->hasOption( 'posdir' ) ) {
$this->error( "Param posdir required!", 1 );
}
- $id = (int)$src->getJournal()->getCurrentPosition(); // default to 0
- $this->output( "Current journal position is $id.\n" );
+ if ( $this->hasOption( 'postime' ) ) {
+ $id = (int)$src->getJournal()->getPositionAtTime( $this->getOption( 'postime' ) );
+ $this->output( "Requested journal position is $id.\n" );
+ } else {
+ $id = (int)$src->getJournal()->getCurrentPosition();
+ $this->output( "Current journal position is $id.\n" );
+ }
if ( file_put_contents( $posFile, $id, LOCK_EX ) !== false ) {
$this->output( "Saved journal position file.\n" );
} else {
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
+CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname,pp_page);
-- A table to log updates, one text key row per update.
$child = $this->runChild( $maint );
// LoggedUpdateMaintenance is checking the updatelog itself
- $isLoggedUpdate = ( $child instanceof LoggedUpdateMaintenance );
+ $isLoggedUpdate = is_a( $child, 'LoggedUpdateMaintenance' );
if ( !$isLoggedUpdate && $updater->updateRowExists( $maint ) ) {
continue;
return array(
- /* Special modules who have their own classes */
+ /**
+ * Special modules who have their own classes
+ */
// Scripts managed by the local wiki (stored in the MediaWiki namespace)
'site' => array( 'class' => 'ResourceLoaderSiteModule' ),
// Scripts for the dynamic language specific data, like grammar forms.
'mediawiki.language.data' => array( 'class' => 'ResourceLoaderLanguageDataModule' ),
- /* Skins */
+ /**
+ * Skins
+ * Be careful not to add 'scripts' to these modules,
+ * since they are loaded with OutputPage::addModuleStyles so that the skin styles
+ * apply without javascript.
+ * If a skin needs custom js in the interface, register a separate module
+ * and add it to the load queue with OutputPage::addModules.
+ *
+ * See Vector for an example.
+ */
'skins.chick' => array(
'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
'vector/screen.css' => array( 'media' => 'screen' ),
'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.vector.js' => array(
'scripts' => 'vector/vector.js',
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
'dependencies' => 'mediawiki.api',
),
- 'mediawiki.api.titleblacklist' => array(
- 'scripts' => 'resources/mediawiki.api/mediawiki.api.titleblacklist.js',
- 'dependencies' => array(
- 'mediawiki.api',
- 'mediawiki.Title',
- ),
- ),
'mediawiki.api.watch' => array(
'scripts' => 'resources/mediawiki.api/mediawiki.api.watch.js',
'dependencies' => array(
'metadata-collapse',
),
),
+ 'mediawiki.action.view.postEdit' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.js',
+ 'dependencies' => 'jquery.cookie'
+ ),
'mediawiki.action.view.rightClickEdit' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
),
/* MediaWiki Language */
'mediawiki.language' => array(
- 'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
+ 'scripts' => array(
+ 'resources/mediawiki.language/mediawiki.language.js',
+ 'resources/mediawiki.language/mediawiki.language.numbers.js'
+ ),
'languageScripts' => array(
'bs' => 'resources/mediawiki.language/languages/bs.js',
'dsb' => 'resources/mediawiki.language/languages/dsb.js',
),
'dependencies' => array(
'mediawiki.language.data',
- 'mediawiki.cldr'
+ 'mediawiki.cldr',
),
'targets' => array( 'desktop', 'mobile' ),
),
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
- -moz-box-shadow: 0px 1px 4px #ccc;
- -webkit-box-shadow: 0px 1px 4px #ccc;
- box-shadow: 0px 1px 4px #ccc;
padding: 0 3px;
text-align: center;
font-size: 12px;
$(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout, timerID );
} );
}
-
+
// Bottom half
$(this).bind( '_delayedBind-' + encEvent + '-' + timeout, data, callback );
} );
},
-
+
/**
* Cancel the timers for delayed events on the selected elements.
*/
}
} );
},
-
+
/**
* Unbind an event bound with delayedBind()
*/
/**
- * Simple Placeholder-based Localization
+ * @class jQuery.plugin.localize
+ */
+( function ( $, mw ) {
+
+/**
+ * Gets a localized message, using parameters from options if present.
+ * @ignore
+ *
+ * @param {Object} options
+ * @param {string} key
+ * @returns {string} Localized message
+ */
+function msg( options, key ) {
+ var args = options.params[key] || [];
+ // Format: mw.msg( key [, p1, p2, ...] )
+ args.unshift( options.prefix + ( options.keys[key] || key ) );
+ return mw.msg.apply( mw, args );
+}
+
+/**
+ * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
+ * localized title and alt attributes to elements with title-msg and alt-msg attributes
+ * respectively.
*
- * Call on a selection of HTML which contains <html:msg key="message-key" /> elements or elements
+ * Call on a selection of HTML which contains `<html:msg key="message-key" />` elements or elements
* with title-msg="message-key", alt-msg="message-key" or placeholder-msg="message-key" attributes.
- * <html:msg /> elements will be replaced with localized text, *-msg attributes will be replaced
+ * `<html:msg />` elements will be replaced with localized text, *-msg attributes will be replaced
* with attributes that do not have the "-msg" suffix and contain a localized message.
*
* Example:
* Appends something like this to the body...
* <p>You may not get there all in one piece.</p>
*
- */
-( function ( $, mw ) {
-
-/**
- * Gets a localized message, using parameters from options if present.
- *
- * @function
- * @param {String} key Message key to get localized message for
- * @returns {String} Localized message
- */
-function msg( options, key ) {
- var args = options.params[key] || [];
- // Format: mw.msg( key [, p1, p2, ...] )
- args.unshift( options.prefix + ( options.keys[key] || key ) );
- return mw.msg.apply( mw, args );
-}
-
-/**
- * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
- * localized title and alt attributes to elements with title-msg and alt-msg attributes
- * respectively.
- *
* @method
* @param {Object} options Map of options to be used while localizing
- * @param {String} options.prefix String to prepend to all message keys
+ * @param {string} options.prefix String to prepend to all message keys
* @param {Object} options.keys Message key aliases, used for remapping keys to a template
* @param {Object} options.params Lists of parameters to use with certain message keys
- * @returns {jQuery} This selection
+ * @return {jQuery}
*/
$.fn.localize = function ( options ) {
var $target = this,
// Let IE know about the msg tag before it's used...
document.createElement( 'msg' );
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.localize
+ */
+
}( jQuery, mediaWiki ) );
*
* @author Timo Tijhof, 2011-2012
*/
-/*global jQuery, QUnit */
-/*jshint eqeqeq:false, eqnull:false, forin:false */
( function ( $ ) {
'use strict';
/**
- * QUnit v1.10.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.11.0 - A JavaScript Unit Testing Framework
*
* http://qunitjs.com
*
/** Resets */
-#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
margin: 0;
padding: 0;
}
color: #000;
}
-#qunit-tests ol {
+#qunit-tests li .runtime {
+ float: right;
+ font-size: smaller;
+}
+
+.qunit-assert-list {
margin-top: 0.5em;
padding: 0.5em;
-webkit-border-radius: 5px;
}
+.qunit-collapsed {
+ display: none;
+}
+
#qunit-tests table {
border-collapse: collapse;
margin-top: .2em;
/**
- * QUnit v1.10.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.11.0 - A JavaScript Unit Testing Framework
*
* http://qunitjs.com
*
(function( window ) {
var QUnit,
+ assert,
config,
onErrorFnPrev,
testId = 0,
// Keep a local reference to Date (GH-283)
Date = window.Date,
defined = {
- setTimeout: typeof window.setTimeout !== "undefined",
- sessionStorage: (function() {
- var x = "qunit-test-string";
- try {
- sessionStorage.setItem( x, x );
- sessionStorage.removeItem( x );
- return true;
- } catch( e ) {
- return false;
+ setTimeout: typeof window.setTimeout !== "undefined",
+ sessionStorage: (function() {
+ var x = "qunit-test-string";
+ try {
+ sessionStorage.setItem( x, x );
+ sessionStorage.removeItem( x );
+ return true;
+ } catch( e ) {
+ return false;
+ }
+ }())
+ },
+ /**
+ * Provides a normalized error string, correcting an issue
+ * with IE 7 (and prior) where Error.prototype.toString is
+ * not properly implemented
+ *
+ * Based on http://es5.github.com/#x15.11.4.4
+ *
+ * @param {String|Error} error
+ * @return {String} error message
+ */
+ errorString = function( error ) {
+ var name, message,
+ errorString = error.toString();
+ if ( errorString.substring( 0, 7 ) === "[object" ) {
+ name = error.name ? error.name.toString() : "Error";
+ message = error.message ? error.message.toString() : "";
+ if ( name && message ) {
+ return name + ": " + message;
+ } else if ( name ) {
+ return name;
+ } else if ( message ) {
+ return message;
+ } else {
+ return "Error";
+ }
+ } else {
+ return errorString;
}
- }())
-};
+ },
+ /**
+ * Makes a clone of an object using only Array or Object as base,
+ * and copies over the own enumerable properties.
+ *
+ * @param {Object} obj
+ * @return {Object} New object with only the own properties (recursively).
+ */
+ objectValues = function( obj ) {
+ // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
+ /*jshint newcap: false */
+ var key, val,
+ vals = QUnit.is( "array", obj ) ? [] : {};
+ for ( key in obj ) {
+ if ( hasOwn.call( obj, key ) ) {
+ val = obj[key];
+ vals[key] = val === Object(val) ? objectValues(val) : val;
+ }
+ }
+ return vals;
+ };
function Test( settings ) {
extend( this, settings );
Test.prototype = {
init: function() {
var a, b, li,
- tests = id( "qunit-tests" );
+ tests = id( "qunit-tests" );
if ( tests ) {
b = document.createElement( "strong" );
- b.innerHTML = this.name;
+ b.innerHTML = this.nameHtml;
// `a` initialized at top of scope
a = document.createElement( "a" );
teardown: function() {}
}, this.moduleTestEnvironment );
+ this.started = +new Date();
runLoggingCallbacks( "testStart", QUnit, {
name: this.testName,
module: this.module
try {
this.testEnvironment.setup.call( this.testEnvironment );
} catch( e ) {
- QUnit.pushFailure( "Setup failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
+ QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
}
},
run: function() {
var running = id( "qunit-testresult" );
if ( running ) {
- running.innerHTML = "Running: <br/>" + this.name;
+ running.innerHTML = "Running: <br/>" + this.nameHtml;
}
if ( this.async ) {
QUnit.stop();
}
+ this.callbackStarted = +new Date();
+
if ( config.notrycatch ) {
this.callback.call( this.testEnvironment, QUnit.assert );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
return;
}
try {
this.callback.call( this.testEnvironment, QUnit.assert );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
} catch( e ) {
- QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + e.message, extractStacktrace( e, 0 ) );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
+
+ QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
// else next test will carry the responsibility
saveGlobal();
teardown: function() {
config.current = this;
if ( config.notrycatch ) {
+ if ( typeof this.callbackRuntime === "undefined" ) {
+ this.callbackRuntime = +new Date() - this.callbackStarted;
+ }
this.testEnvironment.teardown.call( this.testEnvironment );
return;
} else {
try {
this.testEnvironment.teardown.call( this.testEnvironment );
} catch( e ) {
- QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
+ QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
}
}
checkPollution();
},
finish: function() {
config.current = this;
- if ( config.requireExpects && this.expected == null ) {
+ if ( config.requireExpects && this.expected === null ) {
QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
- } else if ( this.expected != null && this.expected != this.assertions.length ) {
+ } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
- } else if ( this.expected == null && !this.assertions.length ) {
+ } else if ( this.expected === null && !this.assertions.length ) {
QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
}
- var assertion, a, b, i, li, ol,
+ var i, assertion, a, b, time, li, ol,
test = this,
good = 0,
bad = 0,
tests = id( "qunit-tests" );
+ this.runtime = +new Date() - this.started;
config.stats.all += this.assertions.length;
config.moduleStats.all += this.assertions.length;
if ( tests ) {
ol = document.createElement( "ol" );
+ ol.className = "qunit-assert-list";
for ( i = 0; i < this.assertions.length; i++ ) {
assertion = this.assertions[i];
}
if ( bad === 0 ) {
- ol.style.display = "none";
+ addClass( ol, "qunit-collapsed" );
}
// `b` initialized at top of scope
b = document.createElement( "strong" );
- b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
+ b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
addEvent(b, "click", function() {
- var next = b.nextSibling.nextSibling,
- display = next.style.display;
- next.style.display = display === "none" ? "block" : "none";
+ var next = b.parentNode.lastChild,
+ collapsed = hasClass( next, "qunit-collapsed" );
+ ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
});
addEvent(b, "dblclick", function( e ) {
var target = e && e.target ? e.target : window.event.srcElement;
- if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
+ if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
target = target.parentNode;
}
if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
}
});
+ // `time` initialized at top of scope
+ time = document.createElement( "span" );
+ time.className = "runtime";
+ time.innerHTML = this.runtime + " ms";
+
// `li` initialized at top of scope
li = id( this.id );
li.className = bad ? "fail" : "pass";
li.removeChild( li.firstChild );
a = li.firstChild;
li.appendChild( b );
- li.appendChild ( a );
+ li.appendChild( a );
+ li.appendChild( time );
li.appendChild( ol );
} else {
module: this.module,
failed: bad,
passed: this.assertions.length - bad,
- total: this.assertions.length
+ total: this.assertions.length,
+ duration: this.runtime
});
QUnit.reset();
test: function( testName, expected, callback, async ) {
var test,
- name = "<span class='test-name'>" + escapeInnerText( testName ) + "</span>";
+ nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
if ( arguments.length === 2 ) {
callback = expected;
}
if ( config.currentModule ) {
- name = "<span class='module-name'>" + config.currentModule + "</span>: " + name;
+ nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
}
test = new Test({
- name: name,
+ nameHtml: nameHtml,
testName: testName,
expected: expected,
async: async,
},
start: function( count ) {
+ // QUnit hasn't been initialized yet.
+ // Note: RequireJS (et al) may delay onLoad
+ if ( config.semaphore === undefined ) {
+ QUnit.begin(function() {
+ // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
+ setTimeout(function() {
+ QUnit.start( count );
+ });
+ });
+ return;
+ }
+
config.semaphore -= count || 1;
// don't start until equal number of stop-calls
if ( config.semaphore > 0 ) {
// ignore if start is called more often then stop
if ( config.semaphore < 0 ) {
config.semaphore = 0;
+ QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
+ return;
}
// A slight delay, to avoid any current callbacks
if ( defined.setTimeout ) {
}
};
+// `assert` initialized at top of scope
// Asssert helpers
-// All of these must call either QUnit.push() or manually do:
+// All of these must either call QUnit.push() or manually do:
// - runLoggingCallbacks( "log", .. );
// - config.current.assertions.push({ .. });
-QUnit.assert = {
+// We attach it to the QUnit object *after* we expose the public API,
+// otherwise `assert` will become a global variable in browsers (#341).
+assert = {
/**
* Asserts rough true-ish result.
* @name ok
message: msg
};
- msg = escapeInnerText( msg || (result ? "okay" : "failed" ) );
+ msg = escapeText( msg || (result ? "okay" : "failed" ) );
msg = "<span class='test-message'>" + msg + "</span>";
if ( !result ) {
source = sourceFromStacktrace( 2 );
if ( source ) {
details.source = source;
- msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr></table>";
+ msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
}
}
runLoggingCallbacks( "log", QUnit, details );
* @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
*/
equal: function( actual, expected, message ) {
+ /*jshint eqeqeq:false */
QUnit.push( expected == actual, actual, expected, message );
},
* @function
*/
notEqual: function( actual, expected, message ) {
+ /*jshint eqeqeq:false */
QUnit.push( expected != actual, actual, expected, message );
},
+ /**
+ * @name propEqual
+ * @function
+ */
+ propEqual: function( actual, expected, message ) {
+ actual = objectValues(actual);
+ expected = objectValues(expected);
+ QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
+ },
+
+ /**
+ * @name notPropEqual
+ * @function
+ */
+ notPropEqual: function( actual, expected, message ) {
+ actual = objectValues(actual);
+ expected = objectValues(expected);
+ QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
+ },
+
/**
* @name deepEqual
* @function
QUnit.push( expected !== actual, actual, expected, message );
},
- throws: function( block, expected, message ) {
+ "throws": function( block, expected, message ) {
var actual,
+ expectedOutput = expected,
ok = false;
// 'expected' is optional
// we don't want to validate thrown error
if ( !expected ) {
ok = true;
+ expectedOutput = null;
// expected is a regexp
} else if ( QUnit.objectType( expected ) === "regexp" ) {
- ok = expected.test( actual );
+ ok = expected.test( errorString( actual ) );
// expected is a constructor
} else if ( actual instanceof expected ) {
ok = true;
// expected is a validation function which returns true is validation passed
} else if ( expected.call( {}, actual ) === true ) {
+ expectedOutput = null;
ok = true;
}
- QUnit.push( ok, actual, null, message );
+ QUnit.push( ok, actual, expectedOutput, message );
} else {
QUnit.pushFailure( message, null, 'No exception was thrown.' );
}
/**
* @deprecate since 1.8.0
- * Kept assertion helpers in root for backwards compatibility
+ * Kept assertion helpers in root for backwards compatibility.
*/
-extend( QUnit, QUnit.assert );
+extend( QUnit, assert );
/**
* @deprecated since 1.9.0
- * Kept global "raises()" for backwards compatibility
+ * Kept root "raises()" for backwards compatibility.
+ * (Note that we don't introduce assert.raises).
*/
-QUnit.raises = QUnit.assert.throws;
+QUnit.raises = assert[ "throws" ];
/**
* @deprecated since 1.0.0, replaced with error pushes since 1.3.0
moduleDone: []
};
+// Export global variables, unless an 'exports' object exists,
+// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
+if ( typeof exports === "undefined" ) {
+ extend( window, QUnit );
+
+ // Expose QUnit object
+ window.QUnit = QUnit;
+}
+
// Initialize more QUnit.config and QUnit.urlParams
(function() {
var i,
QUnit.isLocal = location.protocol === "file:";
}());
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
- extend( window, QUnit );
-
- // Expose QUnit object
- window.QUnit = QUnit;
-}
-
// Extend QUnit object,
// these after set here because they should not be exposed as global functions
extend( QUnit, {
+ assert: assert,
+
config: config,
// Initialize the configuration options
autorun: false,
filter: "",
queue: [],
- semaphore: 0
+ semaphore: 1
});
var tests, banner, result,
if ( qunit ) {
qunit.innerHTML =
- "<h1 id='qunit-header'>" + escapeInnerText( document.title ) + "</h1>" +
+ "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
"<h2 id='qunit-banner'></h2>" +
"<div id='qunit-testrunner-toolbar'></div>" +
"<h2 id='qunit-userAgent'></h2>" +
// Safe object type checking
is: function( type, obj ) {
- return QUnit.objectType( obj ) == type;
+ return QUnit.objectType( obj ) === type;
},
objectType: function( obj ) {
return "null";
}
- var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || "";
+ var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
+ type = match && match[1] || "";
switch ( type ) {
case "Number":
expected: expected
};
- message = escapeInnerText( message ) || ( result ? "okay" : "failed" );
+ message = escapeText( message ) || ( result ? "okay" : "failed" );
message = "<span class='test-message'>" + message + "</span>";
output = message;
if ( !result ) {
- expected = escapeInnerText( QUnit.jsDump.parse(expected) );
- actual = escapeInnerText( QUnit.jsDump.parse(actual) );
+ expected = escapeText( QUnit.jsDump.parse(expected) );
+ actual = escapeText( QUnit.jsDump.parse(actual) );
output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
- if ( actual != expected ) {
+ if ( actual !== expected ) {
output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
}
if ( source ) {
details.source = source;
- output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
+ output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
}
output += "</table>";
message: message
};
- message = escapeInnerText( message ) || "error";
+ message = escapeText( message ) || "error";
message = "<span class='test-message'>" + message + "</span>";
output = message;
output += "<table>";
if ( actual ) {
- output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeInnerText( actual ) + "</pre></td></tr>";
+ output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
}
if ( source ) {
details.source = source;
- output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
+ output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
}
output += "</table>";
querystring += encodeURIComponent( key ) + "=" +
encodeURIComponent( params[ key ] ) + "&";
}
- return window.location.pathname + querystring.slice( 0, -1 );
+ return window.location.protocol + "//" + window.location.host +
+ window.location.pathname + querystring.slice( 0, -1 );
},
extend: extend,
// testStart: { name }
testStart: registerLoggingCallback( "testStart" ),
- // testDone: { name, failed, passed, total }
+ // testDone: { name, failed, passed, total, duration }
testDone: registerLoggingCallback( "testDone" ),
// moduleStart: { name }
runLoggingCallbacks( "begin", QUnit, {} );
// Initialize the config, saving the execution queue
- var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes, moduleFilter,
- numModules = 0,
- moduleFilterHtml = "",
+ var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
+ urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
+ numModules = 0,
+ moduleFilterHtml = "",
urlConfigHtml = "",
oldconfig = extend( {}, config );
};
}
config[ val.id ] = QUnit.urlParams[ val.id ];
- urlConfigHtml += "<input id='qunit-urlconfig-" + val.id + "' name='" + val.id + "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) + " title='" + val.tooltip + "'><label for='qunit-urlconfig-" + val.id + "' title='" + val.tooltip + "'>" + val.label + "</label>";
+ urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
+ "' name='" + escapeText( val.id ) +
+ "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
+ " title='" + escapeText( val.tooltip ) +
+ "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
+ "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
}
- moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " + ( config.module === undefined ? "selected" : "" ) + ">< All Modules ></option>";
+ moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
+ ( config.module === undefined ? "selected='selected'" : "" ) +
+ ">< All Modules ></option>";
+
for ( i in config.modules ) {
if ( config.modules.hasOwnProperty( i ) ) {
numModules += 1;
- moduleFilterHtml += "<option value='" + encodeURIComponent(i) + "' " + ( config.module === i ? "selected" : "" ) + ">" + i + "</option>";
+ moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(i) ) + "' " +
+ ( config.module === i ? "selected='selected'" : "" ) +
+ ">" + escapeText(i) + "</option>";
}
}
moduleFilterHtml += "</select>";
label.innerHTML = "Hide passed tests";
toolbar.appendChild( label );
- urlConfigCheckboxes = document.createElement( 'span' );
- urlConfigCheckboxes.innerHTML = urlConfigHtml;
- addEvent( urlConfigCheckboxes, "change", function( event ) {
- var params = {};
- params[ event.target.name ] = event.target.checked ? true : undefined;
+ urlConfigCheckboxesContainer = document.createElement("span");
+ urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
+ urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
+ // For oldIE support:
+ // * Add handlers to the individual elements instead of the container
+ // * Use "click" instead of "change"
+ // * Fallback from event.target to event.srcElement
+ addEvents( urlConfigCheckboxes, "click", function( event ) {
+ var params = {},
+ target = event.target || event.srcElement;
+ params[ target.name ] = target.checked ? true : undefined;
window.location = QUnit.url( params );
});
- toolbar.appendChild( urlConfigCheckboxes );
+ toolbar.appendChild( urlConfigCheckboxesContainer );
if (numModules > 1) {
moduleFilter = document.createElement( 'span' );
moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );
moduleFilter.innerHTML = moduleFilterHtml;
- addEvent( moduleFilter, "change", function() {
+ addEvent( moduleFilter.lastChild, "change", function() {
var selectBox = moduleFilter.getElementsByTagName("select")[0],
- selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
+ selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } );
});
" milliseconds.<br/>",
"<span class='passed'>",
passed,
- "</span> tests of <span class='total'>",
+ "</span> assertions of <span class='total'>",
config.stats.all,
"</span> passed, <span class='failed'>",
config.stats.bad,
function extractStacktrace( e, offset ) {
offset = offset === undefined ? 3 : offset;
- var stack, include, i, regex;
+ var stack, include, i;
if ( e.stacktrace ) {
// Opera
if ( fileName ) {
include = [];
for ( i = offset; i < stack.length; i++ ) {
- if ( stack[ i ].indexOf( fileName ) != -1 ) {
+ if ( stack[ i ].indexOf( fileName ) !== -1 ) {
break;
}
include.push( stack[ i ] );
}
}
-function escapeInnerText( s ) {
+/**
+ * Escape text for attribute or text content.
+ */
+function escapeText( s ) {
if ( !s ) {
return "";
}
s = s + "";
- return s.replace( /[\&<>]/g, function( s ) {
+ // Both single quotes and double quotes (for attributes)
+ return s.replace( /['"<>&]/g, function( s ) {
switch( s ) {
- case "&": return "&";
- case "<": return "<";
- case ">": return ">";
- default: return s;
+ case '\'':
+ return ''';
+ case '"':
+ return '"';
+ case '<':
+ return '<';
+ case '>':
+ return '>';
+ case '&':
+ return '&';
}
});
}
}
}
-function checkPollution( name ) {
+function checkPollution() {
var newGlobals,
deletedGlobals,
old = config.pollution;
return a;
}
+/**
+ * @param {HTMLElement} elem
+ * @param {string} type
+ * @param {Function} fn
+ */
function addEvent( elem, type, fn ) {
+ // Standards-based browsers
if ( elem.addEventListener ) {
elem.addEventListener( type, fn, false );
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, fn );
+ // IE
} else {
- fn();
+ elem.attachEvent( "on" + type, fn );
}
}
+/**
+ * @param {Array|NodeList} elems
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvents( elems, type, fn ) {
+ var i = elems.length;
+ while ( i-- ) {
+ addEvent( elems[i], type, fn );
+ }
+}
+
+function hasClass( elem, name ) {
+ return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
+}
+
+function addClass( elem, name ) {
+ if ( !hasClass( elem, name ) ) {
+ elem.className += (elem.className ? " " : "") + name;
+ }
+}
+
+function removeClass( elem, name ) {
+ var set = " " + elem.className + " ";
+ // Class name may appear multiple times
+ while ( set.indexOf(" " + name + " ") > -1 ) {
+ set = set.replace(" " + name + " " , " ");
+ }
+ // If possible, trim it for prettiness, but not neccecarily
+ elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set );
+}
+
function id( name ) {
return !!( typeof document !== "undefined" && document && document.getElementById ) &&
document.getElementById( name );
// Supports deprecated method of completely overwriting logging callbacks
function runLoggingCallbacks( key, scope, args ) {
- //debugger;
var i, callbacks;
if ( QUnit.hasOwnProperty( key ) ) {
QUnit[ key ].call(scope, args );
// for string, boolean, number and null
function useStrictEquality( b, a ) {
+ /*jshint eqeqeq:false */
if ( b instanceof a.constructor || a instanceof b.constructor ) {
// to catch short annotaion VS 'new' annotation of a
// declaration
var reName = /^function (\w+)/,
jsDump = {
- parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
+ // type is used mostly internally, you can fix a (custom)type in advance
+ parse: function( obj, type, stack ) {
stack = stack || [ ];
var inStack, res,
parser = this.parsers[ type || this.typeOf(obj) ];
type = typeof parser;
inStack = inArray( obj, stack );
- if ( inStack != -1 ) {
+ if ( inStack !== -1 ) {
return "recursion(" + (inStack - stack.length) + ")";
}
- //else
- if ( type == "function" ) {
+ if ( type === "function" ) {
stack.push( obj );
res = parser.call( this, obj, stack );
stack.pop();
return res;
}
- // else
- return ( type == "string" ) ? parser : this.parsers.error;
+ return ( type === "string" ) ? parser : this.parsers.error;
},
typeOf: function( obj ) {
var type;
( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
) {
type = "array";
+ } else if ( obj.constructor === Error.prototype.constructor ) {
+ type = "error";
} else {
type = typeof obj;
}
separator: function() {
return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? " " : " ";
},
- indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
+ // extra can be a number, shortcut for increasing-calling-decreasing
+ indent: function( extra ) {
if ( !this.multiline ) {
return "";
}
parsers: {
window: "[Window]",
document: "[Document]",
- error: "[ERROR]", //when no parser is found, shouldn"t happen
+ error: function(error) {
+ return "Error(\"" + error.message + "\")";
+ },
unknown: "[Unknown]",
"null": "null",
"undefined": "undefined",
"function": function( fn ) {
var ret = "function",
- name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];//functions never have name in IE
+ // functions never have name in IE
+ name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
if ( name ) {
ret += " " + name;
object: function( map, stack ) {
var ret = [ ], keys, key, val, i;
QUnit.jsDump.up();
- if ( Object.keys ) {
- keys = Object.keys( map );
- } else {
- keys = [];
- for ( key in map ) {
- keys.push( key );
- }
+ keys = [];
+ for ( key in map ) {
+ keys.push( key );
}
keys.sort();
for ( i = 0; i < keys.length; i++ ) {
return join( "{", ret, "}" );
},
node: function( node ) {
- var a, val,
+ var len, i, val,
open = QUnit.jsDump.HTML ? "<" : "<",
close = QUnit.jsDump.HTML ? ">" : ">",
tag = node.nodeName.toLowerCase(),
- ret = open + tag;
-
- for ( a in QUnit.jsDump.DOMAttrs ) {
- val = node[ QUnit.jsDump.DOMAttrs[a] ];
- if ( val ) {
- ret += " " + a + "=" + QUnit.jsDump.parse( val, "attribute" );
+ ret = open + tag,
+ attrs = node.attributes;
+
+ if ( attrs ) {
+ for ( i = 0, len = attrs.length; i < len; i++ ) {
+ val = attrs[i].nodeValue;
+ // IE6 includes all attributes in .attributes, even ones not explicitly set.
+ // Those have values like undefined, null, 0, false, "" or "inherit".
+ if ( val && val !== "inherit" ) {
+ ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
+ }
}
}
- return ret + close + open + "/" + tag + close;
+ ret += close;
+
+ // Show content of TextNode or CDATASection
+ if ( node.nodeType === 3 || node.nodeType === 4 ) {
+ ret += node.nodeValue;
+ }
+
+ return ret + open + "/" + tag + close;
},
- functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function
+ // function calls it internally, it's the arguments part of the function
+ functionArgs: function( fn ) {
var args,
l = fn.length;
args = new Array(l);
while ( l-- ) {
- args[l] = String.fromCharCode(97+l);//97 is 'a'
+ // 97 is 'a'
+ args[l] = String.fromCharCode(97+l);
}
return " " + args.join( ", " ) + " ";
},
- key: quote, //object calls it internally, the key part of an item in a map
- functionCode: "[code]", //function calls it internally, it's the content of the function
- attribute: quote, //node calls it internally, it's an html attribute value
+ // object calls it internally, the key part of an item in a map
+ key: quote,
+ // function calls it internally, it's the content of the function
+ functionCode: "[code]",
+ // node calls it internally, it's an html attribute value
+ attribute: quote,
string: quote,
date: quote,
- regexp: literal, //regex
+ regexp: literal,
number: literal,
"boolean": literal
},
- DOMAttrs: {
- //attributes to dump from nodes, name=>realName
- id: "id",
- name: "name",
- "class": "className"
- },
- HTML: false,//if true, entities are escaped ( <, >, \t, space and \n )
- indentChar: " ",//indentation unit
- multiline: true //if true, items in a collection, are separated by a \n, else just a space.
+ // if true, entities are escaped ( <, >, \t, space and \n )
+ HTML: false,
+ // indentation unit
+ indentChar: " ",
+ // if true, items in a collection, are separated by a \n, else just a space.
+ multiline: true
};
return jsDump;
}());
-// from Sizzle.js
-function getText( elems ) {
- var i, elem,
- ret = "";
-
- for ( i = 0; elems[i]; i++ ) {
- elem = elems[i];
-
- // Get the text from text nodes and CDATA nodes
- if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
- ret += elem.nodeValue;
-
- // Traverse everything else, except comment nodes
- } else if ( elem.nodeType !== 8 ) {
- ret += getText( elem.childNodes );
- }
- }
-
- return ret;
-}
-
// from jquery.js
function inArray( elem, array ) {
if ( array.indexOf ) {
* QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
*/
QUnit.diff = (function() {
+ /*jshint eqeqeq:false, eqnull:true */
function diff( o, n ) {
var i,
ns = {},
os = {};
for ( i = 0; i < n.length; i++ ) {
- if ( ns[ n[i] ] == null ) {
+ if ( !hasOwn.call( ns, n[i] ) ) {
ns[ n[i] ] = {
rows: [],
o: null
}
for ( i = 0; i < o.length; i++ ) {
- if ( os[ o[i] ] == null ) {
+ if ( !hasOwn.call( os, o[i] ) ) {
os[ o[i] ] = {
rows: [],
n: null
if ( !hasOwn.call( ns, i ) ) {
continue;
}
- if ( ns[i].rows.length == 1 && typeof os[i] != "undefined" && os[i].rows.length == 1 ) {
+ if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
n[ ns[i].rows[0] ] = {
text: n[ ns[i].rows[0] ],
row: os[i].rows[0]
// for CommonJS enviroments, export everything
if ( typeof exports !== "undefined" ) {
- extend(exports, QUnit);
+ extend( exports, QUnit );
}
// get at whatever the global object is, like window in browsers
var selected = context.data.$container.find( '.suggestions-result-current' );
if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
if ( result === 'prev' ) {
- if( selected.is( '.suggestions-special' ) ) {
+ if( selected.hasClass( 'suggestions-special' ) ) {
result = context.data.$container.find( '.suggestions-result:last' );
} else {
result = selected.prev();
- if ( !( result.length && result.hasClass( '.suggestions-result' ) ) ) {
+ if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
// there is something in the DOM between selected element and the wrapper, bypass it
result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq(0);
}
}
} else {
result = selected.next();
- if ( !( result.length && result.hasClass( '.suggestions-result' ) ) ) {
+ if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
// there is something in the DOM between selected element and the wrapper, bypass it
result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq(0);
}
- if ( selected.is( '.suggestions-special' ) ) {
+ if ( selected.hasClass( 'suggestions-special' ) ) {
result = $( [] );
} else if (
result.length === 0 &&
e.preventDefault();
return false; // Because the submit is special, return false as well.
}
-
+
// Continue natural browser handling other wise
return true;
} );
--- /dev/null
+( function ( mw, $ ) {
+ // Only a view can be a post-edit.
+ if ( mw.config.get( 'wgAction' ) !== 'view' ) {
+ return;
+ }
+
+ // Matches EditPage::POST_EDIT_COOKIE_KEY_PREFIX
+ var cookieKey = mw.config.get( 'wgCookiePrefix' ) + 'PostEditRevision' + mw.config.get( 'wgCurRevisionId' );
+
+ if ( $.cookie( cookieKey ) === '1' ) {
+ // We just saved this page
+ $.cookie( cookieKey, null, { path: '/' } );
+ mw.config.set( 'wgPostEdit', true );
+ }
+} ( mediaWiki, jQuery ) );
/**
- * Additional mw.Api methods to assist with API calls related to categories.
+ * @class mw.Api.plugin.category
*/
( function ( mw, $ ) {
$.extend( mw.Api.prototype, {
/**
* Determine if a category exists.
- * @param title {mw.Title}
- * @param success {Function} callback to pass boolean of category's existence
- * @param err {Function} optional callback to run if api error
- * @return ajax call object
+ * @param {mw.Title} title
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {boolean} return.done.isCategory Whether the category exists.
*/
- isCategory: function ( title, success, err ) {
- var params, ok;
- params = {
- prop: 'categoryinfo',
- titles: title.toString()
- };
- ok = function ( data ) {
- var exists = false;
- if ( data.query && data.query.pages ) {
- $.each( data.query.pages, function ( id, page ) {
- if ( page.categoryinfo ) {
- exists = true;
- }
- } );
- }
- success( exists );
- };
+ isCategory: function ( title, ok, err ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
- return this.get( params, { ok: ok, err: err } );
+ this.get( {
+ prop: 'categoryinfo',
+ titles: title.toString()
+ } )
+ .done( function ( data ) {
+ var exists = false;
+ if ( data.query && data.query.pages ) {
+ $.each( data.query.pages, function ( id, page ) {
+ if ( page.categoryinfo ) {
+ exists = true;
+ }
+ } );
+ }
+ d.resolve( exists );
+ })
+ .fail( d.reject );
+
+ return d.promise();
},
/**
* Get a list of categories that match a certain prefix.
* e.g. given "Foo", return "Food", "Foolish people", "Foosball tables" ...
- * @param prefix {String} prefix to match
- * @param success {Function} callback to pass matched categories to
- * @param err {Function} optional callback to run if api error
- * @return {jqXHR}
+ * @param {string} prefix Prefix to match.
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {String[]} return.done.categories Matched categories
*/
- getCategoriesByPrefix: function ( prefix, success, err ) {
+ getCategoriesByPrefix: function ( prefix, ok, err ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
// Fetch with allpages to only get categories that have a corresponding description page.
- var params, ok;
- params = {
- 'list': 'allpages',
- 'apprefix': prefix,
- 'apnamespace': mw.config.get('wgNamespaceIds').category
- };
- ok = function ( data ) {
- var texts = [];
- if ( data.query && data.query.allpages ) {
- $.each( data.query.allpages, function ( i, category ) {
- texts.push( new mw.Title( category.title ).getNameText() );
- } );
- }
- success( texts );
- };
+ this.get( {
+ list: 'allpages',
+ apprefix: prefix,
+ apnamespace: mw.config.get('wgNamespaceIds').category
+ } )
+ .done( function ( data ) {
+ var texts = [];
+ if ( data.query && data.query.allpages ) {
+ $.each( data.query.allpages, function ( i, category ) {
+ texts.push( new mw.Title( category.title ).getNameText() );
+ } );
+ }
+ d.resolve( texts );
+ })
+ .fail( d.reject );
- return this.get( params, { ok: ok, err: err } );
+ return d.promise();
},
/**
* Get the categories that a particular page on the wiki belongs to
- * @param title {mw.Title}
- * @param success {Function} callback to pass categories to (or false, if title not found)
- * @param err {Function} optional callback to run if api error
- * @param async {Boolean} optional asynchronousness (default = true = async)
- * @return {jqXHR}
+ * @param {mw.Title} title
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @param {boolean} [async=true] Asynchronousness
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
+ * if title was not found.
*/
- getCategories: function ( title, success, err, async ) {
- var params, ok;
- params = {
- prop: 'categories',
- titles: title.toString()
- };
- if ( async === undefined ) {
- async = true;
- }
- ok = function ( data ) {
- var ret = false;
- if ( data.query && data.query.pages ) {
- $.each( data.query.pages, function ( id, page ) {
- if ( page.categories ) {
- if ( typeof ret !== 'object' ) {
- ret = [];
+ getCategories: function ( title, ok, err, async ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
+ this.get( {
+ prop: 'categories',
+ titles: title.toString()
+ }, {
+ async: async === undefined ? true : async
+ } )
+ .done( function ( data ) {
+ var ret = false;
+ if ( data.query && data.query.pages ) {
+ $.each( data.query.pages, function ( id, page ) {
+ if ( page.categories ) {
+ if ( typeof ret !== 'object' ) {
+ ret = [];
+ }
+ $.each( page.categories, function ( i, cat ) {
+ ret.push( new mw.Title( cat.title ) );
+ } );
}
- $.each( page.categories, function ( i, cat ) {
- ret.push( new mw.Title( cat.title ) );
- } );
- }
- } );
- }
- success( ret );
- };
+ } );
+ }
+ d.resolve( ret );
+ })
+ .fail( d.reject );
- return this.get( params, { ok: ok, err: err, async: async } );
+ return d.promise();
}
} );
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.category
+ */
+
}( mediaWiki, jQuery ) );
/**
- * Additional mw.Api methods to assist with API calls related to editing wiki pages.
+ * @class mw.Api.plugin.edit
*/
( function ( mw, $ ) {
* If we have a cached token try using that, and if it fails, blank out the
* cached token and start over.
*
- * @param params {Object} API parameters
- * @param ok {Function} callback for success
- * @param err {Function} [optional] error callback
- * @return {jqXHR}
+ * @param {Object} params API parameters
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise} See #post
*/
postWithEditToken: function ( params, ok, err ) {
var useTokenToPost, getTokenIfBad,
},
/**
- * Api helper to grab an edit token
+ * Api helper to grab an edit token.
*
- * token callback has signature ( String token )
- * error callback has signature ( String code, Object results, XmlHttpRequest xhr, Exception exception )
- * Note that xhr and exception are only available for 'http_*' errors
- * code may be any http_* error code (see mw.Api), or 'token_missing'
- *
- * @param tokenCallback {Function} received token callback
- * @param err {Function} error callback
- * @return {jqXHR}
+ * @param {Function} [ok] Success callback
+ * @param {Function} [err] Error callback
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {string} return.done.token Received token.
*/
- getEditToken: function ( tokenCallback, err ) {
- var parameters = {
+ getEditToken: function ( ok, err ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
+ this.get( {
action: 'tokens',
type: 'edit'
- },
- ok = function ( data ) {
+ }, {
+ // Due to the API assuming we're logged out if we pass the callback-parameter,
+ // we have to disable jQuery's callback system, and instead parse JSON string,
+ // by setting 'jsonp' to false.
+ // TODO: This concern seems genuine but no other module has it. Is it still
+ // needed and/or should we pass this by default?
+ jsonp: false
+ } )
+ .done( function ( data ) {
var token;
// If token type is not available for this user,
// key 'edittoken' is missing or can contain Boolean false
if ( data.tokens && data.tokens.edittoken ) {
token = data.tokens.edittoken;
cachedToken = token;
- tokenCallback( token );
+ d.resolve( token );
} else {
- err( 'token-missing', data );
+ d.reject( 'token-missing', data );
}
- },
- ajaxOptions = {
- ok: ok,
- err: err,
- // Due to the API assuming we're logged out if we pass the callback-parameter,
- // we have to disable jQuery's callback system, and instead parse JSON string,
- // by setting 'jsonp' to false.
- jsonp: false
- };
+ })
+ .fail( d.reject );
- return this.get( parameters, ajaxOptions );
+ return d.promise();
},
/**
* Create a new section of the page.
- * @param title {mw.Title|String} target page
- * @param header {String}
- * @param message {String} wikitext message
- * @param ok {Function} success handler
- * @param err {Function} error handler
- * @return {jqXHR}
+ * @see #postWithEditToken
+ * @param {mw.Title|String} title Target page
+ * @param {string} header
+ * @param {string} message wikitext message
+ * @param {Function} [ok] Success handler
+ * @param {Function} [err] Error handler
+ * @return {jQuery.Promise}
*/
newSection: function ( title, header, message, ok, err ) {
- var params = {
+ return this.postWithEditToken( {
action: 'edit',
section: 'new',
format: 'json',
title: title.toString(),
summary: header,
text: message
- };
- return this.postWithEditToken( params, ok, err );
+ }, ok, err );
}
} );
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.edit
+ */
+
}( mediaWiki, jQuery ) );
-/**
- * mw.Api objects represent the API of a particular MediaWiki server.
- */
( function ( mw, $ ) {
- /**
- * @var defaultOptions {Object}
- * We allow people to omit these default parameters from API requests
- * there is very customizable error handling here, on a per-call basis
- * wondering, would it be simpler to make it easy to clone the api object,
- * change error handling, and use that instead?
- */
+ // We allow people to omit these default parameters from API requests
+ // there is very customizable error handling here, on a per-call basis
+ // wondering, would it be simpler to make it easy to clone the api object,
+ // change error handling, and use that instead?
var defaultOptions = {
// Query parameters for API requests
/**
* Constructor to create an object to interact with the API of a particular MediaWiki server.
+ * mw.Api objects represent the API of a particular MediaWiki server.
+ *
+ * TODO: Share API objects with exact same config.
*
- * @todo Share API objects with exact same config.
- * @example
- * <code>
- * var api = new mw.Api();
- * api.get( {
- * action: 'query',
- * meta: 'userinfo'
- * }, {
- * ok: function () { console.log( arguments ); }
- * } );
- * </code>
+ * var api = new mw.Api();
+ * api.get( {
+ * action: 'query',
+ * meta: 'userinfo'
+ * } ).done ( function ( data ) {
+ * console.log( data );
+ * } );
+ *
+ * @class
*
* @constructor
- * @param options {Object} See defaultOptions documentation above. Ajax options can also be
- * overridden for each individual request to jQuery.ajax() later on.
+ * @param {Object} options See defaultOptions documentation above. Ajax options can also be
+ * overridden for each individual request to {@link jQuery#ajax} later on.
*/
mw.Api = function ( options ) {
/**
* Normalize the ajax options for compatibility and/or convenience methods.
*
- * @param {undefined|Object|Function} An object contaning one or more of options.ajax,
- * or just a success function (options.ajax.ok).
+ * @param {Object} [arg] An object contaning one or more of options.ajax.
* @return {Object} Normalized ajax options.
*/
normalizeAjaxOptions: function ( arg ) {
// Arg argument is usually empty
- // (before MW 1.20 it was often used to pass ok/err callbacks)
+ // (before MW 1.20 it was used to pass ok callbacks)
var opts = arg || {};
// Options can also be a success callback handler
if ( typeof arg === 'function' ) {
/**
* Perform API get request
*
- * @param {Object} request parameters
- * @param {Object|Function} [optional] ajax options
+ * @param {Object} parameters
+ * @param {Object|Function} [ajaxOptions]
* @return {jQuery.Promise}
*/
get: function ( parameters, ajaxOptions ) {
/**
* Perform API post request
- * @todo Post actions for nonlocal will need proxy
*
- * @param {Object} request parameters
- * @param {Object|Function} [optional] ajax options
+ * TODO: Post actions for non-local hostnames will need proxy.
+ *
+ * @param {Object} parameters
+ * @param {Object|Function} [ajaxOptions]
* @return {jQuery.Promise}
*/
post: function ( parameters, ajaxOptions ) {
/**
* Perform the API call.
*
- * @param {Object} request parameters
- * @param {Object} ajax options
- * @return {jQuery.Promise}
- * - done: API response data as first argument
- * - fail: errorcode as first arg, details (string or object) as second arg.
+ * @param {Object} parameters
+ * @param {Object} [ajaxOptions]
+ * @return {jQuery.Promise} Done: API response data. Fail: Error code
*/
ajax: function ( parameters, ajaxOptions ) {
var token,
};
/**
- * @var {Array} List of errors we might receive from the API.
+ * @static
+ * @property {Array}
+ * List of errors we might receive from the API.
* For now, this just documents our expectation that there should be similar messages
* available.
*/
];
/**
- * @var {Array} List of warnings we might receive from the API.
+ * @static
+ * @property {Array}
+ * List of warnings we might receive from the API.
* For now, this just documents our expectation that there should be similar messages
* available.
*/
/**
- * mw.Api methods for parsing wikitext.
+ * @class mw.Api.plugin.parse
*/
( function ( mw, $ ) {
$.extend( mw.Api.prototype, {
/**
- * Convinience method for 'action=parse'. Parses wikitext into HTML.
+ * Convinience method for 'action=parse'.
*
- * @param wikiText {String}
- * @param ok {Function} [optional] deprecated (success callback)
- * @param err {Function} [optional] deprecated (error callback)
+ * @param {string} wikitext
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
* @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {string} return.done.data Parsed HTML of `wikitext`.
*/
- parse: function ( wikiText, ok, err ) {
- var apiDeferred = $.Deferred();
-
+ parse: function ( wikitext, ok, err ) {
+ var d = $.Deferred();
// Backwards compatibility (< MW 1.20)
- if ( ok ) {
- apiDeferred.done( ok );
- }
- if ( err ) {
- apiDeferred.fail( err );
- }
+ d.done( ok );
+ d.fail( err );
this.get( {
action: 'parse',
- text: wikiText
+ text: wikitext
} )
.done( function ( data ) {
if ( data.parse && data.parse.text && data.parse.text['*'] ) {
- apiDeferred.resolve( data.parse.text['*'] );
+ d.resolve( data.parse.text['*'] );
}
} )
- .fail( apiDeferred.reject );
+ .fail( d.reject );
- // Return the promise
- return apiDeferred.promise();
+ return d.promise();
}
} );
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.parse
+ */
+
}( mediaWiki, jQuery ) );
+++ /dev/null
-/**
- * Additional mw.Api methods to assist with API calls to the API module of the TitleBlacklist extension.
- */
-
-( function ( mw, $ ) {
-
- $.extend( mw.Api.prototype, {
- /**
- * Convinience method for 'action=titleblacklist'.
- * Note: This action is not provided by MediaWiki core, but as part of the TitleBlacklist extension.
- *
- * @param title {mw.Title}
- * @param success {Function} Called on successfull request. First argument is false if title wasn't blacklisted,
- * object with 'reason', 'line' and 'message' properties if title was blacklisted.
- * @param err {Function} optional callback to run if api error
- * @return {jqXHR}
- */
- isBlacklisted: function ( title, success, err ) {
- var params = {
- action: 'titleblacklist',
- tbaction: 'create',
- tbtitle: title.toString()
- },
- ok = function ( data ) {
- var result;
-
- // this fails open (if nothing valid is returned by the api, allows the title)
- // also fails open when the API is not present, which will be most of the time
- // as this API module is part of the TitleBlacklist extension.
- if ( data.titleblacklist && data.titleblacklist.result && data.titleblacklist.result === 'blacklisted') {
- if ( data.titleblacklist.reason ) {
- result = {
- reason: data.titleblacklist.reason,
- line: data.titleblacklist.line,
- message: data.titleblacklist.message
- };
- } else {
- mw.log('mw.Api.titleblacklist::isBlacklisted> no reason data for blacklisted title', 'debug');
- result = { reason: 'Blacklisted, but no reason supplied', line: 'Unknown', message: null };
- }
- success( result );
- } else {
- success ( false );
- }
- };
-
- return this.get( params, { ok: ok, err: err } );
- }
-
- } );
-
-}( mediaWiki, jQuery ) );
/**
- * Additional mw.Api methods to assist with (un)watching wiki pages.
+ * @class mw.Api.plugin.watch
* @since 1.19
*/
( function ( mw, $ ) {
/**
- * @context {mw.Api}
+ * @private
+ * @context mw.Api
+ *
+ * @param {String|mw.Title} page Full page name or instance of mw.Title
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {Object} return.done.watch
+ * @return {string} return.done.watch.title Full pagename
+ * @return {boolean} return.done.watch.watched
+ * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
*/
- function doWatchInternal( page, success, err, addParams ) {
- var params = {
+ function doWatchInternal( page, ok, err, addParams ) {
+ var params, d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
+ params = {
action: 'watch',
title: String( page ),
token: mw.user.tokens.get( 'watchToken' ),
uselang: mw.config.get( 'wgUserLanguage' )
};
- function ok( data ) {
- success( data.watch );
- }
+
if ( addParams ) {
$.extend( params, addParams );
}
- return this.post( params, { ok: ok, err: err } );
+
+ this.post( params )
+ .done( function ( data ) {
+ d.resolve( data.watch );
+ } )
+ .fail( d.reject );
+
+ return d.promise();
}
$.extend( mw.Api.prototype, {
/**
- * Convenience method for 'action=watch'.
+ * Convenience method for `action=watch`.
*
- * @param page {String|mw.Title} Full page name or instance of mw.Title
- * @param success {Function} Callback to which the watch object will be passed.
- * Watch object contains properties 'title' (full pagename), 'watched' (boolean) and
- * 'message' (parsed HTML of the 'addedwatchtext' message).
- * @param err {Function} Error callback (optional)
- * @return {jqXHR}
+ * @inheritdoc #doWatchInternal
*/
- watch: function ( page, success, err ) {
- return doWatchInternal.call( this, page, success, err );
+ watch: function ( page, ok, err ) {
+ return doWatchInternal.call( this, page, ok, err );
},
/**
- * Convenience method for 'action=watch&unwatch=1'.
+ * Convenience method for `action=watch&unwatch=1`.
*
- * @param page {String|mw.Title} Full page name or instance of mw.Title
- * @param success {Function} Callback to which the watch object will be passed.
- * Watch object contains properties 'title' (full pagename), 'watched' (boolean) and
- * 'message' (parsed HTML of the 'removedwatchtext' message).
- * @param err {Function} Error callback (optional)
- * @return {jqXHR}
+ * @inheritdoc #doWatchInternal
*/
- unwatch: function ( page, success, err ) {
- return doWatchInternal.call( this, page, success, err, { unwatch: 1 } );
+ unwatch: function ( page, ok, err ) {
+ return doWatchInternal.call( this, page, ok, err, { unwatch: 1 } );
}
} );
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.watch
+ */
+
}( mediaWiki, jQuery ) );
* Russian (Русский) language functions
*/
+// These tests were originally made for names of Wikimedia
+// websites, so they don't currently cover all the possible
+// cases.
+
mediaWiki.language.convertGrammar = function ( word, form ) {
- /*jshint noempty:false, onecase:true */
+ 'use strict';
+
var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
return grammarForms[form][word];
}
switch ( form ) {
case 'genitive': // родительный падеж
- if ( ( word.substr( word.length - 4 ) === 'вики' ) || ( word.substr( word.length - 4 ) === 'Вики' ) ) {
- } else if ( word.substr( word.length - 1 ) === 'ь' ) {
+ if ( word.substr( word.length - 1 ) === 'ь' ) {
word = word.substr(0, word.length - 1 ) + 'я';
} else if ( word.substr( word.length - 2 ) === 'ия' ) {
word = word.substr(0, word.length - 2 ) + 'ии';
word = word.substr(0, word.length - 2 ) + 'тей';
} else if ( word.substr( word.length - 2 ) === 'ды' ) {
word = word.substr(0, word.length - 2 ) + 'дов';
+ } else if ( word.substr( word.length - 3 ) === 'ные' ) {
+ word = word.substr(0, word.length - 3 ) + 'ных';
} else if ( word.substr( word.length - 3 ) === 'ник' ) {
word = word.substr(0, word.length - 3 ) + 'ника';
}
break;
+ case 'prepositional': // предложный падеж
+ if ( word.substr( word.length - 1 ) === 'ь' ) {
+ word = word.substr(0, word.length - 1 ) + 'е';
+ } else if ( word.substr( word.length - 2 ) === 'ия' ) {
+ word = word.substr(0, word.length - 2 ) + 'ии';
+ } else if ( word.substr( word.length - 2 ) === 'ка' ) {
+ word = word.substr(0, word.length - 2 ) + 'ке';
+ } else if ( word.substr( word.length - 2 ) === 'ти' ) {
+ word = word.substr(0, word.length - 2 ) + 'тях';
+ } else if ( word.substr( word.length - 2 ) === 'ды' ) {
+ word = word.substr(0, word.length - 2 ) + 'дах';
+ } else if ( word.substr( word.length - 3 ) === 'ные' ) {
+ word = word.substr(0, word.length - 3 ) + 'ных';
+ } else if ( word.substr( word.length - 3 ) === 'ник' ) {
+ word = word.substr(0, word.length - 3 ) + 'нике';
+ }
+ break;
}
return word;
};
return forms;
},
- /**
- * Converts a number using digitTransformTable.
- *
- * @param {Number} number Value to be converted
- * @param {boolean} integer Convert the return value to an integer
- * @return {Number|String} formatted number
- */
- convertNumber: function ( num, integer ) {
- var i, tmp, transformTable, numberString, convertedNumber;
-
- // Set the target Transform table:
- transformTable = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' );
-
- if ( !transformTable ) {
- return num;
- }
-
- // Check if the "restore" to Latin number flag is set:
- if ( integer ) {
- if ( parseInt( num, 10 ) === num ) {
- return num;
- }
- tmp = [];
- for ( i in transformTable ) {
- tmp[ transformTable[ i ] ] = i;
- }
- transformTable = tmp;
- }
- numberString = '' + num;
- convertedNumber = '';
- for ( i = 0; i < numberString.length; i++ ) {
- if ( transformTable[ numberString[i] ] ) {
- convertedNumber += transformTable[numberString[i]];
- } else {
- convertedNumber += numberString[i];
- }
- }
- return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
- },
-
/**
* Provides an alternative text depending on specified gender.
* Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
return grammarForms[form][word] || word;
}
return word;
- },
+ }
- // Digit Transform Table, populated by language classes where applicable
- digitTransformTable: mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' )
};
$.extend( mw.language, language );
--- /dev/null
+/*
+ * Number related utilities for mediawiki.language
+ */
+( function ( mw, $ ) {
+
+ /**
+ * Pad a string to guarantee that it is at least `size` length by
+ * filling with the character `ch` at either the start or end of the
+ * string. Pads at the start, by default.
+ * example:
+ * Fill the string to length 10 with '+' characters on the right. Yields 'blah++++++'.
+ * pad('blah', 10, '+', true);
+ *
+ * @param {string} text The string to pad
+ * @param {Number} size To provide padding
+ * @param {string} ch Character to pad, defaults to '0'
+ * @param {Boolean} end Adds padding at the end if true, otherwise pads at start
+ * @return {string}
+ */
+ function pad ( text, size, ch, end ) {
+ if ( !ch ) {
+ ch = '0';
+ }
+
+ var out = String( text ),
+ padStr = replicate( ch, Math.ceil( ( size - out.length ) / ch.length ) );
+
+ return end ? out + padStr : padStr + out;
+ }
+
+ /**
+ * Efficiently replicate a string n times.
+ *
+ * @param {string} str The string to replicate
+ * @param {Number} num Number of times to replicate the string
+ * @return {string}
+ */
+ function replicate ( str, num ) {
+ if ( num <= 0 || !str ) {
+ return '';
+ }
+
+ var buf = [];
+ while (num) {
+ buf.push( str );
+ str += str;
+ }
+ return buf.join( '' );
+ }
+
+ /**
+ * Apply numeric pattern to absolute value using options. Gives no
+ * consideration to local customs.
+ *
+ * Adapted from dojo/number library with thanks
+ * http://dojotoolkit.org/reference-guide/1.8/dojo/number.html
+ *
+ * @param {Number} value the number to be formatted, ignores sign
+ * @param {string} pattern the number portion of a pattern (e.g. `#,##0.00`)
+ * @param {string} options.decimalThe decimal separator
+ * @param {string} options.group The group separator
+ *
+ * @return {string}
+ */
+ function commafyNumber( value, pattern, options ) {
+ options = options || {
+ group: ',',
+ decimal: '.'
+ };
+
+ if ( isNaN( value) ) {
+ return value;
+ }
+
+ var padLength,
+ patternDigits,
+ index,
+ whole,
+ off,
+ remainder,
+ patternParts = pattern.split( '.' ),
+ maxPlaces = ( patternParts[1] || [] ).length,
+ valueParts = String( Math.abs( value ) ).split( '.' ),
+ fractional = valueParts[1] || '',
+ groupSize = 0,
+ groupSize2 = 0,
+ pieces = [];
+
+ if ( patternParts[1] ) {
+ // Pad fractional with trailing zeros
+ padLength = ( patternParts[1] && patternParts[1].lastIndexOf( '0' ) + 1 );
+
+ if ( padLength > fractional.length ) {
+ valueParts[1] = pad( fractional, padLength, '0', true );
+ }
+
+ // Truncate fractional
+ if ( maxPlaces < fractional.length ) {
+ valueParts[1] = fractional.substr( 0, maxPlaces );
+ }
+ } else {
+ if ( valueParts[1] ) {
+ valueParts.pop();
+ }
+ }
+
+ // Pad whole with leading zeros
+ patternDigits = patternParts[0].replace( ',', '' );
+
+ padLength = patternDigits.indexOf( '0' );
+
+ if ( padLength !== -1 ) {
+ padLength = patternDigits.length - padLength;
+
+ if ( padLength > valueParts[0].length ) {
+ valueParts[0] = pad( valueParts[0], padLength );
+ }
+
+ // Truncate whole
+ if ( patternDigits.indexOf( '#' ) === -1 ) {
+ valueParts[0] = valueParts[0].substr( valueParts[0].length - padLength );
+ }
+ }
+
+ // Add group separators
+ index = patternParts[0].lastIndexOf( ',' );
+
+ if ( index !== -1 ) {
+ groupSize = patternParts[0].length - index - 1;
+ remainder = patternParts[0].substr( 0, index );
+ index = remainder.lastIndexOf( ',' );
+ if ( index !== -1 ) {
+ groupSize2 = remainder.length - index - 1;
+ }
+ }
+
+ for ( whole = valueParts[0]; whole; ) {
+ off = whole.length - groupSize;
+
+ pieces.push( ( off > 0 ) ? whole.substr( off ) : whole );
+ whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
+
+ if ( groupSize2 ) {
+ groupSize = groupSize2;
+ }
+ }
+ valueParts[0] = pieces.reverse().join( options.group );
+
+ return valueParts.join( options.decimal );
+ }
+
+ $.extend( mw.language, {
+
+ /**
+ * Converts a number using digitTransformTable.
+ *
+ * @param {Number} num Value to be converted
+ * @param {boolean} integer Convert the return value to an integer
+ * @return {Number|string} Formatted number
+ */
+ convertNumber: function ( num, integer ) {
+ var i, tmp, transformTable, numberString, convertedNumber, pattern;
+
+ pattern = mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+ 'digitGroupingPattern' ) || '#,##0.###';
+
+ // Set the target transform table:
+ transformTable = mw.language.getDigitTransformTable();
+
+ if ( !transformTable ) {
+ return num;
+ }
+
+ // Check if the 'restore' to Latin number flag is set:
+ if ( integer ) {
+ if ( parseInt( num, 10 ) === num ) {
+ return num;
+ }
+ tmp = [];
+ for ( i in transformTable ) {
+ tmp[ transformTable[ i ] ] = i;
+ }
+ transformTable = tmp;
+ numberString = num + '';
+ } else {
+ numberString = mw.language.commafy( num, pattern );
+ }
+
+ convertedNumber = '';
+ for ( i = 0; i < numberString.length; i++ ) {
+ if ( transformTable[ numberString[i] ] ) {
+ convertedNumber += transformTable[numberString[i]];
+ } else {
+ convertedNumber += numberString[i];
+ }
+ }
+ return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
+ },
+
+ getDigitTransformTable: function () {
+ return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+ 'digitTransformTable' ) || [];
+ },
+
+ getSeparatorTransformTable: function () {
+ return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+ 'separatorTransformTable' ) || [];
+ },
+
+ /**
+ * Apply pattern to format value as a string using as per
+ * unicode.org TR35 - http://www.unicode.org/reports/tr35/#Number_Format_Patterns.
+ *
+ * @param {Number} value
+ * @param {string} pattern Pattern string as described by Unicode TR35
+ * @throws Error
+ * @returns {String}
+ */
+ commafy: function ( value, pattern ) {
+ var numberPattern,
+ transformTable = mw.language.getSeparatorTransformTable(),
+ group = transformTable[','] || ',',
+ numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/, // not precise, but good enough
+ decimal = transformTable['.'] || '.',
+ patternList = pattern.split( ';' ),
+ positivePattern = patternList[0];
+
+ pattern = patternList[ ( value < 0 ) ? 1 : 0] || ( '-' + positivePattern );
+ numberPattern = positivePattern.match( numberPatternRE );
+
+ if ( !numberPattern ) {
+ throw new Error( 'unable to find a number expression in pattern: ' + pattern );
+ }
+
+ return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[0], {
+ decimal: decimal,
+ group: group
+ } ) );
+ }
+
+ } );
+
+}( mediaWiki, jQuery ) );
-/**
- * mediaWiki.Title
- *
+/*!
* @author Neil Kandalgaonkar, 2010
* @author Timo Tijhof, 2011
* @since 1.18
/* Local space */
/**
- * Title
- * @constructor
+ * @class mw.Title
*
- * @param title {String} Title of the page. If no second argument given,
+ * @constructor
+ * @param {string} title Title of the page. If no second argument given,
* this will be searched for a namespace.
- * @param namespace {Number} (optional) Namespace id. If given, title will be taken as-is.
- * @return {Title} this
+ * @param {number} [namespace] Namespace id. If given, title will be taken as-is.
*/
function Title( title, namespace ) {
this.ns = 0; // integer namespace id
}
var
- /**
- * Public methods (defined later)
- */
+ /* Public methods (defined later) */
fn,
/**
* Strip some illegal chars: control chars, colon, less than, greater than,
* brackets, braces, pipe, whitespace and normal spaces. This still leaves some insanity
* intact, like unicode bidi chars, but it's a good start..
- * @param s {String}
- * @return {String}
+ * @ignore
+ * @param {string} s
+ * @return {string}
*/
clean = function ( s ) {
if ( s !== undefined ) {
/**
* Convert db-key to readable text.
- * @param s {String}
- * @return {String}
+ * @ignore
+ * @param {string} s
+ * @return {string}
*/
text = function ( s ) {
if ( s !== null && s !== undefined ) {
/**
* Sanitize name.
+ * @ignore
*/
fixName = function ( s ) {
return clean( $.trim( s ) );
},
/**
- * Sanitize name.
+ * Sanitize extension.
+ * @ignore
*/
fixExt = function ( s ) {
return clean( s );
/**
* Sanitize namespace id.
+ * @ignore
* @param id {Number} Namespace id.
* @return {Number|Boolean} The id as-is or boolean false if invalid.
*/
/**
* Get namespace id from namespace name by any known namespace/id pair (localized, canonical or alias).
- *
- * @example On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or even 'Bild'.
+ * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or even 'Bild'.
+ * @ignore
* @param ns {String} Namespace name (case insensitive, leading/trailing space ignored).
* @return {Number|Boolean} Namespace id or boolean false if unrecognized.
*/
/**
* Helper to extract namespace, name and extension from a string.
*
- * @param title {mw.Title}
- * @param raw {String}
+ * @ignore
+ * @param {mw.Title} title
+ * @param {string} raw
* @return {mw.Title}
*/
setAll = function ( title, s ) {
/**
* Helper to extract name and extension from a string.
*
- * @param title {mw.Title}
- * @param raw {String}
+ * @ignore
+ * @param {mw.Title} title
+ * @param {string} raw
* @return {mw.Title}
*/
setNameAndExtension = function ( title, raw ) {
/**
* Whether this title exists on the wiki.
- * @param title {mixed} prefixed db-key name (string) or instance of Title
- * @return {mixed} Boolean true/false if the information is available. Otherwise null.
+ * @static
+ * @param {Mixed} title prefixed db-key name (string) or instance of Title
+ * @return {Mixed} Boolean true/false if the information is available. Otherwise null.
*/
Title.exists = function ( title ) {
var type = $.type( title ), obj = Title.exist.pages, match;
};
/**
- * @var Title.exist {Object}
+ * @static
+ * @property
*/
Title.exist = {
/**
- * @var Title.exist.pages {Object} Keyed by PrefixedDb title.
+ * @static
+ * @property {Object} exist.pages Keyed by PrefixedDb title.
* Boolean true value indicates page does exist.
*/
pages: {},
/**
- * @example Declare existing titles: Title.exist.set(['User:John_Doe', ...]);
- * @example Declare titles nonexistent: Title.exist.set(['File:Foo_bar.jpg', ...], false);
- * @param titles {String|Array} Title(s) in strict prefixedDb title form.
- * @param state {Boolean} (optional) State of the given titles. Defaults to true.
- * @return {Boolean}
+ * Example to declare existing titles:
+ * Title.exist.set(['User:John_Doe', ...]);
+ * Eample to declare titles nonexistent:
+ * Title.exist.set(['File:Foo_bar.jpg', ...], false);
+ *
+ * @static
+ * @property exist.set
+ * @param {string|Array} titles Title(s) in strict prefixedDb title form.
+ * @param {boolean} [state] State of the given titles. Defaults to true.
+ * @return {boolean}
*/
set: function ( titles, state ) {
titles = $.isArray( titles ) ? titles : [titles];
/**
* Get the namespace number.
- * @return {Number}
+ * @return {number}
*/
getNamespaceId: function (){
return this.ns;
/**
* Get the namespace prefix (in the content-language).
* In NS_MAIN this is '', otherwise namespace name plus ':'
- * @return {String}
+ * @return {string}
*/
getNamespacePrefix: function (){
return mw.config.get( 'wgFormattedNamespaces' )[this.ns].replace( / /g, '_' ) + (this.ns === 0 ? '' : ':');
/**
* The name, like "Foo_bar"
- * @return {String}
+ * @return {string}
*/
getName: function () {
if ( $.inArray( this.ns, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
/**
* The name, like "Foo bar"
- * @return {String}
+ * @return {string}
*/
getNameText: function () {
return text( this.getName() );
/**
* Get full name in prefixed DB form, like File:Foo_bar.jpg,
* most useful for API calls, anything that must identify the "title".
+ * @return {string}
*/
getPrefixedDb: function () {
return this.getNamespacePrefix() + this.getMain();
/**
* Get full name in text form, like "File:Foo bar.jpg".
- * @return {String}
+ * @return {string}
*/
getPrefixedText: function () {
return text( this.getPrefixedDb() );
/**
* The main title (without namespace), like "Foo_bar.jpg"
- * @return {String}
+ * @return {string}
*/
getMain: function () {
return this.getName() + this.getDotExtension();
/**
* The "text" form, like "Foo bar.jpg"
- * @return {String}
+ * @return {string}
*/
getMainText: function () {
return text( this.getMain() );
/**
* Get the extension (returns null if there was none)
- * @return {String|null} extension
+ * @return {string|null}
*/
getExtension: function () {
return this.ext;
/**
* Convenience method: return string like ".jpg", or "" if no extension
- * @return {String}
+ * @return {string}
*/
getDotExtension: function () {
return this.ext === null ? '' : '.' + this.ext;
/**
* Return the URL to this title
- * @return {String}
+ * @see mw.util#wikiGetlink
+ * @return {string}
*/
getUrl: function () {
return mw.util.wikiGetlink( this.toString() );
/**
* Whether this title exists on the wiki.
- * @return {mixed} Boolean true/false if the information is available. Otherwise null.
+ * @see #static-method-exists
+ * @return {boolean|null} If the information is available. Otherwise null.
*/
exists: function () {
return Title.exists( this );
/* Object constructors */
/**
- * Map
- *
* Creates an object that can be read from or written to from prototype functions
* that allow both single and multiple variables at once.
+ * @class mw.Map
*
- * @param global boolean Whether to store the values in the global window
+ * @constructor
+ * @param {boolean} global Whether to store the values in the global window
* object or a exclusively in the object property 'values'.
- * @return Map
*/
function Map( global ) {
this.values = global === true ? window : {};
* If selection was an array, returns an object of key/values (value is null if not found),
* If selection was not passed or invalid, will return the 'values' object member (be careful as
* objects are always passed by reference in JavaScript!).
- * @return Values as a string or object, null if invalid/inexistant.
+ * @return {string|Object|null} Values as a string or object, null if invalid/inexistant.
*/
get: function ( selection, fallback ) {
var results, i;
+ // If we only do this in the `return` block, it'll fail for the
+ // call to get() from the mutli-selection block.
+ fallback = arguments.length > 1 ? fallback : null;
if ( $.isArray( selection ) ) {
selection = slice.call( selection );
results = {};
- for ( i = 0; i < selection.length; i += 1 ) {
+ for ( i = 0; i < selection.length; i++ ) {
results[selection[i]] = this.get( selection[i], fallback );
}
return results;
}
if ( typeof selection === 'string' ) {
- if ( this.values[selection] === undefined ) {
- if ( fallback !== undefined ) {
- return fallback;
- }
- return null;
+ if ( !hasOwn.call( this.values, selection ) ) {
+ return fallback;
}
return this.values[selection];
}
}
return true;
}
- if ( typeof selection === 'string' && value !== undefined ) {
+ if ( typeof selection === 'string' && arguments.length > 1 ) {
this.values[selection] = value;
return true;
}
* Checks if one or multiple keys exist.
*
* @param selection {mixed} String key or array of keys to check
- * @return {Boolean} Existence of key(s)
+ * @return {boolean} Existence of key(s)
*/
exists: function ( selection ) {
var s;
if ( $.isArray( selection ) ) {
- for ( s = 0; s < selection.length; s += 1 ) {
- if ( this.values[selection[s]] === undefined ) {
+ for ( s = 0; s < selection.length; s++ ) {
+ if ( typeof selection[s] !== 'string' || !hasOwn.call( this.values, selection[s] ) ) {
return false;
}
}
return true;
}
- return this.values[selection] !== undefined;
+ return typeof selection === 'string' && hasOwn.call( this.values, selection );
}
};
/**
- * Message
- *
* Object constructor for messages,
* similar to the Message class in MediaWiki PHP.
+ * @class mw.Message
*
- * @param map Map Instance of mw.Map
- * @param key String
- * @param parameters Array
- * @return Message
+ * @constructor
+ * @param {mw.Map} map Message storage
+ * @param {string} key
+ * @param {Array} [parameters]
*/
function Message( map, key, parameters ) {
this.format = 'text';
/**
* Appends (does not replace) parameters for replacement to the .parameters property.
*
- * @param parameters Array
- * @return Message
+ * @param {Array} parameters
+ * @chainable
*/
params: function ( parameters ) {
var i;
/**
* Converts message object to it's string form based on the state of format.
*
- * @return string Message as a string in the current form or <key> if key does not exist.
+ * @return {string} Message as a string in the current form or `<key>` if key does not exist.
*/
toString: function () {
var text;
/**
* Checks if message exists
*
- * @return {string} String form of parsed message
+ * @see mw.Map#exists
+ * @return {boolean}
*/
exists: function () {
return this.map.exists( this.key );
}
};
+ /**
+ * @class mw
+ * @alternateClassName mediaWiki
+ * @singleton
+ */
return {
/* Public Members */
*/
log: function () { },
- /**
- * @var constructor Make the Map constructor publicly available.
- */
+ // Make the Map constructor publicly available.
Map: Map,
- /**
- * @var constructor Make the Message constructor publicly available.
- */
+ // Make the Message constructor publicly available.
Message: Message,
/**
* List of configuration values
*
* Dummy placeholder. Initiated in startUp module as a new instance of mw.Map().
- * If $wgLegacyJavaScriptGlobals is true, this Map will have its values
+ * If `$wgLegacyJavaScriptGlobals` is true, this Map will have its values
* in the global window object.
+ * @property
*/
config: null,
/**
- * @var object
- *
* Empty object that plugins can be installed in.
+ * @property
*/
libs: {},
/* Extension points */
+ /**
+ * @property
+ */
legacy: {},
/**
* Localization system
+ * @property {mw.Map}
*/
messages: new Map(),
/* Public Methods */
/**
- * Gets a message object, similar to wfMessage()
+ * Gets a message object, similar to wfMessage().
*
- * @param key string Key of message to get
- * @param parameter1 mixed First argument in a list of variadic arguments,
- * each a parameter for $N replacement in messages.
- * @return Message
+ * @param {string} key Key of message to get
+ * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+ * @return {mw.Message}
*/
- message: function ( key, parameter1 ) {
- var parameters;
- // Support variadic arguments
- if ( parameter1 !== undefined ) {
- parameters = slice.call( arguments );
- parameters.shift();
- } else {
- parameters = [];
- }
+ message: function ( key ) {
+ // Variadic arguments
+ var parameters = slice.call( arguments, 1 );
return new Message( mw.messages, key, parameters );
},
/**
* Gets a message string, similar to wfMessage()
*
- * @param key string Key of message to get
- * @param parameters mixed First argument in a list of variadic arguments,
- * each a parameter for $N replacement in messages.
- * @return String.
+ * @see mw.Message#toString
+ * @param {string} key Key of message to get
+ * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+ * @return {string}
*/
- msg: function ( /* key, parameter_1, parameter_2, .. */ ) {
+ msg: function ( /* key, parameters... */ ) {
return mw.message.apply( mw.message, arguments ).toString();
},
/**
* Client-side module loader which integrates with the MediaWiki ResourceLoader
+ * @class mw.loader
+ * @singleton
*/
loader: ( function () {
* mw.loader.implement.
*
* Format:
- * {
- * 'moduleName': {
- * 'version': ############## (unix timestamp),
- * 'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
- * 'group': 'somegroup', (or) null,
- * 'source': 'local', 'someforeignwiki', (or) null
- * 'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
- * 'script': ...,
- * 'style': ...,
- * 'messages': { 'key': 'value' },
- * }
- * }
+ * {
+ * 'moduleName': {
+ * 'version': ############## (unix timestamp),
+ * 'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
+ * 'group': 'somegroup', (or) null,
+ * 'source': 'local', 'someforeignwiki', (or) null
+ * 'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
+ * 'script': ...,
+ * 'style': ...,
+ * 'messages': { 'key': 'value' },
+ * }
+ * }
+ *
+ * @property
+ * @private
*/
var registry = {},
- /**
- * Mapping of sources, keyed by source-id, values are objects.
- * Format:
- * {
- * 'sourceId': {
- * 'loadScript': 'http://foo.bar/w/load.php'
- * }
- * }
- */
+ //
+ // Mapping of sources, keyed by source-id, values are objects.
+ // Format:
+ // {
+ // 'sourceId': {
+ // 'loadScript': 'http://foo.bar/w/load.php'
+ // }
+ // }
+ //
sources = {},
// List of modules which will be loaded as when ready
batch = [],
// List of callback functions waiting for modules to be ready to be called
jobs = [],
// Selector cache for the marker element. Use getMarker() to get/use the marker!
- $marker = null;
+ $marker = null,
+ // Buffer for addEmbeddedCSS.
+ cssBuffer = '';
/* Private methods */
/**
* Create a new style tag and add it to the DOM.
*
- * @param text String: CSS text
- * @param nextnode mixed: [optional] An Element or jQuery object for an element where
- * the style tag should be inserted before. Otherwise appended to the <head>.
- * @return HTMLStyleElement
+ * @private
+ * @param {string} text CSS text
+ * @param {Mixed} [nextnode] An Element or jQuery object for an element where
+ * the style tag should be inserted before. Otherwise appended to the `<head>`.
+ * @return {HTMLElement} Node reference to the created `<style>` tag.
*/
function addStyleTag( text, nextnode ) {
var s = document.createElement( 'style' );
}
/**
- * Checks if certain cssText is safe to append to
- * a stylesheet.
+ * Checks whether it is safe to add this css to a stylesheet.
*
- * Right now it only makes sure that cssText containing @import
- * rules will end up in a new stylesheet (as those only work when
- * placed at the start of a stylesheet; bug 35562).
- * This could later be extended to take care of other bugs, such as
- * the IE cssRules limit - not the same as the IE styleSheets limit).
+ * @private
+ * @param {string} cssText
+ * @return {boolean} False if a new one must be created.
*/
- function canExpandStylesheetWith( $style, cssText ) {
+ function canExpandStylesheetWith( cssText ) {
+ // Makes sure that cssText containing `@import`
+ // rules will end up in a new stylesheet (as those only work when
+ // placed at the start of a stylesheet; bug 35562).
return cssText.indexOf( '@import' ) === -1;
}
+ /**
+ * @param {string} [cssText=cssBuffer] If called without cssText,
+ * the internal buffer will be inserted instead.
+ */
function addEmbeddedCSS( cssText ) {
var $style, styleEl;
- $style = getMarker().prev();
- // Re-use <style> tags if possible, this to try to stay
- // under the IE stylesheet limit (bug 31676).
- // Also verify that the the element before Marker actually is one
- // that came from ResourceLoader, and not a style tag that some
- // other script inserted before our marker, or, more importantly,
- // it may not be a style tag at all (could be <meta> or <script>).
- if (
- $style.data( 'ResourceLoaderDynamicStyleTag' ) === true &&
- canExpandStylesheetWith( $style, cssText )
- ) {
- // There's already a dynamic <style> tag present and
- // canExpandStylesheetWith() gave a green light to append more to it.
- styleEl = $style.get( 0 );
- if ( styleEl.styleSheet ) {
- try {
- styleEl.styleSheet.cssText += cssText; // IE
- } catch ( e ) {
- log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
- }
- } else {
- styleEl.appendChild( document.createTextNode( String( cssText ) ) );
+
+ // Yield once before inserting the <style> tag. There are likely
+ // more calls coming up which we can combine this way.
+ // Appending a stylesheet and waiting for the browser to repaint
+ // is fairly expensive, this reduces it (bug 45810)
+ if ( cssText ) {
+ // Be careful not to extend the buffer with css that needs a new stylesheet
+ if ( !cssBuffer || canExpandStylesheetWith( cssText ) ) {
+ // Linebreak for somewhat distinguishable sections
+ // (the rl-cachekey comment separating each)
+ cssBuffer += '\n' + cssText;
+ // TODO: Use requestAnimationFrame in the future which will
+ // perform even better by not injecting styles while the browser
+ // is paiting.
+ setTimeout( addEmbeddedCSS );
+ return;
}
+
+ // This is a delayed call and we got a buffer still
+ } else if ( cssBuffer ) {
+ cssText = cssBuffer;
+ cssBuffer = '';
} else {
- $( addStyleTag( cssText, getMarker() ) )
- .data( 'ResourceLoaderDynamicStyleTag', true );
+ // This is a delayed call, but buffer is already cleared by
+ // another delayed call.
+ return;
}
+
+ // By default, always create a new <style>. Appending text
+ // to a <style> tag means the contents have to be re-parsed (bug 45810).
+ // Except, of course, in IE below 9, in there we default to
+ // re-using and appending to a <style> tag due to the
+ // IE stylesheet limit (bug 31676).
+ if ( 'documentMode' in document && document.documentMode <= 9 ) {
+
+ $style = getMarker().prev();
+ // Verify that the the element before Marker actually is a
+ // <style> tag and one that came from ResourceLoader
+ // (not some other style tag or even a `<meta>` or `<script>`).
+ if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+ // There's already a dynamic <style> tag present and
+ // canExpandStylesheetWith() gave a green light to append more to it.
+ styleEl = $style.get( 0 );
+ if ( styleEl.styleSheet ) {
+ try {
+ styleEl.styleSheet.cssText += cssText; // IE
+ } catch ( e ) {
+ log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
+ }
+ } else {
+ styleEl.appendChild( document.createTextNode( String( cssText ) ) );
+ }
+ return;
+ }
+ }
+
+ $( addStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
}
/**
* Generates an ISO8601 "basic" string from a UNIX timestamp
+ * @private
*/
function formatVersionNumber( timestamp ) {
var d = new Date();
/**
* Resolves dependencies and detects circular references.
*
- * @param module String Name of the top-level module whose dependencies shall be
+ * @private
+ * @param {string} module Name of the top-level module whose dependencies shall be
* resolved and sorted.
- * @param resolved Array Returns a topological sort of the given module and its
+ * @param {Array} resolved Returns a topological sort of the given module and its
* dependencies, such that later modules depend on earlier modules. The array
* contains the module names. If the array contains already some module names,
* this function appends its result to the pre-existing array.
- * @param unresolved Object [optional] Hash used to track the current dependency
+ * @param {Object} [unresolved] Hash used to track the current dependency
* chain; used to report loops in the dependency graph.
- * @throws Error if any unregistered module or a dependency loop is encountered
+ * @throws {Error} If any unregistered module or a dependency loop is encountered
*/
function sortDependencies( module, resolved, unresolved ) {
var n, deps, len;
* Gets a list of module names that a module depends on in their proper dependency
* order.
*
- * @param module string module name or array of string module names
- * @return list of dependencies, including 'module'.
- * @throws Error if circular reference is detected
+ * @private
+ * @param {string} module Module name or array of string module names
+ * @return {Array} list of dependencies, including 'module'.
+ * @throws {Error} If circular reference is detected
*/
function resolve( module ) {
var m, resolved;
* One can also filter for 'unregistered', which will return the
* modules names that don't have a registry entry.
*
- * @param states string or array of strings of module states to filter by
- * @param modules array list of module names to filter (optional, by default the entire
+ * @private
+ * @param {string|string[]} states Module states to filter by
+ * @param {Array} modules List of module names to filter (optional, by default the entire
* registry is used)
- * @return array list of filtered module names
+ * @return {Array} List of filtered module names
*/
function filter( states, modules ) {
var list, module, s, m;
* Determine whether all dependencies are in state 'ready', which means we may
* execute the module or job now.
*
- * @param dependencies Array dependencies (module names) to be checked.
- *
- * @return Boolean true if all dependencies are in state 'ready', false otherwise
+ * @private
+ * @param {Array} dependencies Dependencies (module names) to be checked.
+ * @return {boolean} True if all dependencies are in state 'ready', false otherwise
*/
function allReady( dependencies ) {
return filter( 'ready', dependencies ).length === dependencies.length;
* Gets console references in each invocation, so that delayed debugging tools work
* fine. No need for optimization here, which would only result in losing logs.
*
- * @param msg String text for the log entry.
- * @param e Error [optional] to also log.
+ * @private
+ * @param {string} msg text for the log entry.
+ * @param {Error} [e]
*/
function log( msg, e ) {
var console = window.console;
* state up the dependency tree; otherwise, execute all jobs/modules that now have all their
* dependencies satisfied. On jobs depending on a failed module, run the error callback, if any.
*
- * @param module String name of module that entered one of the states 'ready', 'error', or 'missing'.
+ * @private
+ * @param {string} module Name of module that entered one of the states 'ready', 'error', or 'missing'.
*/
function handlePending( module ) {
var j, job, hasErrors, m, stateChange;
* Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
* depending on whether document-ready has occurred yet and whether we are in async mode.
*
- * @param src String: URL to script, will be used as the src attribute in the script tag
- * @param callback Function: Optional callback which will be run when the script is done
+ * @private
+ * @param {string} src URL to script, will be used as the src attribute in the script tag
+ * @param {Function} [callback] Callback which will be run when the script is done
*/
function addScript( src, callback, async ) {
/*jshint evil:true */
/**
* Executes a loaded module, making it ready to use
*
- * @param module string module name to execute
+ * @private
+ * @param {string} module Module name to execute
*/
function execute( module ) {
var key, value, media, i, urls, script, markModuleReady, nestedAddScript;
/**
* Define loop-function here for efficiency
* and to avoid re-using badly scoped variables.
+ * @ignore
*/
function addLink( media, url ) {
var el = document.createElement( 'link' );
* Adds a dependencies to the queue with optional callbacks to be run
* when the dependencies are ready or fail
*
- * @param dependencies string module name or array of string module names
- * @param ready function callback to execute when all dependencies are ready
- * @param error function callback to execute when any dependency fails
- * @param async (optional) If true, load modules asynchronously even if
- * document ready has not yet occurred
+ * @private
+ * @param {string|string[]} dependencies Module name or array of string module names
+ * @param {Function} [ready] Callback to execute when all dependencies are ready
+ * @param {Function} [error] Callback to execute when any dependency fails
+ * @param {boolean} [async] If true, load modules asynchronously even if
+ * document ready has not yet occurred.
*/
function request( dependencies, ready, error, async ) {
var n;
/**
* Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
* to a query string of the form foo.bar,baz|bar.baz,quux
+ * @private
*/
function buildModulesString( moduleMap ) {
var arr = [], p, prefix;
/**
* Asynchronously append a script tag to the end of the body
* that invokes load.php
- * @param moduleMap {Object}: Module map, see buildModulesString()
- * @param currReqBase {Object}: Object with other parameters (other than 'modules') to use in the request
- * @param sourceLoadScript {String}: URL of load.php
- * @param async {Boolean}: If true, use an asynchrounous request even if document ready has not yet occurred
+ * @private
+ * @param {Object} moduleMap Module map, see #buildModulesString
+ * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
+ * @param {string} sourceLoadScript URL of load.php
+ * @param {boolean} async If true, use an asynchrounous request even if document ready has not yet occurred
*/
function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
var request = $.extend(
/**
* Register a source.
*
- * @param id {String}: Short lowercase a-Z string representing a source, only used internally.
- * @param props {Object}: Object containing only the loadScript property which is a url to
- * the load.php location of the source.
- * @return {Boolean}
+ * @param {string} id Short lowercase a-Z string representing a source, only used internally.
+ * @param {Object} props Object containing only the loadScript property which is a url to
+ * the load.php location of the source.
+ * @return {boolean}
*/
addSource: function ( id, props ) {
var source;
*
* All arguments are required.
*
- * @param {String} module Name of module
+ * @param {string} module Name of module
* @param {Function|Array} script Function with module code or Array of URLs to
- * be used as the src attribute of a new <script> tag.
+ * be used as the src attribute of a new `<script>` tag.
* @param {Object} style Should follow one of the following patterns:
- * { "css": [css, ..] }
- * { "url": { <media>: [url, ..] } }
- * And for backwards compatibility (needs to be supported forever due to caching):
- * { <media>: css }
- * { <media>: [url, ..] }
+ * { "css": [css, ..] }
+ * { "url": { <media>: [url, ..] } }
+ * And for backwards compatibility (needs to be supported forever due to caching):
+ * { <media>: css }
+ * { <media>: [url, ..] }
*
- * The reason css strings are not concatenated anymore is bug 31676. We now check
- * whether it's safe to extend the stylesheet (see canExpandStylesheetWith).
+ * The reason css strings are not concatenated anymore is bug 31676. We now check
+ * whether it's safe to extend the stylesheet (see #canExpandStylesheetWith).
*
- * @param {Object} msgs List of key/value pairs to be passed through mw.messages.set
+ * @param {Object} msgs List of key/value pairs to be added to {@link mw#messages}.
*/
implement: function ( module, script, style, msgs ) {
// Validate input
return;
}
// Since some modules are not yet ready, queue up a request.
- request( filtered, null, null, async );
+ request( filtered, undefined, undefined, async );
},
/**
};
}() ),
- /** HTML construction helper functions */
+ /**
+ * HTML construction helper functions
+ * @class mw.html
+ * @singleton
+ */
html: ( function () {
function escapeCallback( s ) {
switch ( s ) {
return {
/**
* Escape a string for HTML. Converts special characters to HTML entities.
- * @param s The string to escape
+ * @param {string} s The string to escape
*/
escape: function ( s ) {
return s.replace( /['"<>&]/g, escapeCallback );
/**
* Wrapper object for raw HTML passed to mw.html.element().
- * @constructor
+ * @class mw.html.Raw
*/
Raw: function ( value ) {
this.value = value;
/**
* Wrapper object for CDATA element contents passed to mw.html.element()
- * @constructor
+ * @class mw.html.Cdata
*/
Cdata: function ( value ) {
this.value = value;
':' + ( d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() ) +
'.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) ),
$log = $( '#mw-log-console' );
-
+
if ( !$log.length ) {
$log = $( '<div id="mw-log-console"></div>' ).css( {
overflow: 'auto',
-/**
- * Implements mediaWiki.notification library
- */
( function ( mw, $ ) {
'use strict';
var notification,
isPageReady = false,
- isInitialized = false,
preReadyNotifQueue = [],
- /**
- * @var {jQuery}
- * The #mw-notification-area div that all notifications are contained inside.
- */
+ // The #mw-notification-area div that all notifications are contained inside.
$area = null;
/**
* Creates a Notification object for 1 message.
- * Does not insert anything into the document (see .start()).
+ * Does not insert anything into the document (see #start).
+ *
+ * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304)
+ * It is not part of the actual class name.
+ *
+ * @class mw.Notification_
+ * @alternateClassName mw.Notification
+ * @private
*
* @constructor
- * @see mw.notification.notify
*/
function Notification( message, options ) {
var $notification, $notificationTitle, $notificationContent;
*
* @param {Object} options An object containing options for the closing of the notification.
* These are typically only used internally.
+ *
* - speed: Use a close speed different than the default 'slow'.
* - placeholder: Set to false to disable the placeholder transition.
*/
/**
* Helper function, take a list of notification divs and call
- * a function on the Notification instance attached to them
+ * a function on the Notification instance attached to them.
*
* @param {jQuery} $notifications A jQuery object containing notification divs
* @param {string} fn The name of the function to call on the Notification instance
}
/**
- * Initialisation
- * (don't call before document ready)
+ * Initialisation.
+ * Must only be called once, and not before the document is ready.
+ * @ignore
*/
function init() {
- if ( !isInitialized ) {
- isInitialized = true;
- $area = $( '<div id="mw-notification-area"></div>' )
- // Pause auto-hide timers when the mouse is in the notification area.
- .on( {
- mouseenter: notification.pause,
- mouseleave: notification.resume
- } )
- // When clicking on a notification close it.
- .on( 'click', '.mw-notification', function () {
- var notif = $( this ).data( 'mw.notification' );
- if ( notif ) {
- notif.close();
- }
- } )
- // Stop click events from <a> tags from propogating to prevent clicking.
- // on links from hiding a notification.
- .on( 'click', 'a', function ( e ) {
- e.stopPropagation();
- } );
-
- // Prepend the notification area to the content area and save it's object.
- mw.util.$content.prepend( $area );
- }
+ $area = $( '<div id="mw-notification-area"></div>' )
+ // Pause auto-hide timers when the mouse is in the notification area.
+ .on( {
+ mouseenter: notification.pause,
+ mouseleave: notification.resume
+ } )
+ // When clicking on a notification close it.
+ .on( 'click', '.mw-notification', function () {
+ var notif = $( this ).data( 'mw.notification' );
+ if ( notif ) {
+ notif.close();
+ }
+ } )
+ // Stop click events from <a> tags from propogating to prevent clicking.
+ // on links from hiding a notification.
+ .on( 'click', 'a', function ( e ) {
+ e.stopPropagation();
+ } );
+
+ // Prepend the notification area to the content area and save it's object.
+ mw.util.$content.prepend( $area );
}
+ /**
+ * @class mw.notification
+ * @singleton
+ */
notification = {
/**
* Pause auto-hide timers for all notifications.
* Notifications will not auto-hide until resume is called.
+ * @see mw.Notification#pause
*/
pause: function () {
callEachNotification(
/**
* Resume any paused auto-hide timers from the beginning.
- * Only the first {autoHideLimit} timers will be resumed.
+ * Only the first #autoHideLimit timers will be resumed.
*/
resume: function () {
callEachNotification(
- // Only call resume on the first {autoHideLimit} notifications.
- // Exclude noautohide notifications to avoid bugs where {autoHideLimit}
- // { autoHide: false } notifications are at the start preventing any
+ // Only call resume on the first #autoHideLimit notifications.
+ // Exclude noautohide notifications to avoid bugs where #autoHideLimit
+ // `{ autoHide: false }` notifications are at the start preventing any
// auto-hide notifications from being autohidden.
$area.children( '.mw-notification-autohide' ).slice( 0, notification.autoHideLimit ),
'resume'
/**
* Display a notification message to the user.
*
- * @param {mixed} message The DOM-element, jQuery object, mw.Message instance,
- * or plaintext string to be used as the message.
+ * @param {HTMLElement|jQuery|mw.Message|string} message
* @param {Object} options The options to use for the notification.
- * See mw.notification.defaults for details.
+ * See #defaults for details.
*/
notify: function ( message, options ) {
var notif;
},
/**
- * @var {Object}
- * The defaults for mw.notification.notify's options parameter
- * autoHide:
- * A boolean indicating whether the notifification should automatically
- * be hidden after shown. Or if it should persist.
+ * @property {Object}
+ * The defaults for #notify options parameter.
+ *
+ * - autoHide:
+ * A boolean indicating whether the notifification should automatically
+ * be hidden after shown. Or if it should persist.
*
- * tag:
- * An optional string. When a notification is tagged only one message
- * with that tag will be displayed. Trying to display a new notification
- * with the same tag as one already being displayed will cause the other
- * notification to be closed and this new notification to open up inside
- * the same place as the previous notification.
+ * - tag:
+ * An optional string. When a notification is tagged only one message
+ * with that tag will be displayed. Trying to display a new notification
+ * with the same tag as one already being displayed will cause the other
+ * notification to be closed and this new notification to open up inside
+ * the same place as the previous notification.
*
- * title:
- * An optional title for the notification. Will be displayed above the
- * content. Usually in bold.
+ * - title:
+ * An optional title for the notification. Will be displayed above the
+ * content. Usually in bold.
*/
defaults: {
autoHide: true,
},
/**
- * @var {number}
+ * @property {number}
* Number of seconds to wait before auto-hiding notifications.
*/
autoHideSeconds: 5,
/**
- * @var {number}
+ * @property {number}
* Maximum number of notifications to count down auto-hide timers for.
- * Only the first {autoHideLimit} notifications being displayed will
+ * Only the first #autoHideLimit notifications being displayed will
* auto-hide. Any notifications further down in the list will only start
* counting down to auto-hide after the first few messages have closed.
*
* This basically represents the number of notifications the user should
- * be able to process in {autoHideSeconds} time.
+ * be able to process in #autoHideSeconds time.
*/
autoHideLimit: 3
};
/**
- * Implements mediaWiki.notify function
+ * @class mw.plugin.notify
*/
( function ( mw ) {
'use strict';
/**
- * @see mw.notification.notify
+ * @see mw.notification#notify
+ * @param message
+ * @param options
*/
mw.notify = function ( message, options ) {
// Don't bother loading the whole notification system if we never use it.
} );
};
-}( mediaWiki ) );
\ No newline at end of file
+ /**
+ * @class mw
+ * @mixins mw.plugin.notify
+ */
+
+}( mediaWiki ) );
return this.getName();
};
+ /**
+ * Get date user registered, if available.
+ *
+ * @return {Date|false|null} date user registered, or false for anonymous users, or
+ * null when data is not available
+ */
+ this.getRegistration = function () {
+ var registration = mw.config.get( 'wgUserRegistration' );
+ if ( this.isAnon() ) {
+ return false;
+ } else if ( registration === null ) {
+ // Information may not be available if they signed up before
+ // MW began storing this.
+ return null;
+ } else {
+ return new Date( registration );
+ }
+ };
+
/**
* Checks if the current user is anonymous.
*
-/**
- * Implements mediaWiki.util library
- */
( function ( mw, $ ) {
'use strict';
- // Local cache and alias
+ /**
+ * Utility library
+ * @class mw.util
+ * @singleton
+ */
var util = {
/**
/**
* Encode the string like PHP's rawurlencode
*
- * @param str string String to be encoded
+ * @param {string} str String to be encoded.
*/
rawurlencode: function ( str ) {
str = String( str );
* We want / and : to be included as literal characters in our title URLs
* as they otherwise fatally break the title
*
- * @param str string String to be encoded
+ * @param {string} str String to be encoded.
*/
wikiUrlencode: function ( str ) {
return util.rawurlencode( str )
},
/**
- * Get the link to a page name (relative to wgServer)
+ * Get the link to a page name (relative to `wgServer`),
*
- * @param str String: Page name to get the link for.
- * @return String: Location for a page with name of 'str' or boolean false on error.
+ * @param {string} str Page name to get the link for.
+ * @return {string} Location for a page with name of `str` or boolean false on error.
*/
wikiGetlink: function ( str ) {
return mw.config.get( 'wgArticlePath' ).replace( '$1',
/**
* Get address to a script in the wiki root.
- * For index.php use mw.config.get( 'wgScript' )
+ * For index.php use `mw.config.get( 'wgScript' )`.
*
* @since 1.18
* @param str string Name of script (eg. 'api'), defaults to 'index'
/**
* Append a new style block to the head and return the CSSStyleSheet object.
- * Use .ownerNode to access the <style> element, or use mw.loader.addStyleTag.
+ * Use .ownerNode to access the `<style>` element, or use mw.loader#addStyleTag.
* This function returns the styleSheet object for convience (due to cross-browsers
* difference as to where it is located).
- * @example
- * <code>
- * var sheet = mw.util.addCSS('.foobar { display: none; }');
- * $(foo).click(function () {
- * // Toggle the sheet on and off
- * sheet.disabled = !sheet.disabled;
- * });
- * </code>
*
- * @param text string CSS to be appended
- * @return CSSStyleSheet (use .ownerNode to get to the <style> element)
+ * var sheet = mw.util.addCSS('.foobar { display: none; }');
+ * $(foo).click(function () {
+ * // Toggle the sheet on and off
+ * sheet.disabled = !sheet.disabled;
+ * });
+ *
+ * @param {string} text CSS to be appended
+ * @return {CSSStyleSheet} Use .ownerNode to get to the `<style>` element.
*/
addCSS: function ( text ) {
var s = mw.loader.addStyleTag( text );
/**
* Hide/show the table of contents element
*
- * @param $toggleLink jQuery A jQuery object of the toggle link.
- * @param callback function Function to be called after the toggle is
- * completed (including the animation) (optional)
- * @return mixed Boolean visibility of the toc (true if it's visible)
+ * @param {jQuery} $toggleLink A jQuery object of the toggle link.
+ * @param {Function} [callback] Function to be called after the toggle is
+ * completed (including the animation).
+ * @return {Mixed} Boolean visibility of the toc (true if it's visible)
* or Null if there was no table of contents.
*/
toggleToc: function ( $toggleLink, callback ) {
* Grab the URL parameter value for the given parameter.
* Returns null if not found.
*
- * @param param string The parameter name.
- * @param url string URL to search through (optional)
- * @return mixed Parameter value or null.
+ * @param {string} param The parameter name.
+ * @param {string} [url] URL to search through.
+ * @return {Mixed} Parameter value or null.
*/
getParamValue: function ( param, url ) {
if ( url === undefined ) {
},
/**
- * @var string
+ * @property {string}
* Access key prefix. Will be re-defined based on browser/operating system
- * detection in mw.util.init().
+ * detection in mw.util#init.
*/
tooltipAccessKeyPrefix: 'alt-',
/**
- * @var RegExp
+ * @property {RegExp}
* Regex to match accesskey tooltips.
*/
tooltipAccessKeyRegexp: /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
* otherwise, all the nodes that will probably have accesskeys by
* default are updated.
*
- * @param $nodes {Array|jQuery} [optional] A jQuery object, or array
- * of elements to update.
+ * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
*/
updateTooltipAccessKeys: function ( $nodes ) {
if ( !$nodes ) {
},
/*
- * @var jQuery
- * A jQuery object that refers to the content area element
- * Populated by init().
+ * @property {jQuery}
+ * A jQuery object that refers to the content area element.
+ * Populated by #init.
*/
$content: null,
*
* By default the new link will be added to the end of the list. To
* add the link before a given existing item, pass the DOM node
- * (document.getElementById( 'foobar' )) or the jQuery-selector
- * ( '#foobar' ) of that item.
+ * (e.g. `document.getElementById( 'foobar' )`) or a jQuery-selector
+ * (e.g. `'#foobar'`) for that item.
*
- * @example mw.util.addPortletLink(
- * 'p-tb', 'http://mediawiki.org/',
- * 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print'
- * )
+ * mw.util.addPortletLink(
+ * 'p-tb', 'http://mediawiki.org/',
+ * 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print'
+ * );
*
- * @param portlet string ID of the target portlet ( 'p-cactions' or 'p-personal' etc.)
- * @param href string Link URL
- * @param text string Link text
- * @param id string ID of the new item, should be unique and preferably have
- * the appropriate prefix ( 'ca-', 'pt-', 'n-' or 't-' )
- * @param tooltip string Text to show when hovering over the link, without accesskey suffix
- * @param accesskey string Access key to activate this link (one character, try
- * to avoid conflicts. Use $( '[accesskey=x]' ).get() in the console to
- * see if 'x' is already used.
- * @param nextnode mixed DOM Node or jQuery-selector string of the item that the new
- * item should be added before, should be another item in the same
- * list, it will be ignored otherwise
+ * @param {string} portlet ID of the target portlet ( 'p-cactions' or 'p-personal' etc.)
+ * @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} [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
+ * 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 mixed The DOM Node of the added item (a ListItem or Anchor element,
+ * @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.
*/
addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
// If the jQuery selector isn't found within the <ul>,
// or if nextnode was invalid or not passed at all,
- // then just append it at the end of the <ul> (this is the default behaviour)
+ // then just append it at the end of the <ul> (this is the default behavior)
} else {
$ul.append( $item );
}
* something, replacing any previous message.
* Calling with no arguments, with an empty string or null will hide the message
*
- * @param message {mixed} The DOM-element, jQuery object or HTML-string to be put inside the message box.
+ * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
* to allow CSS/JS to hide different boxes. null = no class used.
- * @depreceated Use mw.notify
+ * @deprecated Use mw#notify
*/
jsMessage: function ( message ) {
if ( !arguments.length || message === '' || message === null ) {
* according to HTML5 specification. Please note the specification
* does not validate a domain with one character.
*
- * @todo FIXME: should be moved to or replaced by a JavaScript validation module.
+ * FIXME: should be moved to or replaced by a validation module.
*
- * @param mailtxt string E-mail address to be validated.
- * @return mixed Null if mailtxt was an empty string, otherwise true/false
- * is determined by validation.
+ * @param {string} mailtxt E-mail address to be validated.
+ * @return {boolean|null} Null if `mailtxt` was an empty string, otherwise true/false
+ * as determined by validation.
*/
validateEmail: function ( mailtxt ) {
var rfc5322Atext, rfc1034LdhStr, html5EmailRegexp;
return null;
}
- /**
- * HTML5 defines a string as valid e-mail address if it matches
- * the ABNF:
- * 1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
- * With:
- * - atext : defined in RFC 5322 section 3.2.3
- * - ldh-str : defined in RFC 1034 section 3.5
- *
- * (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68):
- */
-
- /**
- * First, define the RFC 5322 'atext' which is pretty easy:
- * atext = ALPHA / DIGIT / ; Printable US-ASCII
- "!" / "#" / ; characters not including
- "$" / "%" / ; specials. Used for atoms.
- "&" / "'" /
- "*" / "+" /
- "-" / "/" /
- "=" / "?" /
- "^" / "_" /
- "`" / "{" /
- "|" / "}" /
- "~"
- */
+ // HTML5 defines a string as valid e-mail address if it matches
+ // the ABNF:
+ // 1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
+ // With:
+ // - atext : defined in RFC 5322 section 3.2.3
+ // - ldh-str : defined in RFC 1034 section 3.5
+ //
+ // (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68)
+ // First, define the RFC 5322 'atext' which is pretty easy:
+ // atext = ALPHA / DIGIT / ; Printable US-ASCII
+ // "!" / "#" / ; characters not including
+ // "$" / "%" / ; specials. Used for atoms.
+ // "&" / "'" /
+ // "*" / "+" /
+ // "-" / "/" /
+ // "=" / "?" /
+ // "^" / "_" /
+ // "`" / "{" /
+ // "|" / "}" /
+ // "~"
rfc5322Atext = 'a-z0-9!#$%&\'*+\\-/=?^_`{|}~';
- /**
- * Next define the RFC 1034 'ldh-str'
- * <domain> ::= <subdomain> | " "
- * <subdomain> ::= <label> | <subdomain> "." <label>
- * <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
- * <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
- * <let-dig-hyp> ::= <let-dig> | "-"
- * <let-dig> ::= <letter> | <digit>
- */
+ // Next define the RFC 1034 'ldh-str'
+ // <domain> ::= <subdomain> | " "
+ // <subdomain> ::= <label> | <subdomain> "." <label>
+ // <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
+ // <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
+ // <let-dig-hyp> ::= <let-dig> | "-"
+ // <let-dig> ::= <letter> | <digit>
rfc1034LdhStr = 'a-z0-9\\-';
html5EmailRegexp = new RegExp(
/**
* Note: borrows from IP::isIPv4
*
- * @param address string
- * @param allowBlock boolean
- * @return boolean
+ * @param {string} address
+ * @param {boolean} allowBlock
+ * @return {boolean}
*/
isIPv4Address: function ( address, allowBlock ) {
if ( typeof address !== 'string' ) {
/**
* Note: borrows from IP::isIPv6
*
- * @param address string
- * @param allowBlock boolean
- * @return boolean
+ * @param {string} address
+ * @param {boolean} allowBlock
+ * @return {boolean}
*/
isIPv6Address: function ( address, allowBlock ) {
if ( typeof address !== 'string' ) {
"/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
);
- $out->addModuleScripts( 'skins.vector' );
+ $out->addModules( 'skins.vector.js' );
}
/**
<!-- jumpto -->
<div id="jump-to-nav" class="mw-jump">
<?php $this->msg( 'jumpto' ) ?>
- <a href="#mw-head"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
+ <a href="#mw-navigation"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
<a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
</div>
<!-- /jumpto -->
pre, code, tt, kbd, samp, .mw-code {
/*
* Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
- * Specifying any valid, second value will trigger correct behaviour without forcing a different font.
+ * Specifying any valid, second value will trigger correct behavior without forcing a different font.
*/
font-family: monospace, Courier;
}
.prefsection table {
width: 100%;
}
+.prefsection table.mw-htmlform-matrix {
+ width: auto;
+}
td.mw-submit {
white-space: nowrap;
}
white-space: nowrap;
}
+.mw-htmlform-matrix td {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+
input#wpSummary {
width: 80%;
margin-bottom: 1em;
-#!/usr/bin/php
+#!/usr/bin/env php
<?php
/**
* @file
* @ingroup Maintenance
- * @copyright Copyright © Wikimedia Deuschland, 2009
+ * @copyright Copyright © Wikimedia Deuschland, 2009
* @author Hallo Welt! Medienwerkstatt GmbH
* @author Markus Glaser, Dan Nessett, Priyanka Dhanda
* initial idea by Daniel Kinzler
* http://www.gnu.org/copyleft/gpl.html
*/
-$IP = dirname( __DIR__ );
+if ( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
define( 'SELENIUMTEST', true );
-//require_once( __DIR__ . '/../maintenance/commandLine.inc' );
require( __DIR__ . '/../maintenance/Maintenance.php' );
require_once( 'PHPUnit/Runner/Version.php' );
# PHPUnit 3.5.0 introduced a nice autoloader based on class name
require_once( 'PHPUnit/Autoload.php' );
} else {
- # Keep the old pre PHPUnit 3.5.0 behaviour for compatibility
+ # Keep the old pre PHPUnit 3.5.0 behavior for compatibility
require_once( 'PHPUnit/TextUI/Command.php' );
}
}
$this->runDisabled = isset( $options['run-disabled'] );
+ $this->runParsoid = isset( $options['run-parsoid'] );
$this->hooks = array();
$this->functionHooks = array();
* Remove last character if it is a newline
* @group utility
*/
- static public function chomp( $s ) {
+ public static function chomp( $s ) {
if ( substr( $s, -1 ) === "\n" ) {
return substr( $s, 0, -1 );
} else {
self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
$settings = array(
- 'wgServer' => 'http://Britney-Spears',
+ 'wgServer' => 'http://example.org',
'wgScript' => '/index.php',
'wgScriptPath' => '/',
'wgArticlePath' => '/wiki/$1',
* @param $line Integer: the input line number, for reporting errors
* @param $ignoreDuplicate Boolean: whether to silently ignore duplicate pages
*/
- static public function addArticle( $name, $text, $line = 'unknown', $ignoreDuplicate = '' ) {
+ public static function addArticle( $name, $text, $line = 'unknown', $ignoreDuplicate = '' ) {
global $wgCapitalLinks;
$oldCapitalLinks = $wgCapitalLinks;
# language=XXX set content language to XXX for this test
# variant=XXX set the variant of language for this test (eg zh-tw)
# disabled do not run test
+# parsoid parsoid-only test (not run by PHP parser)
+# php php-only test (not run by the parsoid parser)
# showtitle make the first line the title
# comment run through Linker::formatComment() instead of main parser
# local format section links in edit comment text as local links
</p>
!! end
+!! test
+Parsing an URL
+!! input
+http://fr.wikipedia.org/wiki/🍺
+<!-- EasterEgg we love beer, better be able be able to link to it -->
+!! result
+<p><a rel="nofollow" class="external free" href="http://fr.wikipedia.org/wiki/🍺">http://fr.wikipedia.org/wiki/🍺</a>
+</p>
+!! end
+
!! test
Simple list
!! input
!!end
-
!! test
Italics and bold: other quote tests: (3,(2,2),3)
!! input
</p>
!!end
+
+!! test
+Italicized possessive
+!! input
+The ''[[Main Page]]'''s talk page.
+!! result
+<p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page.
+</p>
+!! end
+
###
### <nowiki> test cases
###
!! test
Definition Lists: Nesting: Multi-level (Parsoid only)
!! options
-disabled
+parsoid
!! input
;t1 :d1
;;t2 ::d2
!! test
Definition Lists: Nesting: Test 2 (Parsoid only)
!! options
-disabled
+parsoid
!! input
;t1
::d2
!! test
Definition Lists: Nesting: Test 3 (Parsoid only)
!! options
-disabled
+parsoid
!! input
:;t1
::::d2
</p>
!! end
+!! test
+External links: link text with spaces
+!! input
+[http://www.example.com a b c]
+[http://www.example.com ''a'' ''b'']
+!! result
+<p><a rel="nofollow" class="external text" href="http://www.example.com">a b c</a>
+<a rel="nofollow" class="external text" href="http://www.example.com"><i>a</i> <i>b</i></a>
+</p>
+!! end
+
!! test
External links: wiki links within external link (Bug 3695)
!! input
[{{echo|foo}} ''bar'']
[{{echo|foo}}l's] errand
[{{echo|foo}}l's errand]
+[url={{echo|foo}}]
+[url=http://example.com]
!! result
<p>[foo]
[foo bar]
[foo <i>bar</i>]
[fool's] errand
[fool's errand]
+[url=foo]
+[url=<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>]
</p>
!! end
List embedded in a non-block tag
(Ugly Parsoid output -- worth fixing; Disabled for PHP parser since it relies on Tidy)
!! options
-disabled
+parsoid
!!input
<small>
* foo
!! input
{{SERVER}}
!! result
-<p><a rel="nofollow" class="external free" href="http://Britney-Spears">http://Britney-Spears</a>
+<p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
</p>
!! end
!! input
{{SERVERNAME}}
!! result
-<p>Britney-Spears
+<p>example.org
</p>
!! end
!!end
!!test
-Templates: Wiki Tables: 1. Fostering of entire template content
+Templates: Wiki Tables: 1a. Fostering of entire template content
!!input
{|
{{echo|a}}
!!end
+!!test
+Templates: Wiki Tables: 1b. Fostering of entire template content
+!!input
+{|
+{{echo|<div>}}
+foo
+{{echo|</div>}}
+|}
+!!result
+<table>
+<div>
+<p>foo
+</p>
+</div>
+<tr><td></td></tr></table>
+
+!!end
+
!!test
Templates: Wiki Tables: 2. Fostering of partial template content
!!input
!!end
!!test
-Templates: Wiki Tables: 4. Templated tags, regular td-tags
+Templates: Wiki Tables: 5. Templated tags, regular td-tags
!!input
{{tbl-start}}
|foo
!!end
!!test
-Templates: Wiki Tables: 4. Templated tags, templated td-tags
+Templates: Wiki Tables: 6. Templated tags, templated td-tags
!!input
{{tbl-start}}
{{!}}foo
Templates: Ugly templates: 1. Navbox template parses badly leading to table misnesting
(Parsoid-centric)
!! options
-disabled
+parsoid
!!input
{|
|{{echo|foo</table>}}
Templates: Ugly templates: 2. Navbox template parses badly leading to table misnesting
(Parsoid-centric)
!! options
-disabled
+parsoid
!!input
<table>
<tr>
</p>
!!end
+!!test
+Parsoid: Image caption containing leading space
+(The leading space should not trigger nowiki escaping in wt2wt mode)
+!! input
+[[Image:Foobar.jpg|thumb| bar]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>bar</div></div></div>
+
+!!end
!! test
Bug 3090: External links other than http: in image captions
</p>
!! end
+!! test
+Localized image handling (1).
+!! options
+language=es
+!! input
+[[Archivo:Foobar.jpg|izquierda|enlace=foo|caption]]
+!! result
+<div class="floatleft"><a href="/wiki/Foo" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! end
+
+!! test
+Localized image handling (2).
+!! options
+language=es
+!! input
+[[Archivo:Foobar.jpg|miniatura|izquierda|enlace=foo|caption]]
+!! result
+<div class="thumb tleft"><div class="thumbinner" style="width:182px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+
+!! end
+
+!! test
+"border", "frameless" and "class" attributes on an image.
+!! input
+[[File:Foobar.jpg|frameless|border|class=extra|caption]]
+!! result
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="extra thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
+</p>
+!! end
+
!! article
File:Barfoo.jpg
!! text
!!end
!! test
-Short headings with trailing space should match behaviour of Parser::doHeadings (bug 19910)
+Short headings with trailing space should match behavior of Parser::doHeadings (bug 19910)
!! input
===
The line above must have a trailing space!
<meta http-equiv="refresh" content="5">
<meta itemprop="hello" content="5" />
</p>
- <link itemprop="hello" href="http://Britney-Spears" />
- <link rel="stylesheet" href="<a rel="nofollow" class="external free" href="http://Britney-Spears">http://Britney-Spears</a>">
- <link itemprop="hello" href="http://Britney-Spears" />
+ <link itemprop="hello" href="http://example.org" />
+ <link rel="stylesheet" href="<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>">
+ <link itemprop="hello" href="http://example.org" />
</div>
!! end
==marked==
!!end
-# Test behaviour of bug 19910
+# Test behavior of bug 19910
!! test
Sectiion with all-equals
!! options
</p>
!! end
+!! test
+Check noCommafy in formatNum
+!! options
+language=be-tarask
+!! input
+{{formatnum:123456.78}}
+{{formatnum:123456.78|NOSEP}}
+!! result
+<p>123 456,78
+123456.78
+</p>
+!! end
+
!! test
Strip marker in grammar
!! options
!! test
Parsoid-only: HTML tag with broken attribute value quoting
!! options
-disabled
+parsoid
!! input
<span title="Hello world>Foo</span>
!! result
!! test
Parsoid-only: Table with broken attribute value quoting on consecutive lines
!! options
-disabled
+parsoid
!! input
{|
| title="Hello world|Foo
<table>
<tr>
<td title="Hello world">Foo
-</td><td style="color: red;">Bar
+</td><td style="color: red">Bar
</td></tr></table>
!! end
!!end
+!!test
+Empty table rows go away
+!!input
+{|
+| Hello
+| there
+|- class="foo"
+|-
+|}
+!! result
+<table>
+<tr>
+<td> Hello
+</td>
+<td> there
+</td></tr>
+
+</table>
+
+!! end
+
TODO:
more images
more tables
* @ingroup Testing
*/
-$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled' );
+$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled', 'run-parsoid' );
$optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
require_once( __DIR__ . '/../maintenance/commandLine.inc' );
--seed <n> Start the fuzz test from the specified seed
--help Show this help message
--run-disabled run disabled tests
+ --run-parsoid run parsoid tests (normally disabled)
ENDS;
exit( 0 );
'file=' => false,
'use-filebackend=' => false,
'use-bagostuff=' => false,
+ 'use-jobqueue=' => false,
'keep-uploads' => false,
'use-normal-tables' => false,
'reuse-db' => false,
$testClassRegex = implode( '|', array(
'ApiFormatTestBase',
'ApiTestCase',
+ 'ApiQueryTestBase',
+ 'ApiQueryContinueTestBase',
'MediaWikiLangTestCase',
'MediaWikiTestCase',
'PHPUnit_Framework_TestCase',
<?php
$result = array (
- 'xmp-exif' =>
- array (
- 'CameraOwnerName' => 'Me!',
- ),
- 'xmp-general' =>
- array (
- 'LicenseUrl' => 'http://creativecommons.com/cc-by-2.9',
- 'ImageDescription' =>
- array (
- 'x-default' => 'Test image for the cc: xmp: xmpRights: namespaces in xmp',
- '_type' => 'lang',
- ),
- 'ObjectName' =>
- array (
- 'x-default' => 'xmp core/xmp rights/cc ns test',
- '_type' => 'lang',
- ),
- 'DateTimeDigitized' => '2005:04:03',
- 'Software' => 'The one true editor: Vi (ok i used gimp)',
- 'Identifier' =>
- array (
- 0 => 'http://example.com/identifierurl',
- 1 => 'urn:sha1:342524abcdef',
- '_type' => 'ul',
- ),
- 'Label' => 'Test image',
- 'DateTimeMetadata' => '2011:05:12',
- 'DateTime' => '2007:03:04 06:34:10',
- 'Nickname' => 'My little xmp test image',
- 'Rating' => '5',
- 'RightsCertificate' => 'http://example.com/rights-certificate/',
- 'Copyrighted' => 'True',
- 'CopyrightOwner' =>
- array (
- 0 => 'Bawolff is copyright owner',
- '_type' => 'ul',
- ),
- 'UsageTerms' =>
- array (
- 'x-default' => 'do whatever you want',
- 'en-gb' => 'Do whatever you want in british english',
- '_type' => 'lang',
- ),
- 'WebStatement' => 'http://example.com/web_statement',
- ),
- 'xmp-deprecated' =>
- array (
- 'Identifier' => 'http://example.com/identifierurl/wrong',
- ),
+ 'xmp-exif' =>
+ array (
+ 'CameraOwnerName' => 'Me!',
+ ),
+ 'xmp-general' =>
+ array (
+ 'LicenseUrl' => 'http://creativecommons.com/cc-by-2.9',
+ 'ImageDescription' =>
+ array (
+ 'x-default' => 'Test image for the cc: xmp: xmpRights: namespaces in xmp',
+ '_type' => 'lang',
+ ),
+ 'ObjectName' =>
+ array (
+ 'x-default' => 'xmp core/xmp rights/cc ns test',
+ '_type' => 'lang',
+ ),
+ 'DateTimeDigitized' => '2005:04:03',
+ 'Software' => 'The one true editor: Vi (ok i used gimp)',
+ 'Identifier' =>
+ array (
+ 0 => 'http://example.com/identifierurl',
+ 1 => 'urn:sha1:342524abcdef',
+ '_type' => 'ul',
+ ),
+ 'Label' => 'Test image',
+ 'DateTimeMetadata' => '2011:05:12',
+ 'DateTime' => '2007:03:04 06:34:10',
+ 'Nickname' => 'My little xmp test image',
+ 'Rating' => '5',
+ 'RightsCertificate' => 'http://example.com/rights-certificate/',
+ 'Copyrighted' => 'True',
+ 'CopyrightOwner' =>
+ array (
+ 0 => 'Bawolff is copyright owner',
+ '_type' => 'ul',
+ ),
+ 'UsageTerms' =>
+ array (
+ 'x-default' => 'do whatever you want',
+ 'en-gb' => 'Do whatever you want in british english',
+ '_type' => 'lang',
+ ),
+ 'WebStatement' => 'http://example.com/web_statement',
+ ),
+ 'xmp-deprecated' =>
+ array (
+ 'Identifier' => 'http://example.com/identifierurl/wrong',
+ ),
);
$dbw = wfGetDB( DB_MASTER );
$dbw->update( 'revision',
- array( 'rev_timestamp' => $timestamp ),
+ array( 'rev_timestamp' => $dbw->timestamp( $timestamp ) ),
array( 'rev_id' => $page->getLatest() ) );
$page->clear();
MagicWord::clearCache();
}
- // Bug 8689 - Long numeric lines kill the parser
+ /**
+ * Bug 8689 - Long numeric lines kill the parser
+ *
+ * @group Database
+ */
function testBug8689() {
global $wgUser;
$longLine = '1.' . str_repeat( '1234567890', 100000 ) . "\n";
$this->parser->parse( $longLine, $t, $options )->getText() );
}
- /* Test the parser entry points */
+ /**
+ * Test the parser entry points
+ *
+ * @group Database
+ */
function testParse() {
$title = Title::newFromText( __FUNCTION__ );
$parserOutput = $this->parser->parse( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
$this->assertEquals( "<p>Test\nContent of <i>Template:Foo</i>\nContent of <i>Template:Bar</i>\n</p>", $parserOutput->getText() );
}
+ /**
+ * @group Database
+ */
function testPreSaveTransform() {
global $wgUser;
$title = Title::newFromText( __FUNCTION__ );
$this->assertEquals( "Test\nContent of ''Template:Foo''\n{{Bar}}", $outputText );
}
+ /**
+ * @group Database
+ */
function testPreprocess() {
$title = Title::newFromText( __FUNCTION__ );
$outputText = $this->parser->preprocess( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
<?php
/**
- * Unit tests for wfAssembleUrl()
+ * Tests for wfAssembleUrl()
*/
-
-class wfAssembleUrl extends MediaWikiTestCase {
+class WfAssembleUrlTest extends MediaWikiTestCase {
/** @dataProvider provideURLParts */
public function testWfAssembleUrl( $parts, $output ) {
$partsDump = print_r( $parts, true );
<?php
/**
- * Unit tests for wfBCP47()
+ * Tests for wfBCP47()
*/
-class wfBCP47 extends MediaWikiTestCase {
+class WfBCP47Test extends MediaWikiTestCase {
/**
* test @see wfBCP47().
* Please note the BCP explicitly state that language codes are case
<?php
-
/**
* Tests for wfBaseConvert()
*/
-class wfBaseConvertTest extends MediaWikiTestCase {
+class WfBaseConvertTest extends MediaWikiTestCase {
public static function provideSingleDigitConversions() {
return array(
// 2 3 5 8 10 16 36
/**
* Tests for wfBaseName()
*/
-class wfBaseName extends MediaWikiTestCase {
+class WfBaseNameTest extends MediaWikiTestCase {
/**
* @dataProvider providePaths
*/
<?php
/**
- * Unit tests for wfExpandUrl()
+ * Tests for wfExpandUrl()
*/
-
-class wfExpandUrl extends MediaWikiTestCase {
+class WfExpandUrlTest extends MediaWikiTestCase {
/** @dataProvider provideExpandableUrls */
public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
// Fake $wgServer and $wgCanonicalServer
<?php
-class wfGetCaller extends MediaWikiTestCase {
+class WfGetCallerTest extends MediaWikiTestCase {
function testZero() {
$this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
}
function testOne() {
- $this->assertEquals( "wfGetCaller::testOne", self::callerOne() );
+ $this->assertEquals( 'WfGetCallerTest::testOne', self::callerOne() );
}
function intermediateFunction( $level = 2, $n = 0 ) {
}
function testTwo() {
- $this->assertEquals( "wfGetCaller::testTwo", self::intermediateFunction() );
+ $this->assertEquals( 'WfGetCallerTest::testTwo', self::intermediateFunction() );
}
function testN() {
- $this->assertEquals( "wfGetCaller::testN", self::intermediateFunction( 2, 0 ) );
- $this->assertEquals( "wfGetCaller::intermediateFunction", self::intermediateFunction( 1, 0 ) );
+ $this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
+ $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( 1, 0 ) );
for ( $i = 0; $i < 10; $i++ )
- $this->assertEquals( "wfGetCaller::intermediateFunction", self::intermediateFunction( $i + 1, $i ) );
+ $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( $i + 1, $i ) );
}
}
--- /dev/null
+<?php
+/**
+ * Tests for wfParseUrl()
+ *
+ * Copyright © 2013 Alexandre Emsenhuber
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class WfParseUrlTest extends MediaWikiTestCase {
+ protected function setUp() {
+ parent::setUp();
+
+ $this->setMwGlobals( 'wgUrlProtocols', array(
+ '//', 'http://', 'file://', 'mailto:',
+ ) );
+ }
+
+ /** @dataProvider provideURLs */
+ public function testWfParseUrl( $url, $parts ) {
+ $partsDump = var_export( $parts, true );
+ $this->assertEquals(
+ $parts,
+ wfParseUrl( $url ),
+ "Testing $url parses to $partsDump"
+ );
+ }
+
+ /**
+ * Provider of URLs for testing wfParseUrl()
+ *
+ * @return array
+ */
+ public static function provideURLs() {
+ return array(
+ array(
+ '//example.org',
+ array(
+ 'scheme' => '',
+ 'delimiter' => '//',
+ 'host' => 'example.org',
+ )
+ ),
+ array(
+ 'http://example.org',
+ array(
+ 'scheme' => 'http',
+ 'delimiter' => '://',
+ 'host' => 'example.org',
+ )
+ ),
+ array(
+ 'http://id:key@example.org:123/path?foo=bar#baz',
+ array(
+ 'scheme' => 'http',
+ 'delimiter' => '://',
+ 'user' => 'id',
+ 'pass' => 'key',
+ 'host' => 'example.org',
+ 'port' => 123,
+ 'path' => '/path',
+ 'query' => 'foo=bar',
+ 'fragment' => 'baz',
+ )
+ ),
+ array(
+ 'file://example.org/etc/php.ini',
+ array(
+ 'scheme' => 'file',
+ 'delimiter' => '://',
+ 'host' => 'example.org',
+ 'path' => '/etc/php.ini',
+ )
+ ),
+ array(
+ 'file:///etc/php.ini',
+ array(
+ 'scheme' => 'file',
+ 'delimiter' => '://',
+ 'host' => '',
+ 'path' => '/etc/php.ini',
+ )
+ ),
+ array(
+ 'file:///c:/',
+ array(
+ 'scheme' => 'file',
+ 'delimiter' => '://',
+ 'host' => '',
+ 'path' => '/c:/',
+ )
+ ),
+ array(
+ 'mailto:id@example.org',
+ array(
+ 'scheme' => 'mailto',
+ 'delimiter' => ':',
+ 'host' => 'id@example.org',
+ 'path' => '',
+ )
+ ),
+ array(
+ 'mailto:id@example.org?subject=Foo',
+ array(
+ 'scheme' => 'mailto',
+ 'delimiter' => ':',
+ 'host' => 'id@example.org',
+ 'path' => '',
+ 'query' => 'subject=Foo',
+ )
+ ),
+ array(
+ 'mailto:?subject=Foo',
+ array(
+ 'scheme' => 'mailto',
+ 'delimiter' => ':',
+ 'host' => '',
+ 'path' => '',
+ 'query' => 'subject=Foo',
+ )
+ ),
+ array(
+ 'invalid://test/',
+ false
+ ),
+ );
+ }
+}
<?php
/**
- * Unit tests for wfRemoveDotSegments()
+ * Tests for wfRemoveDotSegments()
*/
-
-class wfRemoveDotSegments extends MediaWikiTestCase {
+class WfRemoveDotSegmentsTest extends MediaWikiTestCase {
/** @dataProvider providePaths */
public function testWfRemoveDotSegments( $inputPath, $outputPath ) {
$this->assertEquals(
<?php
-class wfShorthandToIntegerTest extends MediaWikiTestCase {
+class WfShorthandToIntegerTest extends MediaWikiTestCase {
/**
* @dataProvider provideABunchOfShorthands
*/
<?php
-
/*
* Tests for wfTimestamp()
*/
-class wfTimestamp extends MediaWikiTestCase {
+class WfTimestampTest extends MediaWikiTestCase {
/**
* @dataProvider provideNormalTimestamps
*/
<?php
/**
- * Tests for includes/GlobalFunctions.php -> wfUrlencode()
+ * Tests for wfUrlencode()
*
* The function only need a string parameter and might react to IIS7.0
*/
-
-class wfUrlencodeTest extends MediaWikiTestCase {
+class WfUrlencodeTest extends MediaWikiTestCase {
#### TESTS ##############################################################
/** @dataProvider provideURLS */
}
public function testUpdate_categorylinks() {
+ $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
+
list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
$po->addCategory( "Foo", "FOO" );
$router->add( "/$2/$1", array( 'restricted-to-y' => '$2' ), array( '$2' => 'y' ) );
foreach ( array(
- "/Foo" => array( 'title' => "Foo" ),
- "/Bar" => array( 'ping' => 'pong' ),
- "/Baz" => array( 'marco' => 'polo' ),
- "/asdf-foo" => array( 'title' => "qwerty-foo" ),
- "/qwerty-bar" => array( 'title' => "asdf-bar" ),
- "/a/Foo" => array( 'title' => "Foo" ),
- "/asdf/Foo" => array( 'title' => "Foo" ),
- "/qwerty/Foo" => array( 'title' => "Foo", 'qwerty' => 'qwerty' ),
- "/baz/Foo" => array( 'title' => "Foo", 'unrestricted' => 'baz' ),
- "/y/Foo" => array( 'title' => "Foo", 'restricted-to-y' => 'y' ),
- ) as $path => $result ) {
+ '/Foo' => array( 'title' => 'Foo' ),
+ '/Bar' => array( 'ping' => 'pong' ),
+ '/Baz' => array( 'marco' => 'polo' ),
+ '/asdf-foo' => array( 'title' => 'qwerty-foo' ),
+ '/qwerty-bar' => array( 'title' => 'asdf-bar' ),
+ '/a/Foo' => array( 'title' => 'Foo' ),
+ '/asdf/Foo' => array( 'title' => 'Foo' ),
+ '/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
+ '/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
+ '/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
+ ) as $path => $result ) {
$this->assertEquals( $router->parse( $path ), $result );
}
}
*/
function escaped( $string ) {
$escaped = '';
- for ( $i = 0; $i < strlen( $string ); $i++ ) {
+ $length = strlen( $string );
+ for ( $i = 0; $i < $length; $i++ ) {
$char = $string[$i];
$val = ord( $char );
if ( $val > 127 ) {
array( TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ),
array( TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ),
array( TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ),
- array( TS_DB2, '2012-07-31 19:01:08', '20120731190108' ),
// Some extremes and weird values
array( TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ),
array( TS_UNIX, '-62135596801', '00001231235959' )
function setUp() {
parent::setUp();
LoginForm::setCreateaccountToken();
+ $this->setMwGlobals( array( 'wgEnableEmail' => true ) );
}
/**
* @expectedException UsageException
*/
function testInvalidEmail() {
- global $wgEnableEmail;
- if ( !$wgEnableEmail ) {
- $this->markTestSkipped( 'email is not enabled, so createaccount does not check it' );
- }
$this->doApiRequest( array(
'action' => 'createaccount',
'name' => 'Test User',
$dbw = wfGetDB( DB_MASTER );
$dbw->update( 'revision',
- array( 'rev_timestamp' => $timestamp ),
+ array( 'rev_timestamp' => $dbw->timestamp( $timestamp ) ),
array( 'rev_id' => $page->getLatest() ) );
$page->clear();
+++ /dev/null
-<?php
-
-/**
- * @group API
- */
-class ApiGeneratorTest extends MediaWikiTestCase {
-
- /**
- * Helper to easily get an ApiQuery object instance
- */
- function getApiQuery() {
- // Initialize an ApiQuery object to play with
- $main = new ApiMain( new FauxRequest() );
- return new ApiQuery( $main, 'foo', 'bar' );
- }
-
- /**
- * Test whether all registered query modules which are subclasses of
- * ApiQueryGeneratorBase are listed as being a generator. Registration is
- * done:
- * - for core: add it to ApiQuery::$mQueryGenerators
- * - for extension: by adding to $wgAPIGeneratorModules
- *
- * @dataProvider provideApiquerygeneratorbaseChilds
- */
- public function testApiquerygeneatorbaseModulesListedAsGenerators(
- $moduleName, $moduleClass
- ) {
- $generators = $this->getApiQuery()->getGenerators();
- $this->assertArrayHasKey( $moduleName, $generators,
- "API module '$moduleName' of class '$moduleClass' (an ApiQueryGeneratorBase subclass) must be listed in ApiQuery::\$mQueryGenerators or added to \$wgAPIGeneratorModules."
- );
- }
-
- /**
- * Returns API modules which are subclassing ApiQueryGeneratorBase.
- * Case format is:
- * (moduleName, moduleClass)
- */
- public function provideApiquerygeneratorbaseChilds() {
- $cases = array();
- $modules = $this->getApiQuery()->getModuleManager()->getNamesWithClasses();
- foreach ( $modules as $moduleName => $moduleClass ) {
- if ( !is_subclass_of( $moduleClass, 'ApiQueryGeneratorBase' ) ) {
- continue;
- }
- $cases[] = array( $moduleName, $moduleClass );
- }
- return $cases;
- }
-
- /**
- * @dataProvider provideListedApiqueryGenerators
- */
- public function testGeneratorsAreApiquerygeneratorbaseSubclasses(
- $generatorName, $generatorClass
- ) {
- $modules = $this->getApiQuery()->getModuleManager()->getNamesWithClasses();
- $this->assertArrayHasKey( $generatorName, $modules,
- "Class '$generatorClass' of generator '$generatorName' must be a subclass of 'ApiQueryGeneratorBase'. Listed either in ApiQuery::\$mQueryGenerators or in \$wgAPIGeneratorModules."
- );
-
- }
-
- /**
- * Return ApiQuery generators, either listed in ApiQuery or registered
- * via wgAPIGeneratorModules.
- * Case format is:
- * (moduleName, $moduleClass).
- */
- public function provideListedApiqueryGenerators() {
- $cases = array();
- $generators = $this->getApiQuery()->getGenerators();
- foreach ( $generators as $generatorName => $generatorClass ) {
- $cases[] = array( $generatorName, $generatorClass );
- }
- return $cases;
- }
-
-}
* @file
*/
-// Evaluate the include path relative to this file
-$IP = dirname( dirname( dirname( dirname( __DIR__ ) ) ) );
-
// Start up MediaWiki in command-line mode
-require_once( "$IP/maintenance/Maintenance.php" );
+require_once( __DIR__ . "/../../../../maintenance/Maintenance.php" );
require( __DIR__ . "/RandomImageGenerator.php" );
class GenerateRandomImages extends Maintenance {
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- *
- * These tests validate basic functionality of the api query module
+ */
+
+require_once( 'ApiQueryTestBase.php' );
+
+/** These tests validate basic functionality of the api query module
*
* @group API
* @group Database
* @group medium
*/
-class ApiQueryBasicTest extends ApiTestCase {
+class ApiQueryBasicTest extends ApiQueryTestBase {
/**
* Create a set of pages. These must not change, otherwise the tests might give wrong results.
* @see MediaWikiTestCase::addDBData()
self::$categorymembers ) );
}
- /**
- * Merges all requests (parameter arrays) into one
- * @return array
- */
- private function merge( /*...*/ ) {
- $request = array();
- $expected = array();
- foreach ( func_get_args() as $v ) {
- $request = array_merge_recursive( $request, $v[0] );
- $this->mergeExpected( $expected, $v[1] );
- }
- return array( $request, $expected );
- }
-
/**
* Recursively merges the expected values in the $item into the $all
*/
}
}
- /**
- * Checks that the request's result matches the expected results.
- * @param $values array is a two element array( request, expected_results )
- * @throws Exception
- */
- private function check( $values ) {
- $request = $values[0];
- $expected = $values[1];
- if ( !array_key_exists( 'action', $request ) ) {
- $request['action'] = 'query';
- }
- foreach ( $request as &$val ) {
- if ( is_array( $val ) ) {
- $val = implode( '|', array_unique( $val ) );
- }
- }
- $result = $this->doApiRequest( $request );
- $result = $result[0];
- $expected = array( 'query' => $expected );
- try {
- $this->assertQueryResults( $expected, $result );
- } catch ( Exception $e ) {
- print( "\nRequest:\n" );
- print_r( $request );
- print( "\nExpected:\n" );
- print_r( $expected );
- print( "\nResult:\n" );
- print_r( $result );
- throw $e; // rethrow it
- }
- }
-
/**
* Recursively compare arrays, ignoring mismatches in numeric key and pageids.
* @param $expected array expected values
--- /dev/null
+<?php
+/**
+ * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+require_once( 'ApiQueryContinueTestBase.php' );
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ */
+class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
+ /**
+ * Create a set of pages. These must not change, otherwise the tests might give wrong results.
+ * @see MediaWikiTestCase::addDBData()
+ */
+ function addDBData() {
+ try {
+ $this->editPage( 'AQCT73462-A', '**AQCT73462-A** [[AQCT73462-B]] [[AQCT73462-C]]' );
+ $this->editPage( 'AQCT73462-B', '[[AQCT73462-A]] **AQCT73462-B** [[AQCT73462-C]]' );
+ $this->editPage( 'AQCT73462-C', '[[AQCT73462-A]] [[AQCT73462-B]] **AQCT73462-C**' );
+ $this->editPage( 'AQCT73462-A', '**AQCT73462-A** [[AQCT73462-B]] [[AQCT73462-C]]' );
+ $this->editPage( 'AQCT73462-B', '[[AQCT73462-A]] **AQCT73462-B** [[AQCT73462-C]]' );
+ $this->editPage( 'AQCT73462-C', '[[AQCT73462-A]] [[AQCT73462-B]] **AQCT73462-C**' );
+ } catch ( Exception $e ) {
+ $this->exceptionFromAddDBData = $e;
+ }
+ }
+
+ /**
+ * @medium
+ */
+ public function testA() {
+ $this->mVerbose = false;
+ $mk = function( $g, $p, $gDir ) {
+ return array(
+ 'generator' => 'allpages',
+ 'gapprefix' => 'AQCT73462-',
+ 'prop' => 'links',
+ 'gaplimit' => "$g",
+ 'pllimit' => "$p",
+ 'gapdir' => $gDir ? "ascending" : "descending",
+ );
+ };
+ // generator + 1 prop + 1 list
+ $data = $this->query( $mk(99,99,true), 1, 'g1p', false );
+ $this->checkC( $data, $mk(1,1,true), 6, 'g1p-11t' );
+ $this->checkC( $data, $mk(2,2,true), 3, 'g1p-22t' );
+ $this->checkC( $data, $mk(1,1,false), 6, 'g1p-11f' );
+ $this->checkC( $data, $mk(2,2,false), 3, 'g1p-22f' );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+require_once( 'ApiQueryContinueTestBase.php' );
+
+/**
+ * These tests validate the new continue functionality of the api query module by
+ * doing multiple requests with varying parameters, merging the results, and checking
+ * that the result matches the full data received in one no-limits call.
+ *
+ * @group API
+ * @group Database
+ * @group medium
+ */
+class ApiQueryContinueTest extends ApiQueryContinueTestBase {
+ /**
+ * Create a set of pages. These must not change, otherwise the tests might give wrong results.
+ * @see MediaWikiTestCase::addDBData()
+ */
+ function addDBData() {
+ try {
+ $this->editPage( 'Template:AQCT-T1', '**Template:AQCT-T1**' );
+ $this->editPage( 'Template:AQCT-T2', '**Template:AQCT-T2**' );
+ $this->editPage( 'Template:AQCT-T3', '**Template:AQCT-T3**' );
+ $this->editPage( 'Template:AQCT-T4', '**Template:AQCT-T4**' );
+ $this->editPage( 'Template:AQCT-T5', '**Template:AQCT-T5**' );
+
+ $this->editPage( 'AQCT-1', '**AQCT-1** {{AQCT-T2}} {{AQCT-T3}} {{AQCT-T4}} {{AQCT-T5}}' );
+ $this->editPage( 'AQCT-2', '[[AQCT-1]] **AQCT-2** {{AQCT-T3}} {{AQCT-T4}} {{AQCT-T5}}' );
+ $this->editPage( 'AQCT-3', '[[AQCT-1]] [[AQCT-2]] **AQCT-3** {{AQCT-T4}} {{AQCT-T5}}' );
+ $this->editPage( 'AQCT-4', '[[AQCT-1]] [[AQCT-2]] [[AQCT-3]] **AQCT-4** {{AQCT-T5}}' );
+ $this->editPage( 'AQCT-5', '[[AQCT-1]] [[AQCT-2]] [[AQCT-3]] [[AQCT-4]] **AQCT-5**' );
+ } catch ( Exception $e ) {
+ $this->exceptionFromAddDBData = $e;
+ }
+ }
+
+ /**
+ * Test smart continue - list=allpages
+ * @medium
+ */
+ public function test1List() {
+ $this->mVerbose = false;
+ $mk = function( $l ) {
+ return array(
+ 'list' => 'allpages',
+ 'apprefix' => 'AQCT-',
+ 'aplimit' => "$l",
+ );
+ };
+ $data = $this->query( $mk(99), 1, '1L', false );
+
+ // 1 list
+ $this->checkC( $data, $mk(1), 5, '1L-1' );
+ $this->checkC( $data, $mk(2), 3, '1L-2' );
+ $this->checkC( $data, $mk(3), 2, '1L-3' );
+ $this->checkC( $data, $mk(4), 2, '1L-4' );
+ $this->checkC( $data, $mk(5), 1, '1L-5' );
+ }
+
+ /**
+ * Test smart continue - list=allpages|alltransclusions
+ * @medium
+ */
+ public function test2Lists() {
+ $this->mVerbose = false;
+ $mk = function( $l1, $l2 ) {
+ return array(
+ 'list' => 'allpages|alltransclusions',
+ 'apprefix' => 'AQCT-',
+ 'atprefix' => 'AQCT-',
+ 'atunique' => '',
+ 'aplimit' => "$l1",
+ 'atlimit' => "$l2",
+ );
+ };
+ // 2 lists
+ $data = $this->query( $mk(99,99), 1, '2L', false );
+ $this->checkC( $data, $mk(1,1), 5, '2L-11' );
+ $this->checkC( $data, $mk(2,2), 3, '2L-22' );
+ $this->checkC( $data, $mk(3,3), 2, '2L-33' );
+ $this->checkC( $data, $mk(4,4), 2, '2L-44' );
+ $this->checkC( $data, $mk(5,5), 1, '2L-55' );
+ }
+
+ /**
+ * Test smart continue - generator=allpages, prop=links
+ * @medium
+ */
+ public function testGen1Prop() {
+ $this->mVerbose = false;
+ $mk = function( $g, $p ) {
+ return array(
+ 'generator' => 'allpages',
+ 'gapprefix' => 'AQCT-',
+ 'gaplimit' => "$g",
+ 'prop' => 'links',
+ 'pllimit' => "$p",
+ );
+ };
+ // generator + 1 prop
+ $data = $this->query( $mk(99,99), 1, 'G1P', false );
+ $this->checkC( $data, $mk(1,1), 11, 'G1P-11' );
+ $this->checkC( $data, $mk(2,2), 6, 'G1P-22' );
+ $this->checkC( $data, $mk(3,3), 4, 'G1P-33' );
+ $this->checkC( $data, $mk(4,4), 3, 'G1P-44' );
+ $this->checkC( $data, $mk(5,5), 2, 'G1P-55' );
+ }
+
+ /**
+ * Test smart continue - generator=allpages, prop=links|templates
+ * @medium
+ */
+ public function testGen2Prop() {
+ $this->mVerbose = false;
+ $mk = function( $g, $p1, $p2 ) {
+ return array(
+ 'generator' => 'allpages',
+ 'gapprefix' => 'AQCT-',
+ 'gaplimit' => "$g",
+ 'prop' => 'links|templates',
+ 'pllimit' => "$p1",
+ 'tllimit' => "$p2",
+ );
+ };
+ // generator + 2 props
+ $data = $this->query( $mk(99,99,99), 1, 'G2P', false );
+ $this->checkC( $data, $mk(1,1,1), 16, 'G2P-111' );
+ $this->checkC( $data, $mk(2,2,2), 9, 'G2P-222' );
+ $this->checkC( $data, $mk(3,3,3), 6, 'G2P-333' );
+ $this->checkC( $data, $mk(4,4,4), 4, 'G2P-444' );
+ $this->checkC( $data, $mk(5,5,5), 2, 'G2P-555' );
+ $this->checkC( $data, $mk(5,1,1), 10, 'G2P-511' );
+ $this->checkC( $data, $mk(4,2,2), 7, 'G2P-422' );
+ $this->checkC( $data, $mk(2,3,3), 7, 'G2P-233' );
+ $this->checkC( $data, $mk(2,4,4), 5, 'G2P-244' );
+ $this->checkC( $data, $mk(1,5,5), 5, 'G2P-155' );
+ }
+
+ /**
+ * Test smart continue - generator=allpages, prop=links, list=alltransclusions
+ * @medium
+ */
+ public function testGen1Prop1List() {
+ $this->mVerbose = false;
+ $mk = function( $g, $p, $l ) {
+ return array(
+ 'generator' => 'allpages',
+ 'gapprefix' => 'AQCT-',
+ 'gaplimit' => "$g",
+ 'prop' => 'links',
+ 'pllimit' => "$p",
+ 'list' => 'alltransclusions',
+ 'atprefix' => 'AQCT-',
+ 'atunique' => '',
+ 'atlimit' => "$l",
+ );
+ };
+ // generator + 1 prop + 1 list
+ $data = $this->query( $mk(99,99,99), 1, 'G1P1L', false );
+ $this->checkC( $data, $mk(1,1,1), 11, 'G1P1L-111' );
+ $this->checkC( $data, $mk(2,2,2), 6, 'G1P1L-222' );
+ $this->checkC( $data, $mk(3,3,3), 4, 'G1P1L-333' );
+ $this->checkC( $data, $mk(4,4,4), 3, 'G1P1L-444' );
+ $this->checkC( $data, $mk(5,5,5), 2, 'G1P1L-555' );
+ $this->checkC( $data, $mk(5,5,1), 4, 'G1P1L-551' );
+ $this->checkC( $data, $mk(5,5,2), 2, 'G1P1L-552' );
+ }
+
+ /**
+ * Test smart continue - generator=allpages, prop=links|templates,
+ * list=alllinks|alltransclusions, meta=siteinfo
+ * @medium
+ */
+ public function testGen2Prop2List1Meta() {
+ $this->mVerbose = false;
+ $mk = function( $g, $p1, $p2, $l1, $l2 ) {
+ return array(
+ 'generator' => 'allpages',
+ 'gapprefix' => 'AQCT-',
+ 'gaplimit' => "$g",
+ 'prop' => 'links|templates',
+ 'pllimit' => "$p1",
+ 'tllimit' => "$p2",
+ 'list' => 'alllinks|alltransclusions',
+ 'alprefix' => 'AQCT-',
+ 'alunique' => '',
+ 'allimit' => "$l1",
+ 'atprefix' => 'AQCT-',
+ 'atunique' => '',
+ 'atlimit' => "$l2",
+ 'meta' => 'siteinfo',
+ 'siprop' => 'namespaces',
+ );
+ };
+ // generator + 1 prop + 1 list
+ $data = $this->query( $mk(99,99,99,99,99), 1, 'G2P2L1M', false );
+ $this->checkC( $data, $mk(1,1,1,1,1), 16, 'G2P2L1M-11111' );
+ $this->checkC( $data, $mk(2,2,2,2,2), 9, 'G2P2L1M-22222' );
+ $this->checkC( $data, $mk(3,3,3,3,3), 6, 'G2P2L1M-33333' );
+ $this->checkC( $data, $mk(4,4,4,4,4), 4, 'G2P2L1M-44444' );
+ $this->checkC( $data, $mk(5,5,5,5,5), 2, 'G2P2L1M-55555' );
+ $this->checkC( $data, $mk(5,5,5,1,1), 4, 'G2P2L1M-55511' );
+ $this->checkC( $data, $mk(5,5,5,2,2), 2, 'G2P2L1M-55522' );
+ $this->checkC( $data, $mk(5,1,1,5,5), 10, 'G2P2L1M-51155' );
+ $this->checkC( $data, $mk(5,2,2,5,5), 5, 'G2P2L1M-52255' );
+ }
+
+ /**
+ * Test smart continue - generator=templates, prop=templates
+ * @medium
+ */
+ public function testSameGenAndProp() {
+ $this->mVerbose = false;
+ $mk = function( $g, $gDir, $p, $pDir ) {
+ return array(
+ 'titles' => 'AQCT-1',
+ 'generator' => 'templates',
+ 'gtllimit' => "$g",
+ 'gtldir' => $gDir ? 'ascending' : 'descending',
+ 'prop' => 'templates',
+ 'tllimit' => "$p",
+ 'tldir' => $pDir ? 'ascending' : 'descending',
+ );
+ };
+ // generator + 1 prop
+ $data = $this->query( $mk(99,true,99,true), 1, 'G=P', false );
+
+ $this->checkC( $data, $mk(1,true,1,true), 4, 'G=P-1t1t' );
+ $this->checkC( $data, $mk(2,true,2,true), 2, 'G=P-2t2t' );
+ $this->checkC( $data, $mk(3,true,3,true), 2, 'G=P-3t3t' );
+ $this->checkC( $data, $mk(1,true,3,true), 4, 'G=P-1t3t' );
+ $this->checkC( $data, $mk(3,true,1,true), 2, 'G=P-3t1t' );
+
+ $this->checkC( $data, $mk(1,true,1,false), 4, 'G=P-1t1f' );
+ $this->checkC( $data, $mk(2,true,2,false), 2, 'G=P-2t2f' );
+ $this->checkC( $data, $mk(3,true,3,false), 2, 'G=P-3t3f' );
+ $this->checkC( $data, $mk(1,true,3,false), 4, 'G=P-1t3f' );
+ $this->checkC( $data, $mk(3,true,1,false), 2, 'G=P-3t1f' );
+
+ $this->checkC( $data, $mk(1,false,1,true), 4, 'G=P-1f1t' );
+ $this->checkC( $data, $mk(2,false,2,true), 2, 'G=P-2f2t' );
+ $this->checkC( $data, $mk(3,false,3,true), 2, 'G=P-3f3t' );
+ $this->checkC( $data, $mk(1,false,3,true), 4, 'G=P-1f3t' );
+ $this->checkC( $data, $mk(3,false,1,true), 2, 'G=P-3f1t' );
+
+ $this->checkC( $data, $mk(1,false,1,false), 4, 'G=P-1f1f' );
+ $this->checkC( $data, $mk(2,false,2,false), 2, 'G=P-2f2f' );
+ $this->checkC( $data, $mk(3,false,3,false), 2, 'G=P-3f3f' );
+ $this->checkC( $data, $mk(1,false,3,false), 4, 'G=P-1f3f' );
+ $this->checkC( $data, $mk(3,false,1,false), 2, 'G=P-3f1f' );
+ }
+
+ /**
+ * Test smart continue - generator=allpages, list=allpages
+ * @medium
+ */
+ public function testSameGenList() {
+ $this->mVerbose = false;
+ $mk = function( $g, $gDir, $l, $pDir ) {
+ return array(
+ 'generator' => 'allpages',
+ 'gapprefix' => 'AQCT-',
+ 'gaplimit' => "$g",
+ 'gapdir' => $gDir ? 'ascending' : 'descending',
+ 'list' => 'allpages',
+ 'apprefix' => 'AQCT-',
+ 'aplimit' => "$l",
+ 'apdir' => $pDir ? 'ascending' : 'descending',
+ );
+ };
+ // generator + 1 list
+ $data = $this->query( $mk(99,true,99,true), 1, 'G=L', false );
+
+ $this->checkC( $data, $mk(1,true,1,true), 5, 'G=L-1t1t' );
+ $this->checkC( $data, $mk(2,true,2,true), 3, 'G=L-2t2t' );
+ $this->checkC( $data, $mk(3,true,3,true), 2, 'G=L-3t3t' );
+ $this->checkC( $data, $mk(1,true,3,true), 5, 'G=L-1t3t' );
+ $this->checkC( $data, $mk(3,true,1,true), 5, 'G=L-3t1t' );
+ $this->checkC( $data, $mk(1,true,1,false), 5, 'G=L-1t1f' );
+ $this->checkC( $data, $mk(2,true,2,false), 3, 'G=L-2t2f' );
+ $this->checkC( $data, $mk(3,true,3,false), 2, 'G=L-3t3f' );
+ $this->checkC( $data, $mk(1,true,3,false), 5, 'G=L-1t3f' );
+ $this->checkC( $data, $mk(3,true,1,false), 5, 'G=L-3t1f' );
+ $this->checkC( $data, $mk(1,false,1,true), 5, 'G=L-1f1t' );
+ $this->checkC( $data, $mk(2,false,2,true), 3, 'G=L-2f2t' );
+ $this->checkC( $data, $mk(3,false,3,true), 2, 'G=L-3f3t' );
+ $this->checkC( $data, $mk(1,false,3,true), 5, 'G=L-1f3t' );
+ $this->checkC( $data, $mk(3,false,1,true), 5, 'G=L-3f1t' );
+ $this->checkC( $data, $mk(1,false,1,false), 5, 'G=L-1f1f' );
+ $this->checkC( $data, $mk(2,false,2,false), 3, 'G=L-2f2f' );
+ $this->checkC( $data, $mk(3,false,3,false), 2, 'G=L-3f3f' );
+ $this->checkC( $data, $mk(1,false,3,false), 5, 'G=L-1f3f' );
+ $this->checkC( $data, $mk(3,false,1,false), 5, 'G=L-3f1f' );
+ }
+}
--- /dev/null
+<?php
+/**
+ *
+ *
+ * Created on Jan 1, 2013
+ *
+ * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+require_once( 'ApiQueryTestBase.php' );
+
+abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
+
+ /**
+ * Enable to print in-depth debugging info during the test run
+ */
+ protected $mVerbose = false;
+
+ /**
+ * Run query() and compare against expected values
+ */
+ protected function checkC( $expected, $params, $expectedCount, $id, $continue = true ) {
+ $result = $this->query( $params, $expectedCount, $id, $continue );
+ $this->assertResult( $expected, $result, $id );
+ }
+
+ /**
+ * Run query in a loop until no more values are available
+ * @param array $params api parameters
+ * @param int $expectedCount max number of iterations
+ * @param string $id unit test id
+ * @param boolean $useContinue true to use smart continue
+ * @return mixed: merged results data array
+ * @throws Exception
+ */
+ protected function query( $params, $expectedCount, $id, $useContinue = true ) {
+ if ( isset( $params['action'] ) ) {
+ $this->assertEquals( 'query', $params['action'], 'Invalid query action');
+ } else {
+ $params['action'] = 'query';
+ }
+ if ( $useContinue && !isset( $params['continue'] ) ) {
+ $params['continue'] = '';
+ }
+ $count = 0;
+ $result = array();
+ $continue = array();
+ do {
+ $request = array_merge( $params, $continue );
+ uksort( $request, function( $a, $b ) {
+ // put 'continue' params at the end - lazy method
+ $a = strpos( $a, 'continue' ) !== false ? 'zzz ' . $a : $a;
+ $b = strpos( $b, 'continue' ) !== false ? 'zzz ' . $b : $b;
+ return strcmp( $a, $b );
+ } );
+ $reqStr = http_build_query( $request );
+ //$reqStr = str_replace( '&', ' & ', $reqStr );
+ $this->assertLessThan( $expectedCount, $count, "$id more data: $reqStr" );
+ if ( $this->mVerbose ) {
+ print ("$id (#$count): $reqStr\n");
+ }
+ try {
+ $data = $this->doApiRequest( $request );
+ } catch ( Exception $e ) {
+ throw new Exception( "$id on $count", 0, $e );
+ }
+ $data = $data[0];
+ if ( isset( $data['warnings'] ) ) {
+ $warnings = json_encode( $data['warnings'] );
+ $this->fail( "$id Warnings on #$count in $reqStr\n$warnings" );
+ }
+ $this->assertArrayHasKey( 'query', $data, "$id no 'query' on #$count in $reqStr" );
+ if ( isset( $data['continue'] ) ) {
+ $continue = $data['continue'];
+ unset( $data['continue'] );
+ } else {
+ $continue = array();
+ }
+ if ( $this->mVerbose ) {
+ $this->printResult( $data );
+ }
+ $this->mergeResult( $result, $data );
+ $count++;
+ if ( empty( $continue ) ) {
+ // $this->assertEquals( $expectedCount, $count, "$id finished early" );
+ if ( $expectedCount > $count ) {
+ print "***** $id Finished early in $count turns. $expectedCount was expected\n";
+ }
+ return $result;
+ } elseif ( !$useContinue ) {
+ $this->assertFalse( 'Non-smart query must be requested all at once' );
+ }
+ } while( true );
+ }
+
+ private function printResult( $data ) {
+ $q = $data['query'];
+ $print = array();
+ if (isset($q['pages'])) {
+ foreach ($q['pages'] as $p) {
+ $m = $p['title'];
+ if (isset($p['links'])) {
+ $m .= '/[' . implode(',', array_map(
+ function ($v) {
+ return $v['title'];
+ },
+ $p['links'])) . ']';
+ }
+ if (isset($p['categories'])) {
+ $m .= '/(' . implode(',', array_map(
+ function ($v) {
+ return str_replace('Category:', '', $v['title']);
+ },
+ $p['categories'])) . ')';
+ }
+ $print[] = $m;
+ }
+ }
+ if (isset($q['allcategories'])) {
+ $print[] = '*Cats/(' . implode(',', array_map(
+ function ($v) { return $v['*']; },
+ $q['allcategories'])) . ')';
+ }
+ self::GetItems( $q, 'allpages', 'Pages', $print );
+ self::GetItems( $q, 'alllinks', 'Links', $print );
+ self::GetItems( $q, 'alltransclusions', 'Trnscl', $print );
+ print(' ' . implode(' ', $print) . "\n");
+ }
+
+ private static function GetItems( $q, $moduleName, $name, &$print ) {
+ if (isset($q[$moduleName])) {
+ $print[] = "*$name/[" . implode(',',
+ array_map( function ($v) { return $v['title']; },
+ $q[$moduleName])) . ']';
+ }
+ }
+
+ /**
+ * Recursively merge the new result returned from the query to the previous results.
+ * @param mixed $results
+ * @param mixed $newResult
+ * @param bool $numericIds If true, treat keys as ids to be merged instead of appending
+ */
+ protected function mergeResult( &$results, $newResult, $numericIds = false ) {
+ $this->assertEquals( is_array( $results ), is_array( $newResult ), 'Type of result and data do not match' );
+ if ( !is_array( $results ) ) {
+ $this->assertEquals( $results, $newResult, 'Repeated result must be the same as before' );
+ } else {
+ $sort = null;
+ foreach( $newResult as $key => $value ) {
+ if ( !$numericIds && $sort === null ) {
+ if ( !is_array( $value ) ) {
+ $sort = false;
+ } elseif ( array_key_exists( 'title', $value ) ) {
+ $sort = function( $a, $b ) {
+ return strcmp( $a['title'], $b['title'] );
+ };
+ } else {
+ $sort = false;
+ }
+ }
+ $keyExists = array_key_exists( $key, $results );
+ if ( is_numeric( $key ) ) {
+ if ( $numericIds ) {
+ if ( !$keyExists ) {
+ $results[$key] = $value;
+ } else {
+ $this->mergeResult( $results[$key], $value );
+ }
+ } else {
+ $results[] = $value;
+ }
+ } elseif ( !$keyExists ) {
+ $results[$key] = $value;
+ } else {
+ $this->mergeResult( $results[$key], $value, $key === 'pages' );
+ }
+ }
+ if ( $numericIds ) {
+ ksort( $results, SORT_NUMERIC );
+ } elseif ( $sort !== null && $sort !== false ) {
+ uasort( $results, $sort );
+ }
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ *
+ *
+ * Created on Feb 10, 2013
+ *
+ * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+
+/** This class has some common functionality for testing query module
+ */
+abstract class ApiQueryTestBase extends ApiTestCase {
+
+ const PARAM_ASSERT = <<<STR
+Each parameter must be an array of two elements,
+first - an array of params to the API call,
+and the second array - expected results as returned by the API
+STR;
+
+ /**
+ * Merges all requests parameter + expected values into one
+ * @param ... list of arrays, each of which contains exactly two
+ * @return array
+ */
+ protected function merge( /*...*/ ) {
+ $request = array();
+ $expected = array();
+ foreach ( func_get_args() as $v ) {
+ list( $req, $exp ) = $this->validateRequestExpectedPair( $v );
+ $request = array_merge_recursive( $request, $req );
+ $this->mergeExpected( $expected, $exp );
+ }
+ return array( $request, $expected );
+ }
+
+ /**
+ * Check that the parameter is a valid two element array,
+ * with the first element being API request and the second - expected result
+ */
+ private function validateRequestExpectedPair( $v ) {
+ $this->assertType( 'array', $v, self::PARAM_ASSERT );
+ $this->assertEquals( 2, count($v), self::PARAM_ASSERT );
+ $this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT );
+ $this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
+ $this->assertType( 'array', $v[0], self::PARAM_ASSERT );
+ $this->assertType( 'array', $v[1], self::PARAM_ASSERT );
+ return $v;
+ }
+
+ /**
+ * Recursively merges the expected values in the $item into the $all
+ */
+ private function mergeExpected( &$all, $item ) {
+ foreach ( $item as $k => $v ) {
+ if ( array_key_exists( $k, $all ) ) {
+ if ( is_array ( $all[$k] ) ) {
+ $this->mergeExpected( $all[$k], $v );
+ } else {
+ $this->assertEquals( $all[$k], $v );
+ }
+ } else {
+ $all[$k] = $v;
+ }
+ }
+ }
+
+ /**
+ * Checks that the request's result matches the expected results.
+ * @param $values array is a two element array( request, expected_results )
+ * @throws Exception
+ */
+ protected function check( $values ) {
+ list( $req, $exp ) = $this->validateRequestExpectedPair( $values );
+ if ( !array_key_exists( 'action', $req ) ) {
+ $req['action'] = 'query';
+ }
+ foreach ( $req as &$val ) {
+ if ( is_array( $val ) ) {
+ $val = implode( '|', array_unique( $val ) );
+ }
+ }
+ $result = $this->doApiRequest( $req );
+ $this->assertResult( array( 'query' => $exp ), $result[0], $req );
+ }
+
+ protected function assertResult( $exp, $result, $message = '' ) {
+ try {
+ $this->assertResultRecursive( $exp, $result );
+ } catch ( Exception $e ) {
+ if ( is_array( $message ) ) {
+ $message = http_build_query( $message );
+ }
+ print( "\nRequest: $message\n" );
+ print( "\nExpected:\n" );
+ print_r( $exp );
+ print( "\nResult:\n" );
+ print_r( $result );
+ throw $e; // rethrow it
+ }
+ }
+
+ /**
+ * Recursively compare arrays, ignoring mismatches in numeric key and pageids.
+ * @param $expected array expected values
+ * @param $result array returned values
+ */
+ private function assertResultRecursive( $expected, $result ) {
+ reset( $expected );
+ reset( $result );
+ while ( true ) {
+ $e = each( $expected );
+ $r = each( $result );
+ // If either of the arrays is shorter, abort. If both are done, success.
+ $this->assertEquals( (bool)$e, (bool)$r );
+ if ( !$e ) {
+ break; // done
+ }
+ // continue only if keys are identical or both keys are numeric
+ $this->assertTrue( $e['key'] === $r['key'] || ( is_numeric( $e['key'] ) && is_numeric( $r['key'] ) ) );
+ // don't compare pageids
+ if ( $e['key'] !== 'pageid' ) {
+ // If values are arrays, compare recursively, otherwise compare with ===
+ if ( is_array( $e['value'] ) && is_array( $r['value'] ) ) {
+ $this->assertResultRecursive( $e['value'], $r['value'] );
+ } else {
+ $this->assertEquals( $e['value'], $r['value'] );
+ }
+ }
+ }
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ */
+class MessageCacheTest extends MediaWikiLangTestCase {
+
+ protected function setUp() {
+ parent::setUp();
+ MessageCache::singleton()->enable();
+ }
+
+ function addDBData() {
+ // be sure english messages under $key, not $key/en
+ $this->setMwGlobals( array(
+ 'wgLanguageCode' => 'en',
+ 'wgContLang' => Language::factory( 'en' ),
+ ) );
+
+ // Set up messages and fallbacks ab -> ru -> en
+ $this->makePage( 'FallbackLanguageTest-Full', 'ab' );
+ $this->makePage( 'FallbackLanguageTest-Full', 'ru' );
+ $this->makePage( 'FallbackLanguageTest-Full', 'en' );
+
+ // Fallbacks where ab does not exist
+ $this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
+ $this->makePage( 'FallbackLanguageTest-Partial', 'en' );
+
+ // Fallback to english
+ $this->makePage( 'FallbackLanguageTest-English', 'en' );
+
+ // Full key tests -- always want russian
+ $this->makePage( 'MessageCacheTest-FullKeyTest', 'ab' );
+ $this->makePage( 'MessageCacheTest-FullKeyTest', 'ru' );
+ }
+
+ /**
+ * Helper function for addDBData -- adds a simple page to the database
+ *
+ * @param string $title Title of page to be created
+ * @param string $lang Language and content of the created page
+ */
+ protected function makePage( $title, $lang ) {
+ global $wgContLang;
+
+ $title = Title::newFromText(
+ ($lang == $wgContLang->getCode()) ? $title : "$title/$lang",
+ NS_MEDIAWIKI
+ );
+ $wikiPage = new WikiPage( $title );
+ $content = ContentHandler::makeContent( $lang, $title );
+ $wikiPage->doEditContent( $content, "$lang translation test case" );
+ }
+
+ /**
+ * Test message fallbacks, bug #1495
+ *
+ * @dataProvider provideMessagesForFallback
+ */
+ function testMessageFallbacks( $message, $lang, $expectedContent ) {
+ $result = MessageCache::singleton()->get( $message, true, $lang );
+ $this->assertEquals( $expectedContent, $result, "Message fallback failed." );
+ }
+
+ function provideMessagesForFallback() {
+ return array(
+ array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
+ array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
+ array( 'FallbackLanguageTest-English', 'ab', 'en' ),
+ array( 'FallbackLanguageTest-None', 'ab', false ),
+ );
+ }
+
+ /**
+ * There's a fallback case where the message key is given as fully qualified -- this
+ * should ignore the passed $lang and use the language from the key
+ *
+ * @dataProvider provideMessagesForFullKeys
+ */
+ function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
+ $result = MessageCache::singleton()->get( $message, true, $lang, true );
+ $this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
+ }
+
+ function provideMessagesForFullKeys() {
+ return array(
+ array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
+ array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
+ array( 'MessageCacheTest-FullKeyTest/ru/foo', 'ru', false ),
+ );
+ }
+
+}
);
}
+ /**
+ * @since 1.21
+ * @return array
+ */
+ protected function getMockValues() {
+ return array(
+ 'id' => 1,
+ 'str' => 'foobar4645645',
+ 'int' => 42,
+ 'float' => 4.2,
+ 'bool' => '',
+ 'array' => array( 42, 'foobar' ),
+ 'blob' => new stdClass()
+ );
+ }
+
}
class TestORMRow extends ORMRow {}
$cases[] = array( "$base/unittest-cont1/e/b/some-other_file.txt", "more file contents" );
$cases[] = array(
array( "$base/unittest-cont1/e/a/x.txt", "$base/unittest-cont1/e/a/y.txt",
- "$base/unittest-cont1/e/a/z.txt" ),
+ "$base/unittest-cont1/e/a/z.txt" ),
array( "contents xx", "contents xy", "contents xz" )
);
$cases[] = array( "$base/unittest-cont1/e/a/\$odd&.txt", "test file contents" );
$cases[] = array(
array( "$base/unittest-cont1/e/a/x.txt", "$base/unittest-cont1/e/a/y.txt",
- "$base/unittest-cont1/e/a/z.txt" ),
+ "$base/unittest-cont1/e/a/z.txt" ),
array( "contents xx", "contents xy", "contents xz" )
);
$cases[] = array( "$base/unittest-cont1/e/a/\$odd&.txt", "test file contents" );
$cases[] = array(
array( "$base/unittest-cont1/e/a/x.txt", "$base/unittest-cont1/e/a/y.txt",
- "$base/unittest-cont1/e/a/z.txt" ),
+ "$base/unittest-cont1/e/a/z.txt" ),
array( "contents xx", "contents xy", "contents xz" )
);
$this->assertEquals( true, $status->isOK(),
"Locking of files succeeded with OK status ($backendName)." );
}
+
+ $status = Status::newGood();
+ $sl = $this->backend->getScopedFileLocks( $paths, LockManager::LOCK_EX, $status );
+ $this->assertType( 'ScopedLock', $sl,
+ "Scoped locking of files succeeded ($backendName)." );
+ $this->assertEquals( array(), $status->errors,
+ "Scoped locking of files succeeded ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Scoped locking of files succeeded with OK status ($backendName)." );
+
+ ScopedLock::release( $sl );
+ $this->assertEquals( null, $sl,
+ "Scoped unlocking of files succeeded ($backendName)." );
+ $this->assertEquals( array(), $status->errors,
+ "Scoped unlocking of files succeeded ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Scoped unlocking of files succeeded with OK status ($backendName)." );
}
// test helper wrapper for backend prepare() function
* @group Database
*/
class JobQueueTest extends MediaWikiTestCase {
+ protected $key;
+ protected $queueRand, $queueRandTTL, $queueFifo, $queueFifoTTL;
protected $old = array();
function __construct( $name = null, array $data = array(), $dataName = '' ) {
}
protected function setUp() {
- global $wgMemc;
+ global $wgMemc, $wgJobTypeConf;
parent::setUp();
$this->old['wgMemc'] = $wgMemc;
$wgMemc = new HashBagOStuff();
- $this->queueRand = JobQueue::factory( array( 'class' => 'JobQueueDB',
- 'wiki' => wfWikiID(), 'type' => 'null', 'order' => 'random' ) );
- $this->queueRandTTL = JobQueue::factory( array( 'class' => 'JobQueueDB',
- 'wiki' => wfWikiID(), 'type' => 'null', 'order' => 'random', 'claimTTL' => 10 ) );
- $this->queueFifo = JobQueue::factory( array( 'class' => 'JobQueueDB',
- 'wiki' => wfWikiID(), 'type' => 'null', 'order' => 'fifo' ) );
- $this->queueFifoTTL = JobQueue::factory( array( 'class' => 'JobQueueDB',
- 'wiki' => wfWikiID(), 'type' => 'null', 'order' => 'fifo', 'claimTTL' => 10 ) );
+ if ( $this->getCliArg( 'use-jobqueue=' ) ) {
+ $name = $this->getCliArg( 'use-jobqueue=' );
+ if ( !isset( $wgJobTypeConf[$name] ) ) {
+ throw new MWException( "No \$wgJobTypeConf entry for '$name'." );
+ }
+ $baseConfig = $wgJobTypeConf[$name];
+ } else {
+ $baseConfig = array( 'class' => 'JobQueueDB' );
+ }
+ $baseConfig['type'] = 'null';
+ $baseConfig['wiki'] = wfWikiID();
+ $this->queueRand = JobQueue::factory(
+ array( 'order' => 'random', 'claimTTL' => 0 ) + $baseConfig );
+ $this->queueRandTTL = JobQueue::factory(
+ array( 'order' => 'random', 'claimTTL' => 10 ) + $baseConfig );
+ $this->queueFifo = JobQueue::factory(
+ array( 'order' => 'fifo', 'claimTTL' => 0 ) + $baseConfig );
+ $this->queueFifoTTL = JobQueue::factory(
+ array( 'order' => 'fifo', 'claimTTL' => 10 ) + $baseConfig );
+ if ( $baseConfig['class'] !== 'JobQueueDB' ) { // DB namespace with prefix or temp tables
+ foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
+ $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
+ }
+ }
}
protected function tearDown() {
$queue->ack( $job );
}
- $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
+ $this->assertFalse( $queue->pop(), "Queue is not empty ($desc)" );
$queue->flushCaches();
$this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
$name = $this->getCliArg( 'use-bagostuff=' );
$this->cache = ObjectCache::newFromId( $name );
+
} else {
// no type defined - use simple hash
$this->cache = new HashBagOStuff;
}
}
}
+
+ public function testAdd() {
+ $key = wfMemcKey( 'test' );
+ $this->assertTrue( $this->cache->add( $key, 'test' ) );
+ }
+
+ public function testGet() {
+ $value = array( 'this' => 'is', 'a' => 'test' );
+
+ $key = wfMemcKey( 'test' );
+ $this->cache->add( $key, $value );
+ $this->assertEquals( $this->cache->get( $key ), $value );
+ }
+
+ public function testGetMulti() {
+ $value1 = array( 'this' => 'is', 'a' => 'test' );
+ $value2 = array( 'this' => 'is', 'another' => 'test' );
+
+ $key1 = wfMemcKey( 'test1' );
+ $key2 = wfMemcKey( 'test2' );
+
+ $this->cache->add( $key1, $value1 );
+ $this->cache->add( $key2, $value2 );
+
+ $this->assertEquals( $this->cache->getMulti( array( $key1, $key2 ) ), array( $key1 => $value1, $key2 => $value2 ) );
+
+ // cleanup
+ $this->cache->delete( $key1 );
+ $this->cache->delete( $key2 );
+ }
}
# day
- /** @dataProvider MediaWikiProvide::Days */
+ /**
+ * @dataProvider MediaWikiProvide::Days
+ * @group Database
+ */
function testCurrentdayIsUnPadded( $day ) {
$this->assertUnPadded( 'currentday', $day );
}
- /** @dataProvider MediaWikiProvide::Days */
+ /**
+ * @dataProvider MediaWikiProvide::Days
+ * @group Database
+ */
function testCurrentdaytwoIsZeroPadded( $day ) {
$this->assertZeroPadded( 'currentday2', $day );
}
- /** @dataProvider MediaWikiProvide::Days */
+ /**
+ * @dataProvider MediaWikiProvide::Days
+ * @group Database
+ */
function testLocaldayIsUnPadded( $day ) {
$this->assertUnPadded( 'localday', $day );
}
- /** @dataProvider MediaWikiProvide::Days */
+ /**
+ * @dataProvider MediaWikiProvide::Days
+ * @group Database
+ */
function testLocaldaytwoIsZeroPadded( $day ) {
$this->assertZeroPadded( 'localday2', $day );
}
# month
- /** @dataProvider MediaWikiProvide::Months */
+ /**
+ * @dataProvider MediaWikiProvide::Months
+ * @group Database
+ */
function testCurrentmonthIsZeroPadded( $month ) {
$this->assertZeroPadded( 'currentmonth', $month );
}
- /** @dataProvider MediaWikiProvide::Months */
+ /**
+ * @dataProvider MediaWikiProvide::Months
+ * @group Database
+ */
function testCurrentmonthoneIsUnPadded( $month ) {
$this->assertUnPadded( 'currentmonth1', $month );
}
- /** @dataProvider MediaWikiProvide::Months */
+ /**
+ * @dataProvider MediaWikiProvide::Months
+ * @group Database
+ */
function testLocalmonthIsZeroPadded( $month ) {
$this->assertZeroPadded( 'localmonth', $month );
}
- /** @dataProvider MediaWikiProvide::Months */
+ /**
+ * @dataProvider MediaWikiProvide::Months
+ * @group Database
+ */
function testLocalmonthoneIsUnPadded( $month ) {
$this->assertUnPadded( 'localmonth1', $month );
}
# revision day
- /** @dataProvider MediaWikiProvide::Days */
+ /**
+ * @dataProvider MediaWikiProvide::Days
+ * @group Database
+ */
function testRevisiondayIsUnPadded( $day ) {
$this->assertUnPadded( 'revisionday', $day );
}
- /** @dataProvider MediaWikiProvide::Days */
+ /**
+ * @dataProvider MediaWikiProvide::Days
+ * @group Database
+ */
function testRevisiondaytwoIsZeroPadded( $day ) {
$this->assertZeroPadded( 'revisionday2', $day );
}
# revision month
- /** @dataProvider MediaWikiProvide::Months */
+ /**
+ * @dataProvider MediaWikiProvide::Months
+ * @group Database
+ */
function testRevisionmonthIsZeroPadded( $month ) {
$this->assertZeroPadded( 'revisionmonth', $month );
}
- /** @dataProvider MediaWikiProvide::Months */
+ /**
+ * @dataProvider MediaWikiProvide::Months
+ * @group Database
+ */
function testRevisionmonthoneIsUnPadded( $month ) {
$this->assertUnPadded( 'revisionmonth1', $month );
}
/**
* Rough tests for {{SERVERNAME}} magic word
* Bug 31176
+ * @group Database
*/
function testServernameFromDifferentProtocols() {
global $wgServer;
public $keepUploads = false;
public $runDisabled = false;
+ public $runParsoid = false;
public $regex = '';
public $showProgress = true;
public $savedInitialGlobals = array();
protected $file = false;
protected function setUp() {
- global $wgContLang, $wgLanguageCode;
global $wgNamespaceProtection, $wgNamespaceAliases;
global $wgHooks, $IP;
parent::setUp();
- $wgLanguageCode = 'en';
- $wgContLang = Language::factory( 'en' );
-
//Setup CLI arguments
if ( $this->getCliArg( 'regex=' ) ) {
$this->regex = $this->getCliArg( 'regex=' );
$tmpGlobals = array();
+ $tmpGlobals['wgLanguageCode'] = 'en';
+ $tmpGlobals['wgContLang'] = Language::factory( 'en' );
$tmpGlobals['wgScript'] = '/index.php';
$tmpGlobals['wgScriptPath'] = '/';
$tmpGlobals['wgArticlePath'] = '/wiki/$1';
* Set up the global variables for a consistent environment for each test.
* Ideally this should replace the global configuration entirely.
*/
- protected function setupGlobals( $opts = '', $config = '' ) {
+ protected function setupGlobals( $opts = array(), $config = '' ) {
global $wgFileBackends;
# Find out values for some special options.
$lang =
}
$settings = array(
- 'wgServer' => 'http://Britney-Spears',
+ 'wgServer' => 'http://example.org',
'wgScript' => '/index.php',
'wgScriptPath' => '/',
'wgArticlePath' => '/wiki/$1',
'wgRawHtml' => isset( $opts['rawhtml'] ),
'wgLang' => null,
'wgContLang' => null,
- 'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
+ 'wgNamespacesWithSubpages' => array( NS_MAIN => isset( $opts['subpage'] ) ),
'wgMaxTocLevel' => $maxtoclevel,
'wgCapitalLinks' => true,
'wgNoFollowLinks' => true,
/**
* @dataProvider provideValidNames
+ * @group Database
*/
function testTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
/**
* @dataProvider provideValidNames
+ * @group Database
*/
function testFunctionTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
<?php
/**
* @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
+ * @copyright Copyright © 2012-2013, Santhosh Thottingal
* @file
*/
/** @dataProvider providerPlural */
function testPlural( $result, $value ) {
- // The CLDR ticket for this plural forms is not same as mw plural forms. See http://unicode.org/cldr/trac/ticket/2883
- $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4', 'Form 5', 'Form 6' );
+ $forms = array( 'one', 'two', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
function providerPlural() {
- return array(
- array( 'Form 6', 0 ),
- array( 'Form 1', 1 ),
- array( 'Form 2', 2 ),
- array( 'Form 3', 11 ),
- array( 'Form 4', 12 ),
- array( 'Form 5', 3 ),
- array( 'Form 5', 19 ),
- array( 'Form 6', 200 ),
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'one', 11 ),
+ array( 'two', 12 ),
+ array( 'few', 3 ),
+ array( 'few', 19 ),
+ array( 'other', 200 ),
);
}
+ /** @dataProvider providerPluralExplicit */
+ function testExplicitPlural( $result, $value ) {
+ $forms = array( 'one', 'two', 'few', 'other', '11=Form11', '12=Form12' );
+ $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+ }
+
+ function providerPluralExplicit() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'Form11', 11 ),
+ array( 'Form12', 12 ),
+ array( 'few', 3 ),
+ array( 'few', 19 ),
+ array( 'other', 200 ),
+ );
+ }
}
/** @dataProvider providerPlural */
function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
+ $forms = array( 'zero', 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
function providerPlural() {
return array(
- array( 'other', 0 ), #this must be zero form as per CLDR
+ array( 'zero', 0 ),
array( 'one', 1 ),
array( 'other', 11 ),
array( 'one', 21 ),
*/
function testKnownCldrLanguageTag() {
if ( !class_exists( 'LanguageNames' ) ) {
- $this->markTestSkipped( 'reason' );
+ $this->markTestSkipped( 'The LanguageNames class is not available. The cldr extension is probably not installed.' );
}
$this->assertTrue(
}
function providePluralData() {
+ // Params are: [expected text, number given, [the plural forms]]
return array(
+ array( 'plural', 0, array(
+ 'singular', 'plural'
+ ) ),
array( 'explicit zero', 0, array(
'0=explicit zero', 'singular', 'plural'
) ),
array( 'plural', 3, array(
'0=explicit zero', '1=explicit one', 'singular', 'plural'
) ),
+ array( 'explicit eleven', 11, array(
+ 'singular', 'plural', '11=explicit eleven',
+ ) ),
+ array( 'plural', 12, array(
+ 'singular', 'plural', '11=explicit twelve',
+ ) ),
+ array( 'plural', 12, array(
+ 'singular', 'plural', '=explicit form',
+ ) ),
+ array( 'other', 2, array(
+ 'kissa=kala', '1=2=3', 'other',
+ ) ),
);
}
// Someone generated a MaintenanceFixup instance without calling
// simulateShutdown. We'd have to raise a PHPUnit exception to correctly
// flag this illegal usage. However, we are already in a destruktor, which
- // would trigger undefined behaviour. Hence, we can only report to the
+ // would trigger undefined behavior. Hence, we can only report to the
// error output :( Hopefully people read the PHPUnit output.
$name = $this->testCase->getName();
fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " for test $name "
// Although the following tests do not seem to be too consistent (compare for
// example the newlines within the test.*StringString tests, or the
// test.*Intermittent.* tests), the objective of these tests is not to describe
- // consistent behaviour, but rather currently existing behaviour.
+ // consistent behavior, but rather currently existing behavior.
function testOutputEmpty() {
/* Configuration */
-// Evaluate the include path relative to this file
-$IP = dirname( dirname( __DIR__ ) );
-
// Set a flag which can be used to detect when other scripts have been entered through this entry point or not
define( 'MW_PHPUNIT_TEST', true );
// Start up MediaWiki in command-line mode
-require_once( "$IP/maintenance/Maintenance.php" );
+require_once( dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php" );
class PHPUnitMaintClass extends Maintenance {
$wgLocaltimezone = 'UTC';
$wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
+
+ // Bug 44192 Do not attempt to send a real e-mail
+ Hooks::clear( 'AlternateUserMailer' );
+ Hooks::register( 'AlternateUserMailer',
+ function() { return false; }
+ );
}
public function execute() {
* </code>
*/
-$maintenanceDir = dirname( dirname( dirname( __DIR__ ) ) ) . '/maintenance';
-
-require( "$maintenanceDir/Maintenance.php" );
+require( __DIR__ . '/../../../maintenance/Maintenance.php' );
class GenerateJqueryMsgData extends Maintenance {
}
$maintClass = "GenerateJqueryMsgData";
-require_once( "$maintenanceDir/doMaintenance.php" );
+require_once( RUN_MAINTENANCE_IF_MAIN );
*/
header( 'Content-Type: text/javascript; charset=utf-8' );
-require_once '../../../includes/Xml.php';
+require_once __DIR__ . '/../../../includes/Xml.php';
$moduleImplementations = array(
'testUsesMissing' => "
liveMessages = mw.messages.values;
function freshConfigCopy( custom ) {
- // "deep=true" is important here.
- // Otherwise we just create a new object with values referring to live config.
- // e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
- // but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
- // was passed by reference in $.extend's loop.
- return $.extend( /*deep=*/true, {}, liveConfig, custom );
+ // Tests should mock all factors that directly influence the tested code.
+ // For backwards compatibility though we set mw.config to a copy of the live config
+ // and extend it with the (optionally) given custom settings for this test
+ // (instead of starting blank with only the given custmo settings).
+ // This is a shallow copy, so we don't end up with settings taking an array value
+ // extended with the custom settings - setting a config property means you override it,
+ // not extend it.
+ return $.extend( {}, liveConfig, custom );
}
function freshMessagesCopy( custom ) {
assert.deepEqual( $.colorUtil.getRGB( '#eEe' ), [238, 238, 238], 'Hex string: 3 char mixed' );
assert.deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [255, 255, 255], 'Zero rgba for Safari 3; Transparent (whitespace)' );
- // Perhaps this is a bug in colorUtil, but it is the current behaviour so, let's keep
+ // Perhaps this is a bug in colorUtil, but it is the current behavior so, let's keep
// track of it, so we will know in case it would ever change.
assert.strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
( function ( $ ) {
QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
- QUnit.test( 'devicePixelRatio', function ( assert ) {
+ QUnit.test( 'devicePixelRatio', 1, function ( assert ) {
var devicePixelRatio = $.devicePixelRatio();
assert.equal( typeof devicePixelRatio, 'number', '$.devicePixelRatio() returns a number' );
} );
- QUnit.test( 'matchSrcSet', function ( assert ) {
+ QUnit.test( 'matchSrcSet', 6, function ( assert ) {
var srcset = 'onefive.png 1.5x, two.png 2x';
// Nice exact matches
( function ( $ ) {
QUnit.module( 'jquery.mwExtension', QUnit.newMwEnvironment() );
- QUnit.test( 'String functions', function ( assert ) {
+ QUnit.test( 'String functions', 7, function ( assert ) {
assert.equal( $.trimLeft( ' foo bar ' ), 'foo bar ', 'trimLeft' );
assert.equal( $.trimRight( ' foo bar ' ), ' foo bar', 'trimRight' );
assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
} );
- QUnit.test( 'Is functions', function ( assert ) {
+ QUnit.test( 'Is functions', 15, function ( assert ) {
assert.strictEqual( $.isDomElement( document.getElementById( 'qunit-header' ) ), true,
'isDomElement: #qunit-header Node' );
assert.strictEqual( $.isDomElement( document.getElementById( 'random-name' ) ), false,
assert.strictEqual( $.isDomElement( { foo: 1 } ), false,
'isDomElement: Object' );
- assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmptry: "string"' );
- assert.strictEqual( $.isEmpty( '0' ), true, 'isEmptry: "0"' );
- assert.strictEqual( $.isEmpty( '' ), true, 'isEmptry: ""' );
- assert.strictEqual( $.isEmpty( 1 ), false, 'isEmptry: 1' );
- assert.strictEqual( $.isEmpty( [] ), true, 'isEmptry: []' );
- assert.strictEqual( $.isEmpty( {} ), true, 'isEmptry: {}' );
+ assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmpty: "string"' );
+ assert.strictEqual( $.isEmpty( '0' ), true, 'isEmpty: "0"' );
+ assert.strictEqual( $.isEmpty( '' ), true, 'isEmpty: ""' );
+ assert.strictEqual( $.isEmpty( 1 ), false, 'isEmpty: 1' );
+ assert.strictEqual( $.isEmpty( [] ), true, 'isEmpty: []' );
+ assert.strictEqual( $.isEmpty( {} ), true, 'isEmpty: {}' );
- // Documented behaviour
- assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmptry: { length: 0 }' );
+ // Documented behavior
+ assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmpty: { length: 0 }' );
} );
- QUnit.test( 'Comparison functions', function ( assert ) {
+ QUnit.test( 'Comparison functions', 5, function ( assert ) {
assert.ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, 'a', [], [2, 'b'] ] ),
'compareArray: Two deep arrays that are excactly the same' );
assert.ok( !$.compareArray( [1], [2] ), 'compareArray: Two different arrays (false)' );
assertBothModes( ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
mw.config.set( 'wgUserLanguage', 'en' );
- assertBothModes( ['formatnum-msg', '987654321.654321'], '987654321.654321', 'formatnum is resolved' );
+ assertBothModes( ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
// Test non-{{ wikitext, where behavior differs
mw.jqueryMsg.getMessageFunction = oldGMF;
} );
- formatnumTests = [
- {
- lang: 'en',
- number: 987654321.654321,
- result: '987654321.654321',
- description: 'formatnum test for English, decimal seperator'
- },
- {
- lang: 'ar',
- number: 987654321.654321,
- result: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١',
- description: 'formatnum test for Arabic, with decimal seperator'
- },
- {
- lang: 'ar',
- number: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١',
- result: 987654321,
- integer: true,
- description: 'formatnum test for Arabic, with decimal seperator, reverse'
- },
- {
- lang: 'ar',
- number: -12.89,
- result: '-١٢٫٨٩',
- description: 'formatnum test for Arabic, negative number'
- },
- {
- lang: 'ar',
- number: '-١٢٫٨٩',
- result: -12,
- integer: true,
- description: 'formatnum test for Arabic, negative number, reverse'
- },
- {
- lang: 'nl',
- number: 987654321.654321,
- result: '987654321,654321',
- description: 'formatnum test for Nederlands, decimal seperator'
- },
- {
- lang: 'nl',
- number: -12.89,
- result: '-12,89',
- description: 'formatnum test for Nederlands, negative number'
- },
- {
- lang: 'nl',
- number: 'invalidnumber',
- result: 'invalidnumber',
- description: 'formatnum test for Nederlands, invalid number'
- }
- ];
-
- QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
- mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
- $.each( formatnumTests, function ( i, test ) {
- QUnit.stop();
- getMwLanguage( test.lang, function ( langClass ) {
- QUnit.start();
- if ( !langClass ) {
- assert.ok( false, 'Language "' + test.lang + '" failed to load' );
- return;
- }
- mw.messages.set( test.message );
- mw.config.set( 'wgUserLanguage', test.lang );
- var parser = new mw.jqueryMsg.parser( { language: langClass } );
- assert.equal(
- parser.parse( test.integer ? 'formatnum-msg-int' : 'formatnum-msg',
- [ test.number ] ).html(),
- test.result,
- test.description
- );
- } );
+formatnumTests = [
+ {
+ lang: 'en',
+ number: 987654321.654321,
+ result: '987,654,321.654',
+ description: 'formatnum test for English, decimal seperator'
+ },
+ {
+ lang: 'ar',
+ number: 987654321.654321,
+ result: '٩٨٧٬٦٥٤٬٣٢١٫٦٥٤',
+ description: 'formatnum test for Arabic, with decimal seperator'
+ },
+ {
+ lang: 'ar',
+ number: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١',
+ result: 987654321,
+ integer: true,
+ description: 'formatnum test for Arabic, with decimal seperator, reverse'
+ },
+ {
+ lang: 'ar',
+ number: -12.89,
+ result: '-١٢٫٨٩',
+ description: 'formatnum test for Arabic, negative number'
+ },
+ {
+ lang: 'ar',
+ number: '-١٢٫٨٩',
+ result: -12,
+ integer: true,
+ description: 'formatnum test for Arabic, negative number, reverse'
+ },
+ {
+ lang: 'nl',
+ number: 987654321.654321,
+ result: '987.654.321,654',
+ description: 'formatnum test for Nederlands, decimal seperator'
+ },
+ {
+ lang: 'nl',
+ number: -12.89,
+ result: '-12,89',
+ description: 'formatnum test for Nederlands, negative number'
+ },
+ {
+ lang: 'nl',
+ number: '.89',
+ result: '0,89',
+ description: 'formatnum test for Nederlands'
+ },
+ {
+ lang: 'nl',
+ number: 'invalidnumber',
+ result: 'invalidnumber',
+ description: 'formatnum test for Nederlands, invalid number'
+ },
+ {
+ lang: 'ml',
+ number: '1000000000',
+ result: '1,00,00,00,000',
+ description: 'formatnum test for Malayalam'
+ },
+ {
+ lang: 'ml',
+ number: '-1000000000',
+ result: '-1,00,00,00,000',
+ description: 'formatnum test for Malayalam, negative number'
+ },
+ /*
+ * This will fail because of wrong pattern for ml in MW(different from CLDR)
+ {
+ lang: 'ml',
+ number: '1000000000.000',
+ result: '1,00,00,00,000.000',
+ description: 'formatnum test for Malayalam with decimal place'
+ },
+ */
+ {
+ lang: 'hi',
+ number: '123456789.123456789',
+ result: '१२,३४,५६,७८९',
+ description: 'formatnum test for Hindi'
+ },
+ {
+ lang: 'hi',
+ number: '१२,३४,५६,७८९',
+ result: '१२,३४,५६,७८९',
+ description: 'formatnum test for Hindi, Devanagari digits passed'
+ },
+ {
+ lang: 'hi',
+ number: '१२३४५६,७८९',
+ result: '123456',
+ integer: true,
+ description: 'formatnum test for Hindi, Devanagari digits passed to get integer value'
+ }
+];
+
+QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
+ mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' );
+ mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
+ $.each( formatnumTests, function ( i, test ) {
+ QUnit.stop();
+ getMwLanguage( test.lang, function ( langClass ) {
+ QUnit.start();
+ if ( !langClass ) {
+ assert.ok( false, 'Language "' + test.lang + '" failed to load' );
+ return;
+ }
+ mw.messages.set(test.message );
+ mw.config.set( 'wgUserLanguage', test.lang ) ;
+ var parser = new mw.jqueryMsg.parser( { language: langClass } );
+ assert.equal(
+ parser.parse( test.integer ? 'formatnum-msg-int' : 'formatnum-msg',
+ [ test.number ] ).html(),
+ test.result,
+ test.description
+ );
} );
} );
+} );
}( mediaWiki, jQuery ) );
( function ( mw, $ ) {
+ 'use strict';
QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment( {
setup: function () {
} );
}
+ // These tests run only for the current UI language.
var grammarTests = {
bs: [
{
word: 'тесть',
grammarForm: 'genitive',
expected: 'тестя',
- description: 'Grammar test for genitive case'
+ description: 'Grammar test for genitive case, тесть -> тестя'
},
{
word: 'привилегия',
grammarForm: 'genitive',
expected: 'привилегии',
- description: 'Grammar test for genitive case'
+ description: 'Grammar test for genitive case, привилегия -> привилегии'
},
{
word: 'установка',
grammarForm: 'genitive',
expected: 'установки',
- description: 'Grammar test for genitive case'
+ description: 'Grammar test for genitive case, установка -> установки'
},
{
word: 'похоти',
grammarForm: 'genitive',
expected: 'похотей',
- description: 'Grammar test for genitive case'
+ description: 'Grammar test for genitive case, похоти -> похотей'
},
{
word: 'доводы',
grammarForm: 'genitive',
expected: 'доводов',
- description: 'Grammar test for genitive case'
+ description: 'Grammar test for genitive case, доводы -> доводов'
},
{
word: 'песчаник',
grammarForm: 'genitive',
expected: 'песчаника',
- description: 'Grammar test for genitive case'
+ description: 'Grammar test for genitive case, песчаник -> песчаника'
+ },
+ {
+ word: 'данные',
+ grammarForm: 'genitive',
+ expected: 'данных',
+ description: 'Grammar test for genitive case, данные -> данных'
+ },
+ {
+ word: 'тесть',
+ grammarForm: 'prepositional',
+ expected: 'тесте',
+ description: 'Grammar test for prepositional case, тесть -> тесте'
+ },
+ {
+ word: 'привилегия',
+ grammarForm: 'prepositional',
+ expected: 'привилегии',
+ description: 'Grammar test for prepositional case, привилегия -> привилегии'
+ },
+ {
+ word: 'установка',
+ grammarForm: 'prepositional',
+ expected: 'установке',
+ description: 'Grammar test for prepositional case, установка -> установке'
+ },
+ {
+ word: 'похоти',
+ grammarForm: 'prepositional',
+ expected: 'похотях',
+ description: 'Grammar test for prepositional case, похоти -> похотях'
+ },
+ {
+ word: 'доводы',
+ grammarForm: 'prepositional',
+ expected: 'доводах',
+ description: 'Grammar test for prepositional case, доводы -> доводах'
+ },
+ {
+ word: 'песчаник',
+ grammarForm: 'prepositional',
+ expected: 'песчанике',
+ description: 'Grammar test for prepositional case, песчаник -> песчанике'
+ },
+ {
+ word: 'данные',
+ grammarForm: 'prepositional',
+ expected: 'данных',
+ description: 'Grammar test for prepositional case, данные -> данных'
}
],
-
hu: [
{
word: 'Wikipédiá',
assert.strictEqual( window.mw, window.mediaWiki, 'mw alias to mediaWiki' );
} );
- QUnit.test( 'mw.Map', 17, function ( assert ) {
+ QUnit.test( 'mw.Map', 27, function ( assert ) {
var arry, conf, funky, globalConf, nummy, someValues;
- assert.ok( mw.Map, 'mw.Map defined' );
-
conf = new mw.Map();
// Dummy variables
funky = function () {};
arry = [];
nummy = 7;
- // Tests for input validation
- assert.strictEqual( conf.get( 'inexistantKey' ), null, 'Map.get returns null if selection was a string and the key was not found' );
- assert.strictEqual( conf.set( 'myKey', 'myValue' ), true, 'Map.set returns boolean true if a value was set for a valid key string' );
+ // Single get and set
+
+ assert.strictEqual( conf.set( 'foo', 'Bar' ), true, 'Map.set returns boolean true if a value was set for a valid key string' );
+ assert.equal( conf.get( 'foo' ), 'Bar', 'Map.get returns a single value value correctly' );
+
+ assert.strictEqual( conf.get( 'example' ), null, 'Map.get returns null if selection was a string and the key was not found' );
+ assert.strictEqual( conf.get( 'example', arry ), arry, 'Map.get returns fallback by reference if the key was not found' );
+ assert.strictEqual( conf.get( 'example', undefined ), undefined, 'Map.get supports `undefined` as fallback instead of `null`' );
+
+ assert.strictEqual( conf.get( 'constructor' ), null, 'Map.get does not look at Object.prototype of internal storage (constructor)' );
+ assert.strictEqual( conf.get( 'hasOwnProperty' ), null, 'Map.get does not look at Object.prototype of internal storage (hasOwnProperty)' );
+
+ conf.set( 'hasOwnProperty', function () { return true; } );
+ assert.strictEqual( conf.get( 'example', 'missing' ), 'missing', 'Map.get uses neutral hasOwnProperty method (positive)' );
+
+ conf.set( 'example', 'Foo' );
+ conf.set( 'hasOwnProperty', function () { return false; } );
+ assert.strictEqual( conf.get( 'example' ), 'Foo', 'Map.get uses neutral hasOwnProperty method (negative)' );
+
+ assert.strictEqual( conf.set( 'constructor', 42 ), true, 'Map.set for key "constructor"' );
+ assert.strictEqual( conf.get( 'constructor' ), 42, 'Map.get for key "constructor"' );
+
+ assert.strictEqual( conf.set( 'ImUndefined', undefined ), true, 'Map.set allows setting value to `undefined`' );
+ assert.equal( conf.get( 'ImUndefined', 'fallback' ), undefined , 'Map.get supports retreiving value of `undefined`' );
+
assert.strictEqual( conf.set( funky, 'Funky' ), false, 'Map.set returns boolean false if key was invalid (Function)' );
assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
assert.strictEqual( conf.set( nummy, 'Nummy' ), false, 'Map.set returns boolean false if key was invalid (Number)' );
- assert.equal( conf.get( 'myKey' ), 'myValue', 'Map.get returns a single value value correctly' );
- assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
+
assert.strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
+ assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
+
+ conf.set( String( nummy ), 'I used to be a number' );
+
+ assert.strictEqual( conf.exists( 'doesNotExist' ), false, 'Map.exists where property does not exist' );
+ assert.strictEqual( conf.exists( 'ImUndefined' ), true, 'Map.exists where value is `undefined`' );
+ assert.strictEqual( conf.exists( nummy ), false, 'Map.exists where key is invalid but looks like an existing key' );
// Multiple values at once
someValues = {
'notExist': null
}, 'Map.get return includes keys that were not found as null values' );
- assert.strictEqual( conf.exists( 'foo' ), true, 'Map.exists returns boolean true if a key exists' );
- assert.strictEqual( conf.exists( 'notExist' ), false, 'Map.exists returns boolean false if a key does not exists' );
// Interacting with globals and accessing the values object
assert.strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
conf.set( 'globalMapChecker', 'Hi' );
- assert.ok( false === 'globalMapChecker' in window, 'new mw.Map did not store its values in the global window object by default' );
+ assert.ok( 'globalMapChecker' in window === false, 'new mw.Map did not store its values in the global window object by default' );
globalConf = new mw.Map( true );
globalConf.set( 'anotherGlobalMapChecker', 'Hello' );
assertMultipleFormats( ['grammar-msg'], ['text', 'parse'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar is resolved' );
assert.equal( mw.message( 'grammar-msg' ).escaped(), 'Przeszukaj ' + mw.html.escape( mw.config.get( 'wgSiteName' ) ), 'Grammar is resolved in escaped mode' );
- assertMultipleFormats( ['formatnum-msg', '987654321.654321'], ['text', 'parse', 'escaped'], '987654321.654321', 'formatnum is resolved' );
+ assertMultipleFormats( ['formatnum-msg', '987654321.654321'], ['text', 'parse', 'escaped'], '987,654,321.654', 'formatnum is resolved' );
assert.equal( mw.message( 'formatnum-msg' ).plain(), mw.messages.get( 'formatnum-msg' ), 'formatnum is not resolved in plain mode' );
assertMultipleFormats( ['int-msg'], ['text', 'parse', 'escaped'], 'Some Other Message', 'int is resolved' );
assert.equal( mw.msg( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar is resolved' );
- assert.equal( mw.msg( 'formatnum-msg', '987654321.654321' ), '987654321.654321', 'formatnum is resolved' );
+ assert.equal( mw.msg( 'formatnum-msg', '987654321.654321' ), '987,654,321.654', 'formatnum is resolved' );
assert.equal( mw.msg( 'int-msg' ), 'Some Other Message', 'int is resolved' );
} );
mw.loader.implement(
'test.implement.a',
function () {
- assert.equal(
- $element.css( 'float' ),
- 'right',
- 'style is applied'
- );
+ QUnit.stop();
+ setTimeout(function () {
+ assert.equal(
+ $element.css( 'float' ),
+ 'right',
+ 'style is applied'
+ );
+ QUnit.start();
+ });
},
{
'all': '.mw-test-implement-a { float: right; }'
mw.loader.implement(
'test.implement.c',
function () {
- assert.equal(
- $element.css( 'float' ),
- 'right',
- 'style is applied'
- );
+ QUnit.stop();
+ setTimeout(function () {
+ assert.equal(
+ $element.css( 'float' ),
+ 'right',
+ 'style is applied'
+ );
+ QUnit.start();
+ });
},
{
'all': '.mw-test-implement-c { float: right; }'
self::$url = $url;
}
- static public function getUrl() {
+ public static function getUrl() {
return self::$url;
}
const RESULT_OK = 2;
const RESULT_ERROR = 3;
- public abstract function addTests();
+ abstract public function addTests();
public function setUp() {
// Hack because because PHPUnit version 3.0.6 which is on prototype does not
*/
-require_once ( __DIR__ . '/' . 'MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
/**
* Test Case ID : 30 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
<?php
-
/**
* MediaWikiInstallerTestSuite
*
*
*/
-require_once 'PHPUnit/Framework.php';
+if ( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
require_once 'PHPUnit/Framework/TestSuite.php';
require_once ( __DIR__ . '/MediaWikiUserInterfaceTestCase.php' );
*
*/
-require_once ( __DIR__ . '/' . 'MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
/**
* Test Case ID : 01 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
*/
-require_once ( __DIR__ . '/' . 'MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
/**
* Test Case ID : 06 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
*/
-require_once ( __DIR__ . '/' . 'MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
/**
*/
-require_once ( __DIR__ . '/' . 'MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
/**
* Test Case ID : 11, 12 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
*
*/
-require_once ( __DIR__ . '/' . 'MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
/**
* Test Case ID : 14, 15, 16, 17 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
*/
-require_once ( __DIR__ . '/' . 'MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
/**
* Test Case ID : 05 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
*
*/
-require_once ( __DIR__ . '/' . 'MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
/**
* Test Case ID : 18 - 27 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
}
if ( ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
+ || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runParsoid )
|| !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] ) )
) {
# disabled test