Lingara Lingara Dokumentasie Gidse API Biblioteke Apps Bou Webtoepassing
Taal: Afrikaans

Konteks en toestemming

Hierdie bladsy is uit Engels vertaal. As die twee verskil, is die Engelse bladsy korrek. Lees die Engelse bladsy

Jou app kom net deur kontekssnitte iets oor ‘n leerder te wete. Elke snit is ‘n klein rekord met vaste velde. Jou manifes lys die snitte waarvoor dit vra, die leerder stem tot elkeen in wanneer hulle jou app installeer, en Lingara stuur ‘n snit net solank albei steeds geld.

Die snitte

SnitVeldWat dit bevat
languagessource_langDie taal waaruit die leerder studeer, as ‘n taalmerker soos en.
target_langDie taal wat hulle leer.
levelHul vlak daarin, van 1 tot 9, wanneer hulle een gestel het.
plan_summaryplan_idDie id van hul nuutste lesplan, wat een plan van ‘n ander onderskei. Jou app kan nie die plan daarmee gaan haal nie, want jou app se token lees jou eie rekening, nie die leerder s’n nie.
titleDie plan se gegenereerde titel, hoogstens 120 karakters, wanneer dit een het.
target_langDie taal wat die plan onderrig.
set_countHoeveel stelle die plan het, hoogstens 200.
sets_completedHoeveel van daardie stelle die leerder voltooi het.
review_duedueHoeveel flitskaarte nou gereed is, hoogstens 100000.
learnedHoeveel woorde hulle geleer het, hoogstens 100000.
tutor_topictopicWaaroor hul nuutste tutor-gesprek gaan, van 1 tot 120 karakters. Dit kom van ‘n plan se titel of die skerm waarop hulle is, nooit van hul eie woorde nie.

Wat geen snit dra nie

Geen snit dra ‘n e-posadres, ‘n naam, ‘n gebruiker-id of enigiets wat die leerder getik het nie. Jou app leer wie die leerder is uit die versoek se subject, ‘n stabiele waarde wat vir elke app anders is. Jou app se token lees jou eie rekening, nooit die leerder s’n nie, dus is die snitte al wat jou app oor hulle weet.

Toestemming

  • Die leerder stem tot elke snit in wanneer hulle jou app installeer. Om te verander waartoe hulle ingestem het, deïnstalleer hulle jou app en installeer dit weer.
  • As jy jou manifes wysig om vir minder snitte te vra, hou die snitte wat jy laat val het dadelik op.
  • As jy dit wysig om vir meer te vra, bereik die nuwe snitte geen leerder totdat hulle herinstalleer nie.
  • Lingara kontroleer toestemming weer by elke versoek, en laat enige snit weg waartoe die leerder nie ingestem het nie of waarvoor jou manifes nie meer vra nie. ‘n Snit wat nie by sy rekord pas nie, word ook weggelaat, nooit die hele versoek nie.

Die voorbeeld hieronder bou sy reël uit die snitte wat dit gekry het en roep geen API nie.

Taal van die kodevoorbeeld

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

Sien ook