制作codeigniter网站多语言的最好方法。 从lang数组中调用取决于lang会话?
我在研究时间和小时,但是我找不到任何清晰,有效的方法来做到这一点:
我有一个英文codeigniter基地网站,我现在必须添加一个波兰语言。 根据访客select,以两种语言制作我的网站的最佳方法是什么?
有没有什么办法可以为每种语言创build数组文件,并在视图文件中调用它们取决于来自langselect的Session? 我不想使用数据库。
欣赏帮助! 我已经没有了最后期限:/谢谢!
你见过CodeIgniter的语言库吗?
语言类为了国际化的目的提供检索语言文件和文本行的function。
在你的CodeIgniter系统文件夹中,你会发现一个叫做language的语言文件。 您可以根据需要创build自己的语言文件,以显示其他语言的错误和其他消息。
语言文件通常存储在您的系统/语言目录中。 或者,您可以在应用程序文件夹中创build一个名为language的文件夹,并将其存储在那里。 CodeIgniter将首先在您的应用程序/语言目录中查看。 如果该目录不存在,或者指定的语言不在,那么CI将会在您的全局系统/语言文件夹中查找。
在你的情况下…
- 你需要在
application/language/polish
里面创build一个polish_lang.php
和english_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。
按照这个https://github.com/EllisLab/CodeIgniter/wiki/CodeIgniter-2.1-internationalization-i18n
其简单明了,也可以查看http://ellislab.com/codeigniter/user-guide/libraries/language.html文档;
它的方式比简单
我在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'
现在保存并运行应用程序。 它工作正常。