在 Fluid 模板中显示语言图标

Display language icon in Fluid template

我想通过显示相应的语言图标来显示为每条记录指定的语言。

我计划在 BE 模块中使用 TYPO3 8 和现有的 TYPO3 图标在 Fluid 模板中执行此操作。

我可以从记录中读取 sys_language_uid 的值。

图标已经由 TYPO3 提供,正如我在 pid=0 的 "Website Language" 列表中看到的那样。

我还找到了一个 ViewHelper 来执行此操作

所以,我要做的是:

是否有 ViewHelper 已经这样做了?我必须从头开始写吗?执行此操作的有效方法是什么?

这里的主要问题是没有语言图标。请不要将语言与通常使用旗帜作为图标的国家混淆。

相反,您应该以其语言显示该语言,例如Deutsch 表示德语。

如果加载记录中语言字段引用的 sys_language 记录(通常为 sys_language_uid),则可以实现此目的。有很多方法可以解决这个问题,并且由于您已经使用 Fluid,您可以尝试从 vhs TYPO3 扩展名中的 <v:resource.record/> viewhelper 开始:

<v:resource.record
    table="sys_language"
    field="title"
    uid="{data.sys_language_uid}"
    as="languageTitle">
    {languageTitle}
</v:resource.record>

要将此应用于每条记录,您可以复制 customize the Default.html layout of Fluid StyledContent 并在那里输出已处理记录的语言。

使用图标 API(不需要 VHS 扩展)

https://docs.typo3.org/typo3cms/CoreApiReference/8.7/ApiOverview/Icon/

您的控制器可以从以下位置获取 isocode:

$this->TCP=GeneralUtility::makeInstance(TranslationConfigurationProvider::class);
$this->languages = $this->TCP->getSystemLanguages();
$this->view->assign('languages', $this->languages);

在 FLUID 中你可以得到这样的图标:

{namespace core = TYPO3\CMS\Core\ViewHelpers}

<f:for each="{languages}" as="language" iteration="i">
    <core:icon identifier="flags-{language.flag}" size="small" />
</f:for>

其中 {language.flag} 是您首选的小写 isocode。

core:icon 属性 »overlay« – 在这种情况下不使用 – 可以将图标粘在一起。

在此处查找标识符名称:https://typo3.github.io/TYPO3.Icons/

对于语言标志,您必须在小写 isocode 前加上:"flags-"

从 TYPO3 9 开始:

如果您已经在代码中解析了图标,您可以使用核心图标 ViewHelpers,例如

DE: <core:icon identifier="flags-de"/>
EN: <core:icon identifier="flags-en-us-gb"/>

您可以看到内核如何使用 SiteLanguage 中的 renderLanguageFlag()PageLayoutView.php 中创建图标。 (languageFlag 是您可以传递给 core:icon ViewHelper 的内容)。

重要提示:这是后端代码。

$icon = $this->renderLanguageFlag($this->siteLanguages[(int)$row['sys_language_uid']]);

protected function renderLanguageFlag(SiteLanguage $language)
{
    $title = htmlspecialchars($language->getTitle());
    if ($language->getFlagIdentifier()) {
        // instead of this, you can getFlagIdentifier() and pass to Fluid
        $icon = $this->iconFactory->getIcon(
            $language->getFlagIdentifier(),
            Icon::SIZE_SMALL
        )->render();
        return '<span title="' . $title . '">' . $icon . '</span>&nbsp;' . $title;
   }
   return $title;
}

protected function resolveSiteLanguages(int $pageId)
{
    $site = GeneralUtility::makeInstance(SiteMatcher::class)->matchByPageId($pageId);
    $this->siteLanguages = $site->getAvailableLanguages($this->getBackendUser(), true, $pageId);
}

您也可以为此创建 ViewHelpers,但我认为在控制器中执行一次会更有效(以防您在视图中多次使用标志)。