Definir idioma por postagem

4

Eu tenho um blog bi-lingual com o inglês como idioma principal e árabe. Atualmente eu uso o post "Custom Field" para indicar que o post é árabe e eu uso isso no meu tema filho para mudar a direção do RTL e a tradução do texto para o árabe, no entanto, manualmente, o que significa que eu personalizo completamente o tema com strings em ambas as linguagens e escolha a correta com base no valor do campo personalizado e também defina a direção das tags html para o título, corpo e comentários da postagem. Está funcionando, entretanto, mudar o tema depois significa que preciso refazer tudo. Também estou tentando usar um plug-in de comentários "wpDiscuz", mas não há uma maneira fácil de controlar o idioma além de editar o próprio plug-in, o que não quero fazer, pois quero poder atualizá-lo facilmente e não refazer o muda após cada atualização.

Como o WP já suporta o idioma árabe e tem as traduções como arquivos .mo com o rtl css correto, e também o novo plugin suporta traduções .mo. Eu pensei que vou utilizar isso e encontrar uma distância para alterar a linguagem wordpress para o árabe apenas para determinados posts. No entanto, ainda não tenho fardo para fazer isso.

Eu criei um plug-in com o arquivo único functions.php e esse é o conteúdo:

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

Este muda para tudo (primeira página e todas as postagens únicas), eu tentei ler o ID do post

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

Mas as primeiras 4 chamadas para minha função acontecem antes de $ post- > ID ser definido e se eu esperar até que seja definido, é tarde demais já que o idioma já foi carregado e mudar $ locale depois disso não faz nada.

Então, o que posso fazer para obter informações sobre a postagem antes e antes de o idioma ser lido (acho que é "load_textdomain" que é chamado para selecionar a tradução com base na localidade ")

    
por Fahad Alduraibi 03.04.2016 / 00:41

1 resposta

2

Não consegui encontrar uma resposta, por isso acabei por fornecer a solução.

Não foi simples, dado que não sou especialista em wordpress nem em php, mas a documentação do Wordpress é ótima, então aqui está a solução:

// 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');

Ao editar a postagem ou a página, armazene o código do idioma (por exemplo, en_US ou ar ) na postagem meta . Esta parte é fácil, no entanto, o problema é quando exibindo a página quando você executa o código que verifica o langauage? Se você executá-lo muito cedo, você não terá o ID do post, já que ele ainda não está carregado pelo wordpress, e se você esperar e executar o código tarde, será tarde demais, já que o wordpress carregará o idioma padrão. O ponto ideal que encontrei está na ação setup_theme , já que nessa etapa as traduções ainda não foram carregadas e podemos chamar url_to_postid para obter o ID do post que usamos para recuperar o post meta.

Depois de fazer isso, pensei por que não criar um plug-in do WordPress do qual outras pessoas possam se beneficiar e aqui está:

enlace

    
por Fahad Alduraibi 13.04.2016 / 22:01