2015-01-12 40 views
0

我安裝了國際化的寶石和插件本地化的日期,但是當我所服務的網站,我收到以下錯誤:傑基爾國際化錯誤

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>' 

你知道這可怎麼固定?

+0

插件的某些代碼+ url可以提供幫助。 –

+0

我用'trace'構建了插件和錯誤消息的代碼,並更新了問題@DavidJacquel – jupiteror

+0

您是否試圖傳遞類似'2014-01-01 09:49:00'的東西? –

回答

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: приве́т 

DateTime的轉化可能會導致一個錯誤,如果是input格式錯誤的字符串,例如空「」或丟失日期所需的東西。最小值應該是這樣的:「2015-01-13」。

作爲Jekyll的替代方案:檢出Nanoc,它似乎更新,更容易擴展。它在Github中使用,我們將它用於我們的所有靜態頁面。localization platform PhraseApp

+0

非常感謝。現在我沒有運行服務器的任何錯誤,但本地化不起作用。我只得到一個像「2015-01-13」這樣的字符串。 – jupiteror

+0

你是否將你的過濾器添加爲插件? '液體:: Template.register_filter(Jekyll :: I18nFilter)'在文檔中描述:http://jekyllrb.com/docs/plugins/在液體過濾器下 – fredostarr

+0

當作爲過濾器添加並重新生成頁面時,它適用於我與2.4.0 – fredostarr