制作codeigniter网站多语言的最好方法。 从lang数组中调用取决于lang会话?

我在研究时间和小时,但是我找不到任何清晰,有效的方法来做到这一点:

我有一个英文codeigniter基地网站,我现在必须添加一个波兰语言。 根据访客select,以两种语言制作我的网站的最佳方法是什么?

有没有什么办法可以为每种语言创build数组文件,并在视图文件中调用它们取决于来自langselect的Session? 我不想使用数据库。

欣赏帮助! 我已经没有了最后期限:/谢谢!

你见过CodeIgniter的语言库吗?

语言类为了国际化的目的提供检索语言文件和文本行的function。

在你的CodeIgniter系统文件夹中,你会发现一个叫做language的语言文件。 您可以根据需要创build自己的语言文件,以显示其他语言的错误和其他消息。

语言文件通常存储在您的系统/语言目录中。 或者,您可以在应用程序文件夹中创build一个名为language的文件夹,并将其存储在那里。 CodeIgniter将首先在您的应用程序/语言目录中查看。 如果该目录不存在,或者指定的语言不在,那么CI将会在您的全局系统/语言文件夹中查找。

在你的情况下…

  • 你需要在application/language/polish里面创build一个polish_lang.phpenglish_lang.php
  • 然后在该文件中创build你的密钥(例如$lang['hello'] = "Witaj";
  • 然后像$this->lang->load('polish_lang', 'polish');一样加载到你的控制器中$this->lang->load('polish_lang', 'polish');
  • 然后像$this->lang->line('hello');获取行$this->lang->line('hello'); 只需将该函数的返回值存储在一个variables中,以便在视图中使用它。

重复所需的英语和所有其他语言的步骤。

另外,要将语言添加到会话中,我将为每种语言定义一些常量,然后确保在config / autoload.php中自动加载会话库,或者在需要时加载它。 将用户所需的语言添加到会话中:

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

那么你可以随时抓住它:

 $language = $this->session->userdata('language'); 

在控制器中添加以下几行,当你使cunstructor

即之后

父::控制器();

添加下面的行

  $this->load->helper('lang_translate'); $this->lang->load('nl_site', 'nl'); // ('filename', 'directory') 

用下面的函数创build助手文件lang_translate_helper.php,并把它放在system \ application \ helpers目录下

 function label($label, $obj) { $return = $obj->lang->line($label); if($return) echo $return; else echo $label; } 

对于每种语言,请在system \ application \ languages下创build一个带有en,nl,fr等语言缩写的目录

在上面的(各自的)目录中创build语言文件,其中将包含$ lang数组,其中包含如下所示的对label => language_value

nl_site_lang.php

 $lang['welcome'] = 'Welkom'; $lang['hello word'] = 'worde Witaj'; 

en_site_lang.php

 $lang['welcome'] = 'Welcome'; $lang['hello word'] = 'Hello Word'; 

你可以根据需要以不同的语言存储多个文件,例如,如果你想单独的语言文件来pipe理后端(pipe理员部分),你可以在控制器中使用它$ this-> lang-> load('nl_admin',' NL');

nl_admin_lang.php

 $lang['welcome'] = 'Welkom'; $lang['hello word'] = 'worde Witaj'; 

最后以所需语言打印标签,如下所示访问标签

标签('welcome',$ this);

要么

标签('hello word',$ this);

注意hello&word中的空格,你可以像这样使用它:)

当语言文件中没有标签定义的时候,它只会打印你传递给函数标签的东西。

我第二次兰德尔的回答。

但是,我们总是可以整合一个GeoIP,例如http://www.maxmind.com/app/php或http://www.ipinfodb.com/ 。 然后,您可以使用codeigniter会话类保存结果。

如果您想使用ipinfodb.com api您可以将ip2locationlite.class.php文件添加到您的codeigniter应用程序库文件夹中,然后创build一个模型函数来执行您的应用程序所需的任何geoip逻辑,例如:

 function geolocate() { $ipinfodb = new ipinfodb; $ipinfodb->setKey('API KEY'); //Get errors and locations $locations = $ipinfodb->getGeoLocation($this->input->ip_address()); $errors = $ipinfodb->getError(); //Set geolocation cookie if(empty($errors)) { foreach ($locations as $field => $val): if($field === 'CountryCode') { $place = $val; } endforeach; } return $place; } 

为了更容易使用,CI已经更新了这个,所以你可以使用

 $this->load->helper('language'); 

并翻译文本

 lang('language line'); 

如果你想在标签内部使用可选参数

 lang('language line', 'element id'); 

这将输出

 // becomes <label for="form_item_id">language_key</label> 

为了更好的阅读http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html

在pipe理实际文件时,除非您非常警惕,否则很容易出现不同步的情况。 所以我们推出了一个名为String的免费服务,可以让您轻松地跟踪您的语言文件,并与翻译人员协作。

您可以导入现有的语言文件(以PHP数组,PHP定义,ini,po或.strings格式)或从头开始创build自己的部分,并直接通过系统添加内容。

string是完全免费的,所以请检查出来,告诉我们你的想法。

它实际上也是build立在Codeigniter之上的! 查看http://mygengo.com/string上的testing版;

我已经使用Wiredesignz的MY_Language类获得了巨大的成功。

我刚刚发布在github上,因为我似乎无法在任何地方find它的痕迹。

https://github.com/meigwilym/CI_Language

我唯一的改变就是根据新的v2更改将类重命名为CI_Lang。

我在config.php中使用这样的代码:

 $lang = 'ru'; // this language will be used if there is no any lang information from useragent (for example, from command line, wget, etc... if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); $tmp_value = $_COOKIE['language']; if (!empty($tmp_value)) $lang = $tmp_value; switch ($lang) { case 'ru': $config['language'] = 'russian'; setlocale(LC_ALL,'ru_RU.UTF-8'); break; case 'uk': $config['language'] = 'ukrainian'; setlocale(LC_ALL,'uk_UA.UTF-8'); break; case 'foo': $config['language'] = 'foo'; setlocale(LC_ALL,'foo_FOO.UTF-8'); break; default: $config['language'] = 'english'; setlocale(LC_ALL,'en_US.UTF-8'); break; } 

….然后我使用CI的通常的内部机制

o,差点忘了! 在我看来,我使用的button,cookie的语言与语言,优先select用户。

所以,首先这个代码尝试检测用户的useragent(浏览器)中设置的“优先语言”。 然后代码尝试读取cookie“语言”。 Finaly – 开关为CI应用程序设置语言

你可以做一个这样的function

 function translateTo($language, $word) { define('defaultLang','english'); if (isset($lang[$language][$word]) == FALSE) return $lang[$language][$word]; else return $lang[defaultLang][$word]; } 

朋友,不要担心,如果你有任何内置的codeigniter的应用程序安装,你想添加一些语言包只需按照下列步骤:

1.添加语言文件在文件夹应用程序/语言/阿拉伯语(我在sma添加阿拉伯语在内置的ci语言)

2.转到application / modules / settings / views / setting.php中的setting.php文件 。 在这里你可以find数组

 <?php /* $lang = array ( 'english' => 'English', 'arabic' => 'Arabic', // i add this here 'spanish' => 'Español' 

现在保存并运行应用程序。 它工作正常。