codeigniter - Codeigniter 使用 url 切换语言
问题描述
我已经建立了这一切:我的意思是用钩子切换语言是可行的,但现在我想从 url 获取语言然后切换它,比如:
或者
因此,如果我将第一个链接发送给某人,它应该会自动检测语言并以该语言显示该页面和所有导航链接。
在路由中,我已经将我想要使用的语言转发到我的主控制器的函数参数。现在我需要设置该语言。但是如果我在后面做 $this->session->set_userdata('site_lang', "српски") 语言并不会改变一切。
我注意到,在现有的语言切换器中,在将语言会话设置为所选语言后使用重定向,重定向到推荐链接,但现在如何管理直接用户输入?
我希望我说清楚了,希望有人能参与进来。
谢谢你。
解决方案
我找到了这样的解决方案:
更新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 中将无法正常工作,所以最好将其关闭。
推荐阅读
- ios - React Native 中“将一个原始像素扩展到多个像素”是什么意思?
- javascript - jQuery 仅在 div 不为空时追加
- pycharm - 是否有在 PyCharm 中插入 {%%} 的快捷方式?
- c# - Visual Studio 推荐使用命令简化
- android - 在按钮上调用键盘删除/退格操作?
- php - 将变量传递给 CURL 对象 (POST)
- assembly - 当一段代码被编译和运行时,计算机内部会发生什么
- javascript - 点击 JavaScript 获取类名值
- html - 使用 flexbox 定位网格
- flutter - 限制颤振应用程序的方向