Lingara Lingara Ohjeet Oppaat API Kirjastot Sovellukset Rakenna Verkkosovellus
Kieli: Suomi

Kortit

Tämä sivu on käännetty englannista. Jos ne eroavat toisistaan, englanninkielinen sivu on oikea. Lue englanninkielinen sivu

Kortti on lyhyt lista elementtejä, jotka Lingara piirtää omalla tyylillään. Siinä ei ole syöttökenttiä, kuvia, skriptejä eikä merkintäkieltä. Sovellus ei voi tuoda omaa koodiaan tai omaa ulkoasuaan oppijan näytölle, joten jokainen kortti näyttää muulta Lingaralta. Vastauksesi on JSONia: card, joka sisältää sen elements, ja valinnaisesti tutor_note (katso Tutorin muistiinpano).

Elementit

Jokaisella elementillä on type, joka on yksi näistä kahdeksasta:

ElementtiKentätMitä se näyttää
headingtext, levelOtsikko. level on 1 tai 2, ja mikä tahansa muu arvo muuttuu arvoksi 2. Sen teksti on enintään 80 merkkiä.
texttext, langKappale, jossa on enintään 600 merkkiä. Se on ainoa paikka, jossa rivinvaihto säilyy.
termword, reading, gloss, langOpittava sana. Vain word on pakollinen. Sana on enintään 60 merkkiä, lukutapa 120 ja selitys 160.
listitemsEnintään 20 kohdetta. Kukin kohde on text tai term, ja sillä on samat kentät kuin samannimisellä elementillä.
progressvalue, labelEdistymispalkki. value kulkee välillä 0–1, ja nimike on enintään 60 merkkiä.
dividerViiva kortin osien välissä.
buttonlabel, action, stylePainike, joka lähettää action-arvonsa palvelimellesi. style on primary tai secondary, ja nimike on enintään 32 merkkiä.
linklabel, urlLinkki, jonka oppija avaa selaimessaan Lingaran kysyttyä häneltä ensin. Nimike on enintään 60 merkkiä.

lang on kielitunniste, kuten ja, jotta Lingara piirtää oikean kirjoitusjärjestelmän. Arvo, joka ei ole kielitunniste, poistetaan.

Rajat

  • Kortissa on enintään 24 elementtiä. 24. elementin jälkeiset elementit pudotetaan pois.
  • Listassa on enintään 20 kohdetta. 20. kohteen jälkeiset kohteet pudotetaan pois, ja tyhjä lista pudotetaan pois.
  • Kortissa on enintään 4 painiketta. 4. painikkeen jälkeiset painikkeet pudotetaan pois.
  • Rajaansa pidempi teksti lyhennetään mahtumaan ja päättyy merkkiin …. Merkit lasketaan Unicode-skalaariarvoina.
  • Ohjausmerkit ja suunnanohitukset poistetaan jokaisesta merkkijonosta.
  • Linkki pudotetaan pois, jos sen osoite ei ole HTTPS, se sisältää käyttäjänimen tai se osoittaa IP-osoitteeseen.
  • Painike pudotetaan pois, jos sen action on yli 64 merkkiä pitkä tai se käyttää muuta kuin kirjaimia, numeroita, _, ., : ja -.
  • Elementti, jossa ei ole näiden sääntöjen jälkeen tekstiä jäljellä, pudotetaan pois.

Nämä säännöt ovat sallivia: Lingara lyhentää tai pudottaa sen, mikä ei mahdu, ja piirtää loput. Paketit soveltavat samoja sääntöjä ennen kuin vastaat, joten näet, mikä muuttuisi.

Tiukka jäsentäminen

Sanasto on suljettu. Tuntematon elementtityyppi, kenttä, jota elementillä ei ole, väärää JSON-tyyppiä oleva arvo tai vastaus, joka ei ole lainkaan JSONia, muuttaa koko vastauksen varakortiksi. Lingara ei koskaan piirrä osaa kortista, jota se ei pystynyt lukemaan.

Koko ja aika

Vastaus saa olla enintään 32 KiB. Lingara antaa palvelimellesi 3 sekuntia aikaa vastata renderöintiin ja 5 sekuntia aikaa vastata toimintoon, eikä yritä kumpaakaan uudelleen. Vastauksen tilan on oltava 200 ja sisältötyypin JSON. Uudelleenohjauksia ei seurata.

Painikkeet ja toiminnot

Kun oppija painaa painiketta, Lingara lähettää palvelimellesi toimintopyynnön, joka sisältää kyseisen painikkeen action-arvon. Palvelimesi vastaa uudella kortilla, joka korvaa vanhan. Sama painallus voi saapua kahdesti, joten tee jokaisesta toiminnosta turvallinen toistaa.

Kun kortti epäonnistuu

Kun Lingara ei saa korttia, jonka se pystyy piirtämään, oppija näkee Lingaran oman “Tämä sovellus ei vastannut” -kortin omalla kielellään tai viimeisimmän toimivan korttisi merkittynä ei ajan tasalla olevaksi. Oppijalle ei koskaan kerrota syytä. Vain sinä sovelluksen omistajana näet syyn:

  • Vastauksesi: invalid (ei kortti, jonka Lingara voi lukea), empty (rajojen jälkeen ei jäänyt mitään näytettävää) tai too_large (yli 32 KiB).
  • Palvelimesi tavoittaminen: timeout, http_error (mikä tahansa muu tila kuin 200), transport (yhteys- tai TLS-virhe, kuten vanhentunut varmenne) tai blocked (render_url, joka johtaa yksityiseen tai IP-literaaliosoitteeseen).
  • Lingaran puoli: unavailable (Lingara ei voinut allekirjoittaa pyyntöä) tai busy (liian monta pyyntöä jo käynnissä).
Koodiesimerkin kieli

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.
}