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

时间:2017-02-17 09:17:48

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

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

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

6 个答案:

答案 0 :(得分:1)

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

找到硬编码文本应该是最准确的。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

我认为你可以通过使用grep来实现目标:

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

基于这样的想法找到文本,即某些字符不是典型的文本

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

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

grep '\w \w'

这可能不是百分之百准确,但是快速简便地检查硬编码文本。

答案 3 :(得分:0)

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

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

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

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

i18n-tasks missing

Gem还有一项任务,即找到所有未使用的翻译。

答案 4 :(得分:0)

我从安迪(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.

答案 5 :(得分:0)

custom tasks页中有i18n-tasks提到了一些“提取程序”。

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

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

我尝试了其中的任何一个,因此无法评论其有效性。