Gestion des formes plurielles dans les chaînes de localisation Activity Pub

J’ai remarqué quelques chaînes dans le plugin ActivityPub qui, à mon avis, nécessitent la pluralisation.

Le premier message d’un nouveau sujet sera publié %{delay_minutes} minutes après sa publication

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
Si delay_minutes est 1, il devrait dire « 1 minute ».

« Publier le message n° %{post_number} et le livrer aux abonnés des acteurs du groupe dans %{minutes} minutes. »

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
Identique à ci-dessus.

« Publier %{count} messages non publiés dans le sujet n° %{topic_id}. Les messages ne seront pas livrés aux abonnés des acteurs du groupe. »

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub

Si seulement 1 message n’est pas publié, vous diriez « Publier %{count} message non publié dans le sujet n° %{topic_id}. Le message ne sera pas livré aux abonnés des acteurs du groupe. »

« %{min_length} à %{max_length} lettres, chiffres, tirets ou underscores. »

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
Je pense que celui-ci dépend de max_length. Si max_length est 1, vous diriez « lettre, chiffre, tiret ou underscore ». Mais je ne suis pas sûr qu’il existe d’autres langues où min_length est également pertinent.

« Le nom d’utilisateur doit comporter de %{min_length} à %{max_length} lettres, chiffres, tirets ou underscores. »

discourse-activity-pub/config/locales/server.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
Identique à ci-dessus.

« %{count} sur %{total} messages de ce sujet sont publiés. »

discourse-activity-pub/config/locales/client.en.yml at a49ec5c4f5acac28bafbc1c57c57161c067e8f6e · discourse/discourse-activity-pub · GitHub
Celui-ci est un peu plus complexe car il dépend de deux variables : count et total. Par exemple :

  • 1 sur 1 message de ce sujet est publié
  • 1 sur 3 messages de ce sujet est publié
  • 2 sur 3 messages de ce sujet sont publiés
4 « J'aime »

Désolé pour le retard, Moin, ceci devrait répondre à la plupart des points : DEV: Update pluralization for some strings by pmusaraj · Pull Request #262 · discourse/discourse-activity-pub · GitHub

Pour ces deux-là, je laisse les chaînes telles quelles. Un site serait mal configuré s’il limitait les noms d’utilisateur à 1 caractère… pas besoin de changer.

1 « J'aime »

Qu’en est-il des sites avec un nom d’utilisateur de 11 caractères ? Il existe des langues où la version pour 1 est également utilisée pour 11. Et comment cela fonctionne-t-il pour les langues avec plus d’un pluriel si vous n’en proposez pas en anglais ? Les traducteurs peuvent-ils toujours saisir ces différentes versions plurielles ?

1 « J'aime »

Hmm, 11 serait-il considéré comme singulier dans ces langues ?

1 « J'aime »

Il existe des langues qui utilisent une version pour « un » sur les nombres se terminant par un. (Je ne suis pas sûr que 11 ait été le meilleur exemple). Et elles ont aussi plus de versions que « un » et « autre », donc même avec seulement des comptes différents supérieurs à 1, ceux-ci nécessitent des traductions différentes en fonction du compte exact.

L’allemand n’en fait pas partie, donc je suppose que certains de vos collègues en sauront plus que moi.

1 « J'aime »

J’ai un peu de mal avec la traduction : Est-ce que Discourse choisit le singulier et le pluriel en fonction de count ou de total ?
D’après ce que je comprends, c’est généralement count.
Mais je n’arrive pas à comprendre comment gérer le cas où count est 1 et total est 3. J’obtiens quelque chose comme « 1 of 3 post in this topic is published ». Je peux corriger cela en utilisant « posts » : « 1 of 3 posts in this topic is published ». Mais alors, cela ne fonctionne pas si total est 1. :exploding_head:

Peut-être avons-nous besoin de Message Format support for localization dans ce cas ?

C’est ce qu’on appelle l’anglais d’ingénieur. Une telle forme ne devrait jamais être utilisée. Ce devrait être quelque chose comme le/ce message est publié. Ou sujet si les messages suivants seront automatiquement publiés.

Situation similaire, en finnois en tout cas, le chiffre un (en fait tous les chiffres entre 0 et 9) doit être écrit, sans utiliser de chiffres. Mais le concept assez courant est d’écrire one au lieu de 1 et les plus grands sont des chiffres.

Quelque chose comme 1 post est toujours condamné à être utilisé par les développeurs anglophones, car ils sont trop paresseux pour utiliser un style humain - presque désolé de le dire à voix haute. Et plus généralement : c’est considéré comme une façon américaine d’utiliser ce style dans les en-têtes, les textes :smirking_face:

Il ne s’agit pas de paresse. L’utilisation du placeholder pour le nombre est très importante. Comme je l’ai expliqué plus haut, il existe des langues où l’on dit aussi « 21 post », tout comme on dit « 1 post ». Si le texte anglais utilisait « one » au lieu de %{count}, il serait très facile pour un traducteur de le traduire, et le nombre ne serait pas remplacé par le nombre réel, ce qui donnerait « one post » alors que le nombre est en fait 21.
Il y a donc une raison pour laquelle les nombres sont utilisés. Voir aussi : Always use %{count} variable when translating pluralized strings

D’ailleurs, c’est aussi très utile en allemand car cela évite des problèmes comme celui-ci.

J’ai du mal à croire que le codage soit à un niveau si bas qu’il soit impossible de remplacer %(count) par un mot lorsque %(count) = 1. Je suis à peu près sûr d’avoir déjà remplacé de tels espaces réservés par du texte brut lorsque la traduction locale offre des options différentes pour le singulier et le pluriel.

C’est ce que j’entends par paresse et anglais d’ingénieur. Sous le capot, il faut utiliser des variables et des espaces réservés, mais ceux-ci devraient être transformés en une forme lisible par l’homme et en langue maternelle. Après tout, ce sont les utilisateurs finaux, et non les ingénieurs, qui utilisent les logiciels…

Oui, je sais. C’est une question plus large et plus vaste que de simplement considérer comment traduire 1 sur 3... ou 1 sur 1.... Mais mon point le plus profond est qu’il ne devrait pas y avoir besoin de s’interroger sur de telles choses (en dehors des autres différences entre des milliards de langues).

Mais bien sûr, peut-être vivons-nous dans un monde où nous pouvons avoir des IA complexes, mais où il n’y a pas de solution pour éviter des situations comme 1 sur 1 :joy:

C’est assez hors sujet, car ce sujet portait sur l’autorisation de toute méthode permettant d’avoir une version singulière et plurielle différente pour ces textes.

Mais peut-être pourriez-vous remplacer 1 par « one » partout dans l’interface en anglais.
Cependant, cela ne fonctionnera pas aussi facilement en allemand. Le problème est qu’en allemand, le mot pour « un » change en fonction du cas, du genre et du rôle grammatical.

Par exemple :

  • Le sujet restera ouvert pendant un mois. → Das Thema ist noch einen Monat geöffnet.
  • Le sujet sera clos dans un mois. → Das Thema wird in einem Monat geschlossen.
  • Un mois s’est écoulé. → Ein Monat ist vergangen.

Ainsi, bien qu’il soit également courant en allemand d’écrire les nombres en toutes lettres, la gestion correcte de ce point est grammaticalement complexe.
Vous ne pouvez pas simplement remplacer le nombre « 1 » par le mot « eins », car cette forme n’est jamais utilisée avant un nom et la bonne forme du mot dépend du cas grammatical.

En d’autres termes, utiliser des mots au lieu de chiffres créerait beaucoup plus de travail pour les traducteurs.
Vous ne pourriez pas simplement utiliser un espace réservé comme %{duration} qui se développerait en « un mois », « une semaine » ou « un jour » dans tous les contextes.
Au lieu de trois durées et trois phrases, vous auriez besoin d’une version distincte pour chaque combinaison grammaticale possible, multipliant potentiellement la quantité de texte plusieurs fois.

1 « J'aime »

Merci pour le lien. Je vois en lisant le code et en regardant d’autres langues comme l’arabe que les langues peuvent fournir leurs propres remplacements même si la chaîne anglaise est la même dans les variantes. Par exemple, l’arabe a des règles distinctes lorsque le compte est de 2, et je vois two: utilisé dans des chaînes en arabe qui ne sont pas définies en anglais. Donc, pour 1/11, la langue qui a une règle peut fournir cette variante. Il n’est pas nécessaire de la définir en anglais d’après ce que je peux dire.

Merci d’avoir creusé cette question. Je n’ai pas le contexte pour cette chaîne, mais si vous souhaitez soumettre une PR avec la modification, je serai heureux d’y jeter un œil. Merci.

Pouvez-vous expliquer comment cela peut être fait dans Crowdin ?
Voici ce que je vois dans Crowdin si je veux traduire discourse_activity_pub.actor.warning.invalid_username en arabe

J’ai déjà vu le menu pour entrer les versions plurielles. Par exemple, pour js.user.password.too_short

Mais, d’après mon expérience, vous ne pouvez ajouter ces différentes versions que si les pluriels sont également définis en anglais.

Moi non plus. La dernière fois que j’ai examiné les textes d’ActivityPub, c’était en avril lorsque j’ai créé ce sujet. Maintenant, je remplaçais simplement les espaces réservés lors de la traduction, car sinon il est très difficile de choisir les mots. C’est à ce moment-là que j’ai remarqué que « 1 sur 3 post dans ce sujet est publié » me semblait faux - non seulement en allemand, mais aussi en anglais.