Skip to content

Commit a09630f

Browse files
committed
Fix fr translations
1 parent 2c6f55b commit a09630f

File tree

15 files changed

+122
-58
lines changed

15 files changed

+122
-58
lines changed

lib/langue/langue.ex

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ defmodule Langue do
4343
def placeholder_regex do
4444
@format_modules
4545
|> Enum.map(& &1.placeholder_regex())
46+
|> Enum.uniq()
4647
|> Enum.reject(&(&1 === :not_supported))
4748
end
4849
end

lib/lint/checks/apostrophe_as_single_quote.ex

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ defmodule Accent.Lint.Checks.ApostropheAsSingleQuote do
1111
def enabled?, do: true
1212

1313
@impl true
14-
def applicable(%{language_slug: slug}, _), do: slug in @applicable_languages
14+
def applicable(entry, _) do
15+
entry.language_slug in @applicable_languages and not String.match?(entry.value, ~r/MMMM?|YYYY?|HH|AA/i)
16+
end
1517

1618
@impl true
1719
def check(entry, _) do

lib/lint/checks/first_letter_case.ex

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ defmodule Accent.Lint.Checks.FirstLetterCase do
5454
end
5555

5656
defp starts_with_letter?(text) do
57-
Regex.match?(~r/^[\w]/i, text)
57+
Regex.match?(~r/^\w/iu, text)
5858
end
5959

6060
defp starts_with_capitalized_letter?(""), do: false

lib/lint/checks/placeholder_count.ex

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ defmodule Accent.Lint.Checks.PlaceholderCount do
1010
def enabled?, do: true
1111

1212
@impl true
13-
def applicable(entry, _), do: is_binary(entry.value) and not entry.is_master and is_binary(entry.master_value)
13+
def applicable(entry, _) do
14+
is_binary(entry.value) and not entry.is_master and is_binary(entry.master_value)
15+
end
1416

1517
@impl true
1618
def check(entry, _) do

lib/lint/checks/spelling.ex

+31-16
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,37 @@ defmodule Accent.Lint.Checks.Spelling do
4949
defp reject_match?(match, entry, config) do
5050
error_term = String.slice(entry.value, match["offset"], match["length"])
5151

52-
Enum.any?(config.lint_entries, fn lint_entry ->
53-
cond do
54-
"spelling" in lint_entry.check_ids and lint_entry.ignore and lint_entry.type === :term and
55-
String.downcase(error_term) === String.downcase(lint_entry.value) ->
56-
true
57-
58-
"spelling" in lint_entry.check_ids and lint_entry.ignore and
59-
lint_entry.type === :language_tool_rule_id and
60-
match["rule"]["id"] === lint_entry.value ->
61-
true
62-
63-
true ->
64-
false
65-
end
66-
end) or String.match?(error_term, ~r/^,/) or
67-
(match["offset"] === 0 and String.starts_with?(entry.value, "{"))
52+
match_project_lint_entries = fn ->
53+
Enum.any?(config.lint_entries, fn lint_entry ->
54+
cond do
55+
"spelling" in lint_entry.check_ids and lint_entry.ignore and lint_entry.type === :term and
56+
String.downcase(error_term) === String.downcase(lint_entry.value) ->
57+
true
58+
59+
"spelling" in lint_entry.check_ids and lint_entry.ignore and
60+
lint_entry.type === :language_tool_rule_id and
61+
match["rule"]["id"] === lint_entry.value ->
62+
true
63+
64+
true ->
65+
false
66+
end
67+
end)
68+
end
69+
70+
error_term_starts_with_comma = fn -> String.match?(error_term, ~r/^,/) end
71+
match_starts_with_brace = fn -> match["offset"] === 0 and String.starts_with?(entry.value, "{") end
72+
error_term_is_icu_match = fn -> error_term === "other" and String.at(entry.value, match["offset"] - 2) === "}" end
73+
74+
Enum.any?(
75+
[
76+
match_project_lint_entries,
77+
error_term_starts_with_comma,
78+
match_starts_with_brace,
79+
error_term_is_icu_match
80+
],
81+
& &1.()
82+
)
6883
end
6984

7085
defp find_replacement(match, entry) do

test/lint/lint_test.exs

+17-2
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,25 @@ defmodule AccentTest.Lint do
1616
end
1717

1818
test "lint placeholder simple" do
19-
entry = %Entry{key: "a", value: "nothing", is_master: false, master_value: "{{bar}}", value_type: "string"}
19+
entry = %Entry{key: "a", value: "Nothing", is_master: false, master_value: "Test {{bar}}", value_type: "string"}
2020
[{_, messages}] = Lint.lint([entry])
2121

22-
assert messages === [%Accent.Lint.Message{check: :placeholder_count, replacement: nil, text: "nothing"}]
22+
assert messages === [%Accent.Lint.Message{check: :placeholder_count, replacement: nil, text: "Nothing"}]
23+
end
24+
25+
@tag :skip
26+
test "lint placeholder icu" do
27+
entry = %Entry{
28+
key: "a",
29+
value: "Nothing",
30+
value_type: "string",
31+
is_master: false,
32+
master_value: "{count, plural, =0 {No items} =1 {1 item} other {# items}}"
33+
}
34+
35+
[{_, messages}] = Lint.lint([entry])
36+
37+
assert messages === []
2338
end
2439

2540
test "lint placeholder many placeholders" do

test/test_helper.exs

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ defmodule Langue.Expectation.Case do
5151
end
5252
end
5353

54-
ExUnit.start()
54+
ExUnit.start(exclude: [:skip])
5555

5656
Sandbox.checkout(Accent.Repo)
5757
Accent.Factory.bootstrap()

webapp/app/components/lint-translations-page/add-lint-entry/component.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ export default class LintTranslationsPageAddLintEntry extends Component<Args> {
2222
}
2323

2424
get spellingTermValue() {
25-
if (!this.args.message.offset || !this.args.message.length) return;
25+
if (this.args.message.offset == null || this.args.message.length == null)
26+
return;
2627

2728
return this.args.message.text.substring(
2829
this.args.message.offset,

webapp/app/locales/en-us.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,7 @@
772772
"lint_translations_page": {
773773
"empty_text": "No checks warnings or errors. You’re all good!",
774774
"add_lint_entry": {
775-
"ignore_checks_for_term": "Ignore all checks for term",
775+
"ignore_checks_for_term": "Accept the term in this project",
776776
"ignore_spellcheck_rule": "Ignore spellcheck rule",
777777
"ignore_checks_for_key": "Ignore all checks for key",
778778
"ignore_check_for_project": "Ignore check for project"

webapp/app/locales/fr-ca.json

+25-25
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
},
5858
"revision_selector": {
5959
"languages_count": "{count, plural, =1 {1 autre langue} other {# autres langues}}",
60-
"master": "Principale"
60+
"master": "principale"
6161
},
6262
"translation_comments_subscriptions": {
6363
"title": "Notifier les nouveaux messages"
@@ -178,7 +178,7 @@
178178
"translations_version_notice": "Vous consultez les textes à réviser de la version",
179179
"correct_all_button": "Marquer toutes les chaînes comme révisées pour cette langue",
180180
"no_translations": "Aucune chaîne à examiner pour : {query}",
181-
"all_reviewed_title": "Tous revus",
181+
"all_reviewed_title": "Tous révisés",
182182
"all_reviewed_subtitle": "Toutes les chaînes ont été marquées comme révisées"
183183
},
184184
"dashboard_master_revision": {
@@ -208,7 +208,7 @@
208208
"last_synced_at_label": "Dernière synchronisation :",
209209
"master_language_label": "La langue principale est :",
210210
"never_synced": "Synchroniser le projet pour la première fois",
211-
"reviewed": "revu"
211+
"reviewed": "révisé"
212212
},
213213
"dashboard_navigation": {
214214
"collaborators_link_title": "Collaborateurs",
@@ -226,8 +226,8 @@
226226
"slaves": "Traductions",
227227
"sync": "Synchroniser",
228228
"strings": "chaînes",
229-
"all_reviewed": "Tous revus !",
230-
"reviewed": "revu",
229+
"all_reviewed": "Tous révisés!",
230+
"reviewed": "révisé",
231231
"activities_title": "Dernières activités",
232232
"item": {
233233
"rtl_badge": "RTL",
@@ -243,7 +243,7 @@
243243
"humanized_date_title_format": "EEEE, MMMM do yyyy, H:mm a"
244244
},
245245
"versions_list": {
246-
"empty_text": "Le versionning vous permet de réviser/exporter/synchroniser les traductions indépendamment de votre projet principal. Cela signifie que la prise en charge des versions précédentes de votre application sera aussi simple que l’ajout de nouvelles fonctionnalités !",
246+
"empty_text": "Le versionning vous permet de réviser/exporter/synchroniser les traductions indépendamment de votre projet principal. Cela signifie que la prise en charge des versions précédentes de votre application sera aussi simple que l’ajout de nouvelles fonctionnalités!",
247247
"export": "Exportation",
248248
"update": "Éditer"
249249
},
@@ -292,7 +292,7 @@
292292
"project_activity": {
293293
"stats_label": "Activités réalisées :",
294294
"overview_label": "Aperçu:",
295-
"review_label": "A été revu ?",
295+
"review_label": "A été révisé?",
296296
"reviewed_yes": "Oui",
297297
"reviewed_no": "Non",
298298
"last_synced_text_label": "Dernier texte synchronisé :",
@@ -420,7 +420,7 @@
420420
"badges_text": "Aperçu rapide des statistiques du projet, intégrées dans les images",
421421
"api_token": "Jetons d’API",
422422
"api_token_text": "Intégrez le flux de travail Accent avec les requêtes CLI ou API simples",
423-
"service_integrations": "Service & intégrations",
423+
"service_integrations": "Service et intégrations",
424424
"service_integrations_text": "Notifier et interagir avec des systèmes externes en fonction des événements Accent",
425425
"manage_languages": "Gérer les langues",
426426
"manage_languages_text": "Ajouter/supprimer des langues traduites dans le projet",
@@ -443,7 +443,7 @@
443443
"delete_project_title": "Supprimer ce projet",
444444
"delete_project_text": "Une fois que vous avez supprimé un projet, il n’y a plus de retour en arrière.",
445445
"delete_project_button": "Supprimer ce projet",
446-
"delete_project_confirm": "Voulez-vous vraiment supprimer ce projet ? Cette action ne peut pas être annulée."
446+
"delete_project_confirm": "Voulez-vous vraiment supprimer ce projet? Cette action ne peut pas être annulée."
447447
},
448448
"form": {
449449
"update_button": "Projet de mise à jour",
@@ -471,7 +471,7 @@
471471
"title": "Jetons d’API",
472472
"text_1": "Avec ce jeton, vous pouvez effectuer des appels authentifiés à l’API d’Accent. Tous les tokens ont les permissions ’bot’ : synchroniser et ajouter des traductions. Vous pouvez spécifier des autorisations personnalisées pour avoir des jetons plus précis dans votre projet. Définissez le jeton sur <code>ACCENT_API_KEY</code> dans vos workflows d’actions GitHub à authentifier à l’aide d’accent-cli.",
473473
"revoke_button": "Révoquer",
474-
"revoke_confirm": "Voulez-vous vraiment révoquer le jeton ? Cette opération ne peut pas être annulée.",
474+
"revoke_confirm": "Voulez-vous vraiment révoquer le jeton? Cette opération ne peut pas être annulée.",
475475
"inserted_at": "Créé:",
476476
"create_title": "Ajouter un nouveau jeton d’API",
477477
"create_button": "Créer",
@@ -517,7 +517,7 @@
517517
"uninvite_button": "Supprimer l’invitation"
518518
},
519519
"integrations": {
520-
"title": "Service & intégrations",
520+
"title": "Service et intégrations",
521521
"help": "Les services sont des intégrations prédéfinies qui effectuent certaines actions lorsque des événements se produisent sur Accent. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.accent.reviews/guides/service-integrations.html\">Plus d’infos -></a>",
522522
"save": "Sauver",
523523
"cancel": "Annuler",
@@ -527,7 +527,7 @@
527527
"data": {
528528
"azure_storage_container_sas": "SAS URL",
529529
"aws_s3_bucket": "Nom du bucket",
530-
"aws_s3_path_prefix": "Préfix",
530+
"aws_s3_path_prefix": "Préfixe",
531531
"aws_s3_region": "Région",
532532
"aws_s3_access_key_id": "Access Key ID",
533533
"aws_s3_secret_access_key": "Secret Access Key",
@@ -552,13 +552,13 @@
552552
"text": "Publiez les notifications de votre projet dans Slack"
553553
}
554554
},
555-
"webhook_url_how": "Comment obtenir une URL de webhook ?",
555+
"webhook_url_how": "Comment obtenir une URL de webhook?",
556556
"events": {
557-
"title": "Quels événements souhaitez-vous déclencher ce webhook ?",
557+
"title": "Quels événements souhaitez-vous déclencher ce webhook?",
558558
"options": {
559559
"sync": "Synchroniser avec n’importe quelles modifications",
560560
"new_conflicts": "Nouvelles chaîne à réviser",
561-
"complete_review": "Le projet est revu à 100%",
561+
"complete_review": "Le projet est révisé à 100%",
562562
"integration_execute_azure_storage_container": "Fichiers téléversés sur Azure Storage Container"
563563
}
564564
},
@@ -569,7 +569,7 @@
569569
"error": "Une erreur s’est produite lors de la publication sur Azure. Veuillez vérifier vos informations d’identification et réessayer.",
570570
"push_button": "Publier",
571571
"bucket": "Nom du bucket",
572-
"path_prefix": "Préfix",
572+
"path_prefix": "Préfixe",
573573
"submit_confirm": "La publication de fichiers vers AWS S3 peut remplacer les fichiers existants si vous publiez la dernière version ou une version déjà publiée.",
574574
"target_version": {
575575
"label": "Version Cible",
@@ -713,7 +713,7 @@
713713
"title": "Nouvelle version",
714714
"text": "La création d’une version crée un instantané de toutes les chaînes actives (révisées ou non) pour être visible avec la certitude qu’il restera intact. Cela peut être utile lors de la maintenance de plusieurs versions de la même application.",
715715
"error": "Version invalide",
716-
"copy_on_update_translation_help": "Chaque fois qu'une traduction dans cette version est mise à jour, le même texte sera appliqué à la traduction source (dernière version). Cela garantira qu'un correctif dans la version sera également présent dans la dernière version sans aucune action requise de la part du développeur ou le traducteur.",
716+
"copy_on_update_translation_help": "Chaque fois quune traduction dans cette version est mise à jour, le même texte sera appliqué à la traduction source (dernière version). Cela garantira quun correctif dans la version sera également présent dans la dernière version sans aucune action requise de la part du développeur ou le traducteur.",
717717
"copy_on_update_translation_label": "Copie sur mise à jour de la traduction",
718718
"cancel_button": "Annuler",
719719
"name_label": "Nom:",
@@ -723,7 +723,7 @@
723723
"version_update_form": {
724724
"title": "Version de mise à jour",
725725
"error": "Version invalide",
726-
"copy_on_update_translation_help": "Chaque fois qu'une traduction dans cette version est mise à jour, le même texte sera appliqué à la traduction source (dernière version). Cela garantira qu'un correctif dans la version sera également présent dans la dernière version sans aucune action requise de la part du développeur ou le traducteur.",
726+
"copy_on_update_translation_help": "Chaque fois quune traduction dans cette version est mise à jour, le même texte sera appliqué à la traduction source (dernière version). Cela garantira quun correctif dans la version sera également présent dans la dernière version sans aucune action requise de la part du développeur ou le traducteur.",
727727
"copy_on_update_translation_label": "Copie sur mise à jour de la traduction",
728728
"cancel_button": "Annuler",
729729
"name_label": "Nom:",
@@ -770,9 +770,9 @@
770770
"versions_link_title": "Versions"
771771
},
772772
"lint_translations_page": {
773-
"empty_text": "Aucune avertissement ou erreur. Tout est bon!",
773+
"empty_text": "Aucun avertissement ou erreur. Tout est bon!",
774774
"add_lint_entry": {
775-
"ignore_checks_for_term": "Ignorer toutes les vérifications pour les mots",
775+
"ignore_checks_for_term": "Accepter les mots dans ce projet",
776776
"ignore_spellcheck_rule": "Ignorer la règle de vérification orthographique",
777777
"ignore_checks_for_key": "Ignorer toutes les vérifications pour la clé",
778778
"ignore_check_for_project": "Ignorer la vérification pour le projet"
@@ -828,9 +828,9 @@
828828
"revision_inserted_at_label": "Créé",
829829
"revision_deleted_label": "La langue est en cours de suppression de votre projet. Elle disparaîtra automatiquement une fois toutes les opérations propagées dans le système.",
830830
"master_badge": "principale",
831-
"delete_revision_confirm": "Voulez-vous vraiment supprimer cette langue de votre projet ? Cette action ne peut pas être annulée.",
831+
"delete_revision_confirm": "Voulez-vous vraiment supprimer cette langue de votre projet? Cette action ne peut pas être annulée.",
832832
"delete_revision_button": "Supprimer cette langue",
833-
"promote_revision_master_confirm": "Voulez-vous vraiment utiliser cette langue comme langue principale de votre projet ?",
833+
"promote_revision_master_confirm": "Voulez-vous vraiment utiliser cette langue comme langue principale de votre projet?",
834834
"promote_revision_master_button": "Utiliser comme principale"
835835
},
836836
"revision_export_options": {
@@ -944,9 +944,9 @@
944944
"LEADING_SPACES": "La chaîne contient des espaces de début",
945945
"DOUBLE_SPACES": "La chaîne contient des espaces doubles",
946946
"APOSTROPHE_AS_SINGLE_QUOTE": "Un guillemet simple a été utilisé à la place d’une apostrophe",
947-
"FIRST_LETTER_CASE": "La première lettre de traduction ne correspond pas à la casse de la langue principal",
947+
"FIRST_LETTER_CASE": "La première lettre de traduction ne correspond pas à la casse de la langue principale",
948948
"THREE_DOTS_ELLIPSIS": "La chaîne contient trois points au lieu de points de suspension",
949-
"SAME_TRAILING_CHARACTER": "La chaîne ne correspond pas au caractère de fin de la langue principal",
949+
"SAME_TRAILING_CHARACTER": "La chaîne ne correspond pas au caractère de fin de la langue principale",
950950
"SPELLING": "La chaîne contient une faute d’orthographe",
951951
"URL_COUNT": "Le nombre d’URL ne correspond pas à la chaîne principale"
952952
}
@@ -1141,7 +1141,7 @@
11411141
"translate_error": {
11421142
"unsupported_target": "La chaîne n’a pas pu être traduite : Langue non prise en charge {target}",
11431143
"unsupported_source": "La chaîne n’a pas pu être traduite : Langue non prise en charge {source}",
1144-
"unsupported_source_and_target": "La chaîne n’a pas pu être traduite : Langues non prise en charge {source} et {target}"
1144+
"unsupported_source_and_target": "La chaîne n’a pas pu être traduite : Langues non prises en charge {source} et {target}"
11451145
}
11461146
}
11471147
},

webapp/app/styles/components/lint-translations-page/add-lint-entry.scss

+12-1
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,16 @@
4444

4545
.title {
4646
display: flex;
47-
align-items: center;
47+
align-items: flex-start;
48+
line-height: 1.2;
4849
gap: 10px;
4950
font-size: 20px;
5051
margin-bottom: 14px;
5152
}
5253

5354
.title-icon {
55+
position: relative;
56+
top: 5px;
5457
width: 13px;
5558
height: 13px;
5659
opacity: 0.6;
@@ -72,6 +75,14 @@
7275
color: var(--color-primary);
7376
opacity: 0.8;
7477
font-weight: normal;
78+
79+
&::before {
80+
content: '';
81+
}
82+
83+
&::after {
84+
content: '';
85+
}
7586
}
7687

7788
.menu-button {

0 commit comments

Comments
 (0)