Traduire le formulaire de contact

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour à tous,

Je rencontre un problème pour traduire le formulaire de contact du site. En effet, je dois faire un site en francais et en anglais. J'utilise pour cela le module "localizer" qui est plutôt sympathique.

Le formulaire de contact me pose problème car il n'est pas traité comme un "node" (pas d'onglet editer/traduire etc... dans les $tabs).

Dans la configuration des contact, il y a un formulaire dans lequel on peut préciser du texte à mettre au début de la page, je ne vois pas comment traduire ce formulaire dans l'autre langue.

Comment faire ?

D'avance merci,

zmove25

Forum : 
Version de Drupal : 

Ah ok,

Je trouvais étrange que ce ne soit pas prévu dans le CMS sachant que tout le reste peut être traduit, c'est un peu mal vu.

Tant pis, cette page restera en francais alors je crois, même pour les anglophones.

Cela dit, c'est uniquement le texte qui précède le formulaire que tu ne peux pas traduire. Les champs et boutons du formulaire, eux, sont traduisibles.

Par ailleurs, je n'ai pas approfondi, mais est-ce que le texte précédant ce formulaire ne serait pas sauvegardé comme une variable de configuration (au même titre que le nom du site, l'url de la page d'accueil...) ? Si c'est le cas, tu devrais pouvoir le traduire en activant les variables multilingues (cf. http://drupal.org/node/67824).

Comme le commentais Drupalfrance, ca parait en effet etrange que cela n'ai pas ete pense.
Donc en jetant un oeil ds le code, on a

<?php
   $form
['contact_information'] = array('#value' => filter_xss_admin(variable_get('contact_form_information', t('You can leave us a message using the contact form below.'))));
?>

Donc la chaine par defaut est encadree par la fonction t() qui permet la traduction a travers le module locale.

Donc il te suffit de specifier une bonne fois pour toute cette chaine dans la langue d'origine, d'activer le module local, de charger la traduction et d'ajouter la traduction de cette chaine la.

D'ailleurs au passage, je note que cette phrase est traduite dans la traduction fr de drupal, donc pas de pb ;)

Je cherche depuis 1h à trouver comment traduire ce passage sans succès, je suis peut-être bête.

Dans le module "formulaire de contact" j'ai spécifié ma phrase en francais.

je vais ensuite dans le module locale et je recherche mon terme, je ne le trouve pas.

Je tiens à préciser que j'utilise le module localizer (je ne pense pas que ca influe mais on ne sait jamais).

Donc je ne trouve pas ce terme, je ne comprends pas. Je trouve bien la phrase :

You can leave us a message using the contact form below.
modules/contact/contact.module:431

Mais ce n'est pas du tout ce qui s'affiche sur la page. c'est mon message personnalisé qui s'affiche, mais celui là, je ne le trouve pas...

Je ne comprend pas du tout comment ca marche...

Est-ce que tu as visité la page Contact dans la langue CIBLE ?

Par exemple, si tu veux traduire en français, va voir la page Contact sur le site en français. En effet, les chaînes à traduire n'apparaissent pas dans le système de traduction tant qu'on n'a pas visité une page qui sollicitait leur traduction.

Pour répondre à drupalfrance :

Oui j'ai visité la page contact dans la langue cible. J'ai besoin de la traduire en anglais, j'ai visité la page en anglais, j'ai même essayé d'aller dans l'interface admin en anglais > formulaire de contact > et de changer le texte en entête pensant que cela le changerait que pour la coté anglais du site.

Mais rien à faire, si j'édite ce texte, peu importe la langue, il s'applique pour les deux langues.

La seule chose qui se traduit sur cette page, c'est les titre des champs. Ainsi "Votre nom" devient "Your name" etc.... le texte en haut et les nom des catégories ne sont pas traduite.

Par exemple j'ai une catégorie : "Signaler un problème sur le site".

Je vais dans Configuration du site > Traduction > Gérer les termes, je recherche "Signaler" Drupal ne me trouve rien... Le contenu des catégories ne semble pas géré par le module locale, je ne voit donc pas comment les traduire...

J'ai regardé dans la base de donnée, ces informations sont contenu dans dp_contact et n'ont pas de colonnes réservées à la traduction. Quand aux tables du module locale, je ne comprends absolument pas leur fonctionnement.

Pour répondre à tostini

Je ne pense pas faire la confustion entre locale et localizer, je sais que localizer pour faire la traduction d'une page créer un nouveau node et s'occupe ensuite de savoir quel node est la traduction de tel autre.

Or, le module locale traduit juste les variables d'un même node. D'ailleur, pour chaque node du site, j'ai une tab "traduction" que me génère le module localizer, je n'en ai pas pour la page contact.

Mais lorsque je recherche dans "gérer les termes" le texte que j'ai mis dans les catégories et dans les informations supplémentaires de mon formulaire de contact, il ne me trouve rien....

en fait, locale me trouve toujours les phrases pas défaut :

You can leave us a message using the contact form below.
modules/contact/contact.module:431 fr éditer supprimer

Alors que ce n'est plus du tout cela qui s'affiche sur la page contact, mais des informations sur le siège social de l'entreprise...

Franchement je me demande si je ne suis pas tombé sur un bug...

Edit :

Ah oui, j'ai oublié de préciser, j'ai réussi via le module locale à traduire la phrase : "Send yourself a copy." (qui d'ailleur n'était pas traduite par défaut dans la traduction fr du site).

Je suis passé par le module locale ca a très bien marché, mais ca n'a pas l'air de se passer de la même facon pour les catégories et les informations supplémentaires que l'on peut mettre au début.

Ok j'ai un début de piste, et cela confirme le fait qu'il s'agisse d'un bug.

J'ai désinstallé le module contact et je l'ai réinstaller.

La la traduction s'effectuait bien :


You can leave us a message using the contact form below.
Vous pouvez nous laisser un message en utilisant le formulaire de contact ci-dessous.

Si je vais dans le module locale et que je change la traduction en francais, ca marche bien. Par contre, si je la modifie en allant dans les "informations supplémentaires" dans les options du module "formulaire de contact lui même", alors la traduction ne s'effectue plus...

Donc mon problème maintenant, c'est comment traduire cette fameuse phrase en anglais, le module locale me permet de changer la traduction francaise, mais je ne peux pas changer la phrase en anglais....

edit : j'ai posté le bug sur le forum officiel, je vous laisse le lien pour voir les retour :

http://drupal.org/node/129413

A mon avis cela vient du fait que la traduction se fait par rapport a la chaine d'origine qui est "You can leave us..." si tula changes, alors cette chaine n'existe plus ds la traduction et donc ne va pas la trouver en francais.

Regarde le bout de cote que j'ai poste, la traduction (t) se fait par rapport a la chaine de base et si jamaiselle est changee, par cette nouvelle chaine.
Dans ce cas il faut aller ds le module locale, et ds manage string il dwvrait (je suis plus tres sur du fonctionnement) recuperer la nouvelle phrase anglaise que tu as mis et ensuite il faut creer cette traduction.

Voila 'espere que j'ai ete clair, mais a mon avis c pas un bug...

PS: je crois que t'as oublie de ferme une balise i...

Oui, je vois ce que tu veux dire tostini et c'est vrai que mon post ici n'est pas aussi détaillé que le post que j'ai mis sur le forum officiel.

En passant par manage string, la traduction fonctionne, mais du moment que je fais une modification dans "information supplémentaires" du module de formulaire de contact, la traduction ne se fait plus. Dans les 2 langues, il me met ce que j'ai mis dans ce formulaire (j'ai essayer d'aller dans le module "formulaire de contact" dans l'autre langue dans l'interface admin mais c'est pareil...

C'est la que je pense qu'il y a un "bug".

Donc pour le moment les 2 possibilités sont :

  • Soit je met le contenu que je veux en allant dans "informations supplémentaires" du formulaire de contact et cela s'affiche de la même facon dans les 2 langues.

  • Soit je passe par "gérer les termes" mais je ne peux changer que le texte francais le texte anglais restera "Please contact us using the contact form below" (ou quelque chose dans le genre).

Et cela ne résoud pas le problème de traduire les catégories.

A mon avis tu confonds 2 modules: localizer que tu utilises pour traduire le contenu de ton site et locale qui sert a traduire l'interface (messages et boutons drupal).

Donc dans ce cas, il ne faut pas changer la phrase par defaut ds le module contact, il vaut mieux passer par la traduction de l'interface a travers le module locale.

Ainsi qd tu seras sur la version anglaise de ton site, tu auras la phrase par defaut en anglais et qdtu seras sur la version fr, tu auras la traduction (qui est d'ailleurs fournie par drupalfr).

J'ai avancé un peu dans ce casse tête.

Grâce au module i18n, j'ai reussi à traduire le champ "informations supplémentaires". Pour ce faire, il faut ajouter ceci dans le setting.php de votre site :

$conf['i18n_variables'] = array(
   'contact_form_information',
);

Plus généralement, il y a pleins de variables qui peuvent être définies de cette facon, comme le logo, le slogan du site, la page d'accueil etc....

Le code ci-dessous était un extrait pour le formulaire qui m'interessait, voila maintenant la version complête avec toutes les variables traduisible que j'ai pu trouver.

$conf['i18n_variables'] = array(
    // Site configuration
    'site_name',  // Nom du site
    'site_slogan',  // Slogan du site
    'site_mission',  // Mission du site
    'site_footer',  // Footer
    'anonymous',  // Le nom des utilisateurs anonymes
    'site_frontpage',  // L'url de la frontpage
    'contact_form_information',  // Le champ "informations supplémentaires du formulaire de contact"
     // Node help
    'blog_help',  // L'aide des blog
    'story_help',  // L'aide des "story"
    // User configuration
    'user_registration_help',  // L'aide de l'enregistrement des utilisateur (je vous laisse deviner chaque variable c'est facile)
    // Mail configuration
    'user_mail_welcome_subject',
    'user_mail_welcome_body', 
    'user_mail_approval_subject',
    'user_mail_approval_body',
    'user_mail_pass_subject',
    'user_mail_pass_body',
    // Theme settings: you may want to use different logos for each language
    //'theme_settings',
    // These are for primary and secondary links
    'menu_primary_menu', // liens primaires
    'menu_secondary_menu',  // liens secondaires
);

Voila pour ce que j'ai trouvé, maintenant je sollicite votre aide pour faire de même avec les champs se trouvant dans "éditer les catégories" du formulaire de contact. A savoir :

  • La catégorie
  • Le destinataire
  • La réponse automatique

J'ai essayé de faire selon la même méthode, mais cela ne marche pas. D'apres les informations des formulaires que web developper m'affiche, le champ category se nomme "category", le destinataire : "recipient", et le retour automatique "reply", et en ajoutant ces variables dans ma fonction dans setting.php, cela ne marche pas.

J'imagine qu'il y a une subtilité supplémentaire que je n'ai pas saisie, j'aimerais l'aide des pro pour réaliser cela.

D'avance merci !

C'est tout à fait normal. Ces champs sont stockés tels quels en base de données, le "truc" des "variables internationales" ne peut donc pas fonctionner dans ce cas.

Pour moi il s'agit d'un bug, ou tout au moins d'un problème d'architecture assez grave. Tous ces champs entrés par l'utilisateur qui pourraient (ou devraient selon les cas) être traduits sont assez difficile à gérer : au départ la traduction (gérée par le module locale) vise les textes "statiques" (ceux qui sont dans le code source), et pas les informations entrées par l'utilisateur.

Une façon de résoudre ton problème est de passer ces champs à la fonction t() avant qu'ils soient utilisés (le patch ci-dessous devrait faire l'affaire).

<?php
--- contact.module 10 Jan 2007 15:17:51 -0000  1.74
+++ contact.module 11 Apr 2007 22:30:48 -0000
@@ -420,7 +420,7 @@
 
  
$result = db_query('SELECT cid, category, selected FROM {contact} ORDER BY weight, category');
   while (
$category = db_fetch_object($result)) {
-   
$categories[$category->cid] = $category->category;
+   
$categories[$category->cid] = t($category->category);
     if (
$category->selected) {
      
$default_category = $category->cid;
     }
@@ -
521,7 +521,7 @@
  
$contact = db_fetch_object(db_query("SELECT * FROM {contact} WHERE cid = %d", $form_values['cid']));
 
  
// Format the category:
$subject = t('[!category] !subject', array('!category' => $contact->category, '!subject' => $form_values['subject']));
$subject = t('[!category] !subject', array('!category' => t($contact->category), '!subject' => $form_values['subject']));
 
  
// Prepare the body:
  
$body = implode("\n\n", $message);
@@ -
536,12 +536,12 @@
 
  
// Send an auto-reply if necessary:
  
if ($contact->reply) {
-   
drupal_mail('contact-page-autoreply', $from, $subject, wordwrap($contact->reply), $contact->recipients);
+   
drupal_mail('contact-page-autoreply', $from, $subject, wordwrap(t($contact->reply)), $contact->recipients);
   }
 
  
// Log the operation:
  
flood_register_event('contact');
watchdog('mail', t('%name-from sent an e-mail regarding %category.', array('%name-from' => $form_values['name'] ." <$from>", '%category' => $contact->category)));
watchdog('mail', t('%name-from sent an e-mail regarding %category.', array('%name-from' => $form_values['name'] ." <$from>", '%category' => t($contact->category))));
 
  
// Update user:
  
drupal_set_message(t('Your message has been sent.'));
?>

Merci damz pour cette réponse !!!

J'espere que ce genre de petits problème sera résolu avec Drupal 6, le credo de ce dernier semble être l'internationalisation. Dommage qu'il ne soit pas déjà sorti, je vais devoir faire tous les sites en 5 avec i18n en attendant. (en esperant que les mise à jour une fois terminé seront simple...).

En ce qui concerne ton bout de code, pourrais-tu expliquer un peu plus précisément ou le mettre car comme le dit Ce poste que je viens de créer, les fichiers .module sont horrible à utiliser chez moi.

D'avance merci

zmove