我目前的做法是使用codeigniter提供的_remap函数来获取URI段,以检查语言是“en”还是“np”
以下是一个示例:
function _remap($url_title){
$this->_identify_language($this->uri->segment(1));
$data ['sub_categories'] = $this->category_model->get_category_list_by_url($url_title)->result_array();
$data ['news'] = $this->news_model->get_news_list_by_url($url_title)->result_array();
$data ['url_title'] = $url_title;
$this->_render_front_view('main',$data);
}
我在每个控制器上都使用这种技术。这不是很有效率。
我想问一下,使用会话存储语言代码会更好还是我目前的技术还不够好?
我还有其他方法可以做这种多语言的事情吗?
当然,我的数据库目前已形成2个语言,我已将这些字段分开。例如: - title_en,title_np。这些都是根据使用的语言字段来回应的。
答案 0 :(得分:7)
很多部分。
除非您希望将其用于Google Analytics,否则您的网址并不一定需要是/ en /和/ fr /。 Spidering没有太大的区别。 Accept-Language标题可以同样可靠。
全局解析此网址细分。您可以使用this method或Accept-Language,但无论哪种方式,您都需要一个钩子,MY_Controller或扩展Lang类。
想想你是否希望不同语言完全分开。例如,如果我的英文页面没有翻译成法语,并且法语页面不存在,它应该显示英文页面还是404?您可以将lang = fr存储在数据库中,并从hook / MY_Controller / etc中的常量集中获取值。
WHERE lang = CURRENT_LANGUAGE
构建您的数据库。 title_en title_fr是一种方法,但很快就因为无法管理很多语言。有一个“pages”和“page_content”表,以便所有通用信息都在一个表中,然后所有特定语言(标题,内容,元等)都在page_conten表中,该表有一个lang字段。
< / LI> 醇>有一百万种方法可以做到这一切,但要考虑的不仅仅是URL。我最喜欢的
答案 1 :(得分:4)
我一直在使用this internationalization library进行codeigniter,我觉得它很适合我的需求。
它扩展了Lang
类,然后在构造函数中解析URI以确定要使用的语言。所以它只是在您使用任何语言文件之前加载。您无需向控制器添加任何代码。它只是更改语言对象中的设置。因此,您可以像平常一样检索当前语言:
$this->lang->lang();
答案 2 :(得分:1)
如果您有500个新闻和2种语言,在root中更改url前缀将为您提供1000个链接,让我们说“/ en / hello-world”和“/ np / hello-world”将具有相同的内容并且可能相同标题,从SEO方面可能是坏的。我会使用会话或cookie来存储首选项,以保留链接汁。