Php CodeIgniter语言代码路由
我想在CodeIgniter中将语言代码段添加到我的URI中,但我想以某种方式(可能是通过路由)强制浏览器停止将语言代码解释为路径 在我的CodeIgniter安装中,我还没有成功实现任何i18n库,而且我相当确定我的问题很简单,不需要库就可以解决 我想到的方法只是加载URI中出现的相应语言代码的相应语言文件 比如说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
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]
您的答案帮助很大,因此我将投票并标记为正确。不过我还没有完全到达那里,所以我会继续下去。