2017-01-07 6 views
0

私は、2つの変数(テキストと言語)を取り、テキストを提供された言語オプションに変換するカスタムJekyllタグを作成しています。例えばネストしたJSON要素をループしてカスタムJekyllタグの値を見つけよう

{% localize next de %}は "Weiter" を返す必要があり、このlocalization.jsonファイル与えられた:

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

プラグインコードRubyである:@wordまで

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) 

、それは結構ですが、私はそのネストされた配列を持っているときはいつでもループすることはできませんので、#{@record}は現時点では何も返しません。 Rubyの知識がないので、@word.eachの構文が正しくない可能性があります。

+0

'JSON.parse(IO.read( 'localization.json'))'の出力は何ですか? – cobaltsoda

+0

それはまさに上記のJSONファイルなので、@wordの値はJSONオブジェクトの配列になります( "prev"の値など) –

+0

JSONは正しく解析されていますか?メソッドの中に 'puts @ string'を実行して、それがあなたが期待しているものであることを確認してください。 – cobaltsoda

答えて

2

この例では、キーdeを持たない最後の翻訳( "ko")までループし続け、結果はnullになります。

正しい翻訳が見つかったらループを停止する必要があります。

@word.each do |record| 
    if record.key?(@language) 
     @record = record[@language] 
     break 
    end 
end 
関連する問題