JeuWeb - Crée ton jeu par navigateur
[PHP] Comment gérer les langues dans un jeu multijoueur ? - 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 : [PHP] Comment gérer les langues dans un jeu multijoueur ? (/showthread.php?tid=3928)

Pages : 1 2 3


[PHP] Comment gérer les langues dans un jeu multijoueur ? - cipic - 25-04-2009

Bonjour à tous,

je connais des bases en pHp/MySQL et XHTML/CSS ainsi qu'en conception de bdd.

je souhaite developper un rpg multijoueur en ligne avec le jeu traduit en diverses langues, et possibilité de rajouter 'facilement' une langue de plus si besoin.

j'ai essayé avec des bdd relationnelles mais ça devient vite une usine à gaz.

selon vous, quelle est la meilleure manière de gérer le problème ?


RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - madri2 - 25-04-2009

des constantes
et un fichier contenant la définition des constantes par langue


RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - Zamentur - 25-04-2009

Une classe qui gère tes langues (ou alors gettext mais çà ecarte l'hébergement mutualisé)

Voici une classe text simplifié en php4:
Code PHP :
<?php
/**
* Fichier de classes text
*
* Ce fichier à pour but de fournir des objets permetant de
* gérer les problèmes de localisation et de gestion des
* textes dans un codes.
*
* @author LJF alias Zamentur
* @version 0.1 with php4.3
* @package ljf_framework
* @copyright Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*/

/**
* La classe text ici réduite pour php4 permt de centraliser
* les texte et de gérer leur internationalisation
* @subpackage core
*/
class text {
var
$lang;
var
$text_loaded;

/**
* Demande l'objet text correspondant à une langue ou le créé si inexistant
* @static
* @param (string) $lang : chaine de moins de 3 caractères décrivant la
* langue dans le système de gestion des textes
* @return (text) Retourne l'objet text correspondant à une langue ou le
* créé si inexistant
*/
function &get_instance($lang=Null) {
static
$instance=array();
global
$conf;

if (
is_Null($lang)) $lang=$conf->__get('general__default_lang');

if (!isset(
$instance[$lang]) || !is_a($instance[$lang],'text'))
if (
is_dir(URI_ROOT.'lang/'.$lang.'/'))
$instance[$lang]=&new text($lang);
return
$instance[$lang];
}


/**
* Construit l'objet text dans la langue spécifié
* @access private
* @param (string) $lang : chaine de moins de 3 caractères décrivant la
* langue dans le système de gestion des textes
* @return (text): créer un objet texte
*/
function text($lang) {
$this->lang=$lang;
if (
defined($this->lang.'_text_singleton_locker'))
error('g_error__singleton');
define($this->lang.'_text_singleton_locker', true);
}

function
__get($name) {
return
$this->get($name);
}

/**
* Renvoie le texte correspondant à une idée dans la langue de l'objet
* appelant
* @param (string) $name Identifiant permetant de localiser une idée
* dans le systèle de fichier lang
* @param (mixed)[$arg1,[...,[argn : Paramètre tierce de l'idée
* @return (string) Renvoie le texte correspondant à l'idée
*/
function get($name) {
$liste_args = func_get_args();
$sentence = $this->load_text(array_shift($liste_args));

return
vsprintf($sentence,$liste_args);
}


/**
* Charge le texte correspondant à une idée dans la bibliothèque de sens si
* il est absent
* @access private
* @param (string) $name : Identifiant permetant de localiser l'idée dans le
* système de fichier lang
* @return (array|string) : Renvoie une phrase dynamique dans laquel pourra
* être inséré éventuellement des paramètres
*/
function load_text($name) {
$data=explode('__',$name);
if (!isset(
$this->text_loaded[$data[0]])){
$url=URI_ROOT.'lang/'.$this->lang.'/'.$data[0].'.'.$this->lang.'.lang.php';
$this->text_loaded[$data[0]]=require_once($url);
}
return
$this->text_loaded[$data[0]][$data[1]];
}

}
NB: il faut remplacer $conf->__get('general__default_lang') par la langue par défaut et définir URI_ROOT comme chemin au répertoire de base

Un fichier langue ressemble alors à çà:
lang/fr/mes_text.fr.lang.php
Code PHP :
<?php
$result
=array();
$result['connect']='Vous êtes connecté sous %s';
$result['connect_failed']='La connexion à échoué!';
$result['disconnect']='Vous êtes maintenant déconnecté!';
$result['register_ok']='Inscription réussie!';
$result['register_failed']='L\'inscription à échoué';
$result['connect_action']='Me connecter!';
$result['disconnect_action']='Me déconnecter!';
$result['attack']='%s vous attaque!';

return
$result;

Et pour les récupérer:
Code PHP :
<?php 
$text
=&text::get_instance();
echo
$text->get('mes_text__attack',"Zamentur");
//Donneras Zamentur vous attaque!

On peut aussi transformer la classe pour avoir une utilisation en php5 du style:
Code PHP :
<?php 
$text
=text::get_instance();
echo
$text->mes_text__attack("Zamentur");
echo
$text->mes_text__disconnect;
Avec les fonctions magiques call et __get

Pour ajouter une langue il suffit juste de créer un dossier avec le diminutif de la langue et comportant les même fichier mes avec les textes traduits. Pour obtenir les variable de cette langue il faut utiliser l'objet retourné par text::get_instance($diminutif_lang);

NB: sinon il y a bon nombre de framework qui propose ce genre de chose, cakephp, etc... Ca permet d'éviter de refaire la roue comme ci dessus Smile


RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - wild-D - 26-04-2009

faut aussi savoir ton jeu c'est quel style ?

C'est juste un jeu solo ? parce que les 2 solutions proposées le font pour la langue d'interface.

Par contre pour les interaction libre entre joueurs (tchater, mp, ... en fait ce que tu veux) si un francophone pur, tombe sur un allemand pur la discussion va tourner court. Dans ce cas là de forte chance que tu devras gérer aussi la langue au niveau de la bdd (par table, ou flag), tu pourras pas y échapper. (parce que te retrouver incapable de discuter avec ton interlocuteur ça casse quand même un peu l'ambiance Tongue... à moins de faire comme dans la vrai vie; "chacun son pays" et libre à toi d'aller visiter les pays voisin et si tu connais pas la langue t'assume ^^)


RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - Zamentur - 26-04-2009

Pour çà une piste peut être de aire des phrases prêt faite afin d'aider les joueurs à communiquer entre eux.
Du genre le joueur français sélectionne bonjour (ou salut) et çà répond dans la langue de l'autre par exemple anglais hello (ou hi).

C'est un moyen assez sommaire, mais si il y a quand même quelques phrases çà peut briser la glace...


RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - jo_link_noir - 26-04-2009

On peut utiliser un traducteur aussi, j'pense à l'api de google mais c'est le seul que je connais.


RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - cipic - 26-04-2009

merci à tous pour vos réponses, je vais étudier ça !

pour info c'était plutôt un problème d'interface :

je souhaite que les descriptions des divers objets, lieux, missions etc. ainsi que l'interface des menus puisse changer facilement en fonction de la langue utilisateur.

je ne suis pas encore très doué en POO j'étudie ça depuis ce matin Big Grin mais c'est l'occasion de s'améliorer.

mon but va donc être de lier ma bdd de personnages, lieux, objets à ces fichiers langues.

je reviendrai bientôt je pense ^^


RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - cipic - 26-04-2009

arf je ne comprends pas bien le code... jme sors pas de

Fatal error: Call to a member function mes_text__attack() on a non-object in /Applications/MAMP/htdocs/lang/appel.php on line 7


concernant :
echo $text->mes_text__attack("Zamentur");



RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - Zamentur - 26-04-2009

Normal
Il faut utiliser cette syntaxe là:
Code PHP :
<?php 
$text
=&text::get_instance();
echo
$text->get('mes_text__attack',"Zamentur");
//Donneras Zamentur vous attaque!

Car cette classe je l'ai faite pour du php4 à la base, cependant tu peux rajouter dedans
Code PHP :
<?php 
public function __call($name,$arguments) {
return
call_user_func_array(
array(
$this,'get'),
array_merge(array($name), $arguments)
);
}

Pour avoir en prime l'effet suivant avec php5
Code PHP :
<?php 
$text
->mes_text__attack("Zamentur");

D'ailleurs avec php5 je te conseille de définir les private et public devant les méthodes afin d'assurer la bonne utilisation de l'objet! Tu peux notamment mettre le constructeur en private... Puisqu'il faut passer par get_instance


RE: [pHp] Comment gérer les langues dans un jeu multijoueur ? - Holy - 26-04-2009

Bête réflexion, mais avant de commencer à penser "traduction", plusieurs langues, tout ça, essayez déjà d'avoir une base solide en une seule langue. Pour ma part, sauf équipe professionnelle, je n'ai jamais vu de sites amateurs en plusieurs langues (ça n'a d'ailleurs souvent qu'un intérêt limité).