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

问题描述 投票:0回答:2

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

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

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

我不确定这是否是最佳实践,因为这不使用会话。此外,我不确定这在高并发情况下如何工作,我猜测一些用户可能会遇到语言闪烁的情况。

php cakephp localization internationalization multilingual
2个回答
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
投票

如果您网站的语言确实取决于服务器名称,我认为这不是一个坏习惯。

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

也就是说,我不会将此测试放在 core.php 中,而是放在 bootstrap.php 中,因为它是用于此类事情的。

© www.soinside.com 2019 - 2024. All rights reserved.