首页 > 解决方案 > `render':使用 jekyll 多语言插件时未定义的方法 `access'

问题描述

我正在尝试第一次设置jekyll-multiple-languages-plugin

示例网站确实有效。虽然,我自己的网站没有。

这是输出,每当我运行时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': undefined method `access' for假:假类(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"]

标签: rubyrubygemsjekylljekyll-extensions

解决方案


由于在“jekyll-multiple-languages-plugin” gem 中引发了异常,让我们快速查看一下源代码

# lib/jekyll-multiple-languages-plugin.rb:360
translation = site.parsed_translations[lang].access(key) if key.is_a?(String)

为了生成消息“未定义的方法 `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. 将包含的 yaml filename作为 Ruby 对象返回,或者如果文件为空,则返回指定的fallback返回值,默认为false.

在这里我们可以看到一个空文件导致false返回值。因此,您的_i18n/pt.ymlor_i18n/en.yml文件为空或其中的内容评估为false. 例子是YAML.load('false') #=> falseYAML.load('no') #=> false


推荐阅读