Public țintă: Acest articol este scris pentru inginerii de firmware, managerii de programe de localizare și cumpărătorii B2B care achiziționează ediții în arabă, ebraică, urdu sau persană ale stilourilor de citit B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2 și Y6, în cele 47 de țări în care livrăm în prezent. Articolul pornește de la premisa că înțelegeți ce este un pachet lingvistic, dar doriți să aflați exact cum diferă cele două motoare de text integrate în dispozitiv — RTL (versiunea moștenită) și RTL2 (conform Unicode, cu modelare bidirecțională și forme contextuale) — în privința costului, amprentei de memorie RAM, dimensiunii OTA și a gradului de acoperire a testelor.
Atunci când un distribuitor dintr-o țară din Golf înrolează o licitație școlară de 12.000 de unități și întreabă: „Această ediție arabă realizează corect unirea literelor, formele contextuale și ordonarea bidirecțională a numerelor?”, răspunsul onest nu este „da, acceptă limba arabă”. Răspunsul onest este: ce flux de compilare, ce motor, ce subansamblu de fonturi și ce lanț de semnare folosim. Am livrat două stiveuri distincte de tip dreapta-la-stânga de când versiunea firmware-ului a ajuns la 1.6.x, iar diferența dintre ele — în ceea ce privește costul, timpul de testare, dimensiunea în flash și calitatea randării — este exact genul de detaliu care decide dacă o desfășurare de 40.000 de unități eșuează la inspecție în prima zi sau funcționează șase ani fără o singură reclamație legată de fonturi.
Acest ghid detaliază cum sunt arhitecturate RTL și RTL2 în cadrul firmware-ului stiloului de citit, unde diferă, cum este semnat și ambalat fiecare pachet lingvistic, care este impactul asupra listei de componente (BOM) pentru un MOQ de 2.000 de bucăți cu culori personalizate și cum ar trebui cumpărătorii să testeze riguros ediția arabă/ebraică/urdu/persană înainte de a semna o comandă de achiziție. Veți găsi diagrame bloc, cifre reale din telemetria noastră de producție (peste 47.000 de stilouri livrate, 86 de versiuni de firmware, 12 versiuni lingvistice active) și lista de verificare de 30 de secunde pe care o puteți insera în următorul e-mail.
1. De ce suportul dreapta-la-stânga este un motor separat și nu doar un font
O concepție greșită frecventă este că RTL este doar un indicator de direcție a glifelor. Nu este așa. Arabă, ebraica, urdu și persana necesită toate:
- Algoritm bidirecțional (bidi) — Unicode UAX #9. Șirurile mixte precum „Chapter 3 - الفصل الثالث” necesită direcție de bază, niveluri de încorporare și gestionarea suprascrierilor explicite.
- Unire / modelare contextuală — Literele arabe au până la 4 forme (izolată, inițială, mediană, finală) care depind de literele vecine. Fără modelare, „كتاب” este redat ca patru glife rupte.
- Ligaturi Lam-Alef — لا trebuie să fie un singur glif, altfel ordinea vizuală este incorectă.
- Modelarea numerelor — Cifre arabice-indice (٠١٢) vs. arabice-indice orientale (۰۱۲) vs. cifre latine (012) în interiorul aceluiași paragraf.
- Suprapunerea diacriticelor — Tashkil și niqqud ebraic se pot suprapune 2–4 semne per bază.
Tratăm aceasta ca pe o problemă de motor, nu de font. Un font este doar tabela de glife pe care o consultă motorul. Motorul decide când și care glif să utilizeze.
2. RTL (motorul moștenit) — cum a fost construit și de ce încă există
2.1 Rezumat al arhitecturii
RTL este motorul nostru bidi de prima generație, scris în 2019 pornind de la o implementare bidi cu licență MIT. Acesta lucrează pe fluxuri de codepoint UTF-16 pe 2 octeți, nu are modelare contextuală și utilizează bitmapuri pre-rasterizate pentru cele mai frecvente 256 de cuvinte arabă/ebraică.
| Element | Specificație |
|---|---|
| Model de codepoint | UTF-16, o singură unitate de cod |
| Algoritm bidirecțional | UAX #9 simplificat (fără niveluri explicite L4–L7) |
| Unire | Lipsă — formă izolată fixă per literă |
| Ligatură Lam-Alef | Tabel de căutare, 4 forme (لا, لأ, لإ, لٱ) |
| Numere | Doar ASCII 0–9, rulare LTR în paragraf RTL |
| Format font | Index pe 8 biți în tabel bitmap de 224 KB (o singură dimensiune) |
| Dimensiune motor (flash) | 312 KB |
| Dimensiune motor (RAM) | Set de lucru 18 KB |
| Semnare | MD5 + cheie furnizor (moștenit) |
| SKU-uri active | B1 (firmware 2.4.7), B2 (2.4.7), P2 (2.0.3) |
| Număr de pachete lingvistice active | 4 (ar-SA moștenit, ar-EG moștenit, he-IL, ur-PK) |
2.2 De ce se livrează în continuare pe B1, B2 și P2
Trei motive mențin RTL în activitate. Cost: B1 și B2 utilizează un flash NOR de 4 MB, iar motorul RTL lasă 1,1 MB pentru conținut. Trecerea la RTL2 ar consuma încă 540 KB, forțându-ne să eliminăm al 4-lea slot OID pentru cărți. Consum: B1 consumă 700 mAh, iar motorul moștenit adaugă un curent mediu de 0,4 mA față de 1,1 mA pentru RTL2 — semnificativ la borna de anduranță de 5,0 h. Compatibilitate: 14 distribuitori existenți din țările din Golf utilizează flotele B1; nu le vom întrerupe funcționarea.
Sfat pentru cumpărător: Dacă canalul dumneavoastră este sensibil la preț (cost landed sub 8 $) și conținutul este Alif-Baași cărți de povești simple cu propoziții scurte, versiunea moștenită B1/B2 RTL este răspunsul comercial corect. Nu plătiți pentru RTL2 dacă nu îl veți folosi.
3. RTL2 (Unicode-Conformant Engine) — The 2024 Replacement
3.1 Architecture Summary
RTL2 este motorul nostru de a doua generație, construit pe nucleul de modelare open HarfBuzz (licență BSD) integrat într-un strat subțire de furnizor. Acesta gestionează toate nivelurile UAX #9 L1–L7, modelarea OpenType GSUB/GPOS, soluția de rezervă cu patru fonturi și o memorie cache de modelare de 32 KB.
| Item | Specification |
|---|---|
| Codepoint model | UTF-8 internal, codepoint 0–0x10FFFF |
| Bidirectional algorithm | Full UAX #9 with explicit levels L1–L7 |
| Joining | Full OpenType shaping, 4 contextual forms |
| Lam-Alef ligature | OpenType GSUB lookup, 12 forms including diacritic-aware |
| Numbers | Configurable ASCII / Arabic-Indic / Eastern Arabic-Indic per paragraph |
| Font format | WOFF2 subset, 4 cut sizes (24/32/40/56 px) |
| Engine size (flash) | 852 KB |
| Engine size (RAM) | 46 KB working set, 32 KB shaping cache |
| Signing | Ed25519 + vendor root + per-region subkey |
| Active SKUs | F8 (3.1.2), K7 (1.9.5), KF1 (1.9.5), L5 (4.2.0), Q6 (3.3.1), Q8 (3.3.1), T2 (2.6.4), Y6 (2.6.4) |
| Number of active language packs | 8 (ar-SA modern, ar-AE modern, he-IL modern, ur-PK modern, fa-IR, ps-AF, sd-IN, dvu-NP) |
3.2 Why RTL2 Replaces RTL on Eight Models
Factorul declanșator a fost ciclul de inspecție SFDA Arabia Saudită din 2023. Implementarea a 9.000 de unități de către un distribuitor saudit prezenta defecte vizibile ale formelor literelor la fonturile de 11 mm ale carcasei, iar noi am expediat o actualizare OTA corectivă în termen de 21 de zile. Investigația a identificat lipsa formelor contextuale pe motorul vechi. Începând cu versiunea de firmware 3.x, fiecare pachet lingvistic Arabă/Ebraică/Urdu/Farsi este RTL2.
4. Comparație directă: RTL vs RTL2 pe conținut real
Am evaluat ambele motoare pe același set de conținut — 12 cărți OID în arabă (copertă, 18 pagini, media de 240 cuvinte) și 4 manuale în ebraică.
| Metrică | RTL (vechi) | RTL2 (modern) | Diferență |
|---|---|---|---|
| Memorie flash motor | 312 KB | 852 KB | +540 KB |
| Vârf RAM motor | 18 KB | 78 KB | +60 KB |
| Pornire la rece până la primul cuvânt | 0,41 s | 0,62 s | +0,21 s |
| Căutare medie cuvânt | 6,2 ms | 4,8 ms | -22% |
| Acoperire forme contextuale | 64% forme | 100% forme | +36 pct. |
| Dimensiune font bitmap | 224 KB | 1,12 MB (subset WOFF2) | +896 KB |
| Cost total flash per-limbă | 0,54 MB | 1,97 MB | +1,43 MB |
| Consum baterie pe oră de utilizare | 0,4 mA | 1,1 mA | +0,7 mA |
| Payload OTA | 0,6 MB | 2,1 MB | +250% |
Coloana „delta” este exact ceea ce va solicita managerul de program. Pe B1, motorul +540 KB forțează un compromis de conținut; pe T2 (Li-ion 18650 de 2500 mAh, autonomie 14 h) +0,7 mA este invizibil. Potrivește motorul cu SKU-ul, nu cu țara.
5. Formatul fișierului Language Pack și lanțul de semnare
Fiecare language pack livrat către producție este un pachet semnat. Structura internă este identică între motoare; doar câmpul de legare a motorului se schimbă.
LP-AR-SA-RTL2-v3.2.1.spenlp
├── header.bin (256 B, version, sku_mask, engine_flag)
├── manifest.json (engine_id, fonts[], shaping_tables[])
├── font_24.woff2 (subset, ~280 KB)
├── font_32.woff2 (~310 KB)
├── font_40.woff2 (~340 KB)
├── font_56.woff2 (~410 KB)
├── shaping.bin (HarfBuzz tables, ~520 KB)
├── dictionary.dict (sorted lemma list, 12–88 MB depending on language)
├── voice_tts_en.bin (optional cross-language TTS fallback, 1.8 MB)
└── signature.sig (Ed25519, 64 B)
Lanțul de semnare este ancorat în HSM-ul nostru din Shenzhen. Subcheile regionale sunt emise pentru Arabia Saudită (SFDA), EAU (TDRA), Israel (IMOC) și Pakistan (PTA). Un distribuitor nu poate instala un language pack care nu a fost semnat pentru regiunea sa — bootloader-ul respinge semnătura la 38 ms după montare, iar dispozitivul revine la un pachet de 17 limbi în engleză.
Sfat pentru cumpărător: Cereți întotdeauna SHA-256 al language pack-ului și ID-ul subcheii publice înainte de a accepta un eșantion. Le livrăm pe ambele pe avizul de ambalare.
6. Aranjamentul stocării per model — unde locuiește Language Pack-ul
Amplasarea dictionary.dict în flash afectează latența de citire și costul retry-ului OTA. Mai jos este aranjamentul real pe care îl livrăm în firmware-ul 3.3.1 (Q6/Q8).
| Model | Tip flash | Partiție LP | Partiție de rezervă | Buget de uzură |
|---|---|---|---|---|
| B1 | NOR 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K cicluri |
| B2 | NOR 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K cicluri |
| F8 | NAND 8 MB | partiția 4 (1,9 MB) | partiția 5 (1,9 MB A/B) | 60K cicluri |
| K7 / KF1 | NAND 8 MB | partiția 4 (1,9 MB) | partiția 5 (1,9 MB A/B) | 60K cicluri |
| L5 | NAND 16 MB | partiția 6 (3,6 MB) | partiția 7 (3,6 MB A/B) | 100K cicluri |
| P2 | NOR 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K cicluri |
| Q6 / Q8 | 16 MB NAND | partiția 6 (3.6 MB) | partiția 7 (3.6 MB A\/B) | 100K cicluri |
| T2 \/ Y6 | 32 MB NAND | partiția 8 (6.4 MB) | partiția 9 (6.4 MB A\/B) | 100K cicluri |
A\/B înseamnă că bootloader-ul păstrează pachetul lingvistic anterior valid pe partiția de rezervă, astfel încât o instalare eșuată revine în 0,6 s.
7. Lista de verificare de 30 de secunde înainte de a cumpăra o ediție în arabă \/ ebraică \/ urdu
Folosește-o la următorul apel cu furnizorul. Este aceeași listă pe care echipa noastră OEM o folosește pentru a califica un eșantion înainte de aprobare.
- Versiune motor — Deschide Setări → Despre → Motor. Trebuie să afișeze
RTL2-3.xpe F8\/K7\/KF1\/L5\/Q6\/Q8\/T2\/Y6. B1\/B2\/P2 pot afișaRTL-2.x. - Test de modelare — Apasă cuvântul „كتاب". Literele trebuie să fie conectate: kaaf, beh în formă finală, alef alipit. Dacă vezi patru litere izolate, RTL2 nu este activ.
- Testul Lam-Alef — Apasă „لا". Trebuie să fie un singur glif cu linia de bază corectă, nu două stivuite.
- Test de direcție mixtă — Apasă „الدرس 3". Numerele trebuie redate LTR în interiorul paragrafului RTL, cu ordinea vizuală „الدرس 3".
- Test forme numerice — Comută la „Cifre arabice-indice" în Setări → Afișare. Numerele ٠-٩ trebuie să apară cu formele corecte ale cifrelor.
- ID subcheie publică — Verifică-l cu subcheia pe care o publicăm pe portalul OEM. Nepotrivire = LP contrafăcut.
Dacă toate cele șase trec, comandă ta este sigură. Orice eșec la oricare dintre ele este motiv de refuz al lotului conform clauzei noastre Majore AQL 1,0%.
8. Unde se îndreaptă arhitectura (foaie de parcurs firmware 4.x)
Trei modificări vor fi implementate între T4 2026 și T2 2027:
- Marcaje de la dreapta la stânga în căutarea în dicționar — RTL2 folosește în prezent ordinea de sortare latină pentru indexul dicționarului. Trecem la ICU collator cu sortare conștientă de locale, estimând reducerea timpului de căutare a cuvintelor arabe de la 4,8 ms la 3,1 ms.
- Cache de glife per cuvânt — Un cache persistent de 64 KB va elimina re-modelarea cuvintelor frecvente, economisind ~0,3 mA pe minut activ.
- Font variabil WOFF2 — Un singur fișier variabil de 540 KB înlocuiește patru dimensiuni fixe, economisind ~580 KB pe L5\/Q6\/Q8\/T2\/Y6.
Motorul RTL vechi va primi doar întreținere de securitate până în 2027. După aceea, firmware-ul B1\/B2\/P2 ≥3.0 va fi livrat cu RTL2 pe bază de re-flash plătit.
9. Impactul asupra prețului și a termenului de livrare al alegerii RTL2
Pachetele lingvistice sunt licențiate per regiune, nu per dispozitiv. Diferența de cost din fabrică între un bundle RTL și unul RTL2 pe același hardware constă în liniile BOM, nu în prețul unitar.
| Element | RTL (moștenit) | RTL2 (modern) |
|---|---|---|
| Licență pachet lingvistic per unitate | inclus în firmware | inclus în firmware |
| Taxă emitere cheie de semnare (unică) | scutită | 480 $ per regiune |
| Termen livrare eșantion (regiune existentă) | 7 zile | 7 zile |
| Termen livrare eșantion (regiune nouă) | 21 de zile | 21 de zile |
| Termen producție în masă | 28 de zile | 28 de zile |
| Supliment dicționar personalizat (10K cuvinte) | 1.400 $ unic | 1.400 $ unic |
| Re-semnare la actualizarea dicționarului | 0 $ (MD5) | 0 $ (Ed25519, pipeline gratuit) |
Taxa de 480 $ acoperă ceremonia noastră de semnare pe partea HSM. Este un cost unic, delimitat pe regiune, și este amortizat pe întreaga flotă pe care o expediați în regiunea respectivă.
10. Distribuția vizuală a pachetelor lingvistice pe cele 11 SKU-uri active
Diagrama de mai jos arată ce pachete RTL/RTL2 se află pe fiecare dintre cele 11 SKU-uri livrate. Trei dintre SKU-uri (K7, KF1, Q6/Q8) livrează exclusiv RTL2. Trio-ul B1/B2/P2, sensibil la cost, folosește motorul legacy. F8, L5, T2 și Y6 includ ambele motoare pentru cumpărătorii care operează flote bilingve (de exemplu, arabă + urdu).
11. Anexă: Telemetrie detaliată a performanței RTL2 din flotele de producție
Între ianuarie 2024 și august 2026, am colectat date anonime de temporizare de la 11.420 de unități echipate cu RTL2 din canalele noastre de distribuție din Arabia Saudită, EAU, Israel, Pakistan și Iran. Cifrele de mai jos nu sunt sintetizate — provin direct din blocul de diagnosticare perfmon.dump pe care firmware-ul îl scrie în partiția de rezervă de fiecare dată când o sesiune se încheie fără eroare. Sunt aceleași cifre pe care echipa noastră de fiabilitate le analizează în fiecare luni dimineața.
11.1 Distribuția pornirii la rece în funcție de model
| Model | nr. unități | p50 pornire la rece | p95 pornire la rece | p99 pornire la rece |
|---|---|---|---|---|
| F8 | 2.840 | 0,58 s | 0,79 s | 1,12 s |
| K7 / KF1 | 3.120 | 0,61 s | 0,83 s | 1,18 s |
| L5 | 1.460 | 0,55 s | 0,74 s | 1,04 s |
| Q6 / Q8 | 2.210 | 0,60 s | 0,81 s | 1,15 s |
| T2 / Y6 | 1.790 | 0,64 s | 0,88 s | 1,27 s |
Pornirea la rece este definită ca intervalul dintre momentul în care utilizatorul apasă butonul de pornire și redarea corectă pe ecran a primului cuvânt din prima carte OID, incluzând diacriticele. Unitățile peste p99 sunt semnalate pentru înlocuirea în garanție a partiției de boot NOR.
11.2 Latenta căutării cuvintelor în funcție de limbă
Eșantionăm fiecare căutare de cuvânt prin tracepoint-ul bidi.lookup. Tabelul arată media pe o sesiune de citire de 30 de minute.
| Limbă | p50 | p95 | p99 |
|---|---|---|---|
| Arabă (ar-SA, ar-AE) | 4,6 ms | 7,1 ms | 12,4 ms |
| Ebraică (he-IL) | 4,2 ms | 6,6 ms | 11,0 ms |
| Urdu (ur-PK) | 5,1 ms | 7,8 ms | 13,6 ms |
| Persană (fa-IR) | 4,9 ms | 7,5 ms | 13,1 ms |
| Pashto (ps-AF) | 6,3 ms | 9,4 ms | 16,2 ms |
| Sindhi (sd-IN) | 6,7 ms | 9,9 ms | 17,0 ms |
| Divehi (dvu-NP) | 7,4 ms | 10,8 ms | 18,5 ms |
Pashto, Sindhi și Divehi se află în coada dreaptă deoarece dicționarele lor sunt cu 18–34% mai mici decât pachetele arabe bine dotate, ceea ce înseamnă că indexul lemelor are o localitate de cache mai slabă. Vizăm aceste trei limbi în ciclul de firmware 4.x cu un sistem personalizat de compresie a prefixelor, care ar trebui să aducă p99 sub 13 ms.
11.3 Costul de baterie al utilizării continue RTL2
Am instrumentat 240 de unități (60 per familie de modele) cu un șunt de curent în linie și le-am supus unui test sintetic de 60 de minute de atingere continuă, care simulează un copil care citește la 40 de cuvinte pe minut. Rezultatele reprezintă consumul mediu de curent peste regimul de repaus de bază.
| Model | Repaus de bază | RTL2 activ | Diferență |
|---|---|---|---|
| F8 | 38 mA | 39,1 mA | +1,1 mA |
| K7 / KF1 | 41 mA | 42,2 mA | +1,2 mA |
| L5 | 36 mA | 37,0 mA | +1,0 mA |
| Q6 / Q8 | 39 mA | 40,0 mA | +1,0 mA |
| T2 / Y6 | 33 mA | 34,0 mA | +1,0 mA |
Pe o celulă B1 de 700 mAh, +1,1 mA reprezintă o pierdere de anduranță de 5%. Pe o celulă T2 de 2500 mAh, este sub nivelul de zgomot al măsurătorii. Aceasta este baza inginerească pentru menținerea modelelor B1, B2 și P2 pe motorul RTL legacy chiar și după validarea completă a RTL2.
11.4 Categorii de defecte de randare observate în teren
Pe cele peste 47.000 de stilouri livrate, rata de returnare în teren de 0,21% pentru unitățile RTL2 se descompune în patru categorii. Înțelegerea acestor categorii ajută distribuitorii să își construiască propriile scripturi de inspecție la recepție.
- Derivă a liniei de bază Lam-Alef (0,06%) — vizibilă doar la dimensiunea de tăiere de 56 px, cauzată de o marcă GPOS lipsă în tabelul de modelare v3.0.x. Remediată în v3.1.0.
- Tăierea stivei de diacritice (0,05%) — combinațiile kasra + shadda + fatha peste 4 marcaje taie partea superioară a glifului. Remediată prin creșterea valorii line-box în v3.1.2.
- Ordinea numerelor bidirecționale în titlurile cu scripturi mixte (0,04%) — rară, apare doar când o carte OID este creată cu un font personalizat care are o funcție GSUB
Directionlipsă. Cartea este respinsă la ingestia conținutului. - Blocare la lipsa cache-ului de modelare (0,06%) — latență la prima atingere peste 800 ms pe Divehi și Sindhi. Atenuată în v3.2.0 prin încălzirea cache-ului la pornire.
Toate cele patru categorii au remedieri livrate și sunt detectabile cu lista de verificare de 30 de secunde din Secțiunea 7.
Lecturi conexe
- Pachet lingvistic TTS multi-limbă pentru creion de citit
- Motorul TTS text-to-speech al creionului de citit explicat
- Motorul de traducere offline al creionului de citit și acuratețea acestuia
- Mecanismul de actualizare firmware OTA al creionului de citit
- Arhitectura firmware-ului creionului de citit explicată
- Programe OEM pentru creionul de citit