У меня есть два модуля - Application и StickyNotes. Мне нужно использовать перевод на всех страницах.

Что я делаю:

1) В поле зрения: <?=$this->translate('Home');?>

2) В Application \ Module.php:

public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $eventManager = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    $app = $e->getParam('application');
    $app->getEventManager()->attach('render', array($this, 'setLayoutTitle'));
    $translator->setLocale('ru_RU');
    echo $translator->getLocale(); //ru_RU
}

3) В StickyNotes \ Module.php:

public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $translator->setLocale('ru_RU');
    echo $translator->getLocale(); //ru_RU
}

4) Приложение \ .. \ module.config.php:

'service_manager' => array(
    'factories' => array(
        'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
    ),
),

'aliases' => array(
    'translator' => 'MvcTranslator',
),

'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
        array(
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ),
    ),
),

5) StickyNotes \ .. \ module.config.php то же самое:

'service_manager' => array(
    'factories' => array(
        'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
    ),
),

'aliases' => array(
    'translator' => 'MvcTranslator',
),

'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
        array(
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ),
    ),
),

Если я попробую $translator->getLocale(); вывести 'ru_RU', но перевод не работает.

Кроме того, если я вручную изменю 'locale' => 'en_US', на 'locale' => 'ru_RU', перевод работает нормально. Спасибо за ответы!

3
Walllter 19 Мар 2014 в 21:05

3 ответа

Лучший ответ

В Application \ Module.php

public function onBootstrap(MvcEvent $e) {
        $translator = $e->getApplication()->getServiceManager()->get('translator');
            $lang = $e->getRequest()->getQuery('lang'); // new language
            $session = new Container('base');
            if($lang == null && $lang == ''){
                if ($session->offsetExists('lang')) {
                    $lang = $session->offsetGet('lang'); // current language
                }else{
                    $lang = Settings::DEFAULT_LANGUAGE; // default language
                }
            }
            $session->offsetSet('lang', $lang);
            $loc = Settings::$locations[$lang];
            $translator
            ->setLocale($loc)
            ->setFallbackLocale(Settings::DEFAULT_LANGUAGE .'_' . Settings::DEFAULT_LOCATION);
    }

И класс настроек

class Settings{
   const DEFAULT_LOCATION =  'IR';
   const DEFAULT_LANGUAGE = 'fa';

   public static $locations = array(
        'fa'=>'fa_IR',
            'sa'=>'sa_SA',//Arabic (sa, sa-SA)
        'tr'=>'tr_TR',
        'en'=>'en_US'
    );
}
2
Amin Arab 20 Мар 2014 в 10:00

Поместите конфигурацию переводчика только в Application \ module.config.php и убедитесь, что у вас есть языковая папка в модуле Application и поместите туда файлы * .mo и * .po.

Фактически, вам не нужно устанавливать языковой стандарт в каждом модуле. только положить в Application \ Module.php

В каталоге poedit-> свойства-> ключевые слова источников-> отметьте "перевести" слово существует и лучше быть первым.

В конце концов, <?=$this->translate('Home');?> устарел. использовать <?php echo $this->translate('Home');?>

обновление 1:
извините, этот код <?=$this->translate('Home');?> не устарел, но ручная рекомендация PHP: <?php echo $this->translate('Home');?>

http://php.net/manual/en/language.basic-syntax.phpmode.php

1
Amin Arab 21 Мар 2014 в 20:02

Эта проблема связана с отсутствием расширения intl

Так что просто потребовались следующие шаги:

Пришлось установить расширение PHP Intl:

sudo apt-get install php5-intl

Перезагрузка Apache:

sudo service apache2 restart

Проверьте, какое расширение скомпилировано:

php -m
1
Shal 24 Апр 2015 в 12:38