Solution : Multi-langages en PHP
Date de publication : 15 Octobre 2007
Par
Vincent Flauder (Solution : Multi-langages en PHP)
Cet article a pour but de proposer une solution simple pour introduire
plusieurs langues dans vos sites web, avec une interface administrateur.
- Niveau : néophyte à intermédiaire/expert
- Connaissances abordées :
- XHTML : Les formulaires
- PHP : PHP5 et les classes
- XML : DTD et XML
I. Introduction
II. Le DTD ( Document Type Definition )
III. Le fichier XML
IV. La base de données SQL
V. La classe PHP : XMLEngine
VI. Utilisation de la classe
A. Extraction des données
B. Ajout d'éléments
C. Modification des éléments (traduction)
D. Suppression des éléments
E. Disponibilité des langues
VII. Sources
I. Introduction
Le principe du multi-langages est de modifier le contenu
textuel de tous les éléments d'une page HTML en fonction de la langue
choisie par l'utilisateur. Pour ce faire il faut stocker ces valeurs
dans des fichiers externes, ces derniers seront au format XML et
leur syntaxe contrôlée avec un DTD (Document Type Definition). Pour
pouvoir manipuler ces fichiers XML, PHP nous offre un panel complet
d'outils : les fonctions DOM.
L'utilisation d'une base de données de type MySQL ici permet de sauvegarder
les langues utilisées ainsi qu'une variable afin de savoir si la langue
est ouverte aux utilisateurs ou non.
Pour interagir avec la base de données j'ai
utilisé une classe que j'ai moi même crée ( SQLManager.php ) ne sera pas
détaillée dans cet article, mais elle est très documentée et vous pourrez
apprendre à vous en servir si vous le voulez avec ses commentaires.
En résumé,
la classe permet de se connecter au serveur et à une base de données, surtout
elle génère les requêtes SQL à notre place et nous renvoie les résultats sous
forme de tableau.
|
Ne pas confondre les fonctions DOM et les fonctions DOM XML, les
fonctions DOM XML ne sont pas implémentées en PHP 5.
|
II. Le DTD ( Document Type Definition )
Le DTD sert à créer un modèle pour les documents XML, une hiérarchie stricte
à respecter pour l'imbrication des éléments et leurs attributs. Lorsque l'on crée un
document XML, on indique l'emplacement du DTD afin de "valider" le document.
C'est nécessaire pour utiliser certaines fonctions DOM et permet d'homogénéiser
tous les documents.
Le DTD utilise un langage propre à lui, mais simple à comprendre.
Dans le fichier seront définis le nom des balises nécessaires ainsi que
leurs attributs, en précisant si ces attributs et balises sont obligatoires
ou facultatives.
Code DTD ( xmldoctype.dtd ) |
<? xml version="1.0" encoding="UTF-8"? >
<! ELEMENT language ( xmldata * ) >
<! ELEMENT xmldata ( translation + ) >
<! ATTLIST xmldata id ID #REQUIRED >
<! ELEMENT translation ( #PCDATA ) >
<! ATTLIST translation lang CDATA #REQUIRED >
|
III. Le fichier XML
Les fichiers XML seront notre base de données pour les textes du site,
en suivant les définitions crées auparavant, il sera alors simple de
conçevoir la 'base de données' (en mode Design sous Eclipse c'est très pratique et simple).
Code XML ( exemple de website.xml ) |
<? xml version="1.0" encoding="UTF-8"? >
<! DOCTYPE language SYSTEM " xmldoctype.dtd " >
< language >
< xmldata id = " webPageTitle " >
< translation lang = " fr " > Démonstration de XMLEngine< / translation >
< translation lang = " en " > XMLEngine demonstration< / translation >
< / xmldata >
< / language >
|
IV. La base de données SQL
Pour notre base de données c'est très simple, on a juste besoin d'une
table avec deux champs : l'un contenant le tag des langues utilisées, l'autre
étant un booléen qui permet de savoir si la langue est ouverte aux
utilisateurs ou non.
Table : Languages |
Nom du champ |
Valeur |
Description |
Language |
VARCHAR(2) |
Chaîne de caractères contenant le tag de la langue |
IsAvailable |
BOOL ( TinyInt(1) ) |
Variable de contrôle pour l'accessibilité de la langue aux
utilisateurs
|
V. La classe PHP : XMLEngine
Voici la partie centrale de notre solution, c'est cette classe qui
nous permettra de manipuler les données des fichiers XML. La classe
possède plusieurs fonctions permettant d'aider à l'administration via
un panneau administrateur.
|
Les types soulignés dans ce tableau ne sont là qu'à titre indicatif.
On ne doit pas les recopier dans le fichier source.
|
Définition des attributs de la classe :
Nom |
Définition |
private DOMDocument domFile |
Attribut dans lequel se trouve l'instance de la classe
DOMDocument. |
private string currentLanguage |
Attribut dans lequel on sauve la langue utilisée lors de
la manipulation des fichiers XML. |
private string currentFile |
Attribut où l'on stocke le chemin du fichier XML ouvert et
en cours d'utilisation. |
private fileID fileLock |
Attribut permettant de bloquer l'accès au fichier lors
des modifications. |
Définition des méthodes (fonctions) de la classe :
Nom |
Définition |
public __construct( string $filename, string $language ) |
Constructeur de la classe, prend en argument le chemin du fichier
XML à ouvrir, $filename, avec la langue $language à utiliser. |
public string getCurrentFile() |
Méthode permettant de récupérer le nom du fichier en cours. |
public string getItemValue( string $itemID ) |
Méthode permettant d'extraire le contenu textuel d'une balise
dont l'identifiant $itemID est passé en argument. |
public string[] getItemNodeList() |
Méthode permettant de récupérer tous les identifiants des
balises xmldata du fichier XML. |
public changeFile( string $newFile ) |
Méthode permettant de charger un nouveau fichier XML. |
public changeLanguage( string $newLanguage ) |
Méthode permettant de changer la langue utilisée. |
public bool addXmlElement( string $itemID,
string $lang, string $itemDefaultValue ) |
Méthode permettant de créer un nouvel élément xmldata dont
l'identifiant sera $itemID avec un enfant translation dans la
langue $lang et avec le texte $itemDefaultValue. |
public bool modifyXmlElement( string $itemID,
string $lang, string $newContent ) |
Méthode permettant de modifier le contenu textuel d'un élément dont l'ID
est $itemID, dans la langue $lang, et le nouveau texte sera $newContent. |
public bool removeXmlElement(
string $itemID, string $lang ) |
Méthode permettant de supprimer un élément translation dont
la langue est $lang, ceci dans l'élément xmldata qui a l'ID $itemID. |
public bool completelyRemoveXmlElement(
string $itemID ) |
Méthode permettant de supprimer un élément xmldata dont l'ID est $itemID. |
public bool isEmptyXml( string $itemID,
string $lang ) |
Méthode permettant de vérifier qu'un élément translation est bien rempli
dans la langue $lang. |
public addLanguageToFile( string $newLanguage ) |
Méthode permettant d'ajouter une nouvelle langue $newLanguage
au fichier. Cette fonction crée un élément translation avec la
nouvelle langue dans chaque élément xmldata s'il n'y en a pas. |
public bool checkIntegrity( string $lang ) |
Méthode permettant de vérifier que tous les éléments xmldata possèdent
des éléments translation dans la langue $lang et qu'ils soient remplis. |
public string __get( string $itemID ) |
Méthode magique de PHP qui sera éxécutée lorsque l'on voudra lire
un attribut de la classe. En utilisant les IDs des éléments xmldata comme attributs de classe,
cela permet de retourner les contenus textuels des balises plus facilement. |
private saveFile() |
Méthode permettant de sauvegarder le fichier XML de manière sécurisée. |
VI. Utilisation de la classe
|
Dans les pages de code on ignorera les standards HTML afin d'aller à l'essentiel
et d'éviter de se perdre, seulement les éléments nécessaires au bon fonctionnement de la solution
seront présents. Aussi aucun style CSS n'a été défini, les styles sont insérés directement
dans l'attribut STYLE pour les démonstrations présentes dans cet article.
|
A. Extraction des données
Pour commencer nous allons simplement utiliser la classe pour extraire des données :
Code PHP ( extract.php ) |
<?php
session_start();
require_once ' include/XMLEngine.php ' ;
if ( ! isset( $ _SESSION [ ' Language ' ] ) )
{
$ _SESSION [ ' Language ' ] = ' fr ' ;
}
$xml = new XMLEngine( ' xml/website.xml ' , $ _SESSION [ ' Language ' ] );
echo $xml ->webPageName ;
?>
|
Il n'y a que cela pour l'extraction des données, les autres fonctions
sont principalement conçues pour créer l'administration au travers d'une
interface web.
B. Ajout d'éléments
Dans cette section nous allons voir comment ajouter des éléments,
en créant dans un premier temps un formulaire HTML pour entrer les
éléments nécessaires, puis la partie PHP qui traitera ce formulaire
pour ajouter l'élément et afficher un message javascript, le tout en
utilisant à chaque fois notre objet XML pour récupérer les textes
du site :
Code PHP ( addForm.php ) |
<?php
session_start();
require_once ' include/XMLEngine.php ' ;
if ( ! isset( $ _SESSION [ ' Language ' ] ) )
{
$ _SESSION [ ' Language ' ] = ' fr ' ;
}
$xml = new XMLEngine( ' xml/website.xml ' , $ _SESSION [ ' Language ' ] );
require_once ' include/SQLManager.php ' ;
$sql = new SQLManager( ' localhost ' , ' root ' , ' ' , ' Test ' );
?>
< form action = " addForm . php " method = " post " >
< table border = " 1 " >
< tr >
< td colspan = " 2 " >
<?php echo $xml ->webPageName ; ?>
< / td >
< / tr >
< tr >
< td >
<?php echo $xml ->inputID ; ?>
< / td >
< td >
< input type = " text " name = " itemId " / >
< / td >
< / tr >
< tr >
< td >
<?php echo $xml ->inputData ; ?>
< / td >
< td >
< textarea cols = " 20 " rows = " 5 " name = " itemData " > < / textarea >
< / td >
< / tr >
< tr >
< td >
<?php echo $xml ->inputLang ; ?>
< / td >
< td > <?php
$ langs = $sql ->selectQuery ( ' * ' , ' Languages ' , 0 , ' ' , ' ' , ' ' , ' ' );
< select name= " itemLanguage " style= " width : 100 % ; " > < ? php
foreach ( $ langs as $ language )
{ ?>
< option value = " <?php echo $ language [ ' Language ' ] ; ?> " > <?php echo $xml -> { $ language [ ' Language ' ] . ' Lang ' } ; ?> < / option > <?php
} ?>
< / select >
< / td >
< / tr >
< tr >
< td colspan = " 2 " >
< input style=" width : 100 % ;text-align : center ;" type = " submit "
name = " submitCreateItem " value = " <?php echo $xml ->submitCreate ; ?> " / >
< / td >
< / tr >
< / table >
< / form > <?php
if ( isset( $ _POST [ ' submitCreateItem ' ] ) )
{
if ( $xml ->addXmlElement ( $ _POST [ ' itemId ' ] , $ _POST [ ' itemLanguage ' ] , $ _POST [ ' itemData ' ] ) )
{
?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->createXmlDone ; ?> " ) ;
- - >
</script> <?php
}
else
{ ?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->createXmlError ; ?> " ) ;
- - >
</script> <?php
}
}
?>
|
C. Modification des éléments (traduction)
Avec ceci on peut déjà créer des éléments dans les fichiers XML. Maintenant
nous allons modifier les éléments dans le but de traduire ceux qui n'y sont pas.
On va pour cela génèrer un formulaire HTML pour modifier les balises selon la
langue de traduction choisie :
Code PHP ( traduceForm.php ) |
<?php
session_start();
require_once ' include/XMLEngine.php ' ;
require_once ' include/SQLManager.php ' ;
$sql = new SQLManager( ' localhost ' , ' root ' , ' ' , ' Test ' );
if ( ! isset( $ _SESSION [ ' Language ' ] ) )
{
$ _SESSION [ ' Language ' ] = ' fr ' ;
}
$xml = new XMLEngine( ' xml/website.xml ' , $ _SESSION [ ' Language ' ] );
require_once ' traduceFormTreatment.php ' ;
?>
< div style=" height : 300px ;overflow : scroll ;" align = " center " > <?php
if ( ! isset( $ _POST [ ' submitLangToTraduce ' ] ) & & ! isset( $ _POST [ ' submitTraduceFile ' ] ) )
{ ?>
< form action = " traduceForm . php " method = " post " >
< table border = " 1 " >
< tr >
< td > <?php
echo $xml ->foreignLang ; ?>
< / td >
< / tr >
< tr >
< td align = " center " > <?php
$ langs = $sql ->selectQuery ( ' * ' , ' Languages ' , 0 , ' ' , ' ' , ' ' , ' ' );
?>
< select name = " langToTraduce " style=" width : 100 % ;" > <?php
foreach ( $ langs as $ language )
{ ?>
< option value = " <?php echo $ language [ ' Language ' ] ; ?> " > <?php echo $xml -> { $ language [ ' Language ' ] . ' Lang ' } ; ?> < / option > <?php
} ?>
< / select >
< / td >
< / tr >
< tr >
< td colspan = " 2 " >
< input type = " submit " name = " submitLangToTraduce " value = " <?php echo $xml ->submitChooseLang ; ?> " / >
< / td >
< / tr >
< / table >
< / form > <?php
}
if ( isset( $ _POST [ ' submitLangToTraduce ' ] ) | | isset( $ _POST [ ' submitTraduceFile ' ] ) )
{
?>
< form action = " traduceForm . php " method = " post " >
< table border = " 1 " >
< tr >
< td colspan = " 3 " >
<?php echo $xml ->webPageName ; ?>
< / td >
< / tr >
< tr >
< td >
<?php echo $xml ->frLang ; ?>
< / td >
< td >
<?php
echo $xml -> { $ _POST [ ' langToTraduce ' ] . ' Lang ' } ; ?>
< / td >
< td >
<?php echo $xml ->newContent ; ?>
< / td >
< / tr > <?php
$ idTab = $xml ->getItemNodeList ();
foreach ( $ idTab as $ cell )
{ ?>
< tr >
< td >
< input type = " text " readonly = " readonly " value = " <?php echo $xml -> $ cell ; ?> " style=" width : 250px ;" / >
< / td >
< td >
< input type = " text " readonly = " readonly " value = " <?php echo $xmlTraductor -> $ cell ; ?> " style=" width : 250px ;" / >
< / td >
< td >
< textarea name = " <?php echo $ cell ; ?> " rows = " 1 " cols = " 20 " > < / textarea >
< / td >
< / tr > <?php
}
?>
< tr >
< td colspan = " 3 " >
< input type = " hidden " name = " langToTraduce " value = " <?php echo $ _POST [ ' langToTraduce ' ] ; ?> " / >
< input type = " submit " name = " submitTraduceFile " value = " <?php echo $xml ->submitTraduce ; ?> " style=" width : 100 % ;text-align : center ;" / >
< / td >
< / tr >
< / table >
< / form > <?php
}
if ( isset( $ _POST [ ' submitTraduceFile ' ] ) )
{
if ( $ allSaveGood )
{
?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->modificationDone ; ?> " ) ;
</script> <?php
}
else
{
?>
?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->modificationError ; ?> " ) ;
</script> <?php
}
} ?>
< / div >
|
Ce code va génèrer un formulaire HTML qui permet de visualiser le contenu
des balises dans les deux langues et modifier à souhait, les champs vides
ne seront pas traités.
|
Attention : il ne faut pas donner un identifiant XML pour le bouton SUBMIT qui soit identique
à son attribut NAME, il y aurait alors des conflits dans le tableau $_POST entre le nom du bouton
et le champ TEXTAREA comportant le même nom.
|
Une fois ce formulaire soumis, il faut le traiter pour modifier les éléments XML dont
les champs du formulaire ne sont pas vide, ce fichier sera inclus au début de
traduceForm.php :
Code PHP ( traduceFormTreatment.php ) |
<?php
if ( isset( $ _POST [ ' submitTraduceFile ' ] ) )
{
unset($ _POST [ ' submitTraduceFile ' ] );
$ langToTraduce = $ _POST [ ' langToTraduce ' ] ;
unset( $ _POST [ ' langToTraduce ' ] );
$xml ->addLanguageToFile ( $ langToTraduce );
$ allSaveGood = true ;
foreach ( $ _POST as $ xmlID = > $ newValue )
{
if ( $ newValue ! = ' ' )
{
if ( ! $xml ->modifyXMLElement ( $ xmlID , $ langToTraduce , $ newValue ) )
{
$ allSaveGood = false ;
}
}
}
$ _POST [ ' langToTraduce ' ] = $ langToTraduce ;
$ _POST [ ' submitTraduceFile ' ] = true ;
}
?>
|
D. Suppression des éléments
Pour supprimer les éléments on a deux fonctions, l'une supprime
l'élément xmldata, l'autre l'élément translation d'un élément
xmldata dans la langue choisie. On va donc créer un formulaire simple
contenant deux listes, l'une avec tous les identifiants des éléments xmldata,
l'autre les langues utilisées :
Code PHP ( removeForm.php ) |
<?php
session_start();
require_once ' include/XMLEngine.php ' ;
require_once ' include/SQLManager.php ' ;
$sql = new SQLManager( ' localhost ' , ' root ' , ' ' , ' Test ' );
if ( ! isset( $ _SESSION [ ' Language ' ] ) )
{
$ _SESSION [ ' Language ' ] = ' fr ' ;
}
$xml = new XMLEngine( ' xml/website.xml ' , $ _SESSION [ ' Language ' ] );
require_once ' removeFormTreatment.php ' ;
?>
< div style=" height : 500px ;overflow : scroll ;" align = " center " > <?php
?>
<script type = " text / javascript " >
var button ;
function confirmDelete( )
{
if ( button = = " xml " )
{
return confirm( " <?php echo $xml ->confirmDelete ; ?> ' " + document . removeForm . xmlDataId . value + " ' ? " ) ;
}
else if ( button = = " translation " )
{
return confirm( " <?php echo $xml ->confirmDelete ; ?> ' translation ' de langue ' "
+ document . removeForm . translationLangId . value + " ' de l ' element ' "
+ document . removeForm . xmlDataId . value + " ' ? " ) ;
}
}
- - >
</script>
<?php
?>
< form action = " removeForm . php " method = " post " name = " removeForm " onsubmit = " return confirmDelete ( ) ; " >
< table border = " 1 " >
< tr >
< td > <?php
echo $xml ->element . ' <i>xmldata</i> ' ; ?>
< / td >
< td > <?php
echo $xml ->element . ' <i>translation</i> ' ; ?>
< / td >
< / tr >
< tr >
< td >
< select name = " xmlDataId " > <?php
$ itemList = $xml ->getItemNodeList ();
foreach ( $ itemList as $ item )
{ ?>
< option value = " <?php echo $ item ; ?> " > <?php echo $ item ; ?> < / option > <?php
} ?>
< / select >
< / td >
< td > <?php
$ langs = $sql ->selectQuery ( ' * ' , ' Languages ' , 0 , ' ' , ' ' , ' ' , ' ' );
?>
< select name = " translationLangId " style=" width : 100 % ;" > <?php
foreach ( $ langs as $ language )
{ ?>
< option value = " <?php echo $ language [ ' Language ' ] ; ?> " > <?php echo $xml -> { $ language [ ' Language ' ] . ' Lang ' } ; ?> < / option > <?php
} ?>
< / select >
< / td >
< / tr >
< tr >
< td >
< input type = " submit " name = " submitDeleteXmlDataElement " value = " <?php echo $xml ->deleteElement ; ?> " onclick = " button = ' xml ' ; " / >
< / td >
< td >
< input type = " submit " name = " submitDeleteTranslationElement " value = " <?php echo $xml ->deleteElement ; ?> " onclick = " button = ' translation ' ; " / >
< / td >
< / tr >
< / table >
< / form >
< / div >
|
Ensuite le script de traitement du formulaire, inclus juste avant
ce dernier pour que la liste soit mise à jour.
Code PHP ( removeFormTreatment.php ) |
<?php
if ( isset( $ _POST [ ' submitDeleteXmlDataElement ' ] ) )
{
if ( $xml ->completelyRemoveXmlElement ( $ _POST [ ' xmlDataId ' ] ) )
{ ?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->modificationDone ; ?> " ) ;
- - >
</script> <?php
}
else
{ ?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->modificationError ; ?> " ) ;
- - >
</script> <?php
}
}
else if ( isset( $ _POST [ ' submitDeleteTranslationElement ' ] ) )
{
if ( $xml ->removeXmlElement ( $ _POST [ ' xmlDataId ' ] , $ _POST [ ' translationLangId ' ] ) )
{ ?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->modificationDone ; ?> " ) ;
- - >
</script> <?php
}
else
{ ?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->modificationError ; ?> " ) ;
- - >
</script> <?php
}
} ?>
|
E. Disponibilité des langues
En dernier on va voir comment vérifier que tous nos fichiers
possèdent les éléments nécessaires pour rendre une langue accessible
aux utilisateurs. Il nous faut juste un formulaire vérifiant les
langues inaccesibles auprès de la base de données, puis ensuite
lancer la vérification et modifier la base de données s'il le faut.
Code PHP ( languageAvailability.php ) |
<?php
session_start();
require_once ' include/XMLEngine.php ' ;
require_once ' include/SQLManager.php ' ;
$sql = new SQLManager( ' localhost ' , ' root ' , ' ' , ' Test ' );
if ( ! isset( $ _SESSION [ ' Language ' ] ) )
{
$ _SESSION [ ' Language ' ] = ' fr ' ;
}
$xml = new XMLEngine( ' xml/website.xml ' , $ _SESSION [ ' Language ' ] );
if ( isset( $ _POST [ ' submitCheckLanguage ' ] ) )
{
$ i = 0 ;
$ dirRes = opendir( ' xml ' );
while ( false ! = = ( $ file = readdir( $ dirRes ) ) )
{
if ( strpos( $ file , ' .xml ' ) )
{
$ xmlTab [ $ i + + ] = $ file ;
}
}
if ( isset( $ xmlTab ) )
{
$ CFile = $xml ->getCurrentFile ();
$ fileChecker = true ;
foreach ( $ xmlTab as $ file )
{
$xml ->changeFile ( ' xml/ ' . $ file );
if ( ! $xml ->checkIntegrity ( $ _POST [ ' languageToCheck ' ] ) )
{
?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->fileCheckError . ' : ' . $ file ; ?> " ) ;
</script> <?php
$ fileChecker = false ;
}
}
if ( $ fileChecker )
{
$ fields [ 0 ] = ' IsAvailable ' ; $ values [ 0 ] = true ;
$sql ->updateQuery ( ' Languages ' , $ fields , $ values , ' Language ' , ' = ' , $ _POST [ ' languageToCheck ' ] );
?>
<script type = " text / javascript " >
alert( " <?php echo $xml ->checkLanguageDone ; ?> " ) ;
</script> <?php
}
}
}
?>
< div style=" height : 500px ;overflow : scroll ;" align = " center " >
< form action = " languageAvailability . php " method = " post " >
< table border = " 1 " >
< tr >
< td > <?php
echo $xml ->languageToCheck ; ?>
< / td >
< / tr >
< tr >
< td > <?php
$ langs = $sql ->selectQuery ( ' * ' , ' Languages ' , 0 , ' ' , ' ' , ' ' , ' ' );
?>
< select name = " languageToCheck " style=" width : 100 % ;" > <?php
foreach ( $ langs as $ language )
{ ?>
< option value = " <?php echo $ language [ ' Language ' ] ; ?> " > <?php echo $xml -> { $ language [ ' Language ' ] . ' Lang ' } ; ?> < / option > <?php
} ?>
< / select >
< / td >
< / tr >
< tr >
< td >
< input type = " submit " name = " submitCheckLanguage " value = " <?php echo $xml ->checkIt ; ?> " / >
< / td >
< / tr >
< / table >
< / form >
< / div >
|
VII. Sources
Copyright © 2007 Vincent Flauder.
Aucune reproduction, même partielle, ne peut être faite
de ce site ni de l'ensemble de son contenu : textes, documents, images, etc.
sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à
trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.