Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter语言代码路由_Php_Codeigniter_Url Routing - Fatal编程技术网

Php CodeIgniter语言代码路由

Php CodeIgniter语言代码路由,php,codeigniter,url-routing,Php,Codeigniter,Url Routing,我想在CodeIgniter中将语言代码段添加到我的URI中,但我想以某种方式(可能是通过路由)强制浏览器停止将语言代码解释为路径 在我的CodeIgniter安装中,我还没有成功实现任何i18n库,而且我相当确定我的问题很简单,不需要库就可以解决 我想到的方法只是加载URI中出现的相应语言代码的相应语言文件 比如说 http://example.com/about // Default language http://example.com/sv/about // Loa

我想在CodeIgniter中将语言代码段添加到我的URI中,但我想以某种方式(可能是通过路由)强制浏览器停止将语言代码解释为路径

在我的CodeIgniter安装中,我还没有成功实现任何i18n库,而且我相当确定我的问题很简单,不需要库就可以解决

我想到的方法只是加载URI中出现的相应语言代码的相应语言文件

比如说

http://example.com/about        // Default language
http://example.com/sv/about     // Load Swedish language
以下是控制器逻辑:

<?php
//  ** Update **
//  The following updated code works, as long as the language code appears
//  at the end of the URI, e.g, http://example.com/about/sv
//
//  Ideally, I would like the language code segment to always appear first.
//
//  There is also the problem of keeping the language selected while
//  navigating around the site…

class Pages extends CI_Controller {
    public function view ($page = 'home') {

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

        $uri = explode("/", $_SERVER['REQUEST_URI']);
        $lang_code = end($uri);

        $data['title'] = $lang_code;

        switch ($lang_code) {
            case "sv": $the_language = "swedish"; break;
            case "no": $the_language = "norwegian"; break;
            default: $the_language = "english";
        }

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

?>


我走错方向了吗?若然,原因为何?请避免固定回答。

我会选择CI路由:

$route['([a-z]+)/([a-z]+)'] = "pages/view/$2";
然后,您的控制器将如下所示:

<?php if (! defined('BASEPATH')) exit('No direct script access');

class Pages extends CI_Controller {

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

function view($page = 'home')
{
    /* other stuff */
    $this->lang->load('general',$this->language);
    $this->load->view('templates/header', $data);
    $this->load->view('pages/'.$page, $data);
    $this->load->view('templates/footer', $data);
}

另一种解决方案是将所选内容放入cookie中,然后为尝试读取语言选择内容(或设置默认值)的CI_控制器创建自己的扩展,并将其放入
$this->the_language
或类似内容中。当然,在URL中包含语言代码可以让用户清楚地知道希望使用哪种语言,因此它也有它的好处。是的,出于这个原因,我真的希望语言代码存在于URI中。当然有更好的方法来做到这一点(可能是htaccess)但是,也许您可以修改/扩展路由类来检查第一个URI段是否是一种语言(此处为伪代码)
if(在数组中(URI段(1),数组('sv','en')){set_language_var;从_URI;}中剥离_第一个_段}继续路由;
我的解决方案现在有点半途而废(代码更新);我真的不明白uri路由是如何工作的。有一个内置函数
$this->uri->segment(n)
,它提供uri的段,而不必进行
分解
。至于保留语言选择,如果选择了语言,您可以设置
$data['lang_path']=$lang_code./'
(否则,请将其保留为空字符串)。然后,您将必须使用此变量预加所有链接。我再次支持仅使用cookie的建议。我认为,一旦您开始将数据传递给控制器,此路径将相当复杂。太棒了!它开始按我希望的方式工作。不过,有几件事需要注意:1)语言段现在显示语言名称,而不是语言代码,即
http://example.com/english/home
;我应该如何缩短它?2)它需要一个语言段,否则什么都不起作用,即
http://example.com/home
不起作用。如何将网站默认为英语?如果是默认语言,则不应在URI中显示语言代码。此处时间紧迫,但在routes.php中,您可以从
$route['default_controller']=“pages/view/sv”开始。至于英语vs en:在构造函数中创建一个数组,
$languages=array('en'=>english','sv'=>'swedish',等等)
,然后在您的视图函数中确定语言为
$current\u lang=$this->languages[$this->language]
您的答案帮助很大,因此我将投票并标记为正确。不过我还没有完全到达那里,所以我会继续下去。