`render':使用 jekyll 多语言插件时未定义的方法 `access' load_file(filename, fallback: false)

问题描述

我是第一次尝试设置 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') #=> falseYAML.load('no') #=> false

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...