Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
TranslationStashSpecialPage.php
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\TranslatorSandbox;
5
6use FormatJson;
7use Html;
8use Language;
9use MediaWiki\Config\ServiceOptions;
11use MediaWiki\Languages\LanguageFactory;
12use MediaWiki\Languages\LanguageNameUtils;
13use MediaWiki\User\UserOptionsLookup;
14use SpecialPage;
15use Title;
17
25class TranslationStashSpecialPage extends SpecialPage {
27 private $stash;
29 private $options;
31 private $languageNameUtils;
33 private $userOptionsLookup;
35 private $languageFactory;
36
37 public const CONSTRUCTOR_OPTIONS = [
38 'TranslateSandboxLimit',
39 ];
40
41 public function __construct(
42 LanguageNameUtils $languageNameUtils,
44 UserOptionsLookup $userOptionsLookup,
45 LanguageFactory $languageFactory,
46 ServiceOptions $options
47 ) {
48 parent::__construct( 'TranslationStash' );
49 $this->languageNameUtils = $languageNameUtils;
50 $this->stash = $stash;
51 $this->userOptionsLookup = $userOptionsLookup;
52 $this->languageFactory = $languageFactory;
53 $this->options = $options;
54 }
55
56 public function doesWrites() {
57 return true;
58 }
59
60 protected function getGroupName() {
61 return 'translation';
62 }
63
64 public function execute( $params ) {
65 $limit = $this->options->get( 'TranslateSandboxLimit' );
66
67 $this->setHeaders();
68 $out = $this->getOutput();
69
70 if ( !$this->hasPermissionToUse() ) {
71 $out->redirect( Title::newMainPage()->getLocalURL() );
72
73 return;
74 }
75
76 $out->addJsConfigVars( 'wgTranslateSandboxLimit', $limit );
77 $out->addModules( 'ext.translate.specialTranslationStash' );
78 $out->addModuleStyles( 'mediawiki.ui.button' );
79 $this->showPage();
80 }
81
83 private function hasPermissionToUse(): bool {
84 return TranslateSandbox::isSandboxed( $this->getUser() );
85 }
86
88 private function showPage(): void {
89 $out = $this->getOutput();
90 $user = $this->getUser();
91
92 $count = count( $this->stash->getTranslations( $user ) );
93 if ( $count === 0 ) {
94 $progress = $this->msg( 'translate-translationstash-initialtranslation' )->parse();
95 } else {
96 $progress = $this->msg( 'translate-translationstash-translations' )
97 ->numParams( $count )
98 ->parse();
99 }
100
101 $out->addHTML(
102 <<<HTML
103 <div class="grid">
104 <div class="row translate-welcome-header">
105 <h1>
106 {$this->msg( 'translate-translationstash-welcome', $user->getName() )->parse()}
107 </h1>
108 <p>
109 {$this->msg( 'translate-translationstash-welcome-note' )->parse()}
110 </p>
111 </div>
112 <div class="row translate-stash-control">
113 <div class="six columns stash-stats">
114 {$progress}
115 </div>
116 <div class="six columns ext-translate-language-selector">
117 {$this->tuxLanguageSelector()}
118 </div>
119 </div>
120 {$this->getMessageTable()}
121 <div class="row limit-reached hide"></div>
122 </div>
123 HTML
124 );
125 }
126
127 private function getMessageTable(): string {
128 $sourceLang = $this->getSourceLanguage();
129 $targetLang = $this->getTargetLanguage();
130
131 return Html::element(
132 'div',
133 [
134 'class' => 'row tux-messagelist',
135 'data-sourcelangcode' => $sourceLang->getCode(),
136 'data-sourcelangdir' => $sourceLang->getDir(),
137 'data-targetlangcode' => $targetLang->getCode(),
138 'data-targetlangdir' => $targetLang->getDir(),
139 ]
140 );
141 }
142
143 private function tuxLanguageSelector(): string {
144 // The name will be displayed in the UI language,
145 // so use for lang and dir
146 $language = $this->getTargetLanguage();
147 $targetLangName = $this->languageNameUtils->getLanguageName( $language->getCode() );
148
149 $label = Html::element( 'span', [], $this->msg( 'tux-languageselector' )->text() );
150
151 $languageIcon = Html::element(
152 'span',
153 [ 'class' => 'ext-translate-language-icon' ]
154 );
155
156 $targetLanguageName = Html::element(
157 'span',
158 [
159 'class' => 'ext-translate-target-language',
160 'dir' => $language->getDir(),
161 'lang' => $language->getHtmlCode()
162 ],
163 $targetLangName
164 );
165
166 $expandIcon = Html::element(
167 'span',
168 [ 'class' => 'ext-translate-language-selector-expand' ]
169 );
170
171 $value = Html::rawElement(
172 'span',
173 [
174 'class' => 'uls mw-ui-button',
175 'tabindex' => 0,
176 'title' => $this->msg( 'tux-select-target-language' )->text()
177 ],
178 $languageIcon . $targetLanguageName . $expandIcon
179 );
180
181 return Html::rawElement(
182 'div',
183 [ 'class' => 'columns ext-translate-language-selector' ],
184 "$label $value"
185 );
186 }
187
189 protected function getSourceLanguage(): Language {
190 // Bad
191 return $this->languageFactory->getLanguage( 'en' );
192 }
193
195 private function getTargetLanguage(): Language {
196 $ui = $this->getLanguage();
197 $source = $this->getSourceLanguage();
198 if ( !$ui->equals( $source ) ) {
199 return $ui;
200 }
201
202 $options = FormatJson::decode(
203 $this->userOptionsLookup->getOption( $this->getUser(), 'translate-sandbox' ),
204 true
205 );
206 $supported = Utilities::getLanguageNames( 'en' );
207
208 if ( isset( $options['languages'] ) ) {
209 foreach ( $options['languages'] as $code ) {
210 if ( !isset( $supported[$code] ) ) {
211 continue;
212 }
213
214 if ( $code !== $source->getCode() ) {
215 return $this->languageFactory->getLanguage( $code );
216 }
217 }
218 }
219
220 // User has not chosen any valid language. Pick the source.
221 return $this->languageFactory->getLanguage( $source->getCode() );
222 }
223}
Essentially random collection of helper functions, similar to GlobalFunctions.php.
Definition Utilities.php:31
Utility class for the sandbox feature of Translate.
static isSandboxed(User $user)
Shortcut for checking if given user is in the sandbox.