我正在尝试修改用户偏好设置页面上的某些字符串。我导航到管理 -\u003e 站点文本并搜索了相关的键。但是,我无法自定义我正在寻找的特定文本,因为它告诉我找不到文本。
我相当确定该键是有效的,因为它在此处定义:
然后我将目标语言切换到英语,但仍然没有找到 user.username.short_instructions 的结果。此外,我还尝试搜索其他字符串,例如 user.username.title、user.preferences.title 和 filters.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 的更普遍问题。
sam
(Sam Saffron)
6
感觉像是你的 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 个赞
david
(David Taylor)
10
干得漂亮,感谢你及时向我们更新解决方案@pangbo。
我们当然可以添加一个检查,尽管我记得这个检查器只在 RSpec 测试期间使用。这在你的情况下会有帮助吗?
如果能找到一个合适的位置,我们肯定愿意为这种情况添加一个运行时检查。
2 个赞
pangbo
11
你说得对。我曾不当地假设这些检查会在运行时执行。在搜索 GitHub 存储库时,我发现这些检查仅在 rake 任务中调用:
在此处添加检查将无法预先发现我遇到的问题。也许最直接的解决方案是在文档中提醒开发人员不要这样做 
2 个赞
我们应该如何处理这个话题?鉴于这似乎是给开发者的指导,我们应该把它移到 Dev 频道吗?