【问题标题】:i18n markdown files in Rails 3 viewsRails 3 视图中的 i18n 降价文件
【发布时间】:2012-05-01 07:10:06
【问题描述】:

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

app/views/static_pages/about.html.haml

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

static_pages 目录下,我有 Markdown 文件,例如 about.en.mdabout.it.mdabout .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) 并将代码更改为如下所示:

    app/views/static_pages/about.html.haml

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

    但是,有没有办法在不将 Markdown 文件更改为另一种类型的文件的情况下做到这一点?如果存在这种方式,是否推荐/可行?

【问题讨论】:

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


    【解决方案1】:

    看了this StackOverflow answer之后,似乎i18n Markdown文件的最佳位置是config/locales目录下自己的动作名目录,而且有一个很好的机会为StaticPagesController 重构所有视图上的render 代码。所以,下面以 about.html.haml 为例,在 homehelpabout 中调用render contact 视图已更改为完全相同的代码:

    app/views/static_pages/about.html.haml

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

    localized_page_for 方法在StaticPagesHelper 中定义:

    app/helpers/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 等)使用ActionControlleraction_name 属性和语言环境,减少混乱。

    至于上面的问题2,字符串插值对于这类问题似乎已经足够普遍了,所以我也认为它足够“优雅”。

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

    更新:

    在对应用程序运行安全扫描程序Brakeman 后,由于动态地将params[:locale] 传递给render 调用而不是传递给它静态字符串。因此,我将调用 localized_page 的方法移出视图,将方法本身移出 StaticPagesHelper(因此该文件现在为空)并移入 StaticPagesController,然后实例化一个 @page 实例每个方法中的变量传递给视图。总之,代码现在看起来像这样,没有收到安全警告:

    app/controllers/static_pages_controller.rb

    class StaticPagesController < ApplicationController
    
      before_filter :localized_page, only: [:help, :about, :contact]
    
      def home
        if signed_in?
          @micropost  = current_user.microposts.build
          @feed_items = current_user.feed.paginate(page: params[:page])
        else
          localized_page
        end
      end
    
     def help
     end
    
     def about
     end
    
     def contact  
     end
    
     private
    
       def localized_page
        @page = "#{Rails.root}/config/locales/"\
                "#{action_name}/#{action_name}.#{params[:locale].to_s}.md"
       end
    end
    

    app/views/static_pages/about.html.haml

    - provide(:title, t('.about_us'))
    :markdown
      #{render file: @page}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-21
      • 2017-07-06
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多