Php 在将应用程序更新为多语言时,您必须执行哪些步骤?

Php 在将应用程序更新为多语言时,您必须执行哪些步骤?,php,zend-framework,internationalization,Php,Zend Framework,Internationalization,我需要更新一个基于Zend框架的应用程序 大多数文本是在视图、脚本、表单等中硬编码的 该应用程序将以3种语言提供,和是语言特定的(内容并非所有语言都相同),并且每种语言将有一个域(即:mygreatsite.com、monsupersite.com、ilmiosupersite.com等) 第一个问题: “处理”此类应用程序的最佳方式是什么 我可以想象以下几种解决方案: 每种语言一份,使用不同的数据库等。。。(可能不是最好的维护方式) 仅一个应用程序,处理不同的内容、数据库等,具体取决于区域设

我需要更新一个基于Zend框架的应用程序

大多数文本是在视图、脚本、表单等中硬编码的

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

第一个问题:

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

我可以想象以下几种解决方案:

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

要开始“迁移”,我需要知道关于现有代码的哪些信息?
构建i18n网站的最佳实践是什么?

最好的适配器是什么?(我已经使用了gettext(),我认为它是最好的)

我绝对不是专家,但我就是这样做的

我使用数组作为转换适配器,因为我的客户端更容易更新,因为它们只是普通的joe。我用翻译键代替句子。例如 有些人会使用

$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;
}
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';
我会使用单一的代码库,除非站点完全不同,并将共享数据存储在一个数据库中,而其他数据库则用于站点特定的内容

您可以在引导程序或congfig中设置多个db适配器

$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_抽象类,则可以如下更改默认模式和数据库连接:

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


如果你需要更多的例子,我会尽力帮助你。

我绝对不是专家,但我就是这么做的

我使用数组作为转换适配器,因为我的客户端更容易更新,因为它们只是普通的joe。我用翻译键代替句子。例如 有些人会使用

$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;
}
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';
我会使用单一的代码库,除非站点完全不同,并将共享数据存储在一个数据库中,而其他数据库则用于站点特定的内容

您可以在引导程序或congfig中设置多个db适配器

$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_抽象类,则可以如下更改默认模式和数据库连接:

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


如果你还需要更多的例子,我会尽力帮助你。

我最好使用like-here()
$translate->isAvailable('your-language-here')
$this->translate('default-index-dashboard-title'),而不是使用
try{}catch(){}
;这样,您的回退字符串就是默认的索引仪表板标题,对最终用户没有意义。使用这种方法,你应该小心并确保你有翻译这是真的,如果没有翻译,我做的大多数网站都会退回到英语。这是你最喜欢的。与其使用
试试{}catch(){}
我最好使用like-here()
$translate->isAvailable('your-language-here')
$this->translate('default-index-dashboard-title');这样,您的回退字符串就是默认的索引仪表板标题,对最终用户没有意义。使用这种方法,你应该小心并确保你有翻译这是真的,如果没有翻译,我做的大多数网站都会退回到英语。这是你最喜欢的。