summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/TranslateHooks.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/TranslateHooks.php')
-rw-r--r--www/wiki/extensions/Translate/TranslateHooks.php411
1 files changed, 269 insertions, 142 deletions
diff --git a/www/wiki/extensions/Translate/TranslateHooks.php b/www/wiki/extensions/Translate/TranslateHooks.php
index 3a973c82..dae7fa85 100644
--- a/www/wiki/extensions/Translate/TranslateHooks.php
+++ b/www/wiki/extensions/Translate/TranslateHooks.php
@@ -4,7 +4,7 @@
*
* @file
* @author Niklas Laxström
- * @license GPL-2.0+
+ * @license GPL-2.0-or-later
*/
/**
@@ -12,38 +12,34 @@
*/
class TranslateHooks {
/**
+ * Any user of this list should make sure that the tables
+ * actually exist, since they may be optional
+ *
+ * @var array
+ */
+ private static $userMergeTables = [
+ 'translate_stash' => 'ts_user',
+ 'translate_reviews' => 'trr_user',
+ ];
+
+ /**
* Hook: ResourceLoaderTestModules
+ * @param array &$modules
*/
public static function onResourceLoaderTestModules( array &$modules ) {
- $modules['qunit']['ext.translate.parsers.test'] = array(
- 'scripts' => array( 'tests/qunit/ext.translate.parsers.test.js' ),
- 'dependencies' => array( 'ext.translate.parsers' ),
+ $modules['qunit']['ext.translate.parsers.test'] = [
+ 'scripts' => [ 'tests/qunit/ext.translate.parsers.test.js' ],
+ 'dependencies' => [ 'ext.translate.parsers' ],
'localBasePath' => __DIR__,
'remoteExtPath' => 'Translate',
- );
+ ];
- $modules['qunit']['ext.translate.special.pagemigration.test'] = array(
- 'scripts' => array( 'tests/qunit/ext.translate.special.pagemigration.test.js' ),
- 'dependencies' => array( 'ext.translate.special.pagemigration' ),
+ $modules['qunit']['ext.translate.special.pagemigration.test'] = [
+ 'scripts' => [ 'tests/qunit/ext.translate.special.pagemigration.test.js' ],
+ 'dependencies' => [ 'ext.translate.special.pagemigration' ],
'localBasePath' => __DIR__,
'remoteExtPath' => 'Translate',
- );
- }
-
- /**
- * Hook: CanonicalNamespaces
- *
- * @param array $list
- */
- public static function setupNamespaces( array &$list ) {
- global $wgPageTranslationNamespace, $wgNamespaceRobotPolicies;
- if ( !defined( 'NS_TRANSLATIONS' ) ) {
- define( 'NS_TRANSLATIONS', $wgPageTranslationNamespace );
- define( 'NS_TRANSLATIONS_TALK', $wgPageTranslationNamespace + 1 );
- }
- $list[NS_TRANSLATIONS] = 'Translations';
- $list[NS_TRANSLATIONS_TALK] = 'Translations_talk';
- $wgNamespaceRobotPolicies[NS_TRANSLATIONS] = 'noindex';
+ ];
}
/**
@@ -52,6 +48,16 @@ class TranslateHooks {
* because it depends on user configuration.
*/
public static function setupTranslate() {
+ global $wgPageTranslationNamespace;
+ if ( isset( $wgPageTranslationNamespace ) &&
+ $wgPageTranslationNamespace !== NS_TRANSLATIONS ) {
+ throw new MWException(
+ '$wgPageTranslationNamespace is no longer supported. Instead, define ' .
+ 'NS_TRANSLATIONS and NS_TRANSLATIONS_TALK in LocalSettings.php before loading ' .
+ 'Translate.'
+ );
+ }
+
global $wgTranslatePHPlot, $wgAutoloadClasses, $wgHooks;
if ( $wgTranslatePHPlot ) {
@@ -72,7 +78,7 @@ class TranslateHooks {
$wgSpecialPages['PageMigration'] = 'SpecialPageMigration';
$wgSpecialPages['PagePreparation'] = 'SpecialPagePreparation';
- global $wgLogActionsHandlers, $wgLogTypes;
+ global $wgActionFilteredLogs, $wgLogActionsHandlers, $wgLogTypes;
// log-description-pagetranslation log-name-pagetranslation logentry-pagetranslation-mark
// logentry-pagetranslation-unmark logentry-pagetranslation-moveok
@@ -96,31 +102,36 @@ class TranslateHooks {
'PageTranslationLogFormatter';
$wgLogActionsHandlers['pagetranslation/associate'] = 'PageTranslationLogFormatter';
$wgLogActionsHandlers['pagetranslation/dissociate'] = 'PageTranslationLogFormatter';
+ $wgActionFilteredLogs['pagetranslation'] = [
+ 'mark' => [ 'mark' ],
+ 'unmark' => [ 'unmark' ],
+ 'move' => [ 'moveok', 'movenok' ],
+ 'delete' => [ 'deletefok', 'deletefnok', 'deletelok', 'deletelnok' ],
+ 'encourage' => [ 'encourage' ],
+ 'discourage' => [ 'discourage' ],
+ 'prioritylanguages' => [ 'prioritylanguages' ],
+ 'aggregategroups' => [ 'associate', 'dissociate' ],
+ ];
global $wgJobClasses;
$wgJobClasses['TranslateRenderJob'] = 'TranslateRenderJob';
$wgJobClasses['RenderJob'] = 'TranslateRenderJob';
+ $wgJobClasses['TranslatablePageMoveJob'] = 'TranslatablePageMoveJob';
$wgJobClasses['TranslateMoveJob'] = 'TranslateMoveJob';
$wgJobClasses['MoveJob'] = 'TranslateMoveJob';
$wgJobClasses['TranslateDeleteJob'] = 'TranslateDeleteJob';
$wgJobClasses['DeleteJob'] = 'TranslateDeleteJob';
+ $wgJobClasses['TranslationsUpdateJob'] = 'TranslationsUpdateJob';
// Namespaces
- global $wgPageTranslationNamespace;
global $wgNamespacesWithSubpages, $wgNamespaceProtection;
global $wgTranslateMessageNamespaces;
- // Define constants for more readable core
- if ( !defined( 'NS_TRANSLATIONS' ) ) {
- define( 'NS_TRANSLATIONS', $wgPageTranslationNamespace );
- define( 'NS_TRANSLATIONS_TALK', $wgPageTranslationNamespace + 1 );
- }
-
$wgNamespacesWithSubpages[NS_TRANSLATIONS] = true;
$wgNamespacesWithSubpages[NS_TRANSLATIONS_TALK] = true;
// Standard protection and register it for filtering
- $wgNamespaceProtection[NS_TRANSLATIONS] = array( 'translate' );
+ $wgNamespaceProtection[NS_TRANSLATIONS] = [ 'translate' ];
$wgTranslateMessageNamespaces[] = NS_TRANSLATIONS;
/// Page translation hooks
@@ -138,21 +149,22 @@ class TranslateHooks {
$wgHooks['RevisionInsertComplete'][] =
'PageTranslationHooks::updateTranstagOnNullRevisions';
- // Register \<languages/>
+ // Register different ways to show language links
$wgHooks['ParserFirstCallInit'][] = 'TranslateHooks::setupParserHooks';
+ $wgHooks['LanguageLinks'][] = 'PageTranslationHooks::addLanguageLinks';
+ $wgHooks['SkinTemplateGetLanguageLink'][] = 'PageTranslationHooks::formatLanguageLink';
// Strip \<translate> tags etc. from source pages when rendering
$wgHooks['ParserBeforeStrip'][] = 'PageTranslationHooks::renderTagPage';
+ $wgHooks['ParserOutputPostCacheTransform'][] =
+ 'PageTranslationHooks::onParserOutputPostCacheTransform';
// Set the page content language
$wgHooks['PageContentLanguage'][] = 'PageTranslationHooks::onPageContentLanguage';
- // Prevent editing of unknown pages in Translations namespace
- $wgHooks['getUserPermissionsErrorsExpensive'][] =
- 'PageTranslationHooks::preventUnknownTranslations';
- // Prevent editing of translation in restricted languages
+ // Prevent editing of certain pages in translations namespace
$wgHooks['getUserPermissionsErrorsExpensive'][] =
- 'PageTranslationHooks::preventRestrictedTranslations';
+ 'PageTranslationHooks::onGetUserPermissionsErrorsExpensive';
// Prevent editing of translation pages directly
$wgHooks['getUserPermissionsErrorsExpensive'][] =
'PageTranslationHooks::preventDirectEditing';
@@ -163,6 +175,9 @@ class TranslateHooks {
// Our custom header for translation pages
$wgHooks['ArticleViewHeader'][] = 'PageTranslationHooks::translatablePageHeader';
+ // Edit notice shown on translatable pages
+ $wgHooks['TitleGetEditNotices'][] = 'PageTranslationHooks::onTitleGetEditNotices';
+
// Custom move page that can move all the associated pages too
$wgHooks['SpecialPage_initList'][] = 'PageTranslationHooks::replaceMovePage';
// Locking during page moves
@@ -174,14 +189,14 @@ class TranslateHooks {
// Replace subpage logic behavior
$wgHooks['SkinSubPageSubtitle'][] = 'PageTranslationHooks::replaceSubtitle';
- // Show page source code when export tab is opened
- $wgHooks['SpecialTranslate::executeTask'][] = 'PageTranslationHooks::sourceExport';
-
// Replaced edit tab with translation tab for translation pages
$wgHooks['SkinTemplateNavigation'][] = 'PageTranslationHooks::translateTab';
// Update translated page when translation unit is moved
$wgHooks['TitleMoveComplete'][] = 'PageTranslationHooks::onMoveTranslationUnits';
+
+ // Update translated page when translation unit is deleted
+ $wgHooks['ArticleDeleteComplete'][] = 'PageTranslationHooks::onDeleteTranslationUnit';
}
global $wgTranslateUseSandbox;
@@ -197,6 +212,7 @@ class TranslateHooks {
$wgHooks['GetPreferences'][] = 'TranslateSandbox::onGetPreferences';
$wgHooks['UserGetRights'][] = 'TranslateSandbox::enforcePermissions';
$wgHooks['ApiCheckCanExecute'][] = 'TranslateSandbox::onApiCheckCanExecute';
+ $wgHooks['UserGetRights'][] = 'TranslateSandbox::allowAccountCreation';
global $wgLogTypes, $wgLogActionsHandlers;
// log-name-translatorsandbox log-description-translatorsandbox
@@ -204,19 +220,35 @@ class TranslateHooks {
// logentry-translatorsandbox-promoted logentry-translatorsandbox-rejected
$wgLogActionsHandlers['translatorsandbox/promoted'] = 'TranslateLogFormatter';
$wgLogActionsHandlers['translatorsandbox/rejected'] = 'TranslateLogFormatter';
+
+ // This is no longer used for new entries since 2016.07.
// logentry-newusers-tsbpromoted
$wgLogActionsHandlers['newusers/tsbpromoted'] = 'LogFormatter';
global $wgJobClasses;
$wgJobClasses['TranslateSandboxEmailJob'] = 'TranslateSandboxEmailJob';
+
+ global $wgAPIModules;
+ $wgAPIModules['translationstash'] = 'ApiTranslationStash';
+ $wgAPIModules['translatesandbox'] = 'ApiTranslateSandbox';
+ }
+
+ // Back compatibility for MediaWiki <= 1.31
+ global $wgVersion, $wgResourceModules;
+ if ( version_compare( $wgVersion, '1.32', '<' ) ) {
+ $wgResourceModules['ext.translate.editor']['dependencies'][] = 'mediawiki.api.parse';
+ $wgResourceModules['ext.translate.special.translate']['dependencies'][] = 'mediawiki.api.parse';
}
+
+ global $wgNamespaceRobotPolicies;
+ $wgNamespaceRobotPolicies[NS_TRANSLATIONS] = 'noindex';
}
/**
* Hook: UserGetReservedNames
* Prevents anyone from registering or logging in as FuzzyBot
*
- * @param array $names
+ * @param array &$names
*/
public static function onUserGetReservedNames( array &$names ) {
global $wgTranslateFuzzyBotName;
@@ -224,6 +256,65 @@ class TranslateHooks {
}
/**
+ * Used for setting an AbuseFilter variable.
+ *
+ * @param AbuseFilterVariableHolder &$vars
+ * @param Title|null $title
+ */
+ public static function onAbuseFilterFilterAction( &$vars, $title ) {
+ if ( !$title instanceof Title ) {
+ wfDebugLog( 'T143073', 'Got non-Title in ' . wfGetAllCallers( 5 ) );
+ return;
+ }
+
+ $handle = new MessageHandle( $title );
+
+ // Only set this variable if we are in a proper namespace to avoid
+ // unnecessary overhead in non-translation pages
+ if ( $handle->isMessageNamespace() ) {
+ $vars->setLazyLoadVar(
+ 'translate_source_text',
+ 'translate-get-source',
+ [ 'handle' => $handle ]
+ );
+ }
+ }
+
+ /**
+ * Computes the translate_source_text AbuseFilter variable
+ * @param string $method
+ * @param AbuseFilterVariableHolder $vars
+ * @param array $parameters
+ * @param null &$result
+ * @return bool
+ */
+ public static function onAbuseFilterComputeVariable( $method, $vars, $parameters, &$result ) {
+ if ( $method !== 'translate-get-source' ) {
+ return true;
+ }
+
+ $handle = $parameters['handle'];
+ $source = '';
+ if ( $handle->isValid() ) {
+ $group = $handle->getGroup();
+ $source = $group->getMessage( $handle->getKey(), $group->getSourceLanguage() );
+ }
+
+ $result = $source;
+
+ return false;
+ }
+
+ /**
+ * Register AbuseFilter variables provided by Translate.
+ * @param array &$builderValues
+ */
+ public static function onAbuseFilterBuilder( array &$builderValues ) {
+ // Uses: 'abusefilter-edit-builder-vars-translate-source-text'
+ $builderValues['vars']['translate_source_text'] = 'translate-source-text';
+ }
+
+ /**
* Hook: ParserFirstCallInit
* Registers \<languages> tag with the parser.
*
@@ -231,13 +322,13 @@ class TranslateHooks {
*/
public static function setupParserHooks( Parser $parser ) {
// For nice language list in-page
- $parser->setHook( 'languages', array( 'PageTranslationHooks', 'languages' ) );
+ $parser->setHook( 'languages', [ 'PageTranslationHooks', 'languages' ] );
}
/**
* Hook: UnitTestsList
*
- * @param array $files
+ * @param array &$files
*/
public static function setupUnitTests( array &$files ) {
$dir = __DIR__ . '/tests/phpunit';
@@ -260,97 +351,109 @@ class TranslateHooks {
public static function schemaUpdates( DatabaseUpdater $updater ) {
$dir = __DIR__ . '/sql';
- $updater->addExtensionUpdate( array(
+ $updater->addExtensionUpdate( [
'addTable',
'translate_sections',
"$dir/translate_sections.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addField',
'translate_sections',
'trs_order',
"$dir/translate_sections-trs_order.patch.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addTable',
'revtag', "$dir/revtag.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addTable',
'translate_groupstats',
"$dir/translate_groupstats.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addIndex',
'translate_sections',
'trs_page_order',
"$dir/translate_sections-indexchange.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'dropIndex',
'translate_sections',
'trs_page',
"$dir/translate_sections-indexchange2.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addTable',
'translate_reviews',
"$dir/translate_reviews.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addTable',
'translate_groupreviews',
"$dir/translate_groupreviews.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addTable',
'translate_tms',
"$dir/translate_tm.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addTable',
'translate_metadata',
"$dir/translate_metadata.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addTable', 'translate_messageindex',
"$dir/translate_messageindex.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addIndex',
'translate_groupstats',
'tgs_lang',
"$dir/translate_groupstats-indexchange.sql",
true
- ) );
- $updater->addExtensionUpdate( array(
+ ] );
+ $updater->addExtensionUpdate( [
'addField', 'translate_groupstats',
'tgs_proofread',
"$dir/translate_groupstats-proofread.sql",
true
- ) );
+ ] );
- $updater->addExtensionUpdate( array(
+ $updater->addExtensionUpdate( [
'addTable',
'translate_stash',
"$dir/translate_stash.sql",
true
- ) );
+ ] );
+
+ // This also adds a PRIMARY KEY
+ $updater->addExtensionUpdate( [
+ 'renameIndex',
+ 'translate_reviews',
+ 'trr_user_page_revision',
+ 'PRIMARY',
+ false,
+ "$dir/translate_reviews-patch-01-primary-key.sql",
+ true
+ ] );
}
/**
* Hook: ParserTestTables
+ * @param array &$tables
*/
public static function parserTestTables( array &$tables ) {
$tables[] = 'revtag';
@@ -364,7 +467,7 @@ class TranslateHooks {
* Set the correct page content language for translation units.
*
* @param Title $title
- * @param string $pageLang
+ * @param Language|StubUserLang|string &$pageLang
*/
public static function onPageContentLanguage( Title $title, &$pageLang ) {
$handle = new MessageHandle( $title );
@@ -376,6 +479,8 @@ class TranslateHooks {
/**
* Hook: LanguageGetTranslatedLanguageNames
* Hook: TranslateSupportedLanguages
+ * @param array &$names
+ * @param string $code
*/
public static function translateMessageDocumentationLanguage( array &$names, $code ) {
global $wgTranslateDocumentationLanguageCode;
@@ -395,15 +500,16 @@ class TranslateHooks {
/**
* Hook: SpecialSearchProfiles
+ * @param array &$profiles
*/
public static function searchProfile( array &$profiles ) {
global $wgTranslateMessageNamespaces;
- $insert = array();
- $insert['translation'] = array(
+ $insert = [];
+ $insert['translation'] = [
'message' => 'translate-searchprofile',
'tooltip' => 'translate-searchprofile-tooltip',
'namespaces' => $wgTranslateMessageNamespaces,
- );
+ ];
// Insert translations before 'all'
$index = array_search( 'all', array_keys( $profiles ) );
@@ -423,18 +529,36 @@ class TranslateHooks {
/**
* Hook: SpecialSearchProfileForm
+ * @param SpecialSearch $search
+ * @param string &$form
+ * @param string $profile
+ * @param string $term
+ * @param array $opts
+ * @return bool
*/
public static function searchProfileForm(
SpecialSearch $search,
- /*string*/&$form,
- /*string*/$profile,
- /*string*/$term,
+ &$form,
+ $profile,
+ $term,
array $opts
) {
if ( $profile !== 'translation' ) {
return true;
}
+ $server = TTMServer::primary();
+ if ( TTMServer::primary() instanceof SearchableTTMServer ) {
+ $href = SpecialPage::getTitleFor( 'SearchTranslations' )
+ ->getFullUrl( [ 'query' => $term ] );
+ $wrapper = new RawMessage( '<div class="successbox plainlinks">$1</div>' );
+ $form = $wrapper
+ ->params( $search->msg( 'translate-searchprofile-note', $href )->plain() )
+ ->parse();
+
+ return false;
+ }
+
if ( !$search->getSearchEngine()->supports( 'title-suffix-filter' ) ) {
return false;
}
@@ -448,15 +572,7 @@ class TranslateHooks {
$code = $context->getLanguage()->getCode();
$selected = $context->getRequest()->getVal( 'languagefilter' );
- if ( is_callable( array( 'LanguageNames', 'getNames' ) ) ) {
- $languages = LanguageNames::getNames( $code,
- LanguageNames::FALLBACK_NORMAL,
- LanguageNames::LIST_MW
- );
- } else {
- $languages = Language::fetchLanguageNames();
- }
-
+ $languages = TranslateUtils::getLanguageNames( $code );
ksort( $languages );
$selector = new XmlSelect( 'languagefilter', 'languagefilter' );
@@ -472,7 +588,7 @@ class TranslateHooks {
wfMessage( 'translate-search-languagefilter' )->text(),
'languagefilter'
) . '&#160;';
- $params = array( 'id' => 'mw-searchoptions' );
+ $params = [ 'id' => 'mw-searchoptions' ];
$form = Xml::fieldset( false, false, $params ) .
$hidden . $label . $selector .
@@ -483,10 +599,13 @@ class TranslateHooks {
/**
* Hook: SpecialSearchSetupEngine
+ * @param SpecialSearch $search
+ * @param string $profile
+ * @param SearchEngine $engine
*/
public static function searchProfileSetupEngine(
SpecialSearch $search,
- /*string*/$profile,
+ $profile,
SearchEngine $engine
) {
if ( $profile !== 'translation' ) {
@@ -503,6 +622,9 @@ class TranslateHooks {
/**
* Hook: Translate:MessageGroupStats:isIncluded
+ * @param int $id
+ * @param string $code
+ * @return bool
*/
public static function hideDiscouragedFromStats( $id, $code ) {
// Return true to keep, false to exclude
@@ -511,6 +633,9 @@ class TranslateHooks {
/**
* Hook: Translate:MessageGroupStats:isIncluded
+ * @param int $id
+ * @param string $code
+ * @return false
*/
public static function hideRestrictedFromStats( $id, $code ) {
$filterLangs = TranslateMetadata::get( $id, 'prioritylangs' );
@@ -527,11 +652,12 @@ class TranslateHooks {
/**
* Hook: LinksUpdate
+ * @param LinksUpdate $updater
*/
public static function preventCategorization( LinksUpdate $updater ) {
$handle = new MessageHandle( $updater->getTitle() );
if ( $handle->isMessageNamespace() && !$handle->isDoc() ) {
- $updater->mCategories = array();
+ $updater->mCategories = [];
}
}
@@ -540,14 +666,15 @@ class TranslateHooks {
*
* Adds $wgTranslateDocumentationLanguageCode to ResourceLoader configuration
* when Special:Translate is shown.
+ * @param array &$vars
+ * @param OutputPage $out
*/
public static function addConfig( array &$vars, OutputPage $out ) {
$request = $out->getRequest();
$title = $out->getTitle();
- list( $alias, ) = SpecialPageFactory::resolveAlias( $title->getText() );
+ list( $alias, ) = TranslateUtils::resolveSpecialPageAlias( $title->getText() );
- if ( SpecialTranslate::isBeta( $request )
- && $title->isSpecialPage()
+ if ( $title->isSpecialPage()
&& ( $alias === 'Translate'
|| $alias === 'TranslationStash'
|| $alias === 'SearchTranslations' )
@@ -566,6 +693,7 @@ class TranslateHooks {
/**
* Hook: AdminLinks
+ * @param ALTree $tree
*/
public static function onAdminLinks( ALTree $tree ) {
global $wgTranslateUseSandbox;
@@ -578,17 +706,6 @@ class TranslateHooks {
}
/**
- * Any user of this list should make sure that the tables
- * actually exist, since they may be optional
- *
- * @var array
- */
- private static $userMergeTables = array(
- 'translate_stash' => 'ts_user',
- 'translate_reviews' => 'trr_user',
- );
-
- /**
* Hook: MergeAccountFromTo
* For UserMerge extension.
*
@@ -604,10 +721,10 @@ class TranslateHooks {
if ( $dbw->tableExists( $table ) ) {
$dbw->update(
$table,
- array( $field => $newUser->getId() ),
- array( $field => $oldUser->getId() ),
+ [ $field => $newUser->getId() ],
+ [ $field => $oldUser->getId() ],
__METHOD__,
- array( 'IGNORE' )
+ [ 'IGNORE' ]
);
}
}
@@ -627,7 +744,7 @@ class TranslateHooks {
if ( $dbw->tableExists( $table ) ) {
$dbw->delete(
$table,
- array( $field => $oldUser->getId() ),
+ [ $field => $oldUser->getId() ],
__METHOD__
);
}
@@ -638,74 +755,66 @@ class TranslateHooks {
* Hook: AbortEmailNotification
*
* False aborts the email.
+ * @param User $editor
+ * @param Title $title
+ * @param RecentChange $rc
+ * @return bool
*/
public static function onAbortEmailNotificationReview(
User $editor,
Title $title,
RecentChange $rc
) {
- if ( $rc->mAttribs['rc_log_type'] === 'translationreview' ) {
+ if ( $rc->getAttribute( 'rc_log_type' ) === 'translationreview' ) {
return false;
}
}
/**
- * Hook: LinkBegin
- * Make Special:MyLanguage links red if the target page doesn't exists.
+ * Hook: TitleIsAlwaysKnown
+ * Make Special:MyLanguage links red if the target page doesn't exist.
* A bit hacky because the core code is not so flexible.
*
- * @param $dummy
* @param Title $target
- * @param string $html
- * @param array $customAttribs
- * @param array $query
- * @param array $options
- * @param string|null $ret
+ * @param bool &$isKnown
+ * @return bool
*/
- public static function linkfix(
- /*unused*/$dummy,
- Title $target,
- /*string*/$html,
- /*array*/$customAttribs,
- array $query,
- array &$options,
- $ret
- ) {
+ public static function onTitleIsAlwaysKnown( Title $target, &$isKnown ) {
if ( !$target->inNamespace( NS_SPECIAL ) ) {
- return;
+ return true;
}
- list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $target->getDBkey() );
+ list( $name, $subpage ) = TranslateUtils::resolveSpecialPageAlias( $target->getDBkey() );
if ( $name !== 'MyLanguage' ) {
- return;
+ return true;
}
if ( (string)$subpage === '' ) {
- return;
+ return true;
}
$realTarget = Title::newFromText( $subpage );
if ( !$realTarget || !$realTarget->exists() ) {
- $options[] = 'broken';
- $index = array_search( 'known', $options, true );
- if ( $index !== false ) {
- unset( $options[$index] );
- }
+ $isKnown = false;
- $index = array_search( 'noclasses', $options, true );
- if ( $index !== false ) {
- unset( $options[$index] );
- }
+ return false;
}
+
+ return true;
}
/**
* Hook: ParserFirstCallInit
+ * @param Parser $parser
*/
public static function setupTranslateParserFunction( Parser $parser ) {
$parser->setFunctionHook( 'translation', 'TranslateHooks::translateRenderParserFunction' );
}
+ /**
+ * @param Parser $parser
+ * @return string
+ */
public static function translateRenderParserFunction( Parser $parser ) {
$pageTitle = $parser->getTitle();
@@ -716,4 +825,22 @@ class TranslateHooks {
}
return '';
}
+
+ /**
+ * @param ResourceLoader $resourceLoader
+ */
+ public static function onResourceLoaderRegisterModules( ResourceLoader $resourceLoader ) {
+ $modules = [];
+ $modules['ext.translate.recentgroups'] = [
+ 'scripts' => 'resources/js/ext.translate.recentgroups.js',
+ 'dependencies' => [
+ 'mediawiki.storage'
+ ],
+ 'localBasePath' => __DIR__,
+ 'remoteExtPath' => 'Translate',
+ 'targets' => [ 'desktop', 'mobile' ],
+ ];
+
+ $resourceLoader->register( $modules );
+ }
}