30 private $languageNameUtils;
32 private $userOptionsLookup;
34 private $languageFactory;
36 public const CONSTRUCTOR_OPTIONS = [
37 'TranslateSandboxLimit',
40 public function __construct(
41 LanguageNameUtils $languageNameUtils,
43 UserOptionsLookup $userOptionsLookup,
44 LanguageFactory $languageFactory,
45 ServiceOptions $options
47 parent::__construct(
'TranslationStash' );
48 $this->languageNameUtils = $languageNameUtils;
49 $this->stash = $stash;
50 $this->userOptionsLookup = $userOptionsLookup;
51 $this->languageFactory = $languageFactory;
52 $this->options = $options;
55 public function doesWrites() {
59 protected function getGroupName() {
63 public function execute( $params ) {
64 $limit = $this->options->get(
'TranslateSandboxLimit' );
67 $out = $this->getOutput();
69 if ( !$this->hasPermissionToUse() ) {
70 $out->redirect( Title::newMainPage()->getLocalURL() );
75 $out->addJsConfigVars(
'wgTranslateSandboxLimit', $limit );
76 $out->addModules(
'ext.translate.specialTranslationStash' );
77 $out->addModuleStyles(
'mediawiki.ui.button' );
82 private function hasPermissionToUse():
bool {
87 private function showPage():
void {
88 $out = $this->getOutput();
89 $user = $this->getUser();
91 $count = count( $this->stash->getTranslations( $user ) );
93 $progress = $this->msg(
'translate-translationstash-initialtranslation' )->parse();
95 $progress = $this->msg(
'translate-translationstash-translations' )
103 <div
class=
"row translate-welcome-header">
105 {$this->msg(
'translate-translationstash-welcome', $user->getName() )->parse()}
108 {$this->msg(
'translate-translationstash-welcome-note' )->parse()}
111 <div
class=
"row translate-stash-control">
112 <div
class=
"six columns stash-stats">
115 <div
class=
"six columns ext-translate-language-selector">
116 {$this->tuxLanguageSelector()}
119 {$this->getMessageTable()}
120 <div
class=
"row limit-reached hide"></div>
126 private function getMessageTable():
string {
127 $sourceLang = $this->getSourceLanguage();
128 $targetLang = $this->getTargetLanguage();
130 return Html::element(
133 'class' =>
'row tux-messagelist',
134 'data-sourcelangcode' => $sourceLang->getCode(),
135 'data-sourcelangdir' => $sourceLang->getDir(),
136 'data-targetlangcode' => $targetLang->getCode(),
137 'data-targetlangdir' => $targetLang->getDir(),
142 private function tuxLanguageSelector():
string {
145 $language = $this->getTargetLanguage();
146 $targetLangName = $this->languageNameUtils->getLanguageName( $language->getCode() );
148 $label = Html::element(
'span', [], $this->msg(
'tux-languageselector' )->text() );
150 $languageIcon = Html::element(
152 [
'class' =>
'ext-translate-language-icon' ]
155 $targetLanguageName = Html::element(
158 'class' =>
'ext-translate-target-language',
159 'dir' => $language->getDir(),
160 'lang' => $language->getHtmlCode()
165 $expandIcon = Html::element(
167 [
'class' =>
'ext-translate-language-selector-expand' ]
170 $value = Html::rawElement(
173 'class' =>
'uls mw-ui-button',
175 'title' => $this->msg(
'tux-select-target-language' )->text()
177 $languageIcon . $targetLanguageName . $expandIcon
180 return Html::rawElement(
182 [
'class' =>
'columns ext-translate-language-selector' ],
188 protected function getSourceLanguage(): Language {
190 return $this->languageFactory->getLanguage(
'en' );
194 private function getTargetLanguage(): Language {
195 $ui = $this->getLanguage();
196 $source = $this->getSourceLanguage();
197 if ( !$ui->equals( $source ) ) {
201 $options = FormatJson::decode(
202 $this->userOptionsLookup->getOption( $this->getUser(),
'translate-sandbox' ),
205 $supported = Utilities::getLanguageNames(
'en' );
207 if ( isset( $options[
'languages'] ) ) {
208 foreach ( $options[
'languages'] as $code ) {
209 if ( !isset( $supported[$code] ) ) {
213 if ( $code !== $source->getCode() ) {
214 return $this->languageFactory->getLanguage( $code );
220 return $this->languageFactory->getLanguage( $source->getCode() );