ویجێتی ماڵپەڕ
ئەم پەڕەیە لە ئینگلیزییەوە وەرگێڕدراوە. ئەگەر هەردووکیان جیاواز بوون، پەڕە ئینگلیزییەکە ڕاستە. پەڕە ئینگلیزییەکە بخوێنەوە
لەسەر ماڵپەڕێک، Lingara وەک توخمێکی تایبەت، <lingara-embed>، کار دەکات. توخمەکە ڕاهێنانی Lingara لەناو چوارچێوەیەکدا دەکێشێت کە Lingara پێشکەشی دەکات، بۆیە پەڕەکەت هەرگیز داتای فێرخوازەکە نابینێت و پەڕەی Lingara هەرگیز هی تۆ نابینێت.
توخمەکە دابنێ
@lingara/embed لە npm ـەوە دابمەزرێنە، یان ئەگەر ماڵپەڕەکەت bundler ی نییە بنیاتی مۆدیولەکەی لە CDN ێکەوە بار بکە. پاشان <lingara-embed> بخەرە سەر پەڕەکە و پێناسەی بکە. توخمەکە ئەمانە وەردەگرێت:
plan-id، ئەو پلانی وانەیەی ڕاهێنانی لەسەر دەکرێت، یەکێک کە یاریزانەکە خاوەنیەتی؛surface، چی نیشان بدات:practice، بنەڕەتییەکە و تاکە ڕووکار کە هەیە؛theme، یەکێک لەlight،darkیانauto؛locale، زمانی وشەکانی خودی چوارچێوەکە، کە ئەگەرنا شوێن فێرخوازەکە دەکەوێت؛title، ناوی دەستپێگەیشتنی چوارچێوەکە.
شێوەدان لە تێمەکەدا دەوەستێت. پەڕەکەت ناتوانێت بگاتە ناو چوارچێوەکە، و تێمەکە تاکە ڕێکخستنە کە پێشکەشی دەکات.
تۆکنی پێبدە
tokenProvider ـی توخمەکە بکە بە فەنکشنێک کە داوای تۆکن لە سێرڤەرەکەی خۆت دەکات. سێرڤەرەکەت بە origin ـی پەڕەکە دروستی دەکات، بە بەکارهێنانی کیتی سێرڤەر، و بە تۆکنەکە و کاتی بەسەرچوونی وەڵام دەداتەوە. توخمەکە تۆکنەکە بە پەیام ڕادەستی چوارچێوەکە دەکات، و هەرگیز لە URL دا گەشت ناکات.
هەموو ئەو origin انەی ویجێتەکە لەسەریان کار دەکات پێش دروستکردنی تۆکن بۆیان تۆمار بکە، لە ڕێکخستنەکانی کلاینتەکەتدا لە کۆنسۆڵ. پەڕەی کیتەکانی سێرڤەر دەڵێت چۆن. API ئەو تۆکنە ڕەت دەکاتەوە کە بۆ هەر origin ێکی تر دروستکرابێت، و چوارچێوەکە لە جیاتی ڕاهێنان هەڵەیەک نیشان دەدات.
کیتێکی سێرڤەر دەتوانێت هەموو پارچە کۆدەکەش بۆت بنووسێت، توخم و دابینکەری تۆکن پێکەوە، لەگەڵ script 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)
})