Aller au contenu

SKILL-06 — Éléments Obligatoires

Langue principale, changement de langue et titres d'écrans

Critères couverts

Critère RAAM Intitulé Niveau WCAG
6.1 La langue principale de l'application est indiquée [A] 3.1.1
6.2 Les changements de langue dans le contenu sont indiqués [A] 3.1.2
6.3 Le titre de l'écran est pertinent [A] 2.4.2
6.4 Le titre de l'écran est unique [A] 2.4.2

Pourquoi c'est important

Attention à la prononciation

Les lecteurs d'écran (VoiceOver, TalkBack) utilisent l'information de langue pour sélectionner le bon synthétiseur vocal et la bonne prononciation. De plus, des titres d'écran pertinents et uniques permettent aux utilisateurs de s'orienter.

Patterns

1. Langue principale [A]

✅ Bon
Text("Bonjour tout le monde")
    // Généralement géré via Info.plist (CFBundleDevelopmentRegion)
    // Mais on peut forcer une locale pour un environnement spécifique
    .environment(\.locale, Locale(identifier: "fr-FR"))
✅ Bon
// La locale principale est définie par le système Android
// ou via AppCompatDelegate.setApplicationLocales
// TalkBack utilise cette locale du système ou de l'application.

2. Changements de langue [A]

✅ Bon
// Terme technique anglais dans un texte français
Text("Pour valider, cliquez sur le bouton ") + 
Text("Submit").accessibilityLanguage("en-US") + // (1)!
Text(" en bas de page.")
❌ Mauvais
Text("Hello World, how are you?") // (2)!
  1. L'attribut .accessibilityLanguage indique le changement.
  2. Sans indication, l'anglais sera lu avec un accent français.
✅ Bon
Text(
    text = "To be or not to be, that is the question.",
    style = LocalTextStyle.current.copy(
        localeList = LocaleList(Locale("en-US")) // (1)!
    )
)
✅ Bon (AnnotatedString)
Text(
    buildAnnotatedString {
        append("Le terme technique est ")
        withStyle(style = SpanStyle(localeList = LocaleList(Locale("en-US")))) {
            append("Smartphone")
        }
        append(".")
    }
)
  1. Définit la locale spécifiquement pour ce texte.

3. Titres d'écrans [A]

✅ Bon
NavigationStack {
    List {
        NavigationLink("Voir les détails", destination: DetailView())
    }
    .navigationTitle("Liste des utilisateurs") // (1)!
}
  1. Titre descriptif et unique.
✅ Bon
Scaffold(
    topBar = {
        TopAppBar(
            title = { Text("Paramètres du compte") } // (1)!
        )
    }
) { paddingValues ->
    // ...
}
❌ Mauvais
TopAppBar(
    title = { Text("Écran") } // (2)!
)
  1. Titre unique et pertinent, annoncé par TalkBack.
  2. Titre générique, ne décrit pas le contexte.

4. Titre de panneau (paneTitle) [A]

Sur tablette ou écran à panneaux (liste + détail), un seul TopAppBar ne suffit pas : TalkBack ne sait pas qu'un panneau vient d'apparaître.

✅ Bon
Column(
    modifier = Modifier.semantics { paneTitle = "Détail du message" } // annoncé à l'apparition
) { Text(message) }
❌ Mauvais
// Panneau de détail qui apparaît sans titre : TalkBack ne dit rien
Column { Text(message) }

Sur iOS, le titre de navigation (.navigationTitle) et UIAccessibility.post(notification: .screenChanged, …) jouent ce rôle.

Checklist [A]

  • La langue par défaut de l'application est configurée dans le projet (Info.plist ou ressource).
  • Tous les passages en langue étrangère utilisent un attribut de langue programmatiquement (.accessibilityLanguage ou localeList).
  • Chaque écran possède un titre visuel ou sémantique pertinent.
  • Les titres d'écran décrivent précisément le contenu de l'écran.
  • Les titres d'écran sont uniques dans toute l'application.
  • Lors d'un changement d'écran programmatique sans transition standard, une notification est envoyée.
  • Les termes techniques étrangers sont correctement prononcés.
  • La locale de l'application correspond aux textes affichés.
  • Les alertes et modales ont des titres clairs et pertinents.
  • Les titres d'écran ne sont pas redondants avec le nom de l'application.

Références