【问题标题】:Jekyll i18n ErrorJekyll i18n 错误
【发布时间】:2015-01-12 16:31:08
【问题描述】:

我安装了 i18n gem 和插件来本地化日期,但是当我为网站提供服务时,我收到以下错误:

Malahovas-MacBook-Pro:test Svetlana$ rake
Configuration file: /Users/Svetlana/Desktop/test/_config.yml
            Source: /Users/Svetlana/Desktop/test
       Destination: /Users/Svetlana/Desktop/test/_site
      Generating... 
  Liquid Exception: Object must be a Date, DateTime or Time object. "2015-12-01" given. in _includes/footer.html, included in _layouts/post.html
jekyll 2.5.3 | Error:  Object must be a Date, DateTime or Time object. "2015-12-01" given.

在 footer.html 我有以下代码:

<time datetime="{{ page.date | date: "%Y-%m-%d" }}">
    {{ page.date | localize: "%d %B %Y" }}
</time>

这是插件i18n_filter.rb的代码:

require 'i18n'

LOCALE = :ru # set your locale

# Create folder "_locales" and put some locale file from
# https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale
module Jekyll
  module I18nFilter
    # Example:
    # {{ post.date | localize: "%d.%m.%Y" }}
    # {{ post.date | localize: ":short" }}
    def localize(input, format=nil)
      load_translations
      format = (format =~ /^:(\w+)/) ? $1.to_sym : format
      I18n.l input, :format => format
    end

    def load_translations
      unless I18n::backend.instance_variable_get(:@translations)
        I18n.backend.load_translations Dir[File.join(File.dirname(__FILE__), '../_locales/*.yml')]
        I18n.locale = LOCALE
      end
    end
  end
end

这是一个集合文件。使用--trace 运行构建后,我得到:

Malahovas-MacBook-Pro:test Svetlana$ jekyll build --trace
Configuration file: /Users/Svetlana/Desktop/test/_config.yml
            Source: /Users/Svetlana/Desktop/test
       Destination: /Users/Svetlana/Desktop/test/_site
      Generating... 
  Liquid Exception: Object must be a Date, DateTime or Time object. "2015-12-01" given. in _includes/footer.html, included in _layouts/post.html
/Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/tags/include.rb:124:in `rescue in render': Object must be a Date, DateTime or Time object. "2015-12-01" given. (Jekyll::Tags::IncludeTagError)
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/tags/include.rb:116:in `render'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/liquid-2.6.1/lib/liquid/block.rb:109:in `block in render_all'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/liquid-2.6.1/lib/liquid/block.rb:96:in `each'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/liquid-2.6.1/lib/liquid/block.rb:96:in `render_all'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/liquid-2.6.1/lib/liquid/block.rb:82:in `render'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/liquid-2.6.1/lib/liquid/template.rb:128:in `render'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/liquid-2.6.1/lib/liquid/template.rb:138:in `render!'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/renderer.rb:92:in `render_liquid'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/renderer.rb:134:in `place_in_layouts'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/renderer.rb:56:in `run'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/site.rb:292:in `block (2 levels) in render'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/site.rb:291:in `each'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/site.rb:291:in `block in render'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/site.rb:290:in `each'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/site.rb:290:in `render'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/site.rb:51:in `process'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/command.rb:28:in `process_site'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/commands/build.rb:56:in `build'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/commands/build.rb:34:in `process'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/lib/jekyll/commands/build.rb:18:in `block (2 levels) in init_with_program'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/mercenary-0.3.3/lib/mercenary/command.rb:220:in `call'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/mercenary-0.3.3/lib/mercenary/command.rb:220:in `block in execute'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/mercenary-0.3.3/lib/mercenary/command.rb:220:in `each'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/mercenary-0.3.3/lib/mercenary/command.rb:220:in `execute'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/mercenary-0.3.3/lib/mercenary/program.rb:35:in `go'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/mercenary-0.3.3/lib/mercenary.rb:22:in `program'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/gems/jekyll-2.5.3/bin/jekyll:20:in `<top (required)>'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/bin/jekyll:23:in `load'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/bin/jekyll:23:in `<main>'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/bin/ruby_executable_hooks:15:in `eval'
    from /Users/Svetlana/.rvm/gems/ruby-2.0.0-p451/bin/ruby_executable_hooks:15:in `<main>'

你知道如何解决这个问题吗?

【问题讨论】:

  • 一些代码+插件的url可以提供帮助。
  • 我用插件的代码和trace@DavidJacquel 构建后的错误消息更新了问题
  • 您是否尝试传递类似2014-01-01 09:49:00 的内容?
  • @DavidJacquel 我刚刚尝试过,我得到了同样的错误。

标签: ruby localization jekyll liquid


【解决方案1】:

I18n.localizeI18n.l 需要 Date、DateTime 或 Time 参数。 page.date 实际上应该是 DateTimeTime 类型,但我假设过滤器没有加载,因此被 Jekyll 忽略(我在底部添加了液体过滤器加载)。这是一种可能的解决方法:

在调用 I18n.localize 之前尝试解析输入字符串:

假设您在项目目录中名为./locales/ 的文件夹中有一个语言环境文件ru.ymli18n.rb放在./_plugins/i18n.rb

require 'date'
require 'i18n'

path = File.expand_path("../../locales/ru.yml", __FILE__)
I18n.load_path = Dir[path]
I18n.locale = :ru

module Jekyll
  module I18nFilter
    # Example:
    # {{ post.date | localize: "%d.%m.%Y" }}
    # {{ post.date | localize: ":short" }}
    def localize(input, format=nil)
      format = (format =~ /^:(\w+)/) ? $1.to_sym : format

      if input.is_a?(String)
        input = DateTime.parse(input)
      end

      I18n.l input, :format => format
    end

    def translate(key)
      I18n.t key
    end
  end
end

# Add as a filter
Liquid::Template.register_filter(Jekyll::I18nFilter)

ru.yml 可以是任何有效的 yaml 文件,包含语言环境,例如:

ru:
  hello: приве́т

如果input 是格式错误的字符串,则转换为DateTime 可能会导致错误,例如为空“”或缺少约会所需的内容。最小值类似于:“2015-01-13”。

作为 Jekyll 的替代品:查看 Nanoc,它似乎更新了,并且更易于扩展。它在 Github 上使用,我们将它用于 localization platform PhraseApp 上的所有静态页面

【讨论】:

  • 非常感谢。现在我在运行服务器时没有收到任何错误,但本地化不起作用。我只得到一个像“2015-01-13”这样的字符串。
  • 您是否已将过滤器添加为插件? Liquid::Template.register_filter(Jekyll::I18nFilter) 如文档中所述:jekyllrb.com/docs/plugins 在液体过滤器下
  • 当添加为过滤器并重新生成页面时,它适用于 2.4.0
  • 实际上,在我将此行作为过滤器添加到插件后,我收到以下错误:Liquid Exception: uninitialized constant Jekyll::I18nFilter::LOCALE in _includes/footer.html, included in _layouts/post.html jekyll 2.5.3 | Error: uninitialized constant Jekyll::I18nFilter::LOCALE Malahovas-MacBook-Pro:test Svetlana$
  • require 'date' 指的是什么?如何检查我是否有此文件?
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多