Ruby on rails 3.1 如何全球化我的Ruby on Rails应用程序

Ruby on rails 3.1 如何全球化我的Ruby on Rails应用程序,ruby-on-rails-3.1,internationalization,globalization,Ruby On Rails 3.1,Internationalization,Globalization,我有一个简单的Rails应用程序(甚至不是数据库驱动的)。基本上我想让它支持两种语言。我的方法是在页脚上有两个小旗子,一个是GB(表示英语),另一个是德国(表示德语)。当用户单击其中一个时,网站的语言将更改为相应的国旗语言 我有我的[en.yml]和[de.yml]所有设置,在我的所有视图中使用了它们的键,我甚至通过在[config/application.rb]中的[en]和[de]之间交换[config.i18n.default_locale]属性来测试它们是否工作。在这方面一切都很好 然而

我有一个简单的Rails应用程序(甚至不是数据库驱动的)。基本上我想让它支持两种语言。我的方法是在页脚上有两个小旗子,一个是GB(表示英语),另一个是德国(表示德语)。当用户单击其中一个时,网站的语言将更改为相应的国旗语言

我有我的[en.yml]和[de.yml]所有设置,在我的所有视图中使用了它们的键,我甚至通过在[config/application.rb]中的[en]和[de]之间交换[config.i18n.default_locale]属性来测试它们是否工作。在这方面一切都很好

然而,我被困在如何实现语言转换机制的问题上。我创建了一个名为[Language]的控制器,并在其中定义了一个名为[Set]的方法,但除此之外,它几乎是空白的,我认为应该发生以下情况:

class LanguageController < ApplicationController
  def set
    I18n.locale = params[:lang]
    redirect_to(:controller => 'home', :action => 'index')
  end
end
class LanguageController'home',:action=>'index')
结束
结束
上述方法似乎不起作用。当我调用[/language/set?lang=“de”]时,本地化字符串变为键,而不是实际的德语翻译文本。

这是:

I18n.locale = params[:lang]
不会在请求之间持久存在,因此当您重定向(=新请求)时,它会恢复为英语

您应该在会话中保存语言设置:

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

谢谢你,米沙。我也在考虑这一点,但并没有在文档中建议不要为此目的使用会话。无论如何,我已经按照你的建议做了,但是翻译的文本仍然没有显示,只有键,没有显示翻译的值@Ciwan-我想你应该在
params[:lang]
上调用
.to_sym
,使其成为一个符号而不是字符串。另外,您正在调用
/language/set?lang=“de”
还是
/language/set?lang=de
?应该是后者。我在指南中看到了关于不使用会话的评论。我想这是有道理的。如果您想避免会话,您必须始终在URL中保留
?lang=de
。有一个(付费的)说明如何做到这一点。尽管有警告,使用会话是最简单的解决方案。非常感谢。这就解决了问题。另外,我很傻,在提供的lang参数值周围使用了双引号。
class ApplicationController
  before_filter :set_language

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