Aturan Menulis Ulang untuk Situs Web Multilingual, Suka qTranslate?


8

Saya ingin menulis plugin kecil saya sendiri untuk alih bahasa. Untuk itu, hal pertama adalah menjalankan aturan penulisan ulang. Saya telah mencari di web selama 2 jam, tetapi saya belum menemukan jawaban untuk pertanyaan saya.

Saya ingin memilikinya seperti ini: http://www.mysite.com/de/post-title/atauhttp://www.mysite.com/de/projects/project-title/

Jadi pada dasarnya, apa yang saya coba lakukan adalah menjaga url saat ini dan semua parameternya, cukup tambahkan potongan bahasa yang sedang aktif antara url situs dan path. Ini kode saya sejauh ini:

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

Petunjuk kecil untuk plugin ini , ada pekerjaan itu, termasuk penulisan ulang untuk setiap bahasa.
bueltge

Jawaban:


10

Saya mengerti sekarang, Setelah mencari banyak sumber:

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;
}

Tambahkan kode ini functions.php. Setelah menambahkan kode, buka wp-admin/options-permalink.phpdan tekanSave Changes

Jadi sekarang Anda dapat memeriksa / menggunakan kode lang di template Anda seperti ..

<?php echo lang();?>

atau if( lang() === "en" )

Contoh url kerja dengan kode contoh saya:

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)

Gagasan / perbaikan bug yang lebih baik / ditemukan kesalahan + bug? https://gist.github.com/l2aelba/5244912


1
Nah, fungsi polos dengan nama generik seperti itu akan dengan cepat memunculkan konflik. Harus diawali atau dibungkus dalam namespace pseudo (kelas). Dan untuk pemeriksaan yang lebih aman untuk SSL, periksa intinya .
kaiser

2
Ini bagus, terima kasih banyak l2aelba! Sementara saya akan mencobanya seperti ini, pendekatan yang lebih "klasik" adalah memiliki kode bahasa selalu di depan sisa tautan, misalnya [home_url] [lang] [mypost] atau „domain.com/en/ halamanku". Ada ide tentang bagaimana mencapai ini?
rassoh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.