summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/specials/SpecialMagic.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/specials/SpecialMagic.php')
-rw-r--r--www/wiki/extensions/Translate/specials/SpecialMagic.php243
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>' );
+ }
+}