BL Les tokens de grammaire FR officiels dans Bannerlord

Users who are viewing this thread

Daneel53

Sergeant Knight at Arms
Bonjour,

Après notre décision d'arrêter de produire une VF bénévole suite à la sortie de la VF officielle dans la 1.7.0, je m'étais donné un travail d'hiver à faire : dresser la liste de tous les tokens de grammaire codés par TaleWorlds et utilisés dans la traduction officielle. Ce travail vient d’être terminé.

Pour le réaliser, j'ai décompilé le code de la dll TaleWorlds.Localization.dll (version 1.7.1) avec l'outil dnSpy v6.1.4, puis j'ai analysé le code afin de comprendre comment chaque token est traduit en fonction de ce qui suit.

J'ai écrit le résultat de mon analyse dans un document qui décrit et donne la liste de tous les tokens de grammaire française codés par TaleWorlds.
Vous y trouverez :
- Les tokens de genre et nombre {.M}, {.F}, {.S} et {.P}
- Les tokens d'article {.d}, {.a}, {.l}, {.dl}, {.cl} et {.c}
- Les tokens de majuscule/minuscule {._}, {.^} et {.%}
- Deux expressions spéciales.
Vous pouvez prendre le document avec le lien suivant : https://bit.ly/3I1TouZ

À utiliser sans modération par tous ceux qui veulent réaliser une version française des textes d'un mod de Bannerlord. :xf-smile:

Comme j'ai trouvé des bugs dans le code de transformation des tokens en fonction du genre de l'entité qui suit, je vais aussi utiliser le présent sujet pour vous en informer.

Par ailleurs si vous avez des questions concernant l'utilisation des tokens, vous pouvez me les poser ici ou me contacter en MP, comme vous préférez.
 
Last edited:
Au cours de mon analyse de code j'ai essayé de comprendre certains résultats très bizarres comme cette traduction du token {.dl} devant le village Etirfurd dans la phrase "Les terres autour des Etirfurd sont possédées pour la plupart par Derthert, roi des Vlandais" qui s'affiche quand on arrive à un village, en l’occurrence ici au village d'Etirfurd.

Cette phrase provient de std_TaleWorlds_CampaignSystem-fre.xml du module SandBox :
"Les terres autour {.d}{SETTLEMENT_LINK} sont possédées pour la plupart par {.l}{LORD.LINK}, {FACTION_OFFICIAL} {.dl}{FACTION_TERM}."

Pourquoi "des Etirfurd" alors qu'on attendrait plutôt "de" ou même "de l'" si Etirfurd est considéré comme non genré par le token {.dl}. Et d'autres exemples dans d'autres villages montrent aussi que souvent le token {.dl} devant {SETTLEMENT_LINK} est interprété avec un genre incohérent avec le contenu de la variable.

Je me suis lancé dans une longue session de debug grâce à dnSpy et j'ai fini par trouver un bug dans une des routines appelées par ProcessToken. Pour faire court, c'est le genre de la dernière variable de la phrase qui reste actif, donc ici celui de "Vlandais" qui est tagué masculin et surtout pluriel : "{.M}{.P}Vlandais".

Le bug se trouve dans la routine ProcessLink qui recherche le genre et le nombre d'une variable "link" qui est mise en couleur dans les textes pour signifier qu'on peut cliquer dessus pour aller voir dans l'encyclopédie. Dans cette phrase il y a trois links, même si le troisième n'est pas évident dans le texte : {SETTLEMENT_LINK}, {LORD.LINK} et {FACTION_TERM}. Les trois links sont d'abord tous interprétés pour trouver leur contenu, puis la phrase entière est balayée une seconde fois pour traiter les tokens et une nouvelle fois les links sont interprétés (oui, il y a beaucoup de redondances dans le code).
ProcessLink contient ce code :

Code:
    if (this._wordGroups.TryGetValue(key, out valueTuple))
    {
        this.SetGenderInfo(valueTuple.Item1);
        if (valueTuple.Item3)
        {
            this.SetPlural();
        }
    }
    ...
    return;

Traduction : Sachant que key contient le nom exact remonté dans la variable, on cherche dans le dictionnaire _wordGroups si ce mot possède un genre et un nombre (dictionnaire créé lors de la lecture des fichiers à chaque fois que des tokens de genre ont été trouvés).
Si oui, les deux valeurs sont renvoyées du dictionnaire via les champs Item1 et Item3 de valueTuple : on appelle SetGenderInfo qui donne à la variable globale _curGender le genre du mot contenu dans valueTuple.Items1 et si Item3 est true alors la fonction setPlural positionne la variable globale _isPlural à true.
Si non... on ne fait rien.
Puis on termine la routine.

Donc là que se passe-t-il ? Quand la première passe sur la phrase interprète "Vlandais", elle donne aux deux variables globales _curGender et _isPlural les valeurs Masculin et Pluriel de "Vlandais", normal. Puis, dans la deuxième passe, lors de l'interprétation du premier token [.dl}, elle appelle à nouveau ProcessLink pour "Etirfurd". Comme tous les noms de ville et de village, Etirfurd n'est pas genré, donc il n'est pas dans le dictionnaire _wordGroups, donc ProcessLink ne fait rien... et la variable _isPlural reste à true. En conséquence de quoi Etirfurd se voit affublé d'un "des" lors de l'interprétation de son {.dl}. CQFD !

Pour en avoir le cœur net, j'ai utilisé les fonctions d'édition de dnSpy et j'ai modifié le code de la façon suivante :
Code:
    if (this._wordGroups.TryGetValue(key, out valueTuple))
    {
        this.SetGenderInfo(valueTuple.Item1);
        if (valueTuple.Item3)
        {
            this.SetPlural();
        }
    }
    else
    {
        this._curGender = FrenchTextProcessor.WordGenderEnum.NoDeclination;
        this._isPlural = false;
    }

Autrement dit, quand le mot n'est pas genré, j'initialise les deux variables globales à "pas de genre" et "pas pluriel".
Puis j'ai demandé à dnSpy de recompiler la dll , je suis allé la mettre dans le jeu à la place de l'originale, j'ai relancé le jeu, je suis allé à Etirfurd et il s'est affiché ceci : "Les terres autour de l'Etirfurd sont possédées...", ce qui l'interprétation correcte d'un mot au singulier commençant par une voyelle dans le code de traitement de {.dl}. Le bug est bien corrigé !

Bon, d'accord, l'article n'est toujours pas correct, mais là c'est parce que le token utilisé dans ce cas n'est pas le bon. Comme vous pouvez le voir dans mon document, le token {.dl} est fait pour générer un article du type "de la", "du" (de le), "des" (de les) ou "de l'". Donc ici il faut en réalité utiliser le token {.d}. J'ai bien entendu fait l'essai : j'ai mis {.d} à la place de {.dl}, j'ai relancé le jeu et cette fois la bonne syntaxe est enfin sortie : "Les terres autour d'Etirfurd sont possédées...".

Soit dit en passant, je soupçonne aussi un autre bug potentiel lié au pluriel. On voit que le code appelle setPlural si le Item3 remonté indique le pluriel, mais dans le cas contraire on ne met pas la valeur "pas pluriel". Un pluriel pourrait donc rester actif même si le mot trouvé dans le dictionnaire indique qu'il ne l'est pas.
Il faut donc en fait mettre les deux lignes que j'ai ajoutées avant la recherche dans le dictionnaire _wordGroups pour être certain que le résultat soit toujours correctement adapté au mot recherché :

Code:
    this._curGender = FrenchTextProcessor.WordGenderEnum.NoDeclination;
    this._isPlural = false;
    if (this._wordGroups.TryGetValue(key, out valueTuple))
    {
        this.SetGenderInfo(valueTuple.Item1);
        if (valueTuple.Item3)
        {
            this.SetPlural();
        }
    }

Soit :
Par défaut, mot non genré au singulier.
Si on le trouve dans le dictionnaire, on met son genre dans _curGender et on passe _isPlural à vrai si nécessaire.

J'ai posté un rapport de bug dans le forum de TaleWorlds : https://forums.taleworlds.com/index.php?threads/bug-for-the-first-token-of-a-sentence.450327/

En attendant, moi je joue avec une dll corrigée ! Si certains sont intéressés pour la récupérer, contactez-moi.
 
Last edited:
Comme il y a énormément d'erreurs d'articles dans la VF officielle, j'ai voulu répertorier dans les fichiers tous les exemples de tokens mal utilisés, c'est-à-dire ceux qui sont inutiles, pas les bons ou dont une majuscule a été oubliée.

J'ai commencé mais je me suis bien vite arrêté devant les phrases d'introduction des héros dans l'encyclopédie qui sont quasiment toutes totalement erronées, comme celle-ci :
index.php


Cette phrase vient de std_TaleWorlds_CampaignSystem-fre.xml:
id="9Obe3S6L" text="{.L}{LORD.FIRSTNAME} fait partie {.dl}{CLAN_NAME}, {CLAN_DESCRIPTION} des terres {.dl}{FACTION_NAME}. {?LORD.GENDER}Elle{?}Il{\?} a la réputation d'être {REPUTATION}."

On voit que les trois tokens, {.L}, et les deux {.dl} de la première phrase sont traduits par des articles erronés puisque la bonne phrase devrait être "Agdil fait partie du Peuple de la forêt, un clan nomade des terres des Sturgiens."

Je soupçonne une permutation circulaire entre les tokens et les genres des variables : genre 3 pour token 1, genre 1 pour token 2 et genre 2 pour token 3. C'est donc un deuxième bug mis à jour dans le code d'interprétation des tokens car j'ai comparé : que je lance une nouvelle partie avec la dll d'origine ou celle qui corrige le bug dont j'ai parlé dans mon message précédent, le résultat est exactement le même.
Cette fois le code est exécuté durant l'initialisation d'une nouvelle campagne, au moment où les personnages sont créés aléatoirement. Les phrases d'introduction sont créées en même temps et stockées toutes faites car, j'ai vérifié, on ne passe pas par ProcessToken pour afficher cette phrase quand on consulte l'encyclopédie durant le jeu.

J'ai là aussi créé un rapport de bug sur le forum de TW : https://forums.taleworlds.com/index...otally-wrong-in-introduction-sentence.450341/

Il n'y a plus qu'à attendre la correction...

Édit du 23 février :
Un dev de TaleWorlds a mis un message hier dans mon premier rapport de bug pour me remercier des explications détaillées et il m'a assuré qu'il s'attaquait à la résolution des bugs présentés dans les deux rapports. Nous ne devrons peut-être pas attendre trop longtemps avant la sortie d'une dll corrigée dans le jeu...
 
Last edited:
Quand je veux vérifier que les articles sont corrects, la première chose que je fais, parce que c'est facile avec une toute nouvelle partie, c'est aller dans la taverne de la ville la plus proche (généralement Poros) et discuter avec les clients. En effet, la plupart des phrases prononcées par ceux-ci font appel à des tokens d'article et certaines avec des items affichés avec la fonction PLURAL. Je me souviens que mettre au point ces phrases avec tous les items différents pouvant être cités nous avait pris pas mal de temps, c'est donc une bonne source pour trouver des erreurs.

Et ça n'a pas manqué ! J'ai repéré deux phrases où il y a systématiquement un article manquant.

index.php


Il y a deux problèmes qui conduisent à l'absence de "la" devant poterie. Le plus évident : il n'y a pas de token {.l} dans la phrase devant {SHOP_TYPE}, donc évidemment il n'y a pas d'article généré. Mais même après avoir ajouté le token, ça ne fonctionne toujours pas parce que les ateliers n'ont pas de genre dans SandBox /.../std_spworkshops_xml-fre.xml :
id="Tj7ErPfn" text="Poterie"

Il faut donc mettre un genre dans tous les ateliers de ce fichier, comme par exemple pour la poterie :
id="Tj7ErPfn" text="{.F}{.S}Poterie"

Ces deux choses faites, le français devient enfin correct :

index.php


Il y a trois phrases de recrutement où il faut ajouter un token {.l} et 13 ateliers où il faut ajouter les tokens de genre. Vous trouverez tous les détails et les corrections à effectuer dans le rapport de bug que j'ai posté hier soir :
https://forums.taleworlds.com/index...ing-in-shop-type-sentences-in-taverns.450385/

Deuxième phrase où il manque systématiquement un article devant l'item qui se vend bien :

index.php


Cette fois le token {.l} est bien en place dans SandBox/.../std_SandBox-fre.xml :
id="rTrGXB1o" text="Oui... On raconte que {.l}{._}{ITEM_NAME} se vend bien {.cl}{TOWN_NAME}...

Mais là le problème c'est que l'article appelé est un item qui possède un Plural, et ces items, au contraire de tous les autres dans SandBoxCore/.../std_spitems_xml-fre.xml, n'ont pas eu de genre :
id="WSk5Sibs" text="Fromage{@Plural}caisses de fromage{\@}"

Il faut donc ajouter un genre aux 33 items de Native/.../std_module_strings_xml-fre.xml et SandBoxCore/.../std_spitems_xml-fre.xml qui en contiennent (les ID sont les même dans les deux fichiers, mais c'est module_strings qui est lu en premier), comme par exemple pour le fromage :
id="WSk5Sibs" text="{.M}{.S}Fromage{@Plural}caisses de fromage{\@}"

Ces ajouts faits, la phrase redevient sympathique à lire :

index.php


Tous les détails et les 33 corrections à effectuer sont décrits dans le deuxième rapport de bug que j'ai posté hier soir :
https://forums.taleworlds.com/index...es-in-sells-well-sentences-in-taverns.450386/
 
Last edited:
Back
Top Bottom