Rails 3视图中的i18n markdown文件

时间:2012-04-19 17:40:39

标签: internationalization haml markdown ruby-on-rails-3.2 railstutorial.org

我目前正在研究Michael Hartl的Rails Tutorial,同时试验了本书未涉及的其他一些内容。在完成创建静态页面的Chapter 5之后,我决定将视图代码更改为HAML,使页面国际化,并将静态内容放入单独的(非部分)Markdown文件中,使用RDiscount gem来渲染它们。例如:

应用/视图/ static_pages / about.html.haml

- provide(:title, t('.about_us'))
:markdown
  #{render file: "static_pages/about.#{params[:locale]}.md"}

static_pages 目录下,我有Markdown文件,例如 about.en.md about.it.md about .ja.md 等,因此:locale参数中的插值决定了Markdown文件的呈现方式。

我的问题是:

  1. static_pages 目录中的Markdown文件有点拥挤,所以有没有合理的默认/最佳实践位置(可能在 app 目录之外)以保持这些Markdown文件,大概是由那些不需要了解应用程序内部工作原理的人编辑的?
  2. 在视图中实现渲染多语言Markdown文件有哪些更好的方法?我对:locale和双字符串插值的使用似乎不够优雅。
  3. 有没有办法更改此代码,以便我可以将Ruby变量传递到Markdown文件中?我知道我可以在Markdown中使用#{language}变量,只需将 about.en.md 更改为HAML部分( _about.en.html.haml < / strong>)并将代码更改为:

    应用/视图/ static_pages / about.html.haml

    - provide(:title, t('.about_us'))
    :markdown
      #{render "about.#{params[:locale]}", language: 'Markdown!'}
    

    但是,有没有办法在不将Markdown文件更改为其他类型的文件的情况下执行此操作?如果存在这种方式,是推荐还是可行?

1 个答案:

答案 0 :(得分:5)

看了this StackOverflow answer之后,i18n Markdown文件的最佳位置似乎是 config / locales 目录下的自己的动作名称目录,并且有一个在render的所有视图上重构StaticPagesController代码的好机会。因此,使用 about.html.haml 作为示例,在主页帮助render > about 联系视图已更改为完全相同的代码:

应用/视图/ static_pages / about.html.haml

- provide(:title, t('.about_us'))
:markdown
  #{render file: localized_page_for(action_name, params[:locale])}

localized_page_for方法定义了StaticPagesHelper方法:

应用/助手/ static_pages_helper.rb

module StaticPagesHelper
  def localized_page_for(action, locale)
    "#{Rails.root}/config/locales/#{action}/#{action}.#{locale.to_s}.md"
  end
end

因此,现在所有Markdown文件都已从 app / views / static_pages 目录中取出,并从各自的逻辑目录中调用(例如 config / locales / about / about .en.md 等)使用ActionController的{​​{1}}属性和区域设置,减少了混乱。

对于上面的问题2,字符串插值对于这类问题似乎很常见,所以我也会认为它“优雅”。

至于上面的问题3,经过详尽的搜索,我还没有找到任何人将变量传递到纯Markdown文件的方式,the documentation似乎没有说任何关于支持它们的方法,所以我将得出结论,这是不可能的。如果将Ruby变量传递给Markdown是绝对必要的,那么该文件将需要通过另一个解释器来运行,类似this StackOverflow answer中所述。

<强>更新

针对应用运行安全扫描程序Brakeman之后,由于动态传递action_name到{{1},它出现了潜在的Dynamic Render Path安全警告(尽管是弱警告)调用而不是传递静态字符串。所以,我将调用移到视图中的params[:locale]方法,将方法本身移出render(以便文件现在为空),然后移到localized_page然后在每个方法中实例化一个StaticPagesHelper实例变量以传递给视图。总之,代码现在看起来像这样,它没有得到安全警告:

应用/控制器/ static_pages_controller.rb

StaticPagesController

应用/视图/ static_pages / about.html.haml

@page