【问题标题】:Codeigniter switch language with urlCodeigniter 使用 url 切换语言
【发布时间】:2018-09-06 11:52:18
【问题描述】:

我已经构建了这一切:我的意思是用钩子切换语言可以工作,但现在我想从 url 获取语言然后切换它,比如:

http://localhost/about-me

http://localhost/o-meni

因此,如果我将第一个链接发送给某人,它应该会自动检测语言并以该语言显示该页面和所有导航链接。

在我已经转发给我的主控制器的函数参数的路由中,我想使用哪种语言。现在我需要设置该语言。但是如果我在后面做 $this->session->set_userdata('site_lang', "српски") 语言并不会改变一切。

我注意到,在现有的语言切换器中,将语言会话设置为所选语言后使用重定向,重定向到推荐链接,但现在如何管理直接用户输入?

我希望我说清楚了,希望有人能参与进来。

谢谢。

【问题讨论】:

  • 不太明白您想要什么-通常多语言页面确实具有类似http://localhost/en/about-me 的结构,其中第一个uri segment 始终是语言-在您的情况下,很难理解您是如何做到的-请显示一些代码 - 因为没有代码片段我很难理解你真正想要什么......
  • 请不要回答问题并创建一个自我回答:stackoverflow.com/help/self-answer,这是 Stack Overflow 鼓励的。这样你就可以创建一个清晰的 Q/A 对,这对未来的读者很有用。谢谢

标签: codeigniter


【解决方案1】:

我找到了这样的解决方案:

更新 1:

我是这样做的,首先是在语言切换器中:

class LanguageSwitcher extends CI_Controller {

  public function __construct() {
    parent::__construct();
  }

  function switchLang($language = "") {
    $lang_en['about-me'] = 'o-meni';
    $lang_sr['o-meni'] = 'about-me';

    $lang_en['services'] = 'usluge';
    $lang_sr['usluge'] = 'services';

    $lang_en['products'] = 'proizvodi';
    $lang_sr['proizvodi'] = 'products';

    $lang_en['downloads'] = 'preuzimanja';
    $lang_sr['preuzimanja'] = 'downloads';

    $lang_en['contact'] = 'kontakt';
    $lang_sr['kontakt'] = 'contact';

    if ($language === "") {
      $language = 'српски';
    }

    $this->session->set_userdata('site_lang', $language);

    $referrer = strtolower($this->agent->referrer());
    //log_message('error', "switchLang:" . $referrer . ", lang:" . $language);
    if ($referrer !== "") {
      $l = str_replace(base_url(), "", substr($referrer, strrpos($referrer, base_url())));

      if (urldecode($language) === 'српски' && array_key_exists($l, $lang_en)) {
        $referrer = str_replace($l, $lang_en[$l], $referrer);
      } else
      if (urldecode($language) === 'english' && array_key_exists($l, $lang_sr)) {
        $referrer = str_replace($l, $lang_sr[$l], $referrer);
      }

      redirect($referrer);
    }
  }

}

其次,在我的控制器中,创建一个函数来调用:

private function redirectLanguage($param) {
  $site_lang = urldecode($this->session->userdata('site_lang'));
  //echo $param . "+" . $site_lang;
  if ($param === "sr" && ($site_lang === "english" || $site_lang === "")) {
    $this->session->set_userdata('site_lang', "српски");
    $this->lang->load("message", "српски");
  } else if ($param === "en" && ($site_lang === "српски" || $site_lang === "")) {
    $this->session->set_userdata('site_lang', "english");
    $this->lang->load("message", "english");
  }
}

像这样:

  public function about($param = "") {

    $this->redirectLanguage($param);

    $this->load->view('header');
    $this->load->view('main_starts');
    $this->load->view('about-me');
    $this->load->view('main_ends');
    $this->load->view('footer');
  }

这样我可以直接粘贴到浏览器地址栏并加载消息并设置会话site_lang。

现在它可以工作了,除了 IE 和 EDGE 中的一些问题;

更新 2:

我必须添加它以确保它也可以在其他浏览器中运行:

$browser = $this->agent->browser();

if ($browser === "Chrome" || $browser === "Firefox") {
  header("Cache-Control: max-age=3600, public");
} else {
  header("Expires: Sun, 19 Nov 1978 05:00:00 GMT");
  header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  header("Cache-Control: no-store, no-cache, must-revalidate");
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");
}

因为如果打开缓存,会话将无法在 Internet Explorer 中正常运行,因此最好将其关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2012-01-13
    • 1970-01-01
    • 2012-02-15
    • 2012-04-04
    相关资源
    最近更新 更多