Lingara Lingara Dokumentasi Panduan API Pustaka Aplikasi Buat Aplikasi web
Bahasa: Bahasa Indonesia

Konteks dan persetujuan

Halaman ini diterjemahkan dari bahasa Inggris. Jika keduanya berbeda, halaman bahasa Inggris yang benar. Baca halaman bahasa Inggris

Aplikasi Anda hanya mengetahui tentang pelajar melalui irisan konteks (context slice). Setiap irisan adalah rekaman kecil dengan field tetap. Manifest Anda mencantumkan irisan yang dimintanya, pelajar menyetujui masing-masing saat memasang aplikasi Anda, dan Lingara hanya mengirimkan irisan selama keduanya masih berlaku.

Irisan

IrisanFieldIsinya
languagessource_langBahasa yang menjadi dasar belajar pelajar, sebagai tag bahasa seperti en.
target_langBahasa yang sedang mereka pelajari.
levelLevel mereka dalam bahasa itu, dari 1 sampai 9, jika mereka sudah mengaturnya.
plan_summaryplan_idID rencana pelajaran terbaru mereka, yang membedakan satu rencana dari rencana lainnya. Aplikasi Anda tidak dapat mengambil rencana dengan ID ini, karena token aplikasi Anda membaca akun Anda sendiri, bukan akun pelajar.
titleJudul rencana yang dihasilkan, paling banyak 120 karakter, jika ada.
target_langBahasa yang diajarkan rencana itu.
set_countJumlah set dalam rencana, paling banyak 200.
sets_completedJumlah set tersebut yang telah diselesaikan pelajar.
review_duedueJumlah kartu hafalan yang jatuh tempo sekarang, paling banyak 100000.
learnedJumlah kata yang telah mereka pelajari, paling banyak 100000.
tutor_topictopicTopik obrolan tutor terbaru mereka, dari 1 sampai 120 karakter. Topik ini berasal dari judul rencana atau layar tempat mereka berada, tidak pernah dari kata-kata mereka sendiri.

Yang tidak dibawa irisan mana pun

Tidak ada irisan yang membawa alamat email, nama, ID pengguna, atau apa pun yang diketik pelajar. Aplikasi Anda mengetahui siapa pelajar itu dari subject permintaan, nilai stabil yang berbeda untuk setiap aplikasi. Token aplikasi Anda membaca akun Anda sendiri, tidak pernah akun pelajar, sehingga irisan adalah satu-satunya hal yang diketahui aplikasi Anda tentang mereka.

Persetujuan

  • Pelajar menyetujui setiap irisan saat memasang aplikasi Anda. Untuk mengubah apa yang telah mereka setujui, mereka mencopot pemasangan aplikasi Anda lalu memasangnya lagi.
  • Jika Anda mengedit manifest untuk meminta lebih sedikit irisan, irisan yang Anda hapus langsung berhenti dikirim.
  • Jika Anda mengeditnya untuk meminta lebih banyak, irisan baru tidak sampai ke pelajar mana pun sampai mereka memasang ulang.
  • Lingara memeriksa persetujuan lagi pada setiap permintaan, dan membuang irisan apa pun yang tidak disetujui pelajar atau tidak lagi diminta manifest Anda. Irisan yang tidak sesuai dengan rekamannya juga dibuang, tetapi tidak pernah seluruh permintaan.

Contoh di bawah menyusun barisnya dari irisan yang diberikan kepadanya dan tidak memanggil API apa pun.

Bahasa contoh kode

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