Typo3 在流体模板中显示语言图标

Typo3 在流体模板中显示语言图标,typo3,fluid,Typo3,Fluid,我想通过显示相应的语言图标来显示每个记录的指定语言 我计划在BE模块中的流体模板中使用TYPO3 8和现有的TYPO3图标来实现这一点 我可以从记录中读取sys\u language\u uid的值 这些图标已经由TYPO3提供,正如我在pid=0的“网站语言”列表中看到的那样 我还找到了一个ViewHelper来执行此操作 所以,我要做的是: 从sys_language_uid的值中,从sys_language.language_等位代码中读取正确的代码(例如“en”、“es”) 从等码中获

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

我计划在BE模块中的流体模板中使用TYPO3 8和现有的TYPO3图标来实现这一点

我可以从记录中读取sys\u language\u uid的值

这些图标已经由TYPO3提供,正如我在pid=0的“网站语言”列表中看到的那样

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

所以,我要做的是:

  • 从sys_language_uid的值中,从sys_language.language_等位代码中读取正确的代码(例如“en”、“es”)
  • 从等码中获取图标的正确名称
  • 显示带有“ViewHelper”的图标

是否有已执行此操作的ViewHelper?我必须从头开始写吗?什么是有效的方法?这里的主要问题是没有语言图标。请不要将语言与通常使用旗帜作为图标的国家混淆

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

如果加载记录中语言字段引用的
sys\u language
记录(通常是
sys\u language\u uid
),则可以实现这一点。有很多方法可以解决这个问题,因为您已经使用了Fluid,您可以尝试从vhs TYPO3扩展开始:

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

{languageTitle}

要将此应用于每个记录,您可以复制并输出处理记录的语言。

使用图标API(无需VHS扩展)

控制器可以从以下位置获取等时码:

$this->TCP=GeneralUtility::makeInstance(TranslationConfigurationProvider::class);
$this->languages = $this->TCP->getSystemLanguages();
$this->view->assign('languages', $this->languages);
在流体中,可以获得如下图标:

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

<f:for each="{languages}" as="language" iteration="i">
    <core:icon identifier="flags-{language.flag}" size="small" />
</f:for>
{namespace core=TYPO3\CMS\core\ViewHelpers}
其中{language.flag}是首选的小写等位码

core:icon attribue»overlay«–本例中未使用–可以将图标粘在一起

在此处查找标识符名称:

对于语言标志,您必须在小写等位码前面加上:“标志-”

,因为键入3 9:

如果已解析代码中的图标,则可以使用核心图标查看帮助程序,例如

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


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

要使用resource.record ViewHelper,您需要额外的扩展名“vhs”。
$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);
}