循环遍历嵌套的JSON元素并查找自定义Jekyll标记的值

时间:2017-01-07 06:45:59

标签: json ruby jekyll liquid jekyll-extensions

我正在编写一个自定义的Jekyll标记,它接受两个变量(文本和语言)并将文本转换为提供的语言选项。

例如,{% localize next de %}应该返回" Weiter",给定这个localization.json文件:

{
    "prev": [{
        "en": "Prev"
    }, {
        "de": "Zurück"
    }, {
        "ko": "이전"
    }],
    "next": [{
        "en": "Next"
    }, {
        "de": "Weiter"
    }, {
        "ko": "다음"
    }]
}

插件代码在Ruby中:

module Jekyll
   class LocalizeTag < Liquid::Tag

    def initialize(tag_name, variables, tokens)
        super
        @variables = variables.split(" ")
        @string = @variables[0]
        @language = @variables[1]
        @words = JSON.parse(IO.read('localization.json'))
        @word = @words[@string]
        @word.each do |record|
            @record = record[@language]
        end
    end

    def render(context)
        "#{@record}"
    end
  end
end

Liquid::Template.register_tag('localize', Jekyll::LocalizeTag)

最多@word,它很好,但每当我有嵌套数组时,我都无法遍历它,所以#{@record}目前没有返回任何内容。由于我不了解Ruby,@word.each部分的语法可能不正确。

1 个答案:

答案 0 :(得分:2)

在你的例子中,你一直循环直到最后一个翻译(“ko”),它没有“de”键,你最终得到一个空结果。

当您找到正确的翻译时,您需要停止循环。

@word.each do |record|
    if record.key?(@language)
        @record = record[@language]
        break
    end
end