Lingara Lingara Τεκμηρίωση Οδηγοί API Βιβλιοθήκες Εφαρμογές Δημιουργία Διαδικτυακή εφαρμογή
Γλώσσα: Ελληνικά

Πλαίσιο και συναίνεση

Αυτή η σελίδα έχει μεταφραστεί από τα αγγλικά. Αν οι δύο διαφέρουν, η αγγλική σελίδα είναι η σωστή. Διαβάστε την αγγλική σελίδα

Η εφαρμογή σας μαθαίνει για έναν μαθητή μόνο μέσω τμημάτων πλαισίου. Κάθε τμήμα είναι μια μικρή εγγραφή με σταθερά πεδία. Το μανιφέστο σας απαριθμεί τα τμήματα που ζητά, ο μαθητής συναινεί σε καθένα όταν εγκαθιστά την εφαρμογή σας, και το Lingara στέλνει ένα τμήμα μόνο όσο ισχύουν και τα δύο.

Τα τμήματα

ΤμήμαΠεδίοΤι περιέχει
languagessource_langΗ γλώσσα από την οποία μελετά ο μαθητής, ως ετικέτα γλώσσας όπως en.
target_langΗ γλώσσα που μαθαίνει.
levelΤο επίπεδό του σε αυτή, από 1 έως 9, εφόσον έχει ορίσει ένα.
plan_summaryplan_idΤο αναγνωριστικό του πιο πρόσφατου σχεδίου μαθήματός του, που ξεχωρίζει ένα σχέδιο από ένα άλλο. Η εφαρμογή σας δεν μπορεί να ανακτήσει το σχέδιο με αυτό, επειδή το token της εφαρμογής σας διαβάζει τον δικό σας λογαριασμό, όχι του μαθητή.
titleΟ παραγόμενος τίτλος του σχεδίου, το πολύ 120 χαρακτήρες, εφόσον έχει.
target_langΗ γλώσσα που διδάσκει το σχέδιο.
set_countΠόσα σύνολα έχει το σχέδιο, το πολύ 200.
sets_completedΠόσα από αυτά τα σύνολα έχει ολοκληρώσει ο μαθητής.
review_duedueΠόσες κάρτες εκκρεμούν τώρα, το πολύ 100000.
learnedΠόσες λέξεις έχει μάθει, το πολύ 100000.
tutor_topictopicΤο θέμα της πιο πρόσφατης συνομιλίας του με τον δάσκαλο, από 1 έως 120 χαρακτήρες. Προέρχεται από τον τίτλο ενός σχεδίου ή την οθόνη στην οποία βρίσκεται, ποτέ από τα δικά του λόγια.

Τι δεν μεταφέρει κανένα τμήμα

Κανένα τμήμα δεν μεταφέρει διεύθυνση email, όνομα, αναγνωριστικό χρήστη ή οτιδήποτε έγραψε ο μαθητής. Η εφαρμογή σας μαθαίνει ποιος είναι ο μαθητής από το subject του αιτήματος, μια σταθερή τιμή που είναι διαφορετική για κάθε εφαρμογή. Το token της εφαρμογής σας διαβάζει τον δικό σας λογαριασμό, ποτέ του μαθητή, οπότε τα τμήματα είναι όλα όσα γνωρίζει η εφαρμογή σας γι’ αυτόν.

Συναίνεση

  • Ο μαθητής συναινεί σε κάθε τμήμα όταν εγκαθιστά την εφαρμογή σας. Για να αλλάξει αυτό στο οποίο συναίνεσε, απεγκαθιστά την εφαρμογή σας και την εγκαθιστά ξανά.
  • Αν επεξεργαστείτε το μανιφέστο σας ώστε να ζητά λιγότερα τμήματα, όσα αφαιρέσατε σταματούν αμέσως.
  • Αν το επεξεργαστείτε ώστε να ζητά περισσότερα, τα νέα τμήματα δεν φτάνουν σε κανέναν μαθητή μέχρι να κάνει επανεγκατάσταση.
  • Το 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;
}

Δείτε επίσης