web-dev-qa-db-fra.com

Définir la langue par poste

J'ai un blog bilingue avec l'anglais comme langue principale et l'arabe. Actuellement, j'utilise le message "Custom Field" pour indiquer qu'il est en arabe et que je l'utilise dans le thème de mon enfant pour modifier l'orientation de RTL et la traduction du texte en arabe. Toutefois, je le fais manuellement, ce qui signifie que je personnalise entièrement le thème. avec des chaînes dans les deux langues et choisissez celle qui convient en fonction de la valeur du champ personnalisé et définissez également la direction des balises HTML pour le titre, le corps et les commentaires de l'article. Cela fonctionne, cependant, changer le thème plus tard signifie que je dois tout refaire. J'essaie également d'utiliser un plugin de commentaire "wpDiscuz", mais il n'y a pas d'autre moyen de contrôler la langue que l'édition du plugin lui-même, ce que je ne veux pas faire car je veux pouvoir le mettre à jour facilement et ne pas le refaire. changements après chaque mise à jour.

Depuis WP, _ prend déjà en charge la langue arabe et propose les traductions sous forme de fichiers .mo avec le fichier css correct, ainsi que le nouveau plug-in prenant en charge les traductions .mo. Je pensais utiliser cela et trouver un moyen de changer la langue de wordpress en arabe uniquement pour certains messages. Cependant, je ne suis toujours pas en mesure de le faire.

J'ai créé un plugin avec un seul fichier functions.php et voici le contenu:

function my_reset_locale($locale) {
    $locale = 'ar';
    return $locale;
}
add_filter('locale','my_reset_locale',10);

Celui-ci le change pour tout (page de couverture et tous les messages simples), j'ai essayé de lire le code postal.

global $post;
$postId = isset($post) ? $post->ID : '';

Mais les 4 premiers appels de ma fonction ont lieu avant que $ post-> ID ne soit défini et si j'attends qu'elle soit définie, il devient trop tard car la langue a déjà été chargée et la modification de $ locale après ne fait rien.

Alors, que puis-je faire pour obtenir des informations sur le post tôt et avant que la langue soit lue (je pense que c'est "load_textdomain" qui est appelé pour sélectionner la traduction en fonction de la locale ")

4
Fahad Alduraibi

Je ne pouvais pas trouver de réponse alors j'ai fini par fournir la solution.

Ce n'était pas simple étant donné que je ne suis pas un expert en wordpress ni en php, mais la documentation Wordpress est excellente, voici donc la solution:

// Set the post language when loading up the page based on the store meta
function ppl_set_post_language() {
    $postID = url_to_postid( $_SERVER["REQUEST_URI"] );
    if ($postID > 0) {
        $postLanguage = esc_attr( get_post_meta( $postID, '_ppl_post_language', true ) );
        if ( ! empty( $postLanguage ) ) {
            global $locale;
            $locale = $postLanguage;
        }
    }
}
// Any call to 'url_to_postid' earlier then 'setup_theme' will generate a fatal error.
add_action('setup_theme', 'ppl_set_post_language');

Lorsque vous modifiez l'article ou la page, enregistrez le code de langue (par exemple, en_US ou ar) dans l'article meta. Cette partie est facile, cependant, le problème réside dans l'affichage de la page, quand exécutez-vous le code qui vérifie la langue? Si vous l'exécutez trop tôt, vous n'aurez pas l'ID de l'article puisqu'il n'est pas encore chargé par wordpress. Si vous attendez et exécutez le code tardivement, il sera trop tard car wordpress chargera la langue par défaut. Le point positif que j'ai trouvé se trouve dans l'action setup_theme car, à cette étape, les traductions ne sont pas encore chargées et nous pouvons appeler url_to_postid pour obtenir l'ID de publication que nous utilisons pour récupérer la méta de publication.

Après avoir fait cela, je me suis dit pourquoi ne pas créer un plugin WordPress dont d’autres puissent bénéficier et qui est ici:

https://wordpress.org/plugins/per-post-language/

2
Fahad Alduraibi