Lingara Lingara Dokumentasyon Mga gabay API Mga library Mga app Gumawa Web app
Wika: Filipino

Context at pahintulot

Isinalin mula sa Ingles ang pahinang ito. Kung magkaiba ang dalawa, ang pahinang Ingles ang tama. Basahin ang pahinang Ingles

Nalalaman lang ng app mo ang tungkol sa isang mag-aaral sa pamamagitan ng mga context slice. Ang bawat slice ay isang maliit na record na may mga takdang field. Inililista ng manifest mo ang mga slice na hinihiling nito, sinasang-ayunan ng mag-aaral ang bawat isa kapag in-install niya ang app mo, at nagpapadala lang ang Lingara ng slice habang parehong totoo pa ang dalawang iyon.

Ang mga slice

SliceFieldAng laman nito
languagessource_langAng wikang pinanggagalingan ng pag-aaral ng mag-aaral, bilang language tag gaya ng en.
target_langAng wikang pinag-aaralan niya.
levelAng antas niya rito, mula 1 hanggang 9, kapag nagtakda siya nito.
plan_summaryplan_idAng id ng pinakabago niyang plano ng aralin, na nagpapaiba sa isang plano mula sa iba. Hindi makukuha ng app mo ang plano gamit ito, dahil ang token ng app mo ay nagbabasa ng sarili mong account, hindi ng sa mag-aaral.
titleAng binuong pamagat ng plano, hanggang 120 character, kapag mayroon.
target_langAng wikang itinuturo ng plano.
set_countIlang set ang mayroon ang plano, hanggang 200.
sets_completedIlan sa mga set na iyon ang natapos na ng mag-aaral.
review_duedueIlang flashcard ang nakatakda ngayon, hanggang 100000.
learnedIlang salita na ang natutunan niya, hanggang 100000.
tutor_topictopicKung tungkol saan ang pinakahuli niyang chat sa tutor, mula 1 hanggang 120 character. Galing ito sa pamagat ng isang plano o sa screen na kinaroroonan niya, hindi kailanman sa sarili niyang mga salita.

Ang hindi dala ng anumang slice

Walang slice na nagdadala ng email address, pangalan, user id o anumang tinype ng mag-aaral. Nalalaman ng app mo kung sino ang mag-aaral mula sa subject ng kahilingan, isang matatag na value na iba para sa bawat app. Ang token ng app mo ay nagbabasa ng sarili mong account, hindi kailanman ng sa mag-aaral, kaya ang mga slice lang ang lahat ng alam ng app mo tungkol sa kanya.

Pahintulot

  • Sinasang-ayunan ng mag-aaral ang bawat slice kapag in-install niya ang app mo. Para baguhin ang sinang-ayunan niya, ina-uninstall niya ang app mo at ini-install itong muli.
  • Kung ie-edit mo ang manifest mo para humiling ng mas kaunting slice, agad na titigil ang mga tinanggal mo.
  • Kung ie-edit mo ito para humiling ng higit pa, walang mag-aaral na maaabot ng mga bagong slice hangga’t hindi siya nagre-reinstall.
  • Muling sinusuri ng Lingara ang pahintulot sa bawat kahilingan, at tinatanggal ang anumang slice na hindi sinang-ayunan ng mag-aaral o hindi na hinihiling ng manifest mo. Tinatanggal din ang slice na hindi kasya sa record nito, hindi kailanman ang buong kahilingan.

Binubuo ng sample sa ibaba ang linya nito mula sa mga slice na ibinigay dito at wala itong tinatawag na API.

Wika ng halimbawang code

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

Tingnan din