`src/app.html` trae `<html lang="en">` hardcodeado y NADIE lo actualizaba: con
arabe seleccionado la pagina quedaba correctamente espejada (`dir="rtl"`, que
la proyeccion si escribe) pero anunciada en el idioma equivocado. El `lang`
gobierna seleccion de fuentes, corte de palabras, glifos de comilla y lo que
lee CUALQUIER lector de pantalla.
`lang` viaja con `dir` porque responden a la misma pregunta sobre el documento
y el navegador lee LOS DOS del DOM. La dimension `language` ya estaba en el
esquema —es de donde `prefs` deriva la direccion— asi que el slot ya estaba
disponible: el valor efectivo es un tag BCP-47, que es justo lo que el atributo
toma.
Un esquema SIN la dimension `language` no produce slot y no se proyecta nada,
asi que una app que gobierne el `lang` desde el servidor (i18n por routing)
queda intacta.
Cambia el contrato declarado:
`prefsDomProjection.ownsAttrs` pasa a `['dir','lang','data-motion','data-sound','data-haptic']`,
con su guard en `contracts.test.ts` y el README de prefs.
Medido en Chrome por el camino real (el selector de idioma de la shell):
ar -> lang=ar/dir=rtl · en -> lang=en/dir=ltr · es -> lang=es/dir=ltr. Un solo
`language.set` mueve los dos: el `dir` por derivacion, el `lang` directo — y
eso queda fijado en `dom-projection.test.ts`.
Sin tocar el `<main lang="en">` de las demos: NO es el defecto, es correcto —
la prosa de las demos esta en ingles (decision de 6.4).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>