【问题标题】:How to globalize my Ruby on Rails application如何全球化我的 Ruby on Rails 应用程序
【发布时间】:2013-03-09 13:42:26
【问题描述】:

我有一个简单的 Rails 应用程序(甚至不是数据库驱动的)。基本上我想让它支持两种语言。我的方法是在页脚中添加 两个小标志,一个是 GB(用于 English),一个是德国(用于 German) .当用户点击一个时,网站的语言会变为国家标志的相应语言

我的 [ 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

上述方法似乎不起作用。当我调用 [ /language/set?lang="de" ] 时,本地化字符串变为 keys 而不是实际的德语翻译文本。

【问题讨论】:

    标签: ruby-on-rails-3.1 internationalization globalization


    【解决方案1】:

    这个:

    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
    

    【讨论】:

    • 谢谢米莎。我也在考虑这一点,但没有在文档中建议不要为此目的使用会话。无论如何,我已经按照你的建议做了,但是翻译的文本仍然没有显示,只有键,没有显示翻译的值!
    • @Ciwan - 我想你应该在params[:lang] 上调用.to_sym 以使其成为符号而不是字符串。另外,你打电话给/language/set?lang="de" 还是/language/set?lang=de?应该是后者。
    • 我在指南中看到了关于不使用会话的评论。我想这是有道理的。如果您想避免会话,则必须始终将?lang=de 保留在 URL 中。有一个(付费)Railscast 解释了如何执行此操作。尽管有警告,但使用会话是最简单的解决方案。
    • 非常感谢。那解决了它。另外,我很傻,在提供的 lang 参数值周围使用双引号。
    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2017-12-09
    相关资源
    最近更新 更多