2012-08-30 91 views
0

我想语言代码段笨添加到我的URI,但我想以某种方式 - 可能与路由 - 强制浏览器停止解释一个语言代码的路径。笨语言代码路由

我还没有成功实施任何国际化图书馆在我的笨安装,我敢肯定我的问题很简单,而不库反正来解决。

我想到的方法是简单地加载相应的出现在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); 
    } 
} 

?> 

我要对这个错误的方式?如果是这样,为什么?请避免预先回复。

+1

另一种解决方案是将选择在cookie ,然后创建你自己的扩展到CI_Controller,它试图读取语言选择(或设置默认值),并将其放置在'$ this-> the_language'或类似的地方。当然,使用URL中的语言代码可以让用户清楚所期望的语言,所以它也有好处。 – danneth

+0

是的,因为这个原因,我真的希望语言代码存在于URI中。 –

+1

有肯定是一个更好的方式来做到这一点(htaccess的可能),但也许你可以改变/扩展路由类首先要检查的URI段是语言(伪这里)'如果(in_array(uri_segment(1),阵列(“SV ”,‘恩’)){set_language_var; strip_first_segment_from_uri;}继续路由;' – danneth

回答

2

我将与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); 
} 

}

+0

太棒了!它开始按我的愿望工作。尽管如此:1)语言片段现在显示语言名称,而不是语言代码,即“http:// example.com/english/home”;我应该如何缩短它? 2)它需要一个语言段,否则什么都不起作用,即'http:// example.com/home'不起作用。我如何将网站默认为英文?如果它使用默认语言,它不应该在URI中显示语言代码。 –

+0

按下按钮的时间在这里,但在routes.php中,您可以从'$ route ['default_controller'] =“pages/view/sv”;''开始。至于english vs en:在构造函数中创建一个数组,'$ languages = array('en'=> english','sv'=>'swedish'等);',然后在你的视图函数中确定语言为'$ current_lang = $ this-> languages [$ this-> language]' – Mudshark

+0

你的回答有相当大的帮助,所以我打了个赞,并且标记为正确。尽管如此,我还没有完成,所以我继续[另一个问题](http://stackoverflow.com/questions/12212580/i18n-uris-with-ci-routing-or-mod-rewrite) 。 –