2016-12-14 115 views
2

URLSegmentFilter有一個靜態數組$default_replacements持有,除其他外,字符串&符號轉換(從&到- 和 -)的網址。SilverStripe覆蓋URLSegmentFilter靜態

我想擴展類並覆蓋此靜態到翻譯的符號轉換(僅適用於爲英文)。

我該如何爲這個目標覆蓋所有者靜態?

class URLSegmentFilterExtension extends Extension { 

    private static $default_replacements = array(
     '/&/u' => '-and-', // I need to translate this using _t() 
     '/&/u' => '-and-', // And this one 
     '/\s|\+/u' => '-', 
     '/[_.]+/u' => '-', 
     '/[^A-Za-z0-9\-]+/u' => '', 
     '/[\/\?=#]+/u' => '-', 
     '/[\-]{2,}/u' => '-', 
     '/^[\-]+/u' => '', 
     '/[\-]+$/u' => '' 
    ); 

} 

回答

1

首先:在URLSegmentFilter主要經營在CMS背景下,你通常只是有一個單一的區域(取決於編輯成員的設置)。所以單獨使用_t()可能不是很有幫助?因此,您可能必須獲取當前的編輯區域設置(假設您使用Fluent或Translatable)並且暫時設置區域設置以進行翻譯。

我沒有看到通過Extension在翻譯中掛鉤的方法。我認爲你最好創建一個自定義子類並通過Injector使用它。

像這樣的東西應該工作:

<?php 
class TranslatedURLSegmentFilter extends URLSegmentFilter 
{ 
    public function getReplacements() 
    { 
     $currentLocale = i18n::get_locale(); 
     $contentLocale = Translatable::get_current_locale(); 
     // temporarily set the locale to the content locale 
     i18n::set_locale($contentLocale); 

     $replacements = parent::getReplacements(); 
     // merge in our custom replacements 
     $replacements = array_merge($replacements, array(
      '/&amp;/u' => _t('TranslatedURLSegmentFilter.UrlAnd', '-and-'), 
      '/&/u' => _t('TranslatedURLSegmentFilter.UrlAnd', '-and-') 
     )); 

     // reset to CMS locale 
     i18n::set_locale($currentLocale); 
     return $replacements; 
    } 
} 

然後,你必須通過配置,使定製URLSegmentFilter通過把這樣的事情在你的mysite/_config/config.yml文件:

Injector: 
    URLSegmentFilter: 
    class: TranslatedURLSegmentFilter 

更新:以上示例假定您使用的模塊爲Translatable。如果您使用流利,替換以下行:

$contentLocale = Translatable::get_current_locale(); 

有:

$contentLocale = Fluent::current_locale(); 
+0

感謝您的輸入bummzack動態更新配置。雖然我不使用任何翻譯模塊。我想在CMS語言環境中進行翻譯,每個用戶可能會有所不同。 – Faloude

+0

@Faloude這似乎不合邏輯?因此,如果一個Admin具有'en'作爲區域設置,他將在URL中保存帶有「-and-'的頁面,而另一個使用'de'登錄的管理員將生成包含'-und-'的URL?對於前端用戶,這將導致混合類型的URL,具體取決於誰保存了頁面?這不可能是你想要的...... – bummzack

+0

在任何情況下,將我提議的解決方案改爲在沒有翻譯模塊的情況下工作應該非常簡單。只需刪除不需要的代碼行,即可設置。 – bummzack

1

可以在mysite/_config.php

$defaultReplacements = Config::inst()->get('URLSegmentFilter', 'default_replacements'); 

$translatedAnd = _t('URLSegmentFilter.And','-and-'); 
$defaultReplacements['/&amp;/u'] = $translatedAnd; 
$defaultReplacements['/&/u'] = $translatedAnd; 

Config::inst()->Update('URLSegmentFilter', 'default_replacements', $defaultReplacements); 
+0

無需翻譯mod即可工作這並不真正啓用翻譯...只是最初將值設置爲其他內容。由於在從CMS內保存頁面時會生成URL,因此您必須動態更改該值,具體取決於CMS中的內容區域設置。 – bummzack

+0

@bummzack我同意你的意見。但是,您可以重複使用具有預設區域設置(使用_ss_environment.php)的不同語言安裝(許多域)的相同代碼。 –

+0

的確如此,但是你可以直接替換配置中的值,並且根本不用麻煩'_t'? – bummzack