[AUTOMATIQUE] Cet article a plus de 5 ans.
Il se peut donc que les informations qu'il fournit ne soient plus totalement exactes.

Si comme moi vous n’avez pas un site intégralement traduit, mais seulement quelques articles, vous avez certainement envie d’informer les utilisateurs que tel ou tel article est disponible dans une autre langue.

Je me suis penché sur la question en rédigeant les docs de mes plugins. Les ayant d’abord rédigées en anglais pour qu’elles soient accessibles au plus grand nombre, je me suis ensuite dit qu’il était dommage de ne pas les traduire en français ! J’ai donc traduit les articles en question, mais je n’ai pas trouvé de moyen de passer simplement du français à l’anglais et vice versa. J’ai donc épluché la documentation du plugin Polylang qui m’a permis de rendre mon site multilingue, et j’ai trouvé les éléments qu’il me fallait.

Voici la fonction que vous pouvez utiliser pour détecter si une traduction existe pour un article :

function bweb_translation_available($content){
	if ( !is_singular( 'post' ) )
	return $content;
	
	global $polylang;
	$translationIds = $polylang->model->get_translations('post', get_the_ID());
	$currentLang = pll_get_post(get_the_ID(), pll_current_language());
	
	foreach ($translationIds as $key=>$translationID){
		if($translationID != $currentLang){
			$availableLang = $polylang->model->get_languages_list();
			foreach( $availableLang as $lang){
				if($key == $lang->slug){
					$newContent.= '<a class="post-transltation" href="' . get_permalink($translationID) . '">';
						if ( $lang->slug == 'fr'){
							$newContent.= 'Cette page est également disponible en ' . $lang->name . ' <img src="' . $lang->flag_url . '" alt="' . $lang->name . '">';
						} else {
							$newContent.= 'This page is also available in ' . $lang->name . ' <img src="' . $lang->flag_url . '" alt="' . $lang->name . '">';
						}
					$newContent.= '</a>';
				}
			}
		}
	}
	$newContent.= $content;
	return $newContent;
}
add_filter('the_content', 'bweb_translation_available',11); 

La fonction ajoutera automatiquement un lien pour changer de langue tout en haut du contenu si ce dernier est disponible dans une autre langue. Dans mon cas, j’ai restreint le filtre sur les pages de type article uniquement.

Si vous n’êtes à l’aise avec le CSS, voici le style que j’utilise sur bweb :

.post-transltation {
	display: inline-block;
	width: 100%;
	padding: 15px 25px;
	text-decoration: none;
	font-size: 1.05em;
	margin: 0 0 25px 0;
	color: #fff;
	background-color: #db3939;
	text-align:center;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
.post-transltation:hover,
.post-transltation:active {
	color: #fff;
	background-color: #444;
}

 

Article rédigé parBrice CAPOBIANCO

Autodidacte passionné par WordPress. J'aime apprendre et créer pour ensuite partager !

Coorganisateur des Meetups WordPress Rennes et fondateur de bweb.
Partager cet article

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Afficher les 3 commentaires

3 commentaires

  1. Merci pour ce bout de code bien utile ! Je l’ai intégré à mon blog avec succès ! C’est d’ailleurs selon moi un aspect qui manque par défaut à Polylang.

  2. Intéressant. Par contre, comment faites-vous pour traduire les informations enregistrées dans des customs fields générés par exemple par ACF et affectés à un type de page ? Faut-il tous les dupliquer afin de les affecter à chaque page traduite avec polylang ?

    • Hello,
      Quand tu ajoutes un custom fields dans un post/page/cpt, et si ta page est traductible (option activée ou non dans Polylang), tu dois traduire les champs générés pas ACF dans chacune des pages lorsque tu la rédires. Ca fonctionne de la même manière que quand tu rédiges le contenu principale, en FR tu le rédiges en FR, en EN tu le rédiges en EN, donc idem pour tous les autres champs ajoutés par ACF ou pas.