2012-05-04 43 views
7

Có thể lấy khóa ngôn ngữ hiện tại (hoặc mã) trong mẫu chất lỏng TYPO3 không?Mẫu chất lỏng TYPO3 lấy mã ngôn ngữ

Trong khi đó tôi đã tìm thấy một giải pháp khác sử dụng một helper nhìn thấy 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(); 
    } 

} 

?> 

mà tôi sử dụng trong mẫu chất lỏng như sau.

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

Trả lời

9

Bạn chỉ có thể gán biến trong hành động của bạn:

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

và sau đó đọc nó theo quan điểm của bạn:

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

mặt khác nó sẽ dễ dàng hơn và nhiều hơn nữa thoải mái khi gán biến redy-to-use trong bộ điều khiển là <f:if ...> khối khá đơn giản và đôi khi không thoải mái:

+0

Rất đơn giản và thanh lịch so với những gì tôi đã tìm thấy - cảm ơn bạn. –

+5

Tôi khuyên bạn nên chống lại loại nhiệm vụ này, nó mang theo một vài vấn đề. Đầu tiên, nó sử dụng các tham chiếu được mã hóa cứng cho UID ngôn ngữ hệ thống có khả năng bị ngắt nếu được chuyển sang một trang web khác. Thứ hai, nếu bạn cần dịch nhãn, bạn nên sử dụng 'f: translate'. Có lẽ chiến lược tốt hơn là đọc giá trị "tên biểu tượng cờ" từ ngôn ngữ và sử dụng tên đó trong tên của nhãn được dịch, ví dụ: 'LLL: EXT: myext/Tài nguyên/Riêng/Ngôn ngữ/locallang.xml: languages.de' và' .en' vv –

1

Một tùy chọn khác có thể là sử dụng v:page.languageMenu ViewHelper từ phần mở rộng VHS. Nó sẽ cho phép bạn để kết hợp với ViewHelpers khác và sử dụng một cái gì đó như sau trong một mẫu chất lỏng:

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

Có một nhiều hơn bạn có thể làm với các giá trị trở về từ mỗi một trong các ViewHelpers - bạn có thể cho Ví dụ sử dụng v:var.set để xác định các biến mới trong mẫu mà chứa chiết xuất tên cờ:

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

để có được Langage hiện tại, bạn có thể sử dụng trang/LanguageViewHelper kèm với phần mở rộng VHS.

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

Có một cái nhìn ở đây: http://fluidtypo3.org/viewhelpers/vhs/1.8.3/Page/LanguageViewHelper.html

+0

đó là giải pháp tốt –

+0

Vì tôi sử dụng vhs trong hầu hết các dự án - đó là giải pháp tốt nhất cho tôi! –

+2

Vì vậy, với một "ví dụ thế giới thực" có thể là \t \t \t \t \t Chào mừng \t \t \t \t \t Chào mừng \t \t \t \t –

9

Một giải pháp sử dụng đối tượng TypoScript trong mẫu chất lỏng:

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

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

lib.language < temp.language 

Và mã Lỏng:

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

Object temp.language có thể chứa bất kỳ giá trị , tất nhiên.

Các vấn đề liên quan