【问题标题】:Check for hardcoded text in Rails views - I18n检查 Rails 视图中的硬编码文本 - I18n
【发布时间】:2017-07-06 17:49:34
【问题描述】:

我们的一些开发人员(包括我)并不总是认真地将文本放入本地化文件中,结果是大量硬编码文本分散在很多视图中。 我想知道你们是否有一个想法来自动搜索视图中的硬编码文本?有没有人有工具或方法来检查这个?我在想一个漂亮的 bash 脚本是否可以完成这项工作,但我有点迷失从哪里开始。非常感谢任何帮助。

编辑:不是 100% 准确,但对我来说效果最好,所以我接受了安迪的回答。

【问题讨论】:

  • 你知道你要搜索什么文本吗?
  • @SekalfNroc 不,只是硬编码任何类型的文本

标签: ruby-on-rails internationalization views config rails-i18n


【解决方案1】:

我认为你可以通过使用 grep 走得很远:

cat $(find . | grep .html.erb) | grep -v '[=<>{}$/;]' | grep '\w \w'

这会根据某些字符不是文本的典型字符来查找文本

grep -v '[=<>{}$/;]'

并且应该至少有一个空格与前面的单词字符和一个单词字符后面的空格

grep '\w \w'

这可能不是百分百准确,但它是一种快速检查硬编码文本的快捷方式。

【讨论】:

  • 这对我不起作用。它在我的项目中找到了一段硬编码文本,但它主要是在方法名称和参数之间有空格的 Ruby 代码中找到。
  • 也许你可以扩展它以找到每行两个空格grep '\(\w\+\s\)\{2,\}'。它只是作为一个可以优化的良好起点。例如,只需将2 更改为4 看看会发生什么。
  • @Andi 到目前为止运行良好。我需要更深入地检查它是否可靠!
  • @supersize 很高兴听到我能提供帮助。您是否扩展了一些 grep 命令?您能否发布您的最终解决方案,以便我可以编辑答案并添加它?
  • @Andi 回复晚了,但直到现在我还参与了其他事情。我注意到如果我们可以排除前面的ifunless,那就太好了,它会更接近预期的结果。我有很多 Ruby 方法匹配但只是因为条件。
【解决方案2】:

如果大多数代码行很短而硬编码的文本很长,您可以使用strings -n [number] 查找任何具有特定字符数的文本。

  <html>                                  |
   <head>                                 |
     <meta http-equiv="content-type" content="text/html; charset=utf-8" />
                                          |
     <title>Example Page</title>          |
                                          |
   </head>                                |
                                          |
   <body>                                 |
     <h1><%= @page.name %></h1>           |
     <p>                                  |
       This is a piece of hard coded text which must be found.
     </p>                                 |
   </body>                                |
  </html>                                 | 40 characters

如果将长度设置为 40...

$ cat $(find . | grep .html.erb) | strings -n 40
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
  This is a piece of hard coded text which must be found.

在查找硬编码文本时应该最准确。

【讨论】:

  • 好主意,但实际上这会吐出大量长行,这些行也是 HAML 中的 CSS 类
  • 您可以使用此方法 + nokogiri 并使用视图/部分。但是你必须跳过 erb 运行的预处理器,这样你才能看到 erb 标签并有一些要过滤的东西,因为你会看到 erb 标签 () 作为文本。您可能必须编写 erb 文件的副本并删除 .erb 扩展名,但我认为您可以相当快地编写一些东西来执行此操作。
【解决方案3】:

您可以使用正则表达式来查找既不包含在尖括号内(捕获大多数 HTML 标记和 Ruby)也不包含在样式、脚本或标题标记内的任何内容。

^(?!.*(&lt;(style|script|title).*?&lt;\/\1&gt;|&lt;.*?&gt;)).*$

如果您发现任何其他标签正在通过,只需将它们添加到例外列表中即可。

【讨论】:

  • 我注意到有人否决了这个答案。请问,你能解释一下吗?我很乐意根据您的建议改进它。
【解决方案4】:

我受到 Andi 的回答的启发,但也想要一种简单的方法来直接跳转到文件和行(并改为搜索以大写字母开头的单词)

grep -r -n ".\+[ >^=]\([A-Z][a-z]\+\b\)" .

此命令递归地 greps 文件夹中的所有文件,并将文件名和行号放入每个结果中,如下所示:

./interviews/show.html.erb:17:              Your interview has been scheduled
./interviews/show.html.erb:49:              Click the button below to add this event to your calendar.

【讨论】:

    【解决方案5】:

    custom tasks 页面中提到了一些用于i18n-tasks 的“提取器”。

    他们提供自动从您的视图中提取硬编码文本到您的 Yaml 文件,甚至是数据库 (Lost In Translation)。

    大多数似乎都提供了一种交互模式,因此您可以使用它们来识别硬编码文本,即使您不想自动提取它。

    我已经尝试过其中的任何一个,因此无法评论它们的有效性。

    【讨论】:

      【解决方案6】:

      当翻译丢失时,为什么不在开发和测试环境中引发异常。在开发和测试环境中,您可以添加:

      Rails.application.configure do |config|
        config.action_view.raise_on_missing_translations = true
      end
      

      这应该会有所帮助。更多详情请阅读this


      此外,如果您只想找到所有缺失的翻译,this gem 看起来很有希望。我个人没有使用过这个 gem,但似乎是查找缺失翻译而不是自己编写脚本的理想方法:

      i18n-tasks missing
      

      Gem 还有一项任务是查找所有未使用的翻译。

      【讨论】:

      • 这个问题不是缺少翻译,而是要找到硬编码的文本将其移动到翻译文件中。
      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      相关资源
      最近更新 更多