ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilObjectTranslationGUI.php
Go to the documentation of this file.
1 <?php
2 
3 declare(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 
46  protected ilObjectGUI $obj_gui;
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 = [
170  self::CMD_LIST_TRANSLATIONS,
171  self::CMD_SAVE_TRANSLATIONS,
172  self::CMD_ADD_TRANSLATION,
173  self::CMD_DELETE_TRANSLATIONS,
174  "activateContentMultilinguality",
175  self::CMD_CONFIRM_REMOVE_LANGUAGES,
176  self::CMD_REMOVE_LANGUAGES,
177  "confirmDeactivateContentMultiLang",
178  self::CMD_SAVE_LANGUAGES,
179  "saveContentTranslationActivation",
180  "deactivateContentMultiLang",
181  self::CMD_ADD_LANGUAGES,
182  self::CMD_SET_FALLBACK
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(),
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) {
409  $options = ilMDLanguageItem::_getLanguages();
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) {
418  $options = ilMDLanguageItem::_getLanguages();
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 }
setData(array $a_data)
setTitleDescrOnlyMode(bool $val)
Some objects like learning modules do not support to translate only the title and the description...
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="")
ILIAS HTTP Wrapper ArrayBasedRequestWrapper $post_wrapper
activateContentMultilinguality()
Activate multi language (-> master language selection)
saveTranslations(bool $delete_checked=false)
ilGlobalTemplateInterface $tpl
global $DIC
Definition: feed.php:28
Class ilObjectGUI Basic methods of all Output classes.
static getInstance(int $obj_id)
supportContentTranslation(bool $content_translation)
$check
Definition: buildRTE.php:81
static _lookupType(int $id, bool $reference=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$i
Definition: metadata.php:41
listTranslations(bool $get_post_values=false, bool $add=false)
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...