Установить язык TYPO3 StandaloneView в CommandController

Я использую TYPO3 \ CMS \ Fluid \ View \ StandaloneView в CommandController, чтобы отправлять электронные письма моему fe_user.

Часть, в которой я создаю шаблон, выглядит так:

    /* @var \TYPO3\CMS\Fluid\View\StandaloneView $emailView */
    $emailView = $this->objectManager->get( 'TYPO3\\CMS\\Fluid\\View\\StandaloneView' );

    // pass extension name to standaloneView for translations
    $extensionName = $this->request->getControllerExtensionName();
    $emailView->getRequest()->setControllerExtensionName( $extensionName );

    $extensionPath           = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath( 'my_extension' );
    $templatePathAndFilename = $extensionPath . 'Resources/Private/Templates/Email/' . $templateFile . '.html';
    $emailView->setLayoutRootPath( $extensionPath . 'Resources/Private/Layouts/Email/' );
    //$emailView->setPartialRootPath($ressourcePath . 'Partials/');

    $emailView->setTemplatePathAndFilename( $templatePathAndFilename );

    return $emailView->render();

Думаю, ничего особенного.

В html-шаблоне я использую обычный ViewHelper для перевода Fluid:

<f:translate key="LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:mail.text" />

Все это хорошо работает на стандартном языке, но я понятия не имею, как я могу указать View / CommandController , какой язык использовать.

Я не совсем уверен, это проблема StandaloneView или CommandController ...

Изменить:

Опубликованный фрагмент вызывается из CommandController (планировщика), поэтому текущего пользователя внешнего интерфейса нет (мы находимся в среде внутреннего интерфейса). Я получаю пользователя из репозитория, поэтому мне нужно сохранить там выбранный язык. Но тогда мне нужно установить язык для StandaloneView


person Arne    schedule 18.01.2015    source источник


Ответы (3)


Обычно вы можете установить язык в CommandController, выполнив следующие действия:

$GLOBALS['BE_USER']->uc['lang'] = 'de';

Проблема в том, что LocalizationUtility создает кеш для расширения после того, как оно было вызвано один раз для чего-то :: translate (). Нет доступной функции для сброса этого кеша, но вы можете добавить эту небольшую служебную функцию в свое расширение, чтобы вы могли делать именно это:

namespace Vendor\Extension\Utility;

class LocalizationUtility extends \TYPO3\CMS\Extbase\Utility\LocalizationUtility
{
   public static function resetExtensionLangCache($extensionName){
       unset(static::$LOCAL_LANG[$extensionName]);
   }
}

Если у вас есть случай, когда вам нужно переключить полный языковой контекст в вашем CommandController, теперь вы можете вызвать это сразу после переключения языка для BE_USER:

\Vendor\Extension\Utility\LocalizationUtility::resetExtensionLangCache('<extensionname>');

Это приведет к сбросу кеша, и LocalizationUtility придется инициализировать свою запись для вашего расширения, пока вы не переключитесь и не вызовете его снова.

person Waldgeist    schedule 02.02.2018

Чтобы управлять языком, используемым в Fluid StandaloneView из внутреннего контекста, просто установите язык, как показано ниже (я установил немецкий язык).

$GLOBALS['BE_USER']->uc['lang'] = 'de';

Это должно быть установлено перед вызовом метода $emailView->render().

person derhansen    schedule 18.10.2015
comment
Имейте в виду, что это работает только тогда, когда вы также задаете имя расширения с помощью $view->getRequest()->setControllerExtensionName(), а затем используете только ключ в своих f:translate вызовах (но не путь ко всему файлу), иначе вы все равно получите метки языка по умолчанию. - person pdu; 07.03.2016
comment
... и это работает, только если вы отправите одно электронное письмо. Как только вы отправите несколько писем, каждое на своем языке, это не будет работать должным образом. - person pdu; 11.05.2016

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

При правильной настройке и использовании языка, отличного от языка по умолчанию, все ваши представления (также эти автономные) будут переведены на текущий язык.

AFAUK, нет возможности принудительно перевести VH, чтобы использовать какой-либо язык, т.е. предоставив его uid.

person biesior    schedule 18.01.2015
comment
Я использую CommandController / Scheduler, поэтому нет текущего пользователя. В TYPO3 нет настроек для выбранного языка fe_users, поэтому я должен сохранить это самостоятельно. - person Arne; 18.01.2015
comment
Здесь та же проблема. Отправка писем от BE и использование Fluid. Трудно переводить письма на какой-то язык записей ИП. Было бы здорово иметь способ принудительно перевести VH на определенный язык. - person fnagel; 04.06.2015