ILIAS  release_8 Revision v8.24
class.ilObjectTranslationGUI.php
Go to the documentation of this file.
1<?php
2
3declare(strict_types=1);
4
27{
28 public const CMD_LIST_TRANSLATIONS = "listTranslations";
29 public const CMD_SAVE_TRANSLATIONS = "saveTranslations";
30 public const CMD_ADD_TRANSLATION = "addTranslation";
31 public const CMD_DELETE_TRANSLATIONS = "deleteTranslations";
32 public const CMD_ADD_LANGUAGES = "addLanguages";
33 public const CMD_SAVE_LANGUAGES = "saveLanguages";
34 public const CMD_CONFIRM_REMOVE_LANGUAGES = "confirmRemoveLanguages";
35 public const CMD_REMOVE_LANGUAGES = "removeLanguages";
36 public const CMD_SET_FALLBACK = "setFallback";
38 protected ilObjUser $user;
39 protected ilAccess $access;
40 protected ilLanguage $lng;
41 protected ilCtrl $ctrl;
45
47 protected ilObject $obj;
49
50 protected bool $title_descr_only = true;
51 protected bool $hide_description = false;
52 protected bool $fallback_lang_mode = true;
53 protected bool $support_content_translation = true;
54
55 public function __construct($obj_gui)
56 {
57 global $DIC;
58
59 $this->toolbar = $DIC->toolbar();
60 $this->user = $DIC->user();
61 $this->access = $DIC['ilAccess'];
62 $this->lng = $DIC->language();
63 $this->ctrl = $DIC->ctrl();
64 $this->tpl = $DIC["tpl"];
65 $this->post_wrapper = $DIC->http()->wrapper()->post();
66 $this->refinery = $DIC->refinery();
67
68
69 $this->obj_gui = $obj_gui;
70 $this->obj = $obj_gui->getObject();
71
72 $this->obj_trans = ilObjectTranslation::getInstance($this->obj->getId());
73 }
74
75 public function hideDescription(bool $hide): void
76 {
77 $this->hide_description = $hide;
78 }
79
80 public function supportContentTranslation(bool $content_translation): void
81 {
82 $this->support_content_translation = $content_translation;
83 }
84
85 private function getTableValuesByObjects(): array
86 {
87 $data = [];
88 foreach ($this->obj_trans->getLanguages() as $k => $v) {
89 $data[$k]["default"] = (int) $v->isDefault();
90 $data[$k]["title"] = $v->getTitle();
91 $data[$k]["desc"] = $v->getDescription();
92 $data[$k]["lang"] = $v->getLanguageCode();
93 }
94 return $data;
95 }
96
97 private function getTableValuesByRequest(): array
98 {
99 $vals = [];
100
101 $titles = $this->post_wrapper->has("title")
102 ? $this->post_wrapper->retrieve(
103 "title",
104 $this->refinery->to()->listOf($this->refinery->kindlyTo()->string())
105 )
106 : [];
107
108 $descriptions = $this->post_wrapper->has("desc")
109 ? $this->post_wrapper->retrieve(
110 "desc",
111 $this->refinery->to()->listOf($this->refinery->kindlyTo()->string())
112 )
113 : [];
114
115 $languages = $this->post_wrapper->has("lang")
116 ? $this->post_wrapper->retrieve(
117 "lang",
118 $this->refinery->to()->listOf($this->refinery->kindlyTo()->string())
119 )
120 : [];
121
122 $default = $this->post_wrapper->has("default")
123 ? $this->post_wrapper->retrieve(
124 "default",
125 $this->refinery->kindlyTo()->int()
126 )
127 : '';
128
129 foreach ($titles as $k => $v) {
130 $vals[] = [
131 "title" => $v,
132 "desc" => $descriptions[$k],
133 "lang" => $languages[$k],
134 "default" => ($default == $k)
135 ];
136 }
137 return $vals;
138 }
139
147 public function setTitleDescrOnlyMode(bool $val): void
148 {
149 $this->title_descr_only = $val;
150 }
151
152 public function getTitleDescrOnlyMode(): bool
153 {
155 }
156
157 public function setEnableFallbackLanguage(bool $val): void
158 {
159 $this->fallback_lang_mode = $val;
160 }
161
162 public function getEnableFallbackLanguage(): bool
163 {
165 }
166
167 public function executeCommand(): void
168 {
169 $commands = [
174 "activateContentMultilinguality",
177 "confirmDeactivateContentMultiLang",
179 "saveContentTranslationActivation",
180 "deactivateContentMultiLang",
183 ];
184
185 $this->ctrl->getNextClass($this);
186 $cmd = $this->ctrl->getCmd(self::CMD_LIST_TRANSLATIONS);
187 if (!$this->access->checkAccess('write', '', $this->obj_gui->getRefId())) {
188 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('no_permission'));
189 $this->ctrl->redirect($this->obj_gui);
190 }
191
192 if (in_array($cmd, $commands)) {
193 $this->$cmd();
194 }
195 }
196
197 public function listTranslations(bool $get_post_values = false, bool $add = false): void
198 {
199 $this->lng->loadLanguageModule(ilObject::_lookupType($this->obj->getId()));
200
201 if ($this->getTitleDescrOnlyMode() || $this->obj_trans->getContentActivated()) {
202 $this->toolbar->addButton(
203 $this->lng->txt("obj_add_languages"),
204 $this->ctrl->getLinkTarget($this, self::CMD_ADD_LANGUAGES)
205 );
206 }
207
208 if ($this->support_content_translation) {
209 if ($this->getTitleDescrOnlyMode()) {
210 if (!$this->obj_trans->getContentActivated()) {
211 $this->tpl->setOnScreenMessage('info', $this->lng->txt("obj_multilang_title_descr_only"));
212 $this->toolbar->addButton(
213 $this->lng->txt("obj_activate_content_lang"),
214 $this->ctrl->getLinkTarget($this, "activateContentMultilinguality")
215 );
216 } else {
217 $this->toolbar->addButton(
218 $this->lng->txt("obj_deactivate_content_lang"),
219 $this->ctrl->getLinkTarget($this, "confirmDeactivateContentMultiLang")
220 );
221 }
222 } else {
223 if ($this->obj_trans->getContentActivated()) {
224 $this->toolbar->addButton(
225 $this->lng->txt("obj_deactivate_multilang"),
226 $this->ctrl->getLinkTarget($this, "confirmDeactivateContentMultiLang")
227 );
228 } else {
229 $this->toolbar->addButton(
230 $this->lng->txt("obj_activate_multilang"),
231 $this->ctrl->getLinkTarget($this, "activateContentMultilinguality")
232 );
233 return;
234 }
235 }
236 }
237
238 $table = new ilObjectTranslation2TableGUI(
239 $this,
240 self::CMD_LIST_TRANSLATIONS,
241 !$this->hide_description,
242 "Translation",
243 $this->obj_trans->getMasterLanguage(),
244 $this->fallback_lang_mode,
245 $this->obj_trans->getFallbackLanguage()
246 );
247 if ($get_post_values) {
248 $table->setData($this->getTableValuesByRequest());
249 } else {
250 $table->setData($this->getTableValuesByObjects());
251 }
252 $this->tpl->setContent($table->getHTML());
253 }
254
255 public function saveTranslations(bool $delete_checked = false): void
256 {
257 // default language set?
258 if (!$this->post_wrapper->has("default") && $this->obj_trans->getMasterLanguage() === "") {
259 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("msg_no_default_language"));
260 $this->listTranslations(true);
261 return;
262 }
263
264 // all languages set?
265 $languages = $this->post_wrapper->has("lang")
266 ? $this->post_wrapper->retrieve(
267 "lang",
268 $this->refinery->kindlyTo()->dictOf(
269 $this->refinery->kindlyTo()->string()
270 )
271 )
272 : [];
273 if (array_key_exists("", $languages)) {
274 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("msg_no_language_selected"));
275 $this->listTranslations(true);
276 return;
277 }
278
279 // no single language is selected more than once?
280 if (count(array_unique($languages)) < count($languages)) {
281 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("msg_multi_language_selected"));
282 $this->listTranslations(true);
283 return;
284 }
285
286 // save the stuff
287 $this->obj_trans->setLanguages([]);
288
289 $titles = $this->post_wrapper->has("title")
290 ? $this->post_wrapper->retrieve(
291 "title",
292 $this->refinery->kindlyTo()->dictOf(
293 $this->refinery->kindlyTo()->string()
294 )
295 )
296 : [];
297 $descriptions = $this->post_wrapper->has("desc")
298 ? $this->post_wrapper->retrieve(
299 "desc",
300 $this->refinery->kindlyTo()->dictOf(
301 $this->refinery->kindlyTo()->string()
302 )
303 )
304 : [];
305
306 $post_default = $this->post_wrapper->has("default")
307 ? $this->post_wrapper->retrieve(
308 "default",
309 $this->refinery->kindlyTo()->int()
310 )
311 : null;
312
313 $check = $this->post_wrapper->has('check')
314 ? $this->post_wrapper->retrieve(
315 "check",
316 $this->refinery->kindlyTo()->dictOf($this->refinery->kindlyTo()->string())
317 )
318 : [];
319
320 if ($this->obj_trans->getFallbackLanguage() !== "") {
321 $obj_store_lang = $this->obj_trans->getFallbackLanguage();
322 } else {
323 $obj_store_lang = ($this->obj_trans->getMasterLanguage() != "")
324 ? $this->obj_trans->getMasterLanguage()
325 : $languages[$post_default];
326 }
327
328 foreach ($titles as $k => $v) {
329 if ($delete_checked && isset($check[$k])) {
330 continue;
331 }
332 // update object data if default
333 $is_default = ($post_default === $k);
334
335 // ensure master language is set as default
336 if ($this->obj_trans->getMasterLanguage() != "") {
337 $is_default = ($this->obj_trans->getMasterLanguage() === $languages[$k]);
338 }
339 if ($languages[$k] === $obj_store_lang) {
340 $this->obj->setTitle(ilUtil::stripSlashes($v));
341 $this->obj->setDescription(ilUtil::stripSlashes($descriptions[$k] ?? ""));
342 }
343
344 $this->obj_trans->addLanguage(
345 ilUtil::stripSlashes($languages[$k]),
347 ilUtil::stripSlashes($descriptions[$k] ?? ""),
348 $is_default
349 );
350 }
351 $this->obj_trans->save();
352 if (method_exists($this->obj, "setObjectTranslation")) {
353 $this->obj->setObjectTranslation($this->obj_trans);
354 }
355 $this->obj->update();
356
357 $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_obj_modified"), true);
358 $this->ctrl->redirect($this, self::CMD_LIST_TRANSLATIONS);
359 }
360
361 public function deleteTranslations(): void
362 {
363 $titles = $this->post_wrapper->has('title')
364 ? $this->post_wrapper->retrieve(
365 "title",
366 $this->refinery->kindlyTo()->dictOf($this->refinery->kindlyTo()->string())
367 )
368 : [];
369 $check = $this->post_wrapper->has('check')
370 ? $this->post_wrapper->retrieve(
371 "check",
372 $this->refinery->kindlyTo()->dictOf($this->refinery->kindlyTo()->string())
373 )
374 : [];
375
376 foreach ($titles as $k => $v) {
377 if (isset($check[$k])) {
378 // default translation cannot be deleted
379 if (
380 !$this->post_wrapper->has("default") ||
381 $k != $this->post_wrapper->retrieve("default", $this->refinery->kindlyTo()->string())
382 ) {
383 } else {
384 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("msg_no_default_language"));
385 $this->listTranslations();
386 return;
387 }
388 }
389 }
390 $this->saveTranslations(true);
391 }
392
396 public function activateContentMultilinguality(): void
397 {
398 $this->tpl->setOnScreenMessage('info', $this->lng->txt("obj_select_master_lang"));
399 $form = $this->getMultiLangForm();
400 $this->tpl->setContent($form->getHTML());
401 }
402
403 public function getMultiLangForm(bool $add = false): ilPropertyFormGUI
404 {
405 $form = new ilPropertyFormGUI();
406
407 // master language
408 if (!$add) {
410 $si = new ilSelectInputGUI($this->lng->txt("obj_master_lang"), "master_lang");
411 $si->setOptions($options);
412 $si->setValue($this->user->getLanguage());
413 $form->addItem($si);
414 }
415
416 // additional languages
417 if ($add) {
419 $options = ["" => $this->lng->txt("please_select")] + $options;
420 $si = new ilSelectInputGUI($this->lng->txt("obj_additional_langs"), "additional_langs");
421 $si->setOptions($options);
422 $si->setMulti(true);
423 $form->addItem($si);
424 }
425
426 if ($add) {
427 $form->setTitle($this->lng->txt("obj_add_languages"));
428 $form->addCommandButton(self::CMD_SAVE_LANGUAGES, $this->lng->txt("save"));
429 } else {
430 if ($this->getTitleDescrOnlyMode()) {
431 $form->setTitle($this->lng->txt("obj_activate_content_lang"));
432 } else {
433 $form->setTitle($this->lng->txt("obj_activate_multilang"));
434 }
435 $form->addCommandButton("saveContentTranslationActivation", $this->lng->txt("save"));
436 }
437 $form->addCommandButton(self::CMD_LIST_TRANSLATIONS, $this->lng->txt("cancel"));
438 $form->setFormAction($this->ctrl->getFormAction($this));
439
440 return $form;
441 }
442
443 public function saveContentTranslationActivation(): void
444 {
445 $form = $this->getMultiLangForm();
446 if ($form->checkInput()) {
447 $ml = $form->getInput("master_lang");
448 $this->obj_trans->setMasterLanguage($ml);
449 if (!in_array($ml, $this->obj_trans->getLanguages())) {
450 $this->obj_trans->addLanguage(
451 $ml,
452 $this->obj->getTitle(),
453 $this->obj->getDescription(),
454 true
455 );
456 }
457 $this->obj_trans->save();
458 }
459
460 $this->ctrl->redirect($this, self::CMD_LIST_TRANSLATIONS);
461 }
462
463 public function confirmDeactivateContentMultiLang(): void
464 {
465 $cgui = new ilConfirmationGUI();
466 $cgui->setFormAction($this->ctrl->getFormAction($this));
467 if ($this->getTitleDescrOnlyMode()) {
468 $cgui->setHeaderText($this->lng->txt("obj_deactivate_content_transl_conf"));
469 } else {
470 $cgui->setHeaderText($this->lng->txt("obj_deactivate_multilang_conf"));
471 }
472
473 $cgui->setCancel($this->lng->txt("cancel"), self::CMD_LIST_TRANSLATIONS);
474 $cgui->setConfirm($this->lng->txt("confirm"), "deactivateContentMultiLang");
475 $this->tpl->setContent($cgui->getHTML());
476 }
477
478 public function deactivateContentMultiLang(): void
479 {
480 if (!$this->getTitleDescrOnlyMode()) {
481 $this->obj_trans->setMasterLanguage("");
482 $this->obj_trans->setLanguages([]);
483 $this->obj_trans->save();
484 }
485 $this->obj_trans->deactivateContentTranslation();
486 if ($this->getTitleDescrOnlyMode()) {
487 $this->tpl->setOnScreenMessage('success', $this->lng->txt("obj_cont_transl_deactivated"), true);
488 } else {
489 $this->tpl->setOnScreenMessage('success', $this->lng->txt("obj_multilang_deactivated"), true);
490 }
491
492 $this->ctrl->redirect($this, self::CMD_LIST_TRANSLATIONS);
493 }
494
495 public function addLanguages(): void
496 {
497 $form = $this->getMultiLangForm(true);
498 $this->tpl->setContent($form->getHTML());
499 }
500
501 public function saveLanguages(): void
502 {
503 $form = $this->getMultiLangForm(true);
504 if ($form->checkInput()) {
505 $ad = $form->getInput("additional_langs");
506 if (is_array($ad)) {
507 $ml = $this->obj_trans->getMasterLanguage();
508 foreach ($ad as $l) {
509 if ($l != $ml && $l != "") {
510 $this->obj_trans->addLanguage($l, "", "", false);
511 }
512 }
513 }
514 $this->obj_trans->save();
515 $this->tpl->setOnScreenMessage('info', $this->lng->txt("msg_obj_modified"), true);
516 $this->ctrl->redirect($this, self::CMD_LIST_TRANSLATIONS);
517 }
518
519 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('err_check_input'));
520 $form->setValuesByPost();
521 $this->tpl->setContent($form->getHTML());
522 }
523
524 public function confirmRemoveLanguages(): void
525 {
526 $this->lng->loadLanguageModule("meta");
527
528 $languages = $this->post_wrapper->has("lang")
529 ? $this->post_wrapper->retrieve(
530 "lang",
531 $this->refinery->kindlyTo()->dictOf(
532 $this->refinery->kindlyTo()->string()
533 )
534 )
535 : null;
536
537 if (!is_array($languages) || count($languages) === 0) {
538 $this->tpl->setOnScreenMessage('info', $this->lng->txt("no_checkbox"), true);
539 $this->ctrl->redirect($this, self::CMD_LIST_TRANSLATIONS);
540 } else {
541 $cgui = new ilConfirmationGUI();
542 $cgui->setFormAction($this->ctrl->getFormAction($this));
543 $cgui->setHeaderText($this->lng->txt("obj_conf_delete_lang"));
544 $cgui->setCancel($this->lng->txt("cancel"), self::CMD_LIST_TRANSLATIONS);
545 $cgui->setConfirm($this->lng->txt("remove"), self::CMD_REMOVE_LANGUAGES);
546
547 foreach ($languages as $i) {
548 $cgui->addItem("lang[]", $i, $this->lng->txt("meta_l_" . $i));
549 }
550
551 $this->tpl->setContent($cgui->getHTML());
552 }
553 }
554
555 public function setFallback(): void
556 {
557 // default language set?
558 $checkboxes = $this->post_wrapper->has("check")
559 ? $this->post_wrapper->retrieve(
560 "check",
561 $this->refinery->kindlyTo()->dictOf(
562 $this->refinery->kindlyTo()->int()
563 )
564 )
565 : [];
566
567 if ($checkboxes === []) {
568 $this->tpl->setOnScreenMessage('failure', $this->lng->txt("obj_select_one_language"));
569 $this->listTranslations(true);
570 return;
571 }
572 $checked = key($checkboxes);
573
574 $languages = $this->post_wrapper->has("lang")
575 ? $this->post_wrapper->retrieve(
576 "lang",
577 $this->refinery->kindlyTo()->dictOf($this->refinery->kindlyTo()->string())
578 )
579 : [];
580
581 $fallback_lang = $languages[$checked];
582 if ($fallback_lang !== $this->obj_trans->getFallbackLanguage()) {
583 $this->obj_trans->setFallbackLanguage($fallback_lang);
584 } else {
585 $this->obj_trans->setFallbackLanguage("");
586 }
587 $this->obj_trans->save();
588 $this->tpl->setOnScreenMessage('info', $this->lng->txt("msg_obj_modified"), true);
589 $this->ctrl->redirect($this, self::CMD_LIST_TRANSLATIONS);
590 }
591}
$check
Definition: buildRTE.php:81
Builds data types.
Definition: Factory.php:21
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilCtrl provides processing control methods.
language handling
User class.
Class ilObjectGUI Basic methods of all Output classes.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
listTranslations(bool $get_post_values=false, bool $add=false)
ILIAS HTTP Wrapper ArrayBasedRequestWrapper $post_wrapper
activateContentMultilinguality()
Activate multi language (-> master language selection)
ilGlobalTemplateInterface $tpl
setTitleDescrOnlyMode(bool $val)
Some objects like learning modules do not support to translate only the title and the description.
supportContentTranslation(bool $content_translation)
saveTranslations(bool $delete_checked=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getInstance(int $obj_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _lookupType(int $id, bool $reference=false)
This class represents a property form user interface.
This class represents a selection list property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
global $DIC
Definition: feed.php:28
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$i
Definition: metadata.php:41