Lingara Lingara مستندات رهنماها API کتابخانه‌ها اپلیکیشن‌ها ساختن اپلیکیشن وب
زبان: دری

زمینه و رضایت

این صفحه از انگلیسی ترجمه شده است. اگر این دو با هم فرق داشته باشند، صفحهٔ انگلیسی درست است. صفحهٔ انگلیسی را بخوانید

اپلیکیشن شما تنها از راه برش‌های زمینه چیزی دربارهٔ آموزنده می‌فهمد. هر برش یک ریکارد کوچک با فیلدهای ثابت است. مانیفست شما برش‌هایی را که می‌خواهد فهرست می‌کند، آموزنده هنگام نصب اپلیکیشن شما با هر کدام موافقت می‌کند، و Lingara یک برش را تنها تا زمانی که هر دو برقرار باشند می‌فرستد.

برش‌ها

برشفیلدآنچه در بر دارد
languagessource_langزبانی که آموزنده از آن می‌آموزد، به شکل برچسب زبانی مانند en.
target_langزبانی که در حال آموختن آن است.
levelسطح او در آن زبان، از 1 تا 9، اگر سطحی تعیین کرده باشد.
plan_summaryplan_idشناسهٔ تازه‌ترین برنامهٔ درسی او، که یک برنامه را از برنامهٔ دیگر جدا می‌کند. اپلیکیشن شما نمی‌تواند با آن برنامه را بگیرد، زیرا توکن اپلیکیشن شما حساب خود شما را می‌خواند، نه حساب آموزنده را.
titleعنوان تولیدشدهٔ برنامه، حداکثر 120 حرف، اگر عنوانی داشته باشد.
target_langزبانی که برنامه آموزش می‌دهد.
set_countتعداد مجموعه‌های برنامه، حداکثر 200.
sets_completedتعداد مجموعه‌هایی از آن‌ها که آموزنده تمام کرده است.
review_duedueتعداد فلش‌کارت‌هایی که اکنون وقت مرورشان رسیده، حداکثر 100000.
learnedتعداد لغاتی که آموخته، حداکثر 100000.
tutor_topictopicموضوع تازه‌ترین گفتگوی او با آموزگار، از 1 تا 120 حرف. از عنوان یک برنامه یا صفحه‌ای که در آن است می‌آید، هرگز از کلمات خود او.

آنچه هیچ برشی با خود ندارد

هیچ برشی آدرس ایمیل، نام، شناسهٔ کاربر یا هر چیزی که آموزنده تایپ کرده باشد را با خود ندارد. اپلیکیشن شما هویت آموزنده را از subject درخواست می‌فهمد؛ مقداری ثابت که برای هر اپلیکیشن متفاوت است. توکن اپلیکیشن شما حساب خود شما را می‌خواند، هرگز حساب آموزنده را، پس برش‌ها تمام چیزی است که اپلیکیشن شما دربارهٔ او می‌داند.

رضایت

  • آموزنده هنگام نصب اپلیکیشن شما با هر برش موافقت می‌کند. برای تغییر آنچه با آن موافقت کرده، نصب اپلیکیشن شما را حذف می‌کند و دوباره آن را نصب می‌کند.
  • اگر مانیفست خود را ویرایش کنید تا برش‌های کمتری بخواهد، برش‌هایی که حذف کرده‌اید فوراً متوقف می‌شوند.
  • اگر آن را ویرایش کنید تا برش‌های بیشتری بخواهد، برش‌های تازه تا زمانی که آموزنده دوباره نصب نکند به هیچ آموزنده‌ای نمی‌رسند.
  • 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;
}

همچنین ببینید