2017-01-07 11 views
0

Я пишу пользовательский тег Jekyll, который принимает две переменные (текст и язык) и переводит текст на предоставленный язык.Прокрутка через вложенные элементы JSON и поиск значения для пользовательского тега 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 может быть неправильным.

+0

Что такое вывод 'JSON.parse (IO.read ('localization.json'))'? – cobaltsoda

+0

это именно файл JSON выше, поэтому значение @word будет массивом объектов JSON (скажем, значение «prev») –

+0

Итак, JSON правильно проанализирован? Попробуйте запустить 'puts @ string' внутри метода и проверив, что это то, что вы ожидаете – cobaltsoda

ответ

2

В вашем примере вы продолжаете цикл до последнего перевода («ko»), который не имеет ключа «de», и вы получите нулевой результат.

Вам необходимо остановить цикл, когда вы нашли правильный перевод.

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