diff --git a/app/controllers/module/download.php b/app/controllers/module/download.php index e5f5be836b740ae038fe78af3bdd9a66d2f55a7e..be527d5747ebf48b258c5f312bc50c76410ae8a7 100644 --- a/app/controllers/module/download.php +++ b/app/controllers/module/download.php @@ -10,15 +10,14 @@ class Module_DownloadController extends MVVController public function details_action($modul_id, $language = null) { + $language = Request::get('display_language', $language); + ModuleManagementModel::setLanguage($language); + $modul = Modul::find($modul_id); if (!$modul) { throw new Exception(_('Ungültiges Modul')); } - $language = Request::get('display_language', $language) ?? $modul->original_language; - I18NString::setDefaultLanguage($modul->original_language); - I18NString::setContentLanguage($language); - - $this->getDetails($modul_id); + $this->getDetails($modul_id, $language); $this->download = true; $as_pdf = Request::int('pdf'); @@ -52,7 +51,7 @@ class Module_DownloadController extends MVVController } } - private function getDetails($id) + private function getDetails($id, $language = null) { $modul = Modul::find($id); if (!$modul) { @@ -82,7 +81,7 @@ class Module_DownloadController extends MVVController $modulTeilData = []; foreach ($modul->modulteile as $modulTeil) { - $deskriptor = $modulTeil->getDeskriptor(); + $deskriptor = $modulTeil->getDeskriptor($language); $num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulTeil->num_bezeichnung]['name'] ?? ''; $name_kurz = sprintf('%s %d', $num_bezeichnung, $modulTeil->nummer); @@ -135,7 +134,7 @@ class Module_DownloadController extends MVVController $this->semesterSelector = Semester::GetSemesterSelector(null, $currentSemester->getId(), 'semester_id', false); $this->modul = $modul; $this->pruefungsEbene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name'] ?? null; - $this->modulDeskriptor = $modul->getDeskriptor(); + $this->modulDeskriptor = $modul->getDeskriptor($language); $this->startSemester = Semester::find($modul->start); if ($modul->responsible_institute->institute) { $this->instituteName = $modul->responsible_institute->getDisplayName(); diff --git a/app/controllers/module/module.php b/app/controllers/module/module.php index 7ced00363a3706ec458e737de06cc610a222cbd0..10674d07dc916d8ded6d027efa57f00cc72bdf0d 100644 --- a/app/controllers/module/module.php +++ b/app/controllers/module/module.php @@ -105,20 +105,6 @@ class Module_ModuleController extends MVVController $this->setSidebar(); } - public function select_module_language_action() - { - $this->languages = []; - foreach (Config::get()->CONTENT_LANGUAGES as $language_code => $language) { - $code = strtok($language_code, '_'); - $this->languages[] = [ - 'name' => $language['name'], - 'code' => $language_code, - 'picture' => "lang_{$code}_text.svg", - ]; - }; - PageLayout::setTitle(_('Sprache wählen')); - } - public function modul_action($modul_id = null, $institut_id = null) { $own_institutes = MvvPerm::getOwnInstitutes(); @@ -147,20 +133,13 @@ class Module_ModuleController extends MVVController if ($this->modul->isNew()) { PageLayout::setTitle(_('Neues Modul anlegen')); $success_message = ('Das Modul "%s" wurde angelegt.'); - $language = Request::option('display_language'); - $content_languages = Config::get()->CONTENT_LANGUAGES; - if (!empty($content_languages[$language])) { - $this->display_language = $language; - } else { - $this->display_language = Config::get()->MVV_DEFAULT_LANGUAGE; - } - $this->modul->original_language = $this->display_language; - $this->deskriptor = $this->modul->getDeskriptor(); + $this->display_language = $this->modul->getDefaultLanguage(); + $this->deskriptor = $this->modul->getDeskriptor($this->display_language, true); $this->reset_search('Modul'); if (!$modul_id) { PageLayout::postInfo(sprintf( - _('Sie legen ein neues Modul an. Das Modul wird zunächst in der Ausgabesprache <em>%s</em> angelegt (Originalsprache).'), - Config::get()->CONTENT_LANGUAGES[$this->display_language]['name'] + _('Sie legen ein neues Modul an. Das Modul muss zunächst in der Ausgabesprache <em>%s</em> angelegt werden.'), + $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] )); } // set default language of instruction @@ -172,17 +151,17 @@ class Module_ModuleController extends MVVController } else { $this->display_language = Request::option( 'display_language', - $this->modul->original_language + $this->modul->getDefaultLanguage() ); - $this->deskriptor = $this->modul->getDeskriptor(); - $this->translations = $this->deskriptor->getAvailableTranslations($this->modul->original_language); + $this->deskriptor = $this->modul->getDeskriptor($this->display_language, true); + $this->translations = $this->deskriptor->getAvailableTranslations(); if (!in_array($this->display_language, $this->translations)) { PageLayout::setTitle( sprintf( _('Modul: <em>%s</em> in der Ausgabesprache <em>%s</em> neu anlegen.'), $this->modul->getDisplayName(), - Config::get()->CONTENT_LANGUAGE[$this->display_language]['name'] + $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] ) ); } else { @@ -194,18 +173,15 @@ class Module_ModuleController extends MVVController $success_message = _('Das Modul "%s" wurde geändert.'); // language selector as sidebar widget $template_factory = $this->get_template_factory(); - $sidebar_template = $template_factory->render( - 'shared/deskriptor_language', - [ - 'original_language' => $this->modul->original_language, - 'display_language' => $this->display_language, - 'descriptor' => $this->modul->deskriptoren, - 'link' => $this->modulURL($this->modul->id, $this->institut_id), - ] + $sidebar_template = $template_factory->render('shared/deskriptor_language', [ + 'modul' => $this->modul, + 'sprache' => $this->display_language, + 'link' => $this->modulURL($this->modul->id, $this->institut_id), + 'url' => $this->url] ); $widget = new SidebarWidget(); - $widget->setTitle(_('Ausgabesprache wählen')); + $widget->setTitle(_('Ausgabesprache')); $widget->addElement(new WidgetElement($sidebar_template)); $sidebar->addWidget($widget, 'language'); @@ -259,11 +235,9 @@ class Module_ModuleController extends MVVController $sidebar->addWidget($widget, 'variants'); } } - $this->semester = array_reverse(Semester::getAll()); - $this->def_lang = $this->display_language === $this->modul->original_language; - I18NString::setDefaultLanguage($this->modul->original_language); - I18NString::setContentLanguage($this->display_language); + $this->def_lang = $this->display_language === $this->modul->getDefaultLanguage(); + ModuleManagementModel::setContentLanguage($this->display_language); if (!$this->def_lang) { $action_widget = $sidebar->getWidget('actions'); $action_widget->addLink( @@ -273,6 +247,7 @@ class Module_ModuleController extends MVVController ); } + $this->language = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['content_language']; if (Request::isPost()) { CSRFProtection::verifyUnsafeRequest(); $stored = false; @@ -304,13 +279,6 @@ class Module_ModuleController extends MVVController $this->modul->fassung_typ = Request::option('fassung_typ'); $this->modul->version = trim(Request::get('version')); $this->modul->verantwortlich = trim(Request::get('verantwortlich')); - // change original language - if ( - !$this->modul->isNew() - && $this->modul->original_language !== Request::option('original_language') - ) { - $this->setOriginalLanguage($this->modul, Request::option('original_language')); - } } $deskriptor_fields = ['bezeichnung', 'verantwortlich', @@ -322,16 +290,10 @@ class Module_ModuleController extends MVVController foreach ($deskriptor_fields as $deskriptor_field) { if ($this->deskriptor->isI18nField($deskriptor_field)) { - if ($this->display_language === $this->modul->original_language) { - $this->deskriptor->$deskriptor_field->setOriginal( - trim(Request::get($deskriptor_field)) - ); - } else { - $this->deskriptor->$deskriptor_field->setLocalized( - trim(Request::get($deskriptor_field)), - $this->display_language - ); - } + $this->deskriptor->$deskriptor_field->setLocalized( + trim(Request::get($deskriptor_field)), + $this->language + ); } else { $this->deskriptor->setValue( $deskriptor_field, @@ -345,7 +307,7 @@ class Module_ModuleController extends MVVController $df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key); if ($df) { $tdf = $df->getTypedDatafield(); - $tdf->setContentLanguage($this->display_language); + $tdf->setContentLanguage($this->language); $tdf->setValueFromSubmit($df_value); $tdf->store(); } @@ -690,31 +652,29 @@ class Module_ModuleController extends MVVController if ($this->modulteil->isNew()) { PageLayout::setTitle(_('Neuen Modulteil anlegen')); $success_message = ('Der Modulteil "%s" wurde angelegt.'); - $this->display_language = Request::option( - 'display_language', - $this->modul->original_language - ); - $this->deskriptor = $this->modulteil->getDeskriptor(); + $this->display_language = $this->modulteil->getDefaultLanguage(); + $this->deskriptor = $this->modulteil->getDeskriptor($this->display_language, true); PageLayout::postInfo(sprintf( _('Sie legen einen neuen Modulteil für das Modul <em>%s</em> an. Der Modulteil muss zunächst in der Ausgabesprache <em>%s</em> angelegt werden.'), htmlReady($this->modul->getDisplayName()), - htmlReady(Config::get()->MVV_MODUL_DESKRIPTOR['SPRACHE']['values'][$this->display_language]['name']) + htmlReady($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name']) )); // set default language of instruction - if (Config::get()->MVV_MODULTEIL['SPRACHE']['default']) { + if ($GLOBALS['MVV_MODULTEIL']['SPRACHE']['default']) { $this->modulteil->assignLanguagesOfInstruction([ - Config::get()->MVV_MODULTEIL['SPRACHE']['default'] + $GLOBALS['MVV_MODULTEIL']['SPRACHE']['default'] ]); } } else { - $this->display_language = Request::option('display_language', $this->modul->original_language); - $this->deskriptor = $this->modulteil->getDeskriptor(); - $this->translations = $this->deskriptor->getAvailableTranslations($this->modul->original_language); + $this->display_language = Request::option('display_language', $this->modulteil->getDefaultLanguage()); + $this->deskriptor = $this->modulteil->getDeskriptor($this->display_language, true); + $this->translations = $this->deskriptor->getAvailableTranslations(); + if (!in_array($this->display_language, $this->translations)) { PageLayout::setTitle(sprintf( _('Modulteil: "%s" in der Ausgabesprache "%s" neu anlegen.'), $this->modulteil->getDisplayName(), - Config::get()->CONTENT_LANGUAGES[$this->display_language]['name'] + $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] )); } else { PageLayout::setTitle(sprintf(_('Modulteil: %s'), htmlReady($this->modulteil->getDisplayName()))); @@ -728,10 +688,10 @@ class Module_ModuleController extends MVVController $widget_element = new WidgetElement( $template_factory->render('shared/deskriptor_language', [ - 'descriptor' => $this->modulteil->deskriptoren, - 'display_language' => $this->display_language, - 'original_language' => $this->modul->original_language, - 'link' => $this->modulteilURL($this->modulteil->id), + 'modul' => $this->modulteil, + 'sprache' => $this->display_language, + 'link' => $this->modulteilURL($this->modulteil->id), + 'url' => $this->url ] ) ); @@ -739,9 +699,7 @@ class Module_ModuleController extends MVVController $sidebar->addWidget($widget, 'languages'); } - $this->def_lang = $this->display_language === $this->modul->original_language; - I18NString::setDefaultLanguage($this->modul->original_language); - I18NString::setContentLanguage($this->display_language); + $this->def_lang = $this->display_language === $this->modulteil->getDefaultLanguage(); if (!$this->def_lang) { $action_widget = $sidebar->getWidget('actions'); @@ -753,6 +711,7 @@ class Module_ModuleController extends MVVController ); } + $this->language = $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['content_language']; if (Request::submitted('store')) { CSRFProtection::verifyUnsafeRequest(); $stored = false; @@ -789,21 +748,12 @@ class Module_ModuleController extends MVVController foreach ($deskriptor_fields as $deskriptor_field) { if ($this->deskriptor->isI18nField($deskriptor_field)) { - if ($this->display_language === $this->modul->original_language) { - $this->deskriptor->$deskriptor_field->setOriginal( - trim(Request::get($deskriptor_field)) - ); - } else { - $this->deskriptor->$deskriptor_field->setLocalized( - trim(Request::get($deskriptor_field)), - $this->display_language - ); - } - } else { - $this->deskriptor->setValue( - $deskriptor_field, - trim(Request::get($deskriptor_field)) + $this->deskriptor->$deskriptor_field->setLocalized( + trim(Request::get($deskriptor_field)), + $this->language ); + } else { + $this->deskriptor->setValue($deskriptor_field, trim(Request::get($deskriptor_field))); } } @@ -812,7 +762,7 @@ class Module_ModuleController extends MVVController $df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key); if ($df) { $tdf = $df->getTypedDatafield(); - $tdf->setContentLanguage($this->display_language); + $tdf->setContentLanguage($this->language); $tdf->setValueFromSubmit($df_value); $tdf->store(); } @@ -845,11 +795,11 @@ class Module_ModuleController extends MVVController return; } } - if ($this->display_language !== $this->modul->original_language && $this->deskriptor->isNew()) { + if ($this->display_language !== $this->modulteil->getDefaultLanguage() && $this->deskriptor->isNew()) { PageLayout::postInfo(sprintf( _('Neue Beschreibung zum Modulteil "%s" in der Ausgabesprache %s anlegen.'), htmlReady($this->modulteil->getDisplayName()), - htmlReady(Config::get()->CONTENT_LANGUAGES[$this->display_language]['name']) + htmlReady($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name']) )); } $this->cancel_url = $this->detailsURL($this->modulteil->modul_id); @@ -878,7 +828,7 @@ class Module_ModuleController extends MVVController if (is_null($deskriptor)) { throw new Trails\Exception(404, _('Unbekannter Deskriptor')); } - $def_lang = $deskriptor->modulteil->modul->original_language; + $def_lang = $deskriptor->modulteil->getDefaultLanguage(); if ($language === $def_lang) { throw new Trails\Exception(403, _('Ein Deskriptor in der Original-Sprache kann nicht gelöscht werden.')); } @@ -1398,9 +1348,9 @@ class Module_ModuleController extends MVVController if (MvvPerm::havePermCreate('Modul')) { $widget->addLink( _('Neues Modul anlegen'), - $this->select_module_languageURL(), + $this->modulURL(), Icon::create('add') - )->asDialog('size=600x300'); + ); } $sidebar->addWidget($widget, 'actions'); @@ -1623,40 +1573,4 @@ class Module_ModuleController extends MVVController WHERE `mvv_studiengang`.`abschluss_id` = ?"; return DBManager::get()->fetchFirst($query, [$abschluss_id]); } - - private function setOriginalLanguage(Modul $module, string $original_language): void - { - $content_language = Config::get()->CONTENT_LANGUAGES[$original_language]; - if (empty($content_language)) { - throw new InvalidArgumentException("Original language $original_language is not defined"); - } - if ($module->deskriptoren) { - $current_language = $module->original_language; - $module->original_language = $original_language; - DBManager::get()->execute(" - UPDATE `i18n` - SET `lang` = ? - WHERE `object_id` = ? - AND `table` = 'mvv_modul_deskriptor' - AND `lang` = ?", - [ - $original_language, - $module->deskriptoren->id, - $current_language - ]); - $module->modulteile->each(fn($component) => DBManager::get()->execute(" - UPDATE `i18n` - SET `lang` = ? - WHERE `object_id` IN (?) - AND `table` = 'mvv_modulteil_deskriptor' - AND `lang` = ?", - [ - $original_language, - $module->deskriptoren->id, - $current_language - ] - ) - ); - } - } } diff --git a/app/controllers/search/studiengaenge.php b/app/controllers/search/studiengaenge.php index 7f6dc5b4b49f93497a9df0e47eb3a61c7b7cb4ec..e17eb2a9773c3a8d93c2738dabaf79be22d5b9f5 100644 --- a/app/controllers/search/studiengaenge.php +++ b/app/controllers/search/studiengaenge.php @@ -341,7 +341,7 @@ class Search_StudiengaengeController extends MVVController // add links to export Modulhandbücher as PDF $widget = new ActionsWidget(); $widget->setTitle(_('Aktuelle Modulhandbücher')); - $avl_lang = array_keys(Config::get()->CONTENT_LANGUAGES); + $avl_lang = array_keys($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values']); foreach ($avl_lang as $language) { if ($language === $GLOBALS['MVV_LANGUAGES']['default']) { diff --git a/app/controllers/shared/modul.php b/app/controllers/shared/modul.php index 1f1e5ce836804099fa816b24ee7f49ef6b884f54..d1a6ecfb21625f335418b20d88121703ebb5b37a 100644 --- a/app/controllers/shared/modul.php +++ b/app/controllers/shared/modul.php @@ -13,6 +13,8 @@ * @since 3.5 */ + + class Shared_ModulController extends AuthenticatedController { @@ -28,89 +30,96 @@ class Shared_ModulController extends AuthenticatedController $display_language = Request::option('display_language', $_SESSION['_language']); ModuleManagementModel::setLanguage($display_language); - $this->modul = Modul::find($modul_id); - if (!$this->modul->hasPublicStatus()) { + $modul = Modul::find($modul_id); + if (!$modul->hasPublicStatus()) { throw new AccessDeniedException(); } - if ($this->modul) { - $this->details_id = $this->modul->getId(); + if ($modul) { + $this->details_id = $modul->getId(); $type = 1; - if (count($this->modul->modulteile) == 1) { - $modulteil = $this->modul->modulteile->first(); + if (count($modul->modulteile) == 1) { + $modulteil = $modul->modulteile->first(); $type = 3; if (count($modulteil->lvgruppen) > 0) { $type = 2; } - } else if (count($this->modul->modulteile) == 0) { + } else if (count($modul->modulteile) == 0) { $type = 3; } if (!$semester_id) { - $current_semester = Semester::findDefault(); + $currentSemester = Semester::findDefault(); } else { - $current_semester = Semester::find($semester_id); + $currentSemester = Semester::find($semester_id); } $sws = 0; - $institut = new Institute($this->modul->responsible_institute->institut_id); - $modulteile_data = []; - foreach ($this->modul->modulteile as $modulteil) { - $modulteil_deskriptor = $modulteil->getDeskriptor(); - $sws += (int) $modulteil->sws; - $num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulteil->num_bezeichnung]['name'] ?? ''; - $name_kurz = sprintf('%s %d', $num_bezeichnung, $modulteil->nummer); - $modulteile_data[$modulteil->getId()] = [ - 'name' => $modulteil->getDisplayName(), + $institut = new Institute($modul->responsible_institute->institut_id); + $modulTeileData = []; + foreach ($modul->modulteile as $modulTeil) { + + $modulTeilDeskriptor = $modulTeil->getDeskriptor($display_language); + + $sws += (int) $modulTeil->sws; + + $num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulTeil->num_bezeichnung]['name'] ?? ''; + + $name_kurz = sprintf('%s %d', $num_bezeichnung, $modulTeil->nummer); + + $modulTeileData[$modulTeil->getId()] = [ + 'name' => $modulTeil->getDisplayName(), 'name_kurz' => $name_kurz, - 'voraussetzung' => $modulteil_deskriptor->voraussetzung, - 'pruef_leistung' => $modulteil_deskriptor->pruef_leistung, - 'pruef_vorleistung' => $modulteil_deskriptor->pruef_vorleistung, - 'kommentar' => $modulteil_deskriptor->kommentar, - 'kapazitaet' => $modulteil->kapazitaet, + 'voraussetzung' => $modulTeilDeskriptor->voraussetzung, + 'pruef_leistung' => $modulTeilDeskriptor->pruef_leistung, + 'pruef_vorleistung' => $modulTeilDeskriptor->pruef_vorleistung, + 'kommentar' => $modulTeilDeskriptor->kommentar, + 'kapazitaet' => $modulTeil->kapazitaet, 'lvGruppen' => [] ]; - $lvGruppen = Lvgruppe::findByModulteil($modulteil->getId()); + $lvGruppen = Lvgruppe::findByModulteil($modulTeil->getId()); foreach ($lvGruppen as $lvGruppe) { - $ids = array_column($lvGruppe->getAssignedCoursesBySemester($current_semester['semester_id'], $GLOBALS['user']->id), 'seminar_id'); + $ids = array_column($lvGruppe->getAssignedCoursesBySemester($currentSemester['semester_id'], $GLOBALS['user']->id), 'seminar_id'); $courses = Course::findMany($ids, 'order by Veranstaltungsnummer, Name'); - $modulteile_data[$modulteil->getId()]['lvGruppen'][$lvGruppe->getId()] = [ + $modulTeileData[$modulTeil->getId()]['lvGruppen'][$lvGruppe->getId()] = [ 'courses' => $courses, 'alt_texte' => $lvGruppe->alttext ]; } } - $this->modulteile = $modulteile_data; - $this->deskriptor = $this->modul->getDeskriptor(); + $this->modulTeile = $modulTeileData; + $this->deskriptor = $modul->getDeskriptor($display_language); $this->institut = $institut; - $this->semester = $current_semester; + $this->semester = $currentSemester; $this->sws = $sws; - $this->pruef_ebene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene]['name'] ?? null; + $this->pruef_ebene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name'] ?? null; + $this->modul = $modul; $this->type = $type; $this->self_url = $this->url_for('modul/show/' . $modul_id); $this->detail_url = $this->url_for('modul/detail/' . $modul_id); - PageLayout::setTitle($this->modul->getDisplayName() . ' (' . _('Veranstaltungsübersicht') .')'); + $this->teilnahmeVoraussetzung = $modul->getDeskriptor()->voraussetzung; + PageLayout::setTitle($modul->getDisplayName() . ' (' . _('Veranstaltungsübersicht') .')'); } } public function description_action($id) { - $this->modul = Modul::find($id); - $perm = MvvPerm::get($this->modul); - if (!($this->modul->hasPublicStatus() || $perm->haveObjectPerm(MvvPerm::PERM_READ))) { + $modul = Modul::find($id); + $perm = MvvPerm::get($modul); + if (!($modul->hasPublicStatus() || $perm->haveObjectPerm(MvvPerm::PERM_READ))) { throw new AccessDeniedException(); } - $this->type = 1; - if (count($this->modul->modulteile) == 1) { - $modulteil = $this->modul->modulteile->first(); - $this->type = 3; + $type = 1; + if (count($modul->modulteile) == 1) { + $modulteil = $modul->modulteile->first(); + $type = 3; if (count($modulteil->lvgruppen) > 0) { - $this->type = 2; + $type = 2; } - } else if (count($this->modul->modulteile) == 0) { - $this->type = 3; + } else if (count($modul->modulteile) == 0) { + $type = 3; } if (!Request::get('sem_select')) { @@ -119,27 +128,28 @@ class Shared_ModulController extends AuthenticatedController $currentSemester = Semester::find(Request::get('sem_select')); } - $this->display_language = Request::get('display_language', $this->modul->original_language); - ModuleManagementModel::setLanguage($this->display_language); - I18NString::setDefaultLanguage($this->modul->original_language); - I18NString::setContentLanguage($this->display_language); + $display_language = Request::get('display_language', $_SESSION['_language']); + ModuleManagementModel::setLanguage($display_language); $this->semesterSelector = Semester::getSemesterSelector(null, $currentSemester['semester_id'], 'semester_id', false); - $this->pruefungsEbene = isset($GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene]) - ? $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene]['name'] + $this->modul = $modul; + $this->pruefungsEbene = isset($GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]) + ? $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name'] : null; - $this->modulDeskriptor = $this->modul->getDeskriptor(); - $this->startSemester = Semester::findByTimestamp($this->modul->start); + $this->modulDeskriptor = $modul->getDeskriptor($display_language); + $this->startSemester = Semester::findByTimestamp($modul->start); - if (!$this->modul->responsible_institute) { + if (!$modul->responsible_institute) { $this->instituteName = null; - } elseif ($this->modul->responsible_institute->institute) { - $this->instituteName = $this->modul->responsible_institute->institute->name; + } elseif ($modul->responsible_institute->institute) { + $this->instituteName = $modul->responsible_institute->institute->name; } else { $this->instituteName = _('Unbekannte Einrichtung'); } + $this->type = $type; $this->semester = $currentSemester; - PageLayout::setTitle($this->modul->getDisplayName() . ' (' . _('Vollständige Modulbeschreibung') .')'); + $this->display_language = $display_language; + PageLayout::setTitle($modul->getDisplayName() . ' (' . _('Vollständige Modulbeschreibung') .')'); } public function mail_action($modul_id, $semester_id) diff --git a/app/views/admin/datafields/edit.php b/app/views/admin/datafields/edit.php index 49de4522b0610f36c406fc42e5dd00ba45e83afc..46b7aa1dcb8c988220d3a291f4ff4aabea6fe753 100644 --- a/app/views/admin/datafields/edit.php +++ b/app/views/admin/datafields/edit.php @@ -71,7 +71,7 @@ use Studip\Button, Studip\LinkButton; <select multiple name="object_class[]" id="object_class" required> <option value="NULL" <? if ($item->object_class === null) echo 'selected'; ?>><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option> - <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?> + <? foreach ((array) $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?> <option value="<?= htmlReady($key) ?>" <? if (mb_strpos($item->object_class, $key) !== false) echo 'selected'; ?>> <?= htmlReady($value['name']) ?> </option> @@ -82,7 +82,7 @@ use Studip\Button, Studip\LinkButton; <select multiple name="object_class[]" id="object_class" required> <option value="NULL" <? if ($item->object_class === null) echo 'selected'; ?>><?= _('alle (mehrsprachige Eingabe)') ?></option> - <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?> + <? foreach ((array) $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?> <option value="<?= htmlReady($key) ?>" <? if (mb_strpos($item->object_class, $key) !== false) echo 'selected'; ?>> <?= htmlReady($value['name']) ?> </option> @@ -90,7 +90,7 @@ use Studip\Button, Studip\LinkButton; </select> <? elseif ($item->object_type === 'studycourse'): ?> <?= _('Typ/Abschnitt') ?> - + <select name="object_class" required> <option value="all_settings"<?= mb_strpos($item->object_class, 'all_settings') !== false ? ' selected' : '' ?>><?= _('alle (Abschnitt "Einstellungen")') ?></option> <option value="all_info"<?= mb_strpos($item->object_class, 'all_info') !== false ? ' selected' : '' ?>><?= _('alle (Abschnitt "Inhalte und Informationen")') ?></option> diff --git a/app/views/admin/datafields/index.php b/app/views/admin/datafields/index.php index de4b512c8be011d9175bea4024c6d0f7a9e9fe28..e62b8d6fd0004832747a165d16ad94fd22a1694b 100644 --- a/app/views/admin/datafields/index.php +++ b/app/views/admin/datafields/index.php @@ -108,7 +108,7 @@ <?= $val->object_class !== null ? htmlReady($GLOBALS['INST_TYPE'][$val->object_class]['name']) : _('alle')?> <? elseif ($key === 'moduldeskriptor' || $key === 'modulteildeskriptor') : ?> <?= $val->object_class !== null ? htmlReady(implode(', ', array_map(function ($class) { - return Config::get()->CONTENT_LANGUAGES[$class]['name']; + return $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$class]['name']; }, explode(',', $val->object_class)))) : _('alle')?> <? elseif ($key === 'studycourse'): ?> <? $object_classes = diff --git a/app/views/admin/datafields/new.php b/app/views/admin/datafields/new.php index 3b99d2d2205b11cdbd68e9d4744db1adb88c70ac..e64293ff5b6f354b2abcc88072924ea1d0917a06 100644 --- a/app/views/admin/datafields/new.php +++ b/app/views/admin/datafields/new.php @@ -72,13 +72,13 @@ use Studip\Button, Studip\LinkButton; <? elseif ($object_typ === 'moduldeskriptor') : ?> <select multiple name="object_class[]" required> <option value="NULL" selected><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option> - <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?> + <? foreach ((array) $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?> <option value="<?= htmlReady($key) ?>"><?= htmlReady($value['name']) ?></option> <? endforeach; ?> <? elseif ($object_typ === 'modulteildeskriptor') : ?> <select multiple name="object_class[]" required> <option value="NULL" selected><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option> - <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?> + <? foreach ((array) $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?> <option value="<?= htmlReady($key) ?>"><?= htmlReady($value['name']) ?></option> <? endforeach; ?> <? elseif ($object_typ === 'studycourse') : ?> diff --git a/app/views/module/module/details.php b/app/views/module/module/details.php index 3666f85478fdef2e212dc5f8049f69ef94bb9d81..4509d520e345caab979aa8f98a7132cdbe5aa99b 100644 --- a/app/views/module/module/details.php +++ b/app/views/module/module/details.php @@ -1,19 +1,8 @@ -<?php -/** - * @var Modul $modul - * @var string $modulteil_id - * @var string $display_language - * @var Module_ModuleController $controller - * @var string $institut_id - */ -?> - <td colspan="6"> <table class="default collapsable sortable" id="<?= $modul->id ?>"> <colgroup> <col> - <col style="width: 150px;"> - <col style="width: 70px;"> + <col span="2" style="width: 150px;"> </colgroup> <? foreach ($modul->modulteile as $modulteil) : ?> <? $perm = MvvPerm::get($modulteil) ?> @@ -31,8 +20,8 @@ </td> <td class="dont-hide actions" style="white-space: nowrap; text-align: center;"> <? if ($perm->havePermWrite()) : ?> - <? foreach ($modulteil->deskriptoren->getAvailableTranslations($modulteil->modul->original_language) as $language) : ?> - <? $lang = Config::get()->CONTENT_LANGUAGES[$language]; ?> + <? foreach ($modulteil->deskriptoren->getAvailableTranslations() as $language) : ?> + <? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?> <a href="<?= $controller->action_link('modulteil/' . join('/', [$modulteil->id, $institut_id]), ['display_language' => $language]) ?>"> <?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?> </a> diff --git a/app/views/module/module/index.php b/app/views/module/module/index.php index 017d23dada2f7a66bd3e1a28aab1144feb9c25f0..1028a2db12067eaa8d27859ab4b35ea56605702a 100644 --- a/app/views/module/module/index.php +++ b/app/views/module/module/index.php @@ -1,21 +1,5 @@ -<?php -/** - * @var Module_ModuleController $controller - * @var int $count - * @var int $page - */ -?> - <?= $controller->jsUrl() ?> <table class="default collapsable"> - <colgroup> - <col> - <col> - <col> - <col> - <col style="width: 150px"> - <col style="width: 70px"> - </colgroup> <caption> <?= _('Module')?> <span class="actions"><?= sprintf(ngettext('%s Modul', '%s Module', $count), $count) ?></span> @@ -26,10 +10,10 @@ <?= $controller->renderSortLink('module/module/', _('Modul'), 'bezeichnung') ?> <?= $controller->renderSortLink('module/module/', _('Fassung'), 'fassung_nr', ['style' => 'width: 5%;']) ?> <?= $controller->renderSortLink('module/module/', _('Modulteile'), 'count_modulteile', ['style' => 'width: 5%;']) ?> - <th style="text-align: center;"> + <th style="text-align: right; width: 150px;"> <?= _('Ausgabesprachen') ?> </th> - <th style="text-align: right;"><?= _('Aktionen') ?></th> + <th style="width: 5%; text-align: right;"><?= _('Aktionen') ?></th> </tr> </thead> <?= $this->render_partial('module/module/module') ?> diff --git a/app/views/module/module/modul.php b/app/views/module/module/modul.php index 8fe49c83d3603983e25b9bf75babd8f74ea20f56..e209a1808b4bee1afe338827260c23784e762ffb 100644 --- a/app/views/module/module/modul.php +++ b/app/views/module/module/modul.php @@ -1,29 +1,9 @@ -<?php -/** - * @var Module_ModuleController $controller - * @var Modul $modul - * @var ModulDeskriptor $deskriptor - * @var string $display_language - * @var boolean $def_lang - * @var QuickSearch $search_modul - * @var string $qs_id_module - * @var Semester[] $semester - * @var QuickSearch $search_responsible - * @var string $qs_id_responsible - * @var QuickSearch $search_institutes - * @var string $qs_id_institutes - * @var SimpleORMapCollection $contacts - * @var array $translations - * @var string $cancel_url - */ -?> - <? use Studip\Button, Studip\LinkButton; ?> <?= $controller->jsUrl() ?> <? $perm = MvvPerm::get($modul); $perm_d = MvvPerm::get($deskriptor); -if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) { +if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) { $perm_d->setVariant($display_language); } ?> @@ -164,12 +144,12 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) { <?= _('Beschlussdatum:') ?> <? if ($perm->haveFieldPerm('beschlussdatum')) : ?> <input type="text" name="beschlussdatum" - value="<?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?>" + value="<?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?>" placeholder="<?= _('TT.MM.JJJJ') ?>" class="with-datepicker"> <? else : ?> - <?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?> + <?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?> <input type="hidden" name="beschlussdatum" - value="<?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?>"> + value="<?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?>"> <? endif; ?> </label> <label for="mvv-field-modul-fassung_nr"><?= _('Fassung:') ?> @@ -216,7 +196,7 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) { </div> <div id="mvv-field-modul-beschlussdatum"> <? printf(_('Beschlussdatum: %s'), - $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : _('nicht angegeben')) ?> + $modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : _('nicht angegeben')) ?> </div> <div id="mvv-field-modul-fassung_nr"> <? @@ -464,17 +444,6 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) { <? endif; ?> </label> - <? if ($def_lang && !$modul->isNew()) : ?> - <label id="mvv-field-modul-original_language"><?= _('Originalsprache der Modulbeschreibung') ?> - <select name="original_language" id="original_language"> - <? foreach (Config::get()->CONTENT_LANGUAGES as $language_code => $content_language) : ?> - <option value="<?= htmlReady($language_code) ?>"<?= $modul->original_language === $language_code ? ' selected' : '' ?>> - <?= htmlReady($content_language['name']) ?> - </option> - <? endforeach ?> - </select> - </label> - <? endif ?> </fieldset> <fieldset class="collapsable collapsed" id="mvv-field-modul-assigned_users"> @@ -688,7 +657,7 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) { $entry->datafield_id, $entry->range_id, $entry->sec_range_id, - $display_language === Config::get()->MVV_DEFAULT_LANGUAGE ? '' : $display_language + $language == 'de_DE' ? '' : $language ]); ?> <? else : ?> <? $df = $entry; ?> @@ -725,6 +694,6 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) { </form> <? if (!$def_lang) : ?> <script> - jQuery('#modul_form').find('textarea, input[type=text]').after('<div style="padding-top:10px;"><a href="#" title="<?= _('Originalfassung anzeigen') ?>" class="mvv-show-original" data-type="modul"><?= Assets::img(MVV::getContentLanguageImagePath($modul->original_language), ['alt' => _('Originalfassung'), 'size' => 24]) ?></a></div>'); + jQuery('#modul_form').find('textarea, input[type=text]').after('<div style="padding-top:10px;"><a href="#" title="<?= _('Originalfassung anzeigen') ?>" class="mvv-show-original" data-type="modul"><?= Assets::img(MVV::getContentLanguageImagePath($modul->getDefaultLanguage()), ['alt' => _('Originalfassung'), 'size' => 24]) ?></a></div>'); </script> <? endif; ?> diff --git a/app/views/module/module/module.php b/app/views/module/module/module.php index 851aabdb1b56b09204b93425e4368da8ad003345..d6cda88fdf11408f1d35b1f38ae29a65cde35388 100644 --- a/app/views/module/module/module.php +++ b/app/views/module/module/module.php @@ -1,9 +1,3 @@ -<?php -/** - * @var Modul[] $module - */ -?> - <? foreach ($module as $modul) : ?> <? $perm = MvvPerm::get($modul) ?> <tbody class="<?= $modul->count_modulteile ? '' : 'empty ' ?><?= $modul_id === $modul->getId() ? 'not-collapsed' : 'collapsed' ?>"> @@ -35,13 +29,13 @@ <? endif;?> </td> <? else : ?> - <td style="white-space:nowrap; font-weight: 700; padding-left: 20px;"> + <td style="white-space:nowrap;"> <? if ($ampel_icon) : ?> <?= $ampel_icon->asImg(['title' => $ampelstatus, 'style' => 'vertical-align: text-top;']) ?> <? endif; ?> <?= htmlReady($modul->code) ?> </td> - <td class="dont-hide" style="font-weight: 700;"> + <td class="dont-hide" style="font-weight: bold;"> <?= htmlReady($modul->getDisplayName()) ?> </td> <? endif; ?> @@ -49,12 +43,11 @@ <td style="text-align: center;" class="dont-hide"><?= $modul->count_modulteile ?></td> <td class="dont-hide actions" style="text-align: center;"> <? if ($perm->havePermRead()) : ?> - <? $languages = $modul->deskriptoren->getAvailableTranslations($modul->original_language); ?> - <? $content_languages = Config::get()->CONTENT_LANGUAGES ?> + <? $languages = $modul->deskriptoren->getAvailableTranslations(); ?> <? foreach ($languages as $language) : ?> + <? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?> <a href="<?= $controller->action_link('modul/' . $modul->id . '/', ['display_language' => $language]) ?>"> - <?= Assets::img(MVV::getContentLanguageImagePath($language), - ['alt' => $content_languages[$language]['name'], 'size' => 24]) ?> + <?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?> </a> <? endforeach; ?> <? endif; ?> diff --git a/app/views/module/module/select_module_language.php b/app/views/module/module/select_module_language.php deleted file mode 100644 index 2e411abee5ba6fae8649bea56710cd157c35af30..0000000000000000000000000000000000000000 --- a/app/views/module/module/select_module_language.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/** - * @var Module_ModuleController $controller - * @var array $languages - */ -?> - -<ul class="content-items" style="padding-top: 10px;"> - <? foreach ($languages as $language) : ?> - <li class="content-item"> - <a class="content-item-link" href="<?= $controller->modulURL(['display_language' => $language['code']]) ?>"> - <div class="content-item-img-wrapper"> - <?= Assets::img('/images/languages/' . $language['picture'], ['size' => 64]) ?> - </div> - <div class="content-item-text"> - <p class="content-item-title"> - <?= htmlReady($language['name']) ?> - </p> - <p class="content-item-description"> - <? printf(_('Erstellen Sie ein Modul in der Originalsprache <em>%s</em>.'), $language['name']) ?> - </p> - </div> - </a> - </li> - <? endforeach ?> -</ul> diff --git a/app/views/shared/deskriptor_language.php b/app/views/shared/deskriptor_language.php index dde61204db42a39ab6aa3b3b7cd5815782005dc6..44cdb6502f3772cef416a539e7fa8377205c1558 100644 --- a/app/views/shared/deskriptor_language.php +++ b/app/views/shared/deskriptor_language.php @@ -1,21 +1,11 @@ -<?php -/** - * @var ModulDeskriptor|ModulteilDeskriptor $descriptor - * @var string $original_language - * @var string $display_language - * @var string $link - */ -?> - -<? $languages = $descriptor->getAvailableTranslations($original_language) ?> -<? $content_languages = array_merge(array_flip($languages), Config::get()->CONTENT_LANGUAGES) ?> -<? foreach ($content_languages as $code => $language) : ?> +<? $table = get_class($modul) == 'Modul' ? 'mvv_modul_deskriptor' : 'mvv_modulteil_deskriptor'; ?> +<? $languages = $modul->deskriptoren->getAvailableTranslations(); ?> +<? foreach ($GLOBALS[strtoupper($table)]['SPRACHE']['values'] as $lang => $value) : ?> <div style="padding-top:10px;"> - <a href="<?= URLHelper::getLink($link, ['display_language' => $code]) ?>"> - <?= Assets::img(MVV::getContentLanguageImagePath($code), ['alt' => $language['name'], 'size' => 24]) ?> - <?= $language['name'] ?> (<?= ($code === $original_language ? 'Originalfassung, ' : '') - . (in_array($code, $languages) ? 'bearbeiten' : 'neu anlegen') ?>) - <?= $code === $display_language ? Icon::create('accept', Icon::ROLE_ACCEPT) : '' ?> + <a href="<?= URLHelper::getLink($link, ['display_language' => $lang]) ?>"> + <?= Assets::img(MVV::getContentLanguageImagePath($lang), ['alt' => $value['name'], 'size' => 24]) ?> + <?= $value['name'] ?> (<?= in_array($lang, $languages) ? 'bearbeiten' : 'neu anlegen' ?>) + <?= $lang == $sprache ? Icon::create('accept', 'accept', [])->asImg() : '' ?> </a> </div> -<? endforeach ?> +<? endforeach; ?> diff --git a/app/views/shared/modul/description.php b/app/views/shared/modul/description.php index 7acb014f942c61cfa19ebfc0c8fda8ac7f665b86..59512bd94ea5c5b7f21481c55fb3e42651900210 100644 --- a/app/views/shared/modul/description.php +++ b/app/views/shared/modul/description.php @@ -1,15 +1,7 @@ -<?php -/** - * @var Modul $modul - * @var int $type - * @var Shared_ModulController $controller - */ -?> - <? if (count($modul->deskriptoren) > 1): ?> <div style="width: 100%; text-align: right;"> - <? foreach ($modul->deskriptoren->getAvailableTranslations($modul->original_language) as $language) : ?> - <? $lang = Config::get()->CONTENT_LANGUAGES[$language]; ?> + <? foreach ($modul->deskriptoren->getAvailableTranslations() as $language) : ?> + <? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?> <a data-dialog="size=auto;title='<?= htmlReady($modul->getDisplayName()) ?>'" href="<?= $controller->action_link('description/' . $modul->id . '/', ['display_language' => $language]) ?>"> <?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?> </a> @@ -27,4 +19,4 @@ <? endif; ?> <? if ($type === 3) : ?> <?= $this->render_partial('shared/modul/_modul_ohne_lv') ?> -<? endif; ?> +<? endif; ?> \ No newline at end of file diff --git a/app/views/shared/modul/overview.php b/app/views/shared/modul/overview.php index be91c7a6a181d4f3470fd995a6d84d55e4f0b65e..4bfd71efced6e1bfeaf1ad9de008c0e0504e1b02 100644 --- a/app/views/shared/modul/overview.php +++ b/app/views/shared/modul/overview.php @@ -1,15 +1,3 @@ -<?php -/** - * @var Modul $modul - * @var Institute $institut - * @var ModulDeskriptor $deskriptor - * @var array $modulteile - * @var Semester $semester - * @var string $pruef_ebene - * @var int $type - */ -?> - <table class="default mvv-modul-details nohover"> <tr> <th class="mvv-modul-details-head" style="width: 30%"><?= htmlReady($modul->code) ?></th> @@ -46,10 +34,10 @@ <tr> <td colspan="4" style="padding: 0;"> <table class="default nohover"> - <? if (mb_strlen($deskriptor->voraussetzung) > 0): ?> + <? if (mb_strlen($teilnahmeVoraussetzung) > 0): ?> <tr> <td style="width: 20%; font-weight: bold;"><?= _('Teilnahmevoraussetzungen') ?></td> - <td ><?= formatReady($deskriptor->voraussetzung) ?></td> + <td ><?= formatReady($teilnahmeVoraussetzung) ?></td> </tr> <? endif; ?> <? if (mb_strlen($deskriptor->kommentar)) : ?> @@ -116,7 +104,7 @@ <th><?= _('Prüfungsleistung') ?></th> <? endif; ?> </tr> - <? foreach ($modulteile as $modul_teil): ?> + <? foreach ($modulTeile as $modul_teil): ?> <tr> <? if ($type === 1): ?> <td> diff --git a/config/mvv_config.php b/config/mvv_config.php index 79ee9157bfb9d61120108c3f9d186b5ada8700c3..dae7c5d7c15e6bcbf36518b2036a2694372a182a 100644 --- a/config/mvv_config.php +++ b/config/mvv_config.php @@ -114,6 +114,17 @@ $GLOBALS['MVV_MODUL']['INSTITUT_GRUPPEN'] = [ ] ]; +// Moduldeskriptor Ausgabesprache +$GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE'] = [ + 'values' => [ + 'DE' => ['visible' => 1, 'name' => _('Originalfassung'), 'content_language' => 'de_DE'], + 'EN' => ['visible' => 1, 'name' => _('Englisch'), 'content_language' => 'en_GB'] + // 'de_DE' => array('visible' => 1, 'name' => _('Originalfassung')), + // 'en_GB' => array('visible' => 1, 'name' => _('Englisch')) + ], + 'default' => 'DE' +]; + // Modulteile $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG'] = [ 'values' => [ @@ -190,6 +201,9 @@ $GLOBALS['MVV_MODULTEIL']['LERNLEHRFORM'] = [ 'default' => '' ]; +// Modulteildeskriptor +$GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE'] = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']; + // Maximale Anzahl Fachsemester $GLOBALS['MVV_MODULTEIL_FACHSEMESTER'] = 10; @@ -216,6 +230,16 @@ $GLOBALS['MVV_STGTEILVERSION']['STATUS'] = $GLOBALS['MVV_MODUL']['STATUS']; $GLOBALS['MVV_STGTEIL']['STATUS'] = $GLOBALS['MVV_MODUL']['STATUS']; +$GLOBALS['MVV_LANGUAGES'] = [ + 'values' => [ + 'DE' => ['visible' => 1, 'name' => _('Deutsch'), + 'locale' => 'de_DE'], + 'EN' => ['visible' => 1, 'name' => _('Englisch'), + 'locale' => 'en_GB'] + ], + 'default' => 'DE' +]; + $GLOBALS['MVV_STUDIENGANG']['FASSUNG_TYP'] = $GLOBALS['MVV_STGTEILVERSION']['FASSUNG_TYP']; $GLOBALS['MVV_STUDIENGANG']['STUDYCOURSE_TYPE'] = [ diff --git a/db/migrations/6.0.36_step_4261.php b/db/migrations/6.0.36_step_4261.php deleted file mode 100644 index 0e5fe3953686bedb531c093ecb61f10e1e1cdbfb..0000000000000000000000000000000000000000 --- a/db/migrations/6.0.36_step_4261.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php - -final class Step4261 extends Migration -{ - public function description() - { - return 'Add field to module table to store original language.'; - } - - protected function up() - { - $db = DBManager::get(); - - // retrieve default language from config - $config_language = $db->fetchColumn( - "SELECT `value` FROM `config` WHERE `field` = 'DEFAULT_LANGUAGE'" - ); - $default_language = $config_language ?? array_keys($GLOBALS['CONTENT_LANGUAGES'])[0] ?? 'de_DE'; - $db->execute( - 'ALTER TABLE `mvv_modul` - ADD `original_language` VARCHAR(10) NOT NULL DEFAULT ? COLLATE latin1_bin AFTER `verantwortlich`', - [$default_language] - ); - - $query = "INSERT INTO `config` (`field`, `value`, `type`, `range`, `section`, `mkdate`, `chdate`, `description`) - VALUES ('MVV_DEFAULT_LANGUAGE', ?, 'string', 'global', 'mvv', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), ?)"; - $db->execute($query, - [ - $default_language, - 'Code der Inhalts-Sprache, die als Original-Sprache der Deskriptoren für Module und Modulteile vorausgewählt ist.', - ] - ); - } - - protected function down() - { - $db = DBManager::get(); - - $db->exec( - "ALTER TABLE `mvv_modul` - DROP COLUMN `original_language`" - ); - - $query = "DELETE `config`, `config_values` - FROM `config` - LEFT JOIN `config_values` USING (`field`) - WHERE `field` = 'MVV_DEFAULT_LANGUAGE'"; - $db->exec($query); - } -} diff --git a/lib/classes/MVV.php b/lib/classes/MVV.php index 83568a90bf29909cef23e2e3f45c21b45934a58e..b4d9edf6eec9101e18662df2e4f16eaec1332145 100644 --- a/lib/classes/MVV.php +++ b/lib/classes/MVV.php @@ -834,7 +834,7 @@ class MVV implements Loggable { } /** - * Returns image path for given language, used by MVV + * Returns imagepath for given language, used by MVV * First tries $GLOBALS['CONTENT_LANGUAGES'], if not defined returns hardcoded path * * @param string $language e.g. 'DE' @@ -842,8 +842,8 @@ class MVV implements Loggable { */ public static function getContentLanguageImagePath($language): string { - $code = strtok($language, '_'); - return 'languages/' . ($GLOBALS['CONTENT_LANGUAGES'][$language]['picture'] ?? 'lang_' . mb_strtolower($code) . '.gif'); + $content_language = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]['content_language']; + return 'languages/' . ($GLOBALS['CONTENT_LANGUAGES'][$content_language]['picture'] ?? 'lang_' . mb_strtolower($language) . '.gif'); } } diff --git a/lib/models/Lvgruppe.php b/lib/models/Lvgruppe.php index 6f82215dd460fa6ab8808b4a82236f8fa86efd40..5e9eb7bef4780404d94bbd6d720c5cd08cdcdcbd 100644 --- a/lib/models/Lvgruppe.php +++ b/lib/models/Lvgruppe.php @@ -583,7 +583,9 @@ class Lvgruppe extends ModuleManagementModelTreeItem $modul = Modul::find($modul_id); if ($modul) { $name = $modul->responsible_institute->institute->getShortName(); - $short_name_modul = $modul->getDeskriptor()->bezeichnung_kurz; + $short_name_modul = $modul->getDeskriptor( + $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default']) + ->bezeichnung_kurz; $name .= $short_name_modul ? ' ' . $short_name_modul : ''; } * @@ -592,6 +594,7 @@ class Lvgruppe extends ModuleManagementModelTreeItem $modulteil = Modulteil::findCached($modulteil_id); if ($modulteil) { $name = $modulteil->getDeskriptor()->bezeichnung; + //$name = $name_modulteil ? ' ' . $name_modulteil : ''; } return $name; } diff --git a/lib/models/Modul.php b/lib/models/Modul.php index 70ffad6ccaccd36be64123d7afa1205175c6ab50..31f4bbec7f0f775d296d3862dcec2598f550de66 100644 --- a/lib/models/Modul.php +++ b/lib/models/Modul.php @@ -36,7 +36,6 @@ * @property string|null $stat database column * @property string|null $kommentar_status database column * @property string|null $verantwortlich database column - * @property string $original_language database column * @property string $author_id database column * @property string $editor_id database column * @property int $mkdate database column @@ -384,12 +383,14 @@ class Modul extends ModuleManagementModelTreeItem * previously set by ApplicationSimpleORMap::setLanguage() or the one * defined as default in mvv_config.php. */ - private function setDefaultLanguage(): void + private function setDefaultLanguage() { - if ($this->isNew()) { - $this->default_language = Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE; + if (isset($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'] + [ModuleManagementModel::getLanguage()])) { + $this->default_language = ModuleManagementModel::getLanguage(); } else { - $this->default_language = $this->original_language; + $this->default_language = + $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default']; } } @@ -404,13 +405,18 @@ class Modul extends ModuleManagementModelTreeItem } /** - * Returns the descriptor. If this component has no descriptor already - * a new one is created and returned. + * Returns the Deskriptor in the given language. A Modul has always a + * Deskriptor in the default language. If the given language is unknown, the + * method returns the deskriptor in the default language. * - * @return ModulDeskriptor The descriptor. + * @param string $language The id of the language + * @param bool If true returns always a new descriptor + * @return object The Deskriptor. */ - public function getDeskriptor() - { + public function getDeskriptor($language = null, $force_new = false) { + if (!isset($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language])) { + $language = $this->default_language; + } if (!$this->deskriptoren) { // the module is new and has no descriptor // return a new descriptor in the default language @@ -475,7 +481,7 @@ class Modul extends ModuleManagementModelTreeItem /** * Assignes languages of instruction to this part-module. * - * @param array $languages An array of language keys defined in mvv_config.php. + * @param type $languages An array of language keys defined in mvv_config.php. */ public function assignLanguagesOfInstruction($languages) { diff --git a/lib/models/ModulDeskriptor.php b/lib/models/ModulDeskriptor.php index 9f48fc2caa0efaca4f1e8920ac2d74bab4ca96be..5a3d07152cf27d030a2179dcbb685d3dde9b4bed 100644 --- a/lib/models/ModulDeskriptor.php +++ b/lib/models/ModulDeskriptor.php @@ -140,13 +140,12 @@ class ModulDeskriptor extends ModuleManagementModel * @see ModuleManagementModel::getVariant() * @return string The language identifier. */ - public function getVariant(): string + public function getVariant() { - if (self::getLanguage() === Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE) { + if (self::getLanguage() == $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default']) { return ''; } - $splitted_code = explode('_', self::getLanguage()); - return mb_strtoupper($splitted_code[0] ?? ''); + return self::getLanguage(); } /** @@ -157,6 +156,7 @@ class ModulDeskriptor extends ModuleManagementModel */ public function deleteTranslation($language) { - return I18NString::removeAllTranslations($this->id, 'mvv_modul_deskriptor', $language); + $locale = $GLOBALS['MVV_LANGUAGES']['values'][$language]['locale']; + return I18NString::removeAllTranslations($this->id, 'mvv_modul_deskriptor', $locale); } } diff --git a/lib/models/ModuleManagementModel.php b/lib/models/ModuleManagementModel.php index 88b264f6008107f5a841922195915bfc6eaecd15..3bd5eb75b4fde2be9ba1572742d050fa8d90879d 100644 --- a/lib/models/ModuleManagementModel.php +++ b/lib/models/ModuleManagementModel.php @@ -725,26 +725,25 @@ abstract class ModuleManagementModel extends SimpleORMap implements ModuleManage */ public static function setContentLanguage($language) { - if (!is_array(Config::get()->CONTENT_LAGUAGES[$language])) { + if (!is_array($GLOBALS['MVV_LANGUAGES']['values'][$language])) { throw new InvalidArgumentException(); } - I18NString::setContentLanguage($language); + $locale = $GLOBALS['MVV_LANGUAGES']['values'][$language]['locale']; + I18NString::setContentLanguage($locale); self::$language = $language; } - public function getAvailableTranslations(string $original_language): array + public function getAvailableTranslations() { - $translations = []; + $translations[] = $GLOBALS['MVV_LANGUAGES']['default']; $stmt = DBManager::get()->prepare('SELECT DISTINCT `lang` ' . 'FROM i18n ' . 'WHERE `object_id` = ? AND `table` = ?'); $stmt->execute([$this->id, $this->db_table()]); - $languages = array_merge([$original_language], - $stmt->fetchAll(PDO::FETCH_COLUMN)); - $content_languages = Config::get()->CONTENT_LANGUAGES; - foreach ($languages as $code) { - if (is_array($content_languages[$code])) { - $translations[] = $code; + foreach ($stmt->fetchAll() as $locale) { + $language = mb_strtoupper(mb_strstr($locale['lang'], '_', true)); + if (is_array($GLOBALS['MVV_LANGUAGES']['values'][$language])) { + $translations[] = $language; } } return $translations; diff --git a/lib/models/Modulteil.php b/lib/models/Modulteil.php index cc992afa38b11b2d67cf3c7efd695fb22bc93d98..3b8f146de6fc2138bd2a38754e8f480976f4e080 100644 --- a/lib/models/Modulteil.php +++ b/lib/models/Modulteil.php @@ -114,11 +114,7 @@ class Modulteil extends ModuleManagementModelTreeItem { parent::__construct($id); $this->object_real_name = _('Modulteil'); - if ($this->modul) { - $this->default_language = $this->modul->original_language; - } else { - $this->default_language = Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE; - } + $this->default_language = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default']; } /** @@ -169,7 +165,7 @@ class Modulteil extends ModuleManagementModelTreeItem public function getDisplayName() { - $deskriptor = $this->getDeskriptor(); + $deskriptor = $this->getDeskriptor(self::getLanguage()); $template = Config::get()->MVV_TEMPLATE_NAME_MODULTEIL; if (trim($template)) { $placeholders = [ @@ -214,12 +210,19 @@ class Modulteil extends ModuleManagementModelTreeItem } /** - * Returns the descriptor. If this component has no descriptor already - * a new one is created and returned. + * Returns the Deskriptor in the given language. A Modul has always a + * Deskriptor in the default language. If the given language is unknown, the + * method returns the deskriptor in the default language. * - * @return ModulteilDeskriptor The descriptor. + * @param string $language The id of the language + * @param bool If true returns always a new descriptor + * @return object The Deskriptor. */ - public function getDeskriptor() { + public function getDeskriptor($language = null, $force_new = false) { + if (!isset($GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$language])) { + $language = $this->default_language; + } + if (!$this->deskriptoren) { // the module is new and has no descriptor // return a new descriptor in the default language diff --git a/lib/models/ModulteilDeskriptor.php b/lib/models/ModulteilDeskriptor.php index ebe5026f9d5ff14f2c5205746b01c9f4019e8469..aa6ddf7054bd7b287a30cc347c6c85fce0c9368e 100644 --- a/lib/models/ModulteilDeskriptor.php +++ b/lib/models/ModulteilDeskriptor.php @@ -114,13 +114,12 @@ class ModulteilDeskriptor extends ModuleManagementModel * @see ModuleManagementModel::getVariant() * @return string The language identifier. */ - public function getVariant(): string + public function getVariant() { - if (self::getLanguage() === Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE) { + if (self::getLanguage() == $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['default']) { return ''; } - $splitted_code = explode('_', self::getLanguage()); - return mb_strtoupper($splitted_code[0] ?? ''); + return self::getLanguage(); } /** @@ -131,6 +130,7 @@ class ModulteilDeskriptor extends ModuleManagementModel */ public function deleteTranslation($language) { - return I18NString::removeAllTranslations($this->id, 'mvv_modulteil_deskriptor', $language); + $locale = $GLOBALS['MVV_LANGUAGES']['values'][$language]['locale']; + return I18NString::removeAllTranslations($this->id, 'mvv_modulteil_deskriptor', $locale); } }