# If using cascading deletes, we can skip some explicit deletes
if ( !$this->mDb->cascadingDeletes() ) {
- $this->mDb->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
-
# Delete outgoing links
$this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
$this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
* An operation which is not OK should have errors so that the user can be
* informed as to what went wrong. Calling the fatal() function sets an error
* message and simultaneously switches off the OK flag.
+ *
+ * The recommended pattern for Status objects is to return a Status object
+ * unconditionally, i.e. both on success and on failure -- so that the
+ * developer of the calling code is reminded that the function can fail, and
+ * so that a lack of error-handling will be explicit.
*/
class Status {
var $ok = true;
/**
* Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
*/
-interface Page {}
+interface Page {
+}
/**
* Class representing a MediaWiki article and history.
$db = wfGetDB( DB_SLAVE );
$revSelectFields = Revision::selectFields();
+ $row = null;
while ( $continue ) {
$row = $db->selectRow(
array( 'page', 'revision' ),
/**
* Get the last N authors
- * @param $num Integer: number of revisions to get
- * @param string $revLatest the latest rev_id, selected from the master (optional)
+ * @param int $num Number of revisions to get
+ * @param int|string $revLatest the latest rev_id, selected from the master (optional)
* @return array Array of authors, duplicates not removed
*/
public function getLastNAuthors( $num, $revLatest = 0 ) {
* The parser cache will be used if possible.
*
* @since 1.19
- * @param $parserOptions ParserOptions to use for the parse operation
- * @param $oldid Revision ID to get the text from, passing null or 0 will
+ * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
+ * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
* get the current revision (default value)
*
* @return ParserOutput or false if the revision was not found
* edit-already-exists error will be returned. These two conditions are also possible with
* auto-detection due to MediaWiki's performance-optimised locking strategy.
*
- * @param bool|\the $baseRevId the revision ID this edit was based off, if any
+ * @param bool|int $baseRevId the revision ID this edit was based off, if any
* @param $user User the user doing the edit
* @param $serialisation_format String: format for storing the content in the database
*
$editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
$serialized = $editInfo->pst;
+
+ /**
+ * @var Content $content
+ */
$content = $editInfo->pstContent;
$newsize = $content->getSize();
* Prepare content which is about to be saved.
* Returns a stdclass with source, pst and output members
*
- * @param \Content $content
- * @param null $revid
- * @param null|\User $user
- * @param null $serialization_format
+ * @param Content $content
+ * @param int|null $revid
+ * @param User|null $user
+ * @param string|null $serialization_format
*
* @return bool|object
*
* @since 1.21
*/
- public function prepareContentForEdit( Content $content, $revid = null, User $user = null, $serialization_format = null ) {
+ public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
+ $serialization_format = null
+ ) {
global $wgContLang, $wgUser;
$user = is_null( $user ) ? $wgUser : $user;
//XXX: check $user->getId() here???
ContentHandler::deprecated( __METHOD__, "1.21" );
$content = ContentHandler::makeContent( $text, $this->getTitle() );
- return $this->doQuickEditContent( $content, $user, $comment, $minor );
+ $this->doQuickEditContent( $content, $user, $comment, $minor );
}
/**
* The article must already exist; link tables etc
* are not updated, caches are not flushed.
*
- * @param $content Content: content submitted
- * @param $user User The relevant user
+ * @param Content $content Content submitted
+ * @param User $user The relevant user
* @param string $comment comment submitted
- * @param $serialisation_format String: format for storing the content in the database
- * @param $minor Boolean: whereas it's a minor modification
+ * @param string $serialisation_format Format for storing the content in the database
+ * @param bool $minor Whereas it's a minor modification
*/
- public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = 0, $serialisation_format = null ) {
+ public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
+ $serialisation_format = null
+ ) {
wfProfileIn( __METHOD__ );
$serialized = $content->serialize( $serialisation_format );
return $status;
}
+ if ( !$dbw->cascadingDeletes() ) {
+ $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
+ }
+
$this->doDeleteUpdates( $id, $content );
// Log the deletion, if the page was suppressed, log it at Oversight instead
public function viewUpdates() {
wfDeprecated( __METHOD__, '1.18' );
global $wgUser;
- return $this->doViewUpdates( $wgUser );
+ $this->doViewUpdates( $wgUser );
}
/**
/**
* Constructor
*
- * @param $page Page
+ * @param $page Page|WikiPage
* @param $revid Integer: ID of the revision being parsed
* @param $useParserCache Boolean: whether to use the parser cache
* @param $parserOptions parserOptions to use for the parse operation
*
* @param Title $t
*/
- public function setTitle( Title $t ) {
+ public function setTitle( $t ) {
+ if ( $t !== null && !$t instanceof Title ) {
+ throw new MWException( __METHOD__ . " expects an instance of Title" );
+ }
$this->title = $t;
}
*
* @param Title $t
*/
- public function setTitle( Title $t ) {
+ public function setTitle( $t ) {
+ if ( $t !== null && !$t instanceof Title ) {
+ throw new MWException( __METHOD__ . " expects an instance of Title" );
+ }
$this->title = $t;
// Erase the WikiPage so a new one with the new title gets created.
$this->wikipage = null;
'action' => 'query',
'redirects' => 'true'
) );
+
if ( !isset( $query['uselang'] ) ) { // uselang is unset or null
$query['uselang'] = $wgLanguageCode;
}
- if ( $this->mApiBase ) {
- $url = wfAppendQuery( $this->mApiBase, $query );
- } else {
- $url = $this->makeUrl( $query, 'api' );
- }
- if ( !isset( $this->mQueryCache[$url] ) ) {
- $key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) );
- $data = $wgMemc->get( $key );
- if ( !$data ) {
- $data = self::httpGet( $url );
- if ( !$data ) {
- return null;
- }
- $wgMemc->set( $key, $data, 3600 );
- }
+ $data = $this->httpGetCached( 'Metadata', $query );
- if ( count( $this->mQueryCache ) > 100 ) {
- // Keep the cache from growing infinitely
- $this->mQueryCache = array();
- }
- $this->mQueryCache[$url] = $data;
+ if ( $data ) {
+ return FormatJson::decode( $data, true );
+ } else {
+ return null;
}
- return FormatJson::decode( $this->mQueryCache[$url], true );
}
/**
function getInfo() {
$info = parent::getInfo();
$info['apiurl'] = $this->getApiUrl();
+
+ $query = array(
+ 'format' => 'json',
+ 'action' => 'query',
+ 'meta' => 'siteinfo',
+ 'siprop' => 'general',
+ );
+
+ $data = $this->httpGetCached( 'SiteInfo', $query, 7200 );
+
+ if ( $data ) {
+ $siteInfo = FormatJson::decode( $data, true );
+ $general = $siteInfo['query']['general'];
+
+ $info['articlepath'] = $general['articlepath'];
+ $info['server'] = $general['server'];
+ }
+
return $info;
}
}
}
+ /**
+ * HTTP GET request to a mediawiki API (with caching)
+ * @param $target string Used in cache key creation, mostly
+ * @param $query array The query parameters for the API request
+ * @param $cacheTTL int Time to live for the memcached caching
+ */
+ public function httpGetCached( $target, $query, $cacheTTL = 3600 ) {
+ if ( $this->mApiBase ) {
+ $url = wfAppendQuery( $this->mApiBase, $query );
+ } else {
+ $url = $this->makeUrl( $query, 'api' );
+ }
+
+ if ( !isset( $this->mQueryCache[$url] ) ) {
+ global $wgMemc;
+
+ $key = $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) );
+ $data = $wgMemc->get( $key );
+
+ if ( !$data ) {
+ $data = self::httpGet( $url );
+
+ if ( !$data ) {
+ return null;
+ }
+
+ $wgMemc->set( $key, $data, $cacheTTL );
+ }
+
+ if ( count( $this->mQueryCache ) > 100 ) {
+ // Keep the cache from growing infinitely
+ $this->mQueryCache = array();
+ }
+
+ $this->mQueryCache[$url] = $data;
+ }
+
+ return $this->mQueryCache[$url];
+ }
+
/**
* @param $callback Array|string
* @throws MWException
$text = wfMessage( $msg, $params )->parse();
$text = preg_replace( '/<a href="(.*?)".*?>(.*?)<\/a>/', '$2 <$1>', $text );
+
return html_entity_decode( strip_tags( $text ), ENT_QUOTES );
}
if ( !$this->specifiedScriptPath ) {
$this->showMessage( 'config-no-cli-uri', $this->getVar( "wgScriptPath" ) );
}
+
return parent::envCheckPath();
}
public function dirIsExecutable( $dir, $url ) {
$this->showMessage( 'config-no-cli-uploads-check', $dir );
+
return false;
}
}
$this->db->clearFlag( DBO_TRX );
$this->db->commit( __METHOD__ );
}
+
return $status;
}
if ( $this->db->tableExists( 'archive', __METHOD__ ) ) {
$status->warning( 'config-install-tables-exist' );
$this->enableLB();
+
return $status;
}
if ( $status->isOk() ) {
$this->enableLB();
}
+
return $status;
}
}
$up->purgeCache();
ob_end_flush();
+
return $ret;
}
* long after the constructor. Helpful for things like modifying setup steps :)
*/
public function preInstall() {
-
}
/**
* Allow DB installers a chance to make checks before upgrade.
*/
public function preUpgrade() {
-
}
/**
wfSuppressWarnings();
$compiled = wfDl( $name );
wfRestoreWarnings();
+
return $compiled;
}
} elseif ( isset( $internal[$var] ) ) {
$default = $internal[$var];
}
+
return $this->parent->getVar( $var, $default );
}
if ( !isset( $attribs ) ) {
$attribs = array();
}
+
return $this->parent->getTextBox( array(
'var' => $var,
'label' => $label,
if ( !isset( $attribs ) ) {
$attribs = array();
}
+
return $this->parent->getPasswordBox( array(
'var' => $var,
'label' => $label,
public function getCheckBox( $var, $label, $attribs = array(), $helpData = "" ) {
$name = $this->getName() . '_' . $var;
$value = $this->getVar( $var );
+
return $this->parent->getCheckBox( array(
'var' => $var,
'label' => $label,
'controlName' => $name,
'value' => $value,
'help' => $helpData
- ));
+ ) );
}
/**
public function getRadioSet( $params ) {
$params['controlName'] = $this->getName() . '_' . $params['var'];
$params['value'] = $this->getVar( $params['var'] );
+
return $this->parent->getRadioSet( $params );
}
if ( !$this->db->selectDB( $this->getVar( 'wgDBname' ) ) ) {
return false;
}
+
return $this->db->tableExists( 'cur', __METHOD__ ) || $this->db->tableExists( 'revision', __METHOD__ );
}
*/
public function submitInstallUserBox() {
$this->setVarsFromRequest( array( '_InstallUser', '_InstallPassword' ) );
+
return Status::newGood();
}
$s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
}
$s .= Html::closeElement( 'div' ) . Html::closeElement( 'fieldset' );
+
return $s;
}
if ( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
$status->warning( 'config-install-interwiki-exists' );
+
return $status;
}
global $IP;
);
}
$this->db->insert( 'interwiki', $interwikis, __METHOD__ );
+
return Status::newGood();
}
$type = $db->getType();
if ( in_array( $type, Installer::getDBTypes() ) ) {
$class = ucfirst( $type ) . 'Updater';
+
return new $class( $db, $shared, $maintenance );
} else {
throw new MWException( __METHOD__ . ' called for unsupported $wgDBtype' );
array( 'ul_key' => $key ),
__METHOD__
);
+
return (bool)$row;
}
foreach ( $wgExtNewFields as $fieldRecord ) {
$updates[] = array(
'addField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2], true
+ $fieldRecord[2], true
);
}
foreach ( $wgExtNewIndexes as $fieldRecord ) {
$updates[] = array(
'addIndex', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2], true
+ $fieldRecord[2], true
);
}
foreach ( $wgExtModifiedFields as $fieldRecord ) {
$updates[] = array(
'modifyField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2], true
+ $fieldRecord[2], true
);
}
if ( fwrite( $this->fileHandle, $line ) === false ) {
throw new MWException( "trouble writing file" );
}
+
return false;
}
}
if ( $this->skipSchema ) {
$this->output( "...skipping schema change ($msg).\n" );
+
return false;
}
$this->db->sourceFile( $path );
}
$this->output( "done.\n" );
+
return true;
}
} else {
return $this->applyPatch( $patch, $fullpath, "Creating $name table" );
}
+
return true;
}
} else {
return $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
}
+
return true;
}
} else {
return $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
}
+
return true;
}
} else {
$this->output( "...$table table does not contain $field field.\n" );
}
+
return true;
}
} else {
$this->output( "...$index key doesn't exist.\n" );
}
+
return true;
}
// First requirement: the table must exist
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
$this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+
return true;
}
$this->output( "...WARNING: $oldIndex still exists, despite it has been renamed into $newIndex (which also exists).\n" .
" $oldIndex should be manually removed if not needed anymore.\n" );
}
+
return true;
}
// Third requirement: the old index must exist
if ( !$this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
$this->output( "...skipping: index $oldIndex doesn't exist.\n" );
+
return true;
}
$this->output( "$msg ..." );
$this->db->dropTable( $table, __METHOD__ );
$this->output( "done.\n" );
- }
- else {
+ } else {
return $this->applyPatch( $patch, $fullpath, $msg );
}
} else {
$this->output( "...$table doesn't exist.\n" );
}
+
return true;
}
$this->output( "...$field in table $table already modified by patch $patch.\n" );
} else {
$this->insertUpdateRow( $updateKey );
+
return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
}
+
return true;
}
$this->output( "missing ss_total_pages, rebuilding...\n" );
} else {
$this->output( "done.\n" );
+
return;
}
SiteStatsInit::doAllAndCommit( $this->db );
protected function doLogUsertextPopulation() {
if ( !$this->updateRowExists( 'populate log_usertext' ) ) {
$this->output(
- "Populating log_user_text field, printing progress markers. For large\n" .
- "databases, you may want to hit Ctrl-C and do this manually with\n" .
- "maintenance/populateLogUsertext.php.\n" );
+ "Populating log_user_text field, printing progress markers. For large\n" .
+ "databases, you may want to hit Ctrl-C and do this manually with\n" .
+ "maintenance/populateLogUsertext.php.\n"
+ );
$task = $this->maintenance->runChild( 'PopulateLogUsertext' );
$task->execute();
protected function doUpdateTranscacheField() {
if ( $this->updateRowExists( 'convert transcache field' ) ) {
$this->output( "...transcache tc_time already converted.\n" );
+
return true;
}
'COUNT(*)',
'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
__METHOD__
- ) == 0 ) {
- $this->output( "...collations up-to-date.\n" );
- return;
+ ) == 0
+ ) {
+ $this->output( "...collations up-to-date.\n" );
+
+ return;
}
$this->output( "Updating category collations..." );
class InstallDocFormatter {
static function format( $text ) {
$obj = new self( $text );
+
return $obj->execute();
}
$text = preg_replace_callback( '/bug (\d+)/', array( $this, 'replaceBugLinks' ), $text );
// add links to manual to every global variable mentioned
$text = preg_replace_callback( '/(\$wg[a-z0-9_]+)/i', array( $this, 'replaceConfigLinks' ), $text );
+
return $text;
}
* @author Rachitrali
*/
$messages['khw'] = array(
- 'mainpagetext' => "\"<big>'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''</big>\"",
+ 'mainpagetext' => "'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''",
);
/** Kirmanjki (Kırmancki)
Jei atsisiuntimas nebuvo pasiūlytas, arba jį atšaukėte, galite iš naujo atsisiųsti paspaudę žemiau esančią nuorodą:
-<span class=\"notranslate\" versti=\"no\">\$3</span>
+$3
'''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.
-Kai baigsite, jūs galėsite '''[\$2 įeiti į savo wiki]'''.",
+Kai baigsite, jūs galėsite '''[$2 įeiti į savo wiki]'''.",
'config-download-localsettings' => 'Atsisiųsti <code>LocalSettings.php</code>',
'config-help' => 'pagalba',
'mainpagetext' => "'''MediaWiki sėkmingai įdiegta.'''",
Імовірно, це замало.
Встановлення може не вдатись!",
'config-ctype' => "'''Помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/ctype.installation.php розширення Ctype].",
+ 'config-json' => "'''Fatal:''' PHP був скомпільований без підтримки JSON.
+Вам потрібно встановити або розширення PHP JSON або розширення[http://pecl.php.net/package/jsonc PECL jsonc] перед встановлення Медіавікі.
+* Розширення PHP включено у Red Hat Enterprise Linux (CentOS) 5 та 6, хоча має бути доступним у <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.
+* Деякі дистрибутиви Лінукса, випущені після травня 2013, пропустили розширення PHP, натомість упакували розширення PECL як <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] встановлено',
'config-apc' => '[http://www.php.net/apc APC] встановлено',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] встановлено',
*/
protected $settings;
-
/**
* List of detected DBs, access using getCompiledDBs().
*
if ( file_exists( "$IP/AdminSettings.php" ) ) {
require "$IP/AdminSettings.php";
}
+
return get_defined_vars();
}
'ss_users' => 0,
'ss_images' => 0 ),
__METHOD__, 'IGNORE' );
+
return Status::newGood();
}
$databases = $this->getCompiledDBs();
- $databases = array_flip ( $databases );
+ $databases = array_flip( $databases );
foreach ( array_keys( $databases ) as $db ) {
$installer = $this->getDBInstaller( $db );
$status = $installer->checkPrerequisites();
$databases = array_flip( $databases );
if ( !$databases ) {
$this->showError( 'config-no-db', $wgLang->commaList( $allNames ) );
+
// @todo FIXME: This only works for the web installer!
return false;
}
+
return true;
}
$test = new PhpXmlBugTester();
if ( !$test->ok ) {
$this->showError( 'config-brokenlibxml' );
+
return false;
}
+
return true;
}
$test->execute();
if ( !$test->ok ) {
$this->showError( 'config-using531', phpversion() );
+
return false;
}
+
return true;
}
protected function envCheckMagicQuotes() {
if ( wfIniGetBool( "magic_quotes_runtime" ) ) {
$this->showError( 'config-magic-quotes-runtime' );
+
return false;
}
+
return true;
}
protected function envCheckMagicSybase() {
if ( wfIniGetBool( 'magic_quotes_sybase' ) ) {
$this->showError( 'config-magic-quotes-sybase' );
+
return false;
}
+
return true;
}
protected function envCheckMbstring() {
if ( wfIniGetBool( 'mbstring.func_overload' ) ) {
$this->showError( 'config-mbstring' );
+
return false;
}
+
return true;
}
protected function envCheckZE1() {
if ( wfIniGetBool( 'zend.ze1_compatibility_mode' ) ) {
$this->showError( 'config-ze1' );
+
return false;
}
+
return true;
}
$this->setVar( '_SafeMode', true );
$this->showMessage( 'config-safe-mode' );
}
+
return true;
}
protected function envCheckXML() {
if ( !function_exists( "utf8_encode" ) ) {
$this->showError( 'config-xml-bad' );
+
return false;
}
+
return true;
}
protected function envCheckPCRE() {
if ( !function_exists( 'preg_match' ) ) {
$this->showError( 'config-pcre' );
+
return false;
}
wfSuppressWarnings();
wfRestoreWarnings();
if ( $regexd != '--' || $regexprop != '--' ) {
$this->showError( 'config-pcre-no-utf8' );
+
return false;
}
+
return true;
}
$this->setVar( '_RaiseMemory', true );
}
}
+
return true;
}
if ( self::apacheModulePresent( 'mod_security' ) ) {
$this->showMessage( 'config-mod-security' );
}
+
return true;
}
$this->setVar( 'wgDiff3', false );
$this->showMessage( 'config-diff3-bad' );
}
+
return true;
}
if ( $convert ) {
$this->setVar( 'wgImageMagickConvertCommand', $convert );
$this->showMessage( 'config-imagemagick', $convert );
+
return true;
} elseif ( function_exists( 'imagejpeg' ) ) {
$this->showMessage( 'config-gd' );
-
} else {
$this->showMessage( 'config-no-scaling' );
}
+
return true;
}
$this->setVar( 'wgGitBin', false );
$this->showMessage( 'config-git-bad' );
}
+
return true;
}
$server = $this->envGetDefaultServer();
$this->showMessage( 'config-using-server', $server );
$this->setVar( 'wgServer', $server );
+
return true;
}
$this->setVar( 'IP', $IP );
$this->showMessage( 'config-using-uri', $this->getVar( 'wgServer' ), $this->getVar( 'wgScriptPath' ) );
+
return true;
}
$ext = 'php';
}
$this->setVar( 'wgScriptExtension', ".$ext" );
+
return true;
}
# Try the current value of LANG.
if ( isset( $candidatesByLocale[getenv( 'LANG' )] ) ) {
$this->setVar( 'wgShellLocale', getenv( 'LANG' ) );
+
return true;
}
foreach ( $commonLocales as $commonLocale ) {
if ( isset( $candidatesByLocale[$commonLocale] ) ) {
$this->setVar( 'wgShellLocale', $commonLocale );
+
return true;
}
}
if ( isset( $candidatesByLang[$wikiLang] ) ) {
$m = reset( $candidatesByLang[$wikiLang] );
$this->setVar( 'wgShellLocale', $m[0] );
+
return true;
}
if ( count( $candidatesByLocale ) ) {
$m = reset( $candidatesByLocale );
$this->setVar( 'wgShellLocale', $m[0] );
+
return true;
}
if ( !$safe ) {
$this->showMessage( 'config-uploads-not-safe', $dir );
}
+
return true;
}
// Only warn if the value is below the sane 1024
$this->showMessage( 'config-suhosin-max-value-length', $maxValueLength );
}
+
return true;
}
protected function envCheckCtype() {
if ( !function_exists( 'ctype_digit' ) ) {
$this->showError( 'config-ctype' );
+
return false;
}
+
return true;
}
protected function envCheckJSON() {
if ( !function_exists( 'json_decode' ) ) {
$this->showError( 'config-json' );
+
return false;
}
+
return true;
}
* @param string $path path to search
* @param array $names of executable names
* @param $versionInfo Boolean false or array with two members:
- * 0 => Command to run for version check, with $1 for the full executable name
- * 1 => String to compare the output with
+ * 0 => Command to run for version check, with $1 for the full executable name
+ * 1 => String to compare the output with
*
* If $versionInfo is not false, only executables with a version
* matching $versionInfo[1] will be returned.
}
}
}
+
return false;
}
return $exe;
}
}
+
return false;
}
try {
$text = Http::get( $url . $file, array( 'timeout' => 3 ) );
- }
- catch ( MWException $e ) {
+ } catch ( MWException $e ) {
// Http::get throws with allow_url_fopen = false and no curl extension.
$text = null;
}
if ( $text == 'exec' ) {
wfRestoreWarnings();
+
return $ext;
}
}
ob_start();
phpinfo( INFO_MODULES );
$info = ob_get_clean();
+
return strpos( $info, $moduleName ) !== false;
}
*/
protected function getInstallSteps( DatabaseInstaller $installer ) {
$coreInstallSteps = array(
- array( 'name' => 'database', 'callback' => array( $installer, 'setupDatabase' ) ),
- array( 'name' => 'tables', 'callback' => array( $installer, 'createTables' ) ),
- array( 'name' => 'interwiki', 'callback' => array( $installer, 'populateInterwikiTable' ) ),
- array( 'name' => 'stats', 'callback' => array( $this, 'populateSiteStats' ) ),
- array( 'name' => 'keys', 'callback' => array( $this, 'generateKeys' ) ),
- array( 'name' => 'sysop', 'callback' => array( $this, 'createSysop' ) ),
- array( 'name' => 'mainpage', 'callback' => array( $this, 'createMainpage' ) ),
+ array( 'name' => 'database', 'callback' => array( $installer, 'setupDatabase' ) ),
+ array( 'name' => 'tables', 'callback' => array( $installer, 'createTables' ) ),
+ array( 'name' => 'interwiki', 'callback' => array( $installer, 'populateInterwikiTable' ) ),
+ array( 'name' => 'stats', 'callback' => array( $this, 'populateSiteStats' ) ),
+ array( 'name' => 'keys', 'callback' => array( $this, 'generateKeys' ) ),
+ array( 'name' => 'sysop', 'callback' => array( $this, 'createSysop' ) ),
+ array( 'name' => 'mainpage', 'callback' => array( $this, 'createMainpage' ) ),
);
// Build the array of install steps starting from the core install list,
'callback' => array( $installer, 'createExtensionTables' )
);
}
+
return $this->installSteps;
}
if ( $status->isOk() ) {
$this->setVar( '_InstallDone', true );
}
+
return $installResults;
}
if ( strval( $this->getVar( 'wgUpgradeKey' ) ) === '' ) {
$keys['wgUpgradeKey'] = 16;
}
+
return $this->doGenerateKeys( $keys );
}
);
$page->doEditContent( $content,
- '',
- EDIT_NEW,
- false,
- User::newFromName( 'MediaWiki default' ) );
+ '',
+ EDIT_NEW,
+ false,
+ User::newFromName( 'MediaWiki default' )
+ );
} catch ( MWException $e ) {
//using raw, because $wgShowExceptionDetails can not be set yet
$status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
}
$mcservers = $this->buildMemcachedServerList();
+
return "<?php
# This file was automatically generated by the MediaWiki {$GLOBALS['wgVersion']}
# installer. If you make manual changes, please keep track in case you
{$groupRights}";
}
-
}
} catch ( DBConnectionError $e ) {
$status->fatal( 'config-connection-error', $e->getMessage() );
}
+
return $status;
}
$status = $this->getConnection();
if ( !$status->isOK() ) {
$this->parent->showStatusError( $status );
+
return;
}
/**
}
}
$engines = array_intersect( $this->supportedEngines, $engines );
+
return $engines;
}
// Can't grant everything
return false;
}
+
return true;
}
$s .= Xml::openElement( 'div', array(
'id' => 'dbMyisamWarning'
- ));
+ ) );
$myisamWarning = 'config-mysql-myisam-dep';
if ( count( $engines ) === 1 ) {
$myisamWarning = 'config-mysql-only-myisam-dep';
'class' => 'hideShowRadio',
'rel' => 'dbMyisamWarning'
)
- )));
+ )
+ ) );
$s .= $this->parent->getHelpBox( 'config-mysql-engine-help' );
}
'label' => 'config-mysql-charset',
'itemLabelPrefix' => 'config-mysql-',
'values' => $charsets
- ));
+ ) );
$s .= $this->parent->getHelpBox( 'config-mysql-charset-help' );
}
if ( !in_array( $this->getVar( '_MysqlCharset' ), $charsets ) ) {
$this->setVar( '_MysqlCharset', reset( $charsets ) );
}
+
return Status::newGood();
}
$conn->selectDB( $dbName );
}
$this->setupSchemaVars();
+
return $status;
}
try {
$res = $this->db->selectRow( 'mysql.user', array( 'Host', 'User' ),
array( 'Host' => $host, 'User' => $user ), __METHOD__ );
+
return (bool)$res;
} catch ( DBQueryError $dqe ) {
return false;
}
-
}
/**
if ( $this->getVar( '_MysqlCharset' ) !== null ) {
$options[] = 'DEFAULT CHARSET=' . $this->getVar( '_MysqlCharset' );
}
+
return implode( ', ', $options );
}
$dbmysql5 = wfBoolToStr( $this->getVar( 'wgDBmysql5', true ) );
$prefix = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBprefix' ) );
$tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
- return
-"# MySQL specific settings
+
+ return "# MySQL specific settings
\$wgDBprefix = \"{$prefix}\";
# MySQL table options to use during installation or update
foreach ( $info as $row ) {
if ( $row->Column_name == $field ) {
$this->output( "...index $index on table $table includes field $field.\n" );
+
return true;
}
}
}
$this->output( "...index $index on table $table has no field $field; added.\n" );
+
return false;
}
if ( $this->db->tableExists( "interwiki", __METHOD__ ) ) {
$this->output( "...already have interwiki table\n" );
+
return;
}
}
if ( $meta->isMultipleKey() ) {
$this->output( "...indexes seem up to 20031107 standards.\n" );
+
return;
}
$info = $this->db->fieldInfo( 'imagelinks', 'il_from' );
if ( !$info || $info->type() !== 'string' ) {
$this->output( "...il_from OK\n" );
+
return;
}
$nontalk = $this->db->selectField( 'watchlist', 'count(*)', 'NOT (wl_namespace & 1)', __METHOD__ );
if ( $talk == $nontalk ) {
$this->output( "...watchlist talk page rows already present.\n" );
+
return;
}
function doSchemaRestructuring() {
if ( $this->db->tableExists( 'page', __METHOD__ ) ) {
$this->output( "...page table already exists.\n" );
+
return;
}
$this->output( sprintf( "<b> %-60s %3s %5s</b>\n", 'Title', 'NS', 'Count' ) );
$duplicate = array();
foreach ( $rows as $row ) {
- if ( ! isset( $duplicate[$row->cur_namespace] ) ) {
+ if ( !isset( $duplicate[$row->cur_namespace] ) ) {
$duplicate[$row->cur_namespace] = array();
}
$duplicate[$row->cur_namespace][] = $row->cur_title;
protected function doPagelinksUpdate() {
if ( $this->db->tableExists( 'pagelinks', __METHOD__ ) ) {
$this->output( "...already have pagelinks table.\n" );
+
return;
}
$duper = new UserDupes( $this->db, array( $this, 'output' ) );
if ( $duper->hasUniqueIndex() ) {
$this->output( "...already have unique user_name index.\n" );
+
return;
}
} else {
$this->output( "...user_groups table exists and is in current format.\n" );
}
+
return;
}
$this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
$this->output( "*** You may need to manually configure some sysops by manipulating\n" );
$this->output( "*** the user_groups table.\n" );
+
return;
}
}
}
if ( $info->isNullable() ) {
$this->output( "...wl_notificationtimestamp is already nullable.\n" );
+
return;
}
protected function doTemplatelinksUpdate() {
if ( $this->db->tableExists( 'templatelinks', __METHOD__ ) ) {
$this->output( "...templatelinks table already exists\n" );
+
return;
}
'tl_title' => $row->pl_title,
), __METHOD__
);
-
}
} else {
// Fast update
protected function doBacklinkingIndicesUpdate() {
if ( !$this->indexHasField( 'pagelinks', 'pl_namespace', 'pl_from' ) ||
!$this->indexHasField( 'templatelinks', 'tl_namespace', 'tl_from' ) ||
- !$this->indexHasField( 'imagelinks', 'il_to', 'il_from' ) )
- {
+ !$this->indexHasField( 'imagelinks', 'il_to', 'il_from' )
+ ) {
$this->applyPatch( 'patch-backlinkindexes.sql', false, "Updating backlinking indices" );
}
}
protected function doRestrictionsUpdate() {
if ( $this->db->tableExists( 'page_restrictions', __METHOD__ ) ) {
$this->output( "...page_restrictions table already exists.\n" );
+
return;
}
protected function doCategoryPopulation() {
if ( $this->updateRowExists( 'populate category' ) ) {
$this->output( "...category table already populated.\n" );
+
return;
}
return true;
}
- if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+ if ( $wgProfileToDatabase === true && !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
$this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
}
}
return true;
} elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
$this->output( "...profiling table has pf_memory field.\n" );
+
return true;
}
+
return $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
}
if ( !$info ) {
$this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
}
+
return true;
}
$info = $this->db->indexInfo( 'pagelinks', 'pl_namespace' );
if ( is_array( $info ) && !$info[0]->Non_unique ) {
$this->output( "...pl_namespace, tl_namespace, il_to indices are already UNIQUE.\n" );
+
return true;
}
if ( $this->skipSchema ) {
$this->output( "...skipping schema change (making pl_namespace, tl_namespace and il_to indices UNIQUE).\n" );
+
return false;
}
protected function doUpdateMimeMinorField() {
if ( $this->updateRowExists( 'mime_minor_length' ) ) {
$this->output( "...*_mime_minor fields are already long enough.\n" );
+
return;
}
protected function doClFieldsUpdate() {
if ( $this->updateRowExists( 'cl_fields_update' ) ) {
$this->output( "...categorylinks up-to-date.\n" );
+
return;
}
}
if ( $info->isNullable() ) {
$this->output( "...user_last_timestamp is already nullable.\n" );
+
return;
}
$info = $this->db->indexInfo( 'iwlinks', 'iwl_prefix_title_from' );
if ( is_array( $info ) && $info[0]->Non_unique ) {
$this->output( "...iwl_prefix_title_from index is already non-UNIQUE.\n" );
+
return true;
}
if ( $this->skipSchema ) {
$this->output( "...skipping schema change (making iwl_prefix_title_from index non-UNIQUE).\n" );
+
return false;
}
if ( $this->getVar( 'wgDBserver' ) == 'localhost' ) {
$this->parent->setVar( 'wgDBserver', '' );
}
+
return $this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) .
Html::openElement( 'fieldset' ) .
Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
public function submitInstallUserBox() {
parent::submitInstallUserBox();
$this->parent->setVar( '_InstallDBname', $this->getVar( '_InstallUser' ) );
+
return Status::newGood();
}
$this->connError = $e->db->lastErrno();
$status->fatal( 'config-connection-error', $e->getMessage() );
}
+
return $status;
}
$this->connError = $e->db->lastErrno();
$status->fatal( 'config-connection-error', $e->getMessage() );
}
+
return $status;
}
$this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
$retVal = parent::needsUpgrade();
$this->parent->setVar( 'wgDBname', $tempDBname );
+
return $retVal;
}
public function setupDatabase() {
$status = Status::newGood();
+
return $status;
}
foreach ( $varNames as $name ) {
$vars[$name] = $this->getVar( $name );
}
+
return $vars;
}
public function getLocalSettings() {
$prefix = $this->getVar( 'wgDBprefix' );
- return
-"# Oracle specific settings
+
+ return "# Oracle specific settings
\$wgDBprefix = \"{$prefix}\";
";
}
$isValid |= preg_match( '/^(?:\/\/)?[\w\-\.]+(?::[\d]+)?(?:\/(?:[\w\-\.]+(?::(pooled|dedicated|shared))?)?(?:\/[\w\-\.]+)?)?$/', $connect_string ); // EZConnect
return (bool)$isValid;
}
-
}
$row = $meta->fetchRow();
if ( $row['column_name'] == 'PR_ID' ) {
$this->output( "seems to be up to date.\n" );
+
return;
}
$this->db->delete( '/*Q*/' . $this->db->tableName( 'objectcache' ), '*', __METHOD__ );
$this->output( "done.\n" );
}
-
}
class PhpXmlBugTester {
private $parsedData = '';
public $ok = false;
+
public function __construct() {
$charData = '<b>c</b>';
$xml = '<a>' . htmlspecialchars( $charData ) . '</a>';
$parsedOk = xml_parse( $parser, $xml, true );
$this->ok = $parsedOk && ( $this->parsedData == $charData );
}
+
public function chardata( $parser, $data ) {
$this->parsedData .= $data;
}
$this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
$this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
+
return Status::newGood();
}
if ( $status->isOK() ) {
$this->db = $status->value;
}
+
return $status;
}
} catch ( DBConnectionError $e ) {
$status->fatal( 'config-connection-error', $e->getMessage() );
}
+
return $status;
}
$conn->commit( __METHOD__ );
$this->pgConns[$type] = $conn;
}
+
return $status;
}
$safeRole = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
$conn->query( "SET ROLE $safeRole" );
}
+
return $status;
default:
throw new MWException( "Invalid special connection type: \"$type\"" );
$row = $conn->selectRow( '"pg_catalog"."pg_roles"', '*',
array( 'rolname' => $superuser ), __METHOD__ );
+
return $row;
}
if ( !$perms ) {
return false;
}
+
return $perms->rolsuper === 't' || $perms->rolcreaterole === 't';
}
if ( !$perms ) {
return false;
}
+
return $perms->rolsuper === 't';
}
} else {
$msg = 'config-install-user-missing';
}
+
return Status::newFatal( $msg, $this->getVar( 'wgDBuser' ) );
}
}
}
}
+
return false;
}
$safedb = $conn->addIdentifierQuotes( $dbName );
$conn->query( "CREATE DATABASE $safedb", __METHOD__ );
}
+
return Status::newGood();
}
// Select the new schema in the current connection
$conn->determineCoreSchema( $schema );
+
return Status::newGood();
}
function commitChanges() {
$this->db->commit( __METHOD__ );
+
return Status::newGood();
}
function getLocalSettings() {
$port = $this->getVar( 'wgDBport' );
$schema = $this->getVar( 'wgDBmwschema' );
- return
-"# Postgres specific settings
+
+ return "# Postgres specific settings
\$wgDBport = \"{$port}\";
\$wgDBmwschema = \"{$schema}\";";
}
if ( $conn->tableExists( 'archive' ) ) {
$status->warning( 'config-install-tables-exist' );
$this->enableLB();
+
return $status;
}
if ( !$conn->schemaExists( $schema ) ) {
$status->fatal( 'config-install-pg-schema-not-exist' );
+
return $status;
}
$error = $conn->sourceFile( $conn->getSchemaPath() );
if ( $status->isOk() ) {
$this->enableLB();
}
+
return $status;
}
} else {
return Status::newFatal( 'config-pg-no-plpgsql', $this->getVar( 'wgDBname' ) );
}
+
return Status::newGood();
}
}
# Add missing extension fields
foreach ( $wgExtPGNewFields as $fieldRecord ) {
$updates[] = array(
- 'addPgField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2]
- );
+ 'addPgField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
}
# Change altered columns
foreach ( $wgExtPGAlteredFields as $fieldRecord ) {
$updates[] = array(
- 'changeField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2]
- );
+ 'changeField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
}
# Add missing extension indexes
foreach ( $wgExtNewIndexes as $fieldRecord ) {
$updates[] = array(
- 'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2]
- );
+ 'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
}
return $updates;
AND relname=%s AND nspname=%s
END;
$res = $this->db->query( sprintf( $q,
- $this->db->addQuotes( $table ),
- $this->db->addQuotes( $this->db->getCoreSchema() ) ) );
+ $this->db->addQuotes( $table ),
+ $this->db->addQuotes( $this->db->getCoreSchema() ) ) );
if ( !$res ) {
return null;
}
$cols = array();
foreach ( $res as $r ) {
$cols[] = array(
- "name" => $r[0],
- "ord" => $r[1],
- );
+ "name" => $r[0],
+ "ord" => $r[1],
+ );
}
+
return $cols;
}
if ( !( $row = $this->db->fetchRow( $r ) ) ) {
return null;
}
+
return $row[0];
}
function ruleDef( $table, $rule ) {
- $q = <<<END
+ $q = <<<END
SELECT definition FROM pg_rules
WHERE schemaname = %s
AND tablename = %s
return null;
}
$d = $row[0];
+
return $d;
}
protected function renameSequence( $old, $new ) {
if ( $this->db->sequenceExists( $new ) ) {
$this->output( "...sequence $new already exists.\n" );
+
return;
}
if ( $this->db->sequenceExists( $old ) ) {
// First requirement: the table must exist
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
$this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+
return;
}
if ( $this->db->indexExists( $table, $new, __METHOD__ ) ) {
$this->output( "...index $new already set on $table table.\n" );
if ( !$skipBothIndexExistWarning
- && $this->db->indexExists( $table, $old, __METHOD__ ) )
- {
+ && $this->db->indexExists( $table, $old, __METHOD__ )
+ ) {
$this->output( "...WARNING: $old still exists, despite it has been renamed into $new (which also exists).\n" .
" $old should be manually removed if not needed anymore.\n" );
}
+
return;
}
// Third requirement: the old index must exist
if ( !$this->db->indexExists( $table, $old, __METHOD__ ) ) {
$this->output( "...skipping: index $old doesn't exist.\n" );
+
return;
}
$fi = $this->db->fieldInfo( $table, $field );
if ( !is_null( $fi ) ) {
$this->output( "...column '$table.$field' already exists\n" );
+
return;
} else {
$this->output( "Adding column '$table.$field'\n" );
if ( 'NULL' === $null ) {
$this->output( "Changing '$table.$field' to allow NULLs\n" );
$this->db->query( "ALTER TABLE $table ALTER $field DROP NOT NULL" );
- }
- else {
+ } else {
$this->output( "...column '$table.$field' is already set as NOT NULL\n" );
}
}
$fi = $this->db->fieldInfo( $table, $field );
if ( is_null( $fi ) ) {
$this->output( "WARNING! Column '$table.$field' does not exist but it should! Please report this.\n" );
+
return;
}
if ( $fi->is_deferred() && $fi->is_deferrable() ) {
if ( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
$result->warning( 'config-no-fts3' );
}
+
return $result;
}
DIRECTORY_SEPARATOR,
dirname( $_SERVER['DOCUMENT_ROOT'] ) . '/data'
);
+
return array( 'wgSQLiteDataDir' => $path );
} else {
return array();
if ( !$result ) {
return $path;
}
+
return $result;
}
}
# Table prefix is not used on SQLite, keep it empty
$this->setVar( 'wgDBprefix', '' );
+
return $result;
}
} catch ( DBConnectionError $e ) {
$status->fatal( 'config-sqlite-connection-error', $e->getMessage() );
}
+
return $status;
}
$this->setVar( 'wgDBuser', '' );
$this->setVar( 'wgDBpassword', '' );
$this->setupSchemaVars();
+
return $this->getConnection();
}
*/
public function createTables() {
$status = parent::createTables();
+
return $this->setupSearchIndex( $status );
}
} elseif ( !$fts3tTable && $module == 'FTS3' ) {
$this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-fts3.sql" );
}
+
return $status;
}
*/
public function getLocalSettings() {
$dir = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgSQLiteDataDir' ) );
- return
-"# SQLite-specific settings
+
+ return "# SQLite-specific settings
\$wgSQLiteDataDir = \"{$dir}\";";
}
}
// initial-indexes.sql fails if the indexes are already present, so we perform a quick check if our database is newer.
if ( $this->updateRowExists( 'initial_indexes' ) || $this->db->indexExists( 'user', 'user_name', __METHOD__ ) ) {
$this->output( "...have initial indexes\n" );
+
return;
}
$this->applyPatch( 'initial-indexes.sql', false, "Adding initial indexes" );
protected function doEnableProfiling() {
global $wgProfileToDatabase;
- if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+ if ( $wgProfileToDatabase === true && !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
$this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
}
}
$this->setupLanguage();
if ( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
- && $this->request->getVal( 'localsettings' ) )
- {
+ && $this->request->getVal( 'localsettings' )
+ ) {
$this->request->response()->header( 'Content-type: application/x-httpd-php' );
$this->request->response()->header(
'Content-Disposition: attachment; filename="LocalSettings.php"'
$ls->setGroupRights( $group, $rightsArr );
}
echo $ls->getText();
+
return $this->session;
}
$cssDir = ( $cssDir == 'rtl' ? 'rtl' : 'ltr' );
$this->request->response()->header( 'Content-type: text/css' );
echo $this->output->getCSS( $cssDir );
+
return $this->session;
}
$this->output->useShortHeader();
$this->output->allowFrames();
$page->submitCC();
+
return $this->finish();
}
$this->output->useShortHeader();
$this->output->allowFrames();
$this->output->addHTML( $page->getCCDoneBox() );
+
return $this->finish();
}
}
$this->output->redirect( $this->getUrl( array( 'page' => $nextPage ) ) );
+
return $this->finish();
}
if ( $this->phpErrors ) {
$this->showError( 'config-session-error', $this->phpErrors[0] );
+
return false;
}
// the /mw-config/index.php. Kinda scary though?
$url = $m[1];
}
+
return md5( serialize( array(
'local path' => dirname( __DIR__ ),
'url' => $url,
*/
private function endPageWrapper() {
$this->output->addHTMLNoFlush(
- "<div class=\"visualClear\"></div>\n" .
- "</div>\n" .
- "<div class=\"visualClear\"></div>\n" .
+ "<div class=\"visualClear\"></div>\n" .
+ "</div>\n" .
+ "<div class=\"visualClear\"></div>\n" .
"</div>" );
}
$text = $this->parse( $text, true );
$icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/' . $icon;
$alt = wfMessage( 'config-information' )->text();
+
return Html::infoBox( $text, $icon, $alt, $class, false );
}
$args = func_get_args();
array_shift( $args );
$html = '<div class="config-message">' .
- $this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
+ $this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
"</div>\n";
$this->output->addHTML( $html );
}
" <div class=\"config-block-label\">\n" .
Xml::tags( 'label',
$attributes,
- $labelText ) . "\n" .
- $helpData .
+ $labelText
+ ) . "\n" .
+ $helpData .
" </div>\n" .
" <div class=\"config-block-elements\">\n" .
- $contents .
+ $contents .
" </div>\n" .
"</div>\n";
}
*
* @param $params Array
* Parameters are:
- * var: The variable to be configured (required)
- * label: The message name for the label (required)
- * attribs: Additional attributes for the input element (optional)
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * attribs: Additional attributes for the input element (optional)
* controlName: The name for the input element (optional)
- * value: The current value of the variable (optional)
- * help: The html for the help text (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
if ( !isset( $params['help'] ) ) {
$params['help'] = "";
}
+
return $this->label(
- $params['label'],
+ $params['label'],
+ $params['controlName'],
+ Xml::input(
$params['controlName'],
- Xml::input(
- $params['controlName'],
- 30, // intended to be overridden by CSS
- $params['value'],
- $params['attribs'] + array(
- 'id' => $params['controlName'],
- 'class' => 'config-input-text',
- 'tabindex' => $this->nextTabIndex()
- )
- ),
- $params['help']
- );
+ 30, // intended to be overridden by CSS
+ $params['value'],
+ $params['attribs'] + array(
+ 'id' => $params['controlName'],
+ 'class' => 'config-input-text',
+ 'tabindex' => $this->nextTabIndex()
+ )
+ ),
+ $params['help']
+ );
}
/**
*
* @param $params Array
* Parameters are:
- * var: The variable to be configured (required)
- * label: The message name for the label (required)
- * attribs: Additional attributes for the input element (optional)
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * attribs: Additional attributes for the input element (optional)
* controlName: The name for the input element (optional)
- * value: The current value of the variable (optional)
- * help: The html for the help text (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
if ( !isset( $params['help'] ) ) {
$params['help'] = "";
}
+
return $this->label(
- $params['label'],
+ $params['label'],
+ $params['controlName'],
+ Xml::textarea(
$params['controlName'],
- Xml::textarea(
- $params['controlName'],
- $params['value'],
- 30,
- 5,
- $params['attribs'] + array(
- 'id' => $params['controlName'],
- 'class' => 'config-input-text',
- 'tabindex' => $this->nextTabIndex()
- )
- ),
- $params['help']
- );
+ $params['value'],
+ 30,
+ 5,
+ $params['attribs'] + array(
+ 'id' => $params['controlName'],
+ 'class' => 'config-input-text',
+ 'tabindex' => $this->nextTabIndex()
+ )
+ ),
+ $params['help']
+ );
}
/**
* Implements password hiding
* @param $params Array
* Parameters are:
- * var: The variable to be configured (required)
- * label: The message name for the label (required)
- * attribs: Additional attributes for the input element (optional)
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * attribs: Additional attributes for the input element (optional)
* controlName: The name for the input element (optional)
- * value: The current value of the variable (optional)
- * help: The html for the help text (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
*
* @param $params Array
* Parameters are:
- * var: The variable to be configured (required)
- * label: The message name for the label (required)
- * attribs: Additional attributes for the input element (optional)
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
+ * attribs: Additional attributes for the input element (optional)
* controlName: The name for the input element (optional)
- * value: The current value of the variable (optional)
- * help: The html for the help text (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
*
* @param $params Array
* Parameters are:
- * var: The variable to be configured (required)
- * label: The message name for the label (required)
+ * var: The variable to be configured (required)
+ * label: The message name for the label (required)
* itemLabelPrefix: The message name prefix for the item labels (required)
- * values: List of allowed values (required)
- * itemAttribs Array of attribute arrays, outer key is the value name (optional)
- * commonAttribs Attribute array applied to all items
- * controlName: The name for the input element (optional)
- * value: The current value of the variable (optional)
- * help: The html for the help text (optional)
+ * values: List of allowed values (required)
+ * itemAttribs: Array of attribute arrays, outer key is the value name (optional)
+ * commonAttribs: Attribute array applied to all items
+ * controlName: The name for the input element (optional)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
*/
public function docLink( $linkText, $attribs, $parser ) {
$url = $this->getDocUrl( $attribs['href'] );
+
return '<a href="' . htmlspecialchars( $url ) . '">' .
htmlspecialchars( $linkText ) .
'</a>';
$anchor = Html::rawElement( 'a',
array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
$img . ' ' . wfMessage( 'config-download-localsettings' )->parse() );
+
return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
}
$this->setVar( 'wgScriptPath', $uri );
} else {
$this->showError( 'config-no-uri' );
+
return false;
}
+
return parent::envCheckPath();
}
*/
public function getDir() {
global $wgLang;
+
return is_object( $wgLang ) ? $wgLang->getDir() : 'ltr';
}
*/
public function getLanguageCode() {
global $wgLang;
+
return is_object( $wgLang ) ? $wgLang->getCode() : 'en';
}
public function outputHeader() {
$this->headerDone = true;
- $dbTypes = $this->parent->getDBTypes();
-
$this->parent->request->response()->header( 'Content-Type: text/html; charset=utf-8' );
+
if ( !$this->allowFrames ) {
$this->parent->request->response()->header( 'X-Frame-Options: DENY' );
}
+
if ( $this->redirectTarget ) {
$this->parent->request->response()->header( 'Location: ' . $this->redirectTarget );
+
return;
}
if ( $this->useShortHeader ) {
$this->outputShortHeader();
+
return;
}
-
?>
<?php echo Html::htmlHeader( $this->getHeadAttribs() ); ?>
<head>
if ( $continue ) {
// Fake submit button for enter keypress (bug 26267)
// Messages: config-continue, config-restart, config-regenerate
- $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
- array( 'name' => "enter-$continue", 'style' =>
- 'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
+ $s .= Xml::submitButton(
+ wfMessage( "config-$continue" )->text(),
+ array(
+ 'name' => "enter-$continue",
+ 'style' => 'visibility:hidden;overflow:hidden;width:1px;margin:0'
+ )
+ ) . "\n";
}
if ( $back ) {
// Message: config-back
- $s .= Xml::submitButton( wfMessage( "config-$back" )->text(),
+ $s .= Xml::submitButton(
+ wfMessage( "config-$back" )->text(),
array(
'name' => "submit-$back",
'tabindex' => $this->parent->nextTabIndex()
- ) ) . "\n";
+ )
+ ) . "\n";
}
if ( $continue ) {
// Messages: config-continue, config-restart, config-regenerate
- $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
+ $s .= Xml::submitButton(
+ wfMessage( "config-$continue" )->text(),
array(
'name' => "submit-$continue",
'tabindex' => $this->parent->nextTabIndex(),
- ) ) . "\n";
+ )
+ ) . "\n";
}
$s .= "</div></form></div>\n";
if ( isset( $languages[$contLang] ) ) {
$this->setVar( 'wgLanguageCode', $contLang );
}
+
return 'continue';
}
} elseif ( $this->parent->showSessionWarning ) {
$s .= "\n" . Xml::option( "$code - $lang", $code, $code == $selectedCode );
}
$s .= "\n</select>\n";
+
return $this->parent->label( $label, $name, $s );
}
-
}
class WebInstaller_ExistingWiki extends WebInstallerPage {
// Check if the upgrade key supplied to the user has appeared in LocalSettings.php
if ( $vars['wgUpgradeKey'] !== false
&& $this->getVar( '_UpgradeKeySupplied' )
- && $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey'] )
- {
+ && $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey']
+ ) {
// It's there, so the user is authorized
$status = $this->handleExistingUpgrade( $vars );
if ( $status->isOK() ) {
$this->startForm();
$this->parent->showStatusBox( $status );
$this->endForm( 'continue' );
+
return 'output';
}
}
$this->getVar( 'wgUpgradeKey' ) . "';</pre>" )->plain()
) );
$this->endForm( 'continue' );
+
return 'output';
}
if ( !$key || $key !== $vars['wgUpgradeKey'] ) {
$this->parent->showError( 'config-localsettings-badkey' );
$this->showKeyForm();
+
return 'output';
}
// Key was OK
} else {
$this->parent->showStatusBox( $status );
$this->showKeyForm();
+
return 'output';
}
} else {
$this->showKeyForm();
+
return 'output';
}
}
}
$this->setVar( $name, $vars[$name] );
}
+
return $status;
}
protected function handleExistingUpgrade( $vars ) {
// Check $wgDBtype
if ( !isset( $vars['wgDBtype'] ) ||
- !in_array( $vars['wgDBtype'], Installer::getDBTypes() ) ) {
+ !in_array( $vars['wgDBtype'], Installer::getDBTypes() )
+ ) {
return Status::newFatal( 'config-localsettings-connection-error', '' );
}
// Adjust the error message to explain things correctly
$status->replaceMessage( 'config-connection-error',
'config-localsettings-connection-error' );
+
return $status;
}
// All good
$this->setVar( '_ExistingDBSettings', true );
+
return $status;
}
}
} else {
$this->parent->showStatusMessage( $status );
}
+
return '';
}
-
}
class WebInstaller_DBConnect extends WebInstallerPage {
if ( $status->isGood() ) {
$this->setVar( '_UpgradeDone', false );
+
return 'continue';
} else {
$this->parent->showStatusBox( $status );
// Messages: config-header-mysql, config-header-postgres, config-header-oracle,
// config-header-sqlite
- $settings .=
- Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
- 'class' => 'dbWrapper' ) ) .
+ $settings .= Html::openElement(
+ 'div',
+ array(
+ 'id' => 'DB_wrapper_' . $type,
+ 'class' => 'dbWrapper'
+ )
+ ) .
Html::element( 'h3', array(), wfMessage( 'config-header-' . $type )->text() ) .
$installer->getConnectForm() .
"</div>\n";
}
- $types .= "</ul><br style=\"clear: left\"/>\n";
- $this->addHTML(
- $this->parent->label( 'config-db-type', false, $types ) .
- $settings
- );
+ $types .= "</ul><br style=\"clear: left\"/>\n";
+ $this->addHTML( $this->parent->label( 'config-db-type', false, $types ) . $settings );
$this->endForm();
}
if ( !$installer ) {
return Status::newFatal( 'config-invalid-db-type' );
}
+
return $installer->submitConnectForm();
}
-
}
class WebInstaller_Upgrade extends WebInstallerPage {
// Show the done message again
// Make them click back again if they want to do the upgrade again
$this->showDoneMessage();
+
return 'output';
}
}
}
$this->setVar( '_UpgradeDone', true );
$this->showDoneMessage();
+
return 'output';
}
}
$this->parent->getInfoBox(
wfMessage( $msg,
$this->getVar( 'wgServer' ) .
- $this->getVar( 'wgScriptPath' ) . '/index' .
- $this->getVar( 'wgScriptExtension' )
+ $this->getVar( 'wgScriptPath' ) . '/index' .
+ $this->getVar( 'wgScriptExtension' )
)->plain(), 'tick-32.png'
)
);
$this->parent->restoreLinkPopups();
$this->endForm( $regenerate ? 'regenerate' : false, false );
}
-
}
class WebInstaller_DBSettings extends WebInstallerPage {
$this->addHTML( $form );
$this->endForm();
}
-
}
class WebInstaller_Name extends WebInstallerPage {
$this->setVar( 'wgMetaNamespace', $metaNS );
$this->endForm();
+
return 'output';
}
return $retVal;
}
-
}
class WebInstaller_Options extends WebInstallerPage {
}
$extHtml .= $this->parent->getHelpBox( 'config-extensions-help' ) .
- $this->getFieldSetEnd();
+ $this->getFieldSetEnd();
$this->addHTML( $extHtml );
}
'lang' => $this->getVar( '_UserLang' ),
'stylesheet' => $styleUrl,
) );
+
return $iframeUrl;
}
// If you change this height, also change it in config.css
$expandJs = str_replace( '$1', '54em', $js );
$reduceJs = str_replace( '$1', '70px', $js );
+
return '<p>' .
Html::element( 'img', array( 'src' => $this->getVar( 'wgRightsIcon' ) ) ) .
'  ' .
array( 'wgRightsUrl', 'wgRightsText', 'wgRightsIcon' ) );
if ( count( $newValues ) != 3 ) {
$this->parent->showError( 'config-cc-error' );
+
return;
}
$this->setVar( '_CCDone', true );
'wgUseInstantCommons' ) );
if ( !in_array( $this->getVar( '_RightsProfile' ),
- array_keys( $this->parent->rightsProfiles ) ) )
- {
+ array_keys( $this->parent->rightsProfiles ) )
+ ) {
reset( $this->parent->rightsProfiles );
$this->setVar( '_RightsProfile', key( $this->parent->rightsProfiles ) );
}
if ( $code == 'cc-choose' ) {
if ( !$this->getVar( '_CCDone' ) ) {
$this->parent->showError( 'config-cc-not-chosen' );
+
return false;
}
} elseif ( in_array( $code, array_keys( $this->parent->licenses ) ) ) {
$memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
if ( !$memcServers ) {
$this->parent->showError( 'config-memcache-needservers' );
+
return false;
}
foreach ( $memcServers as $server ) {
$memcParts = explode( ":", $server, 2 );
if ( !isset( $memcParts[0] )
- || ( !IP::isValid( $memcParts[0] )
- && ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) ) ) {
+ || ( !IP::isValid( $memcParts[0] )
+ && ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) )
+ ) {
$this->parent->showError( 'config-memcache-badip', $memcParts[0] );
+
return false;
} elseif ( !isset( $memcParts[1] ) ) {
$this->parent->showError( 'config-memcache-noport', $memcParts[0] );
+
return false;
} elseif ( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
$this->parent->showError( 'config-memcache-badport', 1, 65535 );
+
return false;
}
}
}
+
return true;
}
-
}
class WebInstaller_Install extends WebInstallerPage {
$this->addHTML( $this->parent->getInfoBox( wfMessage( 'config-install-begin' )->plain() ) );
$this->endForm();
}
+
return true;
}
$this->parent->showStatusBox( $status );
}
}
-
}
class WebInstaller_Complete extends WebInstallerPage {
// to download the file
$lsUrl = $this->getVar( 'wgServer' ) . $this->parent->getURL( array( 'localsettings' => 1 ) );
if ( isset( $_SERVER['HTTP_USER_AGENT'] ) &&
- strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false ) {
+ strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false
+ ) {
// JS appears to be the only method that works consistently with IE7+
$this->addHtml( "\n<script>jQuery( function () { document.location = " .
- Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
+ Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
} else {
$this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
}
wfMessage( 'config-install-done',
$lsUrl,
$this->getVar( 'wgServer' ) .
- $this->getVar( 'wgScriptPath' ) . '/index' .
- $this->getVar( 'wgScriptExtension' ),
+ $this->getVar( 'wgScriptPath' ) . '/index' .
+ $this->getVar( 'wgScriptExtension' ),
'<downloadlink/>'
)->plain(), 'tick-32.png'
)
if ( $really ) {
$this->parent->reset();
}
+
return 'continue';
}
$this->addHTML( $s );
$this->endForm( 'restart' );
}
-
}
abstract class WebInstaller_Document extends WebInstallerPage {
public function getFileContents() {
$file = __DIR__ . '/../../' . $this->getFileName();
- if ( ! file_exists( $file ) ) {
+ if ( !file_exists( $file ) ) {
return wfMessage( 'config-nofile', $file )->plain();
}
+
return file_get_contents( $file );
}
-
}
class WebInstaller_Readme extends WebInstaller_Document {
'tags-tag' => 'Anv ar valizenn',
'tags-display-header' => "Neuz e rolloù ar c'hemmoù",
'tags-description-header' => 'Deskrivadur klok ar valizenn',
+'tags-active-header' => 'Oberiant ?',
'tags-hitcount-header' => 'Kemmoù balizennet',
'tags-active-yes' => 'Ya',
'tags-active-no' => 'Ket',
'userlogin-resetpassword-link' => 'Obnovit heslo',
'helplogin-url' => 'Help:Přihlášení',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Nápověda k přihlašování]]',
+'userlogin-loggedin' => 'Již jste {{GENDER:$1|přihlášen|přihlášena}} jako $1.
+Pomocí formuláře níže se můžete přihlásit jako jiný uživatel.',
+'userlogin-createanother' => 'Vytvořit jiný účet',
'createacct-join' => 'Níže zadejte své údaje.',
'createacct-another-join' => 'Níže zadejte údaje nového účtu.',
'createacct-emailrequired' => 'E-mailová adresa',
'contributions' => 'Příspěvky {{GENDER:$1|uživatele|uživatelky}}',
'contributions-title' => 'Příspěvky uživatele $1',
'mycontris' => 'Příspěvky',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|uživatele|uživatelky}} $1 ($2)',
'nocontribs' => 'Nenalezeny žádné změny vyhovující kritériím.',
'uctop' => '(aktuální)',
'month' => 'Do měsíce:',
'action-block' => 'enê karberi vurnayışi ra bıreyne',
'action-protect' => 'seviyeyê pawitişî se ena pele bivurne',
'action-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
-'action-import' => 'ena pele yewna wiki ra azere de',
-'action-importupload' => 'ena pele yew dosyayê bar kerdişî ra import bike',
+'action-import' => 'ena pele yewna wikira azered',
+'action-importupload' => 'ena pele yew dosyayê bar kerdışira azered',
'action-patrol' => 'vurnayîşê karberanê binî nişan bike patrol biye',
'action-autopatrol' => 'vurnayîşê xoye nişan bike ke belli biyo patrol biye',
'action-unwatchedpages' => 'listeyê pelanê seyirnibiya bivîne',
oyo ke vurnayişo peyin kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
'editcomment' => "kılmnuşteyê vurnayişibi: \"''\$1''\".",
'revertpage' => 'Hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Mesac]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.',
-'revertpage-nouser' => '(nameyê karberi veteyo) no keso ke vuriyayiş kerdo vuriyayişê no kesi hetê no [[User:$1|$1]] kesi ra tepiya anciyayo',
+'revertpage-nouser' => 'No keso ke vuriyayiş kerdo vuriyayişé{{GENDER:$1|[[User:$1|$1]]}} ker o',
'rollback-success' => 'vurnayişê no kesi $1 tepiya geriyayo u hetê no
$2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.',
'contributions' => 'İştıraqê {{GENDER:$1|karber}}i',
'contributions-title' => 'Dekerdenê karber de $1',
'mycontris' => 'İştıraqi',
-'contribsub2' => 'Qandê $1 ($2)',
+'contribsub2' => 'Qandê {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
'uctop' => '(weziyet)',
'month' => 'Aşm:',
'tags-tag' => 'Nameyê etiketi',
'tags-display-header' => 'Listeyê vurnayîşî de esayîş',
'tags-description-header' => 'Deskripsyonê manay ê hemî',
+'tags-active-header' => 'Activ o?',
'tags-hitcount-header' => 'Vurnayîşî ke etiket biyê',
+'tags-active-yes' => 'E',
+'tags-active-no' => 'Nê',
'tags-edit' => 'bıvurne',
'tags-hitcount' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
# Login and logout pages
'logouttext' => "'''Έχετε αποσυνδεθεί.'''
-Έχετε υπόψη σας πως αρκετές σελίδες θα συνεχίσουν να εμφανίζονται κανονικά, σαν να μην έχετε αποσυνδεθεί, μέχρι να καθαρίσετε τη λανθάνουσα μνήμη του φυλλομετρητή σας.",
+Έχετε υπόψη σας πως αρκετές σελίδες θα συνεχίσουν να εμφανίζονται κανονικά, σαν να μην έχετε αποσυνδεθεί, μέχρι να καθαρίσετε την προσωρινή μνήμη του φυλλομετρητή σας.",
'welcomeuser' => 'Καλώς ορίσατε, $1!',
'welcomecreation-msg' => 'Ο λογαριασμός σας έχει δημιουργηθεί.
Μην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} προτιμήσεις]] σας.',
'feedback-error3' => 'Σφάλμα: Καμία απάντηση από το API',
'feedback-thanks' => 'Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα "[$2 $1]".',
'feedback-close' => 'Ολοκληρώθηκε',
-'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [ $1 γνωστά σφάλματα].',
+'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [$1 γνωστά σφάλματα].',
'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
# Search suggestions
'tog-noconvertlink' => 'Matikan konversi judul pranala',
'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
'tog-useeditwarning' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
+'tog-prefershttps' => 'Selalu gunakan koneksi aman ketika masuk log',
'underline-always' => 'Selalu',
'underline-never' => 'Tidak pernah',
# 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).
'aboutsite' => 'Tentang {{SITENAME}}',
'aboutpage' => 'Project:Perihal',
-'copyright' => 'Seluruh teks tersedia sesuai dengan $1.',
+'copyright' => 'Konten tersedia sesuai di bawah $1.',
'copyrightpage' => '{{ns:project}}:Hak cipta',
'currentevents' => 'Peristiwa terkini',
'currentevents-url' => 'Project:Peristiwa terkini',
# General errors
'error' => 'Kesalahan',
'databaseerror' => 'Kesalahan basis data',
+'databaseerror-text' => 'Sebuah galat kueri basis data telah terjadi.
+Hal ini mungkin mengindikasikan ada kesalahan pada perangkat lunaknya.',
+'databaseerror-textcl' => 'Sebuah galat kueri basis data telah terjadi.',
+'databaseerror-query' => 'Kueri: $1',
+'databaseerror-function' => 'Fungsi: $1',
+'databaseerror-error' => 'Kesalahan: $1',
'laggedslavemode' => 'Peringatan: Halaman mungkin tidak berisi perubahan terbaru.',
'readonly' => 'Basis data dikunci',
'enterlockreason' => 'Masukkan alasan penguncian, termasuk perkiraan kapan kunci akan dibuka',
'userlogin-resetpassword-link' => 'Buat ulang kata sandi',
'helplogin-url' => 'Help:Masuk log',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan masuk log]]',
+'userlogin-loggedin' => 'Andan telah masuk log sebagai $1.
+Gunakan formulir di bawah untuk masuk log sebagai pengguna lain.',
+'userlogin-createanother' => 'Buat akun lain',
'createacct-join' => 'Masukkan informasi Anda di bawah ini.',
'createacct-another-join' => 'Masukkan informasi akun baru di bawah ini.',
'createacct-emailrequired' => 'Alamat surel',
Anda dapat mengabaikan pesan ini jika akun ini dibuat karena suatu kesalahan.',
'usernamehasherror' => 'Nama pengguna tidak bisa mengandung tanda pagar',
-'login-throttled' => 'Anda telah berkali-kali mencoba masuk log.
+'login-throttled' => 'Anda sudah terlalu sering mencoba masuk log.
Silakan menunggu sebelum mencoba lagi.',
'login-abort-generic' => 'Proses masuk Anda tidak berhasil - Dibatalkan',
'loginlanguagelabel' => 'Bahasa: $1',
'suspicious-userlogout' => 'Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.',
+'createacct-another-realname-tip' => 'Nama asli bersifat opsional.
+Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.',
# Email sending
'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
'newpassword' => 'Kata sandi baru:',
'retypenew' => 'Ketik ulang kata sandi baru:',
'resetpass_submit' => 'Atur kata sandi dan masuk log',
-'changepassword-success' => 'Kata sandi Anda telah berhasil diubah! Sekarang memproses masuk log Anda...',
+'changepassword-success' => 'Kata sandi Anda telah berhasil diubah!',
'resetpass_forbidden' => 'Kata sandi tidak dapat diubah',
'resetpass-no-info' => 'Anda harus masuk log untuk mengakses halaman ini secara langsung.',
'resetpass-submit-loggedin' => 'Ganti kata sandi',
'resettokens-legend' => 'Reset token',
'resettokens-tokens' => 'Token:',
'resettokens-token-label' => '$1 (nilai saat ini: $2)',
-'resettokens-watchlist-token' => 'Daftar pantauan token web feed',
+'resettokens-watchlist-token' => 'Token untuk sindikasi web (Atom/RSS) dari [[Special:Watchlist|perubahan di daftar pantauan Anda]]',
'resettokens-done' => 'Reset token.',
'resettokens-resetbutton' => 'Reset token yang dipilih',
'loginreqlink' => 'masuk log',
'loginreqpagetext' => 'Anda harus $1 untuk dapat melihat halaman lainnya.',
'accmailtitle' => 'Kata sandi telah terkirim.',
-'accmailtext' => "Sebuah kata sandi acak untuk [[User talk:$1|$1]] telah dibuat dan dikirimkan ke $2.
+'accmailtext' => "Sebuah kata sandi acak untuk [[User talk:$1|$1]] telah dikirimkan ke $2.
Kata sandi untuk akun baru ini dapat diubah di halaman ''[[Special:ChangePassword|pengubahan kata sandi]]'' setelah masuk log.",
'newarticle' => '(Baru)',
'gender-unknown' => 'Tak dinyatakan',
'gender-male' => 'Laki-laki',
'gender-female' => 'Perempuan',
-'prefs-help-gender' => 'Opsional: digunakan untuk perbaikan penyebutan gender oleh perangkat lunak. Informasi ini akan terbuka untuk umum.',
+'prefs-help-gender' => 'Opsional: digunakan untuk perbaikan penyebutan jender oleh perangkat lunak.
+Informasi ini akan terbuka untuk umum.',
'email' => 'Surel',
'prefs-help-realname' => 'Nama asli bersifat opsional.
Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.',
'prefs-displaywatchlist' => 'Pilihan tampilan',
'prefs-tokenwatchlist' => 'Tanda',
'prefs-diffs' => 'Beda',
+'prefs-help-prefershttps' => 'Preferensi ini akan diaktifkan kali berikutnya Anda masuk log.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Alamat surel tampaknya sah',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sejak kunjungan terakhir}}',
+'enhancedrc-history' => 'riwayat',
'recentchanges' => 'Perubahan terbaru',
'recentchanges-legend' => 'Opsi perubahan terbaru',
'recentchanges-summary' => "Temukan perubahan terbaru dalam wiki di halaman ini.<br />
# Special:ListFiles
'listfiles-summary' => 'Halaman istimewa ini menampilkan semua berkas yang telah diunggah.
-Ketika disaring oleh pengguna, hanya vesi berkas terbaru dari berkas yang pengguna unggah yang ditampilkan.',
+Ketika disaring oleh pengguna, hanya versi berkas terbaru dari berkas yang diunggah oleh pengguna tersebut yang ditampilkan.',
'listfiles_search_for' => 'Cari nama berkas:',
'imgfile' => 'berkas',
'listfiles' => 'Daftar berkas',
'listfiles_size' => 'Ukuran',
'listfiles_description' => 'Deskripsi',
'listfiles_count' => 'Versi',
+'listfiles-show-all' => 'Termasuk versi lama gambar',
+'listfiles-latestversion' => 'Versi terkini',
+'listfiles-latestversion-yes' => 'Ya',
+'listfiles-latestversion-no' => 'Tidak',
# File description page
'file-anchor-link' => 'Berkas',
'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
'pageswithprop-prop' => 'Nama properti:',
'pageswithprop-submit' => 'Lanjut',
-'pageswithprop-prophidden-long' => 'teks panjang nilai properti tersembunyi ($1 kilobita)',
-'pageswithprop-prophidden-binary' => 'nilai properti biner yang tersembunyi ($1 kilobita)',
+'pageswithprop-prophidden-long' => 'nilai properti teks panjang tersembunyi ($1 kilobita)',
+'pageswithprop-prophidden-binary' => 'nilai properti biner tersembunyi ($1 kilobita)',
'doubleredirects' => 'Pengalihan ganda',
'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
'listusers' => 'Daftar pengguna',
'listusers-editsonly' => 'Tampilkan hanya pengguna yang memiliki kontribusi',
'listusers-creationsort' => 'Urutkan menurut tanggal pendaftaran',
+'listusers-desc' => 'Urutkan menurun',
'usereditcount' => '$1 {{PLURAL:$1|suntingan|suntingan}}',
'usercreated' => '{{GENDER:$3|Dibuat}} pada $1 pukul $2',
'newpages' => 'Halaman baru',
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]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]',
-'revertpage-nouser' => 'Mengembalikan suntingan oleh pengguna tersembunyi ke suntingan terakhir oleh [[User:$1|$1]]',
+'revertpage-nouser' => 'Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]',
'rollback-success' => 'Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.',
# Edit tokens
'tags-tag' => 'Nama tag',
'tags-display-header' => 'Tampilan di daftar perubahan',
'tags-description-header' => 'Deskripsi lengkap atau makna',
+'tags-active-header' => 'Aktif?',
'tags-hitcount-header' => 'Perubahan bertag',
+'tags-active-yes' => 'Ya',
+'tags-active-no' => 'Tidak',
'tags-edit' => 'sunting',
'tags-hitcount' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
'dberr-problems' => 'Maaf! Situs ini mengalami masalah teknis.',
'dberr-again' => 'Cobalah menunggu beberapa menit dan muat ulang.',
'dberr-info' => '(Tak dapat tersambung dengan server basis data: $1)',
+'dberr-info-hidden' => '(Tidak dapat menghubungi peladen basis data)',
'dberr-usegoogle' => 'Anda dapat mencoba pencarian melalui Google untuk sementara waktu.',
'dberr-outofdate' => 'Harap diperhatikan bahwa indeks mereka terhadap isi kami mungkin sudah kedaluwarsa.',
'dberr-cachederror' => 'Berikut adalah salinan tersimpan halaman yang diminta, dan mungkin bukan yang terbaru.',
# Image rotation
'rotate-comment' => 'Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam',
+# Limit report
+'limitreport-cputime' => 'Penggunaan waktu CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|detik|detik}}',
+'limitreport-walltime' => 'Penggunaan waktu riil',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|detik|detik}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-expensivefunctioncount' => 'Perhitungan fungsi parser yang mahal',
+
);
* @author Saruman
* @author Servien
* @author Siebrand
+ * @author Sjoerddebruin
* @author Slomox
* @author Southparkfan
* @author TBloemink
'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
'tog-oldsig' => 'Bestaande ondertekening:',
'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische koppeling)',
-'tog-uselivepreview' => '"live voorvertoning" gebruiken (experimenteel)',
+'tog-uselivepreview' => '"Live voorvertoning" gebruiken (experimenteel)',
'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
'tog-watchlisthidebots' => 'Botbewerkingen op mijn volglijst verbergen',
'action-block' => 'deze gebruiker een bewerkingsblokkade op te leggen',
'action-protect' => 'het beveiligingsniveau van deze pagina aan te passen',
'action-rollback' => 'bewerkingen van de laatste gebruiker die een pagina heeft bewerkt snel terugdraaien',
-'action-import' => "pagina's importeren van een andere wiki",
-'action-importupload' => 'deze pagina importeren uit een bestandsupload',
+'action-import' => "pagina's te importeren van een andere wiki",
+'action-importupload' => "pagina's te importeren uit een bestandsupload",
'action-patrol' => 'bewerkingen van anderen als gecontroleerd te markeren',
'action-autopatrol' => 'eigen bewerkingen als gecontroleerd te laten markeren',
'action-unwatchedpages' => "de lijst met pagina's die niet op een volglijst staan te bekijken",
'userlogin-resetpassword-link' => 'Riamposté la ciav',
'helplogin-url' => 'Help:Conession',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Agiut con la conession]]',
+'userlogin-loggedin' => "A l'é già rintrà an ël sistema tanme {{GENDER:$1|$1}}.
+Ch'a deuvra ël formolari sì-sota për rintré coma n'àutr n'utent.",
+'userlogin-createanother' => "Creé n'àutr cont",
'createacct-join' => "Ch'a anserissa soe anformassion sì-sota.",
'createacct-another-join' => "Anserì j'anformassion dël cont neuv sì-sota.",
'createacct-emailrequired' => 'Adrëssa ëd pòsta eletrònica',
'loginreqtitle' => 'A venta rintré ant ël sistema',
'loginreqlink' => 'rintré ant ël sistema',
'loginreqpagetext' => "A dev $1 për podèj vëdde j'àutre pàgine.",
-'accmailtitle' => 'Ciav spedìa.',
+'accmailtitle' => 'Ciav spedìa',
'accmailtext' => "Na ciav generà a l'ancàpit për [[User talk:$1|$1]] a l'é stàita mandà a $2.
A peul esse modificà an sla pàgina ''[[Special:ChangePassword|modìfica dla ciav]]'' apress esse rintrà ant ël sistema.",
'newarticle' => '(Neuv)',
-'newarticletext' => "It ses andàit daré a un colegament a na pàgina che a esist ancó pa.
-Për creé la pàgina, ancamin-a a scrive ant lë spassi sì-sota (varda la [[{{MediaWiki:Helppage}}|pàgina d'agiut]] për savèjne ëd pì).
-S'it ses sì për eror, sgnaca ël boton '''andaré''' ëd tò navigador.",
-'anontalkpagetext' => "----''Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa dorbusse un cont, ò pura che a lo deuvra nen. Alora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel/chila. S'it ses n'utent anònim e it l'has l'impression d'arsèive dij coment sensa sust, për piasì [[Special:UserLogin/signup|crea un cont]] o [[Special:UserLogin|Intra]] për evité dë fé confusion con dj'àutri utent anònim.''",
+'newarticletext' => "A l'é andaje dapress a na liura a na pàgina che a esist ancor nen.
+Për creé la pàgina, ch'a ancamin-a a scrive ant lë spassi sì-sota (vëdde la [[{{MediaWiki:Helppage}}|pàgina d'agiut]] për savèjne ëd pì).
+S'a l'é rivà sì për eror, ch'a sgnaca ël boton '''andaré''' ëd sò navigador.",
+'anontalkpagetext' => "----''Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa dorbusse un cont, ò pura che a lo deuvra nen. Alora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel o chila.
+N'adrëssa IP përparèj a peul esse partagià da vàire utent.
+Se chiel a l'é n'utent anònim e a l'ha l'impression d'arsèive dij coment sensa sust, për piasì [[Special:UserLogin/signup|ch'a crea un cont]] o [[Special:UserLogin|ch'a rintra ant ël sistema]] për evité dë fé confusion con d'àutri utent anònim.''",
'noarticletext' => 'Al moment costa pàgina a l\'é veuida.
-It peule [[Special:Search/{{PAGENAME}}|sërché costa vos]] andrinta a d\'àutre pàgine, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],
-o purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché la pàgina adess]</span>.',
+A peul [[Special:Search/{{PAGENAME}}|sërché cost tìtol]] andrinta a d\'àutre pàgine, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],
+o purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché sta pàgina]</span>.',
'noarticletext-nopermission' => "Al moment a-i é gnun test ansima a costa pàgina.
A peul [[Special:Search/{{PAGENAME}}|sërché ës tìtol ëd pàgina]] an d'àutre pàgine,
-o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché j'argistrassion colegà]</span>, ma a l'ha pa ël përmess ëd creé costa pàgina.",
-'missing-revision' => "La revision #\$1 dla pàgina ciamà \"{{PAGENAME}}\" a esist pa.
+o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant j'argistr colegà]</span>, ma a l'ha pa ël përmess ëd creé costa pàgina.",
+'missing-revision' => "La revision nùmer $1 dla pàgina antitolà «{{PAGENAME}}» a esist pa.
Sòn a l'é normalment causà da l'andèje dapress a na vej liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scancelament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
'userpage-userdoesnotexist' => 'Lë stranòm "<nowiki>$1</nowiki>" a l\'é pa registrà. Për piasì ch\'a varda se da bon a veul creé/modifiché sta pàgina.',
'recentchangesdays-max' => '(al pì $1 {{PLURAL:$1|di|di}})',
'recentchangescount' => 'Nùmer ëd modìfiche da smon-e për stàndard:',
'prefs-help-recentchangescount' => "Sòn a comprend j'ùltime modìfiche, le stòrie dle pàgine e ij registr.",
+'prefs-help-watchlist-token2' => "Costa a l'é la ciav segreta dël fluss an sl'Aragnà dla lista ëd lòn ch'as ten sot-euj.
+Qualsëssìa përson-a ch'a la conòssa a podrà lese la lista ëd lòn che chiel a ten sot-euj, ch'a-j la mostra donca a gnun.
+[[Special:ResetTokens|Ch'a sgnaca ambelessì s'a l'ha damanca d'ampostela torna]].",
'savedprefs' => 'Ij sò gust a son ëstàit salvà.',
'timezonelegend' => 'Fus orari:',
'localtime' => 'Ora local:',
'badsig' => "Soa firma a l'é nen giusta, che a controla j'istrussion HTML.",
'badsiglength' => "Sò stranòm a l'é tròp longh.
A deuv nen esse pì longh che $1 {{PLURAL:$1|caràter|caràter}}.",
-'yourgender' => 'Sess:',
-'gender-unknown' => 'Nen spessificà',
-'gender-male' => 'Òm',
-'gender-female' => 'Fomna',
-'prefs-help-gender' => "Opsional: a l'é dovrà për adaté ël programa al géner.
+'yourgender' => "'Me ch'a preferiss esse descrivù?",
+'gender-unknown' => 'I preferisso nen dilo',
+'gender-male' => 'Chiel a modìfica dle pàgine dla wiki',
+'gender-female' => 'Chila a modìfica dle pàgine dla wiki',
+'prefs-help-gender' => "Definì coste preferense a l'é opsional.
+Ël programa a deuvra sò valor për adressesse a chiel e massionelo a j'àutri an dovrand ël géner gramatical giust.
Costa anformassion a sarà pùblica.",
'email' => 'Pòsta eletrònica',
'prefs-help-realname' => '* Nòm vèir (opsional): se i sërne da butelo ambelessì a sarà dovrà për deve mérit ëd vòstr travaj.',
'prefs-signature' => 'Firma',
'prefs-dateformat' => 'Formà dla data',
'prefs-timeoffset' => "Diferensa d'ora",
-'prefs-advancedediting' => 'Opsion avansà',
+'prefs-advancedediting' => 'Opsion generaj',
+'prefs-editor' => 'Redator',
+'prefs-preview' => 'Preuva',
'prefs-advancedrc' => 'Opsion avansà',
'prefs-advancedrendering' => 'Opsion avansà',
'prefs-advancedsearchoptions' => 'Opsion avansà',
'prefs-displayrc' => 'Opsion ëd visualisassion',
'prefs-displaysearchoptions' => 'Opsion ëd visualisassion',
'prefs-displaywatchlist' => 'Opsion ëd visualisassion',
+'prefs-tokenwatchlist' => 'Geton',
'prefs-diffs' => 'Diferense',
+'prefs-help-prefershttps' => 'Costa preferensa a ancaminrà a marcé a soa pròssima conession.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'A smija bon',
'userrights-no-interwiki' => "A l'ha pa ij përmess dont a fa da manca për podèj cambieje ij drit a dj'utent ansima a dj'àutre wiki.",
'userrights-nodatabase' => "La base ëd dat $1 a-i é pa, ò pura a l'é nen local.",
'userrights-nologin' => "A l'ha da [[Special:UserLogin|rintré ant ël sistema]] con un cont da aministrator për podej-je dé dij drit a j'utent.",
-'userrights-notallowed' => "Sòò cont a l'ha pa ij përmess për dé o gavé dij drit a j'utent.",
+'userrights-notallowed' => "Chiel a l'ha pa ij përmess për dé o gavé dij drit a j'utent.",
'userrights-changeable-col' => "Partìe ch'a peul cambié",
'userrights-unchangeable-col' => "Partìe ch'a peul pa cambié",
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => "Conflit ëd modìfica ëd drit utent! Për piasì, ch'a lesa torna e ch'a confirma soe modìfiche.",
+'userrights-removed-self' => "A l'ha gavà për da bin ij sò drit. Parèj a peul pa pi acede a costa pàgina.",
# Groups
'group' => 'Partìa:',
'right-reupload-shared' => "Coaté an local j'archivi ant ël depòsit dij mojen partagià",
'right-upload_by_url' => "Carié dj'archivi da n'adrëssa an sl'aragnà",
'right-purge' => 'Polidé la memòria local ëd na pàgina sensa ciamé conferma',
-'right-autoconfirmed' => 'Modifiché le pàgine semi-protegiùe',
+'right-autoconfirmed' => "Nen esse tocà dal lìmit d'assion basà an sl'IP",
'right-bot' => 'Esse tratà com un process automàtich',
'right-nominornewtalk' => "Fé nen comparì l'avis ëd mëssagi neuv, an fasend ëd modìfiche cite a le pàgine ëd discussion",
'right-apihighlimits' => "Dovré ël lìmit pì àut ant j'anterogassion API",
'right-ipblock-exempt' => "Dëscavalché ij blocagi ëd j'IP, ij blocagi automàtich e ij blocagi ëd partìe d'IP",
'right-proxyunbannable' => "Dëscavalché ij blòch automatich dij servent d'anonimà",
'right-unblockself' => 'Dësblochesse da soj',
-'right-protect' => 'Cambié ij livej ëd protession e modifiché le pàgine protegiùe',
-'right-editprotected' => 'Modifiché le pàgine protegiùe (sensa protession a cascada)',
+'right-protect' => 'Cambié ij livej ëd protession e modifiché le pàgine protegiùe an cascada',
+'right-editprotected' => 'Modifiché le pàgine protegiùe con «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Modifiché le pàgine protegiùe con «{{int:protect-level-autoconfirmed}}»',
'right-editinterface' => "Modifiché l'antërfacia utent",
'right-editusercssjs' => "Modifiché j'archivi CSS e JavaScript d'àutri utent",
'right-editusercss' => "Modifiché j'archivi CSS d'àutri utent",
'right-edituserjs' => "Modifiché j'archivi JavaScript d'àutri utent",
+'right-editmyusercss' => 'Modifiché ij sò archivi CSS utent',
+'right-editmyuserjs' => 'Modifiché ij sò archivi JavaScript utent',
+'right-viewmywatchlist' => "Vëdde la lista ëd lòn ch'as ten sot-euj",
+'right-editmywatchlist' => "Modifiché la lista ëd lòn ch'as ten sot-euj. Ch'a nòta che chèiche assion a giontran ancora dle pàgine sensa 's drit.",
+'right-viewmyprivateinfo' => "Vëdde ij sò dàit përsonaj (pr'esempi adrëssa ëd pòsta eletrònica, nòm ver)",
+'right-editmyprivateinfo' => "Modifiché ij sò dàit privà (pr'esempi adrëssa ëd pòsta eletrònica, nòm ver)",
'right-rollback' => "Gavé an pressa le modìfiche ëd l'ùltim utent che a l'ha modificà na pàgina particolar",
'right-markbotedits' => "Marché le modìfiche tirà andré com modìfiche d'un trigomiro",
'right-noratelimit' => "Nen esse tocà dal lìmit d'assion",
* @author Aotake
* @author Bangin
* @author Bennylin
+ * @author Benojan
* @author Beta16
* @author Bilalokms
* @author Boivie
{{Related|Day-at}}',
# Bad image list
-'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
+'bad_image_list' => '箇条信息只出现在引导管理员用正确个格式加链接。弗会徕Mediawiki别荡处出现。',
/*
Short names for language variants used for language conversion links.
'metadata-help' => 'This message is followed by a table with 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 {{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.}}
+'metadata-fields' => '{{doc-important|覅翻译列表项,只翻译上头个文本!畀 "<code>* make</code>" 搭别个列表项正确保留。}}
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.
'userlogin-resetpassword-link' => 'Resetare parolă',
'helplogin-url' => 'Help:Autentificare',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajutor la autentificare]]',
+'userlogin-loggedin' => 'Sunteți deja {{GENDER:$1|autentificat|autentificată}} ca {{GENDER:$1|$1}}.
+Utilizați formularul de mai jos pentru a vă autentifica cu alt nume de utilizator.',
+'userlogin-createanother' => 'Creează un alt cont',
'createacct-join' => 'Introduceți-vă informațiile mai jos.',
'createacct-another-join' => 'Introduceți, mai jos, informațiile noului cont.',
'createacct-emailrequired' => 'Adresă de e-mail',
'watchnologintext' => 'Za urejanje spiska nadzorov morate biti [[Special:UserLogin|prijavljeni]].',
'addwatch' => 'Dodaj na spisek nadzorov',
'addedwatchtext' => 'Stran »[[:$1]]« je bila dodana na vaš [[Special:Watchlist|spisek nadzorov]].
-Morebitne spremembe te strani in pripadajoče pogovorne strani bodo navedene tukaj.',
+Tam bodo navedene prihodnje spremembe te strani in pripadajoče pogovorne strani.',
'removewatch' => 'Odstrani s spiska nadzorov',
'removedwatchtext' => 'Stran »[[:$1]]« je bila odstranjena z vašega [[Special:Watchlist|spiska nadzorov]].',
'watch' => 'Opazuj',
'logentry-newusers-create2' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3',
'logentry-newusers-byemail' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3; geslo je bilo poslano po e-pošti',
'logentry-newusers-autocreate' => 'Račun $1 je bil samodejno {{GENDER:$2|ustvarjen}}',
-'logentry-rights-rights' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} članstvo skupine $3 z $4 na $5',
-'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} članstvo skupine $3',
+'logentry-rights-rights' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3 z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3',
'logentry-rights-autopromote' => '$1 je {{GENDER:$2|bil samodejno povišan|bila samodejno povišana|bil(-a) samodejno povišan(-a)}} z $4 na $5',
'rightsnone' => '(nobeno)',
'december-date' => '12月 $1',
# Categories related messages
-'pagecategories' => '$1個分類',
+'pagecategories' => '$1个分类',
'category_header' => '“$1”分類裏個頁',
'subcategories' => '兒分類',
-'category-media-header' => '"$1"分類裏向個媒體',
-'category-empty' => "''箇分類裏頁搭媒體能界還嘸。''",
+'category-media-header' => '"$1"分类里个媒体',
+'category-empty' => "''箇分类里页搭媒体能界还呒有。''",
'hidden-categories' => '$1囥脫分類',
'hidden-category-category' => '囥脫分類',
'category-subcat-count' => '{{PLURAL:$2|箇分類便只接落去許兒分類。|箇分類有$1個兒分類,攏共$2個兒分類。}}',
'category-subcat-count-limited' => '箇分類有下向許$1個兒分類。',
'category-article-count' => '{{PLURAL:$2|箇分類便只下向許頁。|箇分類裏有下底$1許頁,攏共$2張。}}',
'category-article-count-limited' => '能界個分類裏有下底$1頁。',
-'category-file-count' => '{{PLURAL:$2|箇分類便只下向個文件。|箇分類裏有下底$1許文件,攏共$2個文件。}}',
+'category-file-count' => '{{PLURAL:$2|箇分类便只下头个文件。|箇分类里有下头$1个文件,共$2个文件。}}',
'category-file-count-limited' => '能界個分類裏有下底$1個文件。',
'listingcontinuesabbrev' => '接落。',
'index-category' => '索引拉许个页面',
-'noindex-category' => '弗曾索引拉许个页面',
+'noindex-category' => '朆索引个页',
'broken-file-category' => '有无用文件链接个页',
-'about' => '有關',
+'about' => '有关',
'article' => '內容頁',
-'newwindow' => '(用新窗口開)',
-'cancel' => '消',
+'newwindow' => '(用新窗口开)',
+'cancel' => '取消',
'moredotdotdot' => '還多...',
'morenotlisted' => '箇張表還朆完成。',
'mypage' => '我个页面',
'vector-action-unprotect' => '换保护状态',
'vector-simplesearch-preference' => '用简单搜寻条(只Vector皮肤好用)',
'vector-view-create' => '建',
-'vector-view-edit' => 'ç·¨',
-'vector-view-history' => '望歷史',
-'vector-view-view' => 'è®\80',
-'vector-view-viewsource' => 'æ\9c\9bæº\90碼',
-'actions' => 'å\8b\95作',
-'namespaces' => 'å\90\8då\97空é\96\93',
-'variants' => '變量',
+'vector-view-edit' => 'ç¼\96',
+'vector-view-history' => '望页史',
+'vector-view-view' => '读',
+'vector-view-viewsource' => 'æ\9c\9bæº\90ç \81',
+'actions' => 'å\8a¨作',
+'namespaces' => 'å\90\8då\97空é\97´',
+'variants' => '变量',
'errorpagetitle' => '錯誤',
-'returnto' => 'è½\89到$1。',
-'tagline' => '從{{SITENAME}}來',
+'returnto' => '转到$1。',
+'tagline' => '从{{SITENAME}}来',
'help' => '幫忙',
-'search' => 'å°\8b',
-'searchbutton' => '尋',
+'search' => '寻',
+'searchbutton' => '搜寻',
'go' => '去',
'searcharticle' => '去',
'history' => '頁史',
-'history_short' => '歷史',
+'history_short' => '历史',
'updatedmarker' => '從上趟訪問起個更新',
'printableversion' => '打印版',
-'permalink' => 'è\80\81ä¸\96é\8f\88接',
+'permalink' => 'è\80\81ä¸\96é\93¾接',
'print' => '打印',
'view' => '望',
-'edit' => 'ç·¨',
+'edit' => 'ç¼\96',
'create' => '建',
'editthispage' => '編箇頁',
'create-this-page' => '建箇頁',
'protectthispage' => '保箇頁',
'unprotect' => '變更保態',
'unprotectthispage' => '變更箇頁保態',
-'newpage' => 'æ\96°é \81',
+'newpage' => 'æ\96°é¡µ',
'talkpage' => '探討箇頁',
'talkpagelinktext' => '討論',
'specialpage' => '特別頁',
-'personaltools' => 'ç§\81人å\82¢伙',
+'personaltools' => 'ç§\81人家伙',
'postcomment' => '新段',
'articlepage' => '望內容頁',
-'talk' => 'æ\8e¢è¨\8e',
+'talk' => 'æ\8e¢è®¨',
'views' => '望',
-'toolbox' => 'å\82¢伙匣',
+'toolbox' => '家伙匣',
'userpage' => '望用戶頁',
'projectpage' => '望計劃頁',
'imagepage' => '望文件頁',
'viewhelppage' => '望幫忙頁',
'categorypage' => '望分類頁',
'viewtalkpage' => '望探討頁',
-'otherlanguages' => 'å\88¥æ¨£è©±版',
-'redirectedfrom' => '(從$1轉戳來)',
+'otherlanguages' => 'å\88«æ ·è¯\9d版',
+'redirectedfrom' => '(从$1转戳到箇里)',
'redirectpagesub' => '轉戳頁',
-'lastmodifiedat' => 'ç®\87é \81æ¤å\9e¡å¾ $1 $2è½\89æ\94¹。',
+'lastmodifiedat' => 'ç®\87页æ¤å\9e¡æ\9d¥$1 $2æ\94¹è¿\9b。',
'viewcount' => '箇頁望過$1垡。',
'protectedpage' => '受保頁',
'jumpto' => '蹦到:',
-'jumptonavigation' => 'å°\8e航',
-'jumptosearch' => '尋',
+'jumptonavigation' => '导航',
+'jumptosearch' => '搜寻',
'view-pool-error' => '對弗住,服務器能界超載。
望箇頁個人忒多哉。
相勞爾等瑲起再試試相趒箇頁來。
'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).
-'aboutsite' => '有關{{SITENAME}}',
-'aboutpage' => 'Project:有關',
+'aboutsite' => '有关{{SITENAME}}',
+'aboutpage' => 'Project:有关',
'copyright' => '内容侪拉$1下底发布。',
-'copyrightpage' => '{{ns:project}}:ç\89\88æ¬\8a',
-'currentevents' => '此垡大事幹',
-'currentevents-url' => 'Project:此垡大事幹',
+'copyrightpage' => '{{ns:project}}:ç\89\88æ\9d\83',
+'currentevents' => '箇阶段个事干',
+'currentevents-url' => 'Project:箇阶段个事干',
'disclaimers' => '甮追問',
'disclaimerpage' => 'Project:甮追問',
-'edithelp' => '編幫å¿\99',
-'helppage' => 'Help:目錄',
+'edithelp' => 'ç¼\96å\86\99帮å\8a©',
+'helppage' => 'Help:目录',
'mainpage' => '封面',
'mainpage-description' => '封面',
'policy-url' => 'Project:策略',
-'portal' => '社å\8d\80è\87ºé\96\80',
-'portal-url' => 'Project:社å\8d\80è\87ºé\96\80',
+'portal' => '社å\8cºå\8f°é\97¨',
+'portal-url' => 'Project:社å\8cºå\8f°é\97¨',
'privacy' => '隱私策略',
'privacypage' => 'Project:隱私策略',
'badaccess-groups' => '爾個請求要徠{{PLURAL:$2|箇個}}用戶組裏好用:$1。',
'versionrequired' => '需要$1版個MediaWiki',
-'versionrequiredtext' => '要$1版個MediaWiki好用箇頁。望[[Special:Version|版本頁]]。',
+'versionrequiredtext' => '用箇页需要$1版个MediaWiki。望[[Special:Version|版本页]]。',
'ok' => '好',
'retrievedfrom' => '取自“$1”',
-'youhavenewmessages' => '爾有$1($2)。',
-'newmessageslink' => '新信息',
+'youhavenewmessages' => '你侬有$1($2)。',
+'newmessageslink' => '新消息',
'newmessagesdifflink' => '此垡更改',
'newmessageslinkplural' => '{{PLURAL:$1|新消息}}',
'newmessagesdifflinkplural' => '此垡̺{{PLURAL:$1|变化}}',
'youhavenewmessagesmulti' => '爾徠$1裏有新信息',
'editsection' => '編',
-'editold' => '编辑',
+'editold' => '编',
'viewsourceold' => '望源碼',
-'editlink' => 'ç·¨',
+'editlink' => 'ç¼\96',
'viewsourcelink' => '望源碼',
-'editsectionhint' => 'ç·¨段: $1',
-'toc' => '目錄',
+'editsectionhint' => 'ç¼\96段: $1',
+'toc' => '目录',
'showtoc' => '顯示',
'hidetoc' => '囥脫',
'thisisdeleted' => '望要弗復原$1?',
'feed-invalid' => '訂閱類型無效。',
'feed-unavailable' => '目前弗支持聯訂',
'site-rss-feed' => '$1個RSS訂閱',
-'site-atom-feed' => '$1個Atom訂閱',
+'site-atom-feed' => '$1个Atom订阅',
'page-rss-feed' => '“$1”個RSS訂閱',
-'page-atom-feed' => '"$1" 個Atom訂閱',
-'red-link-title' => '$1 ï¼\88å\98¸ç®\87é \81)',
+'page-atom-feed' => '"$1" 个Atom订阅',
+'red-link-title' => '$1 ï¼\88å\91\92æ\9c\89ç®\87页)',
'sort-descending' => '倒排',
'sort-ascending' => '顺排',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'é \81',
-'nstab-user' => 'ç\94¨æ\88¶é \81',
+'nstab-main' => '页',
+'nstab-user' => 'ç\94¨æ\88·é¡µ',
'nstab-media' => '媒體頁',
-'nstab-special' => 'ç\89¹å\88¥é \81',
+'nstab-special' => 'ç\89¹å\88¥é¡µ',
'nstab-project' => '項目頁',
'nstab-image' => '文件',
'nstab-mediawiki' => '信息',
'nstab-template' => '模板',
'nstab-help' => '幫忙頁',
-'nstab-category' => '分類',
+'nstab-category' => '分类',
# Main script and global functions
'nosuchaction' => '嘸能操作',
箇蛮有可能是因为数据库拉许维修,完成仔即可恢复。
管理员有如下解释:$1',
-'missing-article' => '数据库寻弗着预期个页面文字:“$1”$2。
+'missing-article' => '数据库寻弗着想寻个页面文本:名字“$1”$2。
-ç®\87ä¸\80è\88¬æ\80§æ\98¯ç\94±äº\8eç\82¹å\87»äº\86é\93¾å\90\91æ\97§æ\9c\89å·®å¼\82æ\88\96å\8e\86å\8f²ä¸ªé\93¾æ\8e¥ï¼\8cè\80\8cå\8e\9fæ\9c\89修订已æ\8b¨å\88 é\99¤å¯¼è\87´ä¸ªã\80\82
+箇一般是由于点击了链向旧有差异或历史个链接,而原有修订已拨删除导致个。
-如果情况弗是箇能介,侬作兴寻着仔软件个一只内部错误。请拿URL地址记录下来,并向[[Special:ListUsers/sysop|管理员]]报告。',
+如果弗是箇种情况,你侬作兴寻着软件里一个错误。畀URL地址记落来,搭[[Special:ListUsers/sysop|管理员]]报告。',
'missingarticle-rev' => '(修订#:$1)',
'missingarticle-diff' => '(两样:$1、$2)',
'readonly_lag' => '从数据库服务器垃拉从主服务器上更新,数据库已经拨自动锁定',
渠作兴已经拨别人家删除脱哉。',
'cannotdelete-title' => '"$1"箇页删弗爻',
'no-null-revision' => '"$1"页呒处建新个修改',
-'badtitle' => '该只标题弗来三',
+'badtitle' => '坏标题',
'badtitletext' => '所请求页面个标题是无效个、弗存在,跨语言或跨wiki链接个标题错误。渠作兴包含一只或多只弗好用拉标题里向字符。',
'perfcached' => '下向是缓存数据,呒数弗是最新个。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
'perfcachedts' => '下头是缓存数据,压末一趟更新辰光是$1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'wrong_wfQuery_params' => '错误个参数拨传递到 wfQuery()<br />
函数:$1<br />
查询:$2',
-'viewsource' => '源码',
+'viewsource' => 'æ\9c\9bæº\90ç \81',
'actionthrottled' => '动作已压制',
'actionthrottledtext' => '基于反垃圾链接个考量,限制垃拉短时间内多趟重复箇只操作。请过脱几分钟再试试看。',
'protectedpagetext' => '箇页锁牢定,防编搭各许操作。',
'viewsourcetext' => '侬可以查看搭仔复制箇只页面个源码:',
-'viewyourtext' => "你好望也好畀'''你编个'''复制到箇页:",
+'viewyourtext' => "你侬好望也好畀'''你侬编个'''复制到箇页:",
'protectedinterface' => '箇页为箇维基个软件提供界面文本,锁牢定防乱用。
加改全部维基个译文,用[//translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。',
'editinginterface' => "'''警告:''' 侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。假使要畀全部维基翻译,用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hans translatewiki.net],MediaWiki软件个本地化计划。",
'yourpassword' => '密码:',
'userlogin-yourpassword-ph' => '密码打进去',
'createacct-yourpassword-ph' => '密码打进去',
-'yourpasswordagain' => 'å\86\8dæ\8b\8dä¸\80é\81\8då¯\86ç \81:',
+'yourpasswordagain' => 'å¯\86ç \81å\86\8dæ\89\93ä¸\80é\81\8d:',
'createacct-yourpasswordagain-ph' => '密码打一遍添',
-'remembermypassword' => 'å\9e\83æ\8b\89ç®\87é\83¨ç\94µè\84\91ä¸\8aè®°ç\89¢æ\88\91个å¯\86ç \81ï¼\88å\8f¯ç»´æ\8c\81$1{{PLURAL:$1|日|日}})',
+'remembermypassword' => 'å¾\95ç®\87æµ\8fè§\88å\99¨é\87\8cç\95\80æ\88\91ç\99»è¿\9bå\8e»ä¸ªè®°ç\89¢ï¼\88è®°$1{{PLURAL:$1|日|日}})',
'userlogin-remembermypassword' => '长期徕线里',
'userlogin-signwithsecure' => '用保险链接',
'yourdomainname' => '侬个域名:',
'password-change-forbidden' => '箇wiki裏呒处改你侬个密码。',
'externaldberror' => '迭个作兴是由于验证数据库错误或者侬拨禁止更新侬个外部账号。',
-'login' => '登录',
-'nav-login-createaccount' => '登å½\95 / å¼\80æ\88·',
-'loginprompt' => 'å®\9aè§\84è¦\81å\90¯ç\94¨ä»\94ç¼\93å\98ï¼\88cookiesï¼\89å\80·å\86\8d好ç\99»å½\95å\88°{{SITENAME}}。',
-'userlogin' => '登录 / 新开户头',
+'login' => '登进去',
+'nav-login-createaccount' => '登è¿\9bå\8e» / 建账å\8f·',
+'loginprompt' => 'å¿\85é¡»ç\94¨ç¼\93å\98ï¼\88cookiesï¼\89好ç\99»è¿\9b{{SITENAME}}。',
+'userlogin' => '登进去 / 建账号',
'userloginnocreate' => '登录',
'logout' => '登出',
'userlogout' => '登出',
'notloggedin' => '弗曾登录',
'userlogin-noaccount' => '账号还呒?',
'userlogin-joinproject' => '加进{{SITENAME}}',
-'nologin' => "侬è¿\98å\91\92没账æ\88·ï¼\9f'''$1'''ã\80\82",
-'nologinlink' => '新开户头',
-'createaccount' => '新开户头',
+'nologin' => "ä½ ä¾¬è¿\98å\91\92æ\9c\89è´¦å\8f·ï¼\9f'''$1'''ã\80\82",
+'nologinlink' => '建新账号',
+'createaccount' => '建账号',
'gotaccount' => "已经有仔帐号哉? '''$1'''。",
'gotaccountlink' => '登录',
'userlogin-resetlink' => '忘记登录细节?',
'userlogin-resetpassword-link' => '转设密码',
'helplogin-url' => '帮助ː登进',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登进帮忙]]',
-'userlogin-loggedin' => '你侬已经以{{GENDER:$1|$1}}登进。用下向个表以别样身份登进。',
+'userlogin-loggedin' => '你侬用{{GENDER:$1|$1}}登进来哉。用下向个表以别样身份登进。',
'userlogin-createanother' => '建别样账号',
'createacct-join' => '下向打进你侬个信息。',
'createacct-another-join' => '下向打进新账号个信息。',
'passwordtooshort' => '密码起码要$1个字符。',
'password-name-match' => '密码弗好搭户名一样。',
'password-login-forbidden' => '用箇名字搭密码是弗准个。',
-'mailmypassword' => 'æ\8b¿æ\96°å¯\86ç \81å¯\84æ\8b¨我',
+'mailmypassword' => 'æ\96°å¯\86ç \81ç\94¨ç\94µå\90ä¿¡å¯\84ç\95\80我',
'passwordremindertitle' => '{{SITENAME}} 个临时新密码',
'passwordremindertext' => '有人(作兴是侬,来自IP地址$1)已经请求{{SITENAME}}个新密码($4)。
用户“$2”个一只新临时密码现在已经设置好为“$3”。
'link_sample' => '链接标题',
'link_tip' => '内部链接',
'extlink_sample' => 'http://www.example.com 链接标题',
-'extlink_tip' => 'å¤\96é\83¨é\93¾æ\8e¥ï¼\88å¼\97è¦\81å¿\98è®°è\84±å\89\8d头å\8a http://)',
+'extlink_tip' => 'å¤\96é\83¨é\93¾æ\8e¥ï¼\88å\89\8d头记ç\89¢å\8a http://)',
'headline_sample' => '标题文本',
'headline_tip' => '2级标题文字',
-'nowiki_sample' => 'å\9e\83æ\8b\89ç®\87æ\90插入非格式文本',
-'nowiki_tip' => '忽ç\95¥wiki格式',
+'nowiki_sample' => 'å¾\95ç®\87é\87\8c插入非格式文本',
+'nowiki_tip' => 'å¼\97管wiki格式',
'image_tip' => '嵌入文件',
'media_tip' => '文件链接',
-'sig_tip' => '签名搭仔辰光戳',
-'hr_tip' => '水平线 (小心使用)',
+'sig_tip' => '签名搭辰光戳',
+'hr_tip' => '水平线 (小心用)',
# Edit pages
'summary' => '摘要:',
'subject' => '主题 / 标题:',
-'minoredit' => 'ç®\87æ\98¯å\8fªç»\86微个æ\94¹å\8a¨',
-'watchthis' => '监控箇只页面',
+'minoredit' => 'ç®\87æ\98¯å°\8få\8f\98å\8c\96',
+'watchthis' => '关注箇页',
'savearticle' => '保存页面',
-'preview' => '预览',
-'showpreview' => '显示预览',
+'preview' => '望望相',
+'showpreview' => '显示望望相',
'showlivepreview' => '实时预览',
-'showdiff' => '显示改动',
-'anoneditwarning' => "'''警告:''' 侬弗曾登录。侬个IP地址会得记录拉页面个编辑历史里向。",
+'showdiff' => '显示变化',
+'anoneditwarning' => "'''警告:''' 你侬朆登进来。
+你侬个IP地址会记进箇页个编史里。",
'anonpreviewwarning' => "''侬弗曾登录。侬个IP位址会得记录拉此页个编辑历史里向。''",
'missingsummary' => "'''提示:''' 侬弗曾提供编辑摘要。假使侬再次单击保存,侬个编辑将弗带编辑摘要保存。",
'missingcommenttext' => '请垃下头输入备注。',
要创建该页面呢,就勒下底个框框里向开始写([[{{MediaWiki:Helppage}}|帮助页面]]浪有更加多个信息)。
要是倷是弗用心到该搭个说话,只要点击倷浏览器个'''返回'''揿钮。",
'anontalkpagetext' => "---- ''箇是一个还弗曾建立账户个匿名用户个讨论页, 箇咾我伲只好用IP地址来搭渠联络。该IP地址可能由几名用户共享。如果侬是一名匿名用户并认为箇只页面高头个评语搭侬弗搭界,请 [[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>,暂时弗允许你侬建箇页。',
'userpage-userdoesnotexist' => '用户账户“<nowiki>$1</nowiki>”弗曾创建。请垃拉创建/编辑迭个页面前头先检查一记。',
'userpage-userdoesnotexist-view' => '用户账户“$1”弗曾创建。',
'blocked-notice-logextract' => '箇位用户箇歇畀封锁垃许。
'userinvalidcssjstitle' => "'''警告:''' 弗存在皮肤\"\$1\"。注意自定义个 .css 搭 .js 页要使用小写标题,譬如,{{ns:user}}:Foo/vector.css 弗同于 {{ns:user}}:Foo/Vector.css。",
'updated' => '(已更新)',
'note' => "'''注意:'''",
-'previewnote' => "'''该个è¿\98å\8fªæ\98¯é¢\84è§\88ï¼\9bæ\94¹å\8a¨è¿\98æ\9c\86ä¿\9då\98!'''",
+'previewnote' => "'''è®°ç\89¢ï¼\81ç®\87è¿\98æ\98¯â\80\9cæ\9c\9bæ\9c\9bç\9b¸â\80\9dï¼\9bä½ ä¾¬ä¸ªä¿®æ\94¹è¿\98æ\9c\86ä¿\9då\98èµ·!'''",
'previewconflict' => '箇个预览显示了上头文字编辑区里向个内容。渠会得垃拉侬保存之后出现。',
'session_fail_preview' => "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
'session_fail_preview_html' => "'''弗好意思!我伲弗好处理侬垃拉进程数据落失辰光个编辑。'''
'''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请 [[Special:UserLogout|退出]]并重新登录。",
'token_suffix_mismatch' => "'''由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。'''
箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
-'editing' => '正在编辑$1',
-'editingsection' => '正在编辑$1(段落)',
+'editing' => '徕里编$1',
+'editingsection' => '徕里编写$1(段)',
'editingcomment' => '垃许编辑 $1 (新段落)',
'editconflict' => '编辑冲突: $1',
'explainconflict' => '有人垃拉侬开始编辑之后更改仔页面。
'nonunicodebrowser' => "'''警告:侬个浏览器弗兼容Unicode编码。'''箇搭有一只工作区将使侬可以安全编辑页面:非ASCII字符将以十六进制编码方式出现垃拉编辑框里向。",
'editingold' => "''' 注意:倷勒里改动一只已经过期个页面修改。 如果倷保存俚个说话,勒拉该个修改之后个亨白浪当个修改侪会呒拨个。'''",
'yourdiff' => '两样',
-'copyrightwarning' => "请注æ\84\8f侬对{{SITENAME}}个æ\89\80æ\9c\89è´¡ç\8c®ä¾ªå¿\85é¡»å\9e\83æ\8b\89$2ä¸\8b头å\8f\91å¸\83ï¼\8c请æ\9f¥ç\9c\8bå\9e\83æ\8b\89$1个细节。
-å\81\87使侬å¼\97å¸\8cæ\9c\9b侬个æ\96\87å\97æ\8b¨ä»»æ\84\8fä¿®æ\94¹æ\90å\86\8då\8f\91å¸\83ï¼\8c请å¼\97è¦\81æ\8f\90交。<br />
-侬å\90\8cæ\97¶ä¹\9fè¦\81å\90\91æ\88\91ä¼²ä¿\9dè¯\81侬æ\89\80æ\8f\90交个å\86\85容æ\98¯ä¾¬è\87ªå®¶æ\89\80ä½\9cï¼\8cæ\88\96å¾\97è\87ªä¸\80个å¼\97å\8f\97ç\89\88æ\9d\83ä¿\9dæ\8a¤æ\88\96ç\9b¸ä¼¼è\87ªç\94±ä¸ªæ\9d¥æº\90。
-'''弗要垃拉弗曾获得授权个情况下头发表!'''<br />",
+'copyrightwarning' => "请注æ\84\8fä½ ä¾¬å¯¹{{SITENAME}}个ä¸\80å\88\87è´¡ç\8c®å\85¨å¿\85é¡»å¾\95$2ä¸\8b头å\8f\91å¸\83ï¼\8cæ\9f¥$1æ\9c\9b细节。
+å\81\87ä½¿ä½ ä¾¬å¼\97æ\83³è\87ªå·±ä¸ªæ\96\87å\97é\81å\88°é\9a\8fæ\84\8fä¿®æ\94¹æ\90转å\8f\91ï¼\8cè¦\85æ\8f\90交ä¸\8aæ\9d¥。<br />
+ä½ ä¾¬ä¹\9fè¦\81å\90\91æ\88\91é\87\8cä¿\9dè¯\81ï¼\8cç®\87æ\98¯ä½ 侬è\87ªå®¶å\86\99个ï¼\8cè¦\81å\8b¿ä»\8eå¼\97å\8f\97ç\89\88æ\9d\83ä¿\9dæ\8a¤ä¸ªè¦\81å\8b¿å·®å¼\97å¤\9a个è\87ªç\94±èµ\84æº\90æ\9d¥。
+'''覅徕朆获得授权个情况下发表!'''<br />",
'copyrightwarning2' => "请注意侬对{{SITENAME}}个所有贡献
侪可能畀别个贡献者编辑,修改或删除。
假使侬弗希望侬个文字畀任意修改搭仔再发布,请弗要提交。<br />
'cascadeprotectedwarning' => '警告:本页已经畀保护,只有拥有管理员权限个用户再好修改,因为本页已畀下底眼连锁保护个{{PLURAL:$1|一只|多只}}页面所包含:',
'titleprotectedwarning' => "'''警告:本页面已畀锁定,需要[[Special:ListGroupRights|指定权限]]方可创建。'''
最近个日志垃拉下底提供以便参考:",
-'templatesused' => '{{PLURAL:$1|只模板}}垃拉本页使用:',
+'templatesused' => '箇页有{{PLURAL:$1|个模板}}:',
'templatesusedpreview' => '{{PLURAL:$1|只模板}}垃拉箇趟预览里向拨使用:',
'templatesusedsection' => '垃拉箇只段落里向使用个{{PLURAL:$1|模板|模板}}有:',
'template-protected' => '(保护)',
-'template-semiprotected' => '(半保护垃许)',
-'hiddencategories' => '箇只页面是属于$1个隐藏分类个成员:',
+'template-semiprotected' => '(半保护牢)',
+'hiddencategories' => '箇页属$1个隐藏分类个成员:',
'nocreatetext' => '{{SITENAME}}限制了创建新页面功能。侬可以返回并编辑已有个页面,或者[[Special:UserLogin|登录或创建新账户]]。',
'nocreate-loggedin' => '侬呒没权限创建新页面。',
'sectioneditnotsupported-title' => '段落编辑弗支持',
'sectioneditnotsupported-text' => '此页面弗支持编辑段落。',
'permissionserrors' => '权限错误',
'permissionserrorstext' => '为仔下头个{{PLURAL:$1|原因|原因}}咾侬无权进行箇只操作:',
-'permissionserrorstext-withaction' => '为ä»\94ä¸\8b头个{{PLURAL:$1|å\8e\9få\9b |å\8e\9få\9b }}å\92¾ä¾¬æ\97 æ\9d\83进行$2操作:',
-'recreate-moveddeleted-warn' => "'''è¦å\91\8a: 侬ç\8e°å\9c¨é\87\8dæ\96°å\88\9b建ä¸\80å\8fªä¹\8bå\89\8dæ\9b¾ç»\8få\88 é\99¤è¿\87æ\87个页é\9d¢ã\80\82'''
+'permissionserrorstext-withaction' => 'ä¸\8b头个{{PLURAL:$1|å\8e\9få\9b |å\8e\9få\9b }}ä¹\8bæ\95\85ï¼\8cä½ ä¾¬å\91\92å¤\84进行$2操作:',
+'recreate-moveddeleted-warn' => "'''è¦å\91\8a: ä½ ä¾¬è¦\81转建ä¸\80个ä¹\8bå\89\8då\88 è\84±è¿\87个页é\9d¢ã\80\82'''
-侬åº\94该è¦\81è\80\83è\99\91è\80\83è\99\91继ç»ç¼\96è¾\91ç®\87å\8fªé¡µé\9d¢是否合适。
-为方便起见,箇只页面个删除记录提供垃拉下底:",
-'moveddeleted-notice' => '箇只页面已经删除。
-箇只页面个删除搭移动日志提供垃拉下头以便参考。',
+ä½ ä¾¬åº\94该è¦\81è\80\83è\99\91è\80\83è\99\91继ç»ç¼\96ç®\87页是否合适。
+方便考虑,箇页个删记录提供到下头:",
+'moveddeleted-notice' => '箇页删脱哉。
+箇页个删搭移个日志徕下头提供以便参考。',
'log-fulllog' => '查看完整日志',
'edit-hook-aborted' => '编辑畀钩子取消。
渠弗曾畀出解释。',
必须小于$2趟调用,现在有$1趟调用。',
'expensive-parserfunction-category' => '页面包含忒多耗费资源个函数调用',
-'post-expand-template-inclusion-warning' => '警告:包含模板大小过大。
-一些模板将弗会畀包含垃许。',
-'post-expand-template-inclusion-category' => '模板包含上限已经超过个页面',
+'post-expand-template-inclusion-warning' => "'''警告:'''模板用忒多。
+一星模板弗'''用'''。",
+'post-expand-template-inclusion-category' => '模板用过量个页',
'post-expand-template-argument-warning' => '警告:箇只页面至少包含一只模参数,渠个扩展大小过大。
箇眼参数已经畀忽略。',
'post-expand-template-argument-category' => '包含忽略模板参数个页面',
$3封禁个原因是''$2''",
# History pages
-'viewpagelogs' => 'æ\9f¥ç\9c\8b该页é\9d¢日志',
+'viewpagelogs' => 'æ\9c\9bç®\87页日志',
'nohistory' => '该只页面呒拨编辑历史。',
'currentrev' => '最新修订版本',
'currentrev-asof' => '于$1个最新修订版',
'revisionasof' => '垃拉$1所作出个修订版',
'revision-info' => '垃拉$1由$2所作修订版本',
-'previousrevision' => '←再旧版',
+'previousrevision' => '←还旧版',
'nextrevision' => '新点个版本→',
'currentrevisionlink' => '最新修订',
'cur' => '当前',
'page_first' => '最前',
'page_last' => '压末',
'histlegend' => '选择比较版本:标记要比较个两只版本,回车或者揿页面底里个揿钮。<br /> 图例:(当前) = 搭当前版本有啥两样, (上个) = 搭上个版本有啥两样,小 = 小改动。',
-'history-fieldset-title' => '浏览历史',
-'history-show-deleted' => '仅限已经删除个',
+'history-fieldset-title' => '浏览页史',
+'history-show-deleted' => '只准删脱个',
'histfirst' => '最老',
'histlast' => '最新',
'historysize' => '($1字节)',
'logdelete-success' => "'''事件个可见性已经成功设置。'''",
'logdelete-failure' => "'''事件个可见性无法设置:'''
$1",
-'revdel-restore' => 'æ\9b´æ\94¹可见性',
+'revdel-restore' => 'æ\94¹å\8f\98可见性',
'revdel-restore-deleted' => '已删除个修订版本',
'revdel-restore-visible' => '可见个修订版本',
'pagehist' => '页面历史',
'mergelogpagetext' => '下底是只最近发生个页面历史合并个记录列表。',
# Diffs
-'history-title' => 'â\80\9c$1â\80\9d个修订å\8e\86å\8f²',
-'lineno' => '第$1行:',
+'history-title' => '“$1”个修订史',
+'lineno' => '第$1排:',
'compareselectedversions' => '比较选中个版本',
'showhideselectedversions' => '显示/囥脱选定修订版本',
'editundo' => '撤销',
-'diff-multi' => '($1个中途个修订版本无没显示。)',
+'diff-multi' => '($2个用户个$1个中央版本朆显示。)',
# Search results
-'searchresults' => '搜索结果',
-'searchresults-title' => '对“$1”个搜索结果',
+'searchresults' => '搜寻结果',
+'searchresults-title' => '搜寻“$1”个结果',
'searchresulttext' => '更加全面个关于拉{{SITENAME}}里向搜索个信息,请倷看[[{{MediaWiki:Helppage}}:搜索|搜索{{SITENAME}}]]。',
'searchsubtitle' => '搜索\'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|所有以 "$1" 打头个页面]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有链接到“$1”个页面]])',
'searchsubtitleinvalid' => "倷搜寻 '''$1'''",
'notextmatches' => '呒没匹配个页面文本',
'prevn' => '上个 $1',
'nextn' => '下个 {{PLURAL:$1|$1}}',
-'prevn-title' => '前$1项结果',
-'nextn-title' => '后$1项结果',
-'shown-title' => '每页显示$1项结果',
+'prevn-title' => '前$1个结果',
+'nextn-title' => '后$1个结果',
+'shown-title' => '一页显示$1个结果',
'viewprevnext' => '查看($1 {{int:pipe-separator}} $2)($3)',
'searchmenu-legend' => '搜索选项',
-'searchmenu-exists' => "'''垃拉箇只wiki高头已经有只页面叫“[[:$1]]”哉'''",
-'searchmenu-new' => "'''å\9e\83æ\8b\89该wikié\87\8cå\90\91æ\96°å»ºé¡µé\9d¢â\80\9c[[:$1]]â\80\9d!'''",
+'searchmenu-exists' => "'''箇wiki里有一页名字“[[:$1]]”哉'''",
+'searchmenu-new' => "'''å¾\95ç®\87wikié\87\8c建â\80\9c[[:$1]]â\80\9d页!'''",
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|浏览带箇只前缀个页面]]',
-'searchprofile-articles' => '内容页面',
-'searchprofile-project' => '帮助搭仔项目页面',
+'searchprofile-articles' => '内容页',
+'searchprofile-project' => '帮助搭项目页',
'searchprofile-images' => '多媒体',
'searchprofile-everything' => '全部',
'searchprofile-advanced' => '高级',
-'searchprofile-articles-tooltip' => 'å\9e\83æ\8b\89$1é\87\8cå\90\91æ\90\9cç´¢',
-'searchprofile-project-tooltip' => 'å\9e\83æ\8b\89$1é\87\8cå\90\91æ\90\9cç´¢',
-'searchprofile-images-tooltip' => '搜索文件',
-'searchprofile-everything-tooltip' => '搜索全部(包括讨论页面)',
+'searchprofile-articles-tooltip' => 'å¾\95$1é\87\8cæ\90\9c寻',
+'searchprofile-project-tooltip' => 'å¾\95$1é\87\8cæ\90\9c寻',
+'searchprofile-images-tooltip' => '搜寻文件',
+'searchprofile-everything-tooltip' => '搜寻全部内容(包括讨论页)',
'searchprofile-advanced-tooltip' => '垃拉自定义名字空间里向搜索',
'search-result-size' => '$1($2字)',
-'search-result-category-size' => '$1ä½\8dæ\88\90å\91\98ï¼\88$2个å\90分类,$3个文件)',
+'search-result-category-size' => '$1个æ\88\90å\91\98ï¼\88$2个å\84¿分类,$3个文件)',
'search-result-score' => '相关度:$1%',
-'search-redirect' => '(重定向 $1)',
+'search-redirect' => '(转戳到 $1)',
'search-section' => '(段落 $1)',
-'search-suggest' => '侬é\98¿æ\98¯è¦\81寻:$1',
+'search-suggest' => 'ä½ ä¾¬æ\98¯寻:$1',
'search-interwiki-caption' => '姊妹项目',
'search-interwiki-default' => '$1项结果:',
'search-interwiki-more' => '(更多)',
'mwsuggest-disable' => '禁用AJAX建议',
'searcheverything-enable' => '垃拉所有名字空间里向搜索',
'searchrelated' => '相关',
-'searchall' => '所有',
+'searchall' => '全部',
'showingresults' => '下头显示从第<b>$2</b>条开始个<b>$1</b>条结果:',
'showingresultsnum' => '下头显示从第<b>$2</b>条开始个<b>$3</b>条结果:',
-'showingresultsheader' => "对'''$4'''个{{PLURAL:$5|第'''$1'''至第'''$3'''项结果|第'''$1-$2'''项,共'''$3'''项结果}}",
+'showingresultsheader' => "对'''$4'''个{{PLURAL:$5|第'''$1'''至第'''$3'''项结果|第'''$1-$2'''项,共'''$3'''个结果}}",
'nonefound' => "'''注意''':只默认搜索部分名字空间个页面。尝试垃拉侬个搜索语句前头添加“all:”前缀,箇能介好搜索全部页面(包括讨论页、模板咾啥),或者亦可使用所需名字空间作为前缀。",
-'search-nonefound' => '寻弗着搭查询匹配个记录',
+'search-nonefound' => '查询呒有结果。',
'powersearch' => '高级搜索',
'powersearch-legend' => '高级搜索',
'powersearch-ns' => '垃拉箇眼名字空间里向搜索:',
'prefs-namespaces' => '名字空间',
'default' => '默认',
'prefs-files' => '文件',
-'youremail' => '电子邮件:',
+'youremail' => '电子信箱:',
'username' => '用户名:',
'uid' => '用户号:',
-'yourrealname' => 'ç\9c\9få®\9eå§\93å\90\8d:',
+'yourrealname' => 'ç\9c\9få\90\8då\97:',
'yourlanguage' => '语言:',
'yournick' => '绰号:',
'badsig' => '无效原始签名;检查 HTML 标签。',
'gender-unknown' => '我弗想講',
-'gender-male' => '佢编wiki页',
-'gender-female' => '姖编写wiki页',
+'gender-male' => '佢写Wiki',
+'gender-female' => '"姖"写Wiki',
'email' => '电子邮件',
-'prefs-help-email' => '电子邮件是备选个,垃拉侬忘记密码个情况下头可以用得来重置密码。
-侬也可以让别人家通过侬个用户页或者讨论页来联系侬。',
+'prefs-help-email' => '电子信由你侬填弗填,转设密码用得着。',
+'prefs-help-email-others' => '你侬也好来你侬个用户|讨论页里添加自己个电子信连接畀别人联系你用。
+别人联系你是弗晓得你侬个电子信地址个。',
'prefs-help-email-required' => '需要电子邮件地址。',
# User rights
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => '讀箇頁',
-'action-edit' => '编辑箇只页面',
+'action-edit' => '编箇页',
'action-createpage' => '做新頁',
'action-createtalk' => '做討論頁',
'action-minoredit' => '標小編寫',
# Recent changes
'nchanges' => '$1趟更改',
'enhancedrc-history' => '歷史',
-'recentchanges' => '近段辰光个改动',
-'recentchanges-legend' => '近段辰光个改动选项',
+'recentchanges' => '箇阶段个变化',
+'recentchanges-legend' => '箇阶段个变化选项',
'recentchanges-summary' => '登该个页面浪跟踪最近对维基百科个改动。',
'recentchanges-feed-description' => '跟踪此订阅垃拉 wiki 高头个最近更改。',
-'recentchanges-label-newpage' => '此垡編寫開新頁',
-'recentchanges-label-minor' => 'ç®\87æ\98¯å°\8f編寫',
+'recentchanges-label-newpage' => '建新页来编',
+'recentchanges-label-minor' => 'ç®\87æ\98¯å°\8fç¼\96å\86\99',
'rcnote' => "下底是垃拉$4 $5,最近'''$2'''日天里向个'''$1'''趟最近更改记录:",
'rclistfrom' => '显示 $1 以来个新改动',
-'rcshowhideminor' => '$1小改动',
+'rcshowhideminor' => '$1小编写',
'rcshowhidebots' => '$1机器人',
'rcshowhideliu' => '$1登录个用户',
'rcshowhideanons' => '$1匿名用户',
-'rcshowhidemine' => '$1我个改动',
+'rcshowhidemine' => '$1我个修改',
'rclinks' => '显示来拉上个 $2 日里向个最近 $1 趟改动<br />$3',
'diff' => '两样',
'hist' => '历史',
'newpageletter' => '新',
'boteditletter' => '机',
'newsectionsummary' => '/* $1 */ 新段落',
-'rc-enhanced-expand' => '展示零碎',
-'rc-enhanced-hide' => '拿细节囥脱',
+'rc-enhanced-expand' => '显示细节',
+'rc-enhanced-hide' => '畀细节囥脱',
# Recent changes linked
-'recentchangeslinked' => '搭界个改动',
+'recentchangeslinked' => '相关变化',
'recentchangeslinked-feed' => '搭界个改动',
-'recentchangeslinked-toolbox' => '搭界个改动',
+'recentchangeslinked-toolbox' => '相关变化',
'recentchangeslinked-title' => '搭“$1”有关个改动',
-'recentchangeslinked-summary' => "è¿å\8fªé¡µé\9d¢å\88\97示个æ\98¯å¯¹é\93¾å\88°æ\9f\90å\8fªæ\8c\87å®\9a页é\9d¢ä¸ªé¡µé\9d¢è¿\91段辰å\85\89个修订ï¼\88æ\88\96è\80\85æ\98¯å¯¹æ\8c\87å®\9aå\88\86类个æ\88\90å\91\98ï¼\89ã\80\82
-å\9e\83æ\8b\89[[Special:Watchlist|侬个ç\9b\91æ\8e§å\88\97表]]é\87\8cå\90\91个页é\9d¢ä¼\9aå¾\97以'''粗体'''显示。",
+'recentchangeslinked-summary' => "ç®\87页å\88\97å\87ºä¸ªæ\98¯å¯¹é\93¾å\88°æ\9f\90å\8fªæ\8c\87å®\9a页é\9d¢ä¸ªé¡µé\9d¢è¿\91段辰å\85\89个修订ï¼\88æ\88\96è\80\85æ\98¯å¯¹æ\8c\87å®\9aå\88\86类个æ\88\90å\91\98ï¼\89ã\80\82
+å¾\95[[Special:Watchlist|ä½ ä¾¬ä¸ªå\85³æ³¨è¡¨]]é\87\8c个页ç\94¨'''粗体'''显示。",
'recentchangeslinked-page' => '页面名称:',
'recentchangeslinked-to' => '显示链接到指定页面个页面个改动',
# Upload
-'upload' => '上载文物',
+'upload' => '上传文件',
'uploadbtn' => '上载文件',
'reuploaddesc' => '弗傳,轉到傳表單',
'uploadnologin' => '朆登录',
'''<nowiki>[[{{ns:file}}:文件.png|替代文本]]</nowiki>''' 或者用
'''<nowiki>[[{{ns:media}}:文件.ogg]]</nowiki>''' 直接链到文件。",
'uploadlog' => '文件上载日志',
-'uploadlogpage' => '文件上载日志',
+'uploadlogpage' => '文件上传日志',
'uploadlogpagetext' => '下底是最近上载文件列表。',
'filename' => '文件名',
'filedesc' => '小结',
'windows-nonascii-filename' => '箇wiki弗支持文件名用特別個字符。',
'uploadwarning' => '上载警告',
'savefile' => '保存文件',
-'uploadedimage' => '上载 "[[$1]]"',
+'uploadedimage' => '上传 "[[$1]]"',
'sourcefilename' => '源文件:',
'destfilename' => '目标文件名:',
'watchthisupload' => '關注箇文件',
'listfiles-latestversion-no' => '弗是',
# File description page
-'file-anchor-link' => '文物',
+'file-anchor-link' => '文件',
'filehist' => '文件历史',
-'filehist-help' => 'ç\82¹å\87»æ\97¥è\84\9aï¼\8fè¾°å\85\89æ\9f¥ç\9c\8bå½\93æ\97¶å\87ºç\8e°è¿\87æ\87个æ\96\87件ã\80\82',
+'filehist-help' => 'æ\8f¿ä¸\80个æ\97¥è\84\9aï¼\8fè¾°å\85\89æ\9d¥æ\9c\9bå½\93æ\97¶å\87ºç\8e°è¿\87个æ\96\87件ã\80\82',
'filehist-deleteall' => '全删',
'filehist-deleteone' => '删',
'filehist-revert' => '恢复',
'filehist-dimensions' => '维度',
'filehist-filesize' => '文件大細',
'filehist-comment' => '备注',
-'imagelinks' => '文件链接',
-'linkstoimage' => '下头$1只页面链接到本文件:',
-'nolinkstoimage' => 'å\91\92æ\8b¨é¡µé\9d¢é\93¾æ\8e¥å\88°è¯¥å\8fª文件。',
+'imagelinks' => '文件用法',
+'linkstoimage' => '下头$1个页面链到箇文件:',
+'nolinkstoimage' => 'å\91\92æ\9c\89页é\93¾å\88°ç®\87文件。',
'linkstoimage-redirect' => '$1(文件轉戳到)$2',
'sharedupload' => '箇只文件来源于$1,渠作兴垃拉其它项目当中拨应用。',
+'sharedupload-desc-here' => '箇文件$1里个,作兴会来别个项目里用。
+渠个描述页里所描述个显示如下。',
'uploadnewversion-linktext' => '上载该文件个新版',
# File reversion
# Miscellaneous special pages
'nbytes' => '$1字节',
'nmembers' => '$1只成员',
-'unusedimages' => '弗勒浪使用个文件',
+'unusedimages' => '朆用着个文件',
'popularpages' => '热门页面',
'mostlinked' => '链进去顶多个页面',
'mostlinkedcategories' => '链进去顶多个分类',
'mostcategories' => '分类顶多个页面',
'mostimages' => '链进去顶多个图片',
'mostrevisions' => '修订过顶顶多趟数个页面',
-'prefixindex' => '所有带前缀个页面',
+'prefixindex' => '全部带前缀个页面',
'shortpages' => '短页面',
'longpages' => '长页面',
'protectedpages' => '已保护页面',
'protectedtitles' => '已保护个标题',
'listusers' => '用户列表',
'listusers-creationsort' => '照建個日子排',
-'newpages' => '新页面',
+'newpages' => '新页',
'newpages-username' => '用户名:',
'ancientpages' => '顶顶老个页面',
-'move' => '捅荡',
+'move' => '移到',
'movethispage' => '捅该只页面',
'pager-newer-n' => '新$1次',
'pager-older-n' => '旧$1次',
# Book sources
'booksources' => '书源',
'booksources-search-legend' => '搜索网络书源',
-'booksources-go' => '转到',
+'booksources-go' => '去',
# Special:Log
'specialloguserlabel' => '用戶:',
'prevpage' => '上一页($1)',
'allpagesfrom' => '显示个页面开始于:',
'allpagesto' => '显示从此地结束个页面:',
-'allarticles' => '所有页面',
+'allarticles' => '全部页面',
'allinnamespace' => '所有页面 ($1 名字空间)',
'allnotinnamespace' => '全部页面 (弗勒 $1 名字空间里向)',
'allpagesprev' => '前头',
'linksearch' => '外部链接',
'linksearch-ns' => '名字空間:',
'linksearch-ok' => '搜尋',
+'linksearch-line' => '从$2链到$1',
# Special:ListUsers
'listusers-submit' => '显示',
'listgrouprights-members' => '(成员列表)',
# Email user
-'emailuser' => '发E-mail拨该个用户',
+'emailuser' => '发电子信畀箇个用户',
'emailuser-title-notarget' => '郵箱用戶',
'emailpage' => '郵箱用戶',
'emailfrom' => '從',
# Watchlist
'watchlist' => '關注表',
-'mywatchlist' => '我個關注表',
+'mywatchlist' => '我个关注表',
'nowatchlist' => '倷个监控列表是空个。',
'watchnologin' => '朆登录',
'addedwatchtext' => '“[[:$1]]”箇頁加進爾個[[Special:Watchlist|關注表]]去哉。
轉日箇頁搭渠討論頁個變化會排箇耷。',
'removewatch' => '從關注表移爻',
'removedwatchtext' => '页面[[:$1]]已经从[[Special:Watchlist|侬个监控页面]]里向拿脱。',
-'watch' => '监控',
+'watch' => '关注',
'watchthispage' => '监控该只页面',
-'unwatch' => '弗要监控',
+'unwatch' => '弗关注',
'unwatchthispage' => '停止监控',
'notanarticle' => '弗是內容頁',
-'watchlist-details' => 'å¼\97å\8c\85æ\8b¬è®¨è®ºé¡µï¼\8cæ\9c\89 $1 页å\9e\83æ\8b\89侬ç\9b\91æ\8e§å\88\97表é«\98头。',
+'watchlist-details' => 'å¼\97å\8c\85æ\8b¬è®¨è®ºé¡µï¼\8cæ\9c\89 $1 页å¾\95ä½ ä¾¬å\85³æ³¨è¡¨é\87\8cå\90\91。',
'watchlistcontains' => '倷个监控列表包括{{PLURAL:$1|1|$1}}只页面。',
-'wlshowlast' => '显示上个 $1 个钟头 $2 日 $3',
+'wlshowlast' => '显示上 $1 个钟头 $2 日 $3',
'watchlist-options' => '监控列表选项',
# Displayed when you click the "watch" button and it is in the process of watching
# Undelete
'undeletepage' => '查看搭仔恢复删脱个页面',
-'viewdeletedpage' => '望望删脱个页面',
+'viewdeletedpage' => '望望相删脱个页面',
'undeletelink' => '查看/恢复',
'undeleteviewlink' => '望',
'undeletereset' => '轉設',
'contributions-title' => '$1个贡献',
'mycontris' => '我个贡献',
'contribsub2' => '$1个贡献($2)',
-'uctop' => '(顶浪)',
-'month' => '从箇个号头 (或再早):',
-'year' => '从箇年 (或再早):',
+'uctop' => '(此垡)',
+'month' => '从箇月起 (要勿还要早):',
+'year' => '从箇年起 (要勿还要早):',
-'sp-contributions-newbies' => '仅显示新用户个贡献',
+'sp-contributions-newbies' => '只显示新用户个贡献',
'sp-contributions-blocklog' => '查封记录',
'sp-contributions-talk' => '討論',
-'sp-contributions-search' => '搜索贡献记录',
-'sp-contributions-username' => 'IP地址或用户名:',
-'sp-contributions-submit' => '寻',
+'sp-contributions-search' => '搜寻贡献记录',
+'sp-contributions-username' => 'IP地址要勿用户名:',
+'sp-contributions-submit' => '搜寻',
# What links here
-'whatlinkshere' => '链进来点啥',
+'whatlinkshere' => '有啥链到箇里',
'whatlinkshere-title' => '链接到“$1”个页面',
'whatlinkshere-page' => '页面:',
-'linkshere' => '下头眼页面链接到[[:$1]]:',
-'nolinkshere' => "å\91\92æ\8b¨é¡µé\9d¢é\93¾æ\8e¥到 '''[[:$1]]'''。",
-'isredirect' => '重定向页面',
+'linkshere' => '下头个页链到[[:$1]]:',
+'nolinkshere' => "å\91\92æ\9c\89页é\93¾到 '''[[:$1]]'''。",
+'isredirect' => '转戳页',
'istemplate' => '包含',
'isimage' => '文件鏈接',
'whatlinkshere-prev' => '前$1个',
'whatlinkshere-next' => '后$1个',
-'whatlinkshere-links' => '←链入',
-'whatlinkshere-hideredirs' => '$1重定向',
+'whatlinkshere-links' => '←链进',
+'whatlinkshere-hideredirs' => '$1转戳',
'whatlinkshere-hidetrans' => '$1包含',
'whatlinkshere-hidelinks' => '$1链接',
'whatlinkshere-filters' => '过滤器',
'ipbreasonotherlist' => '其它原因',
'ipbsubmit' => '封杀该个用户',
'ipbother' => '其它时间:',
-'ipboptions' => '2个钟头:2 hours,1日天:1 day,3日天:3 days,1个礼拜:1 week,2个礼拜:2 weeks,1个号头:1 month,3个号头:3 months,6个号头:6 months,1年:1 year,永久:infinite',
+'ipboptions' => '2个钟头:2 hours,1日:1 day,3日:3 days,1个礼拜:1 week,2个礼拜:2 weeks,1个月日:1 month,3个月日:3 months,6个月日:6 months,1年:1 year,老世:infinite',
'badipaddress' => '无效 IP 地址',
-'ipblocklist' => '封哉個用戶',
+'ipblocklist' => '封脱个用户',
'infiniteblock' => '永远',
'blocklink' => '封禁',
'unblocklink' => '解封',
-'change-blocklink' => 'æ\9b´æ\94¹封禁',
+'change-blocklink' => 'æ\94¹å\8f\98封禁',
'contribslink' => '贡献',
'blocklogpage' => '封禁日志',
-'blocklogentry' => 'â\80\9c[[$1]]â\80\9dæ\8b¨æ\9f¥å°\81æ\8b\89许ï¼\8cç»\88æ¢è¾°å\85\89为$2 $3',
+'blocklogentry' => 'â\80\9c[[$1]]â\80\9dæ\9f¥å°\81å¾\95é\87\8cï¼\8c$2 $3å\88°æ\9c\9f',
'blocklogtext' => '箇是用戶封搭解封操作個記錄。自動封個IP地址弗排。到[[Special:BlockList|IP 封表]]裏望目前生效個封表。',
'unblocklogentry' => '$1已经拨解封',
-'block-log-flags-nocreate' => 'å¼\80æ\88·å·²ç»\8fæ\8b¨ç¦\81ç\94¨',
+'block-log-flags-nocreate' => '建账å\8f·ç¦\81ç\94¨å\93\89',
'proxyblocksuccess' => '好哉。',
# Developer tools
但是由于新标题下已经有对话页存在,所以对话页无法移动。请手工合并两只页面。',
'movedto' => '移动到',
'movetalk' => '移动相关讨论页',
-'movelogpage' => '捅荡记录',
+'movelogpage' => '移个记录',
'movelogpagetext' => '下底是拨拉捅荡个页面列表。',
'movereason' => '理由:',
'revertmove' => '恢复',
'delete_and_move_confirm' => '对哉,删脱该只页面',
# Export
-'export' => '导出页面',
+'export' => '页导出',
# Namespace 8 related
'allmessages' => '系统讯息',
'filemissing' => '文件寻弗着哉',
# Tooltip help for the actions
-'tooltip-pt-userpage' => '侬个用户页',
-'tooltip-pt-mytalk' => '侬个讨论页',
-'tooltip-pt-preferences' => '我个所欢喜',
+'tooltip-pt-userpage' => 'ä½ ä¾¬ä¸ªç\94¨æ\88·é¡µ',
+'tooltip-pt-mytalk' => 'ä½ ä¾¬ä¸ªè®¨è®ºé¡µ',
+'tooltip-pt-preferences' => '我欢喜个',
'tooltip-pt-watchlist' => '监控修改页面列表',
-'tooltip-pt-mycontris' => '侬个贡献列表',
-'tooltip-pt-login' => '鼓励大家登录ï¼\8cä¸\8dè¿\87å\80\92ä¹\9få¼\97æ\98¯æ\9d¿å®\9aè¦\81个ã\80\82',
+'tooltip-pt-mycontris' => 'ä½ ä¾¬ä¸ªè´¡ç\8c®å\88\97表',
+'tooltip-pt-login' => '鼓励大家登录è¿\9bæ\9d¥ï¼\8cä¸\8dè¿\87ä¹\9få¼\97æ\98¯æ\9d¿å®\9aè¦\81æ±\82',
'tooltip-pt-anonlogin' => '鼓励登录,必过倒也弗是必须个。',
'tooltip-pt-logout' => '登出',
'tooltip-ca-talk' => '讨论内容页',
-'tooltip-ca-edit' => '箇只页面侬可以编辑。请垃拉保存前头先预览。',
-'tooltip-ca-addsection' => '开始一只新段落',
-'tooltip-ca-viewsource' => '该只页面拨保护勒浪,必过倷可以查看源码。',
-'tooltip-ca-history' => '该只页面老早个版本。',
-'tooltip-ca-protect' => '保护该只页面',
-'tooltip-ca-delete' => '删脱该只页面',
-'tooltip-ca-move' => '移动该只页面',
-'tooltip-ca-watch' => '拿箇只页面加到侬个监控列表里向',
-'tooltip-ca-unwatch' => '拿箇只页面从监视列表里删脱',
+'tooltip-ca-edit' => '箇页你侬好编。保存之前望望相起。',
+'tooltip-ca-addsection' => '开始新段',
+'tooltip-ca-viewsource' => '箇页受保,你侬好望源代码',
+'tooltip-ca-history' => '箇页以早个版本',
+'tooltip-ca-protect' => '保护箇页',
+'tooltip-ca-delete' => '删脱箇页',
+'tooltip-ca-move' => '移箇页',
+'tooltip-ca-watch' => '畀箇页加进你侬个关注表里',
+'tooltip-ca-unwatch' => '畀箇页从关注表里删脱',
'tooltip-search' => '搜寻{{SITENAME}}',
'tooltip-search-go' => '转到页本确切名称,如果存在',
-'tooltip-search-fulltext' => '寻包含箇星文本个页面',
+'tooltip-search-fulltext' => '搜寻包含箇星文本个页面',
'tooltip-p-logo' => '封面',
-'tooltip-n-mainpage' => '进入封面',
-'tooltip-n-mainpage-description' => '翻到簿面',
-'tooltip-n-portal' => '关于本计划,好做眼啥,应该哪能做法子',
+'tooltip-n-mainpage' => '翻到封面',
+'tooltip-n-mainpage-description' => '翻到封面',
+'tooltip-n-portal' => '有关箇计划,啥好做,应该哪能做',
'tooltip-n-currentevents' => '查寻当前事件个背景信息',
-'tooltip-n-recentchanges' => '列出近段辰光个改动',
-'tooltip-n-randompage' => '随机打开只页面',
+'tooltip-n-recentchanges' => '列出wiki里箇阶段个变化',
+'tooltip-n-randompage' => '打开随机页面',
'tooltip-n-help' => '寻求帮助',
-'tooltip-t-whatlinkshere' => '列出所有与此页相链个页面',
-'tooltip-t-recentchangeslinked' => '所有从本页链接出去个页面个最近改动',
+'tooltip-t-whatlinkshere' => '列出全部搭箇页链个页',
+'tooltip-t-recentchangeslinked' => '箇页链出去个全部页箇阶段变化',
'tooltip-feed-rss' => '订阅本页',
'tooltip-feed-atom' => '此页个Atom 订阅',
'tooltip-t-contributions' => '查看箇位用户个贡献',
-'tooltip-t-emailuser' => '发封信拨该个用户',
+'tooltip-t-emailuser' => '发电子信畀箇个用户',
'tooltip-t-upload' => '上传文件',
-'tooltip-t-specialpages' => '所有特殊页面列表',
-'tooltip-t-print' => '箇只页面个打印版',
-'tooltip-t-permalink' => '迭只页面修订版个永久链接',
-'tooltip-ca-nstab-main' => 'æ\9f¥ç\9c\8b内容页',
+'tooltip-t-specialpages' => '全部特殊页列表',
+'tooltip-t-print' => '箇页个打印版',
+'tooltip-t-permalink' => '箇页当前修订版个老世链接',
+'tooltip-ca-nstab-main' => 'æ\9c\9b内容页',
'tooltip-ca-nstab-user' => '查看用户页',
'tooltip-ca-nstab-media' => '查看媒体页',
-'tooltip-ca-nstab-special' => '该个是只特殊页面,倷弗好编辑俚',
-'tooltip-ca-nstab-project' => 'æ\9f¥ç\9c\8b项目页',
-'tooltip-ca-nstab-image' => 'æ\9f¥ç\9c\8bå\9b¾ç\89\87页',
+'tooltip-ca-nstab-special' => '箇是特殊页,你侬呒处编',
+'tooltip-ca-nstab-project' => 'æ\9c\9b项目页',
+'tooltip-ca-nstab-image' => 'æ\9c\9bæ\96\87件页',
'tooltip-ca-nstab-mediawiki' => '查看系统讯息',
-'tooltip-ca-nstab-template' => 'æ\9f¥ç\9c\8b模板',
+'tooltip-ca-nstab-template' => 'æ\9c\9b模板',
'tooltip-ca-nstab-help' => '查看帮忙页面',
-'tooltip-ca-nstab-category' => 'æ\9f¥ç\9c\8bå\88\86类页é\9d¢',
-'tooltip-minoredit' => 'æ\8b¿è¯¥è¶\9fç¼\96è¾\91æ \87è®°æ\88\90å°\8fæ\94¹å\8a¨',
-'tooltip-save' => '保存倷个改变',
-'tooltip-preview' => '预览倷个改变,请倷勒拉保存前头用用俚!',
-'tooltip-diff' => '显示倷对文章所作个改变',
+'tooltip-ca-nstab-category' => 'æ\9c\9bå\88\86类页',
+'tooltip-minoredit' => 'æ \87ä½\9cå°\8fç¼\96å\86\99',
+'tooltip-save' => '保存你侬个修改',
+'tooltip-preview' => '望望相你侬个修改,保存之前用!',
+'tooltip-diff' => '显示你侬对文本个修改',
'tooltip-compareselectedversions' => '查看本页面两只选定个修订版个差异。',
-'tooltip-watch' => '拿搿只页面加到倷监控列表里向去',
+'tooltip-watch' => '畀箇页加到你侬个关注表里',
'tooltip-rollback' => '揿一记“回转”就回退到上一位贡献者个编辑状态',
'tooltip-undo' => '“撤销”可以恢复该编辑并且垃拉预览模式下头打开编辑表单。渠允许垃拉摘要里向说明原因。',
+'tooltip-summary' => '打进短摘要',
'tooltip-iwiki' => '̩$1 - $2',
# Attribution
'deletedrevision' => '拨删脱个旧修订 $1',
# Browsing diffs
-'previousdiff' => '←上一版',
+'previousdiff' => '←老版',
'nextdiff' => '新版→',
# Media information
'confirmemail_success' => '倷个电子邮箱地址已经通过确认哉。乃么倷好登录,享受倪维基百科哉。',
'confirmemail_loggedin' => '倷个电子邮件地址已经拨确认哉。',
'confirmemail_subject' => '{{SITENAME}}电子邮件地址确认',
-'confirmemail_body' => '用IP地址$1嗰人(呒数是你),徕translatewiki.net里一个账号“$2”建起,用你侬个电子信箱地址。
+'confirmemail_body' => '用IP地址$1嗰人(呒数是你侬),徕translatewiki.net里一个账号“$2”建起,用你侬个电子信箱地址。
确认记箇账号是弗是你侬嘅,激活translatewiki.net里嗰电子信功能。用浏览器打开下向嗰链接:
$5
确认码会到$4过期。',
-'confirmemail_body_changed' => '
-用IP地址$1嗰人,(呒数是你)徕{{SITENAME}}里一个账号“$2”建起,用你侬个电子信箱地址。
+'confirmemail_body_changed' => '用IP地址$1嗰人,(呒数是你侬)徕{{SITENAME}}里一个账号“$2”建起,用你侬个电子信箱地址。
确认记箇账号是弗是你侬嘅,激活{{SITENAME}}里嗰电子信功能。用浏览器打开下向嗰链接:
'watchlistedit-normal-title' => '编辑监视列表',
# Watchlist editing tools
-'watchlisttools-view' => 'æ\9f¥ç\9c\8bæ\90ç\95\8c个修改',
-'watchlisttools-edit' => 'æ\9f¥ç\9c\8b并ç¼\96è¾\91ç\9b\91æ\8e§å\88\97表',
-'watchlisttools-raw' => '编辑原始监视列表',
+'watchlisttools-view' => 'æ\9c\9bç\9b¸å\85³修改',
+'watchlisttools-edit' => 'æ\9c\9bæ\90ç¼\96å\85³æ³¨表',
+'watchlisttools-raw' => '编写原始关注表',
# Special:Version
'version' => '版本',
# Special:SpecialPages
-'specialpages' => '特殊页面',
+'specialpages' => '特殊页',
# Special:Tags
'tags-active-yes' => '好',
'userlogin-resetpassword-link' => 'צוריקשטעלן אײַער פאַסווארט',
'helplogin-url' => 'Help:אריינלאגירן',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|הילף מיט אריינלאגירן]]',
+'userlogin-createanother' => 'שאפֿן נאך א קאנטע',
'createacct-join' => 'גיט ארײַן אײַער אינפֿארמאציע אונטן.',
'createacct-another-join' => 'ארײַנגעבן דער נײַער קאנטעס אינפארמאציע אונטן.',
'createacct-emailrequired' => 'בליצפּאָסט אַדרעס',
'recentchangesdays-max' => 'מאַקסימום $1 {{PLURAL:$1|טאָג|טעג}}',
'recentchangescount' => 'די צאָל רעדאַקטירונגען צו ווײַזן גרונטלעך:',
'prefs-help-recentchangescount' => 'כולל לעצטע ענדערונגען, בלאַט היסטאָריעס, און לאָגביכער.',
+'prefs-help-watchlist-token2' => 'דאס איז דער געהיימער שליסל צום וועבפֿיד פון אײַער אויפֿפאסונג ליסטע.
+יעדער וואס ווייסט אים וועט קענען לייענען אײַער אויפֿפאסונג ליסטע; טוט אים נישט טיילן.
+[[Special:ResetTokens|קליקט דא ווען איר דארפט אים צוריקשטעלן]].',
'savedprefs' => 'אייערע פרעפערענצן איז אפגעהיטן געווארן.',
'timezonelegend' => 'צײַט זאנע:',
'localtime' => 'לאקאלע צייט:',
'contributions' => '{{GENDER:$1|באניצער}} בײַשטײַערונגען',
'contributions-title' => 'בײַשטײַערונגען פֿון באַניצער $1',
'mycontris' => 'בײַשטײַערונגען',
-'contribsub2' => '×\95×\95×¢×\92×\9f $1 ($2)',
+'contribsub2' => 'פֿ×\90ַר {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.',
'uctop' => '(לויפֿיק)',
'month' => 'ביז חודש:',
'protectedtitlesempty' => '在这些参数之下并无标题正在保护。',
'listusers' => '用户列表',
'listusers-editsonly' => '只显示有编辑的用户',
-'listusers-creationsort' => 'æ\8c\89建ç«\8b日期排序',
-'listusers-desc' => '按降序排序',
+'listusers-creationsort' => 'æ\8c\89å\88\9b建日期排序',
+'listusers-desc' => '降序排序',
'usereditcount' => '$1次编辑',
'usercreated' => '{{GENDER:$3|创建}}于$1 $2',
'newpages' => '新页面',
'linksearch-error' => '通配符仅可在主机名称的开头使用。',
# Special:ListUsers
-'listusersfrom' => '给定显示用户条件:',
+'listusersfrom' => '显示用户开始于:',
'listusers-submit' => '显示',
'listusers-noresult' => '找不到用户。',
'listusers-blocked' => '(已封禁)',
);
}
- $( '#editform' ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
+ // This should be moved down to '#editform', but is kept on the body for now
+ // because the LiquidThreads extension is re-using this module with only half
+ // the EditPage (doesn't include #editform presumably, bug 55463).
+ $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
} );
}( mediaWiki, jQuery ) );
return t;
};
+ /**
+ * Get the file title from an image element
+ *
+ * var title = mw.Title.newFromImg( $( 'img:first' ) );
+ *
+ * @static
+ * @param {HTMLImageElement|jQuery} img The image to use as a base.
+ * @return {mw.Title|null} The file title - null if unsuccessful.
+ */
+ Title.newFromImg = function ( img ) {
+ var matches, i, regex, src, decodedSrc,
+
+ // thumb.php-generated thumbnails
+ thumbPhpRegex = /thumb\.php/,
+
+ regexes = [
+ // Thumbnails
+ /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/,
+
+ // Thumbnails in non-hashed upload directories
+ /\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/,
+
+ // Full size images
+ /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)$/,
+
+ // Full-size images in non-hashed upload directories
+ /\/([^\s\/]+)$/
+ ],
+
+ recount = regexes.length;
+
+ img = img.jquery ? img.get( 0 ) : img;
+
+ src = img.src;
+
+ matches = src.match( thumbPhpRegex );
+
+ if ( matches ) {
+ return mw.Title.newFromText( 'File:' + mw.util.getParamValue( 'f', src ) );
+ }
+
+ decodedSrc = decodeURIComponent( src );
+
+ for ( i = 0; i < recount; i++ ) {
+ regex = regexes[i];
+ matches = decodedSrc.match( regex );
+
+ if ( matches && matches[1] ) {
+ return mw.Title.newFromText( 'File:' + matches[1] );
+ }
+ }
+
+ return null;
+ };
+
/**
* Whether this title exists on the wiki.
*
class StringUtilsTest extends MediaWikiTestCase {
/**
- * This test StringUtils::isUtf8 whenever we have mbstring extension
+ * This tests StringUtils::isUtf8 whenever we have the mbstring extension
* loaded.
*
* @covers StringUtils::isUtf8
}
/**
- * This test StringUtils::isUtf8 making sure we use the pure PHP
+ * This tests StringUtils::isUtf8 making sure we use the pure PHP
* implementation used as a fallback when mb_check_encoding() is
* not available.
*
$FAIL = false;
return array(
- array( $PASS, 'Some ASCII' ),
- array( $PASS, "Euro sign €" ),
-
- // First possible sequences
- array( $PASS, "\x00" ),
- array( $PASS, "\xc2\x80" ),
- array( $PASS, "\xe0\xa0\x80" ),
- array( $PASS, "\xf0\x90\x80\x80" ),
- array( $FAIL, "\xf8\x88\x80\x80\x80" ),
- array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
-
- // Last possible sequence
- array( $PASS, "\x7f" ),
- array( $PASS, "\xdf\xbf" ),
- array( $PASS, "\xef\xbf\xbf" ),
- array( $FAIL, "\xf7\xbf\xbf\xbf" ), // U+1FFFFF
- array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
- array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
-
- // Boundaries
- array( $PASS, "\xed\x9f\xbf" ),
- array( $PASS, "\xee\x80\x80" ),
- array( $PASS, "\xef\xbf\xbd" ),
- array( $PASS, "\xf2\x80\x80\x80" ),
- array( $PASS, "\xf3\xbf\xbf\xbf" ), // U+FFFFF
- array( $PASS, "\xf4\x80\x80\x80" ), // U+100000
- array( $PASS, "\xf4\x8f\xbf\xbf" ), // U+10FFFF
- array( $FAIL, "\xf4\x90\x80\x80" ), // U+110000
-
- // Malformed
- array( $FAIL, "\x80" ),
- array( $FAIL, "\xbf" ),
- array( $FAIL, "\x80\xbf" ),
- array( $FAIL, "\x80\xbf\x80" ),
- array( $FAIL, "\x80\xbf\x80\xbf" ),
- array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
- array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
- array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
-
- // Last byte missing
- array( $FAIL, "\xc0" ),
- array( $FAIL, "\xe0\x80" ),
- array( $FAIL, "\xf0\x80\x80" ),
- array( $FAIL, "\xf8\x80\x80\x80" ),
- array( $FAIL, "\xfc\x80\x80\x80\x80" ),
- array( $FAIL, "\xdf" ),
- array( $FAIL, "\xef\xbf" ),
- array( $FAIL, "\xf7\xbf\xbf" ),
- array( $FAIL, "\xfb\xbf\xbf\xbf" ),
- array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
-
- // Extra continuation byte
- array( $FAIL, "e\xaf" ),
- array( $FAIL, "\xc3\x89\xaf" ),
- array( $FAIL, "\xef\xbc\xa5\xaf" ),
- array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
-
- // Impossible bytes
- array( $FAIL, "\xfe" ),
- array( $FAIL, "\xff" ),
- array( $FAIL, "\xfe\xfe\xff\xff" ),
-
- // Overlong sequences
- array( $FAIL, "\xc0\xaf" ),
- array( $FAIL, "\xc1\xaf" ),
- array( $FAIL, "\xe0\x80\xaf" ),
- array( $FAIL, "\xf0\x80\x80\xaf" ),
- array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
- array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
-
- // Maximum overlong sequences
- array( $FAIL, "\xc1\xbf" ),
- array( $FAIL, "\xe0\x9f\xbf" ),
- array( $FAIL, "\xf0\x8f\xbf\xbf" ),
- array( $FAIL, "\xf8\x87\xbf\xbf" ),
- array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
-
- // Surrogates
- array( $PASS, "\xed\x9f\xbf" ), // U+D799
- array( $PASS, "\xee\x80\x80" ), // U+E000
- array( $FAIL, "\xed\xa0\x80" ), // U+D800
- array( $FAIL, "\xed\xaf\xbf" ), // U+DBFF
- array( $FAIL, "\xed\xb0\x80" ), // U+DC00
- array( $FAIL, "\xed\xbf\xbf" ), // U+DFFF
- array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ), // U+D800 U+DC00
-
- // Noncharacters
- array( $PASS, "\xef\xbf\xbe" ),
- array( $PASS, "\xef\xbf\xbf" ),
+ 'some ASCII' => array( $PASS, 'Some ASCII' ),
+ 'euro sign' => array( $PASS, "Euro sign €" ),
+
+ 'first possible sequence 1 byte' => array( $PASS, "\x00" ),
+ 'first possible sequence 2 bytes' => array( $PASS, "\xc2\x80" ),
+ 'first possible sequence 3 bytes' => array( $PASS, "\xe0\xa0\x80" ),
+ 'first possible sequence 4 bytes' => array( $PASS, "\xf0\x90\x80\x80" ),
+ 'first possible sequence 5 bytes' => array( $FAIL, "\xf8\x88\x80\x80\x80" ),
+ 'first possible sequence 6 bytes' => array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
+
+ 'last possible sequence 1 byte' => array( $PASS, "\x7f" ),
+ 'last possible sequence 2 bytes' => array( $PASS, "\xdf\xbf" ),
+ 'last possible sequence 3 bytes' => array( $PASS, "\xef\xbf\xbf" ),
+ 'last possible sequence 4 bytes (U+1FFFFF)' => array( $FAIL, "\xf7\xbf\xbf\xbf" ),
+ 'last possible sequence 5 bytes' => array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
+ 'last possible sequence 6 bytes' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
+
+ 'boundary 1' => array( $PASS, "\xed\x9f\xbf" ),
+ 'boundary 2' => array( $PASS, "\xee\x80\x80" ),
+ 'boundary 3' => array( $PASS, "\xef\xbf\xbd" ),
+ 'boundary 4' => array( $PASS, "\xf2\x80\x80\x80" ),
+ 'boundary 5 (U+FFFFF)' => array( $PASS, "\xf3\xbf\xbf\xbf" ),
+ 'boundary 6 (U+100000)' => array( $PASS, "\xf4\x80\x80\x80" ),
+ 'boundary 7 (U+10FFFF)' => array( $PASS, "\xf4\x8f\xbf\xbf" ),
+ 'boundary 8 (U+110000)' => array( $FAIL, "\xf4\x90\x80\x80" ),
+
+ 'malformed 1' => array( $FAIL, "\x80" ),
+ 'malformed 2' => array( $FAIL, "\xbf" ),
+ 'malformed 3' => array( $FAIL, "\x80\xbf" ),
+ 'malformed 4' => array( $FAIL, "\x80\xbf\x80" ),
+ 'malformed 5' => array( $FAIL, "\x80\xbf\x80\xbf" ),
+ 'malformed 6' => array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
+ 'malformed 7' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
+ 'malformed 8' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
+
+ 'last byte missing 1' => array( $FAIL, "\xc0" ),
+ 'last byte missing 2' => array( $FAIL, "\xe0\x80" ),
+ 'last byte missing 3' => array( $FAIL, "\xf0\x80\x80" ),
+ 'last byte missing 4' => array( $FAIL, "\xf8\x80\x80\x80" ),
+ 'last byte missing 5' => array( $FAIL, "\xfc\x80\x80\x80\x80" ),
+ 'last byte missing 6' => array( $FAIL, "\xdf" ),
+ 'last byte missing 7' => array( $FAIL, "\xef\xbf" ),
+ 'last byte missing 8' => array( $FAIL, "\xf7\xbf\xbf" ),
+ 'last byte missing 9' => array( $FAIL, "\xfb\xbf\xbf\xbf" ),
+ 'last byte missing 10' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
+
+ 'extra continuation byte 1' => array( $FAIL, "e\xaf" ),
+ 'extra continuation byte 2' => array( $FAIL, "\xc3\x89\xaf" ),
+ 'extra continuation byte 3' => array( $FAIL, "\xef\xbc\xa5\xaf" ),
+ 'extra continuation byte 4' => array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
+
+ 'impossible bytes 1' => array( $FAIL, "\xfe" ),
+ 'impossible bytes 2' => array( $FAIL, "\xff" ),
+ 'impossible bytes 3' => array( $FAIL, "\xfe\xfe\xff\xff" ),
+
+ 'overlong sequences 1' => array( $FAIL, "\xc0\xaf" ),
+ 'overlong sequences 2' => array( $FAIL, "\xc1\xaf" ),
+ 'overlong sequences 3' => array( $FAIL, "\xe0\x80\xaf" ),
+ 'overlong sequences 4' => array( $FAIL, "\xf0\x80\x80\xaf" ),
+ 'overlong sequences 5' => array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
+ 'overlong sequences 6' => array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
+
+ 'maximum overlong sequences 1' => array( $FAIL, "\xc1\xbf" ),
+ 'maximum overlong sequences 2' => array( $FAIL, "\xe0\x9f\xbf" ),
+ 'maximum overlong sequences 3' => array( $FAIL, "\xf0\x8f\xbf\xbf" ),
+ 'maximum overlong sequences 4' => array( $FAIL, "\xf8\x87\xbf\xbf" ),
+ 'maximum overlong sequences 5' => array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
+
+ 'surrogates 1 (U+D799)' => array( $PASS, "\xed\x9f\xbf" ),
+ 'surrogates 2 (U+E000)' => array( $PASS, "\xee\x80\x80" ),
+ 'surrogates 3 (U+D800)' => array( $FAIL, "\xed\xa0\x80" ),
+ 'surrogates 4 (U+DBFF)' => array( $FAIL, "\xed\xaf\xbf" ),
+ 'surrogates 5 (U+DC00)' => array( $FAIL, "\xed\xb0\x80" ),
+ 'surrogates 6 (U+DFFF)' => array( $FAIL, "\xed\xbf\xbf" ),
+ 'surrogates 7 (U+D800 U+DC00)' => array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ),
+
+ 'noncharacters 1' => array( $PASS, "\xef\xbf\xbe" ),
+ 'noncharacters 2' => array( $PASS, "\xef\xbf\xbf" ),
);
}
}
* Sanity checks for making sure registered resources are sane.
*
* @file
- * @author Niklas Laxström, 2012
- * @author Antoine Musso, 2012
- * @author Santhosh Thottingal, 2012
- * @author Timo Tijhof, 2012
+ * @author Antoine Musso
+ * @author Niklas Laxström
+ * @author Santhosh Thottingal
+ * @author Timo Tijhof
+ * @copyright © 2012, Antoine Musso
+ * @copyright © 2012, Niklas Laxström
+ * @copyright © 2012, Santhosh Thottingal
+ * @copyright © 2012, Timo Tijhof
+ *
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class ResourcesTest extends MediaWikiTestCase {
assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
} );
+ QUnit.test( 'newFromImg', 28, function ( assert ) {
+ var title, i, thisCase, prefix,
+ cases = [
+ {
+ url: '/wiki/images/thumb/9/91/Anticlockwise_heliotrope%27s.jpg/99px-Anticlockwise_heliotrope%27s.jpg',
+ typeOfUrl: 'Normal hashed directory thumbnail',
+ nameText: 'Anticlockwise heliotrope\'s',
+ prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+ },
+
+ {
+ url: '//upload.wikimedia.org/wikipedia/commons/thumb/8/80/Wikipedia-logo-v2.svg/150px-Wikipedia-logo-v2.svg.png',
+ typeOfUrl: 'Commons thumbnail',
+ nameText: 'Wikipedia-logo-v2',
+ prefixedText: 'File:Wikipedia-logo-v2.svg'
+ },
+
+ {
+ url: '/wiki/images/9/91/Anticlockwise_heliotrope%27s.jpg',
+ typeOfUrl: 'Full image',
+ nameText: 'Anticlockwise heliotrope\'s',
+ prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+ },
+
+ {
+ url: 'http://localhost/thumb.php?f=Stuffless_Figaro%27s.jpg&width=180',
+ typeOfUrl: 'thumb.php-based thumbnail',
+ nameText: 'Stuffless Figaro\'s',
+ prefixedText: 'File:Stuffless Figaro\'s.jpg'
+ },
+
+ {
+ url: '/wikipedia/commons/thumb/Wikipedia-logo-v2.svg/150px-Wikipedia-logo-v2.svg.png',
+ typeOfUrl: 'Commons unhashed thumbnail',
+ nameText: 'Wikipedia-logo-v2',
+ prefixedText: 'File:Wikipedia-logo-v2.svg'
+ },
+
+ {
+ url: '/wiki/images/Anticlockwise_heliotrope%27s.jpg',
+ typeOfUrl: 'Unhashed local file',
+ nameText: 'Anticlockwise heliotrope\'s',
+ prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+ },
+
+ {
+ url: '',
+ typeOfUrl: 'Empty string'
+ },
+
+ {
+ url: 'foo',
+ typeOfUrl: 'String with only alphabet characters'
+ },
+
+ {
+ url: 'foobar.foobar',
+ typeOfUrl: 'Not a file path'
+ },
+
+ {
+ url: '/a/a0/blah blah blah',
+ typeOfUrl: 'Space characters'
+ }
+ ];
+
+ for ( i = 0; i < cases.length; i++ ) {
+ thisCase = cases[i];
+ title = mw.Title.newFromImg( { src: thisCase.url } );
+
+ if ( thisCase.nameText !== undefined ) {
+ prefix = '[' + thisCase.typeOfUrl + ' URL' + '] ';
+
+ assert.notStrictEqual( title, null, prefix + 'Parses successfully' );
+ assert.equal( title.getNameText(), thisCase.nameText, prefix + 'Filename matches original' );
+ assert.equal( title.getPrefixedText(), thisCase.prefixedText, prefix + 'File page title matches original' );
+ assert.equal( title.getNamespaceId(), 6, prefix + 'Namespace ID matches File namespace' );
+ } else {
+ assert.strictEqual( title, null, thisCase.typeOfUrl + ', should not produce an mw.Title object' );
+ }
+ }
+ } );
+
}( mediaWiki, jQuery ) );