Lingara Lingara Tài liệu Cẩm nang API Thư viện Ứng dụng Tạo Ứng dụng web
Ngôn ngữ: Tiếng Việt

Ngữ cảnh và sự đồng ý

Trang này được dịch từ tiếng Anh. Nếu hai bản khác nhau, trang tiếng Anh là bản đúng. Đọc trang tiếng Anh

Ứng dụng của bạn chỉ biết về người học thông qua các lát ngữ cảnh (context slice). Mỗi lát là một bản ghi nhỏ với các trường cố định. Tệp kê khai của bạn liệt kê các lát mà nó yêu cầu, người học đồng ý với từng lát khi cài đặt ứng dụng của bạn, và Lingara chỉ gửi một lát khi cả hai điều này vẫn còn hiệu lực.

Các lát

LátTrườngNội dung
languagessource_langNgôn ngữ mà người học dùng làm nền để học, dưới dạng mã ngôn ngữ như en.
target_langNgôn ngữ họ đang học.
levelTrình độ của họ trong ngôn ngữ đó, từ 1 đến 9, nếu họ đã đặt.
plan_summaryplan_idID của kế hoạch bài học mới nhất của họ, dùng để phân biệt kế hoạch này với kế hoạch khác. Ứng dụng của bạn không thể dùng nó để lấy kế hoạch, vì token của ứng dụng đọc tài khoản của chính bạn, không phải của người học.
titleTiêu đề được tạo tự động của kế hoạch, tối đa 120 ký tự, nếu có.
target_langNgôn ngữ mà kế hoạch dạy.
set_countSố bộ mà kế hoạch có, tối đa 200.
sets_completedSố bộ trong đó mà người học đã hoàn thành.
review_duedueSố thẻ ghi nhớ đến hạn ôn ngay bây giờ, tối đa 100000.
learnedSố từ họ đã học được, tối đa 100000.
tutor_topictopicChủ đề của cuộc trò chuyện gần nhất với gia sư, từ 1 đến 120 ký tự. Nó lấy từ tiêu đề của một kế hoạch hoặc màn hình họ đang ở, không bao giờ từ chính lời của họ.

Những gì không lát nào mang theo

Không lát nào mang địa chỉ email, tên, ID người dùng hay bất cứ thứ gì người học đã gõ. Ứng dụng của bạn biết người học là ai từ subject của yêu cầu, một giá trị ổn định và khác nhau cho mỗi ứng dụng. Token của ứng dụng đọc tài khoản của chính bạn, không bao giờ đọc tài khoản của người học, nên các lát là tất cả những gì ứng dụng của bạn biết về họ.

Sự đồng ý

  • Người học đồng ý với từng lát khi cài đặt ứng dụng của bạn. Để thay đổi những gì đã đồng ý, họ gỡ cài đặt ứng dụng của bạn rồi cài đặt lại.
  • Nếu bạn sửa tệp kê khai để yêu cầu ít lát hơn, các lát bạn bỏ đi sẽ dừng ngay lập tức.
  • Nếu bạn sửa nó để yêu cầu nhiều hơn, các lát mới sẽ không đến với người học nào cho đến khi họ cài đặt lại.
  • Lingara kiểm tra lại sự đồng ý trên mọi yêu cầu, và loại bỏ mọi lát mà người học chưa đồng ý hoặc tệp kê khai của bạn không còn yêu cầu. Một lát không khớp với bản ghi của nó cũng bị loại bỏ, nhưng không bao giờ loại bỏ toàn bộ yêu cầu.

Mẫu bên dưới tạo dòng của nó từ các lát được cung cấp và không gọi API nào.

Ngôn ngữ của mã mẫu

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

Xem thêm