Какой шаг вы должны пройти при обновлении приложения, чтобы оно стало многоязычным? - PullRequest
1 голос
/ 11 марта 2011

Мне нужно обновить приложение, построенное на Zend Framework.

Большая часть текста жестко запрограммирована в скриптах представлений, формах и т. Д.

Приложение будет доступно, скажем, на 3 языках И зависит от языка (содержание не одинаково для всех) и будет иметь один домен для каждого языка (то есть: mygreatsite.com, monsupersite.com , ilmiosupersite.com и т. д.)

Первый вопрос:

Как лучше всего "обрабатывать" приложения такого типа?

Я могу представить несколько решений, таких как:

  • Одна копия на язык, с использованием разных БД и т. Д. (Вероятно, не лучший способ для обслуживания)
  • Только одно приложение, обрабатывающее различное содержимое, дБ и т. Д., В зависимости от локали (в зависимости от маршрута)

Второй вопрос:

Что мне нужно знать о существующем коде, чтобы начать «миграцию»?
Как насчет наилучшей практики при создании веб-сайта i18n?
Каковы лучшие адаптеры? (Я уже использовал gettext () и думаю, что он лучший)

1 Ответ

1 голос
/ 11 марта 2011

Я ни в коем случае не эксперт, но это то, чем я занимаюсь.

Я использую массив в качестве адаптера перевода, потому что моим клиентам проще обновляться, поскольку они просто обычные 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;
}

Я бы использовал одну кодовую базу, если бы сайты не отличались полностью и не хранили общие данные в одной базе данных и не имели бы других баз данных для конкретного сайта.

Вы можете настроить несколько адаптеров БД либо в начальной загрузке, либо в 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';

}

Если вам нужноеще примеры попробую помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...