Merge branch 'release' into stable

pull/13/merge
Paal Joergensen 2017-09-04 14:07:40 +02:00
commit 9756f73e3c
39 changed files with 7237 additions and 1078 deletions

3
crowdin.yml Normal file
View File

@ -0,0 +1,3 @@
files:
- source: /language/.en.json
translation: /language/%two_letters_code%.json

View File

@ -1,15 +1,3 @@
/* IcoMoon font licensed under the GNU General Public License: http://www.gnu.org/licenses/gpl.html */
@font-face {
font-family: 'icomoon-questionset';
src:url('../fonts/icomoon.eot');
src:url('../fonts/icomoon.eot?#iefix') format('embedded-opentype'),
url('../fonts/icomoon.woff') format('woff'),
url('../fonts/icomoon.ttf') format('truetype'),
url('../fonts/icomoon.svg#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
.questionset-results h2 {
font-size: 1.2em;
font-weight: bold;
@ -237,30 +225,27 @@
font-size: 1.25em;
}
.questionset-results .feedback-section .feedback-text {
font-weight: normal;
color: #777;
}
.questionset-results .buttons {
margin-bottom: 1.5em;
margin: 2em 0 1em 0;
}
.questionset-results .result-header,
.questionset-results .result-text {
.questionset-results .result-text,
.questionset-results .feedback-section .feedback-text {
color: #1a73d9;
font-weight: bold;
}
.questionset-results .result-header {
font-size: 2em;
margin-top: 1em;
margin: 1em 0.5em 0.5em 0.5em;
}
.questionset-results .result-text {
.questionset-results .result-text,
.questionset-results .feedback-section .feedback-text {
font-size: 1.25em;
line-height: 1.25em;
margin: 1em 1em 2.25em;
margin: 1em;
}
/* No margin for questions when no frame */

Binary file not shown.

View File

@ -1,14 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="icomoon" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" d="" horiz-adv-x="512" />
<glyph unicode="&#xe604;" d="M512-64c282.77 0 512 229.23 512 512s-229.23 512-512 512-512-229.23-512-512 229.23-512 512-512zM512 864c229.75 0 416-186.25 416-416s-186.25-416-416-416-416 186.25-416 416 186.25 416 416 416zM256 640c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM640 640c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM704.098 332.74l82.328-49.396c-55.962-93.070-157.916-155.344-274.426-155.344s-218.464 62.274-274.426 155.344l82.328 49.396c39.174-65.148 110.542-108.74 192.098-108.74s152.924 43.592 192.098 108.74z" />
<glyph unicode="&#xe605;" d="M512-64c282.77 0 512 229.23 512 512s-229.23 512-512 512-512-229.23-512-512 229.23-512 512-512zM512 864c229.75 0 416-186.25 416-416s-186.25-416-416-416-416 186.25-416 416 186.25 416 416 416zM745.74 358.38l22.488-76.776-437.008-128.002-22.488 76.776zM256 640c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM640 640c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64z" />
<glyph unicode="&#xe606;" d="M512-64c282.77 0 512 229.23 512 512s-229.23 512-512 512-512-229.23-512-512 229.23-512 512-512zM512 864c229.75 0 416-186.25 416-416s-186.25-416-416-416-416 186.25-416 416 186.25 416 416 416zM192 448v-64c0-140.8 115.2-256 256-256h128c140.8 0 256 115.2 256 256v64h-640zM384 203.012c-26.538 9.458-50.924 24.822-71.544 45.446-36.406 36.402-56.456 84.54-56.456 135.542h128v-180.988zM576 192h-128v192h128v-192zM711.544 248.458c-20.624-20.624-45.010-35.988-71.544-45.446v180.988h128c0-51.002-20.048-99.14-56.456-135.542zM225.352 576c0.002 0 0 0 0 0 9.768 0 18.108 7.056 19.724 16.69 6.158 36.684 37.668 63.31 74.924 63.31s68.766-26.626 74.924-63.31c1.616-9.632 9.956-16.69 19.722-16.69 9.768 0 18.108 7.056 19.724 16.688 1.082 6.436 1.628 12.934 1.628 19.312 0 63.962-52.038 116-116 116s-116-52.038-116-116c0-6.378 0.548-12.876 1.628-19.312 1.62-9.632 9.96-16.688 19.726-16.688zM609.352 576c0.002 0 0 0 0 0 9.77 0 18.112 7.056 19.724 16.69 6.158 36.684 37.668 63.31 74.924 63.31s68.766-26.626 74.924-63.31c1.616-9.632 9.958-16.69 19.722-16.69s18.108 7.056 19.722 16.688c1.082 6.436 1.628 12.934 1.628 19.312 0 63.962-52.038 116-116 116s-116-52.038-116-116c0-6.378 0.544-12.876 1.626-19.312 1.624-9.632 9.964-16.688 19.73-16.688z" />
<glyph unicode="&#xe607;" d="M512-64c282.77 0 512 229.23 512 512s-229.23 512-512 512-512-229.23-512-512 229.23-512 512-512zM512 864c229.75 0 416-186.25 416-416s-186.25-416-416-416-416 186.25-416 416 186.25 416 416 416zM384 256c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-70.692 0-128 57.308-128 128zM640 608c0 53.019 28.654 96 64 96s64-42.981 64-96c0-53.019-28.654-96-64-96-35.346 0-64 42.981-64 96zM256 608c0 53.019 28.654 96 64 96s64-42.981 64-96c0-53.019-28.654-96-64-96-35.346 0-64 42.981-64 96z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Binary file not shown.

View File

@ -20,6 +20,52 @@ H5P.QuestionSet = function (options, contentId, contentData) {
var self = this;
this.contentId = contentId;
var defaults = {
initialQuestion: 0,
progressType: 'dots',
passPercentage: 50,
questions: [],
introPage: {
showIntroPage: false,
title: '',
introduction: '',
startButtonText: 'Start'
},
texts: {
prevButton: 'Previous question',
nextButton: 'Next question',
finishButton: 'Finish',
textualProgress: 'Question: @current of @total questions',
jumpToQuestion: 'Question %d of %total',
questionLabel: 'Question',
readSpeakerProgress: 'Question @current of @total',
unansweredText: 'Unanswered',
answeredText: 'Answered',
currentQuestionText: 'Current question'
},
endGame: {
showResultPage: true,
noResultMessage: 'Finished',
message: 'Your result:',
oldFeedback: {
successGreeting: '',
successComment: '',
failGreeting: '',
failComment: ''
},
overallFeedback: [],
finishButtonText: 'Finish',
solutionButtonText: 'Show solution',
retryButtonText: 'Retry',
showAnimations: false,
skipButtonText: 'Skip video',
showSolutionButton: true
},
override: {},
disableBackwardsNavigation: false
};
var params = $.extend(true, {}, defaults, options);
var texttemplate =
'<% if (introPage.showIntroPage) { %>' +
'<div class="intro-page">' +
@ -61,6 +107,10 @@ H5P.QuestionSet = function (options, contentId, contentData) {
' </div>' +
'</div>';
var solutionButtonTemplate = params.endGame.showSolutionButton ?
' <button type="button" class="h5p-joubelui-button h5p-button qs-solutionbutton"><%= solutionButtonText %></button>':
'';
var resulttemplate =
'<div class="questionset-results">' +
' <div class="greeting"><%= message %></div>' +
@ -76,56 +126,14 @@ H5P.QuestionSet = function (options, contentId, contentData) {
' <% } %>' +
' <div class="buttons">' +
' <button type="button" class="h5p-joubelui-button h5p-button qs-finishbutton"><%= finishButtonText %></button>' +
' <button type="button" class="h5p-joubelui-button h5p-button qs-solutionbutton"><%= solutionButtonText %></button>' +
solutionButtonTemplate +
' <button type="button" class="h5p-joubelui-button h5p-button qs-retrybutton"><%= retryButtonText %></button>' +
' </div>' +
'</div>';
var defaults = {
initialQuestion: 0,
progressType: 'dots',
passPercentage: 50,
questions: [],
introPage: {
showIntroPage: false,
title: '',
introduction: '',
startButtonText: 'Start'
},
texts: {
prevButton: 'Previous question',
nextButton: 'Next question',
finishButton: 'Finish',
textualProgress: 'Question: @current of @total questions',
jumpToQuestion: 'Question %d of %total',
questionLabel: 'Question',
readSpeakerProgress: 'Question @current of @total',
unansweredText: 'Unanswered',
answeredText: 'Answered',
currentQuestionText: 'Current question'
},
endGame: {
showResultPage: true,
noResultMessage: 'Finished',
message: 'Your result:',
successGreeting: 'Congratulations!',
successComment: 'You have enough correct answers to pass the test.',
failGreeting: 'Sorry!',
failComment: "You don't have enough correct answers to pass this test.",
scoreString: 'You got @score of @total points',
finishButtonText: 'Finish',
solutionButtonText: 'Show solution',
retryButtonText: 'Retry',
showAnimations: false,
skipButtonText: 'Skip video'
},
override: {},
disableBackwardsNavigation: false
};
var template = new EJS({text: texttemplate});
var endTemplate = new EJS({text: resulttemplate});
var params = $.extend(true, {}, defaults, options);
var initialParams = $.extend(true, {}, defaults, options);
var poolOrder; // Order of questions in a pool
@ -155,27 +163,27 @@ H5P.QuestionSet = function (options, contentId, contentData) {
var randomizeQuestionOrdering = function (questions) {
// Save the original order of the questions in a multidimensional array [[question0,0],[question1,1]...
var questionOrdering = questions.map(function(questionInstance, index) { return [questionInstance, index] });
var questionOrdering = questions.map(function (questionInstance, index) { return [questionInstance, index]; });
// Shuffle the multidimensional array
questionOrdering = H5P.shuffleArray(questionOrdering);
// Retrieve question objects from the first index
var questions = [];
questions = [];
for (var i = 0; i < questionOrdering.length; i++) {
questions[i] = questionOrdering[i][0];
}
// Retrieve the new shuffled order from the second index
var newOrder = [];
for (var i = 0; i< questionOrdering.length; i++) {
for (var j = 0; j < questionOrdering.length; j++) {
// Use a previous order if it exists
if(contentData.previousState && contentData.previousState.questionOrder) {
newOrder[i] = questionOrder[questionOrdering[i][1]];
if (contentData.previousState && contentData.previousState.questionOrder) {
newOrder[j] = questionOrder[questionOrdering[j][1]];
}
else {
newOrder[i] = questionOrdering[i][1];
newOrder[j] = questionOrdering[j][1];
}
}
@ -190,7 +198,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
if (params.poolSize > 0) {
// If a previous pool exists, recreate it
if(contentData.previousState && contentData.previousState.poolOrder) {
if (contentData.previousState && contentData.previousState.poolOrder) {
poolOrder = contentData.previousState.poolOrder;
// Recreate the pool from the saved data
@ -244,7 +252,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
* @param {object} questions H5P content types to be created as instances
* @return {array} Array of questions instances
*/
var createQuestionInstancesFromQuestions = function(questions) {
var createQuestionInstancesFromQuestions = function (questions) {
var result = [];
// Create question instances from questions
// Instantiate question instances
@ -266,9 +274,6 @@ H5P.QuestionSet = function (options, contentId, contentData) {
}
question.params = question.params || {};
question.params.overrideSettings = question.params.overrideSettings || {};
question.params.overrideSettings.$confirmationDialogParent = $template.last();
question.params.overrideSettings.instance = this;
var hasAnswers = contentData.previousState && contentData.previousState.answers;
var questionInstance = H5P.newRunnable(question, contentId, undefined, undefined,
{
@ -283,7 +288,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
}
return result;
}
};
// Create question instances from questions given by params
questionInstances = createQuestionInstancesFromQuestions(params.questions);
@ -312,8 +317,8 @@ H5P.QuestionSet = function (options, contentId, contentData) {
var _updateButtons = function () {
// Verify that current question is answered when backward nav is disabled
if (params.disableBackwardsNavigation) {
if (questionInstances[currentQuestion].getAnswerGiven()
&& questionInstances.length-1 !== currentQuestion) {
if (questionInstances[currentQuestion].getAnswerGiven() &&
questionInstances.length-1 !== currentQuestion) {
questionInstances[currentQuestion].showButton('next');
}
else {
@ -354,6 +359,8 @@ H5P.QuestionSet = function (options, contentId, contentData) {
currentQuestion = questionNumber;
handleAutoPlay(currentQuestion);
// Hide all questions
$('.question-container', $myDom).hide().eq(questionNumber).show();
@ -404,6 +411,31 @@ H5P.QuestionSet = function (options, contentId, contentData) {
return currentQuestion;
};
/**
* Handle autoplays, limit to one at a time
*
* @param {number} currentQuestionIndex
*/
var handleAutoPlay = function (currentQuestionIndex) {
for (var i = 0; i < questionInstances.length; i++) {
questionInstances[i].pause();
}
var currentQuestion = params.questions[currentQuestionIndex];
var hasAutoPlay = currentQuestion &&
currentQuestion.params.media &&
currentQuestion.params.media.params &&
currentQuestion.params.media.params.playback &&
currentQuestion.params.media.params.playback.autoplay;
if (hasAutoPlay && typeof questionInstances[currentQuestionIndex].play === 'function') {
questionInstances[currentQuestionIndex].play();
}
};
/**
* Show solutions for subcontent, and hide subcontent buttons.
* Used for contracts with integrated content.
@ -497,7 +529,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
//Force the last page to be reRendered
rendered = false;
if(params.poolSize > 0){
if (params.poolSize > 0) {
// Make new pool from params.questions
// Randomize and get the results
@ -550,7 +582,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
var replaceQuestionsInDOM = function (questionInstances) {
// Find all question containers and detach questions from them
$('.question-container', $myDom).each(function (){
$('.question-container', $myDom).each(function () {
$(this).children().detach();
});
@ -565,19 +597,19 @@ H5P.QuestionSet = function (options, contentId, contentData) {
question.attach($('.question-container:eq(' + i + ')', $myDom));
//Show buttons if necessary
if(questionInstances[questionInstances.length -1] === question
&& question.hasButton('finish')) {
if (questionInstances[questionInstances.length -1] === question &&
question.hasButton('finish')) {
question.showButton('finish');
}
if(questionInstances[questionInstances.length -1] !== question
&& question.hasButton('next')) {
if (questionInstances[questionInstances.length -1] !== question &&
question.hasButton('next')) {
question.showButton('next');
}
if(questionInstances[0] !== question
&& question.hasButton('prev')
&& !params.disableBackwardsNavigation) {
if (questionInstances[0] !== question &&
question.hasButton('prev') &&
!params.disableBackwardsNavigation) {
question.showButton('prev');
}
@ -618,7 +650,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
* @param {number} dotIndex Index of dot
* @param {boolean} isAnswered True if is answered, False if not answered
*/
var toggleAnsweredDot = function(dotIndex, isAnswered) {
var toggleAnsweredDot = function (dotIndex, isAnswered) {
var $el = $('.progress-dot:eq(' + dotIndex +')', $myDom);
// Skip current button
@ -680,12 +712,9 @@ H5P.QuestionSet = function (options, contentId, contentData) {
// Get total score.
var finals = self.getScore();
var totals = self.getMaxScore();
var scoreString = params.endGame.scoreString.replace("@score", finals).replace("@total", totals);
var scoreString = H5P.Question.determineOverallFeedback(params.endGame.overallFeedback, finals / totals).replace('@score', finals).replace('@total', totals);
var success = ((100 * finals / totals) >= params.passPercentage);
var eventData = {
score: scoreString,
passed: success
};
/**
* Makes our buttons behave like other buttons.
@ -708,8 +737,8 @@ H5P.QuestionSet = function (options, contentId, contentData) {
var eparams = {
message: params.endGame.showResultPage ? params.endGame.message : params.endGame.noResultMessage,
comment: params.endGame.showResultPage ? (success ? params.endGame.successGreeting : params.endGame.failGreeting) : undefined,
resulttext: params.endGame.showResultPage ? (success ? params.endGame.successComment : params.endGame.failComment) : undefined,
comment: params.endGame.showResultPage ? (success ? params.endGame.oldFeedback.successGreeting : params.endGame.oldFeedback.failGreeting) : undefined,
resulttext: params.endGame.showResultPage ? (success ? params.endGame.oldFeedback.successComment : params.endGame.oldFeedback.failComment) : undefined,
finishButtonText: params.endGame.finishButtonText,
solutionButtonText: params.endGame.solutionButtonText,
retryButtonText: params.endGame.retryButtonText
@ -720,10 +749,6 @@ H5P.QuestionSet = function (options, contentId, contentData) {
$myDom.append(endTemplate.render(eparams));
if (params.endGame.showResultPage) {
// Add event handlers to summary buttons
hookUpButton('.qs-finishbutton', function () {
self.trigger('h5pQuestionSetFinished', eventData);
});
hookUpButton('.qs-solutionbutton', function () {
showSolutions();
$myDom.children().hide().filter('.questionset').show();
@ -749,7 +774,6 @@ H5P.QuestionSet = function (options, contentId, contentData) {
scoreBar = H5P.JoubelUI.createScoreBar(totals);
}
scoreBar.appendTo($('.feedback-scorebar', $myDom));
scoreBar.setScore(finals);
$('.feedback-text', $myDom).html(scoreString);
// Announce that the question set is complete
@ -760,6 +784,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
eparams.comment + '.' +
eparams.resulttext)
.show().focus();
scoreBar.setScore(finals);
}, 0);
}
else {
@ -853,7 +878,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
});
// Hide next button if it is the last question
if(questionInstances[questionInstances.length -1] === question) {
if (questionInstances[questionInstances.length -1] === question) {
question.hideButton('next');
}
@ -1081,10 +1106,10 @@ H5P.QuestionSet = function (options, contentId, contentData) {
return info;
};
this.getQuestions = function() {
this.getQuestions = function () {
return questionInstances;
};
this.showSolutions = function() {
this.showSolutions = function () {
renderSolutions = true;
};
@ -1142,7 +1167,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
/**
* Add the question itself to the definition part of an xAPIEvent
*/
var addQuestionToXAPI = function(xAPIEvent) {
var addQuestionToXAPI = function (xAPIEvent) {
var definition = xAPIEvent.getVerifiedStatementValue(['object', 'definition']);
$.extend(definition, getxAPIDefinition());
};
@ -1153,8 +1178,8 @@ H5P.QuestionSet = function (options, contentId, contentData) {
* @param {Object} metaContentType
* @returns {array}
*/
var getXAPIDataFromChildren = function(metaContentType) {
return metaContentType.getQuestions().map(function(question) {
var getXAPIDataFromChildren = function (metaContentType) {
return metaContentType.getQuestions().map(function (question) {
return question.getXAPIData();
});
};
@ -1165,7 +1190,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
*
* @see contract at {@link https://h5p.org/documentation/developers/contracts#guides-header-6}
*/
this.getXAPIData = function(){
this.getXAPIData = function () {
var xAPIEvent = this.createXAPIEventTemplate('answered');
addQuestionToXAPI(xAPIEvent);
xAPIEvent.setScoredResult(this.getScore(),
@ -1177,7 +1202,7 @@ H5P.QuestionSet = function (options, contentId, contentData) {
return {
statement: xAPIEvent.data.statement,
children: getXAPIDataFromChildren(this)
}
};
};
};

251
language/.en.json Normal file
View File

@ -0,0 +1,251 @@
{
"semantics": [
{
"label": "Quiz introduction",
"fields": [
{
"label": "Display introduction"
},
{
"label": "Title",
"description": "This title will be displayed above the introduction text."
},
{
"label": "Introduction text",
"description": "This text will be displayed before the quiz starts."
},
{
"label": "Start button text",
"default": "Start Quiz"
},
{
"label": "Background image",
"description": "An optional background image for the introduction."
}
]
},
{
"label": "Background image",
"description": "An optional background image for the Question set."
},
{
"label": "Progress indicator",
"description": "Question set progress indicator style.",
"options": [
{
"label": "Textual"
},
{
"label": "Dots"
}
],
"default": "dots"
},
{
"label": "Pass percentage",
"description": "Percentage of Total score required for passing the quiz."
},
{
"label": "Questions",
"widgets": [
{
"label": "Default"
},
{
"label": "Textual"
}
],
"entity": "question",
"field": {
"label": "Question type",
"description": "Library for this question."
}
},
{
"label": "Interface texts in quiz",
"fields": [
{
"label": "Back button",
"default": "Previous question"
},
{
"label": "Next button",
"default": "Next question"
},
{
"label": "Finish button",
"default": "Finish"
},
{
"label": "Progress text",
"description": "Text used if textual progress is selected.",
"default": "Question: @current of @total questions"
},
{
"label": "Label for jumping to a certain question",
"description": "You must use the placeholder '%d' instead of the question number, and %total instead of total amount of questions.",
"default": "Question %d of %total"
},
{
"label": "Copyright dialog question label",
"default": "Question"
},
{
"label": "Readspeaker progress",
"description": "May use @current and @total question variables",
"default": "Question @current of @total"
},
{
"label": "Unanswered question text",
"default": "Unanswered"
},
{
"label": "Answered question text",
"default": "Answered"
},
{
"label": "Current question text",
"default": "Current question"
}
]
},
{
"label": "Disable backwards navigation",
"description": "This option will only allow you to move forward in Question Set"
},
{
"label": "Randomize questions",
"description": "Enable to randomize the order of questions on display."
},
{
"label": "Number of questions to be shown:",
"description": "Create a randomized batch of questions from the total."
},
{
"label": "Quiz finished",
"fields": [
{
"label": "Display results"
},
{
"label": "Display solution button"
},
{
"label": "No results message",
"description": "Text displayed on end page when \"Display results\" is disabled",
"default": "Finished"
},
{
"label": "Feedback heading",
"default": "Your result:",
"description": "This heading will be displayed at the end of the quiz when the user has answered all questions."
},
{
"label": "Overall Feedback",
"fields": [
{
"widgets": [],
"label": "Define custom feedback for any score range",
"description": "Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!",
"entity": "range",
"field": {
"fields": [
{
"label": "Score Range"
},
{},
{
"label": "Feedback for defined score range",
"placeholder": "Fill in the feedback"
}
]
}
}
]
},
{
"label": "Old Feedback",
"fields": [
{
"label": "Quiz passed greeting",
"description": "This text will be displayed above the score if the user has successfully passed the quiz."
},
{
"label": "Passed comment",
"description": "This comment will be displayed after the score if the user has successfully passed the quiz."
},
{
"label": "Quiz failed title",
"description": "This text will be displayed above the score if the user has failed the quiz."
},
{
"label": "Failed comment",
"description": "This comment will be displayed after the score if the user has failed the quiz."
}
]
},
{
"label": "Solution button label",
"default": "Show solution",
"description": "Text for the solution button."
},
{
"label": "Retry button label",
"default": "Retry",
"description": "Text for the retry button."
},
{
"label": "Finish button text",
"default": "Finish"
},
{
"label": "Display video before quiz results"
},
{
"label": "Enable skip video button"
},
{
"label": "Skip video button label",
"default": "Skip video"
},
{
"label": "Passed video",
"description": "This video will be played if the user successfully passed the quiz."
},
{
"label": "Fail video",
"description": "This video will be played if the user failes the quiz."
}
]
},
{
"label": "Settings for \"Show solution\" and \"Retry\" buttons",
"fields": [
{
"label": "Override \"Show Solution\" button",
"description": "This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.",
"options": [
{
"label": "Enabled"
},
{
"label": "Disabled"
}
]
},
{
"label": "Override \"Retry\" button",
"description": "This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.",
"options": [
{
"label": "Enabled"
},
{
"label": "Disabled"
}
]
}
]
}
]
}

255
language/af.json Normal file
View File

@ -0,0 +1,255 @@
{
"semantics":[
{
"label":"Quiz introduction",
"fields":[
{
"label":"Display introduction"
},
{
"label":"Title",
"description":"This title will be displayed above the introduction text."
},
{
"label":"Introduction text",
"description":"This text will be displayed before the quiz starts."
},
{
"label":"Start button text",
"default":"Start Quiz"
},
{
"label":"Background image",
"description":"An optional background image for the introduction."
}
]
},
{
"label":"Background image",
"description":"An optional background image for the Question set."
},
{
"label":"Progress indicator",
"description":"Question set progress indicator style.",
"options":[
{
"label":"Textual"
},
{
"label":"Dots"
}
],
"default":"dots"
},
{
"label":"Pass percentage",
"description":"Percentage of Total score required for passing the quiz."
},
{
"label":"Questions",
"widgets":[
{
"label":"Default"
},
{
"label":"Textual"
}
],
"entity":"question",
"field":{
"label":"Question type",
"description":"Library for this question."
}
},
{
"label":"Interface texts in quiz",
"fields":[
{
"label":"Back button",
"default":"Previous question"
},
{
"label":"Next button",
"default":"Next question"
},
{
"label":"Finish button",
"default":"Finish"
},
{
"label":"Progress text",
"description":"Text used if textual progress is selected.",
"default":"Question: @current of @total questions"
},
{
"label":"Label for jumping to a certain question",
"description":"You must use the placeholder '%d' instead of the question number, and %total instead of total amount of questions.",
"default":"Question %d of %total"
},
{
"label":"Copyright dialog question label",
"default":"Question"
},
{
"label":"Readspeaker progress",
"description":"May use @current and @total question variables",
"default":"Question @current of @total"
},
{
"label":"Unanswered question text",
"default":"Unanswered"
},
{
"label":"Answered question text",
"default":"Answered"
},
{
"label":"Current question text",
"default":"Current question"
}
]
},
{
"label":"Disable backwards navigation",
"description":"This option will only allow you to move forward in Question Set"
},
{
"label":"Randomize questions",
"description":"Enable to randomize the order of questions on display."
},
{
"label":"Number of questions to be shown:",
"description":"Create a randomized batch of questions from the total."
},
{
"label":"Quiz finished",
"fields":[
{
"label":"Display results"
},
{
"label":"Display solution button"
},
{
"label":"No results message",
"description":"Text displayed on end page when \"Display results\" is disabled",
"default":"Finished"
},
{
"label":"Feedback heading",
"default":"Your result:",
"description":"This heading will be displayed at the end of the quiz when the user has answered all questions."
},
{
"label":"Overall Feedback",
"fields":[
{
"widgets":[
],
"label":"Define custom feedback for any score range",
"description":"Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!",
"entity":"range",
"field":{
"fields":[
{
"label":"Score Range"
},
{
},
{
"label":"Feedback for defined score range",
"placeholder":"Fill in the feedback"
}
]
}
}
]
},
{
"label":"Old Feedback",
"fields":[
{
"label":"Quiz passed greeting",
"description":"This text will be displayed above the score if the user has successfully passed the quiz."
},
{
"label":"Passed comment",
"description":"This comment will be displayed after the score if the user has successfully passed the quiz."
},
{
"label":"Quiz failed title",
"description":"This text will be displayed above the score if the user has failed the quiz."
},
{
"label":"Failed comment",
"description":"This comment will be displayed after the score if the user has failed the quiz."
}
]
},
{
"label":"Solution button label",
"default":"Show solution",
"description":"Text for the solution button."
},
{
"label":"Retry button label",
"default":"Retry",
"description":"Text for the retry button."
},
{
"label":"Finish button text",
"default":"Finish"
},
{
"label":"Display video before quiz results"
},
{
"label":"Enable skip video button"
},
{
"label":"Skip video button label",
"default":"Skip video"
},
{
"label":"Passed video",
"description":"This video will be played if the user successfully passed the quiz."
},
{
"label":"Fail video",
"description":"This video will be played if the user failes the quiz."
}
]
},
{
"label":"Settings for \"Show solution\" and \"Retry\" buttons",
"fields":[
{
"label":"Override \"Show Solution\" button",
"description":"This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.",
"options":[
{
"label":"Enabled"
},
{
"label":"Disabled"
}
]
},
{
"label":"Override \"Retry\" button",
"description":"This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.",
"options":[
{
"label":"Enabled"
},
{
"label":"Disabled"
}
]
}
]
}
]
}

View File

@ -1,213 +1,255 @@
{
"semantics": [
"semantics":[
{
"label": "مقدمة المسابقة",
"fields": [
"label":"مقدمة المسابقة",
"fields":[
{
"label": "عرض المقدمة"
"label":"عرض المقدمة"
},
{
"label": "العنوان",
"description": "سيتم عرض هذا العنوان فوق النص المقدمة"
"label":"العنوان",
"description":"سيتم عرض هذا العنوان فوق النص المقدمة"
},
{
"label": "مقدمة النص",
"description": "سيتم عرض هذا النص قبل أن تبدأ هذه المسابقة"
"label":"مقدمة النص",
"description":"سيتم عرض هذا النص قبل أن تبدأ هذه المسابقة"
},
{
"label": "بدء زر النص"
"label":"بدء زر النص",
"default":"Start Quiz"
},
{
"label": "صورة الخلفية",
"description": "إدخال صورة خلفية اختيارية"
"label":"صورة الخلفية",
"description":"إدخال صورة خلفية اختيارية"
}
]
},
{
"label": "صورة الخلفية",
"description": "صورة خلفية اختيارية لأسئلة"
"label":"صورة الخلفية",
"description":"صورة خلفية اختيارية لأسئلة"
},
{
"label": "مؤشر التقدم",
"description": "أسئلة لتعيين نمط مؤشر التقدم",
"options": [
"label":"مؤشر التقدم",
"description":"أسئلة لتعيين نمط مؤشر التقدم",
"options":[
{
"label": "النصية"
"label":"النصية"
},
{
"label": "النقاط"
}
]
},
{
"label": "نسبة النجاح",
"description": "النسبة المئوية لمجموع النقاط المطلوبة لاجتياز الاختبار"
},
{
"label": "الأسئلة",
"widgets": [
{
"label": "الافتراضي"
},
{
"label": "النصية"
"label":"النقاط"
}
],
"entity": "السؤال",
"field": {
"label": "نوع السؤال",
"description": "مكتبة لهذا السؤال"
"default":"dots"
},
{
"label":"نسبة النجاح",
"description":"النسبة المئوية لمجموع النقاط المطلوبة لاجتياز الاختبار"
},
{
"label":"الأسئلة",
"widgets":[
{
"label":"الافتراضي"
},
{
"label":"النصية"
}
],
"entity":"السؤال",
"field":{
"label":"نوع السؤال",
"description":"مكتبة لهذا السؤال"
}
},
{
"label": "واجهة النصوص لهذه المسابقة",
"fields": [
"label":"واجهة النصوص لهذه المسابقة",
"fields":[
{
"label": "زر الرجوع"
"label":"زر العودة",
"default":"Previous question"
},
{
"label": "زر التقدم"
"label":"زر التقدم",
"default":"Next question"
},
{
"label": "زر الانتهاء"
"label":"زر الانتهاء",
"default":"Finish"
},
{
"label": "نص التقدم",
"description": "النص المستخدم إذا تم تحديد التقدم نصيا"
"label":"نص التقدم",
"description":"النص المستخدم إذا تم تحديد التقدم نصيا",
"default":"Question: @current of @total questions"
},
{
"label": "Label for jumping to a certain question",
"description": "You must use the placeholder '%d' instead of the question number, and %total instead of total amount of questions.",
"default": "Question %d of %total"
"label":"Label for jumping to a certain question",
"description":"You must use the placeholder '%d' instead of the question number, and %total instead of total amount of questions.",
"default":"Question %d of %total"
},
{
"label": "Copyright dialog question label",
"default": "Question"
"label":"Copyright dialog question label",
"default":"السؤال"
},
{
"label": "Readspeaker progress",
"description": "May use @current and @total question variables",
"default": "Question @current of @total"
"label":"Readspeaker progress",
"description":"May use @current and @total question variables",
"default":"Question @current of @total"
},
{
"label": "Unanswered question text",
"default": "Unanswered"
"label":"Unanswered question text",
"default":"Unanswered"
},
{
"label": "Answered question text",
"default": "Answered"
"label":"Answered question text",
"default":"Answered"
},
{
"label": "Current question text",
"default": "Current question"
"label":"Current question text",
"default":"Current question"
}
]
},
{
"label": "Disable backwards navigation",
"description": "This option will only allow you to move forward in Question Set"
"label":"Disable backwards navigation",
"description":"This option will only allow you to move forward in Question Set"
},
{
"label": "Randomize questions",
"description": "Enable to randomize the order of questions on display."
"label":"Randomize questions",
"description":"تمكين العرض بطريقة عشوائية وترتيب الأسئلة على الشاشة"
},
{
"label": "Number of questions to be shown:",
"description": "Create a randomized batch of questions from the total."
"label":"Number of questions to be shown:",
"description":"Create a randomized batch of questions from the total."
},
{
"label": "انتهاء المسابقة",
"fields": [
"label":"انتهاء المسابقة",
"fields":[
{
"label": "عرض النتائج"
"label":"عرض النتائج"
},
{
"label": "No results message",
"description": "Text displayed on end page when \"Display results\" is disabled",
"default": "Finished"
"label":"Display solution button"
},
{
"label": "نص راس الملاحظات",
"description": "سيتم عرض هذا العنوان في نهاية هذه المسابقة حيثما أجاب المستخدم على جميع الأسئلة المستعملة"
"label":"No results message",
"description":"Text displayed on end page when \"Display results\" is disabled",
"default":"Finished"
},
{
"label": "عرض نص النتيجة",
"description": "النص يستخدم لعرض مجموع النقاط للمستخدم \"@score\" سوف تحل محلها النتيجة المحسوبة, \"@total\" حسب أقصى درجة ممكنة"
"label":"نص راس الملاحظات",
"default":"Your result:",
"description":"سيتم عرض هذا العنوان في نهاية هذه المسابقة حيثما أجاب المستخدم على جميع الأسئلة المستعملة"
},
{
"label": "تعليق النجاح بالمسابقة",
"description": "سيتم عرض هذا النص أعلاه النتيجة إذا انقضى المستخدم بنجاح هذه المسابقة"
},
{
"label": "ملاحظة النجاح",
"description": "سيتم عرض هذه الملاحظة بعد النتيجة إذا انقضى المستخدم بنجاح هذه المسابقة"
},
{
"label": "تعليق الرسوب بالمسابقة",
"description": "سيتم عرض هذا النص أعلاه النتيجة إذا كان المستخدم قد فشلت في المسابقة"
},
{
"label": "ملاحظة الرسوب",
"description": "سيتم عرض هذه الملاحظة بعد النتيجة إذا كان المستخدم قد فشلت في المسابقة"
},
{
"label": "تسمية زر اظهار الحل",
"description": "نص زر الحل"
},
{
"label": "تسمية زر إعادة المحاولة",
"description": "نص زر إعادة المحاولة"
},
{
"label": "نص زر الانتهاء"
},
{
"label": "عرض الفيديو قبل نتائج المسابقة"
},
{
"label": "تفعيل زر تخطى الفيديو"
},
{
"label": "تسمية زر تخطى الفيديو"
},
{
"label": "فيديو النجاح بالمسابقة",
"description": "سيتم تشغيل هذا الفيديو إذا كان المستخدم ناجحا بهذه المسابقة"
},
{
"label": "فيديو الرسوب بالمسابقة",
"description": "سيتم تشغيل هذا الفيديو إذا كان المستخدم راسبا بهذه المسابقة"
}
]
},
{
"label": "إعدادات زر \"مشاهدة حل \" وزر \"إعادة المحاولة\" ",
"fields": [
{
"label": "Override \"Show Solution\" button",
"description": "This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.",
"options": [
"label":"شفافية خلفية العناصر",
"fields":[
{
"label": "Enabled"
},
{
"label": "Disabled"
"widgets":[
],
"label":"Define custom feedback for any score range",
"description":"Example: 0-20% Bad score, 21-91% Average Score, 91-100% Great Score!",
"entity":"range",
"field":{
"fields":[
{
"label":"Score Range"
},
{
},
{
"label":"Feedback for defined score range",
"placeholder":"Fill in the feedback"
}
]
}
}
]
},
{
"label": "Override \"Retry\" button",
"description": "This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.",
"options": [
"label":"Old Feedback",
"fields":[
{
"label": "Enabled"
"label":"تعليق النجاح بالمسابقة",
"description":"سيتم عرض هذا النص أعلاه النتيجة إذا انقضى المستخدم بنجاح هذه المسابقة"
},
{
"label": "Disabled"
"label":"ملاحظة النجاح",
"description":"سيتم عرض هذه الملاحظة بعد النتيجة إذا انقضى المستخدم بنجاح هذه المسابقة"
},
{
"label":"تعليق الرسوب بالمسابقة",
"description":"سيتم عرض هذا النص أعلاه النتيجة إذا كان المستخدم قد فشلت في المسابقة"
},
{
"label":"ملاحظة الرسوب",
"description":"سيتم عرض هذه الملاحظة بعد النتيجة إذا كان المستخدم قد فشلت في المسابقة"
}
]
},
{
"label":"تسمية زر اظهار الحل",
"default":"مشاهدة الحل",
"description":"نص زر الحل"
},
{
"label":"تسمية زر إعادة المحاولة",
"default":"إعادة المحاولة",
"description":"نص زر إعادة المحاولة"
},
{
"label":"نص زر الانتهاء",
"default":"Finish"
},
{
"label":"عرض الفيديو قبل نتائج المسابقة"
},
{
"label":"تفعيل زر تخطى الفيديو"
},
{
"label":"تسمية زر تخطى الفيديو",
"default":"Skip video"
},
{
"label":"فيديو النجاح بالمسابقة",
"description":"سيتم تشغيل هذا الفيديو إذا كان المستخدم ناجحا بهذه المسابقة"
},
{
"label":"فيديو الرسوب بالمسابقة",
"description":"سيتم تشغيل هذا الفيديو إذا كان المستخدم راسبا بهذه المسابقة"
}
]
},
{
"label":"إعدادات زر \"مشاهدة حل \" وزر \"إعادة المحاولة\" ",
"fields":[
{
"label":"Override \"Show Solution\" button",
"description":"This option determines if the \"Show Solution\" button will be shown for all questions, disabled for all or configured for each question individually.",
"options":[
{
"label":"Enabled"
},
{
"label":"Disabled"
}
]
},
{
"label":"Override \"Retry\" button",
"description":"This option determines if the \"Retry\" button will be shown for all questions, disabled for all or configured for each question individually.",
"options":[
{
"label":"Enabled"
},
{
"label":"Disabled"
}
]
}
]
}
]
}
}

255
language/bs.json Normal file
View File

@ -0,0 +1,255 @@
{
"semantics":[
{
"label":"Uvod u kviz",
"fields":[
{
"label":"Prikaži uvod"
},
{
"label":"Naziv",
"description":"Ovaj će naziv biti prikazan iznad uvodnog teksta."
},
{
"label":"Tekst uvoda",
"description":"Ovaj će naziv biti prikazan prije početka kviza."
},
{
"label":"Oznaka za dugme \"Start\"",
"default":"Start"
},
{
"label":"Slika pozadine",
"description":"Slika pozadine na početku. (opcionalno)."
}
]
},
{
"label":"Slika pozadine",
"description":"Slika pozadine seta pitanja. (opcionalno)."
},
{
"label":"Prikaz napredovanja",
"description":"Prikazivanje napredovanja",
"options":[
{
"label":"Tekst"
},
{
"label":"Bodovi"
}
],
"default":"dots"
},
{
"label":"Procenat za uspješan prolaz",
"description":"Procenat tačnih odgovora kao preduvijet da je kviz\/zadatak uspješno završen."
},
{
"label":"Pitanja",
"widgets":[
{
"label":"Standard"
},
{
"label":"Tekst"
}
],
"entity":"pitanje",
"field":{
"label":"Vrsta pitanja",
"description":"Biblioteka za ovo pitanje."
}
},
{
"label":"Prikaz teksta u kvizu",
"fields":[
{
"label":"Oznaka za dugme \"Nazad\"",
"default":"Zurück"
},
{
"label":"Oznaka za dugme \"Naprijed\"",
"default":"Weiter"
},
{
"label":"Oznaka za dugme \"Završi\"",
"default":"Kraj"
},
{
"label":"Početni tekst",
"description":"Koristi tekst ako je izabran za napredak u pisanom obliku.",
"default":"Aktuelno pitanje: @current od @total pitanja"
},
{
"label":"Označavanje za skakanje do određene tačke",
"description":"Koristi mjesto '%d' za redoslijed pitanja i %total za ukupan broj pitanja.",
"default":"Pitanje %d od %total"
},
{
"label":"Opis pitanja u vezi sa vezi s autorom",
"default":"Pitanje"
},
{
"label":"Napredno \"Readspeaker\""