使codeigniter网站成为多语言的最佳方法。从lang数组调用取决于lang会话?


81

我正在研究几个小时,但是我找不到任何清晰有效的方法来实现它:/

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

有什么方法可以为每种语言创建数组文件并在视图文件中调用它们,取决于从lang选择的Session?我不想使用数据库。

感谢帮助!我的期限快用完了:/谢谢!!


1
这里发布的所有答案都很好,但是使用它们会丢失页面的现金选项,因为它将缓存一个控制器,并且它将使用您设置的最后一种语言。是否有其他解决方案,然后使用其他控制器对于每种语言。

Answers:


93

您看过CodeIgniter的语言库吗?

语言类提供用于检索语言文件和文本行以实现国际化的功能。

在您的CodeIgniter系统文件夹中,您会找到一种称为语言的语言,其中包含语言文件集。您可以根据需要创建自己的语言文件,以便以其他语言显示错误和其他消息。

语言文件通常存储在您的system / language目录中。或者,您可以在应用程序文件夹中创建一个名为language的文件夹,并将其存储在该文件夹中。CodeIgniter将首先出现在您的application / language目录中。如果目录不存在或找不到指定的语言,则CI会在您的全局system / language文件夹中查找。

就你而言...

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

对英语和您需要的所有其他语言重复这些步骤。


感谢您的快速回答,是的,我已经看到了。但实际上尚不清楚://关于如何满足我的需要,在何处创建lang文件,什么格式,什么样的结构,如何调用等...我在codeigniter上还很新。那就是为什么我一直在寻找清晰的教程或其他东西。:/
designer-trying-coding

1
heyooo太好了,运作良好:D非常感谢您的帮助!你是救星!:)谢谢
designer-trying-coding

2
这是用于不可编辑文本的解决方案,但是它不涵盖任何从数据库存储和检索的多语言内容。具有使用CI制作的自定义内容管理系统的多语言站点将需要更多的功能。我借助URL中的语言段和/或唯一的别名段(用唯一的语言标识唯一的内容)来制作了自己的文件。我仍然没有想出如何更好地管理它。这就是为什么我碰到这个线程。
路易斯·马丁

@Randell它正在工作,但是您能解释一下如何通过onclick转换成其他语言的细节吗....我的意思是说它可以存储在会话中吗?方式

@Nadh,最好将您的问题发布到新主题上,以便我们使讨论保持简洁。
Randell '18

22

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

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

然后,您可以随时这样来抓取它:

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

是的,这是我的另一个问题。您已经帮助我了:D伟大的想法!我也在考虑使用cookie来记住访客的语言选择。
designer-trying-coding

1
我应该在哪里定义这些会话?我认为在每个页面的控制器上定义这些都是不好的。必须是我在全局文件中定义的一种方法,它会影响所有站点。谢谢!!
designer-trying-coding

不知何故,有更好的方法可以做到这一点。但这是一个全新的问题。但这也可以使您入门。
拉德尔2009年

7

在创建控制器时,在控制器中添加以下行

即,之后

parent :: Controller();

在下面添加行

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

使用以下功能创建帮助文件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下创建一个目录,该目录具有语言缩写,例如en,nl,fr等。

在以上(相应)目录中创建语言文件,该文件将包含$ 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';

您可以按照要求以不同的方式存储相同语言的多个文件,例如,如果您要使用单独的语言文件来管理后端(管理员部分),则可以在控制器中以$ this-> lang-> load('nl_admin',' nl');

nl_admin_lang.php

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

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

标签('welcome',$ this);

要么

label('hello word',$ this);

注意你好和单词中的空格,你也可以这样使用它:)

如果在语言文件中没有定义标签,它将仅打印传递给功能标签的内容。


1

我赞同兰德尔的回答。

但是,始终可以集成GeoIP,例如http://www.maxmind.com/app/phphttp://www.ipinfodb.com/。然后,您可以使用codeigniter会话类保存结果。

如果要使用ipinfodb.com api,可以将ip2locationlite.class.php文件添加到codeigniter应用程序库文件夹中,然后创建一个模型函数来执行应用程序所需的任何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;
}

3
基于IP的语言检测效果不佳。考虑一下VPN,旅行者,移民或仅是具有多种语言的国家(例如加拿大或中国)。最好使用浏览器语言。
PiTheNumber


1

我已经成功使用了Wiredesignz的MY_Language类。

我刚刚在github上发布了它,因为我似乎在任何地方都找不到它的踪迹。

https://github.com/meigwilym/CI_Language

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


人们为什么觉得需要使用全局?这很容易,但是会带来很多问题。
Starlays

0

在管理实际文件时,除非您非常警惕,否则事情很容易变得不同步。因此,我们推出了一项名为String的免费(测试版)服务,该服务使您可以轻松跟踪语言文件,并与翻译人员合作。

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

String是完全免费的,因此请查看并告诉我们您的想法。

它实际上也是基于Codeigniter构建的!在http://mygengo.com/string上查看测试版


这实际上是一个好点;CI的语言文件随着时间的推移不容易维护。
sourcejedi 2012年


0

我在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的常规内部机制

哦,差点忘了!在视图中,我使用按钮,该按钮将cookie设置为用户喜欢的语言。

因此,首先,此代码尝试检测用户的useragent(浏览器)中设置的“首选语言”。然后代码尝试读取cookie的“语言”。最后-开关设置CI应用程序的语言


-1

你可以做一个这样的功能

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

6
这是不良编程的例子,没有冒犯性。不要在函数中定义常量。这就是为什么它被称为常量,它的值不变的原因,因此只定义一次。其次,这样的代码isset($lang[$language][$word]) == FALSE就足够了isset($lang[$language][$word]),因为isset仅返回true和false。第三,当您评估是否有错误时,请务必使用===来验证类型
machineaddict 2013年

-1

朋友,不用担心,如果您有安装在codeigniter中内置的任何应用程序,并且想添加一些语言包,请按照以下步骤操作:

1.在文件夹application / language / arabic中添加语言文件(我在ci内置的sma2中添加阿拉伯语lang)

2.转到指定的文件setting.php中的应用程序/模块/设置/查看/ setting.php。在这里找到数组

<?php /*

 $lang = array (
  'english' => 'English',

  'arabic' => 'Arabic',  // i add this here

  'spanish' => 'Español'

现在保存并运行该应用程序。很好


setting.php如果您使用过任何库或辅助程序,则没有任何命名的文件,请先共享。
阿里Qorbani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.