web-dev-qa-db-fra.com

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

Je voudrais écrire mon propre petit plugin pour le changement de langue. Pour cela, la première chose à faire serait de faire fonctionner les règles de réécriture. Cela fait 2 heures que je regarde sur le Web, 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/ ou http://www.mysite.com/de/projects/project-title/

Donc, en gros, 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. 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');
7
rassoh

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 dans functions.php. Après avoir ajouté le code allez à wp-admin/options-permalink.php et appuyez sur Save Changes

Alors maintenant, vous pouvez vérifier/utiliser le code de langue 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 bugs/erreur trouvée + bogue? https://Gist.github.com/l2aelba/5244912

10
l2aelba