Localización
El cliente Flutter y la CLI admiten inglés (en), chino simplificado (zh),
japonés (ja), alemán (de) y francés (fr). El inglés es el idioma de reserva.
Las variantes chinas del sistema se resuelven a la traducción en chino simplificado.
Cliente web y correos de registro
El cliente web alojado y los correos de verificación admiten inglés (en), chino simplificado
(zh-CN), chino tradicional (zh-TW), japonés (ja), francés (fr),
alemán (de) y español (es). Este conjunto es independiente del de los clientes nativos.
El selector de idioma web funciona antes de iniciar sesión y solo guarda la preferencia de
idioma. Sin una preferencia guardada, se utiliza la configuración regional del navegador; los idiomas no admitidos
recurren al inglés. zh-Hant, zh-HK y zh-MO se resuelven a chino tradicional;
el valor explícito zh-Hans se resuelve a chino simplificado.
Los mensajes web están en website/app/i18n.mjs. Añade las mismas claves a todos los catálogos.
La solicitud de registro envía locale a Center; los asuntos y cuerpos de los correos en
crates/center/src/saas/accounts/email.rs utilizan el idioma de esa solicitud. Los clientes existentes
que lo omiten reciben inglés. El código de verificación permanece sin cambios.
La reutilización de códigos pendientes y los límites de frecuencia se aplican también cuando cambia el idioma. El sitio
independiente de documentación ofrece todas las guías y la política de privacidad en estos mismos siete
idiomas. Al cambiar de idioma se conservan el documento y la sección actual.
Flutter
mobile/l10n.yaml configura el generador oficial de localización de Flutter. Añade
mensajes a mobile/lib/l10n/app_en.arb y traduce las mismas claves en los otros
cuatro archivos ARB. Utiliza claves descriptivas y marcadores de posición con nombre para mensajes completos;
utiliza plurales ICU cuando los recuentos cambien la redacción. Declara los tipos de los marcadores de posición en
la plantilla inglesa. Ejecuta flutter gen-l10n después de editar los recursos.
Los widgets obtienen las cadenas mediante context.l10n. El estado de la biblioteca actualiza su
referencia de localización en didChangeDependencies, lo que permite que las operaciones
asíncronas utilicen cadenas sin conservar un BuildContext entre esperas.
flutter_localizations proporciona etiquetas de Material/Cupertino e intl da formato a
fechas y recuentos. Mantén el inglés en primer lugar en preferred-supported-locales para que los idiomas
desconocidos del sistema tengan un idioma de reserva determinista. iOS declara los idiomas admitidos
en Runner/Info.plist.
El menú de idioma está disponible antes del desbloqueo. SharedPreferences solo almacena
la preferencia no secreta language; system elimina esa preferencia. Si falla el
guardado, se mantiene la selección existente y se muestra un error localizado.
Los cambios de idioma no vuelven a crear el backend ni alteran la sesión desbloqueada.
Sin una preferencia guardada, los cambios de idioma del sistema actualizan tanto la interfaz como
las fuentes de reserva mientras la aplicación está en ejecución. Una opción guardada permanece fija hasta que se cambie
o se restablezca el valor predeterminado del sistema.
Los errores locales se traducen al mostrarse, por lo que un aviso existente cambia con
el idioma. Los errores nativos utilizan sus códigos estables para ofrecer un mensaje traducido de reserva.
No traduzcas valores del protocolo, identificadores, URL, metadatos de cuentas, títulos,
cuerpos, etiquetas o relaciones de los usuarios, registros de auditoría firmados ni valores secretos.
Las vistas previas protegidas deben seguir utilizando la lista explícita de campos permitidos y las máscaras
fijas de protected_cards.dart.
CLI
crates/cli/src/i18n.rs resuelve el idioma antes de que Clap muestre la ayuda. Orden de prioridad:
--lang en|zh|ja|de|fr, admitido en el nivel superior y en los subcomandos.MEMORIES_LANGno vacío.- La preferencia guardada en el directorio de datos de Memories seleccionado.
- La primera variable no vacía entre
LC_ALL,LC_MESSAGESoLANG. - La configuración regional del usuario de Windows, o inglés en otras plataformas sin variables de configuración regional.
memories language zh # Save a language for subsequent commands
memories language # Show the saved choice and effective language
memories language system # Clear the choice and follow the system
La preferencia no secreta se guarda como language.txt dentro de --home /
MEMORIES_HOME (o del directorio de datos predeterminado de memories). El guardado utiliza una sustitución
atómica del archivo. Funciona antes de la inicialización y sin un daemon en ejecución.
No se crea ningún archivo de preferencias por el mero hecho de detectar el idioma del sistema. Si las preferencias no existen,
no se pueden leer o no son válidas, se utiliza el sistema; las escrituras fallidas notifican
un error. Las anulaciones temporales con --lang y MEMORIES_LANG no modifican el archivo.
Las variantes regionales como ja_JP.UTF-8 se normalizan a su idioma base.
Los idiomas de entorno o sistema no admitidos recurren al inglés. Clap rechaza los valores explícitos
no válidos de --lang. El análisis inicial se detiene en --, conservando los
argumentos similares a opciones de idioma que se pasan a los programas capturados.
Los catálogos UTF-8 de crates/cli/locales/ se incorporan durante la compilación; los binarios
instalados no necesitan archivos de recursos junto a ellos. Las claves de los catálogos son los mensajes
ingleses originales. Conserva las variantes completas y las que omiten el punto de los comentarios de documentación de Clap,
porque la ayuda breve elimina el punto final. Traduce tanto la ayuda breve como la
extensa. Añade una entrada al catálogo para cada nuevo error y solicitud propios de la CLI.
Utiliza i18n::format para los marcadores de posición con nombre. La sustitución procesa la plantilla
una sola vez, de modo que el texto del usuario con llaves no pueda convertirse en otro marcador de posición. La captura de contraseñas
y secretos sigue utilizando entrada oculta. USE y APPROVE siguen siendo tokens literales
de confirmación y deben aparecer sin cambios en sus solicitudes traducidas.
La salida JSON conserva la versión existente, los nombres de campos, los códigos de error y el estado de salida. Solo se localizan los mensajes dirigidos a personas. Los diagnósticos nativos o del sistema operativo sin traducción conservan su texto original después de un resumen localizado; los diagnósticos de análisis de Clap incluyen una introducción localizada y los detalles originales de los argumentos. Los esquemas MCP, los nombres de herramientas y los mensajes de protocolo permanecen estables y no dependen del idioma de la CLI.
Validación
cargo test -p memories --locked
cd mobile
flutter gen-l10n
flutter analyze
flutter test
Las pruebas Rust cubren todos los catálogos, la cobertura de la ayuda, la conservación de marcadores de posición, la prioridad de configuración regional, los argumentos reenviados, la ayuda anidada y los errores localizados con campos JSON estables. Las pruebas Flutter cubren la paridad de los catálogos, las cinco configuraciones regionales del sistema, el idioma de reserva para configuraciones no admitidas, la persistencia de preferencias, la conservación de sesiones, los diálogos localizados con anchuras de teléfono y las vistas previas enmascaradas de tarjetas protegidas.
En equipos con un proxy HTTP, excluye localhost, 127.0.0.1 y ::1 del
proxy al ejecutar pruebas de widgets; el WebSocket local de pruebas de Flutter debe conectarse
directamente. Sigue siendo necesario probar en dispositivos para verificar las fuentes de reserva de la plataforma,
los selectores nativos de archivos y la interfaz del navegador OAuth, cuyo idioma administra el sistema operativo
o el proveedor.