Formulaire menu_lang plat sans URL sur la langue sélectionnée
mercredi 7 mars 2007, par vianatalia. Dernier ajout lundi 14 avril 2008
Une variation sur le choix des langues et de l’aspect de l’URL engendrée
Dans un site multilingue, #MENU_LANG permet aux visiteurs de passer d’une langue à l’autre. Pour cela, il dépose un cookie sur l’ordinateur du visiteur où il indique en quelle langue naviguer. Cette contrib agit exactement pareil, mais n’affiche pas le choix des langues de la même manière.
Il s’agit d’afficher #MENU_LANG mais :
une langue à côté de l’autre
sans URL pour la langue dans laquelle on navigue
Installation
Configuration site
Vous avez dans un premier temps configuré, dans la partie privée de SPIP (configuration : gestion des langues > multilinguisme), toutes les langues dans lesquelles sera traduit votre site, en cochant / décochant celles-ci dans la longue liste.
Préparation de « mes_fonctions.php »
Si vous n’avez pas encore créé le fichier mes_fonctions.php, créez un fichier et nommez-le mes_fonctions.php dans votre répertoire /squelettes. Collez le code suivant dans un premier temps, en veillant bien à ne pas avoir de caractères (espaces, retour de chariot…) ni avant, ni après :
Puis, entre les deux balises ci-dessus, copiez/collez dans ce fichier la fonction qui suit (fonction mise à jour le 30/11/07) :
Pour afficher les langues en deux lettres (EN - FR) :
Pour afficher les langues en entier (English - Français) :
Utilisation
Squelettes
Dans vos squelettes, appelez le menu avec la balise #CONFIG{langues_utilisees} suivie du filtre url_lang :
J’ai utilisé ce menu de mon site.
Il s’affiche correctement
Il se trouve que le lien de traduction se retrouve "fixer" : je m’explique :
Je vide le cache ds l’interface admin
je vais sur le site... et navigue... je demande un changement de langue pour l’article X : ça fonctionne
si je continue à naviguer et redemande une traduction d’un autre article... le lien me renvoie toujours sur la traduction de l’article X, et cela même si je me connecte avec une autre machine.
... ds l’urgence je l’ai fait sur la homepage... mais c’est pas très pratique.
J’ai remarqué récemment un dysfonctionnement mais apparemment pas le même : je suis sur la page accueil en EN. Je vais à la page recherche. Je change la langue : FR. Je navigue vers des pages que je n’ai pas encore visité : tout va bien. Je reviens à la page accueil, elle s’affiche en EN.
Dans les deux cas je crois que c’est lié au cache de SPIP. Si jamais je mets le cache à 0 dans le squelette, le problème disparaît. Non ?
Tout d’abord merci de votre réponse.
La piste semble plausible.
J’ai fait l’essai en rajoutant : #CACHE{0} au début des squelettes : sommaire, rubrique et article.html
Résultat : aucun changement notoire malheureusement !
Le changement de langue s’effectue toujours correctement mais cela ne renvoie pas sur la bonne page.
Cela fonctionne si, dans une page je clic sur le bouton "Recalculer la page" : Là le lien se fait parfaitement.
Mais après : tous les changement de langue ramène à cette dernière traduction : comme si le numéro de l’article ou de la rubrique étais "scotché" une 1ère fois dans le lien langue.
Je continue à chercher mais je ne suis pas très à l’aise en php.
Bonjour,
j’essaie de mettre en place un site multilingue fr-en-es.
J’ai du mal à comprendre et ma logique actuelle serait de traduire les rubriques.
par exemple rubrique 1 présentation [en français] puis une traduction de la rubrique en espagnol et une autre traduction pour l’affichage de la rubrique 1 en anglais
Seulement acuellement je n’ai pas la possibilité de traduire les rubriques. Pourtant j’ai bien configuré la gestion des langues sur "Activer le menu de langue sur les rubriques"
J’ai lu un peu tout ce qui existe sur le sujet mais suis parfois un peu flippé de lire des articles plus adaptés à la version 9.2 de spip. Quoi qu’il en soit j’ai effectivement mis en place une arborescence via les blocs multi ( donc sans duplication de l’arbo par secteur langue)
ensuite je procede par traduction d’articles.
ça marche niquel !
Pour le plugin dont tu me parles. Il permettrait donc aux utilisateurs du back office de creer des rubriques et sous rubriques sans avoir a saisir les balises multi et [es][fr][en] ? j’ai juste ?
sais tu s’il rentre en conflit avec fckeditor ?
Voilà j’ai des milliers d’autres questions parceque je démarre juste mais c’est plutot super bien foutu spip !.
Merci de ton aide
Fourmy
[ j’ai biensur répondu à l’alerte mail (ce qu’il ne fallait pas faire !) avant de capter le lien vers le forum- Désolé]
Pour le plugin dont tu me parles. Il permettrait donc aux utilisateurs du back office de creer des rubriques et sous rubriques sans avoir a saisir les balises multi et [es][fr][en] ? j’ai juste ?
Tout a fait
Mais pour le conflit avec fckeditor, je ne sais pas... Essaye
Dans un site (SPIP 1.9.2c [10268]) configuré en multilingue, avec un menu de langue activé sur les articles et les rubriques, tous les titres : du site, des rubriques et des articles sont bien gérés au changement de langue avec les balises (utilisation du plugin : extension_multilingue_pour_BTV2). L’affichage des bons textes des différentes traductions se fait bien aussi dans toutes les pages. L’option : $forcer_lang = true ; est présente dans mes_options.php (dossier ecrire) et filtre lang est utilisé sur les boucles.
Pourtant ce script présent dans mes_fonction.php (dossier squelettes) et bien appelé dans les squelettes ne donne RIEN.
J’ai sans doute oublié quelque chose, mais quoi ?
Antoine
Une source d’erreur certaine : le fichier mes_options.php se range désormais dans config/ avec la version 1.9.2. Pour plus de détails : http://www.spip.net/fr_article3567.html, paragraphe sur la réorganisation des répertoires !
Tout petit détail complémentaire : vérifie que tu as bien un fichier mes_fonctions.php dans squelettes/ et pas mes_fonction.php comme écrit dans ton message ;-)
Cela ne donne toujours rien (même avec les bons fichiers "options.." et "fonctions.." au bon emplacement). Sur la page "config_multilang" le "Français" (lien vert) est affiché mais pas le lien "Anglais" alors que cette langue est cochée plus bas dans la liste. Il n’y a pas de traduction d’articles en anglais, mais les titres et les textes sont présents dans les articles en français et en anglais avec les balises , et le changement de langue fonctionne bien dans le site public et privé avec la balise #MENU_LANG.
Cependant, quand j’utilise un menu PLAT pour le choix entre l’anglais et le français, toutes les formules ne donnent que le français, car c’est la seule langue reconnue comme étant utilisée dans le site, pourquoi ?
Sur la page « config_multilang » le « Français » (lien vert) est affiché mais pas le lien « Anglais » alors que cette langue est cochée plus bas dans la liste.
Le français apparaît ainsi car c’est la langue principale du site. Les langues de traduction sont simplement cochées dans la liste.
Cependant, quand j’utilise un menu PLAT pour le choix entre l’anglais et le français, toutes les formules ne donnent que le français.
Nous en sommes au même point : j’obtiens exactement le même comportement sur mon site. J’ai testé un double affichage (#MENU_LANG et menu_lang plat) dans ma page sommaire. Résultat : le français est affiché seul à plat alors que le menu local me propose bien les deux langues.
Bonjour, merci à Michael d’avoir "sonné" ma boîte mail pour que je vienne faire un tour ici :-)
Avant toute chose j’ai besoin de l’URL du site qui pose problème ?
Et de celle du plugin "multilingue" que je ne connais pas et que je soupçonne un peu.
Bravo cette modification me donne parfaitement satisfaction et j’obtiens enfin un menu de langues plat dans un site multiligue qui n’utilise que la gestion des différentes traductions avec les balise "multi". Gestion très facile avec le plugin "extension_multilingue_pour_BTV2".
J’espère aussi que ce code, qui marche apparemment bien, est fiable et sans effet négatif sur le fonctionnement général de Spip.
Merci beaucoup
Antoine
Mais ça ne me satisfait pas sur un point : les langues changent d’ordre en fonction de la langue choisie... et sur mon cahier des charges l’ordre ne doit pas bouger :-(....
Ce que je me dis : #Menu_LANG sert à changer la langue de l’interface, et non pas des articles. Les langues des articles sont gérées par les boucles de traduction...
... mais il y a pas mal de combinaisons possibles, alors si ça peut être utile dans l’une ou l’autre, tant mieux :-)
la contrib utilise un tableau PHP qui est alimenté à chaque appel de page par SPIP. Il n’y a donc aucun parcours dans la base. L’avantage est que la construction du menu est très rapide.
A l’inverse, le menu tel qu’il est calculé dans le squelette Alternative à l’inconvénient majeur de reparcourir l’ensemble des rubriques à chaque fois qu’il est reconstruit. Il n’y a rien de pire côté perfs que des boucles qui parcourent la totalité d’une table : derrière, c’est des requetes SQL qui tournent et un parcourt complet ne permet aucune optimisation (utilisation des index, etc..). Pour peu que le site présente un grand nombre de rubriques, avec une mauvaise mise en cache du menu, la chute des perfs devient vite sensible.
La requete générée par la boucle d’Alternative utilise en fait le champ "lang" qui est un champ indexé dans les tables MySQL. La consommation est donc assez faible.
Comment récupérer le menu lang : http://zone.spip.org/trac/spip-zone/browser/_squelettes_/alter/themes/alternatives/inc/inc-bas_menu-lang.html l’url ne marche plus.
Merci beaucoup.
Intéressant, mais si c’est basé sur les deux premières lettres de la langue, ça ne marche pas pour le néerlandais. En effet, on symbolise cette langue par NL et non NE...
Il faudrait plutôt un système basé sur des symboles textes ou images préencodés dans l’interface privée. On pourrait y mettre des lettre, mais aussi des drapeaux,...
Je n’aime pas beaucoup les drapeaux dans les choix des langues... l’espagnol est parlé aussi bien en Argentine qu’en Espagne, pourquoi mettre un drapeau espagnol ? Etc...
Après, tout est possible pour le menu de choix des langues, cette contrib ne fait que répondre à une demande bien spécifique : ne pas mettre de lien sur la langue en cours dans le type de sites où une rubrique n’a pas de langue spécifique.
C’était un exemple, mais moi non plus je n’aime pas les drapeaux. Ici, en Wallonie, on parle français et nous sommes en Belgique...
Par contre pour le problème NL à la place de NE pour le néerlandais, il suffit à mon avis d’ajouter un condition en php qui redéfinit la variable $texte en NL si elle est égale à NE...
Fausse alerte, j’ai parlé trop vite. La variable transmise pour le néerlandais est bien NL. Donc tout est ok Natalia. Désolé pour les chipos inutiles...
Mais un exemple où les drapeaux ont leur sens : je gère des sites franco-allemands au sens France-Allemagne. Donc ils ne concernent ni l’Autriche, ni la Suisse, ni la Belgique...
Mais vous parlez le FRANCAIS, il est donc normal pour symboliser le FRANCAIS de mettre un drapeau FRANCAIS, au même titre que de mettre un drapeau ESPAGNOL pour l’ESPAGNOL, même s’il est parlé dans d’autres pays.
Fonction simplifiée qui devrait marcher sur toutes les versions de spip.... (à confirmer) :
J’ai ajouté une classe sur la langue en cours, afin de la personnaliser. Remplacez la fonction + ajoutez une classe nommée "languencours" à votre feuille de styles.
Après test des 2 modifications proposées pour la fonction url_lang() sur un spip version 1.9.3 [9398] utilisant les url_propres, seul le code de la première mise à jour (celle du 16 mars) semble fonctionner.
Pour compléter, si on veut afficher les langues en entier (English - Français...) cette fonction donne donc :
Ne pas oublier de paramétrer la variable de personnalisation $forcer_lang à true dans le fichier mes_options.php si on souhaite que l’intégralité de la navigation passe dans la langue souhaitée lors du clic sur un lien de traduction.