Lingara Lingara Dokumentasi Panduan API Pustaka Aplikasi Bina Apl web
Bahasa: Bahasa Melayu

Konteks dan persetujuan

Halaman ini diterjemahkan daripada bahasa Inggeris. Jika kedua-duanya berbeza, halaman bahasa Inggeris adalah yang betul. Baca halaman bahasa Inggeris

Aplikasi anda mengetahui tentang pelajar hanya melalui hirisan konteks. Setiap hirisan ialah rekod kecil dengan medan tetap. Manifest anda menyenaraikan hirisan yang dimintanya, pelajar bersetuju dengan setiap satu apabila dia memasang aplikasi anda, dan Lingara menghantar sesuatu hirisan hanya selagi kedua-dua syarat itu masih berlaku.

Hirisan

HirisanMedanApa yang dipegangnya
languagessource_langBahasa yang menjadi asas pembelajaran pelajar, sebagai tag bahasa seperti en.
target_langBahasa yang sedang dipelajarinya.
levelTahapnya dalam bahasa itu, dari 1 hingga 9, jika dia telah menetapkannya.
plan_summaryplan_idID pelan pelajaran terkininya, yang membezakan satu pelan daripada pelan yang lain. Aplikasi anda tidak boleh mengambil pelan itu dengannya, kerana token aplikasi anda membaca akaun anda sendiri, bukan akaun pelajar.
titleTajuk pelan yang dijana, paling banyak 120 aksara, jika ada.
target_langBahasa yang diajar oleh pelan itu.
set_countBilangan set dalam pelan itu, paling banyak 200.
sets_completedBilangan set itu yang telah diselesaikan oleh pelajar.
review_duedueBilangan kad kilat yang perlu disemak sekarang, paling banyak 100000.
learnedBilangan perkataan yang telah dipelajarinya, paling banyak 100000.
tutor_topictopicTopik sembang tutor terkininya, dari 1 hingga 120 aksara. Ia datang daripada tajuk pelan atau skrin yang sedang dibukanya, tidak pernah daripada kata-katanya sendiri.

Apa yang tidak dibawa oleh mana-mana hirisan

Tiada hirisan yang membawa alamat e-mel, nama, ID pengguna atau apa-apa yang ditaip oleh pelajar. Aplikasi anda mengetahui siapa pelajar itu daripada subject permintaan, nilai stabil yang berbeza bagi setiap aplikasi. Token aplikasi anda membaca akaun anda sendiri, tidak pernah akaun pelajar, jadi hirisan itulah sahaja yang diketahui oleh aplikasi anda tentang dirinya.

Persetujuan

  • Pelajar bersetuju dengan setiap hirisan apabila dia memasang aplikasi anda. Untuk mengubah apa yang telah dipersetujuinya, dia menyahpasang aplikasi anda dan memasangnya semula.
  • Jika anda menyunting manifest untuk meminta lebih sedikit hirisan, hirisan yang anda gugurkan berhenti serta-merta.
  • Jika anda menyuntingnya untuk meminta lebih banyak, hirisan baharu tidak sampai kepada mana-mana pelajar sehingga dia memasang semula.
  • Lingara menyemak persetujuan sekali lagi pada setiap permintaan, dan menggugurkan sebarang hirisan yang tidak dipersetujui oleh pelajar atau tidak lagi diminta oleh manifest anda. Hirisan yang tidak sepadan dengan rekodnya juga digugurkan, tidak pernah keseluruhan permintaan.

Sampel di bawah membina barisnya daripada hirisan yang diberikan kepadanya dan tidak memanggil sebarang API.

Bahasa contoh kod

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

Lihat juga