【问题标题】:What are the step you have to go through when updating an application to be multilingual?将应用程序更新为多语言时必须经过哪些步骤?
【发布时间】:2011-03-11 19:18:51
【问题描述】:

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

大部分文本都在视图脚本、表单等中进行了硬编码。

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

第一个问题:

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

我可以想象几种解决方案,例如:

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

第二个问题:

关于启动“迁移”的现有代码,我需要了解哪些信息?
构建 i18n 网站时有哪些最佳实践?
什么是最好的适配器? (我已经用过 gettext() 并且我认为它是最好的)

【问题讨论】:

    标签: php zend-framework internationalization


    【解决方案1】:

    我绝不是专家,但这就是我的工作。

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

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

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

    您可以在引导程序或配置中设置多个数据库适配器。

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

    }

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

    【讨论】:

    • 与其使用try {} catch() {},不如在这里使用(framework.zend.com/manual/en/…)$translate->isAvailable('your-language-here')
    • $this->translate('default-index-dashboard-title');这样你的后备字符串是 default-index-dashboard-title 这对最终用户没有意义。使用这种方法,您应该小心并确保您有翻译
    • 这是真的,如果没有可用的翻译,我做的大多数网站都会退回到英文。它是你最舒服的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多