web-dev-qa-db-fra.com

Thème multilingue: Changer les paramètres régionaux en fonction de l'URL

Je développe un thème multilingue. J'utilise la fonction __ () pour la traduction, ce qui fonctionne très bien. La langue principale est l'anglais, mais la deuxième langue est l'allemand. Pour cette deuxième langue, j'aimerais ajouter un "/ de /" - Slug, j'ai donc créé une règle de réécriture:

function rewrite_rule_de(){
    add_rewrite_rule('de/(.+?)/?$', 'index.php?pagename=$matches[1]&language=de', 'top');
}
add_action('init', 'rewrite_rule_de');

Comme vous pouvez le constater, j’ai également ajouté une variable get (language = de), qui devrait indiquer à Wordpress que la page affichée est en allemand. Parce que Wordpress ne traite pas simplement cette get-variable, je l'ai ajoutée à query_vars:

function language_query_var($public_query_vars){
    $public_query_vars[] = 'language';  
    return $public_query_vars;  
}
add_action('query_vars', 'language_query_var');

Je souhaite modifier les paramètres régionaux, en fonction de la langue de la page affichée, j'utilise donc la fonction suivante:

function set_my_locale( $lang ){
  if ('de' == get_query_var('language')){
    return 'de_DE';
  }else{
    return 'en_US';
  }
}
add_filter('locale', 'set_my_locale');

Mon problème ici est que get_query_var ('langue') n'est pas défini dans la fonction "set_my_locale". Mais cela fonctionne lorsqu'il est utilisé avant la boucle, par exemple ...

Ma question est donc simplement la suivante: comment puis-je modifier les paramètres régionaux (de sorte que la fonction __ () génère la langue appropriée) en fonction d'une règle de réécriture?

1
lupor

Mon problème ici est que get_query_var('language') n'est pas défini dans la fonction set_my_locale

Parce que get_locale (qui applique le filtre locale) est appelé avant wp() (qui analyse la requête et configure les variables).

Vous devrez inspecter manuellement la demande vous-même:

if ( strpos( $_SERVER['REQUEST_URI'], '/de/' ) === 0 ) {
    // German
} else {
    // English
}

Notez que WordPress doit s'exécuter sous l'URL racine, c'est-à-dire http://example.com/ .

2
TheDeadMedic