2016-04-03 89 views
4

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

<% loop Locales %> 
<li class="$LinkingMode"> 
    <a href="$Link.ATT" hreflang="$LocaleRFC1766"<% end_if %>> 
    $Title.XML 
    </a> 
</li> 
<% end_loop %> 

当它循环“Locales”时,它在技术上循环了什么?没有名为“Locales”的数据库表。

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

回答

5

Locales is a functionFluentExtension扩展:

/** 
* 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); 
} 

这是由LocaleInformation function返回的数据:

$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 
); 

Language最近添加到允许获取仅仅是语言的缩写。

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

<% 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 %> 
+1

好极了,工作。我看到你的拉动要求也向主人表达了。 – Faloude