Php 在将应用程序更新为多语言时,您必须执行哪些步骤?
我需要更新一个基于Zend框架的应用程序 大多数文本是在视图、脚本、表单等中硬编码的 该应用程序将以3种语言提供,和是语言特定的(内容并非所有语言都相同),并且每种语言将有一个域(即:mygreatsite.com、monsupersite.com、ilmiosupersite.com等) 第一个问题: “处理”此类应用程序的最佳方式是什么 我可以想象以下几种解决方案:Php 在将应用程序更新为多语言时,您必须执行哪些步骤?,php,zend-framework,internationalization,Php,Zend Framework,Internationalization,我需要更新一个基于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');这样,您的回退字符串就是默认的索引仪表板标题,对最终用户没有意义。使用这种方法,你应该小心并确保你有翻译这是真的,如果没有翻译,我做的大多数网站都会退回到英语。这是你最喜欢的。