From dd6c7a6fdf65ad1c1c1bcb4f2c3139349e4482bf Mon Sep 17 00:00:00 2001 From: zefutoff Date: Thu, 8 Oct 2026 22:56:22 +0200 Subject: [PATCH] chore: review French user-facing strings --- CHANGELOG.md | 1 + ROADMAP.md | 2 +- app/src/main/AndroidManifest.xml | 4 +- .../unofficial/CorrectionStatusActivity.kt | 2 +- .../unofficial/GrammalecteImeService.kt | 12 ++++-- .../unofficial/MainActivity.kt | 37 ++++++++++--------- .../unofficial/PersonalDictionaryActivity.kt | 26 ++++++------- .../unofficial/ProcessTextActivity.kt | 13 +++++-- .../unofficial/RuleSettingsActivity.kt | 30 ++++++++------- .../unofficial/SetupGuideActivity.kt | 6 +-- app/src/main/res/values/strings.xml | 30 +++++++++++---- 11 files changed, 97 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 861209e..7f625d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ### Changed +- Reviewed and normalized user-facing French wording, typography and pluralization across the application, correction IME, setup screens and diagnostics. - Improved Android UI accessibility with semantic headings, TalkBack live-region announcements, minimum IME touch targets and a large-text IME layout that avoids truncated actions. - Grammalecte engine initialization now loads conjugation, phonetic and morphology data required by the full grammar engine. - Android spell-checker sessions now own their QuickJS engine lifecycle. diff --git a/ROADMAP.md b/ROADMAP.md index e49954f..70a6863 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -92,7 +92,7 @@ Exit criterion: correction remains usable in common editable applications even w - [x] Improve first-run setup - [x] Explain the three correction modes in-app - [x] Improve accessibility of the application UI -- [ ] Review all user-facing French strings +- [x] Review all user-facing French strings - [x] Add compatibility documentation - [ ] Add performance regression tests - [ ] Add memory/runtime stress tests diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6eea1e6..8619458 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,7 +43,7 @@ + android:label="@string/process_text_label"> @@ -64,7 +64,7 @@ diff --git a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/CorrectionStatusActivity.kt b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/CorrectionStatusActivity.kt index 9a26b70..af6a705 100644 --- a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/CorrectionStatusActivity.kt +++ b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/CorrectionStatusActivity.kt @@ -255,7 +255,7 @@ class CorrectionStatusActivity : Activity() { spellCheckerStatusView.text = when (status.spellChecker) { SpellCheckerStatus.SELECTED -> - "État : sélectionné comme correcteur système." + "État : activé et sélectionné comme correcteur Android." SpellCheckerStatus.NOT_SELECTED -> "État : disponible, mais non sélectionné." diff --git a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/GrammalecteImeService.kt b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/GrammalecteImeService.kt index 513e3c0..2fa0741 100644 --- a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/GrammalecteImeService.kt +++ b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/GrammalecteImeService.kt @@ -527,7 +527,7 @@ class GrammalecteImeService : InputMethodService() { val generation = ++analysisGeneration statusView.text = - "Analyse en cours..." + "Analyse en cours…" issuesLayout.removeAllViews() latestIssues = emptyList() @@ -597,7 +597,11 @@ class GrammalecteImeService : InputMethodService() { } statusView.text = - "${issues.size} problème(s) détecté(s)." + resources.getQuantityString( + R.plurals.detected_problems, + issues.size, + issues.size, + ) setApplyAllButtonsEnabled( buildAutomaticCorrection( @@ -875,7 +879,7 @@ class GrammalecteImeService : InputMethodService() { analyzedSelectionEnd <= analyzedSelectionStart ) { statusView.text = - "La sélection n'est plus disponible." + "La sélection n’est plus disponible." setApplyButtonsEnabled(false) return @@ -930,7 +934,7 @@ class GrammalecteImeService : InputMethodService() { } } else { statusView.text = - "Impossible d'appliquer la correction." + "Impossible d’appliquer la correction." } } diff --git a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/MainActivity.kt b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/MainActivity.kt index 4492f85..4fb70a6 100644 --- a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/MainActivity.kt +++ b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/MainActivity.kt @@ -87,9 +87,7 @@ class MainActivity : content.addView( TextView(this).apply { - text = - "Correction française locale avec Grammalecte. " + - "Aucun texte n'est envoyé sur Internet." + text = getString(R.string.intro) textSize = 15f @@ -184,14 +182,14 @@ class MainActivity : title = "Correction rapide", description = "Permet de corriger une sélection dans les applications " + - "qui n'utilisent pas le correcteur Android.", + "qui n’utilisent pas le correcteur Android.", statusView = imeStatusView, actions = listOf( - "Gérer la méthode de saisie" to { + "Gérer les méthodes de saisie" to { openInputMethodSettings() }, - "Choisir Grammalecte" to { + "Choisir le clavier" to { showInputMethodPicker() }, ), @@ -203,8 +201,8 @@ class MainActivity : createCard( title = "Réglages de correction", description = - "Choisissez le dictionnaire et les contrôles " + - "Grammalecte utilisés dans les analyses.", + "Choisissez le dictionnaire et les règles " + + "Grammalecte utilisées lors des analyses.", statusView = null, actions = listOf( @@ -226,7 +224,7 @@ class MainActivity : title = "Accès rapide", description = "Ajoutez Grammalecte aux réglages rapides pour ouvrir " + - "le sélecteur de clavier depuis n'importe quelle application.", + "le sélecteur de clavier depuis n’importe quelle application.", statusView = null, actions = listOf( @@ -486,7 +484,7 @@ class MainActivity : spellCheckerSession?.close() spellCheckerSession = null - resultView.text = "Test en cours...\n\n$testText" + resultView.text = "Test en cours…\n\n$testText" val manager = getSystemService(TextServicesManager::class.java) @@ -500,7 +498,7 @@ class MainActivity : if (session == null) { resultView.text = - "Android n'a pas pu créer de session de correction orthographique." + "Android n’a pas pu créer de session de correction orthographique." return } @@ -514,7 +512,7 @@ class MainActivity : override fun onGetSentenceSuggestions(results: Array?) { if (results.isNullOrEmpty()) { - resultView.text = "Session appelée, mais aucun résultat reçu." + resultView.text = "Session ouverte, mais aucun résultat reçu." return } @@ -569,7 +567,7 @@ class MainActivity : } if (issueCount == 0) { - output.append("\nAucune erreur retournée.") + output.append("\nAucune erreur détectée.") } resultView.text = output.toString() @@ -581,7 +579,12 @@ class MainActivity : } resultView.append( - "\n\nLe service a retourné ${results.size} résultat(s) mot par mot.", + "\n\n" + + resources.getQuantityString( + R.plurals.word_by_word_results, + results.size, + results.size, + ), ) } @@ -596,12 +599,12 @@ class MainActivity : ) if (spans.isEmpty()) { - resultView.text = "Aucun SuggestionSpan present dans le champ." + resultView.text = "Aucun SuggestionSpan présent dans le champ." return } val output = StringBuilder() - output.append("SuggestionSpan trouves : ") + output.append("Nombre de SuggestionSpan : ") output.append(spans.size) output.append("\n") @@ -622,7 +625,7 @@ class MainActivity : output.append("»") } - output.append("\n flags=") + output.append("\n indicateurs=") output.append(span.flags) output.append("\n suggestions=") diff --git a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/PersonalDictionaryActivity.kt b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/PersonalDictionaryActivity.kt index ce0585c..ecbcaf2 100644 --- a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/PersonalDictionaryActivity.kt +++ b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/PersonalDictionaryActivity.kt @@ -119,8 +119,8 @@ class PersonalDictionaryActivity : Activity() { content.addView( TextView(this).apply { text = - "Ajoutez les mots que Grammalecte doit considérer " + - "comme correctement orthographiés. Ils sont utilisés " + + "Ajoutez les mots que Grammalecte doit considérer comme corrects. " + + "Ils sont utilisés " + "par tous les modes de correction." textSize = 14f @@ -177,7 +177,7 @@ class PersonalDictionaryActivity : Activity() { statusView = TextView(this).apply { - text = "Chargement..." + text = "Chargement…" enablePoliteAccessibilityUpdates() textSize = 14f @@ -259,7 +259,7 @@ class PersonalDictionaryActivity : Activity() { setControlsEnabled(false) statusView.text = - "Chargement..." + "Chargement…" executor.execute { val result = @@ -311,7 +311,7 @@ class PersonalDictionaryActivity : Activity() { setControlsEnabled(false) statusView.text = - "Ajout en cours..." + "Ajout en cours…" executor.execute { val result = @@ -342,7 +342,7 @@ class PersonalDictionaryActivity : Activity() { if (added) { "Mot ajouté." } else { - "Ce mot est déjà présent." + "Ce mot est déjà dans le dictionnaire." } }.onFailure { error -> showError(error) @@ -355,7 +355,7 @@ class PersonalDictionaryActivity : Activity() { setControlsEnabled(false) statusView.text = - "Suppression en cours..." + "Suppression en cours…" executor.execute { val result = @@ -393,17 +393,17 @@ class PersonalDictionaryActivity : Activity() { if (words.isEmpty()) { statusView.text = - "Aucun mot personnel." + "Aucun mot enregistré." return } statusView.text = - if (words.size == 1) { - "1 mot personnel." - } else { - "${words.size} mots personnels." - } + resources.getQuantityString( + R.plurals.personal_dictionary_word_count, + words.size, + words.size, + ) words.forEach { word -> addWordRow(word) diff --git a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/ProcessTextActivity.kt b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/ProcessTextActivity.kt index e4ce68c..1dccaa1 100644 --- a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/ProcessTextActivity.kt +++ b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/ProcessTextActivity.kt @@ -56,7 +56,7 @@ class ProcessTextActivity : Activity() { layout.addView( TextView(this).apply { - text = "Corriger avec Grammalecte" + text = getString(R.string.process_text_label) markAsAccessibilityHeading() textSize = 24f }, @@ -130,7 +130,7 @@ class ProcessTextActivity : Activity() { val text = editText.text.toString() val generation = ++analysisGeneration - statusView.text = "Analyse en cours..." + statusView.text = "Analyse en cours…" issuesLayout.removeAllViews() Thread { @@ -157,7 +157,7 @@ class ProcessTextActivity : Activity() { showIssues(text, issues) }.onFailure { error -> statusView.text = - "Erreur pendant l'analyse : ${error.message ?: error.javaClass.simpleName}" + "Erreur pendant l’analyse : ${error.message ?: error.javaClass.simpleName}" } } }.start() @@ -181,7 +181,12 @@ class ProcessTextActivity : Activity() { return } - statusView.text = "${validIssues.size} erreur(s) détectée(s)." + statusView.text = + resources.getQuantityString( + R.plurals.detected_problems, + validIssues.size, + validIssues.size, + ) validIssues.forEach { issue -> val fragment = diff --git a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/RuleSettingsActivity.kt b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/RuleSettingsActivity.kt index 9fb1e28..78a80f1 100644 --- a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/RuleSettingsActivity.kt +++ b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/RuleSettingsActivity.kt @@ -135,9 +135,9 @@ class RuleSettingsActivity : Activity() { content.addView( TextView(this).apply { text = - "Choisissez le dictionnaire et les contrôles Grammalecte " + + "Choisissez le dictionnaire et les règles Grammalecte " + "à appliquer. Les réglages sont partagés par le correcteur " + - "Android, la correction de sélection et le clavier Grammalecte." + "Android, la correction d’une sélection et le clavier Grammalecte." textSize = 14f @@ -202,7 +202,7 @@ class RuleSettingsActivity : Activity() { content.addView( sectionTitle( - "Import / export", + "Importation et exportation", ), matchWrapParams(), ) @@ -361,7 +361,7 @@ class RuleSettingsActivity : Activity() { statusView = TextView(this).apply { - text = "Chargement des règles..." + text = "Chargement des règles…" enablePoliteAccessibilityUpdates() textSize = 14f @@ -464,7 +464,7 @@ class RuleSettingsActivity : Activity() { private fun loadOptions() { statusView.text = - "Chargement des réglages..." + "Chargement des réglages…" resetButton.isEnabled = false resetAllButton.isEnabled = false @@ -524,7 +524,7 @@ class RuleSettingsActivity : Activity() { addDictionaryOption( dictionary = GrammalecteDictionary.REFORM_1990, - label = "Réforme de 1990", + label = "Rectifications de 1990", description = "Utilise les graphies issues des rectifications " + "orthographiques de 1990.", @@ -579,7 +579,7 @@ class RuleSettingsActivity : Activity() { setDictionaryControlsEnabled(false) statusView.text = - "Changement de dictionnaire..." + "Changement de dictionnaire…" executor.execute { val result = @@ -630,7 +630,11 @@ class RuleSettingsActivity : Activity() { } statusView.text = - "${options.size} options configurables." + resources.getQuantityString( + R.plurals.configurable_options, + options.size, + options.size, + ) resetButton.isEnabled = true @@ -762,7 +766,7 @@ class RuleSettingsActivity : Activity() { toggle.isEnabled = false statusView.text = - "Enregistrement..." + "Enregistrement…" executor.execute { val result = @@ -797,7 +801,7 @@ class RuleSettingsActivity : Activity() { resetButton.isEnabled = false statusView.text = - "Réinitialisation..." + "Réinitialisation…" executor.execute { val result = @@ -853,7 +857,7 @@ class RuleSettingsActivity : Activity() { setDictionaryControlsEnabled(false) statusView.text = - "Réinitialisation de tous les réglages..." + "Réinitialisation de tous les réglages…" executor.execute { val result = @@ -965,7 +969,7 @@ class RuleSettingsActivity : Activity() { setTransferControlsEnabled(false) statusView.text = - "Export des réglages..." + "Exportation des réglages…" executor.execute { val result = @@ -1005,7 +1009,7 @@ class RuleSettingsActivity : Activity() { setDictionaryControlsEnabled(false) statusView.text = - "Import des réglages..." + "Importation des réglages…" executor.execute { val result = diff --git a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/SetupGuideActivity.kt b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/SetupGuideActivity.kt index b18d8ef..41f5b20 100644 --- a/app/src/main/kotlin/fr/grammalecteandroid/unofficial/SetupGuideActivity.kt +++ b/app/src/main/kotlin/fr/grammalecteandroid/unofficial/SetupGuideActivity.kt @@ -292,13 +292,13 @@ class SetupGuideActivity : Activity() { spellCheckerStatusView.text = when (status.spellChecker) { SpellCheckerStatus.SELECTED -> - "État : activé et sélectionné." + "État : activé et sélectionné comme correcteur Android." SpellCheckerStatus.NOT_SELECTED -> "État : disponible, mais non sélectionné." SpellCheckerStatus.DISABLED -> - "État : correction Android désactivée." + "État : correction orthographique Android désactivée." SpellCheckerStatus.UNAVAILABLE -> "État : aucun correcteur Android actif détecté." @@ -313,7 +313,7 @@ class SetupGuideActivity : Activity() { "État : activé, mais un autre clavier est sélectionné." ImeStatus.DISABLED -> - "État : non activé." + "État : non activé dans les méthodes de saisie." } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fe4b3a2..528c4f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,21 +2,35 @@ Grammalecte Android (non officiel) Grammalecte + Corriger avec Grammalecte Grammalecte Android - Correcteur français local basé sur Grammalecte. Aucun texte n’est envoyé sur Internet. - Pour l’activer : Paramètres Android → Système → Langues et saisie → Correcteur orthographique, puis choisissez Grammalecte Android. - Configurer le correcteur Android - Activer la méthode de saisie Grammalecte - Choisir la méthode de saisie - Méthode de saisie Grammalecte : activée. - Méthode de saisie Grammalecte : désactivée. Android affichera un avertissement standard lors de son activation. Grammalecte Android ne possède pas la permission INTERNET. + Correction française locale avec Grammalecte. Aucun texte n’est envoyé sur Internet. Moteur Grammalecte embarqué : prêt. Moteur Grammalecte non embarqué. Exécutez tools/vendor-grammalecte.sh avant de construire l’APK. Grammalecte - Ajouter la tuile Grammalecte Tuile Grammalecte ajoutée. La tuile Grammalecte est déjà ajoutée. La tuile Grammalecte n’a pas été ajoutée. Sur cette version d’Android, ajoutez la tuile Grammalecte manuellement depuis les réglages rapides. Impossible d’ajouter la tuile Grammalecte (code %1$d). + + %1$d problème détecté. + %1$d problèmes détectés. + + + + Le service a retourné %1$d résultat mot par mot. + Le service a retourné %1$d résultats mot par mot. + + + + %1$d option configurable. + %1$d options configurables. + + + + %1$d mot enregistré. + %1$d mots enregistrés. + +