遍历嵌套的 JSON 元素并找到自定义 Jekyll 标记的值
Loop through nested JSON elements and find a value for a custom Jekyll tag
我正在编写一个自定义 Jekyll 标签,它接受两个变量(文本和语言)并将文本翻译成提供的语言选项。
例如,{% localize next de %}
应该 return "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}
目前 return 什么也没有。由于我不了解 Ruby,因此 @word.each
部分的语法可能不正确。
在您的示例中,您一直循环直到最后一个翻译 ("ko"),它没有密钥 "de",并且您最终得到一个空结果。
找到正确的翻译后,您需要停止循环。
@word.each do |record|
if record.key?(@language)
@record = record[@language]
break
end
end
我正在编写一个自定义 Jekyll 标签,它接受两个变量(文本和语言)并将文本翻译成提供的语言选项。
例如,{% localize next de %}
应该 return "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}
目前 return 什么也没有。由于我不了解 Ruby,因此 @word.each
部分的语法可能不正确。
在您的示例中,您一直循环直到最后一个翻译 ("ko"),它没有密钥 "de",并且您最终得到一个空结果。
找到正确的翻译后,您需要停止循环。
@word.each do |record|
if record.key?(@language)
@record = record[@language]
break
end
end