Lingara Lingara ドキュメント 学習ガイド API ライブラリ アプリ 作成 ウェブ版
言語: 日本語

コンテキストと同意

このページは英語から翻訳されています。内容に相違がある場合は、英語のページが正しい内容です。 英語のページを読む

アプリが学習者について知ることができるのは、コンテキストスライスを通じてだけです。各スライスは、固定のフィールドを持つ小さなレコードです。マニフェストには求めるスライスを列挙し、学習者はアプリのインストール時にそれぞれに同意します。Lingara がスライスを送るのは、その両方が引き続き成り立っている間だけです。

スライス

スライスフィールド内容
languagessource_lang学習者が学習の起点にしている言語。en のような言語タグで表します。
target_lang学習者が学んでいる言語。
levelその言語でのレベル。1 から 9 まで。学習者が設定している場合のみ。
plan_summaryplan_id学習者の最新のレッスンプランの ID。プランどうしを見分けるためのものです。アプリはこれを使ってプランを取得することはできません。アプリのトークンが読み取るのはあなた自身のアカウントで、学習者のアカウントではないからです。
title生成されたプランのタイトル。最大 120 文字。タイトルがある場合のみ。
target_langプランが教える言語。
set_countプランに含まれるセットの数。最大 200。
sets_completedそのうち学習者が完了したセットの数。
review_duedue現在復習待ちのフラッシュカードの枚数。最大 100000。
learned学習者が覚えた単語の数。最大 100000。
tutor_topictopic学習者の最新のチューターチャットのトピック。1 から 120 文字。プランのタイトルや学習者がいる画面から取られ、学習者自身の言葉から取られることはありません。

どのスライスにも含まれないもの

どのスライスにも、メールアドレス、名前、ユーザー ID、学習者が入力したものは含まれません。アプリは、リクエストの subject から学習者が誰かを知ります。これは安定した値で、アプリごとに異なります。アプリのトークンが読み取るのはあなた自身のアカウントで、学習者のアカウントを読み取ることはありません。そのため、アプリが学習者について知っていることはスライスがすべてです。

同意

  • 学習者は、アプリのインストール時に各スライスに同意します。同意した内容を変更するには、アプリをアンインストールしてから再度インストールします。
  • マニフェストを編集して求めるスライスを減らすと、外したスライスはただちに送られなくなります。
  • マニフェストを編集して求めるスライスを増やしても、新しいスライスは、学習者が再インストールするまでどの学習者にも届きません。
  • Lingara はリクエストのたびに同意を改めて確認し、学習者が同意していないスライスや、マニフェストがもう求めていないスライスを破棄します。レコードに合わないスライスも破棄されますが、リクエスト全体が破棄されることはありません。

下のサンプルは、渡されたスライスから表示する 1 行を組み立て、API は一切呼び出しません。

コード例の言語

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

関連項目