@sam, спасибо за ваш ответ. Я развернул три экземпляра Discourse разными способами, и во всех наблюдается одна и та же проблема, что позволяет мне предположить, что дело не в установке.
При повторном изучении моих плагинов я обнаружил, что один из них создал файл локализации (plugins/XXXX/config/locales/client.en.yml) со следующим содержимым:
en:
js:
Удаление этого файла решило проблему. После краткого исследования реализации I18n я выяснил, что для слияния переводов при загрузке используется deep_merge:
# File activesupport/lib/active_support/vendor/i18n-0.4.1/i18n/backend/simple.rb, line 31
31: def store_translations(locale, data, options = {})
32: locale = locale.to_sym
33: translations[locale] ||= {}
34: data = data.deep_symbolize_keys
35: translations[locale].deep_merge!(data)
36: end
Приведённый выше YAML парсится следующим образом:
{"en": {"js": null}}
В результате после слияния удаляется всё содержимое под ключом en.js. Как разработчик плагина, я понимаю, что эта проблема вызвана моей собственной ошибкой в коде, и я полностью несу за неё ответственность. Однако я считаю, что Discourse мог бы выиграть от добавления дополнительных проверок для предупреждения о подобных случаях, особенно учитывая, что в Discourse уже существует механизм проверки файлов локализации, как показано здесь.