Невозможно настроить некоторые тексты на сайте

Я пытаюсь изменить некоторые строки на странице настроек пользователя. Я перешел в раздел Администрирование → Тексты сайта и поискал соответствующие ключи. Однако мне не удалось настроить нужный текст, так как система сообщила, что тексты не найдены.

Я достаточно уверен, что ключ корректен, так как он определен здесь:

Затем я переключил целевой язык на английский, но для user.username.short_instructions также не было найдено результатов. Кроме того, я попытался найти другие строки, такие как user.username.title, user.preferences.title и filters.latest.title, но и они не были найдены.

Очень странно, я могу открыть ключ

Если вы нажмете правой кнопкой мыши и откроете инспектор браузера, есть ли какие-либо ошибки во вкладке консоли?

Похоже, что связанных ошибок нет, и, судя по результатам запроса, проблема может быть на стороне бэкенда.

Хотя я не думаю, что установленные мной плагины изменяли эту конкретную область, я позже попробую удалить все неофициальные плагины, чтобы проверить, решит ли это проблему.

Вы можете временно отключить пользовательские настройки, используя безопасный режим, и посмотреть, поможет ли это.

У меня есть некоторые обновления по этому вопросу. Я теперь могу окончательно подтвердить, что проблема заключается в бэкенде. При изучении кода я заметил одну конкретную строку:

К моему удивлению, выполнение I18n.exists?("js.user.username.short_instructions", :en) на моём экземпляре возвращает false.

Я вручную удалил эту строку кода, и теперь я могу искать user.username.short_instructions.

Я не уверен, почему 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 уже существует механизм проверки файлов локализации, как показано здесь.

Рад, что вы это нашли!

Я уведомлю команду разработчиков XP, чтобы они были в курсе.

Хорошо подмечено, спасибо, что поделились решением, @pangbo.

Мы определенно могли бы добавить проверку здесь, хотя, насколько я помню, этот чекер используется только во время тестов RSpec. Помогло бы это в вашем случае?

Мы однозначно готовы добавить проверку времени выполнения для этого случая с null, если сможем найти подходящее место для её размещения.

Вы правы. Я сделал необоснованное предположение, что эти проверки будут выполняться во время выполнения программы. После поиска в репозитории GitHub выяснилось, что эти проверки вызываются исключительно в задаче Rake:

Добавление проверок здесь не позволило бы заранее выявить проблему, с которой я столкнулся. Возможно, самое простое решение — предупредить разработчиков о недопустимости такой практики в документации :innocent: