qTranslateのような多言語Webサイトの書き換えルール?


8

言語切り替え用の独自の小さなプラグインを書きたいのですが。そのためには、まず最初に、書き換えルールを実行します。私は2時間Webを見回していますが、質問に対する答えはまだ見つかりませんでした。

このようにしたい:http://www.mysite.com/de/post-title/またはhttp://www.mysite.com/de/projects/project-title/

基本的に、私がしようとしていることは、現在のURLとそのすべてのパラメーターを保持することです。サイトのURLとパスの間に現在アクティブな言語スニペットを追加するだけです。これまでのところ私のコードです:

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

このプラグインへの小さなヒントは、各言語の書き換えを含むその仕事をします。
bueltge 2013

回答:


10

私は今それを手に入れました、多くのリソースを検索した後:

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

このコードをに追加しますfunctions.phpコードを追加したら、に移動しwp-admin/options-permalink.phpて押しますSave Changes

これで、テンプレートでlangコードを確認/使用できるようになりました。

<?php echo lang();?>

または if( lang() === "en" )

私のサンプルコードを使用した作業URLの例:

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)

より良いアイデア/バグ修正者/エラー+バグが見つかりましたか?https://gist.github.com/l2aelba/5244912


1
まあ、そのような一般的な名前を持つ単純な関数はすぐに競合を引き起こします。プレフィックスを付けるか、擬似名前空間(クラス)でラップする必要があります。そして、SSLのより安全なチェックについては、この要点をチェックしてください。
カイザー2013

2
これは素晴らしいです、l2aelbaに感謝します!このように試してみますが、より「古典的な」アプローチは、リンクの残りの部分の前に常に言語コードを置くことです。たとえば、[home_url] [lang] [mypost]または„ domain.com/en/ mypage“。これを達成する方法に関するアイデアはありますか?
rassoh 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.