Cakephp 2.0动态多语言网站(最佳实践问题)

时间:2012-02-14 15:01:37

标签: cakephp localization internationalization cakephp-2.0 multilingual

我有两个指向同一个cakephp应用程序的域名。

我在core.php上读取了域名,并根据条件设置了显示语言

        if(strstr($_SERVER['SERVER_NAME'],'por')>-1 ){
            Configure::write('Config.language', 'por');     
        }else{
            Configure::write('Config.language', 'spa'); 
        }

我不确定这是否是最佳做法,因为这不会使用会话。此外,我不确定这可能如何与高并发性一起工作,我猜测一些用户可能会遇到语言闪烁。

2 个答案:

答案 0 :(得分:2)

我将如何做到这一点。

Configure::write('Config.language', 'eng');
Configure::write('Config.supported_languages', array(
    'en-US' => 'eng',
    'en' => 'eng',
    'es-ES' => 'esp',
    'es' => 'esp',
));

$supported_languages = Configure::read('Config.supported_languages');
$accepted_languages = split(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
foreach ($accepted_languages as $language) {
    $language_data = split(';', $language);
    if (in_array($language_data[0], array_keys($supported_languages))) {
        Configure::write('Config.language', $supported_languages[$language_data[0]]);
        break;
    }
}

这会将语言默认为英语(或者您希望将语言设置为默认语言)。这将允许语言根据用户浏览器进行更改。

答案 1 :(得分:1)

如果您网站的语言取决于服务器名称,我不认为这是一种不好的做法。

Configure是一个仅仅实例化一次的单例类,但对于每个HTTP请求,因为它是PHP。与某些应用程序服务器(如Tomcat甚至ASP.Net)不同,它不会配置应用程序'适用于您网站上的所有用户,但仅适用于当前请求。因此,您的用户不会遇到任何语言闪烁。

那说我不会把这个测试放在core.php中,而是放在bootstrap.php中,因为它适用于这类事情。