Translate — content block
Welcome to our store
Browse the catalog in your language.
langsys-js-typescriptحزمة SDK الأساسية المستقلة عن أي إطار عمل — TypeScript أو JavaScript عادية دون الحاجة إلى إطار عمل. أما روابط React وVue وSvelte فهي أغلفة خفيفة فوق هذه الحزمة؛ وهنا تتحكم مباشرة في DOM. والقاعدة نفسها في كل مكان: العبارة في الكود هي مفتاح البحث والنص الافتراضي باللغة الأساسية معاً.
Add Langsys translation to this TypeScript app.
1. Read https://docs.langsys.dev/llms.txt, then follow
https://docs.langsys.dev/learn/sdk/typescript/ for the install and setup.
2. The English text in the code is the translation key. Wrap user-facing
strings as they are: no keys file, no extraction step, and no
hand-written plural or gender branches (Langsys generates those).
3. Read the Langsys project id and API key from environment variables.
The write key is for development and servers only; anything shipped
to the browser gets the read-only key.
4. Keep brand names and user-generated content out of translation. npm install langsys-js-typescript ليس لديك مشروع أو مفاتيح بعد؟ يوفّر لك البدء السريع كليهما في دقيقتين.
import { LangsysApp, createSignal } from 'langsys-js-typescript';
const locale = createSignal('en-US');
await LangsysApp.init({
projectid: import.meta.env.VITE_LANGSYS_PROJECT_ID,
key: import.meta.env.VITE_LANGSYS_API_KEY, // read-only in the browser
UserLocaleStore: locale,
}); عدّل العبارة والفئة، واضبط المعلمات كحقول أو بصيغة JSON خام، ثم بدّل اللغة المحلية وشاهد SDK الفعلية تترجم مباشرةً.
count على 1 ثم أعده — وستتبعه القواعد النحوية. العبارة مكتوبة بصيغة مسطّحة: يولّد Langsys صيغ الجمع لكل لغة أثناء الترجمة (بما فيها اللغة الأساسية) وتختار حزمة SDK الفرع المناسب من count. لا أحد يكتب ICU. import { t, tSignal } from 'langsys-js-typescript';
const greeting = document.querySelector('#greeting');
const name = 'Sarah';
// tSignal re-emits a fresh t() whenever the locale or catalog
// changes — subscribe once and the element stays translated.
tSignal.subscribe(() => {
greeting.textContent = t('Hello, {name}!', 'Greetings', { name });
}); | أنت تترجم… | استخدام | لماذا |
|---|---|---|
| سلسلة نصية بسيطة في الشيفرة — تسمية أو عنوان أو رسالة. المعاملات مشمولة؛ اكتب الأعداد بصيغة واحدة وسيولّد Langsys صيغ الجمع. | t() | تُرجع سلسلة نصية. العبارة الموجودة في الشيفرة البرمجية هي مفتاح البحث وهي أيضًا القيمة الافتراضية باللغة الأساسية. |
| جملة واحدة تتضمن ترميزًا مضمّنًا أو قيمًا ديناميكية، تبقى كاملة. | Phrase | تتحول العناصر المضمّنة إلى رموز محايدة، فيعيد المترجمون ترتيب الجملة كاملة، بما في ذلك مواضع الوسوم، ثم تُعاد العناصر الفعلية عند العرض. |
| منطقة من الترميز تضم عدة عبارات — قسم رئيسي أو تذييل أو بطاقة. | Translate | تسجّل علامة واحدة المنطقة ككتلة محتوى واحدة: يُستخرج كل مقطع نصي كعبارة مستقلة مع الحفاظ على بنية الترميز. |
| شيء يجب ألا يُترجم أبدًا — أسماء العلامات التجارية والشيفرة البرمجية والمعرّفات. | translate="no" | يتجاوز المحلّل اللفظي والمُصيّر الشجرة الفرعية؛ فتبقى كما هي حرفيًا بينما تُترجم الجملة المحيطة بها. |
قاعدة عامة: سلسلة نصية ← t() · جملة تحتوي على وسوم ← Phrase · منطقة من الوسوم ← Translate · ما لا يجوز المساس به ← translate="no".
كل معالج DOM عادي (vanilla) يعمل مباشرةً على اليسار، والشيفرة التي تربطه على اليمين.
شاهد مقاطع العرض التوضيحي لهذه العناصر الأساسية موجودة حاليًا في صفحة Svelte، فالواجهة متطابقة ولا يختلف سوى بناء الجملة: <Translate> (1:04) · <Phrase> (1:06) · <DontTranslate> (0:34).
Translate — content block
Browse the catalog in your language.
import { Translate } from 'langsys-js-typescript';
// <section id="hero">
// <h3>Welcome to our store</h3>
// <p>Browse the catalog in your language.</p>
// </section>
new Translate(document.querySelector('#hero'), { category: 'Home' }); Phrase — params & markup
Hi {name}, you have {count} items in your cart.
import { Phrase } from 'langsys-js-typescript';
// <p id="cart-note">Hi {name}, you have {count} items in your cart.</p>
new Phrase(document.querySelector('#cart-note'), {
category: 'Cart',
params: { name: 'Sarah', count: 3 },
}); translate="no" — never translated
Welcome! This sentence always stays in English. Thanks for visiting!
// The standard translate="no" attribute — the tokenizer
// and renderer skip the subtree, so it stays verbatim while
// the sentence around it translates.
// <p id="signin">Welcome! <span translate="no">This sentence always stays in English.</span> Thanks for visiting!</p>
new Translate(document.querySelector('#signin'), { category: 'Tour' }); تصرّف الإسبانية والفرنسية والروسية {username} has been invited بحسب الشخص المقصود. يولّد Langsys هذه الفروع أثناء الترجمة — بالطريقة نفسها التي يولّد بها صيغ الجمع — ويُسمّى الوسيط باسم المتغيّر مع إلحاق _gender به: male أو female أو other. مرّره متى كنت تعرفه. كيف يعمل ذلك، وكيف تعثر على العبارات التي تحتاج إليه ←
import { t } from 'langsys-js-typescript';
// Pass the agreement argument alongside the value it inflects.
t('{username} has been invited', 'Team', {
username: user.name,
username_gender: user.gender, // 'male' | 'female' | 'other'
}); لا تعرف الجنس؟ مرّر 'other' صراحةً — فهو الفرع المحايد. وإن لم تمرّره فسيعتمد SDK الفرع other نيابةً عنك (langsys-js-typescript الإصدار 0.6.4 فما بعده)، فتبقى الجملة سليمة. حاليًا يرفض TypeScript القيمة username_gender داخل كائن معلمات مضمّن (الخطأ TS2353؛ والإصلاح قيد المراجعة). إلى أن يصدر، أنشئ كائن المعلمات أولًا ثم مرّر المتغير.
اجلب الفهرس على الخادم ثم سلّمه إلى العميل، لتبدأ حزمة SDK دون الحاجة إلى جلبه مرة أخرى. تترجم الحزمة داخل المتصفح، ولذلك يبقى HTML المُنشأ على الخادم بلغة الأساس إلى أن تبدأ.
// The server fetches the catalog; the client init starts from it
// instead of fetching it again, and translates once it runs.
LangsysApp.init({
projectid, key,
UserLocaleStore: locale,
initialTranslations, // fetched on the server
initialTranslationsLocale, // fetched on the server
ssrTokenStrategy: 'client',
});