Lingara Lingara 說明文件 學習指南 API 函式庫 App 建立 網頁版
語言: 客家話

情境資料摎同意

這頁係對英文翻譯過來个。若係兩片無共樣,以英文頁為準。 看英文頁

你个 App 淨做得透過情境資料片段知學習者个事情。每隻片段都係一份欄位固定个細記錄。你个清單列出佢想愛个片段,學習者在安裝你个 App 个時節一隻一隻同意,Lingara 淨在這兩樣都還成立个時節正會送一隻片段。

片段

片段欄位肚項有麼个
languagessource_lang學習者用來學个語言,用語言標記表示,像 en。
target_lang佢兜在學个語言。
level佢兜在該種語言个等級,從 1 到 9,前提係佢兜有設定。
plan_summaryplan_id佢兜最新課程計畫个 id,用來分別一隻計畫摎另一隻計畫。你个 App 毋能用佢拿該隻計畫,因為你个 App 个權杖讀个係你自家个帳戶,毋係學習者个。
title該隻計畫產生出來个標題,最多 120 隻字元,前提係佢有標題。
target_lang該隻計畫教个語言。
set_count該隻計畫有幾多組,最多 200。
sets_completed學習者已經完成其中幾多組。
review_duedue這下有幾多張閃卡到期,最多 100000。
learned佢兜已經學會幾多隻詞,最多 100000。
tutor_topictopic佢兜最新摎導師對話个主題,從 1 到 120 隻字元。佢來自一隻計畫个標題抑係佢兜所在个畫面,永遠毋係來自佢兜自家个話。

無任何片段會帶个東西

無任何片段會帶電子郵件地址、名、使用者 id,抑係學習者打過个任何東西。你个 App 從請求个 subject 知學習者係麼人,這係一隻穩定个值,每隻 App 收著个都無共樣。你个 App 个權杖讀个係你自家个帳戶,永遠毋係學習者个,所以片段就係你个 App 對佢兜所知个全部。

同意

  • 學習者在安裝你个 App 个時節,一隻一隻同意每隻片段。若愛改佢兜同意个東西,佢兜愛解除安裝你个 App 再重新安裝。
  • 若係你改清單要求較少个片段,你拿忒个該兜會馬上停。
  • 若係你改清單要求較多个片段,新个片段在學習者重新安裝以前毋會到任何學習者該位。
  • Lingara 每擺請求都會再檢查一擺同意,學習者無同意个、抑係你个清單已經無再要求个片段,都會分人丟忒。毋合佢記錄格式个片段也會分人丟忒,毋過永遠毋會丟忒歸隻請求。

下背个範例用佢收著个片段組出佢个一行字,無呼叫任何 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;
}

另外看