Localisation
Le client Flutter et la CLI prennent en charge l’anglais (en), le chinois
simplifié (zh), le japonais (ja), l’allemand (de) et le français (fr).
L’anglais est la langue de repli. Les variantes chinoises du système utilisent
la traduction en chinois simplifié.
Client Web et e-mails d’inscription
Le client Web hébergé et les e-mails de vérification prennent en charge l’anglais
(en), le chinois simplifié (zh-CN), le chinois traditionnel (zh-TW), le
japonais (ja), le français (fr), l’allemand (de) et l’espagnol (es). Cet
ensemble est distinct de celui des clients natifs. Le sélecteur de langue Web
fonctionne avant la connexion et ne stocke que la préférence linguistique. Sans
préférence enregistrée, la langue du navigateur est utilisée ; les langues non
prises en charge utilisent l’anglais. zh-Hant, zh-HK et zh-MO correspondent
au chinois traditionnel ; zh-Hans explicite correspond au chinois simplifié.
Les messages Web se trouvent dans website/app/i18n.mjs. Ajoutez les mêmes clés
à chaque catalogue. La demande d’inscription envoie locale à Center ; les
objets et les corps des e-mails dans crates/center/src/saas/accounts/email.rs
utilisent la langue de cette demande. Les clients existants qui l’omettent
reçoivent l’anglais. Le code de vérification reste inchangé. La réutilisation des
codes en attente et la limitation du débit s’appliquent aussi lors des changements
de langue. Le site de documentation indépendant propose chaque guide et la
politique de confidentialité dans ces mêmes sept langues. Le changement de langue
conserve le document et la section actuelle.
Flutter
mobile/l10n.yaml configure le générateur officiel de localisation de Flutter.
Ajoutez les messages à mobile/lib/l10n/app_en.arb et traduisez les mêmes clés
dans les quatre autres fichiers ARB. Utilisez des clés descriptives et des
paramètres nommés pour les messages entiers ; utilisez les pluriels ICU lorsque
le nombre modifie la formulation. Déclarez les types des paramètres dans le
modèle anglais. Exécutez flutter gen-l10n après avoir modifié les ressources.
Les widgets obtiennent les chaînes via context.l10n. L’état de la bibliothèque
actualise sa référence de localisation dans didChangeDependencies, ce qui
permet aux opérations asynchrones d’utiliser les chaînes sans conserver de
BuildContext entre les attentes. flutter_localizations fournit les libellés
Material/Cupertino et intl formate les dates et les nombres. Gardez l’anglais
en premier dans preferred-supported-locales pour garantir un repli déterministe
aux langues système inconnues. iOS déclare les langues prises en charge dans
Runner/Info.plist.
Le menu de langue est disponible avant le déverrouillage. SharedPreferences
ne stocke que la préférence non secrète language ; system supprime cette
préférence. Un échec d’enregistrement conserve la sélection existante et affiche
une erreur localisée. Les changements de langue ne recréent pas le backend et ne
modifient pas la session déverrouillée. Sans préférence enregistrée, les
changements de langue système actualisent l’interface et les polices de repli
pendant l’exécution de l’application. Un choix enregistré reste fixe jusqu’à sa
modification ou sa réinitialisation à la valeur par défaut du système.
Les erreurs locales sont traduites à l’affichage ; une bannière existante change
donc avec la langue. Les erreurs natives utilisent leurs codes stables pour un
message de repli traduit. Ne traduisez pas les valeurs du protocole, les
identifiants, les URL, les métadonnées des comptes, les titres, corps, étiquettes
et relations des utilisateurs, les enregistrements d’audit signés ni les valeurs
secrètes. Les aperçus protégés doivent continuer d’utiliser la liste explicite
des champs autorisés et les masques fixes dans protected_cards.dart.
CLI
crates/cli/src/i18n.rs détermine la langue avant que Clap affiche l’aide. Ordre
de priorité :
--lang en|zh|ja|de|fr, pris en charge au niveau principal et dans les sous-commandes.MEMORIES_LANGnon vide.- La préférence enregistrée dans le répertoire personnel Memories sélectionné.
- La première valeur non vide parmi
LC_ALL,LC_MESSAGESouLANG. - La langue de l’utilisateur Windows, ou l’anglais sur les autres plateformes sans variables de langue.
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 préférence non secrète est enregistrée dans language.txt sous --home /
MEMORIES_HOME (ou dans le répertoire de données memories par défaut).
L’enregistrement utilise un remplacement atomique du fichier. Il fonctionne
avant l’initialisation et sans daemon actif. Aucun fichier de préférence n’est
créé par la seule détection de la langue système. Les préférences absentes,
illisibles ou invalides utilisent le système ; les écritures échouées signalent
une erreur. Les remplacements temporaires --lang et MEMORIES_LANG ne
modifient pas le fichier.
Les variantes de langue telles que ja_JP.UTF-8 sont normalisées vers leur langue
de base. Les langues de l’environnement ou du système non prises en charge
utilisent l’anglais. Clap rejette les valeurs --lang explicites invalides. Le
balayage initial s’arrête à --, préservant les arguments ressemblant à des
options de langue transmis aux programmes capturés.
Les catalogues UTF-8 de crates/cli/locales/ sont intégrés à la compilation ;
les exécutables installés n’ont pas besoin de fichiers de ressources à leurs
côtés. Les clés des catalogues sont les messages anglais originaux. Conservez
les variantes complètes et sans point final des commentaires de documentation
Clap, car l’aide courte retire le point final. Traduisez l’aide courte et l’aide
longue. Ajoutez une entrée de catalogue pour chaque nouvelle erreur et invite
appartenant à la CLI.
Utilisez i18n::format pour les paramètres nommés. La substitution traite le
modèle une seule fois ; le texte utilisateur contenant des accolades ne peut donc
pas devenir un autre paramètre. La saisie des mots de passe et des secrets reste
masquée. USE et APPROVE restent des jetons de confirmation littéraux et doivent
apparaître inchangés dans leurs invites traduites.
La sortie JSON conserve la version, les noms de champs, les codes d’erreur et le code de sortie existants. Seuls les messages destinés aux personnes sont localisés. Les diagnostics natifs ou du système sans correspondance conservent leur texte original après un résumé localisé ; les diagnostics d’analyse de Clap incluent une introduction localisée et les détails originaux des arguments. Les schémas MCP, les noms d’outils et les messages du protocole restent stables et ne dépendent pas de la langue de la CLI.
Validation
cargo test -p memories --locked
cd mobile
flutter gen-l10n
flutter analyze
flutter test
Les tests Rust couvrent tous les catalogues, la couverture de l’aide, la préservation des paramètres, la priorité des langues, les arguments transmis, l’aide imbriquée et les erreurs localisées avec des champs JSON stables. Les tests Flutter couvrent la parité des catalogues, les cinq langues système, le repli pour les langues non prises en charge, la persistance des préférences, la préservation de la session, les boîtes de dialogue localisées aux largeurs de téléphone et les aperçus masqués des cartes protégées.
Sur les hôtes utilisant un proxy HTTP, excluez localhost, 127.0.0.1 et ::1
du proxy lors des tests de widgets ; le WebSocket de test local de Flutter doit
se connecter directement. Des tests sur appareil restent nécessaires pour
vérifier les polices de repli de la plateforme, les sélecteurs de fichiers natifs
et l’interface du navigateur OAuth, dont la langue est gérée par le système ou le
fournisseur.