2012-05-04 3 views
7

Czy jest możliwe pobranie aktualnego klucza językowego (lub kodu) w szablonie płynu TYPO3?Szablon płynu TYPO3 uzyska kod języka

W międzyczasie mam znaleźć inne rozwiązanie przy użyciu widoku pomocnika znaleźć 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(); 
    } 

} 

?> 

którego używam w szablonie płynu w następujący sposób.

<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> 

Odpowiedz

9

można po prostu przypisać zmienną w swoim działaniu:

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

a następnie odczytać go w widoku:

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

drugiej strony byłoby łatwiejsze i bardziej wygodne przypisanie zmiennej redy-to-use w kontrolerze jako bloku <f:if ...> jest dość proste i czasami po prostu niewygodne:

+0

Bardzo prosty i elegancki w porównaniu do tego, co znalazłem - dziękuję. –

+5

Odradzam tego typu zadania, niesie to ze sobą kilka problemów. Po pierwsze, używa on mocno zakodowanych odniesień do UIDów w języku UID, które prawdopodobnie ulegną zniszczeniu w przypadku przeniesienia do innej witryny. Po drugie, jeśli musisz tłumaczyć etykiety, powinieneś używać 'f: translate'. Być może lepszą strategią jest odczytanie wartości "flag icon name" z języka i użycie jej w nazwie przetłumaczonej etykiety, np. 'LLL: EXT: myext/Resources/Private/Language/locallang.xml: languages.de' i' .en' itd. –

1

Inną opcją może być użycie widoku v:page.languageMenu ViewHelper z rozszerzenia VHS. Pozwoliłoby to na łączenie z innymi ViewHelpers i użyć coś jak poniżej w płynie Szablon:

{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> 

Jest dużo więcej można zrobić z wartości zwracanych z każdego z tych ViewHelpers - można na Przykład użycia v:var.set do definiowania nowych zmiennych w szablonie, które zawierają wyodrębnione nazwy flag

<!-- 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

w celu uzyskania aktualnej langage, można użyć strony/LanguageViewHelper zawarte z rozszerzeniem VHS.

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

Sprawdźcie tutaj: http://fluidtypo3.org/viewhelpers/vhs/1.8.3/Page/LanguageViewHelper.html

+0

to dobre rozwiązanie –

+0

W każdym razie używam vhs w większości projektów - to najlepsze rozwiązanie dla mnie! –

+2

Tak więc "rzeczywistym przykładem świata" może być

9

Innym rozwiązaniem przy użyciu obiektu TypoScript w Fluid Szablon:

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

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

lib.language < temp.language 

i kod Fluid:

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

Object temp.language może zawierać żadnych wartości , oczywiście.