У меня есть несколько файлов YAML (локализация). Я разбираю их и конвертирую в хэш на Ruby.
Например, это один из них:
hello: Hallo
messages:
alerts:
yay: Da!
no: Nein
deep:
nested:
another:
level:
hi: Hi!
test: Test!
По сути, это похоже на файл локали в приложении Rails с использованием YAML.
Что я хочу сделать, так это рекурсивно повторить этот хэш и получить ключ и значение. Чтобы я мог переводить значения одно за другим из конечной точки API, например Google Translate. Я хочу сохранить вложенные хэши в той же схеме, чтобы Rails мог найти их по ключам.
Я знаю, что могу использовать вложенные циклы, но нет гарантии, что количество вложенных хэшей известно. Как я могу рекурсивно повторять этот хеш, чтобы я мог манипулировать значениями (переводить/заменять)?
Ожидаемый результат: (после использования службы перевода из вызова API)
hello: Hello
messages:
alerts:
yay: Yup!
no: No
deep:
nested:
another:
level:
hi: Hi!
test: Test!
Что я пробовал до сих пор:
hash = YAML.load('de.yml') # parse source Deutsch locale
new_hash = {}
hash.each |key, value| do
new_hash[key] = translate_func(value) # here... translate value then assign very same key including parents.
# Do more loops....
end
# Now write this new_hash to yaml file...
Но это только манипулировать только hello
. Чтобы работать с другими, мне нужно сделать петлю. Но сколько ключей вложено, неизвестно.
Как я могу перебрать все значения хэша локали и сохранить схему нетронутой?
И если это возможно, но не обязательно, я был бы очень рад, если бы мы сохранили порядок ключей в конечном результате. Было бы здорово найти отсутствующие ключи позже при просмотре вручную.
Я очень новичок в рубине. Я использую Руби 2.7.2
Заключение/решение
Все ответы правильные, и я люблю их всех. Однако я хотел бы иметь возможность контролировать как ключи, так и значения. Не просто трансформировать по значениям. Поэтому я принял ответ, который соответствует моим потребностям. Я смог выполнить свое намерение с выбранным ответом.