在 Fluid 模板中显示语言图标
Display language icon in Fluid template
我想通过显示相应的语言图标来显示为每条记录指定的语言。
我计划在 BE 模块中使用 TYPO3 8 和现有的 TYPO3 图标在 Fluid 模板中执行此操作。
我可以从记录中读取 sys_language_uid 的值。
图标已经由 TYPO3 提供,正如我在 pid=0 的 "Website Language" 列表中看到的那样。
所以,我要做的是:
- 根据sys_language_uid的值,从sys_language.language_isocode中读取正确的代码(例如'en'、'es')
- 从 isocode 中获取图标的正确名称
- 用 `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> ' . $title;
}
return $title;
}
protected function resolveSiteLanguages(int $pageId)
{
$site = GeneralUtility::makeInstance(SiteMatcher::class)->matchByPageId($pageId);
$this->siteLanguages = $site->getAvailableLanguages($this->getBackendUser(), true, $pageId);
}
您也可以为此创建 ViewHelpers,但我认为在控制器中执行一次会更有效(以防您在视图中多次使用标志)。
我想通过显示相应的语言图标来显示为每条记录指定的语言。
我计划在 BE 模块中使用 TYPO3 8 和现有的 TYPO3 图标在 Fluid 模板中执行此操作。
我可以从记录中读取 sys_language_uid 的值。
图标已经由 TYPO3 提供,正如我在 pid=0 的 "Website Language" 列表中看到的那样。
所以,我要做的是:
- 根据sys_language_uid的值,从sys_language.language_isocode中读取正确的代码(例如'en'、'es')
- 从 isocode 中获取图标的正确名称
- 用 `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> ' . $title;
}
return $title;
}
protected function resolveSiteLanguages(int $pageId)
{
$site = GeneralUtility::makeInstance(SiteMatcher::class)->matchByPageId($pageId);
$this->siteLanguages = $site->getAvailableLanguages($this->getBackendUser(), true, $pageId);
}
您也可以为此创建 ViewHelpers,但我认为在控制器中执行一次会更有效(以防您在视图中多次使用标志)。