From a163c40aedfaa9257bbd8e403c4cfdbd4463b31e Mon Sep 17 00:00:00 2001
From: Dennis Benz <dennis.benz@uni-osnabrueck.de>
Date: Fri, 8 Sep 2023 13:42:11 +0000
Subject: [PATCH] Fix course name localization in external sites, fixes #2697

Closes #2697

Merge request studip/studip!1911
---
 .../ExternModuleLecturedetails.class.php      | 23 ++++++++++---------
 .../ExternModuleTemplateLectures.class.php    |  9 ++++----
 ...xternModuleTemplatePersondetails.class.php | 13 +++++++----
 .../ExternModuleTemplateSemBrowse.class.php   | 16 +++++++------
 .../modules/views/ExternSemBrowse.class.php   |  5 ++--
 .../views/ExternSemBrowseTable.class.php      | 11 +++++----
 .../modules/views/persondetails.inc.php       |  4 +++-
 lib/language.inc.php                          |  1 +
 8 files changed, 47 insertions(+), 35 deletions(-)

diff --git a/lib/extern/modules/ExternModuleLecturedetails.class.php b/lib/extern/modules/ExternModuleLecturedetails.class.php
index 9dbe2a328c9..379d3fec3fc 100644
--- a/lib/extern/modules/ExternModuleLecturedetails.class.php
+++ b/lib/extern/modules/ExternModuleLecturedetails.class.php
@@ -141,11 +141,12 @@ class ExternModuleLecturedetails extends ExternModule {
         $visible = $this->config->getValue("Main", "visible");
         $j = -1;
         if ($row !== false) {
+            $sem_object = Seminar::getInstance($this->seminar_id);
 
-            $data["name"] = htmlReady($row['Name']);
+            $data["name"] = htmlReady($sem_object->name);
 
             if ($visible[++$j] && $row['Untertitel'])
-                $data["subtitle"] = htmlReady($row['Untertitel']);
+                $data["subtitle"] = htmlReady($sem_object->untertitel);
 
             if ($visible[++$j]) {
                 if (!$name_sql = $this->config->getValue("Main", "nameformat"))
@@ -170,7 +171,7 @@ class ExternModuleLecturedetails extends ExternModule {
             }
 
             if ($visible[++$j] && $row['art'])
-                $data["art"] = htmlReady($row['art']);
+                $data["art"] = htmlReady($sem_object->art);
 
             if ($visible[++$j]) {
                 // reorganize the $SEM_TYPE-array
@@ -193,20 +194,20 @@ class ExternModuleLecturedetails extends ExternModule {
             }
 
             if ($visible[++$j] && $row['Beschreibung'])
-                $data["description"] = formatLinks($row['Beschreibung']);
+                $data["description"] = formatLinks($sem_object->beschreibung);
 
             if ($visible[++$j])
-                $data["location"] = htmlReady(Seminar::getInstance($this->seminar_id)->getDatesTemplate('dates/seminar_export_location'));
+                $data["location"] = htmlReady($sem_object->getDatesTemplate('dates/seminar_export_location'));
 
             if ($visible[++$j])
                 $data["semester"] = get_semester($this->seminar_id);
 
             if ($visible[++$j]) {
-                $data["time"] = htmlReady(Seminar::getInstance($this->seminar_id)->getDatesExport());
+                $data["time"] = htmlReady($sem_object->getDatesExport());
                 if ($first_app = vorbesprechung($this->seminar_id, 'export')) {
                     $data["time"] .= "<br>" . $this->config->getValue("Main", "aliaspredisc") . htmlReady($first_app);
                 }
-                if ($begin = Seminar::getInstance($this->seminar_id)->getFirstDate('export')) {
+                if ($begin = $sem_object->getFirstDate('export')) {
                     $data["time"] .= "<br>" . $this->config->getValue("Main", "aliasfirstmeeting") . htmlReady($begin);
                 }
             }
@@ -215,16 +216,16 @@ class ExternModuleLecturedetails extends ExternModule {
                 $data["number"] = htmlReady($row['VeranstaltungsNummer']);
 
             if ($visible[++$j] && $row['teilnehmer'])
-                $data["teilnehmer"] = htmlReady($row['teilnehmer']);
+                $data["teilnehmer"] = htmlReady($sem_object->teilnehmer);
 
             if ($visible[++$j] && $row['vorrausetzungen'])
-                $data["requirements"] = htmlReady($row['vorrausetzungen']);
+                $data["requirements"] = htmlReady($sem_object->vorrausetzungen);
 
             if ($visible[++$j] && $row['lernorga'])
-                $data["lernorga"] = htmlReady($row['lernorga']);
+                $data["lernorga"] = htmlReady($sem_object->lernorga);
 
             if ($visible[++$j] && $row['leistungsnachweis'])
-                $data["leistung"] = htmlReady($row['leistungsnachweis']);
+                $data["leistung"] = htmlReady($sem_object->leistungsnachweis);
 
             if ($visible[++$j]) {
                 $range_path_level = $this->config->getValue("Main", "rangepathlevel");
diff --git a/lib/extern/modules/ExternModuleTemplateLectures.class.php b/lib/extern/modules/ExternModuleTemplateLectures.class.php
index f7b2b1da043..dc7ed295ce0 100644
--- a/lib/extern/modules/ExternModuleTemplateLectures.class.php
+++ b/lib/extern/modules/ExternModuleTemplateLectures.class.php
@@ -447,7 +447,8 @@ class ExternSemBrowseTemplate extends SemBrowse {
                 if (is_array($sem_ids['Seminar_id'])) {
                     $j = 0;
                     foreach(array_keys($sem_ids['Seminar_id']) as $seminar_id) {
-                        $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['TITLE'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['Name']));
+                        $sem_object = Seminar::GetInstance($seminar_id);
+                        $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['TITLE'] = ExternModule::ExtHtmlReady($sem_object->name);
 
                         $sem_number_start = key($sem_data[$seminar_id]['sem_number']);
                         $sem_number_end = key($sem_data[$seminar_id]['sem_number_end']);
@@ -459,7 +460,7 @@ class ExternSemBrowseTemplate extends SemBrowse {
                         $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['SEMESTER'] = $sem_semester;
 
                         // create turnus field
-                        $sem_turnus = Seminar::getInstance($seminar_id)->getDatesExport(['show_room' => true]);
+                        $sem_turnus = $sem_object->getDatesExport(['show_room' => true]);
 
                         $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['CYCLE'] = ExternModule::ExtHtmlReady($sem_turnus);
 
@@ -491,13 +492,13 @@ class ExternSemBrowseTemplate extends SemBrowse {
 
                         $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['LECTUREDETAILS-HREF'] = $this->module->elements['LinkInternLecturedetails']->createUrl(['link_args' => 'seminar_id=' . $seminar_id]);
                         $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['NUMBER'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['VeranstaltungsNummer']));
-                        $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['SUBTITLE'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['Untertitel']));
+                        $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['SUBTITLE'] = ExternModule::ExtHtmlReady($sem_object->untertitel);
                         $aliases_sem_type = $this->module->config->getValue('ReplaceTextSemType', 'class_' . $SEM_TYPE[key($sem_data[$seminar_id]['status'])]['class']);
                         $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['SEMTYPE-SUBSTITUTE'] = $aliases_sem_type[$this->sem_types_position[key($sem_data[$seminar_id]['status'])] - 1];
                         $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['SEMTYPE'] = ExternModule::ExtHtmlReady($SEM_TYPE[key($sem_data[$seminar_id]['status'])]['name']
                                     .' ('. $SEM_CLASS[$SEM_TYPE[key($sem_data[$seminar_id]['status'])]['class']]['name'] . ')');
                         $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['ROOM'] = ExternModule::ExtHtmlReady(Seminar::getInstance($seminar_id)->getDatesTemplate('dates/seminar_export_location'));
-                        $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['FORM'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['art']));
+                        $content['LECTURES']['GROUP'][$i]['LECTURE'][$j]['FORM'] = ExternModule::ExtHtmlReady($sem_object->art);
 
                         // generic data fields
                         if (is_array($generic_datafields)) {
diff --git a/lib/extern/modules/ExternModuleTemplatePersondetails.class.php b/lib/extern/modules/ExternModuleTemplatePersondetails.class.php
index a3dbd790387..6813e4715cc 100644
--- a/lib/extern/modules/ExternModuleTemplatePersondetails.class.php
+++ b/lib/extern/modules/ExternModuleTemplatePersondetails.class.php
@@ -543,14 +543,15 @@ class ExternModuleTemplatePersondetails extends ExternModule {
             }
         }
 
+        $user_obj = User::find($this->user_id);
         if (Visibility::verify('lebenslauf', $this->user_id)) {
-            $content['PERSONDETAILS']['CV'] = ExternModule::ExtFormatReady($row['lebenslauf']);
+            $content['PERSONDETAILS']['CV'] = ExternModule::ExtFormatReady($user_obj->lebenslauf);
         }
         if (Visibility::verify('schwerp', $this->user_id)) {
-            $content['PERSONDETAILS']['RESEARCH-INTERESTS'] = ExternModule::ExtFormatReady($row['schwerp']);
+            $content['PERSONDETAILS']['RESEARCH-INTERESTS'] = ExternModule::ExtFormatReady($user_obj->schwerp);
         }
         if (Visibility::verify('publi', $this->user_id)) {
-            $content['PERSONDETAILS']['PUBLICATIONS'] = ExternModule::ExtFormatReady($row['publi']);
+            $content['PERSONDETAILS']['PUBLICATIONS'] = ExternModule::ExtFormatReady($user_obj->publi);
         }
 
         $content['PERSONDETAILS']['LECTURES'] = $this->elements['TemplateLectures']->toString(['content' => $this->getContentLectures(), 'subpart' => 'LECTURES']);
@@ -733,10 +734,12 @@ class ExternModuleTemplatePersondetails extends ExternModule {
                 }
                 $k = 0;
                 foreach ($result as $row) {
-                    $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['TITLE'] = ExternModule::ExtHtmlReady($row['Name']);
+                    $sem_object = Seminar::GetInstance($row['Seminar_id']);
+
+                    $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['TITLE'] = ExternModule::ExtHtmlReady($sem_object->name);
                     $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['LECTUREDETAILS-HREF'] = $this->elements['LinkInternLecturedetails']->createUrl(['link_args' => 'seminar_id=' . $row['Seminar_id']]);
                     if (trim($row['Untertitel']) != '') {
-                        $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['SUBTITLE'] = ExternModule::ExtHtmlReady($row['Untertitel']);
+                        $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['SUBTITLE'] = ExternModule::ExtHtmlReady($sem_object->untertitel);
                     }
                     if (trim($row['VeranstaltungsNummer']) != '') {
                         $content['LECTURES']['SEMESTER'][$i]['LECTURE'][$k]['NUMBER'] = ExternModule::ExtHtmlReady($row['VeranstaltungsNummer']);
diff --git a/lib/extern/modules/ExternModuleTemplateSemBrowse.class.php b/lib/extern/modules/ExternModuleTemplateSemBrowse.class.php
index 3ddfd3ee2fb..18a77c0827a 100644
--- a/lib/extern/modules/ExternModuleTemplateSemBrowse.class.php
+++ b/lib/extern/modules/ExternModuleTemplateSemBrowse.class.php
@@ -786,13 +786,15 @@ class ExternModuleTemplateSemBrowse extends ExternModule {
                         $k = 0;
                         $semester = Semester::findAllVisible();
                         foreach (array_keys($sem_ids['Seminar_id'])  as $seminar_id) {
+                            $sem_object = Seminar::GetInstance($seminar_id);
+
                             $content['RESULT']['GROUP'][$j]['COURSE'][$k]['COURSE_ID'] = $seminar_id;
-                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['TITLE'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['Name']));
+                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['TITLE'] = ExternModule::ExtHtmlReady($sem_object->name);
                             $content['RESULT']['GROUP'][$j]['COURSE'][$k]['COURSE-NO'] = $k + 1;
                             $content['RESULT']['GROUP'][$j]['COURSE'][$k]['COURSEDETAILS-HREF'] = $this->elements['LinkInternLecturedetails']->createUrl(['link_args' => 'seminar_id=' . $seminar_id]);
                             $content['RESULT']['GROUP'][$j]['COURSE'][$k]['COURSE_NUMBER'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['VeranstaltungsNummer']));
 
-                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['DESCRIPTION'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['Beschreibung']), true);
+                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['DESCRIPTION'] = ExternModule::ExtHtmlReady($sem_object->beschreibung, true);
 
                             $sem_number_start = key($sem_data[$seminar_id]["sem_number"]);
                             $sem_number_end = key($sem_data[$seminar_id]["sem_number_end"]);
@@ -809,13 +811,13 @@ class ExternModuleTemplateSemBrowse extends ExternModule {
                                 $content['RESULT']['GROUP'][$j]['COURSE'][$k]['NO_DATES_TEXT'] = [];
                             }
 
-                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['SUBTITLE'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['Untertitel']));
+                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['SUBTITLE'] = ExternModule::ExtHtmlReady($sem_object->untertitel);
                             $aliases_sem_type = $this->config->getValue('ReplaceTextSemType', 'class_' . $SEM_TYPE[key($sem_data[$seminar_id]['status'])]['class']);
                             $content['RESULT']['GROUP'][$j]['COURSE'][$k]['SEMTYPE-SUBSTITUTE'] = $aliases_sem_type[$this->sem_types_position[key($sem_data[$seminar_id]['status'])] - 1];
                             $content['RESULT']['GROUP'][$j]['COURSE'][$k]['SEMTYPE'] = ExternModule::ExtHtmlReady($SEM_TYPE[key($sem_data[$seminar_id]['status'])]['name']
                                         .' ('. $SEM_CLASS[$SEM_TYPE[key($sem_data[$seminar_id]['status'])]['class']]['name'] . ')');
-                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['LOCATION'] = ExternModule::ExtHtmlReady(trim(key($sem_data[$seminar_id]['Ort'])));
-                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['FORM'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['art']));
+                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['LOCATION'] = ExternModule::ExtHtmlReady(trim($sem_object->ort));
+                            $content['RESULT']['GROUP'][$j]['COURSE'][$k]['FORM'] = ExternModule::ExtHtmlReady($sem_object->art);
                             $content['RESULT']['GROUP'][$j]['COURSE'][$k]['ECTS'] = ExternModule::ExtHtmlReady(key($sem_data[$seminar_id]['ects']));
 
                             // generic data fields
@@ -1384,7 +1386,8 @@ class ExternModuleTemplateSemBrowse extends ExternModule {
                 if (is_array($sem_ids['Seminar_id'])) {
                     $semester = Semester::findAllVisible();
                     foreach (array_keys($sem_ids['Seminar_id']) as $seminar_id) {
-                        $sem_name = key($sem_data[$seminar_id]["Name"]);
+                        $seminar_obj = new Seminar($seminar_id);
+                        $sem_name = $seminar_obj->name;
                         $seminar_number = key($sem_data[$seminar_id]['VeranstaltungsNummer']);
                         $sem_number_start = key($sem_data[$seminar_id]["sem_number"]);
                         $sem_number_end = key($sem_data[$seminar_id]["sem_number_end"]);
@@ -1395,7 +1398,6 @@ class ExternModuleTemplateSemBrowse extends ExternModule {
                             $sem_name .= ' (' . $semester[$sem_number_start]['name'] . ")";
                         }
                         //create Turnus field
-                        $seminar_obj = new Seminar($seminar_id);
                         // is this sem a studygroup?
                         $studygroup_mode = SeminarCategories::GetByTypeId($seminar_obj->getStatus())->studygroup_mode;
                         if ($studygroup_mode) {
diff --git a/lib/extern/modules/views/ExternSemBrowse.class.php b/lib/extern/modules/views/ExternSemBrowse.class.php
index 4ba487e980f..a5e86db00bc 100644
--- a/lib/extern/modules/views/ExternSemBrowse.class.php
+++ b/lib/extern/modules/views/ExternSemBrowse.class.php
@@ -448,7 +448,8 @@ class ExternSemBrowse extends SemBrowse {
         if (!key($sem_data[$seminar_id]['parent_course']) || !$sem_data[key($sem_data[$seminar_id]['parent_course'])] || $child) {
             extract($table_data);
 
-            $sem_name = key($sem_data[$seminar_id]["Name"]);
+            $sem_object = Seminar::GetInstance($seminar_id);
+            $sem_name = $sem_object->name;
             $sem_number_start = key($sem_data[$seminar_id]["sem_number"]);
             $sem_number_end = key($sem_data[$seminar_id]["sem_number_end"]);
             if ($sem_number_start != $sem_number_end) {
@@ -484,7 +485,7 @@ class ExternSemBrowse extends SemBrowse {
             }
             echo "</td></tr>\n";
             //create Turnus field
-            $temp_turnus_string = Seminar::GetInstance($seminar_id)->getDatesExport(['show_room' => true]);
+            $temp_turnus_string = $sem_object->getDatesExport(['show_room' => true]);
             //Shorten, if string too long (add link for details.php)
             if (mb_strlen($temp_turnus_string) > 70) {
                 $temp_turnus_string = mb_substr($temp_turnus_string, 0,
diff --git a/lib/extern/modules/views/ExternSemBrowseTable.class.php b/lib/extern/modules/views/ExternSemBrowseTable.class.php
index d9c6d11056b..29f8b2f5013 100644
--- a/lib/extern/modules/views/ExternSemBrowseTable.class.php
+++ b/lib/extern/modules/views/ExternSemBrowseTable.class.php
@@ -342,7 +342,8 @@ class ExternSemBrowseTable extends SemBrowse {
 
                 if (is_array($sem_ids['Seminar_id'])) {
                     foreach (array_keys($sem_ids['Seminar_id']) as $seminar_id) {
-                        $sem_name = key($sem_data[$seminar_id]["Name"]);
+                        $sem_object = Seminar::GetInstance($seminar_id);
+                        $sem_name = $sem_object->name;
                         $sem_number_start = key($sem_data[$seminar_id]["sem_number"]);
                         $sem_number_end = key($sem_data[$seminar_id]["sem_number_end"]);
                         if ($sem_number_start != $sem_number_end){
@@ -351,7 +352,7 @@ class ExternSemBrowseTable extends SemBrowse {
                         }
 
                         //create Turnus field
-                        $data["content"]["zeiten"] = Seminar::GetInstance($seminar_id)->getDatesExport(['show_room' => true]);
+                        $data["content"]["zeiten"] = $sem_object->getDatesExport(['show_room' => true]);
                         //Shorten, if string too long
                         if (mb_strlen($data["content"]["zeiten"]) >70) {
                             $data["content"]["zeiten"] = mb_substr($data["content"]["zeiten"], 0,
@@ -390,7 +391,7 @@ class ExternSemBrowseTable extends SemBrowse {
                                 "content" => htmlReady($sem_name)]);
                         $data["content"]["VeranstaltungsNummer"] =
                                 htmlReady(key($sem_data[$seminar_id]["VeranstaltungsNummer"]));
-                        $data["content"]["Untertitel"] = htmlReady(key($sem_data[$seminar_id]["Untertitel"]));
+                        $data["content"]["Untertitel"] = htmlReady($sem_object->untertitel);
 
                         $aliases_sem_type = $this->module->config->getValue("ReplaceTextSemType",
                                 "class_" . $SEM_TYPE[key($sem_data[$seminar_id]["status"])]['class']);
@@ -404,9 +405,9 @@ class ExternSemBrowseTable extends SemBrowse {
                                     ." (". $SEM_CLASS[$SEM_TYPE[key($sem_data[$seminar_id]["status"])]["class"]]["name"].")");
                         }
 
-                        $data["content"]["Ort"] = Seminar::getInstance($seminar_id)->getDatesTemplate('dates/seminar_export_location');
+                        $data["content"]["Ort"] = $sem_object->getDatesTemplate('dates/seminar_export_location');
                         if ($sem_data[$seminar_id]["art"])
-                            $data["content"]["art"] = htmlReady(key($sem_data[$seminar_id]["art"]));
+                            $data["content"]["art"] = htmlReady($sem_object->art);
                         else
                             $data["content"]["art"] = "";
 
diff --git a/lib/extern/modules/views/persondetails.inc.php b/lib/extern/modules/views/persondetails.inc.php
index 0889e1b0ab4..cc186170f31 100644
--- a/lib/extern/modules/views/persondetails.inc.php
+++ b/lib/extern/modules/views/persondetails.inc.php
@@ -140,6 +140,8 @@ if ($generic_datafields = $this->config->getValue("Main", "genericdatafields"))
 //  $datafields = $datafields_obj->getLocalFields($row['user_id']);
 }
 
+$user_obj = User::find($row['user_id']);
+
 $order = $this->config->getValue("Main", "order");
 foreach ($order as $position) {
 
@@ -160,7 +162,7 @@ foreach ($order as $position) {
                     echo "<tr" . $this->config->getAttributes("TableParagraphText", "tr") . ">";
                     echo "<td" . $this->config->getAttributes("TableParagraphText", "td") . ">";
                     echo "$text_div<font" . $this->config->getAttributes("TableParagraphText", "font") . ">\n";
-                    echo formatReady($row[$data_field], TRUE, TRUE);
+                    echo formatReady($user_obj->$data_field, TRUE, TRUE);
                     echo "</font>$text_div_end</td></tr>\n</table>\n</td></tr>\n";
                 }
                 break;
diff --git a/lib/language.inc.php b/lib/language.inc.php
index 921efc0f54a..414f80aa00c 100644
--- a/lib/language.inc.php
+++ b/lib/language.inc.php
@@ -97,6 +97,7 @@ function init_i18n($_language) {
     global $_language_domain, $INSTALLED_LANGUAGES;
     $_language_path = null;
     if (isset($_language_domain) && isset($_language)) {
+        $_SESSION['_language'] = $_language;
         $_language_path = $INSTALLED_LANGUAGES[$_language]["path"];
         setLocaleEnv($_language, $_language_domain);
     }
-- 
GitLab