Я пытаюсь изменить некоторые строки на странице настроек пользователя. Я перешел в раздел Администрирование → Тексты сайта и поискал соответствующие ключи. Однако мне не удалось настроить нужный текст, так как система сообщила, что тексты не найдены.
Я достаточно уверен, что ключ корректен, так как он определен здесь:
Затем я переключил целевой язык на английский, но для user.username.short_instructions также не было найдено результатов. Кроме того, я попытался найти другие строки, такие как user.username.title, user.preferences.title и filters.latest.title, но и они не были найдены.
Похоже, что связанных ошибок нет, и, судя по результатам запроса, проблема может быть на стороне бэкенда.
Хотя я не думаю, что установленные мной плагины изменяли эту конкретную область, я позже попробую удалить все неофициальные плагины, чтобы проверить, решит ли это проблему.
У меня есть некоторые обновления по этому вопросу. Я теперь могу окончательно подтвердить, что проблема заключается в бэкенде. При изучении кода я заметил одну конкретную строку:
К моему удивлению, выполнение I18n.exists?("js.user.username.short_instructions", :en) на моём экземпляре возвращает false.
Я не уверен, почему I18n.exists?("js.user.username.short_instructions", :en) возвращает false. Возможно, я проведу дополнительное расследование, чтобы определить, является ли проблема специфичной для моего экземпляра или более общей проблемой в Discourse.
Похоже на общую проблему вашего экземпляра Discourse.
sam@arch discourse % bin/rails c
Загрузка среды разработки (Rails 8.0.4)
[1] pry(main)> I18n.exists?("js.user.username.short_instructions", :en)
=> true
В частности, это связано со сборкой. Во время сборки мы парсим все эти данные и помещаем их в таблицы, но somehow это еще не произошло в вашем экземпляре.
@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 уже существует механизм проверки файлов локализации, как показано здесь.
Хорошо подмечено, спасибо, что поделились решением, @pangbo.
Мы определенно могли бы добавить проверку здесь, хотя, насколько я помню, этот чекер используется только во время тестов RSpec. Помогло бы это в вашем случае?
Мы однозначно готовы добавить проверку времени выполнения для этого случая с null, если сможем найти подходящее место для её размещения.
Вы правы. Я сделал необоснованное предположение, что эти проверки будут выполняться во время выполнения программы. После поиска в репозитории GitHub выяснилось, что эти проверки вызываются исключительно в задаче Rake:
Добавление проверок здесь не позволило бы заранее выявить проблему, с которой я столкнулся. Возможно, самое простое решение — предупредить разработчиков о недопустимости такой практики в документации