检查 Rails 视图中的硬编码文本 - I18n

Check for hardcoded text in Rails views - I18n

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

编辑:不是 100% 准确但最适合我所以我接受了安迪的回答。

如果大多数代码行都很短而 hard-coded 文本很长,您可以使用 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.

它在查找 hard-coded 文本时应该是最准确的。

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

^(?!.*(<(style|script|title).*?<\/>|<.*?>)).*$

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

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

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

这会根据以下想法查找文本,即某些字符对于文本而言并不典型

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

并且应该至少有一个 space 前面有一个单词字符,一个后面有一个单词字符

grep '\w \w'

这可能不是 100% 准确,但它是快速检查硬编码文本的一种快速简便的方法。

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

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

这应该有所帮助。有关详细信息,请阅读 this


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

i18n-tasks missing

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

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

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

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

./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.

custom tasks page for i18n-tasks 中提到了一些“提取器”。

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

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

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