首页 文章

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

提问于
浏览
78

我正在研究时间和工作时间,但我找不到任何明确,有效的方法来制作它:/

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

有没有办法为每种语言创建数组文件,并在视图文件中调用它们取决于来自lang选择的会话?我不想使用数据库 .

感谢帮助!我已经没过截止日期了:/谢谢!!

11 回答

  • 0

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

    1. 在文件夹application / language / arabic中添加语言文件(我在ci中使用sma2添加arabic lang)

    2. 转到application / modules / settings / views / setting.php中名为 setting.php 的文件 . 在这里你可以找到阵列

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

    现在保存并运行应用程序 . 它工作得很好 .

  • 90

    你见过CodeIgniter's Language library吗?

    语言类提供了检索语言文件和文本行以便国际化的功能 . 在CodeIgniter系统文件夹中,您将找到一种包含多组语言文件的被调用语言 . 您可以根据需要创建自己的语言文件,以便以其他语言显示错误和其他消息 . 语言文件通常存储在您的系统/语言目录中 . 或者,您可以在应用程序文件夹中创建一个名为language的文件夹,并将其存储在那里 . CodeIgniter将首先在您的应用程序/语言目录中查找 . 如果目录不存在或未找到指定的语言,则CI将在您的全局系统/语言文件夹中查找 .

    在你的情况下......

    • 你需要在 application/language/polish 内创建一个 polish_lang.phpenglish_lang.php

    • 然后在该文件中创建您的密钥(例如 $lang['hello'] = "Witaj";

    • 然后将其加载到您的控制器中,如 $this->lang->load('polish_lang', 'polish');

    • 然后获取类似_1863537的行 - 只需将此函数的返回值存储在变量中,以便在视图中使用它 .

    重复英语和您需要的所有其他语言的步骤 .

  • -1

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

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

    然后你可以随时 grab 它:

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

    在控制器中,在创建构造函数时添加以下行

    即,之后

    父::控制器();

    添加以下行

    $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';
    

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

    label('welcome',$ this);

    要么

    label('hello word',$ this);

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

    如果语言文件中没有定义标签,它只会将它传递给您传递给功能标签的内容 .

  • 0

    我是Randell的第二个回答 .

    但是,可以始终集成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;
    }
    
  • 0

    为了更容易使用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

  • -1

    在管理实际文件时,事情可能会非常容易地失去同步,除非您启动了一个名为String的免费测试服务,它允许您轻松跟踪您的语言文件,并与翻译人员协作 .

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

    字符串是完全免费的,所以请检查出来告诉我们什么您认为 .

    它实际上也 Build 在Codeigniter上!查看测试版http://mygengo.com/string

  • 7

    我使用过Wiredesignz的MY_Language课程取得了巨大的成功 .

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

    https://github.com/meigwilym/CI_Language

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

  • 1
  • 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(浏览器)中设置的“preffered language” . 然后代码尝试读取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];  
    }
    

相关问题