问题描述
我是第一次尝试设置 jekyll-multiple-languages-plugin。
example website 确实有效。虽然,我自己的网站没有。
这是输出,每当我运行 bundle exec jekyll serve --verbose
时:
/var/lib/gems/2.7.0/gems/jekyll-multiple-languages-plugin-1.7.0/lib/jekyll-multiple-languages-plugin.rb:360:in `render': 未定义的方法 ` access' for false:FalseClass (NoMethodError)
液体:
<div class="intro-lead-in">{% t page.header.text %}</div>
pt.yml:
---
header:
overlay: "no"
text: It's Nice To Meet You
button: Tell Me More
buttonlink: "#services"
---
宝石规格:
spec.required_ruby_version = '>= 2.5.0'
spec.add_runtime_dependency "jekyll",">= 4.0","< 4.3"
spec.add_development_dependency "bundler","~> 2.0"
spec.add_development_dependency "rake","~> 13.0"
_config.yml
plugins:
- jekyll-multiple-languages-plugin
languages: ["en","pt"]
exclude_from_localizations: ["assets","favicon.ico"]
解决方法
由于异常是在“jekyll-multiple-languages-plugin” gem 中引发的,让我们快速浏览一下 source。
# lib/jekyll-multiple-languages-plugin.rb:360
translation = site.parsed_translations[lang].access(key) if key.is_a?(String)
为了生成消息“undefined method `access' for false:FalseClass”,这意味着 .access
被调用在 false
上。因为上面只有一个 access
调用,这意味着 site.parsed_translations[lang]
必须评估为 false
。
那么,作为图书馆用户,您如何影响这个值?我们首先要看看这个价值是如何产生的。
# lib/jekyll-multiple-languages-plugin.rb:25
site.parsed_translations[lang] = YAML.load_file("#{site.source}/_i18n/#{lang}.yml")
这意味着 false
值是解析您的 .yml
文件之一的返回值。 YAML.load_file
文档对此返回值做了以下说明:
load_file(filename,fallback: false)
加载包含在 filename
中的文档。返回包含在的 yaml
filename
作为 Ruby 对象,或者如果文件为空,则返回
指定的 fallback
返回值,默认为 false
。
在这里我们可以看到一个空文件导致一个 false
返回值。因此,要么您的 _i18n/pt.yml
或 _i18n/en.yml
文件为空,要么其中的内容评估为 false
。例如 YAML.load('false') #=> false
和 YAML.load('no') #=> false