Content specification
Format versions
Seedlingo v1.4.0
and above requires format version 1.4.0
.
Seedlingo v1.3.0
and above requires format version 1.3.0
.
Seedlingo v1.0.0
and above requires format version 1.2.1
.
Seedlingo v0.91.0
and above requires format version 1.1.1
.
Seedlingo v0.9.0
requires format version 1.1.0
.
ContentSpec.json
The root content specification file is ContentSpec.json
. It must be present under that name. ContentSpec.json
describes the file structure of the content.
formatVersion
Mandatory field of type string
.
"formatVersion": "1.4.0"
formatVersion
is used by the Seedlingo app to determine how the file can be expected to be formatted.
instructions
Mandatory field of type Array
; must contain 8 specific instruction paths of type string
.
"instructions": [
"welcome": "welcome.mp3",
"homeButton": "audio/homeButton.mp3",
...
]
instructions
is a collection of paths to audio files instructing the user on how to interact with various app features. Each entry must point to an audio file with a path relative to the content
folder.
Mandatory sub-fields of type string
:
welcome
- the message played the first few times a user opens the apphomeButton
- the instruction audio attached to the home buttoncontinueButton
- the instruction audio attached to the continue buttontoggleInstructionsButton
- the instruction audio attached to the instruction overlay togglematchingExercise
- an audio file describing how to solve a matching exercisemultipleChoiceExercise
- an audio file describing how to solve a multiple-choice exercisesingleClozeExercise
- an audio file describing how to solve a single-cloze exercisemultiClozeExercise
- an audio file describing how to solve a multi-cloze exercise
wordSpecFile
Mandatory field of type string
.
"wordSpecFile": "WordSpec.json"
wordSpecFile
is a path to the file specifying every word used in any unit (see Word-specification).
units
Mandatory field of type Array
; must contain at least one unit.
"units": [
{
"name": "My first unit",
"icon": "mdiNumeric",
"introductionAudio": "audio/introduction/DescriptionOfUnit1.mp3",
"unitSpecFile": "Unit1Spec.json"
},
{...}
]
units
is a collection of unit descriptions, referencing the unit specification through unitSpecFile
.
Each unit must have the following mandatory fields of type string
:
name
, the name of the unit, currently not displayed anywhereicon
, the name of a Material Design icon, prefixed withmdi
and Camel-Cased, so thatnumeric-1
becomesmdiNumeric1
introductionAudio
, the relative path to the audio introducing the unitunitSpecFile
, the relative path to the file containing the specification for the unit (see Unit-specification).
Word-specification
The word-specification defines the relationship between words and their corresponding media, i.e. audio, picture, video and/or symbol (i.e. icon).
formatVersion
Mandatory field of type string
.
"formatVersion": "1.4.0"
formatVersion
is used by the Seedlingo app to determine how the file can be expected to be formatted.
wordCount
Mandatory field of type number
.
"wordCount": "5"
wordCount
is the number of words specified in the word-specification. This number can be counted by searching the file for audio
, a mandatory sub-field, and counting the occurrences. Running the content specification validation will inform you if the number is incorrect.
words
Mandatory field of type object
where the keys are unique strings
, and the value is an object
with a mandatory word
field, and any of the optional audio
, picture
, video
or symbol
fields.
"words": {
"e4cbe366-e875-4399-aa73-468eb72af1e5": {
"word": "one",
"audio": "audio/one.mp3",
"symbol": ["mdiNumeric1"]
},
{...}
}
Each word must have the following mandatory field of type string
:
word
, the orthographic representation of the word in the target language, e.g. "one" or "我"
Each word can have any or none of the following optional fields:
audio
, the path (string
) to the audio file representing the pronunciation of the wordpicture
, the path (string
) to the picture representing the wordvideo
, the path (string
) to the video representing the wordsymbol
, a list (Array
) of one or more names (strings
) of Material Design icons, prefixed withmdi
and Camel-Cased, so thatnumeric-1
becomesmdiNumeric1
Unit-specification
The unit-specification defines which exercises to include in a unit, and which words from the word-specification to include in an exercise.
formatVersion
Mandatory field of type string
.
"formatVersion": "1.4.0"
formatVersion
is used by the Seedlingo app to determine how the file can be expected to be formatted.
id
Mandatory field of type string
.
"id": "bb0c1d6f-7d00-4700-8b6c-053d2ad0bb7c"
id
is a unique identifier for a unit specification, preferably a GUID.
unitIndex
Mandatory field of type number
.
"unitIndex": "1"
unitIndex
is the order in which this unit should appear in the unit overview.
multipleChoiceCount
Mandatory field of type number
.
"multipleChoiceCount": "8"
multipleChoiceCount
is the number of exercises in the unit of the type MultipleChoice
.
matchingCount
Mandatory field of type number
.
"matchingCount": "8"
matchingCount
is the number of exercises in the unit of the type Matching
.
explanationCount
Mandatory field of type number
.
"explanationCount": "8"
explanationCount
is the number of exercises in the unit of the type Explanation
.
It is currently not possible to specify either ExplanationMatching or ExplanationMultipleChoice; Seedlingo will randomly choose to present an Explanation-exercise as either an ExplanationMatching-exercise or an ExplanationMultipleChoice-exercise.
singleClozeCount
Mandatory field of type number
.
"singleClozeCount": "8"
singleClozeCount
is the number of exercises in the unit of the type SingleCloze
.
multiClozeCount
Mandatory field of type number
.
"multiClozeCount": "8"
multiClozeCount
is the number of exercises in the unit of the type MultiCloze
.
comprehensionCount
Mandatory field of type number
.
"comprehensionCount": "8"
comprehensionCount
is the number of exercises in the unit of the type Comprehension
.
wordsExercisedCount
Optional field of type number
.
"wordsExercisedCount": "8"
wordsExercisedCount
is the number of unique words referenced in the unit as valid correct options through exercises, i.e. words that are being exercised in this unit. Words that are provided as incorrect alternatives should be excluded from this count.
exercises
Mandatory field of type Array
; must contain at least one exercise.
exercises
is a collection of exercise definitions specifying which words from the Word-specification to practice through a particular type of exercise, and which words to provide as incorrect options if needed.
Each exercise must have the following mandatory fields of type string
:
id
, the unique id of the exercisetype
, the type of exercise, which has to be one of these:MultipleChoice
Matching
Explanation
SingleCloze
MultiCloze
Comprehension
Depending on the type
, an exercise should have certain additional fields.
MultipleChoice
multipleChoiceSpec
(mandatory), anObject
defining the multiple choice exercise, containing:multipleChoiceWords
(mandatory), a list (Array
) of at least 4 unique word-references
"exercises": [
{
"id": "dc760ae7-0804-4d5b-8102-c78b49ded883",
"type": "MultipleChoice",
"multipleChoiceSpec": {
"multipleChoiceWords": [
{ "one": "00bb28fc-ca72-4c60-b04e-9484771a5303" },
{ "two": "89377ac8-f03a-43af-b701-168e5c02757f" },
{...}
]
}
},
{...}
]
Matching
matchingSpec
(mandatory), anObject
defining the matching exercise, containing:matchingWords
(mandatory), a list (Array
) of at least 2 unique word-referencesunsuppressWordAudio
(optional), aboolean
(true
orfalse
) override to allow audio cues for word tiles to play before a word tile has been matched to its picture/symbol tile. Defaults tofalse
.
"exercises": [
{
"id": "7ce5fd1b-7b94-4ff7-8940-6c09301b10aa",
"type": "Matching",
"matchingSpec": {
"matchingWords": [
{ "two": "89377ac8-f03a-43af-b701-168e5c02757f" },
{ "three": "f2b83c98-23a5-49d6-a366-a4530fdde789" },
],
"unsuppressWordAudio": false
}
},
{...}
]
Explanation
explanationSpec
(mandatory), anObject
defining the explanation exercise, containing:explanation
(mandatory), a list (Array
) of at least one word-reference forming a keyword, synonym or some other form of explanation that serves as the clue to identify which single word the explanation points to.explanationTargets
(mandatory), anObject
defining the correct target word (valid option) the explanation hints to, as well as a few incorrect alternatives (invalid options) that the correct alternative can hide among.audio
(optional), the relative path (string
) to the audio file representing the pronunciation of the explanationpicture
(optional), the relative path (string
) to a picture representing the explanationvideo
(optional), the relative path (string
) to a video representing the explanationsymbol
(optional), a list (Array
) of one or more names (strings
) of Material Design icons, prefixed withmdi
and Camel-Cased, so thatnumeric-1
becomesmdiNumeric1
, representing the idea conveyed by the explanation.
"exercises": [
{
"id": "df7e8b41-d7bb-4dd8-acab-69a0c0045664",
"type": "Explanation",
"explanationSpec": {
"explanation": [
{ "mama's": "2e803a36-22d3-4183-994a-00d4a2837b39" },
{ "mama": "14bb0008-1397-4684-8ef5-2f524524fc84" }
],
"explanationTargets": {
"validOption": { "grandma": "8c40dd19-996c-428b-8962-212bd7e1c63c" },
"invalidOptions": [
{ "grandpa": "97646a8e-33ee-4e43-a95d-4eeead0c4f94" },
{ "uncle": "5cd464a3-a04a-4ad2-9565-091036425550" },
{ "aunt": "e045242e-1867-444c-baf4-01f5d3f59fe3" }
]
},
"audio": "audio/mamasmama.mp3",
"symbol": ["mdiHumanFemale"]
}
},
{...}
]
SingleCloze
singleClozeSpec
, anObject
defining the cloze exercise, containing:text
(mandatory), a list (Array
) of elements that make up a cloze sentence (fill-the-blank sentence) with a single blank, correct target words (valid options) that will complete the sentence in a way that makes the sentence meaningful and grammatically correct, as well as a few incorrect alternatives (invalid options) that the correct alternative can hide among.Object
's intext
must have one of these shapes:- a word-reference using a
string
key, like 'grandma', and a word-reference value matching the word key as uniquely defined in the word spec file, e.g{ "grandma": "family-word-number-28" }
- two lists (
Array
), one ofvalidOptions
and one ofinvalidOptions
, indicating that this entry in thetext
is a blank/gap that has a set of valid alternatives that would make sense of the completed text, and a set of invalid alternatives that will be treated as incorrect answers. Either list should exclusively contain word-references as described above. For a cloze exercise with only one blank/gap,singleClozeSpec.text
must contain one and only one reference tovalidOptions
andinvalidOptions
.
- a word-reference using a
suppressClozeAudio
(optional), aboolean
(true
orfalse
) that specifies whether to prohibit users hearing the pronunciation of a word when tapping a word in the cloze sentence (suppressClozeAudio: true
), or to allow users to hear the pronunciation of words (not blanks) they tap in the cloze sentence (suppressClozeAudio: false
). Defaults tofalse
.suppressOptionAudio
(optional), aboolean
(true
orfalse
) that specifies whether to prohibit users hearing the pronunciation of an option when tapping it (suppressOptionAudio: true
), or to allow users to hear the pronunciation when they tap an option (suppressOptionAudio: false
). Defaults tofalse
.
"exercises": [
{
"id": "ddac5f75-c5af-4734-8455-b76b425e8bfb",
"type": "SingleCloze",
"singleClozeSpec": {
"text": [
{ "他": "c53add23-aba4-42f5-9fbb-d6a6d1d8882c" },
{ "是": "bc1ec01c-0fde-4e63-82e6-c0f78d01529e" },
{ "我": "9f4c842a-e36a-48b1-aa4b-955aedef35d2" },
{ "的": "843f4af4-5dcb-44a4-b690-759db29999c4" },
{
"validOptions": [
{ "爸爸": "3773c800-4f9b-4951-b7a7-9e0c9861d089" },
{ "哥哥": "4e43f1dd-bdd8-4cfb-ad27-8446e44cc754" },
{ "弟弟": "802939da-7ac0-409c-bfb2-b0d6f81e2f56" },
{ "姥爷": "6c0f975c-4364-40c7-ae72-cfc2145da7e3" },
{ "爷爷": "1ad7f2f9-521a-4a00-b549-bd4ee081149b" },
{ "丈夫": "76004162-7f5b-4e28-bda5-bbcb39be8165" },
{ "大哥": "3eac3c44-25ef-434e-9e94-1fc71e510557" },
{ "二哥": "abb4c7a4-0c11-4f29-8506-a852f04a0ef5" },
{ "大弟弟": "0fcce854-d190-4e88-a3fe-da2e4763f48c" },
{ "小弟弟": "1846e964-c362-417a-815d-3319b2b6aca5" },
{ "姐夫": "c48bf08b-df1b-4fa8-a41b-15405ecebf49" },
{ "妹夫": "98d18086-a60a-4f81-80b3-e05bd2aaa400" },
{ "儿子": "af7cc883-0091-4d24-800e-95ca67ee451c" },
{ "外孙": "bb91deac-cbe1-4314-b7d3-9662cc82d446" },
{ "孙子": "4e594d79-ec54-4cc7-8ef0-2a950ebb2de3" },
{ "外甥": "54ff3fa1-141e-4620-861d-335376b3f8f2" },
{ "侄子": "dda9c23b-503d-4ada-8293-3450c8bfae7c" }
],
"invalidOptions": [
{ "妈妈": "8da1e3a6-3268-40da-8707-be2a2c902c16" },
{ "姐姐": "b521f4d2-1084-4f17-af18-1bd6738d23a0" },
{ "妹妹": "8ee121b4-8522-4e16-91b7-8a2af070efd8" },
{ "姥姥": "d63f08dd-f8e6-4b47-940b-8d9d939034a6" },
{ "奶奶": "5cd464a3-a04a-4ad2-9565-091036425550" },
{ "妻子": "9ca14628-fd31-4f36-8f99-70dd7c9c8b28" },
{ "大姐": "891c12fc-23a3-4bb9-9744-dbaf2e785624" },
{ "二姐": "1d9b329c-a2fa-4eaa-aa2c-39d026a898a7" },
{ "大妹妹": "8531fafd-fd6c-47a2-861b-c401362f17c2" },
{ "小妹妹": "683a0834-e76f-44b4-9858-467b63380147" },
{ "嫂子": "afaf98c8-5f3d-4be9-8338-3f2942e6be17" },
{ "弟妹": "75a122a7-4a08-4333-acf1-072483f6a570" },
{ "女儿": "34d92533-9c8c-4469-b050-2638f2b5f4d5" },
{ "外孙女": "83ded6b2-d80b-4a78-bd10-00d4822aefb9" },
{ "孙女": "7f3cd2dd-da20-4c3c-8fb1-d6beefb43d0e" },
{ "外甥女": "b6ebbe69-9834-41f3-a353-4a9142d599b3" },
{ "侄女": "0087add3-b033-4cac-bb6b-cebf1c1acdd0" }
]
}
],
"suppressClozeAudio": false,
"suppressOptionAudio": false
}
},
{...}
]
MultiCloze
multiClozeSpec
, anObject
defining the cloze exercise, containing:text
(mandatory), a list (Array
) of elements that make up a cloze sentence (fill-the-blank sentence) with words interspersed with multiple blanks as lists of correct target words (valid options) that will complete the sentence in a way that makes the sentence meaningful and grammatically correct, if put in the correct order. The key to solving the exercise is to connect the valid word to the corresponding blanks.Object
's intext
must have one of these shapes:- a word-reference using a
string
key, like 'grandma', and a word-reference value matching the word key as uniquely defined in the word spec file, e.g{ "grandma": "family-word-number-28" }
- a list (
Array
) calledvalidOptions
containing exactly one entry indicating that this entry in thetext
is a blank/gap that has exactly one correct alternative that will make sense of the completed text. The list entry must be a word-reference as described above.multiClozeSpec.text
must contain at least two objects containingvalidOptions
.
- a word-reference using a
suppressClozeAudio
(optional), aboolean
(true
orfalse
) that specifies whether to prohibit users hearing the pronunciation of a word when tapping a word in the cloze sentence (suppressClozeAudio: true
), or to allow users to hear the pronunciation of words (not blanks) they tap in the cloze sentence (suppressClozeAudio: false
). Defaults tofalse
.suppressOptionAudio
(optional), aboolean
(true
orfalse
) that specifies whether to prohibit users hearing the pronunciation of an option when tapping it (suppressOptionAudio: true
), or to allow users to hear the pronunciation when they tap an option (suppressOptionAudio: false
). Defaults tofalse
.
"exercises": [
{
"id": "6b941a32-89f3-4436-ac53-f2769cb0d3b3",
"type": "MultiCloze",
"multiClozeSpec": {
"multiClozeText": [
{ "我": "9f4c842a-e36a-48b1-aa4b-955aedef35d2" },
{ "的": "843f4af4-5dcb-44a4-b690-759db29999c4" },
{ "妈妈": "8da1e3a6-3268-40da-8707-be2a2c902c16" },
{ "有": "35389a5a-4493-44e5-a8ae-dc0a30c98dbf" },
{ "四": "da473305-758c-40c0-a61b-d9de0aefb5a4" },
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{
"validOptions": [
{ "孩子": "c8de49d6-d26a-4d62-b959-83cf57327387" }
]
},
{ ":": "526a8ee7-7525-4b0f-a3a2-92e29618bed3" },
{ "两": "5dbf7670-f66d-46e4-b971-8f8d6de95a5c" },
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{ "儿子": "af7cc883-0091-4d24-800e-95ca67ee451c" },
{ ",": "3fde2b11-aa78-4a96-9bd4-75c8462132b6" },
{ "两": "5dbf7670-f66d-46e4-b971-8f8d6de95a5c" },
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{
"validOptions": [
{ "女儿": "34d92533-9c8c-4469-b050-2638f2b5f4d5" }
]
},
{ "。": "5d0f410c-83ff-43bd-a31e-922b42b054ef" },
{ "我": "9f4c842a-e36a-48b1-aa4b-955aedef35d2" },
{ "有": "35389a5a-4493-44e5-a8ae-dc0a30c98dbf" },
{ "两": "5dbf7670-f66d-46e4-b971-8f8d6de95a5c" },
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{
"validOptions": [
{ "姐姐": "b521f4d2-1084-4f17-af18-1bd6738d23a0" }
]
},
{ ",": "3fde2b11-aa78-4a96-9bd4-75c8462132b6" },
{
"validOptions": [
{ "一": "1d936b6b-e44c-466c-8d04-ab52643670c2" }
]
},
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{ "弟弟": "802939da-7ac0-409c-bfb2-b0d6f81e2f56" },
{ "。": "5d0f410c-83ff-43bd-a31e-922b42b054ef" }
],
"suppressClozeAudio": false,
"suppressOptionAudio": false
}
},
{...}
]
Comprehension
comprehensionSpec
(mandatory), anObject
defining the comprehension exercise, containing:text
(mandatory), a list (Array
) of word-references to words that make up a short text forming the base for the comprehension exercise.Object
's intext
must have this shape:- a word-reference using a
string
key, like 'grandma', and a word-reference value matching the word key as uniquely defined in the word spec file, e.g{ "grandma": "family-word-number-28" }
- a word-reference using a
multipleChoiceSpec
(optional), anObject
defining a multiple-choice exercise to include in the comprehension exercise. The specification here should follow the general specification for multiple-choice exercises as defined above.matchingSpec
(optional), anObject
defining a matching exercise to include in the comprehension exercise. The specification here should follow the general specification for matching exercises as defined above.comprehensionQuestions
(mandatory), a list (Array
) of questions to pose with answer options. Each questions must be anObject
with this shape:questionText
(mandatory), astring
posing the question in written form.questionAudio
(mandatory), the path (string
) to the audio file for the questionoptions
(mandatory), a list (Array
) ofObject
s defining a possible answer to the question, of the shape:word
(mandatory), a reference to a word in the word-speccorrect
(optional), aboolean
(true
orfalse
) indicating whether this option is the correct answer. Default tofalse
.
comprehensionStages
(optional), a list (Array
) of stages for the comprehension exercise. A stage spec must have the following shape:instructionText
(optional), an instruction (string
) describing the nature of the stage and what is expected of the user for this stageinstructionAudio
(optional), a path (string
) to the audio file for the instruction for this stagequestionnaire
(optional), aboolean
(true
orfalse
) indicating that this stage should use thecomprehensionQuestions
to form a questionnaire-stage. Defaults tofalse
.onlyInstructionOnRequest
(optional), aboolean
(true
orfalse
) indicating whether the instruction for this stage should be suppressed until the user asks for it (true
), or should be played automatically (false
). Defaults tofalse
.
suppressOptionAudio
(optional), aboolean
(true
orfalse
) indicating whether to prevent the audio on answer options to be played before the correct answer has been found. Defaults tofalse
.
"exercises": [
{
"id": "45e04dde-17d0-4842-a685-c10f3d11d6d3",
"type": "Comprehension",
"comprehensionSpec": {
"text": [
{ "We": "a300d857-21d1-4e9d-b1e9-ac120f038708" },
{ "are": "2000898c-9972-4971-807b-365d38db8bb0" },
{ "three": "eac2f9c5-8dca-49f4-b972-022dd174a9b1" },
{ "people": "d3e928c7-1cfe-426b-96f6-98c7b65d1077" },
{ "in": "08175114-13e9-4802-b5d3-458c58f289a2" },
{ "my": "c1f71e0c-62e7-41f5-ae48-320f60ba639f" },
{ "family": "1abb6ead-f22a-4565-99cc-26a412c9ca48" },
{ ".": "a64c2a49-916a-4109-a385-83915288c3b1" }
],
"matchingSpec": {
"matchingWords": [
{ "two": "89377ac8-f03a-43af-b701-168e5c02757f" },
{ "three": "f2b83c98-23a5-49d6-a366-a4530fdde789" },
]
},
"comprehensionQuestions": [
{
"questionText": "How many people are there in this family?",
"questionAudio": "audio/unit02-1-q1.mp3",
"options": [
{
"correct": true,
"word": {
"three": "923c82a4-5425-4fbe-95b3-66901a667c23"
}
},
{
"word": {
"you": "2122a3a3-d4f6-42ea-a2a5-38f8865cc851"
}
}
]
},
"comprehensionStages": [
{
"instructionText": "Read the text carefully, then answer questions about the text.",
"instructionAudio": "audio/comprehension-1.mp3"
},
{
"questionnaire": true
},
{
"instructionText": "Click an alternative to suggest the answer to the question.",
"instructionAudio": "audio/comprehension-2.mp3"
},
{
"instructionText": "Practice some new words with this matching exercise.",
"instructionAudio": "audio/comprehension-3.mp3"
},
{
"instructionText": "Finally, re-read the text and click on words you don't recognize to hear their pronunciation.",
"instructionAudio": "audio/comprehension-4.mp3"
}
]
]
}
}
]