Lingara Lingara Τεκμηρίωση Οδηγοί API Βιβλιοθήκες Εφαρμογές Δημιουργία Διαδικτυακή εφαρμογή
Γλώσσα: Ελληνικά

Κάρτες

Αυτή η σελίδα έχει μεταφραστεί από τα αγγλικά. Αν οι δύο διαφέρουν, η αγγλική σελίδα είναι η σωστή. Διαβάστε την αγγλική σελίδα

Μια κάρτα είναι μια σύντομη λίστα στοιχείων που το Lingara σχεδιάζει με το δικό του στυλ. Δεν υπάρχουν πεδία εισαγωγής, εικόνες, σενάρια ή σήμανση. Μια εφαρμογή δεν μπορεί να βάλει δικό της κώδικα ή δική της εμφάνιση στην οθόνη ενός μαθητή, οπότε κάθε κάρτα διαβάζεται όπως το υπόλοιπο Lingara. Η απάντησή σας είναι JSON: ένα card που περιέχει τα elements του, και προαιρετικά ένα tutor_note (δείτε Η σημείωση για τον δάσκαλο).

Τα στοιχεία

Κάθε στοιχείο έχει ένα type, που είναι ένα από αυτά τα οκτώ:

ΣτοιχείοΠεδίαΤι δείχνει
headingtext, levelΜια επικεφαλίδα. Το level είναι 1 ή 2, και οποιαδήποτε άλλη τιμή γίνεται 2. Το κείμενό της είναι το πολύ 80 χαρακτήρες.
texttext, langΜια παράγραφος το πολύ 600 χαρακτήρων. Είναι το μόνο σημείο όπου διατηρείται μια αλλαγή γραμμής.
termword, reading, gloss, langΜια λέξη προς εκμάθηση. Μόνο το word είναι υποχρεωτικό. Η λέξη είναι το πολύ 60 χαρακτήρες, η ανάγνωση 120 και η ερμηνεία 160.
listitemsΈως 20 αντικείμενα. Κάθε αντικείμενο είναι ένα text ή ένα term, με τα ίδια πεδία με το ομώνυμο στοιχείο.
progressvalue, labelΜια γραμμή προόδου. Το value κυμαίνεται από 0 έως 1, και η ετικέτα είναι το πολύ 60 χαρακτήρες.
dividerΜια γραμμή ανάμεσα σε τμήματα της κάρτας.
buttonlabel, action, styleΈνα κουμπί που στέλνει το action του στον διακομιστή σας. Το style είναι primary ή secondary, και η ετικέτα είναι το πολύ 32 χαρακτήρες.
linklabel, urlΈνας σύνδεσμος που ο μαθητής ανοίγει στο πρόγραμμα περιήγησής του, αφού το Lingara τον ρωτήσει. Η ετικέτα είναι το πολύ 60 χαρακτήρες.

Ένα lang είναι μια ετικέτα γλώσσας όπως ja, ώστε το Lingara να σχεδιάζει τη σωστή γραφή. Μια τιμή που δεν είναι ετικέτα γλώσσας αφαιρείται.

Τα όρια

  • Μια κάρτα περιέχει το πολύ 24 στοιχεία. Τα στοιχεία μετά το 24ο απορρίπτονται.
  • Μια λίστα περιέχει το πολύ 20 αντικείμενα. Τα αντικείμενα μετά το 20ό απορρίπτονται, και μια κενή λίστα απορρίπτεται.
  • Μια κάρτα περιέχει το πολύ 4 κουμπιά. Τα κουμπιά μετά το 4ο απορρίπτονται.
  • Κείμενο μεγαλύτερο από το όριό του περικόπτεται ώστε να χωράει και τελειώνει σε …. Οι χαρακτήρες μετρώνται ως βαθμωτές τιμές Unicode.
  • Οι χαρακτήρες ελέγχου και οι παρακάμψεις κατεύθυνσης αφαιρούνται από κάθε συμβολοσειρά.
  • Ένας σύνδεσμος του οποίου η διεύθυνση δεν είναι HTTPS, περιέχει όνομα χρήστη ή δείχνει σε διεύθυνση IP απορρίπτεται.
  • Ένα κουμπί του οποίου το action είναι μεγαλύτερο από 64 χαρακτήρες ή χρησιμοποιεί οτιδήποτε άλλο εκτός από γράμματα, ψηφία, _, ., : και - απορρίπτεται.
  • Ένα στοιχείο στο οποίο δεν απομένει κείμενο μετά από αυτούς τους κανόνες απορρίπτεται.

Αυτοί οι κανόνες είναι επιεικείς: το Lingara περικόπτει ή απορρίπτει ό,τι δεν χωράει και σχεδιάζει τα υπόλοιπα. Τα κιτ εφαρμόζουν τους ίδιους κανόνες πριν απαντήσετε, ώστε να βλέπετε τι θα άλλαζε.

Αυστηρή ανάλυση

Το λεξιλόγιο είναι κλειστό. Ένας άγνωστος τύπος στοιχείου, ένα πεδίο που δεν έχει ένα στοιχείο, μια τιμή λάθος τύπου JSON ή μια απάντηση που δεν είναι καθόλου JSON μετατρέπει ολόκληρη την απάντηση σε εφεδρική κάρτα. Το Lingara δεν σχεδιάζει ποτέ μέρος μιας κάρτας που δεν μπόρεσε να διαβάσει.

Μέγεθος και χρόνος

Μια απάντηση μπορεί να είναι το πολύ 32 KiB. Το Lingara δίνει στον διακομιστή σας 3 δευτερόλεπτα για να απαντήσει σε ένα render και 5 δευτερόλεπτα για να απαντήσει σε μια ενέργεια, και δεν επαναλαμβάνει κανένα από τα δύο. Μια απάντηση πρέπει να έχει κατάσταση 200 και τύπο περιεχομένου JSON. Οι ανακατευθύνσεις δεν ακολουθούνται.

Κουμπιά και ενέργειες

Όταν ο μαθητής πατά ένα κουμπί, το Lingara στέλνει στον διακομιστή σας ένα αίτημα ενέργειας που μεταφέρει το action αυτού του κουμπιού. Ο διακομιστής σας απαντά με μια νέα κάρτα, η οποία αντικαθιστά την παλιά. Το ίδιο πάτημα μπορεί να φτάσει δύο φορές, οπότε κάντε κάθε ενέργεια ασφαλή στην επανάληψη.

Όταν μια κάρτα αποτυγχάνει

Όταν το Lingara δεν μπορεί να λάβει μια κάρτα που μπορεί να σχεδιάσει, ο μαθητής βλέπει τη δική του κάρτα του Lingara «Αυτή η εφαρμογή δεν απάντησε» στη γλώσσα του, ή την τελευταία καλή σας κάρτα επισημασμένη ως μη ενημερωμένη. Στον μαθητή δεν λέγεται ποτέ ο λόγος. Μόνο εσείς, ως κάτοχος της εφαρμογής, βλέπετε τον λόγο:

  • Η απάντησή σας: invalid (όχι κάρτα που μπορεί να διαβάσει το Lingara), empty (δεν απέμεινε τίποτα για εμφάνιση μετά τα όρια) ή too_large (περισσότερα από 32 KiB).
  • Η πρόσβαση στον διακομιστή σας: timeout, http_error (οποιαδήποτε κατάσταση εκτός από 200), transport (αποτυχία σύνδεσης ή TLS, όπως ένα ληγμένο πιστοποιητικό) ή blocked (ένα render_url που οδηγεί σε ιδιωτική διεύθυνση ή σε κυριολεκτική διεύθυνση IP).
  • Η πλευρά του Lingara: unavailable (το Lingara δεν μπόρεσε να υπογράψει το αίτημα) ή busy (ήδη πάρα πολλά αιτήματα σε εξέλιξη).
Γλώσσα παραδείγματος κώδικα

TypeScript

function todayCard(streak: number): Card {
  return card()
    .heading("Today's five", 1)
    .term({ word: "雨", reading: "yǔ", gloss: "rain", lang: "zh" })
    .list([item.text("Review 3 words"), item.term({ word: "二", reading: "èr" })])
    .button(`Done (${streak})`, "done")
    .build(); // Throws CardLimitError naming the rule the relay would clamp.
}

Rust

fn today_card(title: &str, lang: &str) -> Result<lingara_apps::Card, BoxError> {
    Ok(card()
        .heading(title, 1)
        .term(Term::new("雨").reading("yǔ").gloss("rain").lang(lang))
        .list([item::text("Say it aloud"), item::term(Term::new("下雨").gloss("to rain"))])
        .button("Next word", "next")
        .build()?)
}

Go

card, err := lingaraapps.NewCard().
	Heading("Today", 1).
	Term(lingaraapps.Term{Word: "雨", Reading: "yǔ", Gloss: "rain", Lang: "zh"}).
	List(
		lingaraapps.Item.Text("Say it aloud three times."),
		lingaraapps.Item.Term(lingaraapps.Term{Word: "雨天", Gloss: "rainy day", Lang: "zh"}),
	).
	Button("Next", "next").
	Build()
if err != nil {
	// A *lingaraapps.CardLimitError names the rule the card breaks,
	// such as text_length or list_items. Nothing is cut for you.
	return lingaraapps.Card{}, err
}

Java

import com.getlingara.apps.Card;
import com.getlingara.apps.Item;

Card card =
    Card.card()
        .heading("Today's five", 1)
        .term("雨", "yǔ", "rain", "zh")
        .list(Item.text("Say it aloud"), Item.term("二", "èr", "two", "zh"))
        .button("Next", "next")
        .build(); // a CardLimitException names the first rule the card breaks

Kotlin

import com.getlingara.apps.kotlin.Card
import com.getlingara.apps.kotlin.card

val c =
    card {
        heading("Today's five", 1)
        term("雨", reading = "yǔ", gloss = "rain", lang = "zh")
        list(item.text("Say it aloud"), item.term("二", reading = "èr", gloss = "two", lang = "zh"))
        button("Next", "next")
    } // a CardLimitException names the first rule the card breaks

Ruby

def self.today_card(streak)
  Lingara::Apps.card
    .heading("Today's five", 1)
    .term(word: "雨", reading: "yǔ", gloss: "rain", lang: "zh")
    .list([Lingara::Apps.item.text("Review 3 words"), Lingara::Apps.item.term(word: "二", reading: "èr")])
    .button("Done (#{streak})", "done")
    .build # Raises Lingara::Apps::CardLimitError naming the rule Lingara would clamp.
end

PHP

use Lingara\Apps\Card;
use Lingara\Apps\Generated\Card as CardModel;
use Lingara\Apps\Item;

function todayCard(int $streak): CardModel
{
    return Card::create()
        ->heading("Today's five", 1)
        ->term('雨', reading: 'yǔ', gloss: 'rain', lang: 'zh')
        ->list([Item::text('Review 3 words'), Item::term('二', reading: 'èr')])
        ->button("Done ({$streak})", 'done')
        ->build(); // Throws CardLimitException naming the rule the relay would clamp.
}