diff options
Diffstat (limited to 'www/wiki/extensions/Translate/TranslateHooks.php')
-rw-r--r-- | www/wiki/extensions/Translate/TranslateHooks.php | 411 |
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' ) . ' '; - $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 ); + } } |