如何处理 Codeigniter 上的多语言 uri 重定向?

Posted

技术标签:

【中文标题】如何处理 Codeigniter 上的多语言 uri 重定向?【英文标题】:How to deal with multilingual uri redirect on Codeigniter? 【发布时间】:2018-02-26 17:02:37 【问题描述】:

我正在 Codeigniter 3.0 下构建一个多语言网站,我希望有这种行为:

网站的默认语言是“en”。 当用户访问站点 (/) 时,它会获取浏览器的 Accept-language 并将其存储在 session var 中。然后我检查语言是否为“en”。如果不是,它重定向到 mysite.com/lang。案例语言不是“en”,什么也不做,所以它保留 mysite.com/

问题在于 CI 将 /lang 作为控制器。

我将 routes.php 编辑如下:

$route['es'] = '/';
$route['en'] = '/';
$route['de'] = '/';

但是现在我遇到了“重定向过多”的问题,因为 routes.php 在来自 /language 时重定向到 / 并且在我的控制器中重定向到 /language

我的控制器:

class Checklanguage  

        public $CI;

        /**
         * Constructor.
         */
        public function __construct()
        
                if (!isset($this->CI))
                
                        $this->CI =& get_instance();
                
                $this->CI->load->library('session');
        

        public function redirect_if_not_default()

        
                /* LANGUAGES SECTION */
                $browserLang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
                // if browser has no language, we use 'en'
                if (strlen($browserLang) != 2) $browserLang = 'en';

                // retrieve session lang (maybe NULL)
                $sessionLang = $this->CI->session->userdata('lang');

                // determine which language use
                // if user has not set any language, we use browser lang
                if(!isset($sessionLang)) $preferredLang = $browserLang;
                // if user has changed language, we use session language
                if (strlen($sessionLang) == 2) 
                        $preferredLang = $sessionLang;
                

                // redirect if language is not 'en'
                if ($preferredLang != 'en') 
                        header('Location: /'.$preferredLang);
                

        

我该如何解决这个问题? 谢谢

【问题讨论】:

【参考方案1】:

试试:

if ($preferredLang != 'en') 
  redirect(base_url()."/$preferredLang");

加法:

如果您为此使用CI 语言类,您只需要在application/language 中设置一个语言文件,然后在控制器中加载该语言。

CI documentation

【讨论】:

同样的问题 您是否使用 Apache 重写规则(例如:从 url 中删除 index.php)其次,这些语言目录是否在您提到的不同设置中 CI 将这些作为控制器? 是的,我从 .htaccess 中删除了 index.php,但我没有语言文件夹。我没有不同语言的文件夹。我只有一个 CI 安装,它使用会话变量来处理语言。除了这个“url问题”之外,一切都很好。如果我可以做一些事情来禁用“/en”调用该控制器(en,那个obv不存在)会很好...... 抱歉,如果我没有正确理解您的问题。根据CI 文档https://www.codeigniter.com/userguide3/libraries/language.html 你不需要重定向,只需加载语言文件。你也可以查看这个答案:https://***.com/questions/1328420/the-best-way-to-make-codeigniter-website-multi-language-calling-from-lang-array 如果你只使用CL类作为语言,那么你只需要在application/language中设置语言文件,然后加载这个语言文件。

以上是关于如何处理 Codeigniter 上的多语言 uri 重定向?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理完全动态的 JSON 响应

如何处理不同语言的 iOS 推送通知

Codeigniter:如何处理数据库错误?

如何处理 Codeigniter 模板?

Codeigniter:当我插入数据时出现重复键错误,我该如何处理这个错误?

CodeIgniter 表单验证多语言标签