【问题标题】:Codeigniter languageCodeigniter 语言
【发布时间】:2013-06-14 16:43:04
【问题描述】:

我想制作一个多语言网站,但我不希望语​​言出现在 URI 中,例如 example.com/fr/about(我不希望这样)。我只想更改文本语言。我的问题是我做的第一个加载语言是永远的。为什么? 如果我这样做:

$this->config->set_item(‘language’,‘english’);
$this->lang->load(‘messages’);
$this->config->set_item(‘language’,‘french’);
$this->lang->load(‘messages’);

$this->lang->load(‘messages’,‘english’);
$this->lang->load(‘messages’,‘french’);

只有英文出现。我该如何解决这个问题?

我的配置语言自动加载为空。

感谢您的帮助。

【问题讨论】:

    标签: codeigniter localization multilingual


    【解决方案1】:

    我为此使用了一个钩子。

    function pick_language() {
    
        require_once(APPPATH.'/config/language.php');
    
        session_start();
    
        // Lang set in URL via ?lang=something
        if(!empty($_GET['lang']))
        {
            // Turn en-gb into en
            $lang = substr($_GET['lang'], 0, 2);
            $_SESSION['lang_code'] = $lang;
        }
    
        // Lang has already been set and is stored in a session
        elseif( !empty($_SESSION['lang_code']) )
        {
            $lang = $_SESSION['lang_code'];
        }
    
        // Lang has is picked by a user.
        // Set it to a session variable so we are only checking one place most of the time
        elseif( !empty($_COOKIE['lang_code']) )
        {
            $lang = $_SESSION['lang_code'] = $_COOKIE['lang_code'];
        }
    
        // Still no Lang. Lets try some browser detection then
        else if (!empty( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ))
        {
            // explode languages into array
            $accept_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    
            log_message('debug', 'Checking browser languages: '.implode(', ', $accept_langs));
    
            // Check them all, until we find a match
            foreach ($accept_langs as $lang)
            {
                // Turn en-gb into en
                $lang = substr($lang, 0, 2);
    
                // Check its in the array. If so, break the loop, we have one!
                if(in_array($lang, array_keys($config['supported_languages'])))
                {
                    break;
                }
            }
        }
    
        // If no language has been worked out - or it is not supported - use the default
        if(empty($lang) or !in_array($lang, array_keys($config['supported_languages'])))
        {
            $lang = $config['default_language'];
        }
    
        // Whatever we decided the lang was, save it for next time to avoid working it out again
        $_SESSION['lang_code'] = $lang;
    
        // Load CI config class
        $CI_config =& load_class('Config');
    
        // Set the language config. Selects the folder name from its key of 'en'
        $CI_config->set_item('language', $config['supported_languages'][$lang]['folder']);
    
        // Sets a constant to use throughout ALL of CI.
        define('CURRENT_LANGUAGE', $lang);
    }
    

    这不仅会为您设置正确的语言,还会为您提供一个常量 CURRENT_LANGUAGE,其中包含他们正在使用的语言('en'、'de' 等)。

    可用的语言来自配置项:

    /*
    |--------------------------------------------------------------------------
    | Supported Languages
    |--------------------------------------------------------------------------
    |
    | Contains all languages your site will store data in. Other languages can
    | still be displayed via language files, thats totally different.
    | 
    | Check for HTML equivalents for characters such as � with the URL below:
    |    http://htmlhelp.com/reference/html40/entities/latin1.html
    |
    */
    $config['supported_languages'] = array(
        'en'=> array('name' => 'English', 'folder' => 'english'),
        'es'=> array('name' => 'Español', 'folder' => 'spanish'),
        'fr'=> array('name' => 'Français', 'folder' => 'french'),
        'de'=> array('name' => 'German', 'folder' => 'german')
    );
    
    /*
    |--------------------------------------------------------------------------
    | Default Language
    |--------------------------------------------------------------------------
    |
    | If no language is specified, which one to use? Must be in the array above
    |
    |   en
    |
    */
    $config['default_language'] = 'en';
    

    这将从 GET (http://somesite.com/?lang=de) 中获取正确的语言,然后检查会话变量(由正确的匹配填充),然后检查浏览器的 accept-lang 标头。

    首先匹配的将被使用。

    【讨论】:

    • 我不想通过 URI 发送语言。如果用户在页脚选择英文,我只想以英文显示 example.com/about,如果选择法文,我只想显示英文。没有 example.com/about?=en 之类的。每次/关于
    • 你错过了我认为的重点。该钩子执行多项检查,一项是 GET 变量,另一项是浏览器检测。 GET 变量用作手动设置要使用的语言的开关。否则,每次访问 /about 时,您都会根据用户的浏览器设置获得适合用户的任何语言。如果我坐在法国网吧,我会看到你的法语网站。更有意义?
    • 菲尔,这正是我要找的!!!谢了哥们。只是一个快速的问题。我一直在查看 PyroCMS,但我不明白你是如何制作这样的东西的: 实际工作。 “lang”在哪里定义?
    • 详细说明... 忽略钩子并仍在使用 $config('english');项目
    • 我想在使用钩子从数据库中查询用户的语言设置后加载语言,但我做不到。如果我用 post_controller_constructor 调用我的钩子函数,我无法更改 $config['language'] 值。我该如何管理?
    【解决方案2】:

    阅读developer guide,有几点需要考虑:

    • “语言文件必须以 _lang.php 作为文件扩展名。” - 您的文件只是称为“消息”
    • 为不同的语言使用不同的文件
    • 只需在没有第二个参数的情况下执行 $this->lang->load("messages"); 即可加载默认语言
    • $this->lang->line('some_key');显示翻译文本

    【讨论】:

    • 我正在做。一个问题,$config['languages'] 必须是什么。请给我一个很好的例子好吗?
    • 只需做 $this->lang->load("messages");没有第二个参数将加载默认语言 - > 如果我想加载其他语言我不能这样做 $this->lang->load("messages",'french'); ?
    • 当然,就是这样。如果您按照开发者指南中的所有说明进行操作,它应该可以正常工作。
    【解决方案3】:

    您可以使用以下方法清除加载的语言:

    $this->lang->is_loaded = array();
    $this->lang->language = array();
    

    这将让您之后使用 $this->lang->load('language_file', 'language') 加载另一种语言。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2013-11-04
      • 2017-02-25
      • 1970-01-01
      相关资源
      最近更新 更多