0

言語名を含むセグメントを 2 文字の言語コードだけに変更して、多言語 CI サイトの URI をクリーンアップしようとしています。

現在、私の URI は次のようになっています。

http://example.com               //  Home (English)
http://example.com/english/home  //  Home (English)
http://example.com/home          //  404 (should go to english/home)

http://example.com/sv            //  404 (should go to swedish/home)
http://example.com/swedish/home  //  Home (Swedish)
http://example.com/sv/home       //  404 (should go to swedish/home)

application/config/routes.phpとの両方を試しまし.htaccessたが、あまり進歩していないように感じます。どちらを使用する必要がありますか? 希望する結果を得るにはどうすればよいですか?

現状では、私のファイルは次のようになります。

// .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /example/index.php/$1 [L]

// application/config/routes.php (minus docs)
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$route['default_controller'] = "pages/view/home";
$route['([a-z]+)/([a-z]+)'] = "pages/view/$2";
?>

// application/controllers/page
<?php

class Pages extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->language = $this->uri->segment(1);
    }

    public function view ($page = 'home') {

        if (!file_exists('application/views/pages/'.$page.'.php'))
            show_404();

        $data['title'] = $page;

        $this->lang->load('general',$this->language);
        $this->load->view('templates/header', $data);
        $this->load->view('pages/'.$page, $data);
        $this->load->view('templates/footer', $data);

    }
}
?>
4

3 に答える 3

2

routes.php でこれを試してください:

$route['default_controller'] = "pages/view/home";
$route['(en|sv)'] = 'pages/view/home';
$route['(en|sv)/([a-z]+)'] = 'pages/view/$2';

コントローラ コンストラクタ:

function __construct(){
    parent::__construct();
    $this->lang_array = array('en' => 'english', 'sv' => 'swedish');
    $this->current_lang = $this->uri->segment(1, 'en');
}

ビュー機能:

public function view ($page = 'home') {
            $lang_folder = $this->lang_array[$this->current_lang];
            // $lang_folder will be 'english' by default
            // other stuff
            $this->lang->load('general', $lang_folder);

}
于 2012-08-31T10:25:47.900 に答える
0

現在のルールの上に、以下を追加します。

# You already had this one
RewriteEngine On

RewriteRule ^home(.*)$ /english/home$1 [L]
RewriteRule ^sv(/home)?(.*)$ /swedish/home$1 [L]

次に、すでに持っているもの:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /kappahl-hilys/index.php/$1 [L]
于 2012-08-31T09:48:42.853 に答える
0

次のこともできます:
最初の Hook(pre_system) ファイルで、URI の言語を検出します。

    <?php

   class Lang_uri {

 public function run() {

    $languages = array('fr', 'en');

    //try to find language in $_SERVER['REQUEST_URI']
    foreach($languages as $lang)
    {
        if(strpos($_SERVER['REQUEST_URI'], '/'.$lang)===0)
        {
            //Store language founded
            define('URI_LANG', $lang);

            //Delete it, codeigniter will don't know is exists !
            $_SERVER['REQUEST_URI'] = substr_replace($_SERVER['REQUEST_URI'], '', strpos($_SERVER['REQUEST_URI'], '/'.$lang)+1, strlen($lang)+1);

            break;
        }
    }

    if(!defined('URI_LANG'))
        define('URI_LANG', 'fr');
}
    }

別のフック ファイル (pre_controller) で、言語設定項目を設定します。

    class Set_language {

        public function set() { 
             global $CFG;

             $CFG->set_item('language', str_replace(array('en', 'fr'), array('english', 'french'), URI_LANG));
        }

    }

それで全部です。
http://site.com/fr/homehttp://site.com/homeは同じように動作します.. CI
フックの詳細については: http://codeigniter.com/user_guide/general/hooks.html
私の下手な英語のために..

于 2012-09-03T06:22:05.647 に答える