Audiencia: Este artículo está dirigido a ingenieros de firmware, gerentes de programas de localización y compradores B2B que buscan bolígrafos lectores B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2 e Y6 en ediciones en árabe, hebreo, urdu o persa, en los 47 países a los que actualmente enviamos. Se asume que comprende qué es un paquete de idioma, pero desea saber exactamente cómo nuestros dos motores de texto en el dispositivo — RTL (heredado) y RTL2 (bidi conforme a Unicode con forma) — difieren en costo, huella de RAM, tamaño OTA y cobertura de pruebas.
Cuando un distribuidor de un estado del Golfo incorpora una licitatión escolar de 12.000 unidades y pregunta: "¿Esta edición en árabe realiza correctamente la unión de letras, las formas contextuales y la ordenación bidireccional de números?", la respuesta no es "sí, es compatible con árabe". La respuesta honesta es: qué pipeline de compilación, qué motor, qué subconjunto de fuentes y qué cadena de firma. Hemos enviado dos stacks RTL distintos desde que el esquema de versiones de firmware alcanzó la versión 1.6.x, y la brecha entre ellos —en costo, tiempo de prueba, tamaño en flash y calidad de renderizado— es exactamente el tipo de detalle que determina si un despliegue de 40.000 unidades falla la inspección el primer día o funciona durante seis años sin una sola RMA relacionada con fuentes.
Esta guía desglosa cómo RTL y RTL2 están arquitectados dentro del firmware del bolígrafo lector, dónde divergen, cómo se firma y empaqueta cada paquete de idioma, cuál es el impacto en el BOM en un MOQ de 2.000 piezas de color personalizado, y cómo los compradores deben probar la edición en árabe/hebreo/urdu/persa antes de firmar una orden de compra. Se esperan diagramas de bloques, números reales de nuestra telemetría de producción (47.000+ bolígrafos enviados, 86 lanzamientos de firmware, 12 versiones de idiomas activas) y la lista de verificación de 30 segundos que puede pegar en su próximo correo electrónico.
1. Por qué el soporte de derecha a izquierda es un motor separado y no una fuente
Una idea errónea común es que RTL es solo un indicador de dirección de glifos. No lo es. El árabe, el hebreo, el urdu y el persa requieren:
- Algoritmo bidireccional (bidi)[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — Unicode UAX #9. Cadenas mixtas como "Capítulo 3 - Sección tercera" necesitan dirección base, niveles de incrustación y manejo de anulación explícita.
- Unión / forma contextual[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — Las letras árabes tienen hasta cuatro formas (aislada, inicial, medial, final) que dependen de sus vecinos. Sin conformación tipográfica, «libro» se muestra como cuatro glifos rotos.
- Ligaduras Lam-Alef[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — La partícula «no» debe ser un solo glifo o el orden visual será incorrecto.
- Forma de números[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — Dígitos arábigos-indios frente a dígitos arábigos orientales frente a dígitos latinos dentro del mismo párrafo.
- Apilamiento de diacríticos — Tashkil y niqqud hebreo pueden apilar 2–4 marcas por base.
Tratamos esto como un problema de motor, no de fuente. Una fuente es solo la tabla de glifos que consulta el motor. El motor decide cuándo y cuál glifo usar.
2. RTL (Motor heredado) — Cómo se construyó y por qué todavía existe
2.1 Resumen de arquitectura
RTL es nuestro motor bidi de primera generación, escrito en 2019 con referencia a una implementación bidi con licencia MIT. Funciona con flujos de unidades de código UTF-16 de 2 bytes, no tiene forma y utiliza mapas de bits prerasterizados para las 256 palabras más comunes en árabe/hebreo.
| Elemento | Especificación |
|---|---|
| Modelo de código | UTF-16, unidad de código única |
| Algoritmo bidireccional | UAX #9 simplificado (sin niveles explícitos L4–L7) |
| Unión | Ninguna — forma fija aislada por letra |
| Ligadura Lam-Alef | [corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] Tabla de consulta, 4 formas (na, nā, ni, li) |
| Números | Solo ASCII 0–9, ejecución LTR dentro de párrafo RTL |
| Formato de fuente | Índice de 8 bits en tabla de mapas de bits de 224 KB (1 tamaño únicamente) |
| Tamaño del motor (flash) | 312 KB |
| Tamaño del motor (RAM) | 18 KB de conjunto de trabajo |
| Firma | MD5 + clave de proveedor (heredado) |
| SKUs activos | B1 (firmware 2.4.7), B2 (2.4.7), P2 (2.0.3) |
| Número de paquetes de idioma activos | 4 (ar-SA heredado, ar-EG heredado, he-IL, ur-PK) |
2.2 Por qué todavía se envía en B1, B2 y P2
Tres razones mantienen RTL activo. Costo: B1 y B2 usan flash NOR de 4 MB, y el motor RTL deja 1,1 MB para contenido. Cambiar a RTL2 consumiría 540 KB adicionales, obligándonos a eliminar la ranura del 4.° libro OID. Energía: B1 consume 700 mAh, y el motor heredado añade 0,4 mA de corriente promedio frente a 1,1 mA para RTL2 — significativo en el punto de autonomía de 5,0 h. Compatibilidad: 14 distribuidores existentes de estados del Golfo operan flotas de B1; no los alteraremos.
Consejo para compradores: Si su canal es sensible al precio (costo aterrizado inferior a $8) y su contenido es Alif-Baa y libros de cuentos básicos con oraciones cortas, la compilación heredada RTL B1/B2 es la respuesta comercial correcta. No pague por RTL2 que no va a usar.
3. RTL2 (Motor Compatible con Unicode) — El Reemplazo de 2024
3.1 Resumen de Arquitectura
RTL2 es nuestro motor de segunda generación, construido sobre el núcleo de conformación HarfBuzz de código abierto (licencia BSD) envuelto en una capa delgada de proveedor. Maneja niveles completos UAX #9 L1–L7, conformación OpenType GSUB/GPOS, respaldo de cuatro fuentes y una caché de conformación de 32 KB.
| Elemento | Especificación |
|---|---|
| Modelo de punto de código | UTF-8 interno, punto de código 0–0x10FFFF |
| Algoritmo bidireccional | UAX #9 completo con niveles explícitos L1–L7 |
| Unión | Conformación OpenType completa, 4 formas contextuales |
| Ligadura Lam-Alef | Búsqueda OpenType GSUB, 12 formas incluyendo formas con diacríticos |
| Números | ASCII / Arábigo-Indic / Arábigo-Indic Oriental configurables por párrafo |
| Formato de fuente | Subconjunto WOFF2, 4 tamaños de corte (24/32/40/56 px) |
| Tamaño del motor (flash) | 852 KB |
| Tamaño del motor (RAM) | 46 KB de conjunto de trabajo, caché de conformación de 32 KB |
| Firma | Ed25519 + raíz de proveedor + subclave por región |
| SKUs activos | 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) |
| Número de paquetes de idioma activos | 8 (ar-SA moderno, ar-AE moderno, he-IL moderno, ur-PK moderno, fa-IR, ps-AF, sd-IN, dvu-NP) |
3.2 Por qué RTL2 Reemplaza a RTL en Ocho Modelos
El detonante fue el ciclo de inspección SFDA de Arabia Saudita en 2023. Una implementación de 9,000 unidades de un distribuidor saudita presentaba defectos visibles en la forma de las letras con fuentes de cuerpo de 11 mm, y enviamos una OTA correctiva en 21 días. La investigación rastreó el problema hasta formas contextuales faltantes en el motor heredado. Desde el firmware 3.x en adelante, cada paquete de idioma árabe/hebreo/urdu/farsi es RTL2.
4. Comparación Directa: RTL vs RTL2 en Contenido Real
Comparamos ambos motores en el mismo conjunto de contenido — 12 libros OID en árabe (portada, 18 páginas, 240 palabras en promedio) y 4 cartillas en hebreo.
| Métrica | RTL (heredado) | RTL2 (moderno) | Diferencia |
|---|---|---|---|
| Flash del motor | 312 KB | 852 KB | +540 KB |
| Pico de RAM del motor | 18 KB | 78 KB | +60 KB |
| Arranque en frío hasta la primera palabra | 0.41 s | 0.62 s | +0.21 s |
| Búsqueda promedio de palabras | 6.2 ms | 4.8 ms | -22% |
| Cobertura de conformación | 64% de formas | 100% de formas | +36 pts |
| Tamaño de fuente de mapa de bits | 224 KB | 1.12 MB (subconjunto WOFF2) | +896 KB |
| Costo total de flash por idioma | 0,54 MB | 1,97 MB | +1,43 MB |
| Costo de batería por hora de uso | 0,4 mA | 1,1 mA | +0,7 mA |
| Carga útil OTA | 0,6 MB | 2,1 MB | +250% |
La columna "delta" es exactamente lo que su director de programa preguntará. En B1, el motor +540 KB obliga a un compromiso de contenido; en T2 (2500 mAh Li-ion 18650, 14 h de autonomía) el +0,7 mA es invisible. Combine el motor con la SKU, no con el país.
5. Formato de archivo del paquete de idiomas y cadena de firma
Cada paquete de idiomas enviado a producción es un paquete firmado. El diseño interno es idéntico entre motores; solo cambia el campo de enlace del motor.
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 (tablas HarfBuzz, ~520 KB)
├── dictionary.dict (lista ordenada de lemas, 12–88 MB según el idioma)
├── voice_tts_en.bin (TTS de respaldo entre idiomas opcional, 1,8 MB)
└── signature.sig (Ed25519, 64 B)
La cadena de firma tiene su raíz en nuestro HSM en Shenzhen. Se emiten subclaves por región para Arabia Saudita (SFDA), Emiratos Árabes Unidos (TDRA), Israel (IMOC) y Pakistán (PTA). Un distribuidor no puede instalar un paquete de idiomas que no haya sido firmado para su región — el gestor de arranque rechaza la firma 38 ms después del montaje, y el dispositivo recurre a un paquete en inglés de 17 idiomas.
Consejo para compradores: Siempre solicite el SHA-256 del paquete de idiomas y el ID de subclave pública antes de aceptar una muestra. Enviamos ambos en la hoja de empaque.
6. Diseño de almacenamiento por modelo — Dónde reside el paquete de idiomas
La ubicación de dictionary.dict en la memoria flash afecta la latencia de lectura y el costo de reintento OTA. A continuación se muestra el diseño real que enviamos en el firmware 3.3.1 (Q6/Q8).
| Modelo | Tipo de flash | Partición LP | Partición de repuesto | Presupuesto de desgaste |
|---|---|---|---|---|
| B1 | NOR de 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K ciclos |
| B2 | NOR de 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K ciclos |
| F8 | NAND de 8 MB | partición 4 (1,9 MB) | partición 5 (1,9 MB A/B) | 60K ciclos |
| K7 / KF1 | NAND de 8 MB | partición 4 (1,9 MB) | partición 5 (1,9 MB A/B) | 60K ciclos |
| L5 | NAND de 16 MB | partición 6 (3,6 MB) | partición 7 (3,6 MB A/B) | 100K ciclos |
| P2 | NOR de 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K ciclos |
| Q6 / Q8 | 16 MB NAND | partición 6 (3,6 MB) | partición 7 (3,6 MB A/B) | 100K ciclos |
| T2 / Y6 | 32 MB NAND | partición 8 (6,4 MB) | partición 9 (6,4 MB A/B) | 100K ciclos |
A/B significa que el bootloader mantiene el paquete de idioma anterior válido en la partición de repuesto, de modo que una instalación fallida retrocede en 0,6 s.
7. La lista de verificación de 30 segundos antes de comprar una edición en árabe / hebreo / urdu
Úsela en su próxima llamada con el proveedor. Es la misma lista de verificación que nuestro equipo de OEM utiliza para calificar una muestra antes de la aprobación.
- Versión del motor — Abrir Ajustes → Acerca de → Motor. Debe mostrar
RTL2-3.xen F8/K7/KF1/L5/Q6/Q8/T2/Y6. B1/B2/P2 puede mostrarRTL-2.x. - Prueba de conformación[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — Toque la palabra «libro». Las letras deben conectarse: kaf, ba con forma final, alef unida. Si ve cuatro letras aisladas, RTL2 no está activo.
- Prueba de Lam-AlefToca «No». Debe ser un solo glifo con la línea base correcta, no dos apilados.
- Prueba de dirección mixtaToca «Lección 3». Los números deben mostrarse de izquierda a derecha dentro del párrafo de derecha a izquierda, con el orden visual «Lección 3».
- Prueba de forma numéricaCambia a «dígitos árabigo‑indic» en Ajustes → Pantalla. Los números 0-9 deben aparecer con las formas correctas.
- ID de subclave pública — Compárelo con la subclave que publicamos en el portal de OEM. Si no coincide = LP falsificado.
Si las seis pasan, su pedido es seguro. Fallo en cualquiera de ellas es motivo para rechazar el lote bajo nuestra cláusula de AQL Mayor del 1,0%.
8. Hacia dónde se dirige la arquitectura (Hoja de ruta de firmware 4.x)
Tres cambios se implementarán entre Q4 2026 y Q2 2027:
- Marcas de derecha a izquierda en búsqueda de diccionario — RTL2 actualmente usa orden de clasificación latino en el índice del diccionario. Estamos pasando a ICU collator con clasificación dependiente del locale, lo que debería reducir la búsqueda de palabras árabes de 4,8 ms a 3,1 ms.
- Caché de glifos por palabra — Una caché persistente de 64 KB eliminará la refundición de palabras comunes, ahorrando ~0,3 mA por minuto activo.
- Fuente variable WOFF2 — Un único archivo variable de 540 KB reemplaza cuatro tamaños fijos, ahorrando ~580 KB en L5/Q6/Q8/T2/Y6.
El motor RTL heredado recibirá mantenimiento solo de seguridad hasta 2027. Después de eso, B1/B2/P2 con firmware ≥3.0 recibirá RTL2 con cargo por reflashing.
9. Impacto en precios y plazos al elegir RTL2
Los paquetes de idioma se licencian por región, no por dispositivo. La diferencia de costo de fábrica entre un bundle RTL y RTL2 en el mismo hardware está en las líneas de la lista de materiales, no en el precio unitario.
| Artículo | RTL (heredado) | RTL2 (moderno) |
|---|---|---|
| Licencia de paquete de idioma por unidad | incluido en el firmware | incluido en el firmware |
| Tarifa de emisión de clave de firma (única) | exenta | $480 por región |
| Plazo de muestra (región existente) | 7 días | 7 días |
| Plazo de muestra (nueva región) | 21 días | 21 días |
| Plazo de producción en masa | 28 días | 28 días |
| Diccionario personalizado adicional (10K palabras) | $1.400 único | $1.400 único |
| Nueva firma al actualizar diccionario | $0 (MD5) | $0 (Ed25519, pipeline gratuita) |
La tarifa de $480 cubre nuestra ceremonia de firma del lado HSM. Es un costo único con alcance regional y se amortiza en toda la flota que envíe a esa región.
10. Distribución visual de los paquetes de idiomas en los 11 SKU activos
El gráfico a continuación mapea qué paquetes RTL/RTL2 están en cuáles de los 11 SKU de envío. Tres de los SKU (K7, KF1, Q6/Q8) envían solo RTL2. El trío consciente del costo B1/B2/P2 lleva el motor heredado. F8, L5, T2 e Y6 llevan ambos motores para compradores que operan flotas bilingües (p. ej., árabe + urdu).
11. Anexo: Telemetría detallada del rendimiento RTL2 de flotas de producción
Entre enero de 2024 y agosto de 2026, recopilamos datos de tiempo anonimizados de 11.420 unidades equipadas con RTL2 en nuestros canales de distribución de Arabia Saudita, EAU, Israel, Pakistán e Irán. Los números a continuación no son sintetizados — provienen directamente del bloque perfmon.dump que el firmware escribe en la partición de repuesto cada vez que una sesión termina sin errores. Son los mismos números que nuestro equipo de confiabilidad revisa cada lunes por la mañana.
11.1 Distribución del inicio en frío por modelo
| Modelo | n unidades | p50 inicio en frío | p95 inicio en frío | p99 inicio en frío |
|---|---|---|---|---|
| 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 |
El inicio en frío se define como el intervalo entre que el usuario toca el botón de encendido y la primera palabra del primer libro OID se representa correctamente en pantalla, incluyendo los signos diacríticos. Las unidades por encima de p99 se marcan para reemplazo bajo garantía de la partición de arranque NOR.
11.2 Latencia de búsqueda de palabras por idioma
Muestreamos cada búsqueda de palabras a través del punto de trazado bidi.lookup. La tabla muestra el promedio en una sesión de lectura de 30 minutos.
| Idioma | p50 | p95 | p99 |
|---|---|---|---|
| Árabe (ar-SA, ar-AE) | 4,6 ms | 7,1 ms | 12,4 ms |
| Hebreo (he-IL) | 4,2 ms | 6,6 ms | 11,0 ms |
| Urdu (ur-PK) | 5,1 ms | 7.8 ms | 13.6 ms |
| Persa (fa-IR) | 4.9 ms | 7.5 ms | 13.1 ms |
| Pastún (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 |
El pastún, el sindhi y el divehi se sitúan en la cola derecha porque sus diccionarios son un 18–34% más pequeños que los paquetes de árabe bien dotados de recursos, lo que significa que el índice de lemas tiene una menor localidad de caché. Estamos abordando estos tres en el ciclo de firmware 4.x con un esquema de compresión de prefijos personalizado que debería reducir el p99 por debajo de los 13 ms.
11.3 Costo de batería del uso continuo de RTL2
Instrumentamos 240 unidades (60 por familia de modelos) con una derivación de corriente en línea y las sometimos a una prueba sintética continua de 60 minutos de toque que simula a un niño leyendo a 40 palabras por minuto. Los resultados son el consumo medio de corriente por encima de la línea base en reposo.
| Modelo | Reposo base | RTL2 activo | Delta |
|---|---|---|---|
| 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 |
En una celda B1 de 700 mAh, +1.1 mA representa una reducción del 5% en la autonomía. En una celda T2 de 2500 mAh, está por debajo del ruido de medición. Esta es la base de ingeniería para mantener B1, B2 y P2 en el motor RTL heredado incluso después de que RTL2 esté completamente validado.
11.4 Categorías de defectos de representación observados en campo
Entre más de 47.000 bolígrafos enviados, la tasa de devolución en campo del 0.21% en unidades RTL2 se desglosa en cuatro categorías. Comprender estas categorías ayuda a los distribuidores a crear sus propios scripts de inspección de entrada.
- Deriva base de Lam-Alef (0.06%) — visible solo en el tamaño de corte de 56 px, causada por una marca GPOS faltante en la tabla de conformación v3.0.x. Corregido en v3.1.0.
- Recorte de pila de diacríticos (0.05%) — las combinaciones de kasra + shadda + fatha con más de 4 marcas recortan la parte superior del glifo. Corregido elevando la métrica de caja de línea en v3.1.2.
- Orden de números bidireccionales en encabezados de escritura mixta (0.04%) — raro, ocurre solo cuando un libro OID está creado con una fuente personalizada que tiene una
DirecciónGSUB faltante. El libro es rechazado en la ingestión de contenido. - Retraso en falla de caché de conformación (0.06%) — latencia del primer toque superior a 800 ms en Divehi y Sindhi. Mitigada en v3.2.0 calentando el caché al inicio.
Las cuatro categorías tienen correcciones enviadas y son detectables con la lista de verificación de 30 segundos en la Sección 7.
Lecturas relacionadas
- Paquete de Idiomas TTS Multilingüe del Lápiz de Lectura
- Motor TTS de Texto a Voz Explicado para Lápiz de Lectura
- Motor de Traducción Offline del Lápiz de Lectura y Precisión
- Mecanismo de Actualización de Firmware OTA del Lápiz de Lectura
- Arquitectura de Firmware del Lápiz de Lectura Explicada
- Programas OEM de Lápiz de Lectura