Développement d'un site multilingue, ma méthode.

Nouveau WRInaute
Bonjour,

Voici une petite participation au forum. Il s'agit plus d'une aide au développement plus qu'au référencement - Encore que cela reste étroitement liée.

Pour tout ce qui concerne les textes de mon site, je n'utilise qu'un seul fichier texte dit "String Table" que je place dans un répertoire (Ex. : french.lng). Sa structure est la suivante :

IdentifiantA5Chiffres, "Texte" (Ex. : 10000, "Accueil")

A chaque nouvelle entrée, j'incrèmente mon identifiant unique.
Ensuite pour afficher le texte sur ma page, j'utilise une petite fonction de lecture de ce fichier texte; en passant comme paramètre l'identifiant du texte que je souhaite afficher

Code:
function f1($idString = null, $directory = null) {
	$Buffer = @file($directory);
	$i = 0;
	while ($i <= sizeOf($Buffer) - 1) {	
		$stringID = substr($Buffer[$i], 0, 5);
		$stringValue = substr($Buffer[$i], 8, (strrpos('"', $Buffer[$i]) - 3));
		if ($idString == null) { $result[$stringID] = $stringValue; } else { 
			if ($idString == $stringID) {
				$result = $stringValue; 
				break; 
				}
			}
		$i++;
	}		
	return $result;
}

echo f1(10000); // Exemple !

Et voila il ne me reste plus qu'à traduire un simple fichier texte, pour passer mon site dans une autre langue ;-) Ca ne résoud pas le problème de la base de données, mais bon... ;-) Ca sera peut-être pour une prochaine fois ! Pour le reste je suis sur un hébergement Français et la liaison ce fait par de simple sous-domaine. Je pense que c'est la meilleure solution au vue de mon référencement actuel (Non je ne parle pas du site de mon profil - Celui la est en cours de formatage ;-))).

Salutations ;-)
 
Nouveau WRInaute
Voici ma version qui reprend le même principe que toi avec un document texte :

Le fichier texte de la langue :
Code:
LG_BonjourLeMonde='Bonjour le monde !'
LG_AuRevoirLeMonde='Au revoir le monde!'

Le parseur à appeller au début de ta page :
Code:
$FichierLangue  = "langues/fr.lang.php";
$FichierContenu = file($FichierLangue);
while (list($NumeroLigne, $Ligne) = each($FichierContenu)) {
	preg_match("/^([a-zA-Z_]+)=(.+)$/", $Ligne, $Var);
	$$Var[1] = preg_replace("/\\r/","",$Var[2]);
}

Dans ta page tu appelles la variable $LG_BonjourLeMonde à la place du texte.

Kwiz
 
Nouveau WRInaute
J'utilisé ça aussi au départ, mais le problème est que quand tu a beaucoup de texte entrecoupé sur une page c'est un peu long à taper. J'prefère une fonction au nom cours et un chiffre en paramètres c'est beaucoup plus rapide.
 
WRInaute occasionnel
Une petite question ... pourquoi privilégiez vous cette technique plutot que d'utilisé des DEFINE ?

Exemple:
lang_fr.php
Code:
define('TEXT_WELCOME', 'Bienvenu');
index.php
Code:
require("lang_fr.php");
...
echo(TEXT_WELCOME);

C'est ce que j'utilise, parcontre je n'ai pas qu'un seul fichier de langue, mais un par page plus un général pour ne pas définir des textes inutile pour la page en cours et donc de surchargé le serveur inutilement. Est-ce que vos solution sont là pour résoudre se problème et donc d'avoir tout dans un seul fichier ?

- Magic -
 
WRInaute occasionnel
Crisalid a dit:
Ca ne résoud pas le problème de la base de données, mais bon... ;-) Ca sera peut-être pour une prochaine fois !
Bonsoir,

Pour les bases de données j'utilise cette solution :
<fr>texte en français</fr><en>texte en anglais</en><sp>...</sp>
Un seul champ avec toutes les langues.
Une petite fonction me permet de récupérer la version voulue.

Pour les textes en dur, ton histoire de nombres n'est vraiment pas pratique pour "relire" le contenu d'un code source. Avec un $message_remerciement c'est quand même plus parlant qu'un f1(853)...

Nicolas.
 
Nouveau WRInaute
absoluteweb a dit:
Crisalid a dit:
Ca ne résoud pas le problème de la base de données, mais bon... ;-) Ca sera peut-être pour une prochaine fois !
Bonsoir,

Pour les bases de données j'utilise cette solution :
<fr>texte en français</fr><en>texte en anglais</en><sp>...</sp>
Un seul champ avec toutes les langues.
Une petite fonction me permet de récupérer la version voulue.

Pour les textes en dur, ton histoire de nombres n'est vraiment pas pratique pour "relire" le contenu d'un code source. Avec un $message_remerciement c'est quand même plus parlant qu'un f1(853)...

Nicolas.

Pas mal, ta solution pour la base de données ;-) J'essayerai surement !
Pour les chiffres ou les lettres, franchement pour avoir essayé les lettres... Je trouve que ça manque de productivité, et retrouver une référence avec un bon éditeur va très vite avec les chiffres. Mais bon les gouts et les couleurs comme on dit ! ;-)
 
WRInaute passionné
absoluteweb a dit:
Crisalid a dit:
Ca ne résoud pas le problème de la base de données, mais bon... ;-) Ca sera peut-être pour une prochaine fois !
Bonsoir,

Pour les bases de données j'utilise cette solution :
<fr>texte en français</fr><en>texte en anglais</en><sp>...</sp>
Un seul champ avec toutes les langues.
Une petite fonction me permet de récupérer la version voulue.

Nicolas.

Si tu utilises une base de données, pourquoi ne pas avoir un champ langue ? Tant qu'à faire une requete sur base de donnée, autant éviter d'avoir à parser le résultat dans une fonction en plus.

François
 
Nouveau WRInaute
absoluteweb a dit:
Pour les bases de données j'utilise cette solution :
<fr>texte en français</fr><en>texte en anglais</en><sp>...</sp>
Un seul champ avec toutes les langues.
Une petite fonction me permet de récupérer la version voulue.

N'est-t-il préférable d'avoir un fichier par langue, histoire d'économiser la mémoire à chaque appel du fichier ?

Kwiz
 
WRInaute occasionnel
Suede a dit:
Si tu utilises une base de données, pourquoi ne pas avoir un champ langue ? Tant qu'à faire une requete sur base de donnée, autant éviter d'avoir à parser le résultat dans une fonction en plus.

Tu veux dire par exemple pour un site immobilier avoir autant de champ que de langues ?

TitreFR
TitreEN
TitreIT
TitreSP
TitreDE
DescriptionFR
DescriptionEN
DescriptionIT
DescriptionSP
DescriptionDE
SituationFR
SituationEN
SituationIT
SituationSP
SituationDE
...
...

J'ai préféré
Titre
Description
Situation
...

Quand j'aurais à ajouter d'autre langues, aucune manip à faire sur les tables !

Nicolas.
 
WRInaute occasionnel
Kwiz a dit:
absoluteweb a dit:
Pour les bases de données j'utilise cette solution :
<fr>texte en français</fr><en>texte en anglais</en><sp>...</sp>
Un seul champ avec toutes les langues.
Une petite fonction me permet de récupérer la version voulue.

N'est-t-il préférable d'avoir un fichier par langue, histoire d'économiser la mémoire à chaque appel du fichier ?

Kwiz
On parle de base de données là, je ne comprends pas la question. J'utilise des fichiers textes pour les pages "statiques" d'un site, mais si j'ai besoin d'une base de données (annonces immobilières par exemple), je ne vois pas comment tu peux utiliser un fichier langue à la place.

Nicolas.
 
WRInaute occasionnel
absoluteweb a dit:
Suede a dit:
Si tu utilises une base de données, pourquoi ne pas avoir un champ langue ? Tant qu'à faire une requete sur base de donnée, autant éviter d'avoir à parser le résultat dans une fonction en plus.

Tu veux dire par exemple pour un site immobilier avoir autant de champ que de langues ?

TitreFR
TitreEN
TitreIT
TitreSP
TitreDE
DescriptionFR
DescriptionEN
DescriptionIT
DescriptionSP
DescriptionDE
SituationFR
SituationEN
SituationIT
SituationSP
SituationDE
...
...

J'ai préféré
Titre
Description
Situation
...

Quand j'aurais à ajouter d'autre langues, aucune manip à faire sur les tables !

Nicolas.
Je penses qu'il voulais dire, d'avoir un champ en plus, par exemple de 2 caractère, où tu spécifie la langue de l'enregistrement.

Ce qui te permet de faire directement des requetes "SQL" sur une langue, style : SELECT * FROM `table_text_langue` WEHRE `lang`="fr"

- Magic -
 
Nouveau WRInaute
On parle de base de données là, je ne comprends pas la question. J'utilise des fichiers textes pour les pages "statiques" d'un site, mais si j'ai besoin d'une base de données (annonces immobilières par exemple), je ne vois pas comment tu peux utiliser un fichier langue à la place.

Personnellement pour des questions de performance, je préfère utiliser des fichiers avec les textes traduits dans plusieurs langues, plutôt que de devoir interroger SQL à chaque rechargement de la page.

L'affichage celle-ci n'en sera que plus rapide et le serveur SQL solicité uniquement pour renvoyer des données plus dynamique (par exemple pour les résultats d'un moteur de recherche)

Kwiz
 
WRInaute accro
De mon côté le stocke le contenu linguistique par strings dans une db, style <id_text><lg_fr><lg_en><lg_$$>.

La langue est définie par l'url rewriting (/fr/blabla.html), et il suffit d'un SELECT lg_$lang FROM...

Note: Ca permet aussi d'éditer les langues en ligne via une interface d'admin, et d'afficher le string "fr" à côté du "en" pour faire les traductions.
 
WRInaute occasionnel
magic corp. a dit:
Je penses qu'il voulais dire, d'avoir un champ en plus, par exemple de 2 caractère, où tu spécifie la langue de l'enregistrement.

Ce qui te permet de faire directement des requetes "SQL" sur une langue, style : SELECT * FROM `table_text_langue` WEHRE `lang`="fr"
Ce qui implique 5 fois plus d'enregistrements dans les tables pour gérer 5 langues... Des updates dans 5 enregistrements en cas de modifs...
Je préfère ma solution avec ma toute petite fonction pour extraire la langue choisie.
Code:
function recup_xml($chaine,$item) {
	// $chaine = <fr>version française</fr><en>version anglaise</en>, $item = fr ou en ...
	$tmp = preg_split("/<\/?".$item.">/",$chaine);
	return $tmp[1];
}
 
WRInaute accro
Oui, tout dépend du volume également, et de l'usage.

Dans mon cas, il s'agira (ce n'est pas encore en ligne) d'un outil utilisé par différentes personnes n'ayant pas forcément en commun le français.

Ces personnes auront la charge de traduction de leur langue attribuée (pour le contenu "structurel", autant que pour du contenu frais (autre table).

Avec cette méthode, ils peuvent mettre "en comparaison" leur langue, avec n'importe laquelle des autres langues déjà traduites, et éditer la leur.

p.ex. un franco-russe dont le français n'est pas parfait peut vérifier s'il a compris de quoi on parle en comparant avec la version anglaise, espagnole, etc...

;)
 
WRInaute occasionnel
Kwiz a dit:
Personnellement pour des questions de performance, je préfère utiliser des fichiers avec les textes traduits dans plusieurs langues, plutôt que de devoir interroger SQL à chaque rechargement de la page.

L'affichage celle-ci n'en sera que plus rapide et le serveur SQL solicité uniquement pour renvoyer des données plus dynamique (par exemple pour les résultats d'un moteur de recherche)
Comme tu le précises c'est valable pour des textes "statiques". Avec un moteur de recherche multicritères ce n'est pas jouable.
 
Nouveau WRInaute
absoluteweb a dit:
Comme tu le précises c'est valable pour des textes "statiques". Avec un moteur de recherche multicritères ce n'est pas jouable.

D'ailleurs j'aurai dû préciser que je n'utilise cette méthode de fichier texte que pour traduire l'interface d'un site (bouton, titre, copyright bas de page), pour du contenu, c'est autre chose et sa requière l'utilisation d'SQL.
 
Nouveau WRInaute
absoluteweb a dit:
Je préfère ma solution avec ma toute petite fonction pour extraire la langue choisie.
Code:
function recup_xml($chaine,$item) {
	// $chaine = <fr>version française</fr><en>version anglaise</en>, $item = fr ou en ...
	$tmp = preg_split("/<\/?".$item.">/",$chaine);
	return $tmp[1];
}

J'aime bien cette méthode, en tout cas pour la facilité de mettre à jour les traduction. Sous réserve que le fichier texte ne fasse pas plusieurs ko.

Kwiz
 
WRInaute passionné
absoluteweb a dit:
magic corp. a dit:
Je penses qu'il voulais dire, d'avoir un champ en plus, par exemple de 2 caractère, où tu spécifie la langue de l'enregistrement.

Ce qui te permet de faire directement des requetes "SQL" sur une langue, style : SELECT * FROM `table_text_langue` WEHRE `lang`="fr"
Ce qui implique 5 fois plus d'enregistrements dans les tables pour gérer 5 langues... Des updates dans 5 enregistrements en cas de modifs...
Je préfère ma solution avec ma toute petite fonction pour extraire la langue choisie.
Code:
function recup_xml($chaine,$item) {
	// $chaine = <fr>version française</fr><en>version anglaise</en>, $item = fr ou en ...
	$tmp = preg_split("/<\/?".$item.">/",$chaine);
	return $tmp[1];
}

Les updates sont fait moins souvent que l'affichage de la page. Gerer les updates n'est pas le plus compliqué, un formulaire associé à des requetes mysql.
Si l'affichage de ta page consomme deux fois plus de ressource, ca peut faire beaucoup quand tu commences à avoir beaucoup de visites.
Par contre ton systeme est tres adapté à un stockage dans un fichier.
 
WRInaute occasionnel
Crisalid a dit:
Bonjour,

Voici une petite participation au forum. Il s'agit plus d'une aide au développement plus qu'au référencement - Encore que cela reste étroitement liée.

Pour tout ce qui concerne les textes de mon site, je n'utilise qu'un seul fichier texte dit "String Table" que je place dans un répertoire (Ex. : french.lng). Sa structure est la suivante :

IdentifiantA5Chiffres, "Texte" (Ex. : 10000, "Accueil")

A chaque nouvelle entrée, j'incrèmente mon identifiant unique.
Ensuite pour afficher le texte sur ma page, j'utilise une petite fonction de lecture de ce fichier texte; en passant comme paramètre l'identifiant du texte que je souhaite afficher

Code:
function f1($idString = null, $directory = null) {
	$Buffer = @file($directory);
	$i = 0;
	while ($i <= sizeOf($Buffer) - 1) {	
		$stringID = substr($Buffer[$i], 0, 5);
		$stringValue = substr($Buffer[$i], 8, (strrpos('"', $Buffer[$i]) - 3));
		if ($idString == null) { $result[$stringID] = $stringValue; } else { 
			if ($idString == $stringID) {
				$result = $stringValue; 
				break; 
				}
			}
		$i++;
	}		
	return $result;
}

echo f1(10000); // Exemple !

Et voila il ne me reste plus qu'à traduire un simple fichier texte, pour passer mon site dans une autre langue ;-) Ca ne résoud pas le problème de la base de données, mais bon... ;-) Ca sera peut-être pour une prochaine fois ! Pour le reste je suis sur un hébergement Français et la liaison ce fait par de simple sous-domaine. Je pense que c'est la meilleure solution au vue de mon référencement actuel (Non je ne parle pas du site de mon profil - Celui la est en cours de formatage ;-))).

Salutations ;-)

Bonjour,

Cette solution marche-t-elle lorsque les textes traduits contiennent des variables ?
Exemple :

Code:
//Dans le fichier contenant les textes de la langue en question :
1, "texte avec la variable $mavariable"

//Dans la page dans laquelle on affiche le texte :
$mavariable="toto";
echo f1(1);
Merci d'avance,
Robin
 
Discussions similaires
Haut