2016-03-04 88 views
1

在我的多語言Symfony(2.8)應用程序中,我有許多使用ajax注入主頁面的視圖。根據這article我已經實現了一個語言環境監聽器,所以語言環境很粘。在Symfony中,如何從瀏覽器中的uri中刪除查詢字符串

我發現,退出並重新啓動瀏覽器(Safari瀏覽器),而主要是打開的頁面 - 而當前區域是默認 - 即在第二天request當前區域丟失了,因爲現在還沒有前一屆會議。當返回來自ajax鏈接的視圖時,語言環境將設置爲默認值,從而生成具有混合語言的頁面。

作爲一種解決方法,我將當前的語言環境作爲查詢包含在所有ajax鏈接中,並且我已經劫持了語言環境偵聽器,即使在上述情況下,現在也可以從查詢中設置request的語言環境。

它似乎是做這項工作。然而,缺點是我現在留下了包含查詢字符串的醜陋URL,例如www.domain.co.uk/es/moreinfo?_locale=es

我一直在試圖實現另一個監聽器,從uri中去除查詢。偵聽器檢測到查詢並可以從request->query參數和$_SERVER全局變量中刪除它,但是當視圖返回到瀏覽器時,我嘗試的任何內容都不會改變。

我也嘗試過使用新路由,它解析並轉發或重定向到不同的路由/路徑,但瀏覽器中的url仍然保持不變。

任何想法或建議嗎?

我是否從錯誤的角度來討論這個問題 - 即應該嘗試在客戶端而不是服務器端進行?

回答

0

正如我所見,在您的網址中還有一個區域設置如下所示:{url}/{_locale}/moreinfo...

這是本地化的正確方法。你現在唯一需要的就是在你的url中適合_locale slug的Symfony語言環境。正如你可能猜到的那樣,_locale查詢參數是多餘的。

請參考此SO問題的完整解決方案。

+0

是的,這似乎是正確的做法。然而,'{url}/{_ locale}'路徑是從主路由設置的,Ajax路由的路徑是'/ moreinfo'。因此,當匹配'/ moreinfo'路由時'{_locale}'slug不可用。 – tomchkk

+0

您可以使用'$ request-> setLocale($ locale)'在任何地方將語言環境設置爲您的請求。之後,您可以使用'$ request-> getLocale()'來訪問它。希望它能幫助你。 –

+0

嗯,這正是監聽器所做的,除了它必須從某處獲得'$ locale'的值。在這種情況下,我描述的價值不存在,這就是爲什麼我從查詢中設置它。否則,它只會得到默認的區域值'en'。我開始認爲生病只是從url中解析出語言環境,這是我希望避免的。 – tomchkk