【问题标题】:I18N translate "." or "%" causes a full array of ALL translationsI18N 翻译“。”或 "%" 导致所有翻译的完整数组
【发布时间】:2017-01-01 00:36:08
【问题描述】:

我在使用 I18n 进行翻译的 Rails 应用程序中遇到问题。我在像 [:this_is_a, 5, :which_is_a_number, "."] 这样的数组中创建动态句子,为此我一个一个地翻译每个单词。

当我遍历它并翻译 I18n.t(".") 时,我得到了整个应用程序中所有翻译的完整数组,它输出了 1000 多个数组文本。这似乎也适用于 I18n.t("%")。

是否有阻止这种情况发生的设置?目前我唯一的解决方案是更改所有“。”到“.”,但我希望有更好的解决方案。有什么建议吗?

【问题讨论】:

  • 你是如何获得这些令牌的?您是在解析句子并进行标记,还是以其他方式创建这些组?
  • 我不是 100% 确定您所说的令牌是什么意思,但假设您指的是数组项。这些是作为计算的结果动态创建的。也可以是 [:this_is_a, "A", :which_is_a_letter, "!"]。因此,翻译是预设的,但字符串的使用方式不同。我不想把“。”例如,出于这个原因,在翻译中。

标签: ruby-on-rails rails-i18n


【解决方案1】:

“。”用于命名空间转换键。如果你有这样的文件:

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 版本。

【讨论】:

  • 谢谢,您的解决方案似乎有效。最后我意识到我能够以一种非常专业的方式绕过这个问题,这超出了这个问题的范围。为了我的问题,你的回答是正确的。
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多