2012-05-04 83 views
7

是否可以在TYPO3 Fluid模板中獲取當前語言鍵(或代碼)?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> 

它會更容易,更在控制器中分配可用的變量是很舒服的,因爲<f:if ...>模塊非常簡單,有時只是不舒服:

+0

相比我發現的非常簡單和優雅 - 謝謝。 –

+5

我會建議不要這種類型的任務,它帶有一些問題。首先,它使用系統語言UID的硬編碼引用,如果轉移到另一個站點,它可能會中斷。其次,如果您確實需要翻譯標籤,則應該使用'f:translate'。也許更好的策略是從該語言中讀取「標誌圖標名稱」值並將其用於翻譯後標籤的名稱中,例如, 'LLL:EXT:myext/Resources/Private/Language/locallang.xml:languages.de'和'.en'等 –

1

另一種選擇是使用VHS擴展中的v:page.languageMenu ViewHelper。這將讓你與其他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

爲了得到當前langage,您可以使用頁/ 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

對於我在大多數項目中使用vhs - 這對我來說是最好的解決方案! –

+2

因此,「真實世界的例子」可能是 \t \t \t \t \t 歡迎 \t \t \t \t \t 歡迎 \t \t \t \t –

9

使用Typo腳本對象流體模板另一種解決方案:

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

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

lib.language < temp.language 

及流體代碼:

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

對象temp.language可以包含任何值, 當然。