ویجت ویبسایت
این صفحه از انگلیسی ترجمه شده است. اگر این دو با هم فرق داشته باشند، صفحهٔ انگلیسی درست است. صفحهٔ انگلیسی را بخوانید
در یک ویبسایت، Lingara به شکل یک عنصر سفارشی، <lingara-embed>، اجرا میشود. این عنصر تمرین Lingara را در فریمی که Lingara ارائه میکند ترسیم میکند، پس صفحهٔ شما هرگز معلومات آموزنده را نمیبیند و صفحهٔ Lingara هرگز معلومات شما را نمیبیند.
گذاشتن عنصر
@lingara/embed را از npm نصب کنید، یا اگر سایت شما bundler ندارد، نسخهٔ ماژول آن را از یک CDN بارگذاری کنید. بعد <lingara-embed> را روی صفحه بگذارید و آن را تعریف کنید. این عنصر اینها را میگیرد:
plan-id، برنامهٔ درسی برای تمرین، که مال بازیکن است؛surface، آنچه نشان داده شود:practice، مقدار پیشفرض و تنها سطحی که وجود دارد؛theme، یکی ازlight،darkیاauto؛locale، زبان کلمات خود فریم، که در غیر آن از آموزنده پیروی میکند؛title، نام قابل دسترس فریم.
سفارشیسازی ظاهر به پوسته محدود است. صفحهٔ شما نمیتواند به داخل فریم دسترسی پیدا کند، و پوسته تنها تنظیمی است که فریم ارائه میکند.
دادن توکن به آن
tokenProvider عنصر را روی تابعی تنظیم کنید که از سرور خودتان توکن درخواست میکند. سرور شما با یک کیت سرور توکن را برای مبدأ صفحه صادر میکند و با توکن و زمان انقضای آن پاسخ میدهد. عنصر توکن را از طریق پیام به فریم میدهد، و توکن هرگز در یک URL انتقال نمییابد.
هر مبدأیی را که ویجت روی آن اجرا میشود پیش از صادر کردن توکن برای آن، در تنظیمات کلاینت خود در کنسول ثبت کنید. صفحهٔ کیتهای سرور روش آن را میگوید. API توکنی را که برای هر مبدأ دیگری صادر شده باشد رد میکند و فریم به جای تمرین یک خطا نشان میدهد.
یک کیت سرور همچنین میتواند تمام قطعهکود، عنصر و فراهمکنندهٔ توکن را با هم، برای شما بنویسد، همراه با nonce اسکریپت صفحهٔ شما اگر پالیسی امنیت محتوای شما به آن ضرورت داشته باشد. آخرین نمونهٔ پایین آن را نشان میدهد.
گوش دادن به آنچه فریم میگوید
فریم از طریق یک پروتوکول پیام نسخهدار با عنصر صحبت میکند، و عنصر آنچه را صفحهٔ شما لازم دارد به رویدادهای DOM تبدیل میکند:
lingara:practice-completedوقتی آموزنده یک مجموعه را تکمیل میکند، همراه باplanId،setNumber،correctوtotalآن؛lingara:errorوقتی فریم متوقف میشود، همراه با یکcodeوretryable. خطای قابل تلاش دوباره یعنی یک بارگذاری تازه ممکن است موفق شود؛ اینکه چه زمانی دوباره تلاش کنید تصمیم خود شما است.
نتیجهٔ تمرین به سرور شما نیز میرسد، طوری که در نتایج تمرین توضیح داده شده است.
npm install @lingara/embed@0.1.0-alpha.6
# No bundler? One module script instead:
# <script type="module" src="https://cdn.jsdelivr.net/npm/@lingara/embed@0.1.0-alpha.6/dist/lingara-embed.min.js"></script><!-- plan-id is a lesson plan your server made for this player. -->
<lingara-embed surface="practice" plan-id="0b9d4f2e-3c1a-4e8b-9f6d-2a7c5e1b8d40" theme="auto" title="Practice"></lingara-embed>
<script type="module">
import { defineLingaraEmbed } from '@lingara/embed'
defineLingaraEmbed()
</script>// Your own endpoint, on your own server. It mints with this page's origin and
// returns exactly { token, expires_at }: the token (lgr_et_…) never touches a URL.
widget.tokenProvider = async () => {
const response = await fetch('/lingara/token', { method: 'POST', credentials: 'same-origin' })
if (!response.ok) throw new Error(`token endpoint answered ${response.status}`)
return response.json()
}widget.addEventListener('lingara:practice-completed', (event) => {
const { planId, setNumber, correct, total } = (event as CustomEvent).detail
console.log(`set ${setNumber} of ${planId}: ${correct}/${total}`)
})
widget.addEventListener('lingara:error', (event) => {
const { code, retryable } = (event as CustomEvent).detail
// `retryable` means a remount may succeed; when to try is yours to decide.
if (retryable) setTimeout(() => widget.reload(), 30_000)
else console.warn('Lingara practice stopped:', code)
})