JeuWeb - Crée ton jeu par navigateur
Multi-linguisme pour Dracca - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Multi-linguisme pour Dracca (/showthread.php?tid=8259)



Multi-linguisme pour Dracca - Xenos - 09-10-2020

Salut,

d'abord, ahah, vu que j'ai ramené tous les articles du wiki dans cette section, on dirait que je suis le seul à poster x)

Pour revenir sur le sujet initial, j'ai un jeu, Dracca, qui a vocation a être en anglais et en français. Pourquoi? Parce que je connais des anglophones et des francophones que le jeu pourrait intéresser, donc, j'aimerai bien avoir la présence des deux dans le jeu, histoire d'avoir une audience un peu large.

Du coup, je me demande comment mettre cela en place... Pour les textes de base, ça va: j'ai simplement créer une méthode Html::fren('texte francais', 'texte anglais'); et je peux facilement faire ma traduction (la langue étant sélectionnée à partir de la langue choisie dans les options du compte, ou du Accept-Language si l'utilisateur n'est pas connecté).

J'aurai pu faire comme décrit ici https://jeuweb.org/showthread.php?tid=5876 mais je trouve que les fichiers de constantes ou de strings i18n ne sont pas souples pour certains textes (pluriels par exemple). Alors, certes, dans mon cas "mais si tu veux rajouter de l'allemand t'es tout coincé?". Sauf qu'alors, je créerai un Html::frende('francais', 'anglais', 'allemand'); et traduirait le jeu petit à petit. Et si "ouais mais tu parles pas allemand: comment tu vas faire?", alors je n'aurai qu'à extraire (regex/parser/osef) les textes existants du code pour les donner à un allemand puis les réintégrer.

Mais au final, là n'est pas le problème. Car tout cela, c'est joli, ça marche bien, mais maintenant, quid des noms des lieux? Du nom des items? (le noms des personnages, limite, ce n'est pas traduis, donc admettons qu'on l'ignore)?

Par exemple, le nom des stats du personnage (intelligence, force, rapidité...) est actuellement dans la DB, le français dans une colonne l'anglais dans l'autre. Idem pour les éléments (feu, eau, air...) ou les lieux (cuisine, caverne, grotte, ville de Truc...). Mais je trouve ça lourd car il faut envoyer à la DB (tout étant sous forme de procédure stockée) la langue de l'utilisateur, et faire un SELECT ... IF(lang = 'fr', colonne_nom_fr, colonne_nom_en) AS nom.

Alors, auriez-vous des idées ou des suggestions d'autres mécanismes de traduction?

L'alternative que j'envisage, somme toute très simple, c'est sinon de dire "prout, je mets tout en anglais: simple, facile, et suffisant". Les francophones suivront (car je sais que mes anglophones ne parlent pas français, mais mes francophones sauraient jouer sur un jeu en anglais)...


RE: Multi-linguisme pour Dracca - Thêta Tau Tau - 09-10-2020

Pour mon projet sur unity j'utilise un plugin qui s'utilise avec une fonction GetTranslationText(name, fallback). C'est basique mais ça me suffit.
Les traductions sont dans des fichiers textes au format "texte de base=texte traduit". Le plugin détecte automatiquement le langage de l'utilisateur et charge le fichier correctement. Il y a également possibilité de "traduire" des assets, comme des sons (doublage) et des images.

Le pluriel n'est pas géré, j'ai deux traductions différentes pour chaque truc que je peux mettre au pluriel. Par exemple "A cow" et "{1} cows". C'est pas ultra pratique mais au final je n'ai besoin de gérer le pluriel qu'à un ou deux endroits donc ce n'est pas gênant.

Si je me souviens bien quand j'avais regardé les libraries i18n pour le web (il y a des années) il y en a certaines qui gèrent les pluriels.

Si je devais faire une solution maison avec des technos web, en BDD je ferrais une table avec 3 colonnes : texte de base (utilisé comme id), langue et traduction, plutôt que de faire une colonne par langage. Ou alors je ferrais côté client avec en mettant les traductions dans un fichier json ou autre.


RE: Multi-linguisme pour Dracca - Xenos - 09-10-2020

Ce qui me gène avec le JSON ou assimilé, c'est que dans certains cas, le nom d'un objet peut ne pas être connu (ou pourquoi pas, partiellement: l'objet s'appellerait "épée", alors qu'avec quelques infos de plus, on saurait qu'il s'agit en fait de "l'épée du Soleil" ou "le Glaive de Sommer" finalement). Ce sont surtout ces textes-là pour lesquels j'hésite au niveau de la structure...

La colonne avec le texte de base & les traductions peut aussi être une piste, mais se pose alors le soucis de la jointure entre l'objet et sa traduction... il sera alors forcé de passer la langue de l'utilisateur à la DB pour qu'elle en tire le bon texte. C'est en fait surtout ce principe là (devoir passer la langue de l'utilisateur a la DB) qui me gène, mais je ne sais pas trop comment le contourner... Je trouve ça "pas naturel" de passer ce genre d'info, qui a plus trait à l'affichage qu'à la logique de jeu.

Je vais peut-etre essayer de voir si je peux mettre ces infos hors DB du coup, dans une classe dédiée qqc du genre, et récupérer le texte d'affichage à partir de l'id de l'objet, un truc du genre (et de son éventuel "statut": est-ce qu'on sait réellement ce que c'est ou pas).


RE: Multi-linguisme pour Dracca - Thêta Tau Tau - 09-10-2020

(09-10-2020, 01:42 PM)Xenos a écrit : Ce qui me gène avec le JSON ou assimilé, c'est que dans certains cas, le nom d'un objet peut ne pas être connu (ou pourquoi pas, partiellement: l'objet s'appellerait "épée", alors qu'avec quelques infos de plus, on saurait qu'il s'agit en fait de "l'épée du Soleil" ou "le Glaive de Sommer" finalement). Ce sont surtout ces textes-là pour lesquels j'hésite au niveau de la structure...

Je ne vois pas trop où est le problème.

Le fichier ressemblerait à ça (au format que j'utilise) :
Code :
sword=épée
sword_sun=épée du Soleil
sword_sommer=glaive de Sommer

En HTML+js on peut imaginer par exemple un truc du genre :
<p localization-id="sword_sun">Sword of the sun</p>
Et un script js qui remplace le texte par défaut "Sword of the sun" par la chaine correspondant à l'attribut "localization-id" dans le fichier (ici "Epée du Soleil").

Côté serveur avec un moteur de template on doit pouvoir faire un truc similaire aussi.


RE: Multi-linguisme pour Dracca - Xenos - 10-10-2020

Ah, oui, fait côté serveur, en effet ça me va (je pensais que tu voulais le faire côté client, en laissant le client DL le JSON et en faisant les remplacements).
Je vais essayer de voir comment je structure ça... Le JSON me déplait un peu (langage supplémentaire & id intermédiaire). Je pense que je vais procéder ainsi:
- La DB me retournera l'ID de l'objet, du lieu, etc, ainsi qu'un éventuel "niveau de connaissance du nom" (0 = pas connu du tout, 5 = connu etc)
- Côté PHP, je renverra alors la balle à une classe dédiée, type Place::localize($idPlace, $niveauConnaissanceOrNull)
- Et ça me ressortira le nom localisé en se servant de la langue de l'utilisateur (que je pioche dans Place::localize via Cfg::lang qui est un singleton)


RE: Multi-linguisme pour Dracca - Thêta Tau Tau - 10-10-2020

Le niveau de connaissance je ne gérerais pas ça au niveau de la localisation.
Tu vas avoir différents objets avec le même nom quand on les connais pas ("sword"), ça serrais con de dupliquer la traduction, et tu vas aussi avoir plein de trucs qui n'auront pas ce niveau de connaissance.


RE: Multi-linguisme pour Dracca - Xenos - 11-10-2020

Sauf si j'affecte ces notions de "connaissances" par un autre biais, du style "propriétés". Genre le Glaive de Sommer a comme propriété connue d'être une Epée, et donc, d'être qualifiée comme tel. Si on sait qu'il s'agit d'une épée avec des propriétés magiques, cela pourrait devenir une "Epée magique". Si on sait uniquement qu'elle est magique, ce serait un "Objet magique"... Mais ca sera peut-etre complexe à gérer un tel niveau de granularité...

Après, le "niveau de connaissance" ne serait pas "géré" par la localization: c'est juste qu'au lieu de localizer en PHP via l'identifiant de l'item, je localise via l'identifiant et le niveau de connaissance. Celui-ci reste dans la DB, et en est sorti comme une propriété de l'objet, qui est ensuite traduite pour l'affichage par la localisation.

En fait, ce qui me gène, c'est vraiment que je vois le nom de l'objet comme un élément d'affichage, et non une propriété de l'objet, et ça me titille de laisser ce genre de chose dans la DB x)