28111 sujets

CSS et mise en forme, CSS3

Pages :
re bonjour Smiley smile

dans un site multilingue il faut penser aux traducteurs qui ne connaissent ni le html ni le css ni le javascript donc il faut qu'il ne touche qu'à un fichier de translation. le problème se trouve dans le <head>
<link rel="stylesheet" href="translation.css">
<title>La vie de toto</title>
<meta name="description" content=toto à la plage">
la première ligne j'ouvre mon fichier de traduction

là je vois les deux autres de cette manière
<title><?php include 'tittle.php';?></title>
<meta name="description" content=<?php include 'description.php';?>>

dans le fichier de traduction.
vie:before {
content: "La vie de toto";
}
plage:before {
content: "toto à la plage";
}

dans le fichier tlttle.php et description.php si je met la vie de toto et toto à la plage cela fonctionne mais si j' appel les variables cela ne fonctionne plus
je pense avoir tout essayé
et je ne vois vraiment pas comment faire ou alors il faut aborder le problème autrement
Modérateur
Bonjour,

totoche89 a écrit :
...alors il faut aborder le problème autrement

C'est préférable (rien compris à ce que tu essaies de faire).

C'est quoi le contexte ? est-ce que déjà tu as des pages différentes pour chaque langue (mieux selon moi) ou bien des pages communes à toutes les langues ?

Il est fait comment, le site ? avec un CMS ? ou bien c'est du code fait maison ?

Après, c'est juste une histoire de se mettre d'accord sur la manière dont doivent être structurés les fichiers de langue. Quelque soit cette structure, il faut ensuite un script (qui peut être du php) qui va lire le contenu des fichiers de langue pour générer automatiquement les pages de manière appropriée : tout est possible. Mais en tout cas, je ne vois pas ce que vient faire les lignes suivantes dans le fichier de traduction (ça ressemble à du css, or il n'y a aucune raison de mettre du css dans un fichier de traduction) :
vie:before {
content: "La vie de toto";
}
plage:before {
content: "toto à la plage";
}


Amicalement,
merci de me répondre parsimonhi

c'est du code maison et c'est bien du css avec des traductions très courte mais très nombreuses.
ce que j'essaie de faire, c'est de mettre les 2 variables ci-dessus dans:
<title>variable</title>
<meta name="description" content=variable>
mais d'après ce que tu me dit je me suis complètement planté Smiley sweatdrop .
comment devrais-je faire ?
Modérateur
Bonjour,

1) Si tu n'utilises pas de cms, continue à ne pas en utiliser !

Tu seras sur de meilleures bases selon moi pour apprendre.

2) Pour l'internationalisation, il y a plein de possibilités. Par exemple :
https://www.sitepoint.com/localizing-php-applications-1/

En gros, les traducteurs utilisent un logiciel qui s'appelle poedit :
https://poedit.net/

Tu leurs fournis un fichier avec une extension .po qui contient des ensembles de lignes du style :
msgid "Mon joli site"
msgstr "Mon joli site"

msgid "Bonjour"
msgstr "Bonjour"

Avec poedit, ils vont pouvoir créer un fichier de traduction dans une autre langue.

Et dans le code de ta page, tu vas insérer à l'endroit où doit s'afficher quelque chose des instructions php comme
<?= _("Mon joli site") ?>

ou
<?= _("Bonjour") ?>

La fonction _() est en fait un raccourci de la fonction php gettext(). Elle est prévue pour aller lire les traductions dans les fichiers générés par poedit.

Exemple complet
-----------------

1) Les scripts des pages du site

À la racine du site, on crée 2 scripts php : page_en.php et page_fr.php
Contenu de page_en.php
<!DOCTYPE html>
<?php
$language="en_US";
putenv("LANG=".$language); 
setlocale(LC_ALL, $language);
$domain = "messages";
bindtextdomain($domain, "Locale"); 
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);
?>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="description" content="<?= _("Mon joli site utilisant gettext()") ?>">
<title><?= _("Mon joli site") ?></title>
</head>
<body>
<h1><?= _("Mon joli site") ?></h1>
<p><?= _("Bonjour") ?></p>
</body>
</html>

Contenu de page_fr.php
<!DOCTYPE html>
<?php
$language="fr_FR";
putenv("LANG=".$language); 
setlocale(LC_ALL, $language);
$domain = "messages";
bindtextdomain($domain, "Locale"); 
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);
?>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="description" content="<?= _("Mon joli site utilisant gettext()") ?>">
<title><?= _("Mon joli site") ?></title>
</head>
<body>
<h1><?= _("Mon joli site") ?></h1>
<p><?= _("Bonjour") ?></p>
</body>
</html>

EDIT: tu peux éventuellement mettre ce qui est commun aux deux scripts dans un fichier php unique, et l'inclure ensuite dans page_en.php et page_fr.php.

Par exemple :
page_multi.php
<?php
putenv("LANG=".$language); 
setlocale(LC_ALL, $language);
$domain = "messages";
bindtextdomain($domain, "Locale"); 
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);
?>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="description" content="<?= _("Mon joli site utilisant gettext()") ?>">
<title><?= _("Mon joli site") ?></title>
</head>
<body>
<h1><?= _("Mon joli site") ?></h1>
<p><?= _("Bonjour") ?></p>
</body>
</html>

Alors page_en.php devient :
<!DOCTYPE html>
<?php
$language="en_US";
?>
<html lang="en">
<?php include "page_multi.php";?>

Et page_fr.php devient :
<!DOCTYPE html>
<?php
$language="fr_FR";
?>
<html lang="fr">
<?php include "page_multi.php";?>

Mais de toute façon, dans un vrai site, ce sera sans doute un peu plus sophistiqué.

2) Les fichiers de traduction

Toujours à la racine du site, on crée un répertoire appelé "Locale" (attention aux majuscules/minuscules). Ce répertoire contiendra 2 sous-répertoires, "en_US" et "fr_FR". Et dans chacun de ces 2 sous-répertoires, on ajoute un sous-répertoire "LC_MESSAGES".

On crée le fichier suivant de n'importe quel nom avec l'extension .po (avec n'importe quel éditeur de texte) :
msgid "Mon joli site utilisant gettext()"
msgstr "Mon joli site utilisant gettext()"

msgid "Mon joli site"
msgstr "Mon joli site"

msgid "Bonjour"
msgstr "Bonjour"

On ouvre le fichier avec poedit via fichier=>Ouvrir. On ne modifie rien, et on l'enregistre dans Locale/fr_FR/LC_MESSAGES (en spécifiant comme langue le français si la question est posée) et en lui donnant le nom "messages". Ceci va créer dans le répertoire Locale/fr_FR/LC_MESSAGES deux fichiers : messages.po et messages.mo.

On transmet messages.po à un traducteur français-anglais. Celui-ci, avec poedit, ouvre ce fichier via fichier=>Nouveau à partir d'un fichier POT/PO...

Il spécifie comme langue l'anglais.

Le traducteur saisie les traductions, enregistre le résultat et renvoie les fichiers .po et .mo générés (ou seulement .po, mais alors il te faudra générer le .mo avec poedit).

Le .po du traducteur devrait ressembler à :
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: en\n"

msgid "Mon joli site utilisant gettext()"
msgstr "My pretty site using gettext()"

msgid "Mon joli site"
msgstr "My pretty site"

msgid "Bonjour"
msgstr "Hello"

On met les deux fichiers .po et .mo dans le répertoire Locale/en_US/LC_MESSAGES.

3) Utilisation

Il faut vérifier que le serveur php a gettext() activé. Si ce n'est pas le cas, il faut modifier le fichier php.ini (ce n'est pas très dur).

Il faut arrêter-redémarrer le serveur.

Il ne reste plus qu'à afficher dans un navigateur soit page_fr.php soit page_en.php pour vérifier le résultat.

Bien sûr, la première fois, c'est laborieux. Mais une fois qu'on est rodé, ça va assez vite. Et surtout, on a une méthode qui est largement utilisée par ailleurs.

Amicalement,
Modifié par parsimonhi (05 Feb 2021 - 10:17)
parsimonhi

j'ai enlevé le " ; " devant gettex dans le fichier php.ini et redémarré.
j'ai bien messages.mo et po dans fr_FR/LC_MESSAGES.
mais impossible de traduire Smiley bawling la nuit j'ai la comprennette difficile
ce qui est drôle c'est que poedit et gettext qui permet de traduire ne sont qu'en anglais
qu'entend tu par:
On transmet messages.po à un traducteur français-anglais
Modérateur
Bonjour,

totoche89 a écrit :
qu'entend tu par:
On transmet messages.po à un traducteur français-anglais

C'est une question de répartition des tâches, sachant qu'évidemment, pour l"instant, en phase de test, tu es tout seul donc tu joues tous les rôles.

Il y a deux acteurs dans cette affaire, le développeur et le traducteur.

Le développeur (la personne qui donc à fait le code du site, c'est à dire toi) sait quelles sont les phrases à traduire. Il prend donc un éditeur de texte et dedans il met des séries de lignes :
msgid "Un exemple de phrase"
msgstr "Un exemple de phrase"

msgid "Un autre exemple de phrase"
msgstr "Un autre exemple de phrase"

Il faut bien faire attention à mettre une ligne vierge entre chaque paquet de 2 lignes.

Dans ce fichier, les lignes msgid et msgstr contiennent les mêmes chaines de caractères : le msgid est en quelque sorte la référence (ou autrement dit un identifiant, que j'ai choisi de mettre en français), et msgstr la traduction (ici en français aussi). Le nom de ce fichier doit se terminer par l'extension ".po".

On transmet ce fichier ".po" à un traducteur (la personne qui va traduire dans une autre langue, c'est à dire pour l'instant toi). Le traducteur lance poedit, et ouvre ce fichier via fichier=>Nouveau à partir d'un fichier POT/PO...

Et là, normalement, si le fichier ".po" a été correctement fabriqué par le développeur, il devrait pouvoir rajouter ses traductions pour chaque chaine de caractères.

Est-ce que tu arrives à faire ça ?

Amicalement,
Modifié par parsimonhi (07 Feb 2021 - 08:29)
excuse j'avais pas compris comme ça Smiley smile mais comme un traducteur en ligne sur un site japonais clic droit traduire la page en français et c'est fini. je suis un peut fainéant;)
bon la traduction marche en.po et en.mo sont en place. en_US/LC_MESSAGES.
en.po donne:

msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.1\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: en\n"


msgid "Mon joli site utilisant gettext()"
msgstr "My pretty site using gettext"

msgid "Mon joli site"
msgstr "My pretty site"

msgid "Bonjour"
msgstr "Hello"


mais quand j' appel http://192.168.0.33/site/page_en.php la page est en français
Modérateur
Bonjour,

Il faut relancer le serveur à chaque fois que tu modifies les .mo

C'est le gros inconvénient de la méthode.

Il existe des combines pour éviter de redémarrer le serveur, mais celles que je connais sont un peu crado. En production, mieux vaut relancer le serveur si on le peut.

Amicalement,
Modifié par parsimonhi (07 Feb 2021 - 12:55)
le problème ne viens pas des traductions mais des chemins, car même la traduction française ne marche pas Smiley decu
tu m'a donné:

<?php
$language="en_US";
putenv("LANG=".$language); 
setlocale(LC_ALL, $language);
$domain = "messages";
bindtextdomain($domain, "Locale"); 
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);
?>

et mon chemin complet est:
/var/www/html/site/Locale/en_US/LC_MESSAGES/
je ne connais rien en php mais j'ai changer LC_MESSAGES par LC_ALL mais ce n'est pas la solution, je donne ma LANG au chat
Modérateur
Bonjour,

Dans un premier temps, ne change rien, même pas une virgule, de ce que je t'ai donné. Quand ça marchera, alors tu pourrais essayer des modifications. Smiley cligne

J'ai résumé ce que tu dois avoir. On se concentre sur l'anglais.

Dans le dossier /var/www/html/site/ :

1) un script php appelé en.php qui contient :
<!DOCTYPE html>
<?php
$language="en_US";
putenv("LANG=".$language); 
setlocale(LC_ALL, $language);
$domain = "messages";
bindtextdomain($domain, "Locale"); 
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);
?>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="description" content="<?= _("Mon joli site utilisant gettext()") ?>">
<title><?= _("Mon joli site") ?></title>
</head>
<body>
<h1><?= _("Mon joli site") ?></h1>
<p><?= _("Bonjour") ?></p>
</body>
</html>


2) un sous-répertoire "Locale"
"Locale" contient lui-même un sous-répertoire "en_US"
"en_US" contient lui-même un sous-répertoire "LC_MESSAGES"
"LC_MESSAGES" contient lui-même 2 fichiers "messages.po" et "messages.mo".

3) "messages.po" contient :
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: en\n"

msgid "Mon joli site utilisant gettext()"
msgstr "My pretty site using gettext()"

msgid "Mon joli site"
msgstr "My pretty site"

msgid "Bonjour"
msgstr "Hello"


4) "messages.mo" peut être généré de la manière suivante :
On ouvre "messages.po" avec poedit
On fait dans poedit "enregistrer" via le menu "fichier" (ceci doit créer "messages.mo" dans le dossier /var/www/html/site/Locale/en_US/LC_MESSAGES).

5) On redémarre l'ordi (pour être plus sûr)

6) On lance un navigateur. On entre dans la barre d'adresse du navigateur l'adresse du script en.php, quelque chose comme http://localhost/en.php si tu testes directement sur ton ordi en local chez toi (c'est à dire que cet ordi est à la fois le serveur et le client).

Amicalement,
Modérateur
Bonjour,

Essaie de remplacer
putenv("LANG=".$language);


par
putenv("LC_ALL=".$language);


Amicalement,
Modérateur
Bonjour,

Ce n'est pas un problème avec gettext(). C'est un problème à propos la manière dont sont configurées les variables d'environnement concernant la "localisation" (LANG et LC_ALL). La valeur de ces variables est ... variable Smiley smile d'un système à l'autre et d'un compte utilisateur à un autre.

Et ce n'est pas vraiment un "problème", juste un choix de configuration qui a été fait à un moment ou à un autre  !

Amicalement,
Modifié par parsimonhi (08 Feb 2021 - 10:14)
Modérateur
Bonjour,

Si je comprends bien, ça marche pour le site en ligne et toujours pas pour le site en local chez toi, c'est ça ?

Si c'est ça, essaie :
putenv("LANG=".$language.".UTF-8");

ou
putenv("LC_ALL=".$language.".UTF-8");


Certains règlent le problème avec ça.

Amicalement,
bonjour Smiley smile

j'ai plusieurs petites questions

1: cela veut dire quoi "sujet chaud"
2: peut on employer plusieurs fichier .po pour la même langue ( je pense que non )
3: j'ai l' habitude de faire
en/index.php
fr/index.php
mais j'ai pas trouvé le truc pour le faire avec ce type de fichier
4: la je deviens gourmand, peut on faire une recherche automatique de la langue. Si oui je pense que je ferais un autre topic.
Modérateur
Bonjour,

totoche89 a écrit :
1: cela veut dire quoi "sujet chaud"

Dans quel contexte ?

totoche89 a écrit :
2: peut on employer plusieurs fichier .po pour la même langue ( je pense que non )

On peut.

totoche89 a écrit :
3: j'ai l' habitude de faire
en/index.php
fr/index.php
mais j'ai pas trouvé le truc pour le faire avec ce type de fichier

Je ne suis pas sûr d'avoir compris la question.

Tu peux mettre plusieurs fichiers .po dans les dossiers LC_MESSAGES. Tu peux même les mettre des sous-dossiers. Il suffit ensuite d'affecter le chemin approprié suivi du nom du fichier .po (mais sans l'extension .po) à la variable $domain. Par exemple, supposons que dans LC_MESSAGES, tu aies créé un sous-dossier "boutons", et que dans "boutons" tu aies mis "gros_boutons.po" et "petits_boutons.po" (qui contiennent respectivement les traductions pour les gros et les petits boutons). Le code php pour prendre en compte ces deux .po sera :

$domain = "boutons/gros_boutons";
bindtextdomain($domain, "Locale"); 
bind_textdomain_codeset($domain, 'UTF-8');
$domain = "boutons/petits_boutons";
bindtextdomain($domain, "Locale"); 
bind_textdomain_codeset($domain, 'UTF-8');

Ensuite, avant les _("..."), il faudra éventuellement rajouter un textdomain($domain); avec le nom de domaine approprié qui permet de dire à gettext() qu'il faut qu'il change de fichier de traduction. Par exemple supposons que tu aies deux boutons, l'un avec le texte "Mon petit bouton A" dont la traduction est dans "boutons/petits_boutons", et l'autre avec "Mon gros bouton B" dont la traduction est dans "boutons/gros_boutons", le code sera :

<?php textdomain("boutons/petits_boutons"); ?>
<button type="button"><?= _("Mon petit bouton A") ?></button>
<?php textdomain("boutons/gros_boutons"); ?>
<button type="button"><?= _("Mon gros bouton B") ?></button>

Mais évidemment, il faut mieux à l'intérieur d'une page ne pas trop multiplier les fichiers de traduction pour ne pas avoir des textdomain("...") à faire juste avant chaque traduction.

totoche89 a écrit :
4: la je deviens gourmand, peut on faire une recherche automatique de la langue. Si oui je pense que je ferais un autre topic.

S'il s'agit de détecter automatiquement la langue de l'utilisateur, il faut effectivement ouvrir un autre sujet.

Mais bon, personnellement, je trouve très (très très ...) énervant que l'on décide pour moi de la langue de la page.

Amicalement,
excuse j'ai pas trouvé pour mettre les petites barres à gauche
    totoche89 a écrit :
    1: cela veut dire quoi "sujet chaud"

parsimonhi repond:
Dans quel contexte ?


totoche89 répond:
dans le contexte d'alsacréation.com sur ma demande d'aide a coté du nombre de réponses il y a un petit éclair "sujet chaud"

    totoche89 a écrit :
    3: j'ai l' habitude de faire
    en/index.php
    fr/index.php
    mais j'ai pas trouvé le truc pour le faire avec ce type de fichier

parsimonhi repond:
Je ne suis pas sûr d'avoir compris la question.


totoche89 répond:
pour une personne qui veux un site en langue française il va:
http://totoche89.free.fr/fr/index.php
pour une personne qui veux un site anglais il va:
http://totoche89.free.fr/en/index.php
et la je n'arrive pas à faire fonctionner en.php en lui donnant le nom de index.php dans le répertoire /en Smiley bawling


parsimonhi repond:
Mais bon, personnellement, je trouve très (très très ...) énervant que l'on décide pour moi de la langue de la page.


totoche89 répond:
mais si tu va sur un site islandais et que tu as Veldu tungumál traduction: ->choissisez votre langue . je pense qu'il vaut mieux que tu arrive sur le site en français et que tu puisse choisir l'islandais

parsimonhi repond:
Mais évidemment, il faut mieux à l'intérieur d'une page ne pas trop multiplier les fichiers de traduction pour ne pas avoir des textdomain("...") à faire juste avant chaque traduction.


totoche89 répond:
ok je vais réfléchir à ça
Pages :