quizes = &$_quizes; } public function makeTranslatable() { foreach($this->quizes as $k => $v) { // process each H5P activity if(!empty($v["jsonContent"])) { $content_array = json_decode($v["jsonContent"], true); // used to identify strings to translate // error_log(print_r($content_array,true)); // if(empty($v['library'])) { continue; } switch($v['library']) { // process based on H5P activity type and version case "H5P.InteractiveVideo 1.19": $this->addKeysForInteractiveVideo($content_array); break; case "H5P.CoursePresentation 1.19": $this->addKeysForCoursePresentation($content_array); break; case "H5P.QuestionSet 1.15": $this->addKeysForQuestionSet($content_array); break; case "H5P.PersonalityQuiz 1.0": $this->addKeysForPersonalityQuiz($content_array); break; case "H5P.DocumentationTool 1.6": $this->addKeysForDocumentationTool($content_array); break; case "H5P.Essay 1.0": $this->addKeysForEssay($content_array); break; case "H5P.ImagePair 1.4": $this->addKeysForImagePair($content_array); break; case "H5P.Dialogcards 1.6": $this->addKeysForDialogcards($content_array); break; case "H5P.MemoryGame 1.2": $this->addKeysForMemoryGame($content_array); break; case "H5P.Timeline 1.1": $this->addKeysForTimeline($content_array); break; } $this->addKeysFor_l10n($content_array); $this->quizes[$k]["jsonContent"] = json_encode($content_array); } if(!empty($v["metadata"])) { $this->quizes[$k]["metadata"]["gt_translate_keys"] = ["title"]; } $this->quizes[$k]["gt_translate_keys"] = ["title", ["key" => "jsonContent", "format" => "json"]]; } } public function addKeysForCoursePresentation(&$contentArr) { if( !empty($contentArr["presentation"]['slides']) ) { foreach($contentArr["presentation"]['slides'] as $k => $v){ if( !empty($v["elements"]) ) { array_walk($contentArr["presentation"]['slides'][$k]["elements"], function(&$item, $key) { if( !empty($item["action"]) ) $this->addKeysForElementsBasedOnElement( $item["action"] ); }); } } } } public function addKeysForInteractiveVideo(&$contentArr) { if(!empty($contentArr["interactiveVideo"]['assets']) && !empty($contentArr["interactiveVideo"]['assets']['interactions']) ) { array_walk($contentArr["interactiveVideo"]['assets']['interactions'], function(&$item, $key) { $this->addKeysForElementsBasedOnElement( $item["action"] ); }); } if(!empty($contentArr["interactiveVideo"]['assets']) && !empty($contentArr["interactiveVideo"]['assets']['bookmarks']) ) { array_walk($contentArr["interactiveVideo"]['assets']['bookmarks'], function(&$item, $key) { $item["gt_translate_keys"] = ["label"]; }); } if(!empty($contentArr["interactiveVideo"]['summary']) && !empty($contentArr["interactiveVideo"]['summary']['task']) && !empty($contentArr["interactiveVideo"]['summary']['task']['params']) ) { $trans_keys = []; array_walk($contentArr["interactiveVideo"]['summary']['task']['params'], function(&$item, $key) use (&$trans_keys){ if(is_string($item)) $trans_keys[] = $key; }); $contentArr["interactiveVideo"]['summary']['task']['params']["gt_translate_keys"] = $trans_keys; } } public function addKeysForQuestionSet(&$contentArr) { if( !empty($contentArr["texts"]) ) { $contentArr["texts"]["gt_translate_keys"] = array_keys( $contentArr["texts"] ); } if( !empty($contentArr["endGame"]) ) { $contentArr["endGame"]["gt_translate_keys"] = ["finishButtonText", "message", "noResultMessage", "retryButtonText", "skipButtonText", "solutionButtonText"]; } if( !empty($contentArr["introPage"]) ) { $contentArr["introPage"]["gt_translate_keys"] = ["startButtonText"]; } if( !empty($contentArr["questions"]) ) { foreach($contentArr["questions"] as $k => $v) { if(empty($v['library'])) continue; switch($v['library']) { case "H5P.DragQuestion 1.12": $contentArr["questions"][$k]["params"]["gt_translate_keys"] = ["correctAnswer", "dropzonePrefix", "feedbackHeader", "grabbablePrefix", "grabbableSuffix", "noDropzone", "scoreBarLabel", "scoreExplanation", "scoreExplanationButtonLabel", "scoreShow", "tipAvailable", "tipLabel", "tryAgain", "wrongAnswer"]; if(!empty($contentArr["questions"][$k]["params"]["localize"])) { $contentArr["questions"][$k]["params"]["localize"]["gt_translate_keys"] = ["exitFullscreen", "exitFullscreen"]; } if(!empty($contentArr["questions"][$k]["params"]["overallFeedback"])) { foreach($contentArr["questions"][$k]["params"]["overallFeedback"] as $k2 => $v2) $contentArr["questions"][$k]["params"]["overallFeedback"][$k2]["gt_translate_keys"] = ["feedback"]; } if(!empty($contentArr["questions"][$k]["params"]["question"])) { if(!empty($contentArr["questions"][$k]["params"]["question"]["settings"])) { $contentArr["questions"][$k]["params"]["question"]["settings"]["gt_translate_keys"] = ["questionTitle"]; } if(!empty($contentArr["questions"][$k]["params"]["question"]["task"]) && !empty($contentArr["questions"][$k]["params"]["question"]["task"]["dropZones"]) ) { foreach($contentArr["questions"][$k]["params"]["question"]["task"]["dropZones"] as $k2 => $v2) $contentArr["questions"][$k]["params"]["question"]["task"]["dropZones"][$k2]["gt_translate_keys"] = [["key" => "label", "format" => "html"]]; } } break; case "H5P.MarkTheWords 1.8": $contentArr["questions"][$k]["params"]["textField"] = preg_replace('/(\*.[^\*]*\*)/', '$1', $contentArr["questions"][$k]["params"]["textField"] ); //Check this logic, doesn't work properly. $contentArr["questions"][$k]["params"]["gt_translate_keys"] = ["checkAnswerButton", "correctAnswer", "displaySolutionDescription", "incorrectAnswer", "missedAnswer", "scoreBarLabel", "showSolutionButton", "tryAgainButton", ["key" => "taskDescription", "format" => "html"], ["key" => "textField", "format" => "html"]]; break; case "H5P.DragText 1.7": $contentArr["questions"][$k]["params"]["textField"] = preg_replace('/(\*.[^\*]*\*)/', '$1', $contentArr["questions"][$k]["params"]["textField"] ); //Check this logic, doesn't work properly. $contentArr["questions"][$k]["params"]["gt_translate_keys"] = ["cancelledDragging", "checkAnswer", "contains", "correctAnswer", "correctText", "draggableIndex", "dropZoneIndex", "empty", "feedbackHeader", "grabbed", "incorrectText", "resetDropDescription", "resetDropTitle", "scoreBarLabel", "showSolution", "tipLabel", "tryAgain", ["key" => "textField", "format" => "html"], ["key" => "taskDescription", "format" => "html"]]; break; } } } } public function addKeysForPersonalityQuiz(&$contentArr) { $contentArr["gt_translate_keys"] = ["startText", "retakeText", "progressText"]; if( !empty($contentArr["titleScreen"]) && !empty($contentArr["titleScreen"]["title"])) { $contentArr["titleScreen"]["title"]["gt_translate_keys"] = ["text"]; } if( !empty($contentArr["personalities"]) ) { array_walk($contentArr["personalities"], function(&$item, $key) { $item["gt_translate_keys"] = ["name", "description"]; }); } if( !empty($contentArr["questions"]) ) { foreach($contentArr["questions"] as $k => $v) { $contentArr["questions"][$k]["gt_translate_keys"] = ["text"]; if(!empty($contentArr["questions"][$k]["answers"])) { array_walk($contentArr["questions"][$k]["answers"], function(&$item, $key) { $item["gt_translate_keys"] = ["text", "personality"]; }); } } } } public function addKeysForEssay(&$contentArr) { $contentArr["gt_translate_keys"] = ["checkAnswer", "feedbackHeader", "messageSave", "notEnoughChars", "remainingChars", "showSolution", "solutionTitle", "tryAgain", ["key" => "taskDescription", "format" => "html"]]; if( !empty($contentArr["solution"]) ) { $contentArr["solution"]["gt_translate_keys"] = ["introduction", "sample"]; } if( !empty($contentArr["overallFeedback"]) ) { array_walk($contentArr["overallFeedback"], function(&$item, $key) { $item["gt_translate_keys"] = ["feedback"]; }); } if( !empty($contentArr["keywords"]) ) { array_walk($contentArr["keywords"], function(&$item, $key) { $item["gt_translate_keys"] = ["keyword"]; if(isset($item["alternatives"])) $item["gt_translate_keys"][] = ["key" => "alternatives", "format" => "list"]; if(isset($item["options"])) $item["options"]["gt_translate_keys"] = ["feedbackMissed"]; }); } } public function addKeysForImagePair(&$contentArr) { $contentArr["gt_translate_keys"] = ["taskDescription"]; if( !empty($contentArr["cards"]) ) { array_walk($contentArr["cards"], function(&$item, $key) { $item["gt_translate_keys"] = ["imageAlt", "matchAlt"]; }); } } public function addKeysForDocumentationTool(&$contentArr) { if( isset($contentArr["i10n"]) ) { $contentArr["i10n"]["gt_translate_keys"] = array_keys( $contentArr["i10n"] ); } $contentArr["gt_translate_keys"] = ["taskDescription"]; if( !empty($contentArr["pagesList"]) ) { array_walk($contentArr["pagesList"], function(&$item, $key) { $this->addKeysForElementsBasedOnElement( $item ); }); } } public function addKeysForDialogcards(&$contentArr) { $contentArr["gt_translate_keys"] = ["answer", "audioNotSupported", "cardBackLabel", "cardFrontLabel", "next", "prev", "progressText", "retry", "tipButtonLabel", ["key" => "title", "format" => "html"], ["key" => "description", "format" => "html"]]; if( !empty($contentArr["dialogs"]) ) { array_walk($contentArr["dialogs"], function(&$item, $key) { $item["gt_translate_keys"] = [["key" => "answer", "format" => "html"], ["key" => "text", "format" => "html"]]; }); } } public function addKeysForMemoryGame(&$contentArr) { if( !empty($contentArr["cards"]) ) { //array_walk($contentArr["cards"], function(&$item, $key) { $item["gt_translate_keys"] = ["imageAlt"]; }); } } public function addKeysForTimeline(&$contentArr) { $contentArr["timeline"]["gt_translate_keys"] = ["headline", ["key" => "text", "format" => "html"]]; if( !empty($contentArr["timeline"]["era"]) ) { array_walk($contentArr["timeline"]["era"], function(&$item, $key) { $item["gt_translate_keys"] = ["headline"]; }); } if( !empty($contentArr["timeline"]["date"]) ) { array_walk($contentArr["timeline"]["date"], function(&$item, $key) { $item["gt_translate_keys"] = ["headline", ["key" => "text", "format" => "html"]]; }); } } // utility function for string within string private function addKeysForElementsBasedOnElement( &$elem ) { if(empty($elem) || empty($elem['library'])) return; switch($elem['library']) { case "H5P.Link 1.3": $elem['params']["gt_translate_keys"] = ["title"]; break; case "H5P.Summary 1.9": $elem['params']["gt_translate_keys"] = ["labelCorrect", "labelCorrectAnswers", "labelIncorrect", "progressText", "resultLabel", "scoreBarLabel", "scoreLabel", "solvedLabel", ["key" => "intro", "format" => "html"]]; array_walk($elem['params']['summaries'], function(&$item, $key) { $item["gt_translate_keys"] = [["key" => "summary", "format" => "html-list"]]; }); break; case "H5P.GoToQuestion 1.3": $elem['params']["gt_translate_keys"] = ["continueButtonLabel", "text"]; array_walk($elem['params']['choices'], function(&$item, $key) { $item["gt_translate_keys"] = ["text"]; }); break; case "H5P.AdvancedText 1.1": $elem['params']["gt_translate_keys"] = [["key" => "text", "format" => "html"]]; break; case "H5P.Blanks 1.10": $elem['params']["gt_translate_keys"] = ["answerIsCorrect", "answerIsWrong", "answeredCorrectly", "answeredIncorrectly", "checkAnswer", "inputHasTipLabel", "notFilledOut", "inputLabel", "showSolutions", "solutionLabel", "tipLabel", "tryAgain", ["key" => "questions", "format" => "html-list"], ["key" => "text", "format" => "html"]]; if(!empty($elem['params']["confirmCheck"])) { $elem['params']["confirmCheck"]["gt_translate_keys"] = array_keys( $elem['params']["confirmCheck"] ); } if(!empty($elem['params']["confirmRetry"])) { $elem['params']["confirmRetry"]["gt_translate_keys"] = array_keys( $elem['params']["confirmRetry"] ); } if(!empty($elem['params']["questions"])) { array_walk($elem['params']["questions"], function(&$item, $key){ $item = preg_replace('/(\*.[^\*]*\*)/', '$1', $item ); }); } break; case "H5P.MultiChoice 1.12": if( !empty($elem['params']["UI"]) ) { $elem['params']["UI"]["gt_translate_keys"] = array_keys( $elem['params']["UI"] ); } if( !empty($elem['params']["confirmCheck"]) ) { $elem['params']["confirmCheck"]["gt_translate_keys"] = array_keys( $elem['params']["confirmCheck"] ); } if( !empty($elem['params']["confirmRetry"]) ) { $elem['params']["confirmRetry"]["gt_translate_keys"] = array_keys( $elem['params']["confirmRetry"] ); } if( !empty($elem['params']["answers"]) ) { array_walk($elem['params']["answers"], function(&$item, $key) { $item["gt_translate_keys"] = [["key" => "text", "format" => "html"]]; }); } $elem['params']["gt_translate_keys"] = [["key" => "question", "format" => "html"]]; break; case "H5P.Image 1.0": break; case "H5P.StandardPage 1.3": $elem['params']["gt_translate_keys"] = ["helpText", "helpTextLabel", "title"]; if( !empty($elem['params']["elementList"]) ) { array_walk($elem['params']["elementList"], function(&$subitem, $key) { $this->addKeysForElementsBasedOnElement( $subitem ); }); } break; case "H5P.Text 1.1": $elem['params']["gt_translate_keys"] = [["key" => "text", "format" => "html"]]; break; case "H5P.TextInputField 1.1": $elem['params']["gt_translate_keys"] = ["remainingChars", ["key" => "taskDescription", "format" => "html"]]; break; case "H5P.GoalsPage 1.4": $elem['params']["gt_translate_keys"] = ["defineGoalPlaceholder", "defineGoalText", "definedGoalLabel", "goalsAddedText", "helpText", "helpTextLabel", "title", "removeGoalText", "specifyGoalText", ["key" => "description", "format" => "html"]]; if(!empty($elem['params']['goalDeletionConfirmation'])) { $elem['params']['goalDeletionConfirmation']["gt_translate_keys"] = array_keys( $elem['params']['goalDeletionConfirmation'] ); } break; case "H5P.GoalsAssessmentPage 1.3": $elem['params']["gt_translate_keys"] = ["noGoalsText", "helpText", "helpTextLabel", "title", "highRating", "lowRating", "midRating", ["key" => "description", "format" => "html"]]; break; case "H5P.DocumentExportPage 1.3": $elem['params']["gt_translate_keys"] = ["createDocumentLabel", "exportTextLabel", "helpText", "helpTextLabel", "title", "requiresInputErrorMessage", "selectAllTextLabel", "submitSuccessTextLabel", "submitTextLabel", ["key" => "description", "format" => "html"]]; break; default: break; } } private function addKeysFor_l10n(&$contentArr){ if(isset($contentArr["l10n"])) { $contentArr["l10n"]["gt_translate_keys"] = array_keys( $contentArr["l10n"] ); } } }