SilverStripe Fluent菜单模板

Fal*_*ude 4 php silverstripe

SilverStripe Fluent模块具有现成的模板,可在前端显示简单的语言切换菜单.

<% loop Locales %>
 <li class="$LinkingMode">
  <a href="$Link.ATT" hreflang="$LocaleRFC1766"<% end_if %>>
   $Title.XML
  </a>
 </li>
<% end_loop %>
Run Code Online (Sandbox Code Playgroud)

当它循环"Locales"时它在技术上是什么循环?没有名为"Locales"的数据库表.

我的目标是最终找到返回语言缩写的变量(或编写函数)(而不是国家!).所以我需要一些东西,例如返回nl而不是nl-NL(作为$LocaleRFC1766回报).

3dg*_*goo 5

Locales是一个函数FluentExtension扩展名:

/**
 * Templatable list of all locales
 *
 * @return ArrayList
 */
public function Locales()
{
    $data = array();
    foreach (Fluent::locales() as $locale) {
        $data[] = $this->owner->LocaleInformation($locale);
    }
    return new ArrayList($data);
}
Run Code Online (Sandbox Code Playgroud)

这是LocaleInformation函数返回的数据:

$data = array(
    'Locale' => $locale,
    'LocaleRFC1766' => i18n::convert_rfc1766($locale),
    'Alias' => Fluent::alias($locale),
    'Title' => i18n::get_locale_name($locale),
    'LanguageNative' => Fluent::locale_native_name($locale),
    'Language' => i18n::get_lang_from_locale($locale),
    'Link' => $link,
    'AbsoluteLink' => $link ? Director::absoluteURL($link) : null,
    'LinkingMode' => $linkingMode
);
Run Code Online (Sandbox Code Playgroud)

Language 最近添加了以允许仅检索语言缩写.

为了利用这个,我们可以创建一个LocaleMenu.ss使用$Language变量的自定义模板:

<% if $Locales %>
<div class="left">Locale <span class="arrow">&rarr;</span>
    <nav class="primary">
        <ul>
            <% loop $Locales %>
                <li class="$LinkingMode">
                    <a href="$Link.ATT" <% if $LinkingMode != 'invalid' %>rel="alternate" hreflang="$Language"<% end_if %>>$Title.XML</a>
                </li>
            <% end_loop %>
        </ul>
    </nav>
</div>
<% end_if %> 
Run Code Online (Sandbox Code Playgroud)