将应用程序更新为多语言时,您需要完成哪些步骤?

时间:2011-03-11 19:18:51

标签: php zend-framework internationalization

我需要更新一个基于Zend Framework构建的应用程序。

大多数文本都在视图脚本,表单等中进行了硬编码。

该应用程序将提供3种语言 AND 是特定于语言的(所有内容都不相同),并且每种语言都有一个域名(即:mygreatsite.com,monsupersite。 com,ilmiosupersite.com等。)

第一个问题:

“处理”此类应用程序的最佳方法是什么?

我可以想象几个解决方案:

  • 每种语言一份,使用不同的数据库等......(可能不是最好的维护方式)
  • 只有一个应用程序,处理不同的内容,数据库等,具体取决于区域设置(基于路由)

第二个问题:

关于启动“迁移”的现有代码,我应该知道什么? 建立i18n网站时的最佳做法是什么? 什么是最好的适配器? (我已经使用了gettext(),我认为这是最好的)

1 个答案:

答案 0 :(得分:1)

我绝不是专家,但这就是我所做的。

我使用数组作为我的翻译适配器,因为我的客户更容易更新,因为它们只是常规的Joes。我使用翻译键而不是句子。例如 有些人会用

$this->translate(‘Some sentence to translate’); 

我用

$this->translate(‘default-index-dashboard-title’);

这让我更容易知道我正在寻找的文字要改变的地方。我不知道除此之外是否有任何其他优点。

您需要在引导程序中设置翻译适配器和翻译缓存(如果需要)。我是这样的:

protected function _initLocale()
{
    $locale = new Zend_Locale(Zend_Locale::BROWSER);
    $config = Zend_Registry::get('config');
    Zend_Registry::set('Zend_Locale', $locale->toString());
    return $locale;
}

protected function _initTranslation()
{
    try{
        $translate = new Zend_Translate(array('adapter' => 'array', 'content' => ROOT . '/callmanagement/languages/' . strtolower(Zend_Registry::get('Zend_Locale')) . '.php'));
    }catch(Exception $e){
        $translate = new Zend_Translate(array('adapter' => 'array', 'content' => ROOT . '/callmanagement/languages/en_gb.php'));
    }

    Zend_Registry::set('Zend_Translate', $translate);
    return $translate;
}

除非站点完全不同,否则我会使用单个代码库,并将共享数据存储在一个数据库中,并为站点特定的东西提供其他数据库。

您可以在bootstrap或congfig中设置多个数据库适配器。

$dbLocal = new Zend_Db_Adapter_Pdo_Mysql(array(
        'host'     => 'localhost',
        'username' => $result['user'],
        'password' => $result['password'],
        'dbname'   => $result['database']
    ));
    Zend_Db_Table_Abstract::setDefaultAdapter($dbLocal);

    $dbShared = new Zend_Db_Adapter_Pdo_Mysql(array(
        'host'     => 'localhost',
        'username' => ‘root’,
        'password' => 'pass',
        'dbname'   => 'dbname'
    ));

    Zend_Registry::set('db_local', $dbLocal);
    Zend_Registry::set('db_shared', $dbShared);
    return $dbLocal;

您只需将翻译密钥放入标签栏即可获得Zend Form翻译。

$this->addElement(‘text’, ‘test’, array(‘label’ => ‘translation-key’, ‘required’ => true));等。

然后,如果您使用Zend_Db_Table_Abstract类,则可以更改默认架构和数据库连接,如下所示:

class Default_Model_Table_Topics extends Zend_Db_Table_Abstract 
{
protected $_name = 'topics';
protected $_id = 'topic_id';
protected $_rowClass = 'Default_Model_Topic';

protected $_schema = 'dbname';
protected $_adapter = 'db_shared';

}

如果您需要更多示例,我会尽力帮助。