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

Konteksti ja suostumus

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

Sovelluksesi saa tietää oppijasta vain kontekstiosioiden kautta. Kukin osio on pieni tietue, jolla on kiinteät kentät. Manifestisi luettelee osiot, joita se pyytää, oppija suostuu kuhunkin niistä asentaessaan sovelluksesi, ja Lingara lähettää osion vain niin kauan kuin molemmat ovat yhä voimassa.

Osiot

OsioKenttäMitä se sisältää
languagessource_langKieli, josta käsin oppija opiskelee, kielitunnisteena, kuten en.
target_langKieli, jota hän opettelee.
levelHänen tasonsa siinä, väliltä 1–9, jos hän on asettanut sen.
plan_summaryplan_idHänen viimeisimmän tuntisuunnitelmansa tunniste, joka erottaa suunnitelman toisesta. Sovelluksesi ei voi hakea suunnitelmaa sillä, koska sovelluksesi tunnus lukee omaa tiliäsi, ei oppijan tiliä.
titleSuunnitelman generoitu otsikko, enintään 120 merkkiä, jos sillä on sellainen.
target_langKieli, jota suunnitelma opettaa.
set_countKuinka monta sarjaa suunnitelmassa on, enintään 200.
sets_completedKuinka monta näistä sarjoista oppija on suorittanut.
review_duedueKuinka monta muistikorttia on nyt kerrattavana, enintään 100000.
learnedKuinka monta sanaa hän on oppinut, enintään 100000.
tutor_topictopicMistä hänen viimeisin tutorkeskustelunsa kertoo, 1–120 merkkiä. Se tulee suunnitelman otsikosta tai näkymästä, jossa hän on, ei koskaan hänen omista sanoistaan.

Mitä mikään osio ei sisällä

Mikään osio ei sisällä sähköpostiosoitetta, nimeä, käyttäjätunnistetta tai mitään, mitä oppija on kirjoittanut. Sovelluksesi saa tietää, kuka oppija on, pyynnön subject-arvosta, joka on pysyvä ja eri jokaiselle sovellukselle. Sovelluksesi tunnus lukee omaa tiliäsi, ei koskaan oppijan tiliä, joten osiot ovat kaikki, mitä sovelluksesi hänestä tietää.

Suostumus

  • Oppija suostuu kuhunkin osioon asentaessaan sovelluksesi. Muuttaakseen sitä, mihin hän suostui, hän poistaa sovelluksesi asennuksen ja asentaa sen uudelleen.
  • Jos muokkaat manifestiasi pyytämään vähemmän osioita, pois jättämäsi osiot lakkaavat heti.
  • Jos muokkaat sitä pyytämään enemmän, uudet osiot eivät tavoita yhtään oppijaa ennen kuin hän asentaa sovelluksen uudelleen.
  • Lingara tarkistaa suostumuksen uudelleen jokaisen pyynnön yhteydessä ja pudottaa pois jokaisen osion, johon oppija ei suostunut tai jota manifestisi ei enää pyydä. Myös osio, joka ei sovi tietueeseensa, pudotetaan pois, ei koskaan koko pyyntöä.

Alla oleva esimerkki muodostaa rivinsä saamistaan osioista eikä kutsu mitään API:a.

Koodiesimerkin kieli

TypeScript

// The app's own client reads its owner's account, never the learner's. The
// slices are all a render knows about the learner.
function planLine(request: AppRenderRequest): string {
  let line = "";
  for (const slice of request.context) {
    // A slice is present only when the learner agreed to share it.
    if (slice.kind === "languages") line += `${slice.source_lang} → ${slice.target_lang}. `;
    if (slice.kind === "plan_summary") line += `${slice.sets_completed}/${slice.set_count} sets.`;
  }
  return line;
}

Rust

// The app's own client reads its owner's account, never the learner's. The
// slices are all a render knows about the learner.
/// The learner's target language and, when they shared their plan, its
/// `(sets_completed, set_count)`.
fn shared_plan(request: &AppRenderRequest) -> (String, Option<(u32, u32)>) {
    let (mut target_lang, mut progress) = (String::from("zh"), None);
    for slice in &request.context {
        match slice {
            ContextSlice::Languages(languages) => target_lang = languages.target_lang.clone(),
            ContextSlice::PlanSummary(summary) => progress = Some((summary.sets_completed, summary.set_count)),
            _ => {}
        }
    }
    (target_lang, progress)
}

Go

// The app's own client reads its owner's account, never the learner's.
// The slices are all a render knows about the learner.
//
// Each slice is present only when the learner agreed to share it.
card := lingaraapps.NewCard().Heading("Your plan", 1)
for _, slice := range req.Context {
	switch s := slice.(type) {
	case lingaraapps.ContextSliceLanguages:
		card.Text(fmt.Sprintf("Learning %s from %s", s.TargetLang, s.SourceLang))
	case lingaraapps.ContextSlicePlanSummary:
		card.Text(fmt.Sprintf("%d of %d sets done", s.SetsCompleted, s.SetCount))
	}
}

Java

import com.getlingara.apps.Card;
import com.getlingara.apps.Reply;
import com.getlingara.apps.model.AppRenderRequest;
import com.getlingara.apps.model.ContextSlice;
import com.getlingara.apps.model.ContextSliceLanguages;
import com.getlingara.apps.model.ContextSlicePlanSummary;

// The app's own client reads its owner's account, never the learner's. The slices are all a
// render knows about the learner.
static Reply render(AppRenderRequest request) {
  Card.Builder card = Card.card();
  // A slice is present only when the learner agreed to share it; the context is read-only.
  for (ContextSlice slice : request.getContext()) {
    if (slice instanceof ContextSliceLanguages languages) {
      card.heading("Learning " + languages.targetLang(), 1);
    } else if (slice instanceof ContextSlicePlanSummary summary) {
      card.text(summary.setsCompleted() + " of " + summary.setCount() + " sets done");
    }
  }
  return card.heading("Today", 2).build();
}

Kotlin

import com.getlingara.apps.kotlin.Reply
import com.getlingara.apps.kotlin.card
import com.getlingara.apps.kotlin.model.AppRenderRequest
import com.getlingara.apps.kotlin.model.ContextSliceLanguages
import com.getlingara.apps.kotlin.model.ContextSlicePlanSummary

// The app's own client reads its owner's account, never the learner's. The slices are all a
// render knows about the learner.
fun renderWithContext(request: AppRenderRequest): Reply {
    // A slice is present only when the learner agreed to share it; the context is read-only.
    val languages = request.context.filterIsInstance<ContextSliceLanguages>().firstOrNull()
    val summary = request.context.filterIsInstance<ContextSlicePlanSummary>().firstOrNull()
    return card {
        heading("Learning ${languages?.targetLang ?: "today"}", 1)
        if (summary != null) {
            text("${summary.setsCompleted} of ${summary.setCount} sets done")
        }
    }
}

Ruby

# The app's own client reads its owner's account, never the learner's. The
# slices are all a render knows about the learner.
#
# A slice is present only when the learner agreed to share it.
request.context.filter_map do |slice|
  case slice
  in Lingara::Apps::ContextSliceLanguages(source_lang:, target_lang:)
    "#{source_lang} → #{target_lang}."
  in Lingara::Apps::ContextSlicePlanSummary(sets_completed:, set_count:)
    "#{sets_completed}/#{set_count} sets."
  else nil
  end
end.join(" ")

PHP

use Lingara\Apps\Generated\ContextSliceLanguages;
use Lingara\Apps\Generated\ContextSlicePlanSummary;

function planLine(AppRenderRequest $request): string
{
    // The app's own client reads its owner's account, never the learner's. The
    // slices are all a render knows about the learner.
    $line = '';
    // A slice is present only when the learner agreed to share it.
    foreach ($request->getContext() as $slice) {
        if ($slice instanceof ContextSliceLanguages) {
            $line .= "{$slice->sourceLang} → {$slice->targetLang}. ";
        } elseif ($slice instanceof ContextSlicePlanSummary) {
            $line .= "{$slice->setsCompleted}/{$slice->setCount} sets.";
        }
    }
    return $line;
}

Katso myös