@sam, obrigado pela sua resposta. Implantei três instâncias do Discourse usando métodos diferentes e todas apresentam o mesmo problema, o que me leva a acreditar que não é um problema de instalação.
Ao reexaminar meus plugins, descobri que um deles criou um arquivo de local (plugins/XXXX/config/locales/client.en.yml) com o seguinte conteúdo:
en:
js:
Excluir este arquivo resolveu o problema. Após uma breve investigação sobre a implementação do I18n, descobri que deep_merge é usado para mesclar traduções durante o carregamento:
# 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
O YAML acima é analisado como:
{"en": {"js": null}}
Isso resulta na exclusão de todo o conteúdo sob a chave en.js após a mesclagem. Como desenvolvedor de plugins, entendo que esse problema decorre de um erro meu de codificação e sou totalmente responsável por ele. No entanto, acredito que o Discourse poderia se beneficiar de verificações adicionais para alertar contra tais ocorrências, especialmente considerando que o Discourse já possui um design para inspecionar arquivos de local, como visto aqui.