From 30585a61bd5e60b1954077da57ceb1ab2f6a5ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 28 Sep 2018 14:21:19 +0200 Subject: [PATCH] MOBILE-2639 ci: Generate the first language index --- .gitignore | 1 + scripts/build_lang.sh | 18 + scripts/create_langindex.sh | 288 +++++++ scripts/functions.sh | 41 + scripts/langindex.json | 1591 +++++++++++++++++++++++++++++++++++ scripts/moodle_to_json.php | 152 ++++ 6 files changed, 2091 insertions(+) create mode 100755 scripts/build_lang.sh create mode 100755 scripts/create_langindex.sh create mode 100644 scripts/functions.sh create mode 100644 scripts/langindex.json create mode 100644 scripts/moodle_to_json.php diff --git a/.gitignore b/.gitignore index 205374c92..36a3612d3 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ e2e/build !/desktop/electron.js src/configconstants.ts src/assets/lang +scripts/local_moodlemobileapp.php diff --git a/scripts/build_lang.sh b/scripts/build_lang.sh new file mode 100755 index 000000000..bde8acb65 --- /dev/null +++ b/scripts/build_lang.sh @@ -0,0 +1,18 @@ +#!/bin/bash +source "functions.sh" +forceLang=$1 + +print_title 'Getting languages' +git clone https://git.in.moodle.com/moodle/moodle-langpacks.git $LANGPACKSFOLDER +pushd $LANGPACKSFOLDER +git checkout MOODLE_36_STABLE +git pull +popd + +if [ -z $forceLang ]; then + php -f moodle_to_json.php +else + php -f moodle_to_json.php "$forceLang" +fi + +print_ok 'All done!' \ No newline at end of file diff --git a/scripts/create_langindex.sh b/scripts/create_langindex.sh new file mode 100755 index 000000000..5b8a816e9 --- /dev/null +++ b/scripts/create_langindex.sh @@ -0,0 +1,288 @@ +#!/bin/bash +source "functions.sh" + +#Saves the key and value on a temporary local_moodlemobileapp.php +function save_local { + val=`echo $value | sed "s/\'/\\\\\'/g"` + echo "\$string['$key'] = '$val';" >> local_moodlemobileapp.php +} + +#Saves or updates a key on langindex_old.json +function save_key { + key=$1 + found=$2 + + print_ok "$key=$found" + echo "{\"$key\": \"$found\"}" > langindex_old.json + jq -s '.[0] + .[1]' langindex.json langindex_old.json > langindex_new.json + mv langindex_new.json langindex.json +} + +#Removes a key on langindex_old.json +function remove_key { + key=$1 + found=$2 + + print_ok "$key=$found" + echo "{\"$key\": \"$found\"}" > langindex_old.json + jq -s '.[0] - .[1]' langindex.json langindex_old.json > langindex_new.json + mv langindex_new.json langindex.json +} + +#Check if and i exists in php file +function exists_in_file { + file=$1 + id=$2 + + file=`echo $file | sed s/^mod_workshop_assessment/workshopform/1` + file=`echo $file | sed s/^mod_assign_/assign/1` + file=`echo $file | sed s/^mod_//1` + + completeFile="$LANGPACKSFOLDER/en/$file.php" + if [ -f "$completeFile" ]; then + coincidence=`grep "string\[\'$id\'\]" $completeFile` + if [ ! -z "$coincidence" ]; then + found=$file + return + fi + fi + found=0 +} + +#Checks if a key exists on the original local_moodlemobileapp.php +function exists_in_mobile { + file='local_moodlemobileapp' + exists_in_file $file $key + if [ $found == 0 ]; then + case $type in + 'addon') + mobileid="mma.$component.$plainid" + exists_in_file $file $mobileid + ;; + 'core') + if [ "$component" == 'moodle' ]; then + mobileid="mm.core.$plainid" + elif [ "$component" == 'mainmenu' ]; then + mobileid="mm.sidemenu.$plainid" + else + mobileid="mm.$component.$plainid" + fi + exists_in_file $file $mobileid + ;; + *) + return + esac + fi + + if [ $found != 0 ]; then + save_local + fi +} + +function do_match { + match=$1 + filematch="" + + coincidence=`grep "$match" $LANGPACKSFOLDER/en/*.php | wc -l` + if [ $coincidence -eq 1 ]; then + filematch=`grep "$match" $LANGPACKSFOLDER/en/*.php | cut -d'/' -f5 | cut -d'.' -f1` + exists_in_file $filematch $plainid + elif [ $coincidence -gt 0 ] && [ "$#" -gt 1 ]; then + print_message $2 + tput setaf 6 + grep "$match" $LANGPACKSFOLDER/en/*.php + fi +} + +#Find if the id or the value can be found on files to help providing a solution. +function find_matches { + do_match "string\[\'$plainid\'\] = \'$value\'" "Found EXACT match for $key in the following paths" + if [ $coincidence -gt 0 ]; then + case=1 + return + fi + + do_match " = \'$value\'" "Found some string VALUES for $key in the following paths" + if [ $coincidence -gt 0 ]; then + case=2 + return + fi + + do_match "string\[\'$plainid\'\]" "Found some string KEYS for $key in the following paths, value $value" + if [ $coincidence -gt 0 ]; then + case=3 + return + fi + + print_error "No match found for $key adding to local_moodlemobileapp" + save_local +} + +function find_single_matches { + do_match "string\[\'$plainid\'\] = \'$value\'" + if [ ! -z $filematch ] && [ $found != 0 ]; then + case=1 + return + fi + + do_match " = \'$value\'" + if [ ! -z $filematch ] && [ $filematch != 'local_moodlemobileapp' ]; then + case=2 + print_message "Found some string VALUES for $key in the following paths $filematch" + tput setaf 6 + grep "$match" $LANGPACKSFOLDER/en/*.php + return + fi + + do_match "string\[\'$plainid\'\]" + if [ ! -z $filematch ] && [ $found != 0 ]; then + case=3 + return + fi +} + + +#Tries to gues the file where the id will be found. +function guess_file { + key=$1 + value=$2 + + type=`echo $key | cut -d'.' -f1` + component=`echo $key | cut -d'.' -f2` + plainid=`echo $key | cut -d'.' -f3-` + + if [ -z "$plainid" ]; then + plainid=$component + component='moodle' + fi + + exists_in_file $component $plainid + + if [ $found == 0 ]; then + tempid=`echo $plainid | sed s/^mod_//1` + if [ $component == 'moodle' ] && [ "$tempid" != "$plainid" ]; then + exists_in_file $plainid pluginname + + if [ $found != 0 ]; then + found=$found/pluginname + fi + fi + fi + + # Not found in file, try in local_moodlemobileapp + if [ $found == 0 ]; then + exists_in_mobile + fi + + # Still not found, if only found in one file, use it. + if [ $found == 0 ]; then + find_single_matches + fi + + # Last fallback. + if [ $found == 0 ]; then + exists_in_file 'moodle' $plainid + fi + + if [ $found == 0 ]; then + find_matches + else + save_key $key $found + fi +} + +#Finds if there's a better file where to get the id from. +function find_better_file { + key=$1 + value=$2 + current=$3 + + type=`echo $key | cut -d'.' -f1` + component=`echo $key | cut -d'.' -f2` + plainid=`echo $key | cut -d'.' -f3-` + + if [ -z "$plainid" ]; then + plainid=$component + component='moodle' + fi + + currentFile=`echo $current | cut -d'/' -f1` + currentStr=`echo $current | cut -d'/' -f2-` + if [ $currentFile == $current ]; then + currentStr=$plainid + fi + + exists_in_file $component $plainid + if [ $found != 0 ] && [ $currentStr == $plainid ]; then + if [ $found != $currentFile ]; then + print_ok "Key '$key' found in component, no need to replace old '$current'" + fi + + return + fi + + # Still not found, if only found in one file, use it. + if [ $found == 0 ]; then + find_single_matches + fi + + if [ $found != 0 ] && [ $found != $currentFile ] && [ $case -lt 3 ]; then + print_message "Indexed string '$key' found in '$found' better than '$current'" + return + fi + + if [ $currentFile == 'local_moodlemobileapp' ]; then + exists_in_mobile + else + exists_in_file $currentFile $currentStr + fi + + if [ $found == 0 ]; then + print_error "Indexed string '$key' not found on current place '$current'" + fi +} + +#Parses the file. +function parse_file { + keys=`jq -r 'keys[]' $1` + for key in $keys; do + # Check if already parsed. + exec="jq -r .\"$key\" langindex.json" + found=`$exec` + + exec="jq -r .\"$key\" $1" + value=`$exec` + if [ -z "$found" ] || [ "$found" == 'null' ]; then + guess_file $key "$value" + else + find_better_file "$key" "$value" "$found" + fi + done +} + +print_title 'Generating language from code...' +gulp lang + +print_title 'Getting languages' +git clone https://git.in.moodle.com/moodle/moodle-langpacks.git $LANGPACKSFOLDER +pushd $LANGPACKSFOLDER +git checkout MOODLE_36_STABLE +git pull +popd + +print_title 'Processing file' +#Create langindex.json if not exists. +if [ ! -f 'langindex.json' ]; then + echo "{}" > langindex.json +fi +echo " local_moodlemobileapp.php + +parse_file '../src/assets/lang/en.json' + +echo + +jq -S --indent 4 -s '.[0]' langindex.json > langindex_new.json +mv langindex_new.json langindex.json +rm langindex_old.json + +print_ok 'All done!' \ No newline at end of file diff --git a/scripts/functions.sh b/scripts/functions.sh new file mode 100644 index 000000000..ed1472357 --- /dev/null +++ b/scripts/functions.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +LANGPACKSFOLDER='../../moodle-langpacks' + +function check_success { + if [ $? -ne 0 ]; then + print_error "$1" + elif [ "$#" -gt 1 ]; then + print_ok "$2" + fi +} + +function print_success { + if [ $? -ne 0 ]; then + print_message "$1" + $3=0 + else + print_ok "$2" + fi +} + +function print_error { + tput setaf 1; echo " ERROR: $1" +} + +function print_ok { + tput setaf 2; echo " OK: $1" + echo +} + +function print_message { + tput setaf 3; echo "-------- $1" + echo +} + +function print_title { + stepnumber=$(($stepnumber + 1)) + echo + tput setaf 5; echo "$stepnumber $1" + tput setaf 5; echo '==================' +} \ No newline at end of file diff --git a/scripts/langindex.json b/scripts/langindex.json new file mode 100644 index 000000000..e9a449623 --- /dev/null +++ b/scripts/langindex.json @@ -0,0 +1,1591 @@ +{ + "addon.badges.badgedetails": "badges", + "addon.badges.badges": "badges", + "addon.badges.contact": "badges", + "addon.badges.dateawarded": "badges", + "addon.badges.expired": "badges", + "addon.badges.expirydate": "badges", + "addon.badges.issuancedetails": "badges", + "addon.badges.issuerdetails": "badges", + "addon.badges.issuername": "badges", + "addon.badges.nobadges": "badges", + "addon.badges.recipientdetails": "badges", + "addon.calendar.calendar": "calendar", + "addon.calendar.calendarevents": "local_moodlemobileapp", + "addon.calendar.defaultnotificationtime": "local_moodlemobileapp", + "addon.calendar.errorloadevent": "local_moodlemobileapp", + "addon.calendar.errorloadevents": "local_moodlemobileapp", + "addon.calendar.eventendtime": "calendar", + "addon.calendar.eventstarttime": "calendar", + "addon.calendar.gotoactivity": "calendar", + "addon.calendar.noevents": "local_moodlemobileapp", + "addon.calendar.notifications": "local_moodlemobileapp", + "addon.calendar.typecategory": "calendar", + "addon.calendar.typeclose": "calendar", + "addon.calendar.typecourse": "calendar", + "addon.calendar.typedue": "calendar", + "addon.calendar.typegradingdue": "calendar", + "addon.calendar.typegroup": "calendar", + "addon.calendar.typeopen": "calendar", + "addon.calendar.typesite": "calendar", + "addon.calendar.typeuser": "calendar", + "addon.competency.activities": "tool_lp", + "addon.competency.competencies": "competency", + "addon.competency.competenciesmostoftennotproficientincourse": "tool_lp", + "addon.competency.coursecompetencies": "tool_lp", + "addon.competency.coursecompetencyratingsarenotpushedtouserplans": "tool_lp", + "addon.competency.coursecompetencyratingsarepushedtouserplans": "tool_lp", + "addon.competency.crossreferencedcompetencies": "tool_lp", + "addon.competency.duedate": "tool_lp", + "addon.competency.errornocompetenciesfound": "local_moodlemobileapp", + "addon.competency.evidence": "tool_lp", + "addon.competency.evidence_competencyrule": "competency", + "addon.competency.evidence_coursecompleted": "competency", + "addon.competency.evidence_coursemodulecompleted": "competency", + "addon.competency.evidence_courserestored": "competency", + "addon.competency.evidence_evidenceofpriorlearninglinked": "competency", + "addon.competency.evidence_evidenceofpriorlearningunlinked": "competency", + "addon.competency.evidence_manualoverride": "competency", + "addon.competency.evidence_manualoverrideincourse": "competency", + "addon.competency.evidence_manualoverrideinplan": "competency", + "addon.competency.learningplancompetencies": "tool_lp", + "addon.competency.learningplans": "tool_lp", + "addon.competency.myplans": "tool_lp", + "addon.competency.noactivities": "tool_lp", + "addon.competency.nocompetencies": "local_moodlemobileapp", + "addon.competency.nocrossreferencedcompetencies": "tool_lp", + "addon.competency.noevidence": "tool_lp", + "addon.competency.noplanswerecreated": "tool_lp", + "addon.competency.path": "tool_lp", + "addon.competency.planstatusactive": "competency", + "addon.competency.planstatuscomplete": "competency", + "addon.competency.planstatusdraft": "competency", + "addon.competency.planstatusinreview": "competency", + "addon.competency.planstatuswaitingforreview": "competency", + "addon.competency.proficient": "tool_lp", + "addon.competency.progress": "tool_lp", + "addon.competency.rating": "tool_lp", + "addon.competency.reviewstatus": "tool_lp", + "addon.competency.status": "tool_lp", + "addon.competency.template": "tool_lp", + "addon.competency.usercompetencystatus_idle": "competency", + "addon.competency.usercompetencystatus_inreview": "competency", + "addon.competency.usercompetencystatus_waitingforreview": "competency", + "addon.competency.userplans": "competency", + "addon.competency.xcompetenciesproficientoutofy": "tool_lp", + "addon.competency.xcompetenciesproficientoutofyincourse": "tool_lp", + "addon.coursecompletion.complete": "local_moodlemobileapp", + "addon.coursecompletion.completecourse": "block_selfcompletion", + "addon.coursecompletion.completed": "local_moodlemobileapp", + "addon.coursecompletion.completiondate": "local_moodlemobileapp", + "addon.coursecompletion.completionmenuitem": "completion", + "addon.coursecompletion.couldnotloadreport": "local_moodlemobileapp", + "addon.coursecompletion.coursecompletion": "local_moodlemobileapp", + "addon.coursecompletion.criteria": "local_moodlemobileapp", + "addon.coursecompletion.criteriagroup": "local_moodlemobileapp", + "addon.coursecompletion.criteriarequiredall": "local_moodlemobileapp", + "addon.coursecompletion.criteriarequiredany": "local_moodlemobileapp", + "addon.coursecompletion.inprogress": "local_moodlemobileapp", + "addon.coursecompletion.manualselfcompletion": "local_moodlemobileapp", + "addon.coursecompletion.notyetstarted": "local_moodlemobileapp", + "addon.coursecompletion.pending": "local_moodlemobileapp", + "addon.coursecompletion.required": "local_moodlemobileapp", + "addon.coursecompletion.requiredcriteria": "local_moodlemobileapp", + "addon.coursecompletion.requirement": "local_moodlemobileapp", + "addon.coursecompletion.status": "local_moodlemobileapp", + "addon.coursecompletion.viewcoursereport": "local_moodlemobileapp", + "addon.files.couldnotloadfiles": "local_moodlemobileapp", + "addon.files.emptyfilelist": "local_moodlemobileapp", + "addon.files.erroruploadnotworking": "local_moodlemobileapp", + "addon.files.files": "moodle", + "addon.files.privatefiles": "moodle", + "addon.files.sitefiles": "moodle", + "addon.messageoutput_airnotifier.processorsettingsdesc": "local_moodlemobileapp", + "addon.messages.addcontact": "message", + "addon.messages.blockcontact": "message", + "addon.messages.blockcontactconfirm": "local_moodlemobileapp", + "addon.messages.blocknoncontacts": "message", + "addon.messages.contactlistempty": "local_moodlemobileapp", + "addon.messages.contactname": "local_moodlemobileapp", + "addon.messages.contacts": "message", + "addon.messages.errordeletemessage": "local_moodlemobileapp", + "addon.messages.errorwhileretrievingcontacts": "local_moodlemobileapp", + "addon.messages.errorwhileretrievingdiscussions": "local_moodlemobileapp", + "addon.messages.errorwhileretrievingmessages": "local_moodlemobileapp", + "addon.messages.message": "message", + "addon.messages.messagenotsent": "local_moodlemobileapp", + "addon.messages.messagepreferences": "message", + "addon.messages.messages": "message", + "addon.messages.newmessage": "message", + "addon.messages.newmessages": "local_moodlemobileapp", + "addon.messages.nomessages": "message", + "addon.messages.nousersfound": "local_moodlemobileapp", + "addon.messages.removecontact": "message", + "addon.messages.removecontactconfirm": "local_moodlemobileapp", + "addon.messages.type_blocked": "local_moodlemobileapp", + "addon.messages.type_offline": "local_moodlemobileapp", + "addon.messages.type_online": "local_moodlemobileapp", + "addon.messages.type_search": "local_moodlemobileapp", + "addon.messages.type_strangers": "local_moodlemobileapp", + "addon.messages.unblockcontact": "message", + "addon.messages.warningmessagenotsent": "local_moodlemobileapp", + "addon.mod_assign.acceptsubmissionstatement": "local_moodlemobileapp", + "addon.mod_assign.addattempt": "assign", + "addon.mod_assign.addnewattempt": "assign", + "addon.mod_assign.addnewattemptfromprevious": "assign", + "addon.mod_assign.addsubmission": "assign", + "addon.mod_assign.allowsubmissionsanddescriptionfromdatesummary": "assign", + "addon.mod_assign.allowsubmissionsfromdate": "assign", + "addon.mod_assign.allowsubmissionsfromdatesummary": "assign", + "addon.mod_assign.applytoteam": "assign", + "addon.mod_assign.assignmentisdue": "assign", + "addon.mod_assign.attemptnumber": "assign", + "addon.mod_assign.attemptreopenmethod": "assign", + "addon.mod_assign.attemptreopenmethod_manual": "assign", + "addon.mod_assign.attemptreopenmethod_untilpass": "assign", + "addon.mod_assign.attemptsettings": "assign", + "addon.mod_assign.cannoteditduetostatementsubmission": "local_moodlemobileapp", + "addon.mod_assign.cannotgradefromapp": "local_moodlemobileapp", + "addon.mod_assign.cannotsubmitduetostatementsubmission": "local_moodlemobileapp", + "addon.mod_assign.confirmsubmission": "assign", + "addon.mod_assign.currentattempt": "assign", + "addon.mod_assign.currentattemptof": "assign", + "addon.mod_assign.currentgrade": "assign", + "addon.mod_assign.cutoffdate": "assign", + "addon.mod_assign.defaultteam": "assign", + "addon.mod_assign.duedate": "assign", + "addon.mod_assign.duedateno": "assign", + "addon.mod_assign.duedatereached": "assign", + "addon.mod_assign.editingstatus": "assign", + "addon.mod_assign.editsubmission": "assign", + "addon.mod_assign.erroreditpluginsnotsupported": "local_moodlemobileapp", + "addon.mod_assign.errorshowinginformation": "local_moodlemobileapp", + "addon.mod_assign.extensionduedate": "assign", + "addon.mod_assign.feedbacknotsupported": "local_moodlemobileapp", + "addon.mod_assign.grade": "grades", + "addon.mod_assign.graded": "assign", + "addon.mod_assign.gradedby": "assign", + "addon.mod_assign.gradedon": "assign", + "addon.mod_assign.gradenotsynced": "local_moodlemobileapp", + "addon.mod_assign.gradeoutof": "assign", + "addon.mod_assign.gradingstatus": "assign", + "addon.mod_assign.groupsubmissionsettings": "assign", + "addon.mod_assign.hiddenuser": "assign", + "addon.mod_assign.latesubmissions": "assign", + "addon.mod_assign.latesubmissionsaccepted": "assign", + "addon.mod_assign.markingworkflowstate": "assign", + "addon.mod_assign.markingworkflowstateinmarking": "assign", + "addon.mod_assign.markingworkflowstateinreview": "assign", + "addon.mod_assign.markingworkflowstatenotmarked": "assign", + "addon.mod_assign.markingworkflowstatereadyforrelease": "assign", + "addon.mod_assign.markingworkflowstatereadyforreview": "assign", + "addon.mod_assign.markingworkflowstatereleased": "assign", + "addon.mod_assign.multipleteams": "assign", + "addon.mod_assign.multipleteams_desc": "assign", + "addon.mod_assign.noattempt": "assign", + "addon.mod_assign.nomoresubmissionsaccepted": "assign", + "addon.mod_assign.noonlinesubmissions": "assign", + "addon.mod_assign.nosubmission": "assign", + "addon.mod_assign.notallparticipantsareshown": "local_moodlemobileapp", + "addon.mod_assign.noteam": "assign", + "addon.mod_assign.noteam_desc": "assign", + "addon.mod_assign.notgraded": "assign", + "addon.mod_assign.numberofdraftsubmissions": "assign", + "addon.mod_assign.numberofparticipants": "assign", + "addon.mod_assign.numberofsubmissionsneedgrading": "assign", + "addon.mod_assign.numberofsubmittedassignments": "assign", + "addon.mod_assign.numberofteams": "assign", + "addon.mod_assign.numwords": "moodle", + "addon.mod_assign.outof": "assign", + "addon.mod_assign.overdue": "assign", + "addon.mod_assign.savechanges": "assign", + "addon.mod_assign.submission": "assign", + "addon.mod_assign.submissioneditable": "assign", + "addon.mod_assign.submissionnoteditable": "assign", + "addon.mod_assign.submissionnotsupported": "local_moodlemobileapp", + "addon.mod_assign.submissionslocked": "assign", + "addon.mod_assign.submissionstatus": "assign", + "addon.mod_assign.submissionstatus_": "assign", + "addon.mod_assign.submissionstatus_draft": "assign", + "addon.mod_assign.submissionstatus_marked": "assign", + "addon.mod_assign.submissionstatus_new": "assign", + "addon.mod_assign.submissionstatus_reopened": "assign", + "addon.mod_assign.submissionstatus_submitted": "assign", + "addon.mod_assign.submissionstatusheading": "assign", + "addon.mod_assign.submissionteam": "assign", + "addon.mod_assign.submitassignment": "assign", + "addon.mod_assign.submitassignment_help": "assign", + "addon.mod_assign.submittedearly": "assign", + "addon.mod_assign.submittedlate": "assign", + "addon.mod_assign.timemodified": "assign", + "addon.mod_assign.timeremaining": "assign", + "addon.mod_assign.ungroupedusers": "assign", + "addon.mod_assign.unlimitedattempts": "assign", + "addon.mod_assign.userswhoneedtosubmit": "assign", + "addon.mod_assign.userwithid": "local_moodlemobileapp", + "addon.mod_assign.viewsubmission": "assign", + "addon.mod_assign.warningsubmissiongrademodified": "local_moodlemobileapp", + "addon.mod_assign.warningsubmissionmodified": "local_moodlemobileapp", + "addon.mod_assign.wordlimit": "assignsubmission_onlinetext", + "addon.mod_assign_feedback_comments.pluginname": "assignfeedback_comments", + "addon.mod_assign_feedback_editpdf.pluginname": "assignfeedback_editpdf", + "addon.mod_assign_feedback_file.pluginname": "assignfeedback_file", + "addon.mod_assign_submission_comments.pluginname": "assignsubmission_comments", + "addon.mod_assign_submission_file.pluginname": "assignsubmission_file", + "addon.mod_assign_submission_onlinetext.pluginname": "assignsubmission_onlinetext", + "addon.mod_book.errorchapter": "book", + "addon.mod_chat.beep": "chat", + "addon.mod_chat.currentusers": "chat", + "addon.mod_chat.enterchat": "chat", + "addon.mod_chat.entermessage": "chat", + "addon.mod_chat.errorwhileconnecting": "local_moodlemobileapp", + "addon.mod_chat.errorwhilegettingchatdata": "local_moodlemobileapp", + "addon.mod_chat.errorwhilegettingchatusers": "local_moodlemobileapp", + "addon.mod_chat.errorwhileretrievingmessages": "local_moodlemobileapp", + "addon.mod_chat.errorwhilesendingmessage": "local_moodlemobileapp", + "addon.mod_chat.messagebeepsyou": "chat", + "addon.mod_chat.messageenter": "chat", + "addon.mod_chat.messageexit": "chat", + "addon.mod_chat.mustbeonlinetosendmessages": "local_moodlemobileapp", + "addon.mod_chat.nomessages": "chat", + "addon.mod_chat.send": "chat", + "addon.mod_chat.sessionstart": "chat", + "addon.mod_chat.talk": "chat", + "addon.mod_choice.cannotsubmit": "choice", + "addon.mod_choice.choiceoptions": "choice", + "addon.mod_choice.errorgetchoice": "local_moodlemobileapp", + "addon.mod_choice.expired": "choice", + "addon.mod_choice.full": "choice", + "addon.mod_choice.noresultsviewable": "choice", + "addon.mod_choice.notopenyet": "choice", + "addon.mod_choice.numberofuser": "choice", + "addon.mod_choice.numberofuserinpercentage": "choice", + "addon.mod_choice.previewonly": "choice", + "addon.mod_choice.publishinfoanonafter": "choice", + "addon.mod_choice.publishinfoanonclose": "choice", + "addon.mod_choice.publishinfofullafter": "choice", + "addon.mod_choice.publishinfofullclose": "choice", + "addon.mod_choice.publishinfonever": "choice", + "addon.mod_choice.removemychoice": "choice", + "addon.mod_choice.responses": "choice", + "addon.mod_choice.responsesresultgraphdescription": "local_moodlemobileapp", + "addon.mod_choice.responsesresultgraphheader": "choice", + "addon.mod_choice.resultsnotsynced": "local_moodlemobileapp", + "addon.mod_choice.savemychoice": "choice", + "addon.mod_choice.userchoosethisoption": "choice", + "addon.mod_choice.yourselection": "choice", + "addon.mod_data.addentries": "data", + "addon.mod_data.advancedsearch": "data", + "addon.mod_data.alttext": "data", + "addon.mod_data.approve": "data", + "addon.mod_data.approved": "data", + "addon.mod_data.ascending": "data", + "addon.mod_data.authorfirstname": "data", + "addon.mod_data.authorlastname": "data", + "addon.mod_data.confirmdeleterecord": "data", + "addon.mod_data.descending": "data", + "addon.mod_data.disapprove": "data", + "addon.mod_data.emptyaddform": "data", + "addon.mod_data.entrieslefttoadd": "data", + "addon.mod_data.entrieslefttoaddtoview": "data", + "addon.mod_data.errorapproving": "local_moodlemobileapp", + "addon.mod_data.errordeleting": "local_moodlemobileapp", + "addon.mod_data.errormustsupplyvalue": "data", + "addon.mod_data.expired": "data", + "addon.mod_data.fields": "data", + "addon.mod_data.latlongboth": "data", + "addon.mod_data.menuchoose": "data", + "addon.mod_data.more": "data", + "addon.mod_data.nomatch": "data", + "addon.mod_data.norecords": "data", + "addon.mod_data.notapproved": "data", + "addon.mod_data.notopenyet": "data", + "addon.mod_data.numrecords": "data", + "addon.mod_data.other": "data", + "addon.mod_data.recordapproved": "data", + "addon.mod_data.recorddeleted": "data", + "addon.mod_data.recorddisapproved": "data", + "addon.mod_data.resetsettings": "data", + "addon.mod_data.search": "data", + "addon.mod_data.selectedrequired": "data", + "addon.mod_data.single": "data", + "addon.mod_data.timeadded": "data", + "addon.mod_data.timemodified": "data", + "addon.mod_data.usedate": "data", + "addon.mod_feedback.analysis": "feedback", + "addon.mod_feedback.anonymous": "feedback", + "addon.mod_feedback.anonymous_entries": "feedback", + "addon.mod_feedback.average": "feedback", + "addon.mod_feedback.captchaofflinewarning": "local_moodlemobileapp", + "addon.mod_feedback.complete_the_form": "feedback", + "addon.mod_feedback.completed_feedbacks": "feedback", + "addon.mod_feedback.continue_the_form": "feedback", + "addon.mod_feedback.feedback_is_not_open": "feedback", + "addon.mod_feedback.feedback_submitted_offline": "local_moodlemobileapp", + "addon.mod_feedback.feedbackclose": "feedback", + "addon.mod_feedback.feedbackopen": "feedback", + "addon.mod_feedback.mapcourses": "feedback", + "addon.mod_feedback.mode": "feedback", + "addon.mod_feedback.next_page": "feedback", + "addon.mod_feedback.non_anonymous": "feedback", + "addon.mod_feedback.non_anonymous_entries": "feedback", + "addon.mod_feedback.non_respondents_students": "feedback", + "addon.mod_feedback.not_selected": "feedback", + "addon.mod_feedback.not_started": "feedback", + "addon.mod_feedback.numberoutofrange": "feedback", + "addon.mod_feedback.overview": "feedback", + "addon.mod_feedback.page_after_submit": "feedback", + "addon.mod_feedback.preview": "moodle", + "addon.mod_feedback.previous_page": "feedback", + "addon.mod_feedback.questions": "feedback", + "addon.mod_feedback.response_nr": "feedback", + "addon.mod_feedback.responses": "feedback", + "addon.mod_feedback.save_entries": "feedback", + "addon.mod_feedback.show_entries": "feedback", + "addon.mod_feedback.show_nonrespondents": "feedback", + "addon.mod_feedback.started": "feedback", + "addon.mod_feedback.this_feedback_is_already_submitted": "feedback", + "addon.mod_folder.emptyfilelist": "local_moodlemobileapp", + "addon.mod_forum.addanewdiscussion": "forum", + "addon.mod_forum.addanewquestion": "forum", + "addon.mod_forum.addanewtopic": "forum", + "addon.mod_forum.cannotadddiscussion": "forum", + "addon.mod_forum.cannotadddiscussionall": "forum", + "addon.mod_forum.cannotcreatediscussion": "forum", + "addon.mod_forum.couldnotadd": "forum", + "addon.mod_forum.discussion": "forum", + "addon.mod_forum.discussionlocked": "forum", + "addon.mod_forum.discussionpinned": "forum", + "addon.mod_forum.discussionsubscription": "forum", + "addon.mod_forum.edit": "forum", + "addon.mod_forum.erroremptymessage": "forum", + "addon.mod_forum.erroremptysubject": "forum", + "addon.mod_forum.errorgetforum": "local_moodlemobileapp", + "addon.mod_forum.errorgetgroups": "local_moodlemobileapp", + "addon.mod_forum.forumnodiscussionsyet": "local_moodlemobileapp", + "addon.mod_forum.group": "local_moodlemobileapp", + "addon.mod_forum.message": "forum", + "addon.mod_forum.modeflatnewestfirst": "forum", + "addon.mod_forum.modeflatoldestfirst": "forum", + "addon.mod_forum.modenested": "forum", + "addon.mod_forum.numdiscussions": "local_moodlemobileapp", + "addon.mod_forum.numreplies": "local_moodlemobileapp", + "addon.mod_forum.posttoforum": "forum", + "addon.mod_forum.re": "forum", + "addon.mod_forum.refreshdiscussions": "local_moodlemobileapp", + "addon.mod_forum.refreshposts": "local_moodlemobileapp", + "addon.mod_forum.reply": "forum", + "addon.mod_forum.subject": "forum", + "addon.mod_forum.unread": "forum", + "addon.mod_forum.unreadpostsnumber": "forum", + "addon.mod_glossary.addentry": "glossary", + "addon.mod_glossary.aliases": "glossary", + "addon.mod_glossary.attachment": "glossary", + "addon.mod_glossary.browsemode": "local_moodlemobileapp", + "addon.mod_glossary.byalphabet": "local_moodlemobileapp", + "addon.mod_glossary.byauthor": "local_moodlemobileapp", + "addon.mod_glossary.bycategory": "local_moodlemobileapp", + "addon.mod_glossary.bynewestfirst": "local_moodlemobileapp", + "addon.mod_glossary.byrecentlyupdated": "local_moodlemobileapp", + "addon.mod_glossary.bysearch": "local_moodlemobileapp", + "addon.mod_glossary.cannoteditentry": "local_moodlemobileapp", + "addon.mod_glossary.casesensitive": "glossary", + "addon.mod_glossary.categories": "glossary", + "addon.mod_glossary.concept": "glossary", + "addon.mod_glossary.definition": "glossary", + "addon.mod_glossary.entriestobesynced": "local_moodlemobileapp", + "addon.mod_glossary.entrypendingapproval": "local_moodlemobileapp", + "addon.mod_glossary.entryusedynalink": "glossary", + "addon.mod_glossary.errconceptalreadyexists": "glossary", + "addon.mod_glossary.errorloadingentries": "local_moodlemobileapp", + "addon.mod_glossary.errorloadingentry": "local_moodlemobileapp", + "addon.mod_glossary.errorloadingglossary": "local_moodlemobileapp", + "addon.mod_glossary.fillfields": "glossary", + "addon.mod_glossary.fullmatch": "glossary", + "addon.mod_glossary.linking": "glossary", + "addon.mod_glossary.noentriesfound": "local_moodlemobileapp", + "addon.mod_glossary.searchquery": "local_moodlemobileapp", + "addon.mod_imscp.deploymenterror": "imscp", + "addon.mod_imscp.showmoduledescription": "local_moodlemobileapp", + "addon.mod_lesson.answer": "lesson", + "addon.mod_lesson.attempt": "lesson", + "addon.mod_lesson.attemptheader": "lesson", + "addon.mod_lesson.attemptsremaining": "lesson", + "addon.mod_lesson.averagescore": "lesson", + "addon.mod_lesson.averagetime": "lesson", + "addon.mod_lesson.branchtable": "lesson", + "addon.mod_lesson.cannotfindattempt": "lesson", + "addon.mod_lesson.cannotfinduser": "lesson", + "addon.mod_lesson.clusterjump": "lesson", + "addon.mod_lesson.completed": "lesson", + "addon.mod_lesson.congratulations": "lesson", + "addon.mod_lesson.continue": "lesson", + "addon.mod_lesson.continuetonextpage": "lesson", + "addon.mod_lesson.defaultessayresponse": "lesson", + "addon.mod_lesson.detailedstats": "lesson", + "addon.mod_lesson.didnotanswerquestion": "lesson", + "addon.mod_lesson.displayofgrade": "lesson", + "addon.mod_lesson.displayscorewithessays": "lesson", + "addon.mod_lesson.displayscorewithoutessays": "lesson", + "addon.mod_lesson.emptypassword": "lesson", + "addon.mod_lesson.enterpassword": "lesson", + "addon.mod_lesson.eolstudentoutoftimenoanswers": "lesson", + "addon.mod_lesson.errorprefetchrandombranch": "local_moodlemobileapp", + "addon.mod_lesson.errorreviewretakenotlast": "local_moodlemobileapp", + "addon.mod_lesson.finish": "lesson", + "addon.mod_lesson.finishretakeoffline": "local_moodlemobileapp", + "addon.mod_lesson.firstwrong": "lesson", + "addon.mod_lesson.gotoendoflesson": "lesson", + "addon.mod_lesson.grade": "lesson", + "addon.mod_lesson.highscore": "lesson", + "addon.mod_lesson.hightime": "lesson", + "addon.mod_lesson.leftduringtimed": "lesson", + "addon.mod_lesson.leftduringtimednoretake": "lesson", + "addon.mod_lesson.lessonmenu": "lesson", + "addon.mod_lesson.lessonstats": "lesson", + "addon.mod_lesson.linkedmedia": "lesson", + "addon.mod_lesson.loginfail": "lesson", + "addon.mod_lesson.lowscore": "lesson", + "addon.mod_lesson.lowtime": "lesson", + "addon.mod_lesson.maximumnumberofattemptsreached": "lesson", + "addon.mod_lesson.modattemptsnoteacher": "lesson", + "addon.mod_lesson.noanswer": "lesson", + "addon.mod_lesson.nolessonattempts": "lesson", + "addon.mod_lesson.nolessonattemptsgroup": "lesson", + "addon.mod_lesson.notcompleted": "lesson", + "addon.mod_lesson.numberofcorrectanswers": "lesson", + "addon.mod_lesson.numberofpagesviewed": "lesson", + "addon.mod_lesson.numberofpagesviewednotice": "lesson", + "addon.mod_lesson.ongoingcustom": "lesson", + "addon.mod_lesson.ongoingnormal": "lesson", + "addon.mod_lesson.or": "lesson", + "addon.mod_lesson.overview": "lesson", + "addon.mod_lesson.preview": "lesson", + "addon.mod_lesson.progressbarteacherwarning2": "lesson", + "addon.mod_lesson.progresscompleted": "lesson", + "addon.mod_lesson.question": "lesson", + "addon.mod_lesson.rawgrade": "lesson", + "addon.mod_lesson.reports": "lesson", + "addon.mod_lesson.response": "lesson", + "addon.mod_lesson.retakefinishedinsync": "local_moodlemobileapp", + "addon.mod_lesson.retakelabelfull": "local_moodlemobileapp", + "addon.mod_lesson.retakelabelshort": "local_moodlemobileapp", + "addon.mod_lesson.review": "lesson", + "addon.mod_lesson.reviewlesson": "lesson", + "addon.mod_lesson.reviewquestionback": "lesson", + "addon.mod_lesson.reviewquestioncontinue": "lesson", + "addon.mod_lesson.secondpluswrong": "lesson", + "addon.mod_lesson.submit": "lesson", + "addon.mod_lesson.teacherjumpwarning": "lesson", + "addon.mod_lesson.teacherongoingwarning": "lesson", + "addon.mod_lesson.teachertimerwarning": "lesson", + "addon.mod_lesson.thatsthecorrectanswer": "lesson", + "addon.mod_lesson.thatsthewronganswer": "lesson", + "addon.mod_lesson.timeremaining": "lesson", + "addon.mod_lesson.timetaken": "lesson", + "addon.mod_lesson.unseenpageinbranch": "lesson", + "addon.mod_lesson.warningretakefinished": "local_moodlemobileapp", + "addon.mod_lesson.welldone": "lesson", + "addon.mod_lesson.youhaveseen": "lesson", + "addon.mod_lesson.youranswer": "lesson", + "addon.mod_lesson.yourcurrentgradeisoutof": "lesson", + "addon.mod_lesson.youshouldview": "lesson", + "addon.mod_lti.errorgetlti": "local_moodlemobileapp", + "addon.mod_lti.errorinvalidlaunchurl": "local_moodlemobileapp", + "addon.mod_lti.launchactivity": "local_moodlemobileapp", + "addon.mod_page.errorwhileloadingthepage": "local_moodlemobileapp", + "addon.mod_quiz.attemptfirst": "quiz", + "addon.mod_quiz.attemptlast": "quiz", + "addon.mod_quiz.attemptnumber": "quiz", + "addon.mod_quiz.attemptquiznow": "quiz", + "addon.mod_quiz.attemptstate": "quiz", + "addon.mod_quiz.cannotsubmitquizdueto": "local_moodlemobileapp", + "addon.mod_quiz.comment": "quiz", + "addon.mod_quiz.completedon": "quiz", + "addon.mod_quiz.confirmclose": "quiz", + "addon.mod_quiz.confirmcontinueoffline": "local_moodlemobileapp", + "addon.mod_quiz.confirmleavequizonerror": "local_moodlemobileapp", + "addon.mod_quiz.confirmstart": "quizaccess_timelimit", + "addon.mod_quiz.confirmstartheader": "quizaccess_timelimit", + "addon.mod_quiz.connectionerror": "quiz", + "addon.mod_quiz.continueattemptquiz": "quiz", + "addon.mod_quiz.continuepreview": "quiz", + "addon.mod_quiz.errorbehaviournotsupported": "local_moodlemobileapp", + "addon.mod_quiz.errordownloading": "local_moodlemobileapp", + "addon.mod_quiz.errorgetattempt": "local_moodlemobileapp", + "addon.mod_quiz.errorgetquestions": "local_moodlemobileapp", + "addon.mod_quiz.errorgetquiz": "local_moodlemobileapp", + "addon.mod_quiz.errorparsequestions": "local_moodlemobileapp", + "addon.mod_quiz.errorquestionsnotsupported": "local_moodlemobileapp", + "addon.mod_quiz.errorrulesnotsupported": "local_moodlemobileapp", + "addon.mod_quiz.errorsaveattempt": "local_moodlemobileapp", + "addon.mod_quiz.feedback": "quiz", + "addon.mod_quiz.finishattemptdots": "quiz", + "addon.mod_quiz.finishnotsynced": "local_moodlemobileapp", + "addon.mod_quiz.grade": "quiz", + "addon.mod_quiz.gradeaverage": "quiz", + "addon.mod_quiz.gradehighest": "quiz", + "addon.mod_quiz.grademethod": "quiz", + "addon.mod_quiz.gradesofar": "quiz", + "addon.mod_quiz.marks": "quiz", + "addon.mod_quiz.mustbesubmittedby": "quiz", + "addon.mod_quiz.noquestions": "quiz", + "addon.mod_quiz.noreviewattempt": "quiz", + "addon.mod_quiz.notyetgraded": "quiz", + "addon.mod_quiz.opentoc": "local_moodlemobileapp", + "addon.mod_quiz.outof": "quiz", + "addon.mod_quiz.outofpercent": "quiz", + "addon.mod_quiz.outofshort": "quiz", + "addon.mod_quiz.overallfeedback": "quiz", + "addon.mod_quiz.overdue": "quiz", + "addon.mod_quiz.overduemustbesubmittedby": "quiz", + "addon.mod_quiz.preview": "quiz", + "addon.mod_quiz.previewquiznow": "quiz", + "addon.mod_quiz.question": "quiz", + "addon.mod_quiz.quiznavigation": "quiz", + "addon.mod_quiz.quizpassword": "quizaccess_password", + "addon.mod_quiz.reattemptquiz": "quiz", + "addon.mod_quiz.requirepasswordmessage": "quizaccess_password", + "addon.mod_quiz.returnattempt": "quiz", + "addon.mod_quiz.review": "quiz", + "addon.mod_quiz.reviewofattempt": "quiz", + "addon.mod_quiz.reviewofpreview": "quiz", + "addon.mod_quiz.showall": "quiz", + "addon.mod_quiz.showeachpage": "quiz", + "addon.mod_quiz.startattempt": "quiz", + "addon.mod_quiz.startedon": "quiz", + "addon.mod_quiz.stateabandoned": "quiz", + "addon.mod_quiz.statefinished": "quiz", + "addon.mod_quiz.statefinisheddetails": "quiz", + "addon.mod_quiz.stateinprogress": "quiz", + "addon.mod_quiz.stateoverdue": "quiz", + "addon.mod_quiz.stateoverduedetails": "quiz", + "addon.mod_quiz.status": "quiz", + "addon.mod_quiz.submitallandfinish": "quiz", + "addon.mod_quiz.summaryofattempt": "quiz", + "addon.mod_quiz.summaryofattempts": "quiz", + "addon.mod_quiz.timeleft": "quiz", + "addon.mod_quiz.timetaken": "quiz", + "addon.mod_quiz.warningattemptfinished": "local_moodlemobileapp", + "addon.mod_quiz.warningdatadiscarded": "local_moodlemobileapp", + "addon.mod_quiz.warningdatadiscardedfromfinished": "local_moodlemobileapp", + "addon.mod_quiz.yourfinalgradeis": "quiz", + "addon.mod_resource.errorwhileloadingthecontent": "local_moodlemobileapp", + "addon.mod_resource.modifieddate": "resource", + "addon.mod_resource.openthefile": "local_moodlemobileapp", + "addon.mod_resource.uploadeddate": "resource", + "addon.mod_scorm.asset": "scorm", + "addon.mod_scorm.assetlaunched": "scorm", + "addon.mod_scorm.attempts": "scorm", + "addon.mod_scorm.averageattempt": "scorm", + "addon.mod_scorm.browse": "scorm", + "addon.mod_scorm.browsed": "scorm", + "addon.mod_scorm.browsemode": "scorm", + "addon.mod_scorm.cannotcalculategrade": "local_moodlemobileapp", + "addon.mod_scorm.completed": "scorm", + "addon.mod_scorm.contents": "scorm", + "addon.mod_scorm.dataattemptshown": "local_moodlemobileapp", + "addon.mod_scorm.enter": "scorm", + "addon.mod_scorm.errorcreateofflineattempt": "local_moodlemobileapp", + "addon.mod_scorm.errordownloadscorm": "local_moodlemobileapp", + "addon.mod_scorm.errorgetscorm": "local_moodlemobileapp", + "addon.mod_scorm.errorinvalidversion": "local_moodlemobileapp", + "addon.mod_scorm.errornotdownloadable": "local_moodlemobileapp", + "addon.mod_scorm.errornovalidsco": "local_moodlemobileapp", + "addon.mod_scorm.errorpackagefile": "local_moodlemobileapp", + "addon.mod_scorm.errorsyncscorm": "local_moodlemobileapp", + "addon.mod_scorm.exceededmaxattempts": "scorm", + "addon.mod_scorm.failed": "scorm", + "addon.mod_scorm.firstattempt": "scorm", + "addon.mod_scorm.gradeaverage": "scorm", + "addon.mod_scorm.gradeforattempt": "scorm", + "addon.mod_scorm.gradehighest": "scorm", + "addon.mod_scorm.grademethod": "scorm", + "addon.mod_scorm.gradereported": "scorm", + "addon.mod_scorm.gradescoes": "scorm", + "addon.mod_scorm.gradesum": "scorm", + "addon.mod_scorm.highestattempt": "scorm", + "addon.mod_scorm.incomplete": "scorm", + "addon.mod_scorm.lastattempt": "scorm", + "addon.mod_scorm.mode": "scorm", + "addon.mod_scorm.newattempt": "scorm", + "addon.mod_scorm.noattemptsallowed": "scorm", + "addon.mod_scorm.noattemptsmade": "scorm", + "addon.mod_scorm.normal": "scorm", + "addon.mod_scorm.notattempted": "scorm", + "addon.mod_scorm.offlineattemptnote": "local_moodlemobileapp", + "addon.mod_scorm.offlineattemptovermax": "local_moodlemobileapp", + "addon.mod_scorm.organizations": "scorm", + "addon.mod_scorm.passed": "scorm", + "addon.mod_scorm.reviewmode": "scorm", + "addon.mod_scorm.scormstatusnotdownloaded": "local_moodlemobileapp", + "addon.mod_scorm.scormstatusoutdated": "local_moodlemobileapp", + "addon.mod_scorm.suspended": "scorm", + "addon.mod_scorm.warningofflinedatadeleted": "local_moodlemobileapp", + "addon.mod_scorm.warningsynconlineincomplete": "local_moodlemobileapp", + "addon.mod_survey.cannotsubmitsurvey": "local_moodlemobileapp", + "addon.mod_survey.errorgetsurvey": "local_moodlemobileapp", + "addon.mod_survey.ifoundthat": "survey", + "addon.mod_survey.ipreferthat": "survey", + "addon.mod_survey.responses": "survey", + "addon.mod_survey.results": "local_moodlemobileapp", + "addon.mod_survey.surveycompletednograph": "survey", + "addon.mod_url.accessurl": "local_moodlemobileapp", + "addon.mod_url.pointingtourl": "local_moodlemobileapp", + "addon.mod_wiki.cannoteditpage": "wiki", + "addon.mod_wiki.createpage": "wiki", + "addon.mod_wiki.editingpage": "wiki", + "addon.mod_wiki.errorloadingpage": "local_moodlemobileapp", + "addon.mod_wiki.errornowikiavailable": "local_moodlemobileapp", + "addon.mod_wiki.gowikihome": "local_moodlemobileapp", + "addon.mod_wiki.map": "wiki", + "addon.mod_wiki.newpagehdr": "wiki", + "addon.mod_wiki.newpagetitle": "wiki", + "addon.mod_wiki.nocontent": "wiki", + "addon.mod_wiki.notingroup": "wiki", + "addon.mod_wiki.pageexists": "wiki", + "addon.mod_wiki.pagename": "wiki", + "addon.mod_wiki.subwiki": "local_moodlemobileapp", + "addon.mod_wiki.titleshouldnotbeempty": "local_moodlemobileapp", + "addon.mod_wiki.viewpage": "local_moodlemobileapp", + "addon.mod_wiki.wikipage": "local_moodlemobileapp", + "addon.mod_wiki.wrongversionlock": "wiki", + "addon.mod_workshop.alreadygraded": "workshop", + "addon.mod_workshop.areainstructauthors": "workshop", + "addon.mod_workshop.areainstructreviewers": "workshop", + "addon.mod_workshop.assess": "workshop", + "addon.mod_workshop.assessedsubmission": "workshop", + "addon.mod_workshop.assessmentform": "workshop", + "addon.mod_workshop.assessmentsettings": "workshop", + "addon.mod_workshop.assessmentstrategynotsupported": "local_moodlemobileapp", + "addon.mod_workshop.assessmentweight": "workshop", + "addon.mod_workshop.assignedassessments": "workshop", + "addon.mod_workshop.assignedassessmentsnone": "workshop", + "addon.mod_workshop.conclusion": "workshop", + "addon.mod_workshop.createsubmission": "workshop", + "addon.mod_workshop.deletesubmission": "workshop", + "addon.mod_workshop.editsubmission": "workshop", + "addon.mod_workshop.feedbackauthor": "workshop", + "addon.mod_workshop.feedbackby": "workshop", + "addon.mod_workshop.feedbackreviewer": "workshop", + "addon.mod_workshop.givengrades": "workshop", + "addon.mod_workshop.gradecalculated": "workshop", + "addon.mod_workshop.gradeinfo": "workshop", + "addon.mod_workshop.gradeover": "workshop", + "addon.mod_workshop.gradesreport": "workshop", + "addon.mod_workshop.gradinggrade": "workshop", + "addon.mod_workshop.gradinggradecalculated": "workshop", + "addon.mod_workshop.gradinggradeof": "workshop", + "addon.mod_workshop.gradinggradeover": "workshop", + "addon.mod_workshop.nogradeyet": "workshop", + "addon.mod_workshop.notassessed": "workshop", + "addon.mod_workshop.notoverridden": "workshop", + "addon.mod_workshop.noyoursubmission": "workshop", + "addon.mod_workshop.overallfeedback": "workshop", + "addon.mod_workshop.publishedsubmissions": "workshop", + "addon.mod_workshop.publishsubmission": "workshop", + "addon.mod_workshop.publishsubmission_help": "workshop", + "addon.mod_workshop.reassess": "workshop", + "addon.mod_workshop.receivedgrades": "workshop", + "addon.mod_workshop.submissionattachment": "workshop", + "addon.mod_workshop.submissioncontent": "workshop", + "addon.mod_workshop.submissiondeleteconfirm": "workshop", + "addon.mod_workshop.submissiongrade": "workshop", + "addon.mod_workshop.submissiongradeof": "workshop", + "addon.mod_workshop.submissionrequiredcontent": "workshop", + "addon.mod_workshop.submissionsreport": "workshop", + "addon.mod_workshop.submissiontitle": "workshop", + "addon.mod_workshop.switchphase10": "workshop", + "addon.mod_workshop.switchphase20": "workshop", + "addon.mod_workshop.switchphase30": "workshop", + "addon.mod_workshop.switchphase40": "workshop", + "addon.mod_workshop.switchphase50": "workshop", + "addon.mod_workshop.userplan": "workshop", + "addon.mod_workshop.userplancurrentphase": "workshop", + "addon.mod_workshop.warningassessmentmodified": "local_moodlemobileapp", + "addon.mod_workshop.warningsubmissionmodified": "local_moodlemobileapp", + "addon.mod_workshop.weightinfo": "workshop", + "addon.mod_workshop.yourassessment": "workshop/assessmentbyyourself", + "addon.mod_workshop.yourassessmentfor": "workshop", + "addon.mod_workshop.yourgrades": "workshop", + "addon.mod_workshop.yoursubmission": "workshop", + "addon.mod_workshop_assessment_accumulative.dimensioncommentfor": "workshopform_accumulative", + "addon.mod_workshop_assessment_accumulative.dimensiongradefor": "workshopform_accumulative", + "addon.mod_workshop_assessment_accumulative.dimensionnumber": "workshopform_accumulative", + "addon.mod_workshop_assessment_accumulative.mustchoosegrade": "workshopform_accumulative", + "addon.mod_workshop_assessment_comments.dimensioncommentfor": "workshopform_comments", + "addon.mod_workshop_assessment_comments.dimensionnumber": "workshopform_comments", + "addon.mod_workshop_assessment_numerrors.dimensioncommentfor": "workshopform_numerrors", + "addon.mod_workshop_assessment_numerrors.dimensiongradefor": "workshopform_accumulative", + "addon.mod_workshop_assessment_numerrors.dimensionnumber": "workshopform_numerrors", + "addon.mod_workshop_assessment_rubric.dimensionnumber": "workshopform_rubric", + "addon.mod_workshop_assessment_rubric.mustchooseone": "workshopform_rubric", + "addon.notes.addnewnote": "notes", + "addon.notes.coursenotes": "notes", + "addon.notes.eventnotecreated": "notes", + "addon.notes.nonotes": "notes", + "addon.notes.note": "notes", + "addon.notes.notes": "notes", + "addon.notes.personalnotes": "notes", + "addon.notes.publishstate": "notes", + "addon.notes.sitenotes": "notes", + "addon.notes.userwithid": "local_moodlemobileapp", + "addon.notes.warningnotenotsent": "local_moodlemobileapp", + "addon.notifications.errorgetnotifications": "local_moodlemobileapp", + "addon.notifications.markallread": "moodle", + "addon.notifications.notificationpreferences": "message", + "addon.notifications.notifications": "local_moodlemobileapp", + "addon.notifications.playsound": "local_moodlemobileapp", + "addon.notifications.therearentnotificationsyet": "local_moodlemobileapp", + "assets.countries.AD": "countries", + "assets.countries.AE": "countries", + "assets.countries.AF": "countries", + "assets.countries.AG": "countries", + "assets.countries.AI": "countries", + "assets.countries.AL": "countries", + "assets.countries.AM": "countries", + "assets.countries.AO": "countries", + "assets.countries.AQ": "countries", + "assets.countries.AR": "countries", + "assets.countries.AS": "countries", + "assets.countries.AT": "countries", + "assets.countries.AU": "countries", + "assets.countries.AW": "countries", + "assets.countries.AX": "countries", + "assets.countries.AZ": "countries", + "assets.countries.BA": "countries", + "assets.countries.BB": "countries", + "assets.countries.BD": "countries", + "assets.countries.BE": "countries", + "assets.countries.BF": "countries", + "assets.countries.BG": "countries", + "assets.countries.BH": "countries", + "assets.countries.BI": "countries", + "assets.countries.BJ": "countries", + "assets.countries.BL": "countries", + "assets.countries.BM": "countries", + "assets.countries.BN": "countries", + "assets.countries.BO": "countries", + "assets.countries.BQ": "countries", + "assets.countries.BR": "countries", + "assets.countries.BS": "countries", + "assets.countries.BT": "countries", + "assets.countries.BV": "countries", + "assets.countries.BW": "countries", + "assets.countries.BY": "countries", + "assets.countries.BZ": "countries", + "assets.countries.CA": "countries", + "assets.countries.CC": "countries", + "assets.countries.CD": "countries", + "assets.countries.CF": "countries", + "assets.countries.CG": "countries", + "assets.countries.CH": "countries", + "assets.countries.CI": "countries", + "assets.countries.CK": "countries", + "assets.countries.CL": "countries", + "assets.countries.CM": "countries", + "assets.countries.CN": "countries", + "assets.countries.CO": "countries", + "assets.countries.CR": "countries", + "assets.countries.CU": "countries", + "assets.countries.CV": "countries", + "assets.countries.CW": "countries", + "assets.countries.CX": "countries", + "assets.countries.CY": "countries", + "assets.countries.CZ": "countries", + "assets.countries.DE": "countries", + "assets.countries.DJ": "countries", + "assets.countries.DK": "countries", + "assets.countries.DM": "countries", + "assets.countries.DO": "countries", + "assets.countries.DZ": "countries", + "assets.countries.EC": "countries", + "assets.countries.EE": "countries", + "assets.countries.EG": "countries", + "assets.countries.EH": "countries", + "assets.countries.ER": "countries", + "assets.countries.ES": "countries", + "assets.countries.ET": "countries", + "assets.countries.FI": "countries", + "assets.countries.FJ": "countries", + "assets.countries.FK": "countries", + "assets.countries.FM": "countries", + "assets.countries.FO": "countries", + "assets.countries.FR": "countries", + "assets.countries.GA": "countries", + "assets.countries.GB": "countries", + "assets.countries.GD": "countries", + "assets.countries.GE": "countries", + "assets.countries.GF": "countries", + "assets.countries.GG": "countries", + "assets.countries.GH": "countries", + "assets.countries.GI": "countries", + "assets.countries.GL": "countries", + "assets.countries.GM": "countries", + "assets.countries.GN": "countries", + "assets.countries.GP": "countries", + "assets.countries.GQ": "countries", + "assets.countries.GR": "countries", + "assets.countries.GS": "countries", + "assets.countries.GT": "countries", + "assets.countries.GU": "countries", + "assets.countries.GW": "countries", + "assets.countries.GY": "countries", + "assets.countries.HK": "countries", + "assets.countries.HM": "countries", + "assets.countries.HN": "countries", + "assets.countries.HR": "countries", + "assets.countries.HT": "countries", + "assets.countries.HU": "countries", + "assets.countries.ID": "countries", + "assets.countries.IE": "countries", + "assets.countries.IL": "countries", + "assets.countries.IM": "countries", + "assets.countries.IN": "countries", + "assets.countries.IO": "countries", + "assets.countries.IQ": "countries", + "assets.countries.IR": "countries", + "assets.countries.IS": "countries", + "assets.countries.IT": "countries", + "assets.countries.JE": "countries", + "assets.countries.JM": "countries", + "assets.countries.JO": "countries", + "assets.countries.JP": "countries", + "assets.countries.KE": "countries", + "assets.countries.KG": "countries", + "assets.countries.KH": "countries", + "assets.countries.KI": "countries", + "assets.countries.KM": "countries", + "assets.countries.KN": "countries", + "assets.countries.KP": "countries", + "assets.countries.KR": "countries", + "assets.countries.KW": "countries", + "assets.countries.KY": "countries", + "assets.countries.KZ": "countries", + "assets.countries.LA": "countries", + "assets.countries.LB": "countries", + "assets.countries.LC": "countries", + "assets.countries.LI": "countries", + "assets.countries.LK": "countries", + "assets.countries.LR": "countries", + "assets.countries.LS": "countries", + "assets.countries.LT": "countries", + "assets.countries.LU": "countries", + "assets.countries.LV": "countries", + "assets.countries.LY": "countries", + "assets.countries.MA": "countries", + "assets.countries.MC": "countries", + "assets.countries.MD": "countries", + "assets.countries.ME": "countries", + "assets.countries.MF": "countries", + "assets.countries.MG": "countries", + "assets.countries.MH": "countries", + "assets.countries.MK": "countries", + "assets.countries.ML": "countries", + "assets.countries.MM": "countries", + "assets.countries.MN": "countries", + "assets.countries.MO": "countries", + "assets.countries.MP": "countries", + "assets.countries.MQ": "countries", + "assets.countries.MR": "countries", + "assets.countries.MS": "countries", + "assets.countries.MT": "countries", + "assets.countries.MU": "countries", + "assets.countries.MV": "countries", + "assets.countries.MW": "countries", + "assets.countries.MX": "countries", + "assets.countries.MY": "countries", + "assets.countries.MZ": "countries", + "assets.countries.NA": "countries", + "assets.countries.NC": "countries", + "assets.countries.NE": "countries", + "assets.countries.NF": "countries", + "assets.countries.NG": "countries", + "assets.countries.NI": "countries", + "assets.countries.NL": "countries", + "assets.countries.NO": "countries", + "assets.countries.NP": "countries", + "assets.countries.NR": "countries", + "assets.countries.NU": "countries", + "assets.countries.NZ": "countries", + "assets.countries.OM": "countries", + "assets.countries.PA": "countries", + "assets.countries.PE": "countries", + "assets.countries.PF": "countries", + "assets.countries.PG": "countries", + "assets.countries.PH": "countries", + "assets.countries.PK": "countries", + "assets.countries.PL": "countries", + "assets.countries.PM": "countries", + "assets.countries.PN": "countries", + "assets.countries.PR": "countries", + "assets.countries.PS": "countries", + "assets.countries.PT": "countries", + "assets.countries.PW": "countries", + "assets.countries.PY": "countries", + "assets.countries.QA": "countries", + "assets.countries.RE": "countries", + "assets.countries.RO": "countries", + "assets.countries.RS": "countries", + "assets.countries.RU": "countries", + "assets.countries.RW": "countries", + "assets.countries.SA": "countries", + "assets.countries.SB": "countries", + "assets.countries.SC": "countries", + "assets.countries.SD": "countries", + "assets.countries.SE": "countries", + "assets.countries.SG": "countries", + "assets.countries.SH": "countries", + "assets.countries.SI": "countries", + "assets.countries.SJ": "countries", + "assets.countries.SK": "countries", + "assets.countries.SL": "countries", + "assets.countries.SM": "countries", + "assets.countries.SN": "countries", + "assets.countries.SO": "countries", + "assets.countries.SR": "countries", + "assets.countries.SS": "countries", + "assets.countries.ST": "countries", + "assets.countries.SV": "countries", + "assets.countries.SX": "countries", + "assets.countries.SY": "countries", + "assets.countries.SZ": "countries", + "assets.countries.TC": "countries", + "assets.countries.TD": "countries", + "assets.countries.TF": "countries", + "assets.countries.TG": "countries", + "assets.countries.TH": "countries", + "assets.countries.TJ": "countries", + "assets.countries.TK": "countries", + "assets.countries.TL": "countries", + "assets.countries.TM": "countries", + "assets.countries.TN": "countries", + "assets.countries.TO": "countries", + "assets.countries.TR": "countries", + "assets.countries.TT": "countries", + "assets.countries.TV": "countries", + "assets.countries.TW": "countries", + "assets.countries.TZ": "countries", + "assets.countries.UA": "countries", + "assets.countries.UG": "countries", + "assets.countries.UM": "countries", + "assets.countries.US": "countries", + "assets.countries.UY": "countries", + "assets.countries.UZ": "countries", + "assets.countries.VA": "countries", + "assets.countries.VC": "countries", + "assets.countries.VE": "countries", + "assets.countries.VG": "countries", + "assets.countries.VI": "countries", + "assets.countries.VN": "countries", + "assets.countries.VU": "countries", + "assets.countries.WF": "countries", + "assets.countries.WS": "countries", + "assets.countries.YE": "countries", + "assets.countries.YT": "countries", + "assets.countries.ZA": "countries", + "assets.countries.ZM": "countries", + "assets.countries.ZW": "countries", + "assets.mimetypes.application/epub_zip": "mimetypes", + "assets.mimetypes.application/msword": "mimetypes", + "assets.mimetypes.application/pdf": "mimetypes", + "assets.mimetypes.application/vnd.moodle.backup": "mimetypes", + "assets.mimetypes.application/vnd.ms-excel": "mimetypes", + "assets.mimetypes.application/vnd.ms-excel.sheet.macroEnabled.12": "mimetypes", + "assets.mimetypes.application/vnd.ms-powerpoint": "mimetypes", + "assets.mimetypes.application/vnd.oasis.opendocument.spreadsheet": "mimetypes", + "assets.mimetypes.application/vnd.oasis.opendocument.spreadsheet-template": "mimetypes", + "assets.mimetypes.application/vnd.oasis.opendocument.text": "mimetypes", + "assets.mimetypes.application/vnd.oasis.opendocument.text-template": "mimetypes", + "assets.mimetypes.application/vnd.oasis.opendocument.text-web": "mimetypes", + "assets.mimetypes.application/vnd.openxmlformats-officedocument.presentationml.presentation": "mimetypes", + "assets.mimetypes.application/vnd.openxmlformats-officedocument.presentationml.slideshow": "mimetypes", + "assets.mimetypes.application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "mimetypes", + "assets.mimetypes.application/vnd.openxmlformats-officedocument.spreadsheetml.template": "mimetypes", + "assets.mimetypes.application/vnd.openxmlformats-officedocument.wordprocessingml.document": "mimetypes", + "assets.mimetypes.application/x-iwork-keynote-sffkey": "mimetypes", + "assets.mimetypes.application/x-iwork-numbers-sffnumbers": "mimetypes", + "assets.mimetypes.application/x-iwork-pages-sffpages": "mimetypes", + "assets.mimetypes.application/x-javascript": "mimetypes", + "assets.mimetypes.application/x-mspublisher": "mimetypes", + "assets.mimetypes.application/x-shockwave-flash": "mimetypes", + "assets.mimetypes.application/xhtml_xml": "mimetypes", + "assets.mimetypes.archive": "mimetypes", + "assets.mimetypes.audio": "mimetypes", + "assets.mimetypes.default": "mimetypes", + "assets.mimetypes.document/unknown": "mimetypes", + "assets.mimetypes.group:archive": "mimetypes", + "assets.mimetypes.group:audio": "mimetypes", + "assets.mimetypes.group:document": "mimetypes", + "assets.mimetypes.group:html_audio": "mimetypes", + "assets.mimetypes.group:html_track": "mimetypes", + "assets.mimetypes.group:html_video": "mimetypes", + "assets.mimetypes.group:image": "mimetypes", + "assets.mimetypes.group:presentation": "mimetypes", + "assets.mimetypes.group:sourcecode": "mimetypes", + "assets.mimetypes.group:spreadsheet": "mimetypes", + "assets.mimetypes.group:video": "mimetypes", + "assets.mimetypes.group:web_audio": "mimetypes", + "assets.mimetypes.group:web_file": "mimetypes", + "assets.mimetypes.group:web_image": "mimetypes", + "assets.mimetypes.group:web_video": "mimetypes", + "assets.mimetypes.image": "mimetypes", + "assets.mimetypes.image/vnd.microsoft.icon": "mimetypes", + "assets.mimetypes.text/css": "mimetypes", + "assets.mimetypes.text/csv": "mimetypes", + "assets.mimetypes.text/html": "mimetypes", + "assets.mimetypes.text/plain": "mimetypes", + "assets.mimetypes.text/rtf": "mimetypes", + "assets.mimetypes.text/vtt": "mimetypes", + "assets.mimetypes.video": "mimetypes", + "core.accounts": "admin", + "core.add": "moodle", + "core.agelocationverification": "moodle", + "core.allparticipants": "moodle", + "core.android": "local_moodlemobileapp", + "core.answer": "moodle", + "core.answered": "quiz", + "core.areyousure": "moodle", + "core.back": "moodle", + "core.cancel": "moodle", + "core.cannotconnect": "local_moodlemobileapp", + "core.cannotdownloadfiles": "local_moodlemobileapp", + "core.captureaudio": "local_moodlemobileapp", + "core.capturedimage": "local_moodlemobileapp", + "core.captureimage": "local_moodlemobileapp", + "core.capturevideo": "local_moodlemobileapp", + "core.category": "moodle", + "core.choose": "moodle", + "core.choosedots": "moodle", + "core.clearsearch": "local_moodlemobileapp", + "core.clicktohideshow": "moodle", + "core.clicktoseefull": "local_moodlemobileapp", + "core.close": "repository", + "core.comments": "moodle", + "core.commentscount": "moodle", + "core.commentsnotworking": "local_moodlemobileapp", + "core.completion-alt-auto-fail": "completion", + "core.completion-alt-auto-n": "completion", + "core.completion-alt-auto-n-override": "completion", + "core.completion-alt-auto-pass": "completion", + "core.completion-alt-auto-y": "completion", + "core.completion-alt-auto-y-override": "completion", + "core.completion-alt-manual-n": "completion", + "core.completion-alt-manual-n-override": "completion", + "core.completion-alt-manual-y": "completion", + "core.completion-alt-manual-y-override": "completion", + "core.confirmcanceledit": "local_moodlemobileapp", + "core.confirmdeletefile": "repository", + "core.confirmloss": "local_moodlemobileapp", + "core.confirmopeninbrowser": "local_moodlemobileapp", + "core.considereddigitalminor": "moodle", + "core.content": "moodle", + "core.contenteditingsynced": "local_moodlemobileapp", + "core.contentlinks.chooseaccount": "local_moodlemobileapp", + "core.contentlinks.chooseaccounttoopenlink": "local_moodlemobileapp", + "core.contentlinks.confirmurlothersite": "local_moodlemobileapp", + "core.contentlinks.errornoactions": "local_moodlemobileapp", + "core.contentlinks.errornosites": "local_moodlemobileapp", + "core.continue": "moodle", + "core.copiedtoclipboard": "local_moodlemobileapp", + "core.course": "moodle", + "core.course.activitydisabled": "local_moodlemobileapp", + "core.course.activitynotyetviewableremoteaddon": "local_moodlemobileapp", + "core.course.activitynotyetviewablesiteupgradeneeded": "local_moodlemobileapp", + "core.course.allsections": "local_moodlemobileapp", + "core.course.askadmintosupport": "local_moodlemobileapp", + "core.course.confirmdeletemodulefiles": "local_moodlemobileapp", + "core.course.confirmdownload": "local_moodlemobileapp", + "core.course.confirmdownloadunknownsize": "local_moodlemobileapp", + "core.course.confirmpartialdownloadsize": "local_moodlemobileapp", + "core.course.contents": "local_moodlemobileapp", + "core.course.couldnotloadsectioncontent": "local_moodlemobileapp", + "core.course.couldnotloadsections": "local_moodlemobileapp", + "core.course.coursesummary": "moodle", + "core.course.downloadcourse": "local_moodlemobileapp", + "core.course.errordownloadingcourse": "local_moodlemobileapp", + "core.course.errordownloadingsection": "local_moodlemobileapp", + "core.course.errorgetmodule": "local_moodlemobileapp", + "core.course.hiddenfromstudents": "moodle", + "core.course.hiddenoncoursepage": "moodle", + "core.course.nocontentavailable": "local_moodlemobileapp", + "core.course.overriddennotice": "grades", + "core.course.sections": "moodle", + "core.course.useactivityonbrowser": "local_moodlemobileapp", + "core.coursedetails": "moodle", + "core.courses.allowguests": "enrol_guest", + "core.courses.availablecourses": "moodle", + "core.courses.cannotretrievemorecategories": "local_moodlemobileapp", + "core.courses.categories": "moodle", + "core.courses.confirmselfenrol": "local_moodlemobileapp", + "core.courses.courseoverview": "moodle", + "core.courses.courses": "moodle", + "core.courses.downloadcourses": "local_moodlemobileapp", + "core.courses.enrolme": "local_moodlemobileapp", + "core.courses.errorloadcategories": "local_moodlemobileapp", + "core.courses.errorloadcourses": "local_moodlemobileapp", + "core.courses.errorsearching": "local_moodlemobileapp", + "core.courses.errorselfenrol": "local_moodlemobileapp", + "core.courses.filtermycourses": "local_moodlemobileapp", + "core.courses.frontpage": "admin", + "core.courses.future": "block_myoverview", + "core.courses.inprogress": "block_myoverview", + "core.courses.morecourses": "block_myoverview", + "core.courses.mycourses": "moodle", + "core.courses.next30days": "block_timeline", + "core.courses.next7days": "block_timeline", + "core.courses.nocourses": "local_moodlemobileapp", + "core.courses.nocoursesfuture": "block_myoverview", + "core.courses.nocoursesinprogress": "block_myoverview", + "core.courses.nocoursesoverview": "moodle/nocourses", + "core.courses.nocoursespast": "block_myoverview", + "core.courses.nocoursesyet": "moodle", + "core.courses.noevents": "block_timeline", + "core.courses.nosearchresults": "wiki", + "core.courses.notenroled": "completion", + "core.courses.notenrollable": "local_moodlemobileapp", + "core.courses.password": "local_moodlemobileapp", + "core.courses.past": "block_myoverview", + "core.courses.paymentrequired": "moodle", + "core.courses.paypalaccepted": "enrol_paypal", + "core.courses.search": "moodle", + "core.courses.searchcourses": "moodle", + "core.courses.searchcoursesadvice": "local_moodlemobileapp", + "core.courses.selfenrolment": "local_moodlemobileapp", + "core.courses.sendpaymentbutton": "enrol_paypal", + "core.courses.sortbycourses": "block_timeline", + "core.courses.sortbydates": "block_timeline", + "core.courses.timeline": "block_dashboard", + "core.courses.totalcoursesearchresults": "local_moodlemobileapp", + "core.currentdevice": "local_moodlemobileapp", + "core.datastoredoffline": "local_moodlemobileapp", + "core.date": "moodle", + "core.day": "moodle", + "core.days": "moodle", + "core.decsep": "langconfig", + "core.defaultvalue": "tool_usertours", + "core.delete": "moodle", + "core.deletedoffline": "local_moodlemobileapp", + "core.deleting": "local_moodlemobileapp", + "core.description": "moodle", + "core.dfdaymonthyear": "local_moodlemobileapp", + "core.dfdayweekmonth": "local_moodlemobileapp", + "core.dffulldate": "local_moodlemobileapp", + "core.dflastweekdate": "local_moodlemobileapp", + "core.dfmediumdate": "local_moodlemobileapp", + "core.dftimedate": "local_moodlemobileapp", + "core.digitalminor": "moodle", + "core.digitalminor_desc": "moodle", + "core.discard": "local_moodlemobileapp", + "core.dismiss": "local_moodlemobileapp", + "core.done": "survey", + "core.download": "moodle", + "core.downloading": "local_moodlemobileapp", + "core.edit": "moodle", + "core.emptysplit": "local_moodlemobileapp", + "core.error": "moodle", + "core.errorchangecompletion": "local_moodlemobileapp", + "core.errordeletefile": "local_moodlemobileapp", + "core.errordownloading": "local_moodlemobileapp", + "core.errordownloadingsomefiles": "local_moodlemobileapp", + "core.errorfileexistssamename": "local_moodlemobileapp", + "core.errorinvalidform": "local_moodlemobileapp", + "core.errorinvalidresponse": "local_moodlemobileapp", + "core.errorloadingcontent": "local_moodlemobileapp", + "core.erroropenfilenoapp": "local_moodlemobileapp", + "core.erroropenfilenoextension": "local_moodlemobileapp", + "core.erroropenpopup": "local_moodlemobileapp", + "core.errorrenamefile": "local_moodlemobileapp", + "core.errorsync": "local_moodlemobileapp", + "core.errorsyncblocked": "local_moodlemobileapp", + "core.explanationdigitalminor": "moodle", + "core.filename": "repository", + "core.filenameexist": "local_moodlemobileapp", + "core.fileuploader.addfiletext": "local_moodlemobileapp", + "core.fileuploader.audio": "local_moodlemobileapp", + "core.fileuploader.camera": "local_moodlemobileapp", + "core.fileuploader.confirmuploadfile": "local_moodlemobileapp", + "core.fileuploader.confirmuploadunknownsize": "local_moodlemobileapp", + "core.fileuploader.errorcapturingaudio": "local_moodlemobileapp", + "core.fileuploader.errorcapturingimage": "local_moodlemobileapp", + "core.fileuploader.errorcapturingvideo": "local_moodlemobileapp", + "core.fileuploader.errorgettingimagealbum": "local_moodlemobileapp", + "core.fileuploader.errormustbeonlinetoupload": "local_moodlemobileapp", + "core.fileuploader.errornoapp": "local_moodlemobileapp", + "core.fileuploader.errorreadingfile": "local_moodlemobileapp", + "core.fileuploader.errorwhileuploading": "local_moodlemobileapp", + "core.fileuploader.file": "local_moodlemobileapp", + "core.fileuploader.filesofthesetypes": "local_moodlemobileapp", + "core.fileuploader.fileuploaded": "local_moodlemobileapp", + "core.fileuploader.invalidfiletype": "repository", + "core.fileuploader.maxbytesfile": "local_moodlemobileapp", + "core.fileuploader.more": "data", + "core.fileuploader.photoalbums": "local_moodlemobileapp", + "core.fileuploader.readingfile": "local_moodlemobileapp", + "core.fileuploader.selectafile": "local_moodlemobileapp", + "core.fileuploader.uploadafile": "local_moodlemobileapp", + "core.fileuploader.uploading": "local_moodlemobileapp", + "core.fileuploader.uploadingperc": "local_moodlemobileapp", + "core.fileuploader.video": "local_moodlemobileapp", + "core.folder": "moodle", + "core.forcepasswordchangenotice": "moodle", + "core.fulllistofcourses": "moodle", + "core.fullnameandsitename": "local_moodlemobileapp", + "core.grades.average": "grades", + "core.grades.badgrade": "grades", + "core.grades.contributiontocoursetotal": "grades", + "core.grades.feedback": "grades", + "core.grades.grade": "grades", + "core.grades.gradeitem": "grades", + "core.grades.grades": "grades", + "core.grades.lettergrade": "grades", + "core.grades.nogradesreturned": "grades", + "core.grades.nooutcome": "grades", + "core.grades.percentage": "grades", + "core.grades.range": "grades", + "core.grades.rank": "grades", + "core.grades.weight": "grades", + "core.groupsseparate": "moodle", + "core.groupsvisible": "moodle", + "core.hasdatatosync": "local_moodlemobileapp", + "core.help": "moodle", + "core.hide": "moodle", + "core.hour": "moodle", + "core.hours": "moodle", + "core.humanreadablesize": "local_moodlemobileapp", + "core.image": "local_moodlemobileapp", + "core.imageviewer": "local_moodlemobileapp", + "core.info": "moodle", + "core.ios": "local_moodlemobileapp", + "core.labelsep": "langconfig", + "core.lastaccess": "moodle", + "core.lastdownloaded": "local_moodlemobileapp", + "core.lastmodified": "moodle", + "core.lastsync": "local_moodlemobileapp", + "core.layoutgrid": "workshopform_rubric", + "core.list": "moodle", + "core.listsep": "langconfig", + "core.loading": "moodle", + "core.loadmore": "local_moodlemobileapp", + "core.location": "moodle", + "core.login.auth_email": "auth_email/pluginname", + "core.login.authenticating": "local_moodlemobileapp", + "core.login.cancel": "moodle", + "core.login.checksiteversion": "local_moodlemobileapp", + "core.login.confirmdeletesite": "local_moodlemobileapp", + "core.login.connect": "local_moodlemobileapp", + "core.login.connecttomoodle": "local_moodlemobileapp", + "core.login.contactyouradministrator": "local_moodlemobileapp", + "core.login.contactyouradministratorissue": "local_moodlemobileapp", + "core.login.createaccount": "moodle", + "core.login.createuserandpass": "moodle", + "core.login.credentialsdescription": "local_moodlemobileapp", + "core.login.emailconfirmsent": "local_moodlemobileapp", + "core.login.emailnotmatch": "local_moodlemobileapp", + "core.login.enterthewordsabove": "auth", + "core.login.erroraccesscontrolalloworigin": "local_moodlemobileapp", + "core.login.errordeletesite": "local_moodlemobileapp", + "core.login.errorupdatesite": "local_moodlemobileapp", + "core.login.firsttime": "moodle", + "core.login.forgotten": "moodle", + "core.login.getanothercaptcha": "auth", + "core.login.help": "moodle", + "core.login.helpmelogin": "local_moodlemobileapp", + "core.login.instructions": "auth", + "core.login.invalidaccount": "local_moodlemobileapp", + "core.login.invaliddate": "local_moodlemobileapp", + "core.login.invalidemail": "moodle", + "core.login.invalidmoodleversion": "local_moodlemobileapp", + "core.login.invalidsite": "local_moodlemobileapp", + "core.login.invalidtime": "local_moodlemobileapp", + "core.login.invalidurl": "scorm", + "core.login.invalidvaluemax": "local_moodlemobileapp", + "core.login.invalidvaluemin": "local_moodlemobileapp", + "core.login.localmobileunexpectedresponse": "local_moodlemobileapp", + "core.login.loggedoutssodescription": "local_moodlemobileapp", + "core.login.login": "moodle", + "core.login.loginbutton": "local_moodlemobileapp", + "core.login.logininsiterequired": "local_moodlemobileapp", + "core.login.loginsteps": "moodle", + "core.login.missingemail": "moodle", + "core.login.missingfirstname": "moodle", + "core.login.missinglastname": "moodle", + "core.login.mobileservicesnotenabled": "local_moodlemobileapp", + "core.login.newaccount": "moodle", + "core.login.newsitedescription": "local_moodlemobileapp", + "core.login.notloggedin": "local_moodlemobileapp", + "core.login.password": "moodle", + "core.login.passwordforgotten": "moodle", + "core.login.passwordforgotteninstructions2": "moodle", + "core.login.passwordrequired": "local_moodlemobileapp", + "core.login.policyaccept": "moodle", + "core.login.policyagree": "moodle", + "core.login.policyagreement": "moodle", + "core.login.policyagreementclick": "moodle", + "core.login.potentialidps": "auth", + "core.login.problemconnectingerror": "local_moodlemobileapp", + "core.login.problemconnectingerrorcontinue": "local_moodlemobileapp", + "core.login.profileinvaliddata": "admin", + "core.login.recaptchachallengeimage": "local_moodlemobileapp", + "core.login.reconnect": "local_moodlemobileapp", + "core.login.reconnectdescription": "local_moodlemobileapp", + "core.login.reconnectssodescription": "local_moodlemobileapp", + "core.login.searchby": "local_moodlemobileapp", + "core.login.security_question": "auth", + "core.login.selectacountry": "moodle", + "core.login.selectsite": "local_moodlemobileapp", + "core.login.signupplugindisabled": "local_moodlemobileapp", + "core.login.siteaddress": "local_moodlemobileapp", + "core.login.siteinmaintenance": "local_moodlemobileapp", + "core.login.sitepolicynotagreederror": "local_moodlemobileapp", + "core.login.siteurl": "local_moodlemobileapp", + "core.login.siteurlrequired": "local_moodlemobileapp", + "core.login.startsignup": "moodle", + "core.login.stillcantconnect": "local_moodlemobileapp", + "core.login.supplyinfo": "moodle", + "core.login.username": "moodle", + "core.login.usernameoremail": "moodle", + "core.login.usernamerequired": "local_moodlemobileapp", + "core.login.usernotaddederror": "error", + "core.login.visitchangepassword": "local_moodlemobileapp", + "core.login.webservicesnotenabled": "local_moodlemobileapp", + "core.lostconnection": "local_moodlemobileapp", + "core.mainmenu.appsettings": "local_moodlemobileapp", + "core.mainmenu.changesite": "local_moodlemobileapp", + "core.mainmenu.help": "moodle", + "core.mainmenu.logout": "moodle", + "core.mainmenu.mycourses": "moodle", + "core.mainmenu.togglemenu": "local_moodlemobileapp", + "core.mainmenu.website": "local_moodlemobileapp", + "core.maxsizeandattachments": "moodle", + "core.min": "moodle", + "core.mins": "moodle", + "core.mod_assign": "assign/pluginname", + "core.mod_assignment": "assignment/pluginname", + "core.mod_book": "book/pluginname", + "core.mod_chat": "chat/pluginname", + "core.mod_choice": "choice/pluginname", + "core.mod_data": "data/pluginname", + "core.mod_database": "data/pluginname", + "core.mod_external-tool": "lti/pluginname", + "core.mod_feedback": "feedback/pluginname", + "core.mod_file": "moodle/file", + "core.mod_folder": "folder/pluginname", + "core.mod_forum": "forum/pluginname", + "core.mod_glossary": "glossary/pluginname", + "core.mod_ims": "imscp/pluginname", + "core.mod_imscp": "imscp/pluginname", + "core.mod_label": "label/pluginname", + "core.mod_lesson": "lesson/pluginname", + "core.mod_lti": "lti/pluginname", + "core.mod_page": "page/pluginname", + "core.mod_quiz": "quiz/pluginname", + "core.mod_resource": "resource/pluginname", + "core.mod_scorm": "scorm/pluginname", + "core.mod_survey": "survey/pluginname", + "core.mod_url": "url/pluginname", + "core.mod_wiki": "wiki/pluginname", + "core.mod_workshop": "workshop/pluginname", + "core.moduleintro": "moodle", + "core.more": "moodle", + "core.mygroups": "group", + "core.name": "moodle", + "core.networkerrormsg": "local_moodlemobileapp", + "core.never": "moodle", + "core.next": "moodle", + "core.no": "moodle", + "core.nocomments": "moodle", + "core.nograde": "moodle", + "core.none": "moodle", + "core.nopasswordchangeforced": "local_moodlemobileapp", + "core.nopermissions": "error", + "core.noresults": "moodle", + "core.notapplicable": "local_moodlemobileapp", + "core.notice": "moodle", + "core.notsent": "local_moodlemobileapp", + "core.now": "moodle", + "core.numwords": "moodle", + "core.offline": "message", + "core.ok": "moodle", + "core.online": "message", + "core.openfullimage": "local_moodlemobileapp", + "core.openinbrowser": "local_moodlemobileapp", + "core.othergroups": "group", + "core.pagea": "moodle", + "core.paymentinstant": "moodle", + "core.percentagenumber": "local_moodlemobileapp", + "core.phone": "moodle", + "core.pictureof": "moodle", + "core.previous": "moodle", + "core.proceed": "moodle", + "core.pulltorefresh": "local_moodlemobileapp", + "core.question.answer": "question", + "core.question.answersaved": "question", + "core.question.certainty": "qbehaviour_deferredcbm", + "core.question.complete": "question", + "core.question.correct": "question", + "core.question.errorattachmentsnotsupported": "local_moodlemobileapp", + "core.question.errorinlinefilesnotsupported": "local_moodlemobileapp", + "core.question.errorquestionnotsupported": "local_moodlemobileapp", + "core.question.feedback": "question", + "core.question.howtodraganddrop": "local_moodlemobileapp", + "core.question.incorrect": "question", + "core.question.information": "question", + "core.question.invalidanswer": "question", + "core.question.notanswered": "question", + "core.question.notyetanswered": "question", + "core.question.partiallycorrect": "question", + "core.question.questionmessage": "local_moodlemobileapp", + "core.question.questionno": "question", + "core.question.requiresgrading": "question", + "core.question.unknown": "local_moodlemobileapp", + "core.quotausage": "moodle", + "core.redirectingtosite": "local_moodlemobileapp", + "core.refresh": "moodle", + "core.required": "moodle", + "core.requireduserdatamissing": "local_moodlemobileapp", + "core.restore": "moodle", + "core.retry": "local_moodlemobileapp", + "core.save": "moodle", + "core.search": "moodle", + "core.searching": "local_moodlemobileapp", + "core.searchresults": "moodle", + "core.sec": "moodle", + "core.secs": "moodle", + "core.seemoredetail": "survey", + "core.send": "message", + "core.sending": "chat", + "core.serverconnection": "error", + "core.settings.about": "local_moodlemobileapp", + "core.settings.appready": "local_moodlemobileapp", + "core.settings.cannotsyncoffline": "local_moodlemobileapp", + "core.settings.cannotsyncwithoutwifi": "local_moodlemobileapp", + "core.settings.cordovadevicemodel": "local_moodlemobileapp", + "core.settings.cordovadeviceosversion": "local_moodlemobileapp", + "core.settings.cordovadeviceplatform": "local_moodlemobileapp", + "core.settings.cordovadeviceuuid": "local_moodlemobileapp", + "core.settings.cordovaversion": "local_moodlemobileapp", + "core.settings.currentlanguage": "moodle", + "core.settings.deletesitefiles": "local_moodlemobileapp", + "core.settings.deletesitefilestitle": "local_moodlemobileapp", + "core.settings.deviceinfo": "local_moodlemobileapp", + "core.settings.deviceos": "local_moodlemobileapp", + "core.settings.devicewebworkers": "local_moodlemobileapp", + "core.settings.disableall": "message", + "core.settings.disabled": "lesson", + "core.settings.displayformat": "local_moodlemobileapp", + "core.settings.enabledownloadsection": "local_moodlemobileapp", + "core.settings.enablerichtexteditor": "local_moodlemobileapp", + "core.settings.enablerichtexteditordescription": "local_moodlemobileapp", + "core.settings.enablesyncwifi": "local_moodlemobileapp", + "core.settings.errordeletesitefiles": "local_moodlemobileapp", + "core.settings.errorsyncsite": "local_moodlemobileapp", + "core.settings.estimatedfreespace": "local_moodlemobileapp", + "core.settings.filesystemroot": "local_moodlemobileapp", + "core.settings.general": "moodle", + "core.settings.language": "moodle", + "core.settings.license": "moodle", + "core.settings.localnotifavailable": "local_moodlemobileapp", + "core.settings.locationhref": "local_moodlemobileapp", + "core.settings.locked": "admin", + "core.settings.loggedin": "message", + "core.settings.loggedoff": "message", + "core.settings.navigatorlanguage": "local_moodlemobileapp", + "core.settings.navigatoruseragent": "local_moodlemobileapp", + "core.settings.networkstatus": "local_moodlemobileapp", + "core.settings.privacypolicy": "local_moodlemobileapp", + "core.settings.reportinbackground": "local_moodlemobileapp", + "core.settings.settings": "moodle", + "core.settings.sites": "moodle", + "core.settings.spaceusage": "local_moodlemobileapp", + "core.settings.synchronization": "local_moodlemobileapp", + "core.settings.synchronizenow": "local_moodlemobileapp", + "core.settings.syncsettings": "local_moodlemobileapp", + "core.settings.total": "moodle", + "core.settings.versioncode": "local_moodlemobileapp", + "core.settings.versionname": "local_moodlemobileapp", + "core.settings.wificonnection": "local_moodlemobileapp", + "core.sharedfiles.chooseaccountstorefile": "local_moodlemobileapp", + "core.sharedfiles.chooseactionrepeatedfile": "local_moodlemobileapp", + "core.sharedfiles.errorreceivefilenosites": "local_moodlemobileapp", + "core.sharedfiles.nosharedfiles": "local_moodlemobileapp", + "core.sharedfiles.nosharedfilestoupload": "local_moodlemobileapp", + "core.sharedfiles.rename": "local_moodlemobileapp", + "core.sharedfiles.replace": "local_moodlemobileapp", + "core.sharedfiles.sharedfiles": "local_moodlemobileapp", + "core.sharedfiles.successstorefile": "local_moodlemobileapp", + "core.show": "moodle", + "core.showmore": "form", + "core.site": "moodle", + "core.sitehome.sitehome": "moodle", + "core.sitehome.sitenews": "moodle", + "core.sitemaintenance": "admin", + "core.sizeb": "moodle", + "core.sizegb": "moodle", + "core.sizekb": "moodle", + "core.sizemb": "moodle", + "core.sizetb": "local_moodlemobileapp", + "core.sorry": "local_moodlemobileapp", + "core.sortby": "moodle", + "core.start": "grouptool", + "core.submit": "moodle", + "core.success": "moodle", + "core.tablet": "local_moodlemobileapp", + "core.teachers": "moodle", + "core.thereisdatatosync": "local_moodlemobileapp", + "core.thisdirection": "langconfig", + "core.time": "moodle", + "core.timesup": "quiz", + "core.today": "moodle", + "core.tryagain": "local_moodlemobileapp", + "core.twoparagraphs": "local_moodlemobileapp", + "core.uhoh": "local_moodlemobileapp", + "core.unexpectederror": "local_moodlemobileapp", + "core.unicodenotsupported": "local_moodlemobileapp", + "core.unicodenotsupportedcleanerror": "local_moodlemobileapp", + "core.unknown": "local_moodlemobileapp", + "core.unlimited": "moodle", + "core.unzipping": "local_moodlemobileapp", + "core.upgraderunning": "error", + "core.user.address": "moodle", + "core.user.city": "moodle", + "core.user.contact": "local_moodlemobileapp", + "core.user.country": "moodle", + "core.user.description": "moodle", + "core.user.details": "report_security", + "core.user.detailsnotavailable": "local_moodlemobileapp", + "core.user.editingteacher": "local_moodlemobileapp", + "core.user.email": "moodle", + "core.user.emailagain": "moodle", + "core.user.firstname": "moodle", + "core.user.interests": "moodle", + "core.user.lastname": "moodle", + "core.user.manager": "local_moodlemobileapp", + "core.user.newpicture": "moodle", + "core.user.noparticipants": "error", + "core.user.participants": "moodle", + "core.user.phone1": "moodle", + "core.user.phone2": "moodle", + "core.user.roles": "moodle", + "core.user.sendemail": "local_moodlemobileapp", + "core.user.student": "local_moodlemobileapp", + "core.user.teacher": "local_moodlemobileapp", + "core.user.webpage": "moodle", + "core.userdeleted": "moodle", + "core.userdetails": "moodle", + "core.usernotfullysetup": "error", + "core.users": "moodle", + "core.view": "moodle", + "core.viewprofile": "moodle", + "core.warningofflinedatadeleted": "local_moodlemobileapp", + "core.whatisyourage": "moodle", + "core.wheredoyoulive": "moodle", + "core.whoops": "local_moodlemobileapp", + "core.whyisthishappening": "local_moodlemobileapp", + "core.whyisthisrequired": "moodle", + "core.windowsphone": "local_moodlemobileapp", + "core.wsfunctionnotavailable": "local_moodlemobileapp", + "core.year": "moodle", + "core.years": "moodle", + "core.yes": "moodle" +} diff --git a/scripts/moodle_to_json.php b/scripts/moodle_to_json.php new file mode 100644 index 000000000..0a3be70b2 --- /dev/null +++ b/scripts/moodle_to_json.php @@ -0,0 +1,152 @@ +. + +/** + * Script for getting an specific string + */ + +// Check we are in CLI. +if (isset($_SERVER['REMOTE_ADDR'])) { + exit(1); +} +define('MOODLE_INTERNAL', 1); +define('LANGPACKSFOLDER', '../../moodle-langpacks'); +define('ASSETSPATH', '../src/assets/lang/'); + +// Set languages to do. If script is called using a language it will be used as unique. +if (isset($argv[1]) && !empty($argv[1])) { + $languages = explode(',', $argv[1]); +} else { + $languages = array(); + $files = scandir(ASSETSPATH); + foreach ($files as $f) { + if (strpos($f, ".json")) { + $languages[] = str_replace(".json", "", $f); + } + } + $languages = array_unique($languages); +} + +if (empty($languages)) { + $languages = array('ar', 'bg', 'ca', 'cs', 'da', 'de', 'en', 'es-mx', 'es', 'eu', 'fa', 'fr', 'he', 'hu', 'it', 'ja', 'nl', 'pl', 'pt-br', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh-cn', 'zh-tw'); +} + +// Process the index file, just once. +$keys = file_get_contents('langindex.json'); +$keys = (array) json_decode($keys); + +foreach ($keys as $key => $value) { + $map = new StdClass(); + if ($value == 'local_moodlemobileapp') { + $map->file = $value; + $map->string = $key; + $exp = explode('.', $key, 3); + + $type = $exp[0]; + if (count($exp) == 3) { + $component = $exp[1]; + $plainid = $exp[2]; + } else { + $component = 'moodle'; + $plainid = $exp[1]; + } + + switch($type) { + case 'addon': + $map->string_local = "mma.$component.$plainid"; + break; + case 'core': + if ($component == 'moodle') { + $map->string_local = "mm.core.$plainid"; + } else if ($component == 'mainmenu') { + $map->string_local = "mm.sidemenu.$plainid"; + } else { + $map->string_local = "mm.$component.$plainid"; + } + break; + } + } else { + $exp = explode('/', $value, 2); + $map->file = $exp[0]; + if (count($exp) == 2) { + $map->string = $exp[1]; + } else { + $exp = explode('.', $key, 3); + + if (count($exp) == 3) { + $map->string = $exp[2]; + } else { + $map->string = $exp[1]; + } + } + } + + $keys[$key] = $map; +} +$total = count ($keys); + +// Process the languages. +foreach ($languages as $lang) { + $translations = []; + $success = 0; + $langfoldername = str_replace('-', '_', $lang); + + if (!is_dir(LANGPACKSFOLDER.'/'.$langfoldername)) { + echo "Cannot translate $langfoldername, folder not found"; + continue; + } + + echo "Processing language $lang"; + + // Add the translation to the array. + foreach ($keys as $key => $value) { + $file = LANGPACKSFOLDER.'/'.$langfoldername.'/'.$value->file.'.php'; + // Apply translations. + if (!file_exists($file)) { + continue; + } + + $string = []; + include($file); + + if (!isset($string[$value->string])) { + if ($value->file != 'local_moodlemobileapp' || !isset($string[$value->string_local])) { + continue; + } + $text = $string[$value->string_local]; + } else { + $text = $string[$value->string]; + } + + if ($value->file != 'local_moodlemobileapp') { + $text = str_replace('$a->', '$a.', $text); + $text = str_replace('{$a', '{{$a', $text); + $text = str_replace('}', '}}', $text); + // Prevent double. + $text = str_replace(array('{{{', '}}}'), array('{{', '}}'), $text); + } + + $translations[$key] = $text; + $success++; + } + + // Sort and save. + ksort($translations); + file_put_contents(ASSETSPATH.$lang.'.json', str_replace('\/', '/', json_encode($translations, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT))); + + $percentage = floor($success/$total *100); + echo " -> Processed $success of $total -> $percentage%\n"; +}