2013-03-09 94 views
1

我有一個簡單的rails應用程序(甚至沒有數據庫驅動)。基本上我想讓它支持兩種語言。我對這樣的做法是有兩個小標誌在頁腳,GB之一(英語)和德國(爲德國)之一。當用戶點擊其中一個時,網站的語言將更改爲國家/地區標誌的相應語言。全球化我的rails應用程序

我有我的[en.yml]和[de.yml]所有的設置,我有用自己的鑰匙在我所有的意見,我也甚至測試他們通過交換[配置工作。 i18n.default_locale]屬性[config/application.rb]中的[en]和[de]之間。在這方面一切運作良好。

但是我堅持如何才能實現語言更改機制。我創建了一個名爲[語言]控制器和它,我已經定義了一個名爲[設置],但比其他方法,它是非常空,這裏是我認爲應該發生:

class LanguageController < ApplicationController 
    def set 
    I18n.locale = params[:lang] 
    redirect_to(:controller => 'home', :action => 'index') 
    end 
end 

以上沒有按似乎沒有用。當我撥打[/language/set?lang =「de」]時,本地化字符串將變爲而非實際的德語翻譯文本!

另一件我被困在(我無法在i18n文檔中找到)的是我如何爲每個區域加載不同的圖像!

任何幫助將不勝感激。

謝謝。

回答

2

此:

I18n.locale = params[:lang] 

不跨請求仍然存在,所以,當你重定向(=新的請求),它將恢復爲英語。

您應該保存語言設置在一個會話:

class LanguageController < ApplicationController 
    def set 
    session[:lang] = params[:lang].to_sym 
    redirect_to(:controller => 'home', :action => 'index') 
    end 
end 

並檢查每個請求的會話。你可以在你的before_filter中做到這一點ApplicationController

class ApplicationController 
    before_filter :set_language 

    def set_language 
    I18n.locale = session[:lang] if session[:lang] 
    end 
end 
+0

謝謝米莎。我也在考慮這個問題,但沒有在文件中提出建議,因爲它建議不要爲此使用會話。無論如何,我已經按照你的建議完成了,但翻譯後的文本仍然不顯示,只有鍵,顯示的不是翻譯的值! – Ciwan 2013-03-09 14:36:43

+1

@Ciwan - 我想你應該在'params [:lang]'上調用'.to_sym'來使它成爲一個符號而不是一個字符串。另外,你是在調用'/ language/set?lang =「de」'還是'/ language/set?lang = de'?它應該是後者。 – Mischa 2013-03-09 15:16:42

+0

我看到了關於不在指南中使用會話的評論。我想這是有道理的。如果你想避免會話,你必須始終保持URL中的'?lang = de'。有(付費的)[Railscast](http://railscasts.com/episodes/138-i18n-revised)解釋瞭如何做到這一點。儘管有警告,但使用會話是最簡單的解決方案。 – Mischa 2013-03-09 15:23:23