Localisation - Plusieurs langues dans un univers ?

Répondre
Partager Rechercher
Salut à tous,

Alors que le développement de Seelies (un jeu par navigateur) est en cours, j'ai, en développant le système de localisation, eu une idée sur laquelle je voudrais avoir votre avis.

Je rappelle très rapidement le contexte : dans Seelies, le joueur en tant qu'individu est au second plan : tout se fait par des groupements de joueurs en petites communautés appelées Vols (comme un vol d'hirondelle, mais avec des Seelies). Chaque joueur joue une Seelie dont le signe influe sur sa façon de servir son Vol. [En savoir plus...] (attention, on déménage beaucoup au niveau des serveurs ).

Le jeu sera disponible dans plusieurs langues (le système fait qu'il est simple d'ajouter des traductions aux éléments, qu'ils soient statiques (interface du jeu) ou dynamiques (noms des objets en base de données). La gestion de la communauté s'est donc posée très tôt. J'ai envisagé la possibilité de mettre les joueurs ensembles sans distinction de langue ainsi que la possibilité de les dissocier complètement quand m'est venue une autre approche.

Cette approche différente placerait en fait des zones de départ pour chaque langue supportée par le jeu, en restant donc dans un univers commun à tous les joueurs.
Chaque communauté évoluerait donc indépendamment des autres. Cela pourrait se faire par l'utilisation de continents. L'idée est de poser des barrières entre les communautés, et de permettre aux joueurs de les briser en s'y mettant de chaque côté.

On pourrait par exemple imaginer deux continents (l'un accueillant les francophones et l'autre des anglophones) séparés par une immense chaîne de montagnes, infranchissable en l'état. Un chantier pourrait alors être entrepris de part et d'autre de ces montagnes pour faire un pas l'un vers l'autre. Cela se ferait au moyen d'un travail colossal dans les deux camps, un genre d'effort commun où il faudrait bien plus qu'un ou deux Vols, mais des dizaines de part et d'autre. Chaque Vols devrait alors déployer les bêtes qu'il dresse pour creuser des galeries, fournir des matériaux pour les rendre praticables, les maintenir, etc. Le tout nécessitant un investissement permanent, engendrant de lourds coûts d'entretien qui pourraient être compensés (bien que la démarche de contact des deux communautés doit avant tout être volontaire) en introduisant des ressources dans un continent et pas dans l'autre.


Voilà pour les grandes lignes, j'attends vos réactions avec impatience.



Sephi-Chan
Je vais apporter ma maigre contribution:
Sur papier ton idée est pas mal, mais il ne faut pas ignorer le fait que le joueur est fainéant de nature. Donc pour ce qui est du travail colossal, faudrait revoir ca.

En suite faut savoir que les joueurs se regroupent pratiquement toujours par guilde d'une même nationalité (ou même langue).
J'ai pu constaté ca à plusieurs reprises dans différent mmorpg.

Je vais prendre l'exemple de Guild Wars (si vous plait on va éviter l'éternel débat du Mmorpg ou pas, ca j'm'en fiche j'veux juste parler du jeu). Ce jeu comprend différent district pour chaque pays, il suffisait d'un clic pour changer de district et se retrouver avec des Allemands/espagnols/etc... Et malgré cela on ne se mélangeait jamais (sauf le soir de la huitième de finale France/Espagne de la coupe du monde de foot, où les francais c'étaient amusé à aller sur le district espagnol pour foutre leur bordel à coup de "ZIDAAAAAAAAAAAAAAAAANE" )
Justement, le travail colossal est là pour fermer les barrières à moins que chaque camp n'ai la volonté de rencontrer l'autre. Qu'ils restent chacun dans leur coin de me dérange absolument pas : c'est juste une possibilité qu'on leur offrirait.

Sinon, les français de Guild Wars dont tu parles ont l'air super intelligents .



Sephi-Chan
Si le RvR est possible dans ton jeu, se pose alors le problème de la taille des communautés.
Que va donner ton jeu si les français sont 6 fois moins nombreux que les anglophones (ou inversement) ?
Dans un système classique, tu peux inciter les nouveaux arrivants à s'engager dans la faction qui manque de bras. Mais là tu n'auras pas cette possibilité.
Question technique en passant, comment fais-tu concrètement pour gérer les langues dans les textes statiques de tes scripts ?
Tu les puises dans une BDD ? Un fichier XML ? Tu passes par quel type de variable (session, tableau...) ?

Dans ta BDD, tu gères les langues de quelle manière ?

Jusqu'à présent j'ai testé plusieurs techniques mais rien qui ne me satisfasse réellement. Je trouve que cela manque toujours de souplesse...
Les affrontements de Seelies se font à l'échelle des Vols, pas des régions/continents.

En ce qui concerne, les traductions, j'utilise un fichier JSON par langue contenant les traductions statiques. Ils sont placés dans un dossier localisation/ lui même placé à la racine.

J'ai ensuite une classe Localisation.class.php qui convertit cet objet JSON en un tableau PHP. Celui-ci sera, à terme, placé dans la RAM du serveur grâce à APC ou Memcache (je choisirais après avoir testé les deux). L'autre solution que j'envisage (si je n'utilise pas l'une des deux précédemment citée) est de mettre en cache dans des fichiers HTML les portions de pages directement utilisables.

Ma vue fait ensuite appel à la méthode Localisation::localize($label), qui renvoie le mot $label dans la langue demandée.

Si tu veux, tu peux voir les sources du projet ici sur [Wiki Seelies] Sources. J'ai mis à jour les fichiers concernant la localisation.

En base de données, pour chaque table demandant des traductions, je crées une table portant le même nom avec le suffixe _localisation qui contient l'identifiant unique du champ à traduire et les différents termes à traduire, ainsi qu'une locale.

Par exemple, on peut imaginer une table objets possédant des champs id et nom avec un contenu genre :
objets
Code:
id : nom 
1 : Couteau
2 : Bouclier

La table objets_localisation contiendrai alors les colonnes id, nom et locale.
Code:
objets_localisation
id : nom : locale
1 : Knife : en
1 : Messer : de
La requête permettant de récupérer le contenu dans la langue qui me convient ressemble à ce qui suit. C'est totalement transparent à l'utilisation du jeu de résultat (la langue par défaut du jeu est ici le français, qui sera utilisé si le mot n'est pas localisé).

Code:
$query = sprintf(
	"SELECT		O.id,
			IF(O2.nom IS NULL, O.nom, O2.nom) AS nom
	FROM		objets O
	LEFT JOIN	objets_localisation O2
	ON		O.id = objets_localisation.id 
	AND		O2.langue = '%s';",
	$_SESSION['localisation']
)
Désolé pour cet aparté.


Sephi-Chan
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés