Réécrire la règle pour un site Web multilingue, comme qTranslate?


8

Je voudrais écrire mon propre petit plugin pour changer de langue. Pour cela, la toute première chose serait de faire fonctionner les règles de réécriture. Je regarde le Web depuis 2 heures, mais je n'ai pas encore trouvé de réponse à ma question.

Je voudrais l'avoir comme ceci: http://www.mysite.com/de/post-title/ouhttp://www.mysite.com/de/projects/project-title/

Donc, fondamentalement, ce que j'essaie de faire est de conserver l'URL actuelle et tous ses paramètres, il suffit d'ajouter l'extrait de langue actuellement actif entre l'URL du site et le chemin d'accès. Voici mon code jusqu'à présent:

function rewrite_rule_de(){
    add_rewrite_tag('%lang%','([^&]+)');
    add_rewrite_rule('^de/(.+?)/?$', 'index.php?p=$matches[1]&lang=de', 'bottom');
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action('init', 'rewrite_rule_de');

Un petit indice pour ce plugin , il fait ce travail, y compris la réécriture pour chaque langue.
bueltge

Réponses:


10

Je l'ai maintenant, après avoir recherché de nombreuses ressources:

function lang_support() {
    return array('en','fr'); // Add your support lang-code (1st place is a default)
}

function rewrite_lang(){
    $langs = lang_support();
    foreach($langs as $lang) {
        add_rewrite_endpoint($lang,EP_PERMALINK|EP_PAGES|EP_ROOT|EP_CATEGORIES);
    }
}
add_action('init','rewrite_lang');

function lang(){
    global $wp_query;
    $langs = lang_support();
    $lang_r = "";
    foreach($langs as $lang) {
        if(isset($wp_query->query_vars[$lang])) {
            $lang_r = $lang;
            $_SESSION['lang'] = $lang_r;
        }
    }
    if(in_array($lang_r,$langs)) {
        return $lang_r;
    } else {
        return $langs[0];
    }
}

function init_session(){session_start();}
add_action('init','init_session',1);

function lang_session() { // Redirect by JS if session is set
    $url_lang= basename($_SERVER['REQUEST_URI']);
    if(!in_array($url_lang,lang_support()) && isset($_SESSION['lang'])) {
        if(!is_404()) {
          wp_redirect(currentURL().$_SESSION['lang'],301);
          exit;
        }
    }
}
add_action('wp_head','lang_session');

function output_buffer() {ob_start();}
add_action('init','output_buffer');

function currentURL() {
    $pageURL=(@$_SERVER["HTTPS"]=="on")?"https://":"http://";
        if($_SERVER["SERVER_PORT"]!="80"){
            $pageURL.=$_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        }else{
            $pageURL.=$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $pageURL;
}

Ajoutez ce code functions.php. Après avoir ajouté le code, accédez à wp-admin/options-permalink.phpet appuyez surSave Changes

Alors maintenant, vous pouvez vérifier / utiliser le code lang dans votre modèle comme ..

<?php echo lang();?>

ou if( lang() === "en" )

Exemple d'URL de travail avec mon exemple de code:

http://domain.com/ <-- "en"
http://domain.com/en/ <-- "en"
http://domain.com/fr/ <-- "fr"
http://domain.com/es/ <-- "en" (coz , "es" code not set)

http://domain.com/mypage/ <-- "en" (work with "page")
http://domain.com/mypage/fr/ <-- "fr"
http://domain.com/mypage/es/ <-- "en" (coz , "es" code not set)

http://domain.com/mypost/ <-- "en" (work with "post")
http://domain.com/mypost/fr/ <-- "fr"
http://domain.com/mypost/es/ <-- "en" (coz , "es" code not set)

Meilleure idée / correcteur de bogues / erreur trouvée + bogue? https://gist.github.com/l2aelba/5244912


1
Eh bien, les fonctions simples avec de tels noms génériques provoqueront rapidement des conflits. Doit être préfixé ou enveloppé dans un pseudo-espace de noms (classe). Et pour une vérification plus sûre de SSL, vérifiez cet élément essentiel .
kaiser

2
C'est super, merci beaucoup l2aelba! Bien que je puisse l'essayer comme ceci, l'approche la plus «classique» serait d'avoir le code de langue toujours devant le reste du lien, par exemple [home_url] [lang] [mypost] ou „domain.com/en/ ma page". Des idées sur la façon d'accomplir cela?
rassoh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.