无法自定义某些网站文本

我正在尝试修改用户偏好设置页面上的某些字符串。我导航到管理 -\u003e 站点文本并搜索了相关的键。但是,我无法自定义我正在寻找的特定文本,因为它告诉我找不到文本。

我相当确定该键是有效的,因为它在此处定义:

然后我将目标语言切换到英语,但仍然没有找到 user.username.short_instructions 的结果。此外,我还尝试搜索其他字符串,例如 user.username.titleuser.preferences.titlefilters.latest.title,但均无济于事。

2 个赞

很奇怪,我能够调出密钥

如果右键单击并打开浏览器检查器,控制台选项卡中是否有任何错误?

1 个赞

看起来没有相关的错误,并且根据请求结果,这可能是后端问题。

虽然我不认为我安装的插件修改了这块区域,但我稍后会尝试移除所有非官方插件,看看是否能解决问题。

1 个赞

您可以暂时禁用自定义项,方法是使用安全模式,看看是否有效。

1 个赞

关于此事,我有一些更新。我现在可以明确地确认问题出在后端。在检查代码时,我注意到了一行:

令我惊讶的是,在我的实例上执行 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
Loading development environment (Rails 8.0.4)
[1] pry(main)> I18n.exists?("js.user.username.short_instructions", :en)
=> true

特别是与构建相关的问题。在构建过程中,我们会解析所有这些内容并将其放入表中,但不知何故,你的实例尚未完成此操作。

建议重新构建控制台。

@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 已经有检查区域设置文件的设计,如此处所示。

4 个赞

很高兴你找到了!

我会通知开发 xp 团队,让他们知晓。

4 个赞

干得漂亮,感谢你及时向我们更新解决方案@pangbo。

我们当然可以添加一个检查,尽管我记得这个检查器只在 RSpec 测试期间使用。这在你的情况下会有帮助吗?

如果能找到一个合适的位置,我们肯定愿意为这种情况添加一个运行时检查。

2 个赞

你说得对。我曾不当地假设这些检查会在运行时执行。在搜索 GitHub 存储库时,我发现这些检查仅在 rake 任务中调用:

在此处添加检查将无法预先发现我遇到的问题。也许最直接的解决方案是在文档中提醒开发人员不要这样做 :innocent:

2 个赞

我们应该如何处理这个话题?鉴于这似乎是给开发者的指导,我们应该把它移到 Dev 频道吗?