From: jenkins-bot Date: Tue, 6 May 2014 13:04:41 +0000 (+0000) Subject: Merge "Add version comments for 1.24 to all updaters" X-Git-Tag: 1.31.0-rc.0~15864 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22articles_versions%22%2C%22id_article=%24id_article%22%29%20.%20%22?a=commitdiff_plain;h=21a66ecc9a7d4517baaaa0dbd6ca00f64f8e90c6;hp=f89628e1b15f9686e18ccf0ce55743e51f74a90e;p=lhc%2Fweb%2Fwiklou.git Merge "Add version comments for 1.24 to all updaters" --- diff --git a/RELEASE-NOTES-1.24 b/RELEASE-NOTES-1.24 index 5185517eb0..7cca5ef702 100644 --- a/RELEASE-NOTES-1.24 +++ b/RELEASE-NOTES-1.24 @@ -44,6 +44,9 @@ changes to languages because of Bugzilla reports. * The deprecated function mw.util.toggleToc was removed. * The Special:Search hooks SpecialSearchGo and SpecialSearchResultsAppend were removed as they were unused. +* mediawiki.util.$content no longer supports old versions of the Vector, + Monobook, Modern and CologneBlue skins that don't yet implement the "mw-body" + and/or "mw-body-primary" class name in their html. ==== Renamed classes ==== * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression diff --git a/includes/GitInfo.php b/includes/GitInfo.php index 6b092d96c6..dc2fff1398 100644 --- a/includes/GitInfo.php +++ b/includes/GitInfo.php @@ -35,33 +35,91 @@ class GitInfo { */ protected $basedir; + /** + * Path to JSON cache file for pre-computed git information. + */ + protected $cacheFile; + + /** + * Cached git information. + */ + protected $cache = array(); + /** * Map of repo URLs to viewer URLs. Access via static method getViewers(). */ private static $viewers = false; /** - * @param string $dir The root directory of the repo where the .git dir can be found + * @param string $repoDir The root directory of the repo where .git can be found + * @param bool $usePrecomputed Use precomputed information if available + * @see precomputeValues + */ + public function __construct( $repoDir, $usePrecomputed = true ) { + $this->cacheFile = self::getCacheFilePath( $repoDir ); + if ( $usePrecomputed && + $this->cacheFile !== null && + is_readable( $this->cacheFile ) + ) { + $this->cache = FormatJson::decode( + file_get_contents( $this->cacheFile ), + true + ); + } + + if ( !$this->cacheIsComplete() ) { + $this->basedir = $repoDir . DIRECTORY_SEPARATOR . '.git'; + if ( is_readable( $this->basedir ) && !is_dir( $this->basedir ) ) { + $GITfile = file_get_contents( $this->basedir ); + if ( strlen( $GITfile ) > 8 && + substr( $GITfile, 0, 8 ) === 'gitdir: ' + ) { + $path = rtrim( substr( $GITfile, 8 ), "\r\n" ); + if ( $path[0] === '/' || substr( $path, 1, 1 ) === ':' ) { + // Path from GITfile is absolute + $this->basedir = $path; + } else { + $this->basedir = $repoDir . DIRECTORY_SEPARATOR . $path; + } + } + } + } + } + + /** + * Compute the path to the cache file for a given directory. + * + * @param string $repoDir The root directory of the repo where .git can be found + * @return string Path to GitInfo cache file in $wgCacheDirectory or null if + * $wgCacheDirectory is false (cache disabled). */ - public function __construct( $dir ) { - $this->basedir = $dir . DIRECTORY_SEPARATOR . '.git'; - if ( is_readable( $this->basedir ) && !is_dir( $this->basedir ) ) { - $GITfile = file_get_contents( $this->basedir ); - if ( strlen( $GITfile ) > 8 && substr( $GITfile, 0, 8 ) === 'gitdir: ' ) { - $path = rtrim( substr( $GITfile, 8 ), "\r\n" ); - $isAbsolute = $path[0] === '/' || substr( $path, 1, 1 ) === ':'; - $this->basedir = $isAbsolute ? $path : $dir . DIRECTORY_SEPARATOR . $path; + protected static function getCacheFilePath( $repoDir ) { + global $IP, $wgCacheDirectory; + if ( $wgCacheDirectory ) { + // Transform path to git repo to something we can safely embed in a filename + $repoName = $repoDir; + if ( strpos( $repoName, $IP ) === 0 ) { + // Strip $IP from path + $repoName = substr( $repoName, strlen( $IP ) ); } + $repoName = strtr( $repoName, DIRECTORY_SEPARATOR, '-' ); + $fileName = 'info' . $repoName . '.json'; + return implode( + DIRECTORY_SEPARATOR, + array( $wgCacheDirectory, 'gitinfo', $fileName ) + ); } + return null; } /** - * Return a singleton for the repo at $IP + * Get the singleton for the repo at $IP + * * @return GitInfo */ public static function repo() { - global $IP; if ( is_null( self::$repo ) ) { + global $IP; self::$repo = new self( $IP ); } return self::$repo; @@ -78,50 +136,56 @@ class GitInfo { } /** - * Return the HEAD of the repo (without any opening "ref: ") - * @return string The HEAD + * Get the HEAD of the repo (without any opening "ref: ") + * + * @return string|bool The HEAD (git reference or SHA1) or false */ public function getHead() { - $headFile = "{$this->basedir}/HEAD"; + if ( !isset( $this->cache['head'] ) ) { + $headFile = "{$this->basedir}/HEAD"; + $head = false; - if ( !is_readable( $headFile ) ) { - return false; - } + if ( is_readable( $headFile ) ) { + $head = file_get_contents( $headFile ); - $head = file_get_contents( $headFile ); - - if ( preg_match( "/ref: (.*)/", $head, $m ) ) { - return rtrim( $m[1] ); - } else { - return rtrim( $head ); + if ( preg_match( "/ref: (.*)/", $head, $m ) ) { + $head = rtrim( $m[1] ); + } else { + $head = rtrim( $head ); + } + } + $this->cache['head'] = $head; } + return $this->cache['head']; } /** - * Return the SHA1 for the current HEAD of the repo - * @return string A SHA1 or false + * Get the SHA1 for the current HEAD of the repo + * + * @return string|bool A SHA1 or false */ public function getHeadSHA1() { - $head = $this->getHead(); - - // If detached HEAD may be a SHA1 - if ( self::isSHA1( $head ) ) { - return $head; - } - - // If not a SHA1 it may be a ref: - $refFile = "{$this->basedir}/{$head}"; - if ( !is_readable( $refFile ) ) { - return false; + if ( !isset( $this->cache['headSHA1'] ) ) { + $head = $this->getHead(); + $sha1 = false; + + // If detached HEAD may be a SHA1 + if ( self::isSHA1( $head ) ) { + $sha1 = $head; + } else { + // If not a SHA1 it may be a ref: + $refFile = "{$this->basedir}/{$head}"; + if ( is_readable( $refFile ) ) { + $sha1 = rtrim( file_get_contents( $refFile ) ); + } + } + $this->cache['headSHA1'] = $sha1; } - - $sha1 = rtrim( file_get_contents( $refFile ) ); - - return $sha1; + return $this->cache['headSHA1']; } /** - * Return the commit date of HEAD entry of the git code repository + * Get the commit date of HEAD entry of the git code repository * * @since 1.22 * @return int|bool Commit date (UNIX timestamp) or false @@ -129,67 +193,51 @@ class GitInfo { public function getHeadCommitDate() { global $wgGitBin; - if ( !is_file( $wgGitBin ) || !is_executable( $wgGitBin ) ) { - return false; - } - - $environment = array( "GIT_DIR" => $this->basedir ); - $cmd = wfEscapeShellArg( $wgGitBin ) . " show -s --format=format:%ct HEAD"; - $retc = false; - $commitDate = wfShellExec( $cmd, $retc, $environment ); - - if ( $retc !== 0 ) { - return false; - } else { - return (int)$commitDate; + if ( !isset( $this->cache['headCommitDate'] ) ) { + $date = false; + if ( is_file( $wgGitBin ) && is_executable( $wgGitBin ) ) { + $environment = array( "GIT_DIR" => $this->basedir ); + $cmd = wfEscapeShellArg( $wgGitBin ) . + " show -s --format=format:%ct HEAD"; + $retc = false; + $commitDate = wfShellExec( $cmd, $retc, $environment ); + if ( $retc === 0 ) { + $date = (int)$commitDate; + } + } + $this->cache['headCommitDate'] = $date; } + return $this->cache['headCommitDate']; } /** - * Return the name of the current branch, or HEAD if not found - * @return string The branch name, HEAD, or false + * Get the name of the current branch, or HEAD if not found + * + * @return string|bool The branch name, HEAD, or false */ public function getCurrentBranch() { - $head = $this->getHead(); - if ( $head && preg_match( "#^refs/heads/(.*)$#", $head, $m ) ) { - return $m[1]; - } else { - return $head; + if ( !isset( $this->cache['branch'] ) ) { + $branch = $this->getHead(); + if ( $branch && + preg_match( "#^refs/heads/(.*)$#", $branch, $m ) + ) { + $branch = $m[1]; + } + $this->cache['branch'] = $branch; } + return $this->cache['branch']; } /** * Get an URL to a web viewer link to the HEAD revision. * - * @return string|bool string if a URL is available or false otherwise. + * @return string|bool String if a URL is available or false otherwise */ public function getHeadViewUrl() { - $config = "{$this->basedir}/config"; - if ( !is_readable( $config ) ) { - return false; - } - - wfSuppressWarnings(); - $configArray = parse_ini_file( $config, true ); - wfRestoreWarnings(); - $remote = false; - - // Use the "origin" remote repo if available or any other repo if not. - if ( isset( $configArray['remote origin'] ) ) { - $remote = $configArray['remote origin']; - } elseif ( is_array( $configArray ) ) { - foreach ( $configArray as $sectionName => $sectionConf ) { - if ( substr( $sectionName, 0, 6 ) == 'remote' ) { - $remote = $sectionConf; - } - } - } - - if ( $remote === false || !isset( $remote['url'] ) ) { + $url = $this->getRemoteUrl(); + if ( $url === false ) { return false; } - - $url = $remote['url']; if ( substr( $url, -4 ) !== '.git' ) { $url .= '.git'; } @@ -209,6 +257,91 @@ class GitInfo { return false; } + /** + * Get the URL of the remote origin. + * @return string|bool string if a URL is available or false otherwise. + */ + protected function getRemoteUrl() { + if ( !isset( $this->cache['remoteURL'] ) ) { + $config = "{$this->basedir}/config"; + $url = false; + if ( is_readable( $config ) ) { + wfSuppressWarnings(); + $configArray = parse_ini_file( $config, true ); + wfRestoreWarnings(); + $remote = false; + + // Use the "origin" remote repo if available or any other repo if not. + if ( isset( $configArray['remote origin'] ) ) { + $remote = $configArray['remote origin']; + } elseif ( is_array( $configArray ) ) { + foreach ( $configArray as $sectionName => $sectionConf ) { + if ( substr( $sectionName, 0, 6 ) == 'remote' ) { + $remote = $sectionConf; + } + } + } + + if ( $remote !== false && isset( $remote['url'] ) ) { + $url = $remote['url']; + } + } + $this->cache['remoteURL'] = $url; + } + return $this->cache['remoteURL']; + } + + /** + * Check to see if the current cache is fully populated. + * + * Note: This method is public only to make unit testing easier. There's + * really no strong reason that anything other than a test should want to + * call this method. + * + * @return bool True if all expected cache keys exist, false otherwise + */ + public function cacheIsComplete() { + return isset( $this->cache['head'] ) && + isset( $this->cache['headSHA1'] ) && + isset( $this->cache['headCommitDate'] ) && + isset( $this->cache['branch'] ) && + isset( $this->cache['remoteURL'] ); + } + + /** + * Precompute and cache git information. + * + * Creates a JSON file in the cache directory associated with this + * GitInfo instance. This cache file will be used by subsequent GitInfo objects referencing + * the same directory to avoid needing to examine the .git directory again. + * + * @since 1.24 + */ + public function precomputeValues() { + if ( $this->cacheFile !== null ) { + // Try to completely populate the cache + $this->getHead(); + $this->getHeadSHA1(); + $this->getHeadCommitDate(); + $this->getCurrentBranch(); + $this->getRemoteUrl(); + + if ( !$this->cacheIsComplete() ) { + wfDebugLog( "Failed to compute GitInfo for \"{$this->basedir}\"" ); + return; + } + + $cacheDir = dirname( $this->cacheFile ); + if ( !file_exists( $cacheDir ) && + !wfMkdirParents( $cacheDir, null, __METHOD__ ) + ) { + throw new MWException( "Unable to create GitInfo cache \"{$cacheDir}\"" ); + } + + file_put_contents( $this->cacheFile, FormatJson::encode( $this->cache ) ); + } + } + /** * @see self::getHeadSHA1 * @return string diff --git a/includes/Revision.php b/includes/Revision.php index 5a83d38037..b0423fb323 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -134,8 +134,8 @@ class Revision implements IDBAccessObject { * Revision::READ_LATEST : Select the data from the master (since 1.20) * Revision::READ_LOCKING : Select & lock the data from the master * - * @param int $revId - * @param int $pageId (optional) + * @param int $pageId + * @param int $revId (optional) * @param int $flags Bitfield (optional) * @return Revision|null */ diff --git a/includes/cache/LocalisationCache.php b/includes/cache/LocalisationCache.php index 3bbf1bb89e..1153fd2962 100644 --- a/includes/cache/LocalisationCache.php +++ b/includes/cache/LocalisationCache.php @@ -1171,7 +1171,7 @@ class LCStoreDB implements LCStore { $row = $db->selectRow( 'l10n_cache', array( 'lc_value' ), array( 'lc_lang' => $code, 'lc_key' => $key ), __METHOD__ ); if ( $row ) { - return unserialize( $row->lc_value ); + return unserialize( $db->decodeBlob( $row->lc_value ) ); } else { return null; } @@ -1233,7 +1233,7 @@ class LCStoreDB implements LCStore { $this->batch[] = array( 'lc_lang' => $this->currentLang, 'lc_key' => $key, - 'lc_value' => serialize( $value ) ); + 'lc_value' => $this->dbw->encodeBlob( serialize( $value ) ) ); if ( count( $this->batch ) >= 100 ) { $this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ ); diff --git a/includes/clientpool/RedisConnectionPool.php b/includes/clientpool/RedisConnectionPool.php index 15f0a476a6..36d2731cbe 100644 --- a/includes/clientpool/RedisConnectionPool.php +++ b/includes/clientpool/RedisConnectionPool.php @@ -44,6 +44,8 @@ class RedisConnectionPool { */ /** @var string Connection timeout in seconds */ protected $connectTimeout; + /** @var string Read timeout in seconds */ + protected $readTimeout; /** @var string Plaintext auth password */ protected $password; /** @var bool Whether connections persist */ @@ -76,6 +78,7 @@ class RedisConnectionPool { 'See https://www.mediawiki.org/wiki/Redis#Setup' ); } $this->connectTimeout = $options['connectTimeout']; + $this->readTimeout = $options['readTimeout']; $this->persistent = $options['persistent']; $this->password = $options['password']; if ( !isset( $options['serializer'] ) || $options['serializer'] === 'php' ) { @@ -97,6 +100,9 @@ class RedisConnectionPool { if ( !isset( $options['connectTimeout'] ) ) { $options['connectTimeout'] = 1; } + if ( !isset( $options['readTimeout'] ) ) { + $options['readTimeout'] = 31; // handles up to 30 second blocking commands + } if ( !isset( $options['persistent'] ) ) { $options['persistent'] = false; } @@ -112,6 +118,9 @@ class RedisConnectionPool { * $options include: * - connectTimeout : The timeout for new connections, in seconds. * Optional, default is 1 second. + * - readTimeout : The timeout for operation reads, in seconds. + * Commands like BLPOP can fail if told to wait longer than this. + * Optional, default is 60 seconds. * - persistent : Set this to true to allow connections to persist across * multiple web requests. False by default. * - password : The authentication password, will be sent to Redis in clear text. @@ -216,6 +225,7 @@ class RedisConnectionPool { } if ( $conn ) { + $conn->setOption( Redis::OPT_READ_TIMEOUT, $this->readTimeout ); $conn->setOption( Redis::OPT_SERIALIZER, $this->serializer ); $this->connections[$server][] = array( 'conn' => $conn, 'free' => false ); diff --git a/includes/content/TextContent.php b/includes/content/TextContent.php index a7298d3191..0c6b06f177 100644 --- a/includes/content/TextContent.php +++ b/includes/content/TextContent.php @@ -170,8 +170,7 @@ class TextContent extends AbstractContent { * * @since 1.21 * - * @param Content $that The other content object to compare this content - * object to. + * @param Content $that The other content object to compare this content object to. * @param Language $lang The language object to use for text segmentation. * If not given, $wgContentLang is used. * @@ -269,10 +268,12 @@ class TextContent extends AbstractContent { * This implementation provides lossless conversion between content models based * on TextContent. * - * @param string $toModel - * @param string $lossy + * @param string $toModel The desired content model, use the CONTENT_MODEL_XXX flags. + * @param string $lossy Flag, set to "lossy" to allow lossy conversion. If lossy conversion is not + * allowed, full round-trip conversion is expected to work without losing information. * - * @return Content|bool + * @return Content|bool A content object with the content model $toModel, or false if that + * conversion is not supported. * * @see Content::convert() */ @@ -286,7 +287,7 @@ class TextContent extends AbstractContent { $toHandler = ContentHandler::getForModelID( $toModel ); if ( $toHandler instanceof TextContentHandler ) { - //NOTE: ignore content serialization format - it's just text anyway. + // NOTE: ignore content serialization format - it's just text anyway. $text = $this->getNativeData(); $converted = $toHandler->unserializeContent( $text ); } diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index 9b9f0a9ac1..b3d5d5dc51 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -496,6 +496,8 @@ class LocalFile extends File { $decoded['timestamp'] = wfTimestamp( TS_MW, $decoded['timestamp'] ); + $decoded['metadata'] = $this->repo->getSlaveDB()->decodeBlob( $decoded['metadata'] ); + if ( empty( $decoded['major_mime'] ) ) { $decoded['mime'] = 'unknown/unknown'; } else { @@ -2114,7 +2116,7 @@ class LocalFileDeleteBatch { $dbw->insertSelect( 'filearchive', 'image', array( 'fa_storage_group' => $encGroup, - 'fa_storage_key' => "CASE WHEN img_sha1='' THEN '' ELSE $concat END", + 'fa_storage_key' => $dbw->conditional( array( 'img_sha1' => '' ), $dbw->addQuotes( '' ), $concat ), 'fa_deleted_user' => $encUserId, 'fa_deleted_timestamp' => $encTimestamp, 'fa_deleted_reason' => $encReason, @@ -2146,7 +2148,7 @@ class LocalFileDeleteBatch { $dbw->insertSelect( 'filearchive', 'oldimage', array( 'fa_storage_group' => $encGroup, - 'fa_storage_key' => "CASE WHEN oi_sha1='' THEN '' ELSE $concat END", + 'fa_storage_key' => $dbw->conditional( array( 'oi_sha1' => '' ), $dbw->addQuotes( '' ), $concat ), 'fa_deleted_user' => $encUserId, 'fa_deleted_timestamp' => $encTimestamp, 'fa_deleted_reason' => $encReason, diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php index 8f6aac71ca..e7aab8aa9b 100644 --- a/includes/installer/PostgresUpdater.php +++ b/includes/installer/PostgresUpdater.php @@ -406,6 +406,7 @@ class PostgresUpdater extends DatabaseUpdater { array( 'addPgField', 'recentchanges', 'rc_source', "TEXT NOT NULL DEFAULT ''" ), array( 'addPgField', 'page', 'page_links_updated', "TIMESTAMPTZ NULL" ), array( 'addPgField', 'mwuser', 'user_password_expires', 'TIMESTAMPTZ NULL' ), + array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea', "replace(lc_value,'\','\\\\')::bytea" ), // 1.24 array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ), @@ -677,6 +678,35 @@ END; } } + protected function changeFieldPurgeTable( $table, $field, $newtype, $default ) { + ## For a cache table, empty it if the field needs to be changed, because the old contents + ## may be corrupted. If the column is already the desired type, refrain from purging. + $fi = $this->db->fieldInfo( $table, $field ); + if ( is_null( $fi ) ) { + $this->output( "...ERROR: expected column $table.$field to exist\n" ); + exit( 1 ); + } + + if ( $fi->type() === $newtype ) { + $this->output( "...column '$table.$field' is already of type '$newtype'\n" ); + } else { + $this->output( "Purging data from cache table '$table'\n" ); + $this->db->query("DELETE from $table" ); + $this->output( "Changing column type of '$table.$field' from '{$fi->type()}' to '$newtype'\n" ); + $sql = "ALTER TABLE $table ALTER $field TYPE $newtype"; + if ( strlen( $default ) ) { + $res = array(); + if ( preg_match( '/DEFAULT (.+)/', $default, $res ) ) { + $sqldef = "ALTER TABLE $table ALTER $field SET DEFAULT $res[1]"; + $this->db->query( $sqldef ); + $default = preg_replace( '/\s*DEFAULT .+/', '', $default ); + } + $sql .= " USING $default"; + } + $this->db->query( $sql ); + } + } + protected function setDefault( $table, $field, $default ) { $info = $this->db->fieldInfo( $table, $field ); diff --git a/includes/installer/i18n/es.json b/includes/installer/i18n/es.json index 44493e7c73..518f7aa6dc 100644 --- a/includes/installer/i18n/es.json +++ b/includes/installer/i18n/es.json @@ -329,7 +329,7 @@ "config-download-localsettings": "Descargar archivo LocalSettings.php", "config-help": "Ayuda", "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?", - "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar la [/www.mediawiki.org/wiki/Extension_Matrix central] para ver una lista completa.", + "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar la [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensiones] para ver una lista completa.", "mainpagetext": "'''MediaWiki ha sido instalado con éxito.'''", "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Ayuda:Guía del usuario de contenidos] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalizar MediaWiki para tu idioma]" } diff --git a/includes/installer/i18n/ko.json b/includes/installer/i18n/ko.json index d2d8101dd1..eb7cc5b9c6 100644 --- a/includes/installer/i18n/ko.json +++ b/includes/installer/i18n/ko.json @@ -82,7 +82,7 @@ "config-gd": "내장된 GD 그래픽 라이브러리를 찾았습니다.\n올리기를 활성화할 경우 그림 섬네일이 활성화됩니다.", "config-no-scaling": "GD 라이브러리나 ImageMagick를 찾을 수 없습니다.\n그림 섬네일이 비활성화됩니다.", "config-no-uri": "'''오류:''' 현재 URI를 확인할 수 없습니다.\n설치가 중단되었습니다.", - "config-no-cli-uri": "'''경고''': 기본 값을 사용하여 --scriptpath를 지정하지 않았습니다: $1.", + "config-no-cli-uri": "'''경고''': 기본값을 사용하여 --scriptpath를 지정하지 않았습니다: $1.", "config-using-server": "\"$1\"(을)를 서버 이름으로 사용합니다.", "config-using-uri": "\"$1$2\"(을)를 서버 URL로 사용합니다.", "config-uploads-not-safe": "'''경고:''' 올리기에 대한 기본 디렉터리($1)는 임의의 스크립트 실행에 취약합니다.\n미디어위키는 보안 위협 때문에 모든 올려진 파일을 검사하지만, 올리기를 활성화하기 전에 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.", diff --git a/includes/search/SearchMssql.php b/includes/search/SearchMssql.php index 3eef498768..ed76ff8c64 100644 --- a/includes/search/SearchMssql.php +++ b/includes/search/SearchMssql.php @@ -132,7 +132,7 @@ class SearchMssql extends SearchDatabase { */ function parseQuery( $filteredText, $fulltext ) { global $wgContLang; - $lc = SearchEngine::legalSearchChars(); + $lc = $this->legalSearchChars(); $this->searchTerms = array(); # @todo FIXME: This doesn't handle parenthetical expressions. diff --git a/includes/search/SearchMySQL.php b/includes/search/SearchMySQL.php index 345ced551b..cc20d027ef 100644 --- a/includes/search/SearchMySQL.php +++ b/includes/search/SearchMySQL.php @@ -43,7 +43,7 @@ class SearchMySQL extends SearchDatabase { */ function parseQuery( $filteredText, $fulltext ) { global $wgContLang; - $lc = SearchEngine::legalSearchChars(); // Minus format chars + $lc = $this->legalSearchChars(); // Minus format chars $searchon = ''; $this->searchTerms = array(); diff --git a/includes/search/SearchOracle.php b/includes/search/SearchOracle.php index 93427d196f..c944152199 100644 --- a/includes/search/SearchOracle.php +++ b/includes/search/SearchOracle.php @@ -171,7 +171,7 @@ class SearchOracle extends SearchDatabase { */ function parseQuery( $filteredText, $fulltext ) { global $wgContLang; - $lc = SearchEngine::legalSearchChars(); + $lc = $this->legalSearchChars(); $this->searchTerms = array(); # @todo FIXME: This doesn't handle parenthetical expressions. diff --git a/includes/search/SearchSqlite.php b/includes/search/SearchSqlite.php index 1ac4946a9c..6b1a6b24bc 100644 --- a/includes/search/SearchSqlite.php +++ b/includes/search/SearchSqlite.php @@ -42,7 +42,7 @@ class SearchSqlite extends SearchDatabase { */ function parseQuery( $filteredText, $fulltext ) { global $wgContLang; - $lc = SearchEngine::legalSearchChars(); // Minus format chars + $lc = $this->legalSearchChars(); // Minus format chars $searchon = ''; $this->searchTerms = array(); diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php index 91d0404d8f..8afbf4b770 100644 --- a/includes/specials/SpecialChangePassword.php +++ b/includes/specials/SpecialChangePassword.php @@ -296,7 +296,8 @@ class SpecialChangePassword extends FormSpecialPage { if ( $isSelf ) { // This is needed to keep the user connected since // changing the password also modifies the user's token. - $user->setCookies(); + $remember = $this->getRequest()->getCookie( 'Token' ) !== null; + $user->setCookies( null, null, $remember ); } $user->resetPasswordExpiration(); $user->saveSettings(); diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index 134d5a96d5..d97103a3ae 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -43,7 +43,8 @@ "نصوح", "وهراني", "아라", - "Test Create account" + "Test Create account", + "Kuwaity26" ] }, "tog-underline": "سطر تحت الوصلات:", @@ -219,6 +220,7 @@ "permalink": "رابط دائم", "print": "اطبع", "view": "مطالعة", + "view-foreign": "اعرض على $1", "edit": "عدل", "edit-local": "تعديل الوصف المحلي", "create": "أنشئ", @@ -874,7 +876,7 @@ "search-file-match": "(يطابق محتوى الملف)", "search-suggest": "أتقصد: $1", "search-interwiki-caption": "المشاريع الشقيقة", - "search-interwiki-default": "$1 نتيجة:", + "search-interwiki-default": "نتائح من $1:", "search-interwiki-more": "(المزيد)", "search-relatedarticle": "مرتبطة", "searcheverything-enable": "ابحث في جميع النطاقات", @@ -1116,6 +1118,7 @@ "action-createpage": "إنشاء الصفحات", "action-createtalk": "إنشاء صفحات النقاش", "action-createaccount": "إنشاء حساب المستخدم هذا", + "action-history": "اعرض تاريخ هذه الصفحة", "action-minoredit": "التعليم على هذا التعديل كطفيف", "action-move": "نقل هذه الصفحة", "action-move-subpages": "نقل هذه الصفحة، وصفحاتها الفرعية", @@ -1666,6 +1669,9 @@ "listgrouprights-removegroup-self": "يمكنه إزالة {{PLURAL:$2|المجموعة|المجموعات}} من حسابه الخاص: $1", "listgrouprights-addgroup-self-all": "يمكنه إضافة كل المجموعات إلى حسابه الخاص", "listgrouprights-removegroup-self-all": "يمكنه إزالة كل المجموعات من حسابه الخاص", + "listgrouprights-namespaceprotection-namespace": "النطاق", + "trackingcategories-name": "اسم الرسالة", + "trackingcategories-disabled": "التصنيف غير مفعل", "mailnologin": "لا يوجد عنوان للإرسال", "mailnologintext": "يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.", "emailuser": "مراسلة المستخدم", diff --git a/languages/i18n/azb.json b/languages/i18n/azb.json index 6a175ddb57..731589560e 100644 --- a/languages/i18n/azb.json +++ b/languages/i18n/azb.json @@ -1076,6 +1076,8 @@ "recentchanges-label-minor": "بو بیر کیچیک دَییشدیرمه‌دیر", "recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر", "recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر", + "recentchanges-legend-heading": "'''ایختیصارلار:'''", + "recentchanges-legend-newpage": "(هم‌ده [[Special:NewPages|یئنی صحیفه‌لرین لیستینه]] باخین)", "rcnotefrom": "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر گلیبلر.", "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر", "rcshowhideminor": "کیچیک دَییشیکلری $1", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index 23f6fbdb53..03f5363160 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -1093,6 +1093,7 @@ "action-createpage": "стварэньне старонак", "action-createtalk": "стварэньне старонак абмеркаваньняў", "action-createaccount": "стварэньне гэтага рахунку ўдзельніка", + "action-history": "прагляд гісторыі гэтай старонкі", "action-minoredit": "пазначэньне гэтай праўкі як дробнай", "action-move": "перанос гэтай старонкі", "action-move-subpages": "перанос гэтай старонкі і яе падстаронак", diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json index 2e26ebf395..ebd81d3485 100644 --- a/languages/i18n/bn.json +++ b/languages/i18n/bn.json @@ -2955,6 +2955,7 @@ "htmlform-no": "না", "htmlform-yes": "হ্যাঁ", "htmlform-chosen-placeholder": "অপশন নির্বাচন করুন", + "htmlform-cloner-delete": "অপসারণ", "sqlite-has-fts": "$1 সহ পূর্ণ টেক্সট সার্চ সমর্থন", "sqlite-no-fts": "$1 বাদে পূর্ণ টেক্সট সার্চ সমর্থন", "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index 505980b663..7635d2289d 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -1107,6 +1107,7 @@ "action-createpage": "vytvářet stránky", "action-createtalk": "vytvářet diskusní stránky", "action-createaccount": "vytvořit tento uživatelský účet", + "action-history": "prohlížet si historii této stránky", "action-minoredit": "označit tuto editaci jako malou", "action-move": "přesunout tuto stránku", "action-move-subpages": "přesunout tuto stránku a její podstránky", @@ -3031,6 +3032,9 @@ "htmlform-no": "Ne", "htmlform-yes": "Ano", "htmlform-chosen-placeholder": "Zvolte možnost", + "htmlform-cloner-create": "Přidat další", + "htmlform-cloner-delete": "Odstranit", + "htmlform-cloner-required": "Je povinná nejméně jedna hodnota.", "sqlite-has-fts": "$1 s podporou plnotextového vyhledávání", "sqlite-no-fts": "$1 bez podpory plnotextového vyhledávání", "logentry-delete-delete": "$1 {{GENDER:$2|smazal|smazala}} stránku $3", diff --git a/languages/i18n/cy.json b/languages/i18n/cy.json index 75e88a730a..82c50f41b6 100644 --- a/languages/i18n/cy.json +++ b/languages/i18n/cy.json @@ -1082,6 +1082,7 @@ "action-createpage": "creu tudalennau", "action-createtalk": "creu tudalennau sgwrs", "action-createaccount": "creu'r cyfrif defnyddiwr hwn", + "action-history": "gweld hanes y dudalen", "action-minoredit": "marcio'r golygiad yn un bach", "action-move": "symud y dudalen", "action-move-subpages": "symud y dudalen a'i is-dudalennau", @@ -1628,6 +1629,8 @@ "listgrouprights-removegroup-self": "Yn gallu tynnu {{PLURAL:$2|grŵp}} oddi ar eich cyfrif eich hunan: $1", "listgrouprights-addgroup-self-all": "Yn gallu ychwanegu'r holl grwpiau at eich cyfrif eich hunan", "listgrouprights-removegroup-self-all": "Yn gallu tynnu'r holl grwpiau oddi ar eich cyfrif eich hunan", + "listgrouprights-namespaceprotection-namespace": "Parth", + "listgrouprights-namespaceprotection-restrictedto": "Gallu(oedd) yn caniatau i'r defnyddiwr olygu", "trackingcategories-name": "Enw'r neges", "trackingcategories-nodesc": "Dim disgrifiad ar gael.", "trackingcategories-disabled": "Categorïau yr analluogwyd", @@ -2909,6 +2912,8 @@ "htmlform-no": "Na/Nac ydw/Na fydd...", "htmlform-yes": "Ie/Iawn/Ydw/Oes...", "htmlform-chosen-placeholder": "Dewiswch opsiwn", + "htmlform-cloner-create": "Ychwaneger rhes", + "htmlform-cloner-delete": "Tynner i ffwrdd", "sqlite-has-fts": "$1 gyda chymorth chwilio yr holl destun", "sqlite-no-fts": "$1 heb gymorth chwiliad yr holl destun", "logentry-delete-delete": "Dileodd $1 y dudalen $3", diff --git a/languages/i18n/es.json b/languages/i18n/es.json index baeb37f6ed..9ac321654d 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -107,7 +107,8 @@ "לערי ריינהארט", "Chocolate con galleta", "Csbotero", - "아라" + "아라", + "Mcervera" ] }, "tog-underline": "Subrayar los enlaces:", @@ -1188,6 +1189,7 @@ "action-createpage": "crear páginas", "action-createtalk": "crear páginas de discusión", "action-createaccount": "crear esta cuenta de usuario", + "action-history": "Ver el historial de esta página", "action-minoredit": "marcar este cambio como menor", "action-move": "trasladar esta página", "action-move-subpages": "trasladar esta página y sus subpáginas", @@ -3064,6 +3066,9 @@ "htmlform-no": "No", "htmlform-yes": "Sí", "htmlform-chosen-placeholder": "Selecciona una opción", + "htmlform-cloner-create": "Añadir más", + "htmlform-cloner-delete": "Eliminar", + "htmlform-cloner-required": "Se requiere al menos un valor", "sqlite-has-fts": "$1 con soporte para búsqueda de texto completo", "sqlite-no-fts": "$1 sin soporte para búsqueda de texto completo", "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página «$3»", diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index 953dcf4bcd..44d82eedf5 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -1189,6 +1189,7 @@ "action-createpage": "créer des pages", "action-createtalk": "créer des pages de discussion", "action-createaccount": "créer ce compte utilisateur", + "action-history": "afficher l’historique de cette page", "action-minoredit": "marquer cette modification comme mineure", "action-move": "renommer cette page", "action-move-subpages": "renommer cette page et ses sous-pages", @@ -3153,6 +3154,9 @@ "htmlform-no": "Non", "htmlform-yes": "Oui", "htmlform-chosen-placeholder": "Choisir une option", + "htmlform-cloner-create": "Ajouter encore", + "htmlform-cloner-delete": "Supprimer", + "htmlform-cloner-required": "Une valeur au moins est obligatoire.", "sqlite-has-fts": "$1 avec recherche en texte intégral supportée", "sqlite-no-fts": "$1 sans recherche en texte intégral supportée", "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3", diff --git a/languages/i18n/hr.json b/languages/i18n/hr.json index 09541654c9..94a7b70ed2 100644 --- a/languages/i18n/hr.json +++ b/languages/i18n/hr.json @@ -1782,6 +1782,7 @@ "contributions-title": "Suradnički doprinosi za $1", "mycontris": "Moji doprinosi", "contribsub2": "Za {{GENDER:$3|$1}} ($2)", + "contributions-userdoesnotexist": "Suradnički račun \"$1\" nije registriran.", "nocontribs": "Nema promjena koje udovoljavaju ovim kriterijima.", "uctop": "(vrh)", "month": "Od mjeseca (i ranije):", diff --git a/languages/i18n/it.json b/languages/i18n/it.json index 3ee6d158cc..3c30cf1840 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -1152,6 +1152,7 @@ "action-createpage": "creare pagine", "action-createtalk": "creare pagine di discussione", "action-createaccount": "effettuare questa registrazione", + "action-history": "vedere la cronologia di questa pagina", "action-minoredit": "segnare questa modifica come minore", "action-move": "spostare questa pagina", "action-move-subpages": "spostare questa pagina e le relative sottopagine", @@ -3037,6 +3038,9 @@ "htmlform-no": "No", "htmlform-yes": "Sì", "htmlform-chosen-placeholder": "Seleziona un'opzione", + "htmlform-cloner-create": "Aggiungi altro", + "htmlform-cloner-delete": "Rimuovi", + "htmlform-cloner-required": "È necessario almeno un valore.", "sqlite-has-fts": "$1 con la possibilità di ricerca completa nel testo", "sqlite-no-fts": "$1 senza la possibilità di ricerca completa nel testo", "logentry-delete-delete": "$1 {{GENDER:$2|ha cancellato}} la pagina $3", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index 819efe8149..7a364e1a94 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -1139,6 +1139,7 @@ "action-createpage": "ページの作成", "action-createtalk": "議論ページの作成", "action-createaccount": "この利用者アカウントの作成", + "action-history": "このページの履歴の閲覧", "action-minoredit": "細部の編集の印を付ける", "action-move": "このページの移動", "action-move-subpages": "このページとその下位ページの移動", @@ -2020,8 +2021,8 @@ "expiringblock": "$1$2に解除", "anononlyblock": "匿名利用者のみ", "noautoblockblock": "自動ブロック無効", - "createaccountblock": "アカウント作成の禁止", - "emailblock": "メール送信の禁止", + "createaccountblock": "アカウント作成も禁止", + "emailblock": "メール送信も禁止", "blocklist-nousertalk": "自分のトークページも編集禁止", "ipblocklist-empty": "ブロック一覧は空です。", "ipblocklist-no-results": "指定されたIPアドレスまたは利用者名はブロックされていません。", @@ -2038,11 +2039,11 @@ "reblock-logentry": "が [[$1]] のブロック設定を$2に変更しました。ブロックの詳細: $3", "blocklogtext": "このページは利用者のブロックと解除の記録です。\n自動的にブロックされたIPアドレスは表示されていません。\n現時点で有効なブロックは[[Special:BlockList|ブロックの一覧]]をご覧ください。", "unblocklogentry": "$1のブロックを解除しました", - "block-log-flags-anononly": "匿名利用者のみ", - "block-log-flags-nocreate": "アカウント作成禁止", + "block-log-flags-anononly": "対象は匿名利用者のみ", + "block-log-flags-nocreate": "アカウント作成も禁止", "block-log-flags-noautoblock": "自動ブロック無効", "block-log-flags-noemail": "メール送信禁止", - "block-log-flags-nousertalk": "自分のトークページの編集禁止", + "block-log-flags-nousertalk": "自分のトークページも編集禁止", "block-log-flags-angry-autoblock": "拡張自動ブロック有効", "block-log-flags-hiddenname": "利用者名の秘匿", "range_block_disabled": "範囲ブロックを作成する管理者機能は無効化されています。", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index 38063153c0..8f5ca8d159 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -80,9 +80,9 @@ "tog-prefershttps": "로그인할 때 항상 보안 연결 사용", "underline-always": "항상", "underline-never": "항상 치지 않기", - "underline-default": "스킨 또는 브라우저 기본 값을 따르기", + "underline-default": "스킨 또는 브라우저 기본값", "editfont-style": "편집 창의 글꼴:", - "editfont-default": "브라우저 기본 값을 따르기", + "editfont-default": "브라우저 기본값", "editfont-monospace": "고정폭 글꼴", "editfont-sansserif": "산세리프 글꼴", "editfont-serif": "세리프 글꼴", @@ -899,7 +899,7 @@ "prefsnologintext2": "사용자 환경 설정을 설정하려면 $1하십시오.", "prefs-skin": "스킨", "skin-preview": "미리 보기", - "datedefault": "기본 값", + "datedefault": "설정하지 않음", "prefs-labs": "실험 중인 기능", "prefs-user-pages": "사용자 문서", "prefs-personal": "사용자 정보", @@ -955,7 +955,7 @@ "prefs-custom-css": "사용자 CSS", "prefs-custom-js": "사용자 자바스크립트", "prefs-common-css-js": "모든 스킨에 대한 공통 CSS/자바스크립트:", - "prefs-reset-intro": "이 사이트의 기본 값으로 환경 설정을 재설정할 수 있습니다.\n재설정한 환경 설정은 되돌릴 수 없습니다.", + "prefs-reset-intro": "이 페이지를 사용해 사이트 기본값으로 환경 설정을 재설정할 수 있습니다.\n이는 되돌릴 수 없습니다.", "prefs-emailconfirm-label": "이메일 인증:", "youremail": "이메일:", "username": "{{GENDER:$1|사용자 이름}}:", @@ -1116,6 +1116,7 @@ "action-createpage": "문서 만들기", "action-createtalk": "토론 문서 만들기", "action-createaccount": "새 계정 만들기", + "action-history": "이 문서의 역사 보기", "action-minoredit": "이 편집을 사소한 편집으로 표시하기", "action-move": "이 문서 옮기기", "action-move-subpages": "이 문서와 하위 문서를 함께 옮기기", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index eb8fd5e7b0..02d1033e34 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -1085,6 +1085,7 @@ "action-createpage": "Säiten unzelleeën", "action-createtalk": "Diskussiounssäiten unzeleeën", "action-createaccount": "dëse Benotzerkont unzeleeën", + "action-history": "d'Versioune vun dëser Säit weisen", "action-minoredit": "dës Ännerung als kleng Ännerung ze markéieren", "action-move": "dës Säit ze réckelen", "action-move-subpages": "dës Säit an déi Ënnersäiten déi dozou gehéieren ze réckelen", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index ca352761bb..6d1f3f9dd6 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -1102,6 +1102,7 @@ "action-createpage": "создавање страници", "action-createtalk": "создавање страници за разговор", "action-createaccount": "создај ја оваа корисничка сметка", + "action-history": "преглед на историјата на оваа страница", "action-minoredit": "означување на ова уредување како ситно", "action-move": "преместување на оваа страница", "action-move-subpages": "преместување на оваа страница и нејзините потстраници", diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json index 40c2325d75..38993b74f4 100644 --- a/languages/i18n/nb.json +++ b/languages/i18n/nb.json @@ -1122,6 +1122,7 @@ "action-createpage": "opprette sider", "action-createtalk": "opprette diskusjonssider", "action-createaccount": "opprette denne kontoen", + "action-history": "se historikken til denne siden", "action-minoredit": "merke denne redigeringen som mindre", "action-move": "flytte denne siden", "action-move-subpages": "flytte denne siden og dens undersider", @@ -3005,6 +3006,9 @@ "htmlform-no": "Nei", "htmlform-yes": "Ja", "htmlform-chosen-placeholder": "Velg et alternativ", + "htmlform-cloner-create": "Legg til mer", + "htmlform-cloner-delete": "Fjern", + "htmlform-cloner-required": "Minst én verdi kreves.", "sqlite-has-fts": "$1 med støtte for fulltekstsøk", "sqlite-no-fts": "$1 uten støtte for fulltekstsøk", "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index 687ea97d7b..9e2c8609a4 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -3050,6 +3050,7 @@ "htmlform-no": "Nie", "htmlform-yes": "Tak", "htmlform-chosen-placeholder": "Wybierz opcję", + "htmlform-cloner-delete": "Usuń", "sqlite-has-fts": "$1 z obsługą pełnotekstowego wyszukiwania", "sqlite-no-fts": "$1 bez obsługi pełnotekstowego wyszukiwania", "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index 918214949a..35fa6d63cf 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -896,7 +896,7 @@ "search-redirect": "(redirecionamento de $1)", "search-section": "(seção $1)", "search-file-match": "(coincide com o conteúdo do ficheiro)", - "search-suggest": "Será que queria dizer: $1", + "search-suggest": "Será que você quis dizer: $1", "search-interwiki-caption": "Projetos irmãos", "search-interwiki-default": "Resultados de $1:", "search-interwiki-more": "(mais)", diff --git a/languages/i18n/ro.json b/languages/i18n/ro.json index 9557885333..1974690cc8 100644 --- a/languages/i18n/ro.json +++ b/languages/i18n/ro.json @@ -1102,6 +1102,7 @@ "action-createpage": "creați pagini", "action-createtalk": "creați pagini de discuție", "action-createaccount": "creați acest cont de utilizator", + "action-history": "vizualizați istoricul acestei pagini", "action-minoredit": "marcați această modificare ca minoră", "action-move": "redenumiți această pagină", "action-move-subpages": "redenumiți această pagină și subpaginile sale", diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json index 2ce537c212..ac042a3c76 100644 --- a/languages/i18n/sl.json +++ b/languages/i18n/sl.json @@ -903,7 +903,7 @@ "recentchangescount": "Privzeto število prikazanih urejanj:", "prefs-help-recentchangescount": "Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.", "prefs-help-watchlist-token2": "To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].", - "savedprefs": "Spremembe so bile uspešno shranjene.", + "savedprefs": "Spremembe so uspešno shranjene.", "timezonelegend": "Časovni pas", "localtime": "Krajevni čas:", "timezoneuseserverdefault": "Uporabi privzeti wiki čas ($1)", @@ -1091,6 +1091,7 @@ "action-createpage": "ustvarjenje strani", "action-createtalk": "ustvarjanje pogovornih strani", "action-createaccount": "registracija tega uporabniškega računa", + "action-history": "ogled zgodovine strani", "action-minoredit": "označevanje tega urejanja kot manjšega", "action-move": "premik te strani", "action-move-subpages": "premik te strani in njenih podstrani", diff --git a/languages/i18n/yi.json b/languages/i18n/yi.json index f7548c50ba..3b64e437ff 100644 --- a/languages/i18n/yi.json +++ b/languages/i18n/yi.json @@ -650,6 +650,7 @@ "edit-conflict": "רעדאקטירן קאנפֿליקט.", "edit-no-change": "מ'האט איגנארירט אײַער רעדאַקטירונג, ווײַל קיין שום ענדערונג איז נישט געמאַכט צום טעקסט.", "postedit-confirmation-created": "דער בלאט איז געווארן געשאפן.", + "postedit-confirmation-restored": "דער בלאט איז געווארן צוריקגעשטעלט.", "postedit-confirmation-saved": "אייער רעדאקטירונג איז געווארן אויפגעהיטן.", "edit-already-exists": "נישט מעגליך צו שאַפֿן נייעם בלאט.\nער עקזיסטירט שוין.", "defaultmessagetext": "גרונטלעכער מעלדונג טעקסט", @@ -1083,6 +1084,7 @@ "action-createpage": "שאַפֿן בלעטער", "action-createtalk": "שאַפֿן שמועס בלעטער", "action-createaccount": "שאַפֿן די באַניצער קאנטע", + "action-history": "באקוקן רעדאקטירן היסטאריע פון דעם בלאט.", "action-minoredit": "באַצייכענען די רעדאַקטירונג ווי מינערדיק", "action-move": "באַוועגן דעם בלאַט", "action-move-subpages": "באַוועגן דעם בלאַט מיט זײַנע אונטערבלעטער", diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json index f8140bd4a2..33fadabf02 100644 --- a/languages/i18n/zh-hans.json +++ b/languages/i18n/zh-hans.json @@ -1157,6 +1157,7 @@ "action-createpage": "创建页面", "action-createtalk": "创建讨论页面", "action-createaccount": "创建该用户账户", + "action-history": "查看此页历史", "action-minoredit": "标记该编辑为小编辑", "action-move": "移动本页", "action-move-subpages": "移动本页及其子页面", diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json index 2144898aa0..c8e9837938 100644 --- a/languages/i18n/zh-hant.json +++ b/languages/i18n/zh-hant.json @@ -1130,6 +1130,7 @@ "action-createpage": "建立這個頁面", "action-createtalk": "建立討論頁面", "action-createaccount": "建立這個使用者帳號", + "action-history": "查閱此頁面歷史", "action-minoredit": "標示此編輯為小修訂", "action-move": "移動這個頁面", "action-move-subpages": "移動這個頁面跟它的子頁面", diff --git a/languages/messages/MessagesCy.php b/languages/messages/MessagesCy.php index f06b278640..55ed354754 100644 --- a/languages/messages/MessagesCy.php +++ b/languages/messages/MessagesCy.php @@ -98,7 +98,6 @@ $defaultDateFormat = 'dmy'; $bookstoreList = array( "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN", - "PriceSCAN" => "http://www.pricescan.com/books/bookDetail.asp?isbn=$1", "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1", "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1", "Amazon.co.uk" => "http://www.amazon.co.uk/exec/obidos/ISBN=$1" diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 265e6830b2..39036d76e9 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -189,7 +189,6 @@ $dateFormats = array( */ $bookstoreList = array( 'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN', - 'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1', 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1', 'Amazon.com' => 'http://www.amazon.com/gp/search/?field-isbn=$1' ); diff --git a/languages/messages/MessagesEt.php b/languages/messages/MessagesEt.php index f6fda253bb..49c2cbcc50 100644 --- a/languages/messages/MessagesEt.php +++ b/languages/messages/MessagesEt.php @@ -143,7 +143,6 @@ $bookstoreList = array( 'minu Raamat' => 'http://www.raamat.ee/advanced_search_result.php?keywords=$1', 'Raamatukoi' => 'http://www.raamatukoi.ee/cgi-bin/index?valik=otsing&paring=$1', 'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN', - 'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1', 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1', 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1' ); diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php index 773d3a2eee..48507d45fe 100644 --- a/languages/messages/MessagesId.php +++ b/languages/messages/MessagesId.php @@ -48,7 +48,6 @@ $bookstoreList = array( 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1', 'Bhinneka.com bookstore' => 'http://www.bhinneka.com/Buku/Engine/search.asp?fisbn=$1', 'Gramedia Cyberstore (via Google)' => 'http://www.google.com/search?q=%22ISBN+:+$1%22+%22product_detail%22+site:www.gramediacyberstore.com+OR+site:www.gramediaonline.com+OR+site:www.kompas.com&hl=id', - 'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1', ); $magicWords = array( diff --git a/languages/messages/MessagesTyv.php b/languages/messages/MessagesTyv.php index a13055bf3a..de694e432d 100644 --- a/languages/messages/MessagesTyv.php +++ b/languages/messages/MessagesTyv.php @@ -101,7 +101,6 @@ $bookstoreList = array( 'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1', 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1', 'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN', - 'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1', 'Barnes & Noble' => 'http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1' ); diff --git a/languages/messages/MessagesYue.php b/languages/messages/MessagesYue.php index c4394d2117..96f640c24d 100644 --- a/languages/messages/MessagesYue.php +++ b/languages/messages/MessagesYue.php @@ -193,7 +193,6 @@ $specialPageAliases = array( $bookstoreList = array( 'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN', - 'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1', 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1', '亞馬遜' => 'http://www.amazon.com/exec/obidos/ISBN=$1', '博客來書店' => 'http://www.books.com.tw/exep/prod/booksfile.php?item=$1', diff --git a/languages/messages/MessagesZh_hans.php b/languages/messages/MessagesZh_hans.php index 7f02fe71af..b6606f6616 100644 --- a/languages/messages/MessagesZh_hans.php +++ b/languages/messages/MessagesZh_hans.php @@ -373,7 +373,6 @@ $dateFormats = array( $bookstoreList = array( 'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN', - 'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1', 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1', '亚马逊' => 'http://www.amazon.com/exec/obidos/ISBN=$1', '卓越亚马逊' => 'http://www.amazon.cn/mn/advancedSearchApp?isbn=$1', diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql index 6a2c41d065..abbfd3a166 100644 --- a/maintenance/postgres/tables.sql +++ b/maintenance/postgres/tables.sql @@ -678,7 +678,7 @@ CREATE INDEX user_properties_property ON user_properties (up_property); CREATE TABLE l10n_cache ( lc_lang TEXT NOT NULL, lc_key TEXT NOT NULL, - lc_value TEXT NOT NULL + lc_value BYTEA NOT NULL ); CREATE INDEX l10n_cache_lc_lang_key ON l10n_cache (lc_lang, lc_key); diff --git a/resources/lib/oojs-ui/i18n/ne.json b/resources/lib/oojs-ui/i18n/ne.json index 6b7c78adba..f7bbff4696 100644 --- a/resources/lib/oojs-ui/i18n/ne.json +++ b/resources/lib/oojs-ui/i18n/ne.json @@ -4,5 +4,10 @@ "RajeshPandey", "सरोज कुमार ढकाल" ] - } + }, + "ooui-dialog-action-close": "बन्द गर्ने", + "ooui-outline-control-move-down": "वस्तुलाई तल सार्ने", + "ooui-outline-control-move-up": "वस्तुलाई माथि सार्ने", + "ooui-outline-control-remove": "वस्तुलाई हटाउने", + "ooui-toolbar-more": "थप" } diff --git a/resources/lib/oojs-ui/oojs-ui-apex.css b/resources/lib/oojs-ui/oojs-ui-apex.css index 952e05eca8..63a66fb86c 100644 --- a/resources/lib/oojs-ui/oojs-ui-apex.css +++ b/resources/lib/oojs-ui/oojs-ui-apex.css @@ -47,6 +47,10 @@ bottom: 4.8em; } +.oo-ui-dialog-content-footless .oo-ui-window-body { + bottom: 0; +} + .oo-ui-dialog > .oo-ui-window-frame { top: 1em; bottom: 1em; diff --git a/resources/lib/oojs-ui/oojs-ui.js b/resources/lib/oojs-ui/oojs-ui.js index 6ba7ac87ef..b5f88245ee 100644 --- a/resources/lib/oojs-ui/oojs-ui.js +++ b/resources/lib/oojs-ui/oojs-ui.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.1.0-pre (9a6c625f5f) + * OOjs UI v0.1.0-pre (7d2507b267) * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2014 OOjs Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: Fri May 02 2014 12:04:40 GMT-0700 (PDT) + * Date: Mon May 05 2014 14:13:13 GMT-0700 (PDT) */ ( function ( OO ) { @@ -1946,7 +1946,7 @@ OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) { * @param {jQuery.Event} e Mouse down event */ OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) { - if ( this.disabled || e.which !== 1 ) { + if ( this.isDisabled() || e.which !== 1 ) { return false; } // tabIndex should generally be interacted with via the property, @@ -1967,7 +1967,7 @@ OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) { * @param {jQuery.Event} e Mouse up event */ OO.ui.ButtonedElement.prototype.onMouseUp = function ( e ) { - if ( this.disabled || e.which !== 1 ) { + if ( this.isDisabled() || e.which !== 1 ) { return false; } // Restore the tab-index after the button is up to restore the button's accesssibility @@ -3545,7 +3545,7 @@ OO.ui.ToolGroup.prototype.updateDisabled = function () { * @param {jQuery.Event} e Mouse down event */ OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) { - if ( !this.disabled && e.which === 1 ) { + if ( !this.isDisabled() && e.which === 1 ) { this.pressed = this.getTargetTool( e ); if ( this.pressed ) { this.pressed.setActive( true ); @@ -3577,7 +3577,7 @@ OO.ui.ToolGroup.prototype.onCapturedMouseUp = function ( e ) { OO.ui.ToolGroup.prototype.onMouseUp = function ( e ) { var tool = this.getTargetTool( e ); - if ( !this.disabled && e.which === 1 && this.pressed && this.pressed === tool ) { + if ( !this.isDisabled() && e.which === 1 && this.pressed && this.pressed === tool ) { this.pressed.onSelect(); } @@ -4096,7 +4096,7 @@ OO.ui.GridLayout.prototype.getPanel = function ( x, y ) { * @constructor * @param {Object} [config] Configuration options * @cfg {boolean} [continuous=false] Show all pages, one after another - * @cfg {boolean} [autoFocus=false] Focus on the first focusable element when changing to a page + * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when changing to a page * @cfg {boolean} [outlined=false] Show an outline * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages * @cfg {Object[]} [adders] List of adders for controls, each with name, icon and title properties @@ -4113,7 +4113,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) { this.pages = {}; this.ignoreFocus = false; this.stackLayout = new OO.ui.StackLayout( { '$': this.$, 'continuous': !!config.continuous } ); - this.autoFocus = !!config.autoFocus; + this.autoFocus = config.autoFocus === undefined ? true : !!config.autoFocus; this.outlineVisible = false; this.outlined = !!config.outlined; if ( this.outlined ) { @@ -4898,7 +4898,7 @@ OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) { * @inheritdoc */ OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) { - if ( !this.disabled && e.which === 1 ) { + if ( !this.isDisabled() && e.which === 1 ) { this.setActive( false ); } return OO.ui.ToolGroup.prototype.onMouseUp.call( this, e ); @@ -4919,7 +4919,7 @@ OO.ui.PopupToolGroup.prototype.onHandleMouseUp = function () { * @param {jQuery.Event} e Mouse down event */ OO.ui.PopupToolGroup.prototype.onHandleMouseDown = function ( e ) { - if ( !this.disabled && e.which === 1 ) { + if ( !this.isDisabled() && e.which === 1 ) { this.setActive( !this.active ); } return false; @@ -5066,7 +5066,7 @@ OO.mixinClass( OO.ui.PopupTool, OO.ui.PopuppableElement ); * @inheritdoc */ OO.ui.PopupTool.prototype.onSelect = function () { - if ( !this.disabled ) { + if ( !this.isDisabled() ) { if ( this.popup.isVisible() ) { this.hidePopup(); } else { @@ -5357,7 +5357,7 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggableElement ); * @fires click */ OO.ui.ButtonWidget.prototype.onClick = function () { - if ( !this.disabled ) { + if ( !this.isDisabled() ) { this.emit( 'click' ); if ( this.isHyperlink ) { return true; @@ -5373,7 +5373,7 @@ OO.ui.ButtonWidget.prototype.onClick = function () { * @fires click */ OO.ui.ButtonWidget.prototype.onKeyPress = function ( e ) { - if ( !this.disabled && e.which === OO.ui.Keys.SPACE ) { + if ( !this.isDisabled() && e.which === OO.ui.Keys.SPACE ) { if ( this.isHyperlink ) { this.onClick(); return true; @@ -5414,7 +5414,7 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) { // Initialization this.$input .attr( 'name', config.name ) - .prop( 'disabled', this.disabled ); + .prop( 'disabled', this.isDisabled() ); this.setReadOnly( config.readOnly ); this.$element.addClass( 'oo-ui-inputWidget' ).append( this.$input ); this.setValue( config.value ); @@ -5449,7 +5449,7 @@ OO.ui.InputWidget.prototype.getInputElement = function () { * @param {jQuery.Event} e Key down, mouse up, cut, paste, change, input, or select event */ OO.ui.InputWidget.prototype.onEdit = function () { - if ( !this.disabled ) { + if ( !this.isDisabled() ) { // Allow the stack to clear so the value will be updated setTimeout( OO.ui.bind( function () { this.setValue( this.$input.val() ); @@ -5562,7 +5562,7 @@ OO.ui.InputWidget.prototype.setReadOnly = function ( state ) { OO.ui.InputWidget.prototype.setDisabled = function ( state ) { OO.ui.Widget.prototype.setDisabled.call( this, state ); if ( this.$input ) { - this.$input.prop( 'disabled', this.disabled ); + this.$input.prop( 'disabled', this.isDisabled() ); } return this; }; @@ -5635,7 +5635,7 @@ OO.ui.CheckboxInputWidget.prototype.setValue = function ( value ) { * @inheritdoc */ OO.ui.CheckboxInputWidget.prototype.onEdit = function () { - if ( !this.disabled ) { + if ( !this.isDisabled() ) { // Allow the stack to clear so the value will be updated setTimeout( OO.ui.bind( function () { this.setValue( this.$input.prop( 'checked' ) ); @@ -6005,7 +6005,7 @@ OO.ui.OptionWidget.static.scrollIntoViewOnSelect = false; * @return {boolean} Item is selectable */ OO.ui.OptionWidget.prototype.isSelectable = function () { - return this.constructor.static.selectable && !this.disabled; + return this.constructor.static.selectable && !this.isDisabled(); }; /** @@ -6014,7 +6014,7 @@ OO.ui.OptionWidget.prototype.isSelectable = function () { * @return {boolean} Item is highlightable */ OO.ui.OptionWidget.prototype.isHighlightable = function () { - return this.constructor.static.highlightable && !this.disabled; + return this.constructor.static.highlightable && !this.isDisabled(); }; /** @@ -6023,7 +6023,7 @@ OO.ui.OptionWidget.prototype.isHighlightable = function () { * @return {boolean} Item is pressable */ OO.ui.OptionWidget.prototype.isPressable = function () { - return this.constructor.static.pressable && !this.disabled; + return this.constructor.static.pressable && !this.isDisabled(); }; /** @@ -6060,7 +6060,7 @@ OO.ui.OptionWidget.prototype.isPressed = function () { * @chainable */ OO.ui.OptionWidget.prototype.setSelected = function ( state ) { - if ( !this.disabled && this.constructor.static.selectable ) { + if ( !this.isDisabled() && this.constructor.static.selectable ) { this.selected = !!state; if ( this.selected ) { this.$element.addClass( 'oo-ui-optionWidget-selected' ); @@ -6081,7 +6081,7 @@ OO.ui.OptionWidget.prototype.setSelected = function ( state ) { * @chainable */ OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) { - if ( !this.disabled && this.constructor.static.highlightable ) { + if ( !this.isDisabled() && this.constructor.static.highlightable ) { this.highlighted = !!state; if ( this.highlighted ) { this.$element.addClass( 'oo-ui-optionWidget-highlighted' ); @@ -6099,7 +6099,7 @@ OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) { * @chainable */ OO.ui.OptionWidget.prototype.setPressed = function ( state ) { - if ( !this.disabled && this.constructor.static.pressable ) { + if ( !this.isDisabled() && this.constructor.static.pressable ) { this.pressed = !!state; if ( this.pressed ) { this.$element.addClass( 'oo-ui-optionWidget-pressed' ); @@ -6121,7 +6121,7 @@ OO.ui.OptionWidget.prototype.flash = function () { var $this = this.$element, deferred = $.Deferred(); - if ( !this.disabled && this.constructor.static.pressable ) { + if ( !this.isDisabled() && this.constructor.static.pressable ) { $this.removeClass( 'oo-ui-optionWidget-highlighted oo-ui-optionWidget-pressed' ); setTimeout( OO.ui.bind( function () { // Restore original classes @@ -6246,7 +6246,7 @@ OO.ui.SelectWidget.static.tagName = 'ul'; OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) { var item; - if ( !this.disabled && e.which === 1 ) { + if ( !this.isDisabled() && e.which === 1 ) { this.togglePressed( true ); item = this.getTargetItem( e ); if ( item && item.isSelectable() ) { @@ -6274,7 +6274,7 @@ OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) { this.selecting = item; } } - if ( !this.disabled && e.which === 1 && this.selecting ) { + if ( !this.isDisabled() && e.which === 1 && this.selecting ) { this.pressItem( null ); this.chooseItem( this.selecting ); this.selecting = null; @@ -6292,7 +6292,7 @@ OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) { OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) { var item; - if ( !this.disabled && this.pressed ) { + if ( !this.isDisabled() && this.pressed ) { item = this.getTargetItem( e ); if ( item && item !== this.selecting && item.isSelectable() ) { this.pressItem( item ); @@ -6311,7 +6311,7 @@ OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) { OO.ui.SelectWidget.prototype.onMouseOver = function ( e ) { var item; - if ( !this.disabled ) { + if ( !this.isDisabled() ) { item = this.getTargetItem( e ); this.highlightItem( item && item.isHighlightable() ? item : null ); } @@ -6325,7 +6325,7 @@ OO.ui.SelectWidget.prototype.onMouseOver = function ( e ) { * @param {jQuery.Event} e Mouse over event */ OO.ui.SelectWidget.prototype.onMouseLeave = function () { - if ( !this.disabled ) { + if ( !this.isDisabled() ) { this.highlightItem( null ); } return false; @@ -6720,7 +6720,7 @@ OO.ui.MenuWidget.prototype.onKeyDown = function ( e ) { handled = false, highlightItem = this.getHighlightedItem(); - if ( !this.disabled && this.visible ) { + if ( !this.isDisabled() && this.visible ) { if ( !highlightItem ) { highlightItem = this.getSelectedItem(); } @@ -6997,7 +6997,7 @@ OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) { return; } - if ( !this.disabled ) { + if ( !this.isDisabled() ) { if ( this.menu.isVisible() ) { this.menu.hide(); } else { @@ -7653,7 +7653,7 @@ OO.ui.PopupButtonWidget.prototype.onClick = function ( e ) { return; } - if ( !this.disabled ) { + if ( !this.isDisabled() ) { if ( this.popup.isVisible() ) { this.hidePopup(); } else { @@ -8223,7 +8223,7 @@ OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget ); * @inheritdoc */ OO.ui.ToggleButtonWidget.prototype.onClick = function () { - if ( !this.disabled ) { + if ( !this.isDisabled() ) { this.setValue( !this.value ); } @@ -8295,7 +8295,7 @@ OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget ); * @param {jQuery.Event} e Mouse down event */ OO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) { - if ( !this.disabled && e.which === 1 ) { + if ( !this.isDisabled() && e.which === 1 ) { this.setValue( !this.value ); } }; diff --git a/resources/lib/oojs-ui/oojs-ui.svg.css b/resources/lib/oojs-ui/oojs-ui.svg.css index 955b71a2f8..0c2cfaf303 100644 --- a/resources/lib/oojs-ui/oojs-ui.svg.css +++ b/resources/lib/oojs-ui/oojs-ui.svg.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.1.0-pre (9a6c625f5f) + * OOjs UI v0.1.0-pre (7d2507b267) * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2014 OOjs Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: Fri May 02 2014 12:04:40 GMT-0700 (PDT) + * Date: Mon May 05 2014 14:13:12 GMT-0700 (PDT) */ /* Textures */ @@ -84,10 +84,6 @@ float: right; } -.oo-ui-dialog-content-footless .oo-ui-window-body { - bottom: 0; -} - .oo-ui-dialog-content-footless .oo-ui-window-foot { display: none; } @@ -1173,4 +1169,4 @@ .oo-ui-indicator-up { background-image: /* @embed */ url(images/indicators/up.svg); -} +} \ No newline at end of file diff --git a/resources/src/mediawiki.api/mediawiki.api.js b/resources/src/mediawiki.api/mediawiki.api.js index b37e2a6e8d..9962534a9f 100644 --- a/resources/src/mediawiki.api/mediawiki.api.js +++ b/resources/src/mediawiki.api/mediawiki.api.js @@ -257,7 +257,7 @@ function ( code ) { if ( code === 'badtoken' ) { // Clear from cache - deferreds[ this.defaults.ajax.url ][ tokenType + 'Token' ] = + deferreds[ api.defaults.ajax.url ][ tokenType + 'Token' ] = params.token = undefined; // Try again, once diff --git a/resources/src/mediawiki.less/mediawiki.mixins.less b/resources/src/mediawiki.less/mediawiki.mixins.less index 36f1bd44ff..6556af9991 100644 --- a/resources/src/mediawiki.less/mediawiki.mixins.less +++ b/resources/src/mediawiki.less/mediawiki.mixins.less @@ -64,3 +64,9 @@ -webkit-transition: @string; transition: @string; } + +.box-sizing(@value) { + -moz-box-sizing: @value; + -webkit-box-sizing: @value; + box-sizing: @value; +} diff --git a/resources/src/mediawiki.page/mediawiki.page.startup.js b/resources/src/mediawiki.page/mediawiki.page.startup.js index c75e59fb9c..4aae606977 100644 --- a/resources/src/mediawiki.page/mediawiki.page.startup.js +++ b/resources/src/mediawiki.page/mediawiki.page.startup.js @@ -9,10 +9,6 @@ .removeClass( 'client-nojs' ); $( function () { - // Initialize utilities as soon as the document is ready (mw.util.$content). - // In the domready here instead of in mediawiki.page.ready to ensure that it gets enqueued - // before other modules hook into domready, so that mw.util.$content (defined by - // mw.util.init), is defined for them. mw.util.init(); /** diff --git a/resources/src/mediawiki.ui/components/default/forms.less b/resources/src/mediawiki.ui/components/default/forms.less index 6157fa229a..2b9b3cbe64 100644 --- a/resources/src/mediawiki.ui/components/default/forms.less +++ b/resources/src/mediawiki.ui/components/default/forms.less @@ -1,5 +1,6 @@ // Form elements and layouts +@import "mediawiki.mixins"; @import "../../mixins/utilities"; @import "../../mixins/forms"; diff --git a/resources/src/mediawiki.ui/mixins/utilities.less b/resources/src/mediawiki.ui/mixins/utilities.less index a201a4e7b4..3d7b73245e 100644 --- a/resources/src/mediawiki.ui/mixins/utilities.less +++ b/resources/src/mediawiki.ui/mixins/utilities.less @@ -1,9 +1,3 @@ -.box-sizing(@value) { - -moz-box-sizing: @value; - -webkit-box-sizing: @value; - box-sizing: @value; -} - .agora-flush-left() { float: left; margin-left: 0; diff --git a/resources/src/mediawiki/mediawiki.js b/resources/src/mediawiki/mediawiki.js index 47b00638c3..fc4635acbb 100644 --- a/resources/src/mediawiki/mediawiki.js +++ b/resources/src/mediawiki/mediawiki.js @@ -1043,71 +1043,30 @@ * Ignored (and defaulted to `true`) if the document-ready event has already occurred. */ function addScript( src, callback, async ) { - /*jshint evil:true */ - var script, head, done; - - // Using isReady directly instead of storing it locally from - // a $.fn.ready callback (bug 31895). + // Using isReady directly instead of storing it locally from a $().ready callback (bug 31895) if ( $.isReady || async ) { - // Can't use jQuery.getScript because that only uses