diff options
Diffstat (limited to 'www/wiki/extensions/Translate/specials/SpecialMagic.php')
-rw-r--r-- | www/wiki/extensions/Translate/specials/SpecialMagic.php | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/specials/SpecialMagic.php b/www/wiki/extensions/Translate/specials/SpecialMagic.php new file mode 100644 index 00000000..f8200a7e --- /dev/null +++ b/www/wiki/extensions/Translate/specials/SpecialMagic.php @@ -0,0 +1,243 @@ +<?php +/** + * Contains logic for special page Special:AdvancedTranslate + * + * @file + * @author Niklas Laxström + * @author Siebrand Mazeland + * @license GPL-2.0-or-later + */ + +/** + * This special page helps with the translations of %MediaWiki features that are + * not in the main messages array (special page aliases, magic words, namespace names). + * + * @ingroup SpecialPage TranslateSpecialPage + */ +class SpecialMagic extends SpecialPage { + const MODULE_MAGIC = 'words'; + const MODULE_SPECIAL = 'special'; + const MODULE_NAMESPACE = 'namespace'; + + /** + * List of supported modules + */ + private $aModules = [ + self::MODULE_SPECIAL, + self::MODULE_NAMESPACE, + self::MODULE_MAGIC + ]; + + /** + * Page options + */ + private $options = []; + private $defaults = []; + private $nondefaults = []; + + public function __construct() { + parent::__construct( 'Magic' ); + } + + public function doesWrites() { + return true; + } + + protected function getGroupName() { + return 'wiki'; + } + + /** + * @see SpecialPage::getDescription + * + * @return string + */ + public function getDescription() { + return $this->msg( 'translate-magic-pagename' )->text(); + } + + /** + * Returns HTML5 output of the form + * GLOBALS: $wgScript + * @return string + */ + protected function getForm() { + global $wgScript; + + $form = Xml::tags( 'form', + [ + 'action' => $wgScript, + 'method' => 'get' + ], + + '<table><tr><td>' . + $this->msg( 'translate-page-language' )->escaped() . + '</td><td>' . + TranslateUtils::languageSelector( + $this->getLanguage()->getCode(), + $this->options['language'] + ) . + '</td></tr><tr><td>' . + $this->msg( 'translate-magic-module' )->escaped() . + '</td><td>' . + $this->moduleSelector( $this->options['module'] ) . + '</td></tr><tr><td colspan="2">' . + Xml::submitButton( $this->msg( 'translate-magic-submit' )->text() ) . ' ' . + Xml::submitButton( + $this->msg( 'translate-magic-cm-export' )->text(), + [ 'name' => 'export' ] + ) . + '</td></tr></table>' . + Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) + ); + + return $form; + } + + /** + * Helper function get module selector. + * + * @param string $selectedId Which value should be selected by default + * @return string HTML5-compatible select-element. + */ + protected function moduleSelector( $selectedId ) { + // Give grep a chance to find the usages: + // translate-magic-words, translate-magic-special, translate-magic-namespace + $selector = new XmlSelect( 'module', 'module', $selectedId ); + foreach ( $this->aModules as $code ) { + $selector->addOption( $this->msg( 'translate-magic-' . $code )->text(), $code ); + } + + return $selector->getHTML(); + } + + protected function setup( $parameters ) { + $defaults = [ + /* str */'module' => '', + /* str */'language' => $this->getUser()->getOption( 'language' ), + /* bool */'export' => false, + /* bool */'savetodb' => false + ]; + + /** + * Place where all non default variables will end. + */ + $nondefaults = []; + + /** + * Temporary store possible values parsed from parameters. + */ + $options = $defaults; + $request = $this->getRequest(); + foreach ( $options as $v => $t ) { + if ( is_bool( $t ) ) { + $r = $request->getBool( $v, $options[$v] ); + } elseif ( is_int( $t ) ) { + $r = $request->getInt( $v, $options[$v] ); + } elseif ( is_string( $t ) ) { + $r = $request->getText( $v, $options[$v] ); + } + + if ( !isset( $r ) ) { + throw new MWException( '$r was not set' ); + } + + wfAppendToArrayIfNotDefault( $v, $r, $defaults, $nondefaults ); + } + + $this->defaults = $defaults; + $this->nondefaults = $nondefaults; + $this->options = $nondefaults + $defaults; + } + + /** + * The special page running code + * + * @param null|string $parameters + * @throws MWException|PermissionsError + */ + public function execute( $parameters ) { + $this->setup( $parameters ); + $this->setHeaders(); + + $out = $this->getOutput(); + $out->addHelpLink( '//translatewiki.net/wiki/FAQ#Special:AdvancedTranslate', true ); + + $out->addHTML( $this->getForm() ); + + if ( !$this->options['module'] ) { + return; + } + switch ( $this->options['module'] ) { + case 'alias': + case self::MODULE_SPECIAL: + $o = new SpecialPageAliasesCM( $this->options['language'] ); + break; + case self::MODULE_MAGIC: + $o = new MagicWordsCM( $this->options['language'] ); + break; + case self::MODULE_NAMESPACE: + $o = new NamespaceCM( $this->options['language'] ); + break; + default: + throw new MWException( "Unknown module {$this->options['module']}" ); + } + + $request = $this->getRequest(); + if ( $this->options['savetodb'] && $request->wasPosted() ) { + if ( !$this->getUser()->isAllowed( 'translate' ) ) { + throw new PermissionsError( 'translate' ); + } + + $errors = []; + $o->loadFromRequest( $request ); + $o->validate( $errors ); + if ( $errors ) { + $out->wrapWikiMsg( '<div class="error">$1</div>', + 'translate-magic-notsaved' ); + $this->outputErrors( $errors ); + $out->addHTML( $o->output() ); + + return; + } else { + $o->save( $request ); + $out->wrapWikiMsg( '<strong>$1</strong>', 'translate-magic-saved' ); + $out->addHTML( $o->output() ); + + return; + } + } + + if ( $this->options['export'] ) { + $output = $o->export(); + if ( $output === '' ) { + $out->addWikiMsg( 'translate-magic-nothing-to-export' ); + + return; + } + $result = Xml::element( 'textarea', [ 'rows' => '30' ], $output ); + $out->addHTML( $result ); + + return; + } + + $out->addWikiMsg( 'translate-magic-help' ); + $errors = []; + $o->validate( $errors ); + if ( $errors ) { + $this->outputErrors( $errors ); + } + $out->addHTML( $o->output() ); + } + + protected function outputErrors( $errors ) { + $count = $this->getLanguage()->formatNum( count( $errors ) ); + $out = $this->getOutput(); + $out->addWikiMsg( 'translate-magic-errors', $count ); + $out->addHTML( '<ol>' ); + foreach ( $errors as $error ) { + $out->addHTML( "<li>$error</li>" ); + } + $out->addHTML( '</ol>' ); + } +} |