2012-05-04 2 views
7

Возможно ли получить текущий языковой ключ (или код) в шаблоне Fluid TYPO3?TYPO3 Fluid Template получить код языка

В то же время я нашел другое решение, используя помощник вида найдено here:

<?php 
class Tx_AboUnitReservation_ViewHelpers_LanguageViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper { 

    /** 
    * Get the current language 
    */ 
    protected function getLanguage() { 
     if (TYPO3_MODE === 'FE') { 
      if (isset($GLOBALS['TSFE']->config['config']['language'])) { 
       return $GLOBALS['TSFE']->config['config']['language']; 
      } 
     } elseif (strlen($GLOBALS['BE_USER']->uc['lang']) > 0) { 
      return $GLOBALS['BE_USER']->uc['lang']; 
     } 
     return 'en'; //default 
    } 

    /** 
    * Return current language 
    * @return string 
    */ 
    public function render() { 
     return $this->getLanguage(); 
    } 

} 

?> 

, который я использую в шаблоне жидкости следующим образом.

<f:alias map="{isGerman: 'de'}"> 
    <f:if condition="{aboUnitReservation:language()} == {isGerman}"> 
     <script type="text/javascript" src="{f:uri.resource(path:'js/jquery.ui.datepicker-de-CH.js')}"></script> 
    </f:if> 
</f:alias> 

ответ

9

Вы можете просто присвоить переменной в своем действии:

$this->view->assign("sysLanguageUid", $GLOBALS['TSFE']->sys_language_uid); 

, а затем прочитать его на ваш взгляд:

<f:if condition="{sysLanguageUid} == 0"> 
    You're reading English version of page 
</f:if> 

с другой стороны было бы легче и более удобно назначать redy-to-use переменную в контроллере как <f:if ...> блок довольно прост, а иногда просто неудобно:

+0

Очень простой и элегантный по сравнению с тем, что я нашел - спасибо. –

+5

Я бы посоветовал против такого рода назначения, он несет в себе несколько проблем. Во-первых, он использует жестко закодированные ссылки на UID системного языка, которые, вероятно, будут разбиты, если они будут перенесены на другой сайт. Во-вторых, если вам нужно перевести метки, вы должны использовать 'f: translate'. Возможно, лучшей стратегией является считывание значения имени значка «флаг» с языка и использование этого имени имени переведенной метки, например. 'LLL: EXT: myext/Resources/Private/Language/locallang.xml: languages.de' и' .en' и т. Д. –

1

Другим вариантом может быть использование модели ViewCelper с расширения VHS. Это позволит вам комбинировать с другими ViewHelpers и использовать что-то вроде следующего в жидкости шаблона:

{namespace v=Tx_Vhs_ViewHelpers} 
<v:page.languageMenu as="languages"> 

    <!-- gets the current language key --> 
    {languages -> v:iterator.filter(propertyName: 'current', filter: 1)} 

    <!-- iterates over flag names of all languages which apply to the current page --> 
    <f:for each="{languages -> v:iterator.extract(key: 'flag')}" as="languageFlagName"> 

     <!-- example suggestion: image --> 
     <f:image src="{f:uri.resources(path: 'Images/Flags/{languageFlagName}.png')}" /> 

     <!-- example suggestion: label read from LLL:EXT:myext/Resources/Private/Language/locallang.xml:languages.$languageFlagName --> 
     <f:translate key="languages.{languageFlagName}" default="{languageFlagName} /> 

    </f:for> 

</v:page.languageMenu> 

Существует В много больше вы можете сделать с значениями, возвращенными из каждого из этих ViewHelpers - вы можете для пример использование v:var.set для определения новых переменных в шаблоне, которые содержат извлеченные имена флагов:

<!-- Using {languages} inside <v:page.languageMenu> like above --> 
{languages -> v:iterator.filter(propertyName: 'current', filter: 1) -> v:var.set(name: 'currentLanguage')} 
<!-- variable {currentLanguage} now contains an array of values describing the current language --> 
5

для того, чтобы получить текущую языка сайта, вы можете использовать страницу/LanguageViewHelper в комплект с расширением VHS.

{v:page.language(languages: 'en,fr', pageUid: '0', normalWhenNoLanguage: 'en')} 

Посмотрите здесь: http://fluidtypo3.org/viewhelpers/vhs/1.8.3/Page/LanguageViewHelper.html

+0

это хорошее решение –

+0

Для использования VSH в большинстве проектов - это лучшее решение для меня! –

+2

Таким образом, «пример реального мира» может быть

9

Другое решение с помощью объекта TypoScript в жидкости шаблона:

# German language 
temp.language = TEXT 
temp.language.value = at 

# English language 
[globalVar = GP:L = 1] 
    temp.language.value = en 
[global] 

lib.language < temp.language 

И Fluid Код:

<f:if condition="{f:cObject(typoscriptObjectPath: 'lib.language')} == 'at'"> 
    <f:then> 
     ... 
    </f:then> 
    <f:else> 
     ... 
    </f:else> 
</f:if> 

Объект temp.language может содержать любые значения , конечно.