I18N翻译“.”或“%”会导致所有翻译的完整数组。

9
我在我的Rails应用中使用I18n进行翻译时遇到了问题。我将动态句子创建为数组,如下所示:[:this_is_a, 5, :which_is_a_number, "."],然后逐个单词进行翻译。
当我通过迭代并翻译I18n.t(".")时,我会得到整个应用程序中所有翻译的完整数组,输出一个1000多个数组的文本。这对于I18n.t("%")也是如此。
有没有设置可以防止这种情况发生?目前我唯一的解决方法是将所有“。”更改为“。”,但我希望有更好的解决方案。有什么建议吗?

你是如何获取这些标记的?你是解析句子并进行分词,还是以其他方式创建这些组? - Azolo
我不完全确定您所说的“tokens”是什么意思,但我假设您指的是数组项。这些是根据计算动态创建的。它也可以是[:this_is_a, "A", :which_is_a_letter, "!"]。因此,翻译是预先设置的,但字符串的使用方式不同。例如,出于这个原因,我不希望在翻译中加入“.”。 - Christoffer
1个回答

4
"

“.”用于命名空间翻译键。如果您有这样的文件:

"
module1:
  key_a: "Module1 Translation A"
  key_b: "Module1 Translation B"
module2:
  key_a: "Module2 Translation A"

然后你可以通过"."访问它们。
I18n.t("module1.key_a")
I18n.t("module2.key_a")

如果您只使用I18n.t("."),它将提供整个顶级命名空间。您可以通过更改分隔符来更改此行为。

I18n.t("module1@key_a", separator: "@")

只需选择一些您知道不会出现为令牌的字符。

“%”字符用于插值:

module1:
  name: "My name is %{name}"

然后

I18n.t("module1.name", name: "John")

看起来你不能将“%”更改为其他内容,因为它是硬编码的。但它不应该返回整个翻译数组。它应该只返回“翻译缺失”错误。至少这是我在我的I18n gem版本上的情况。


谢谢,你的解决方案似乎起作用了。最终我意识到我能够以一种非常专业的方式绕过这个问题,这超出了这个问题的范围。就我的问题而言,你的答案是正确的。 - Christoffer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接