在Rails视图中查找硬编码文本 - I18n

16

我们的一些开发人员(包括我在内)并不总是认真将文本放在本地化文件中,结果是有很多硬编码的文本分散在很多视图中。 我想知道是否有人有自动搜索视图中硬编码文本的想法? 是否有任何工具或方法可用于检查此类问题? 我想到了一个聪明的bash脚本是否可以完成这项工作,但我有些迷茫从哪里开始。 非常感谢您的任何帮助。

编辑:虽然不完全准确,但对我来说最好的答案是Andi的答案,因此我接受了他的答案。


你知道你想搜索什么文本吗? - Sekalf Nroc
@SekalfNroc 不,只是硬编码文本任何类型。 - supersize
6个回答

2
我认为你只需要使用grep就可以达到很远的效果:
cat $(find . | grep .html.erb) | grep -v '[=<>{}$/;]' | grep '\w \w'

这是基于有些字符不常见于文本的想法来查找文本的。

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

并且应该至少有一个空格与前面的单词字符相邻,以及一个空格紧随其后与后面的单词字符相邻。
grep '\w \w'

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


这对我不起作用。它在我的项目中找到了一个硬编码文本的片段,但它主要发现了Ruby代码,在方法名和参数之间有一个空格。 - Sekalf Nroc
也许你可以扩展它以查找每行的两个空白字符 grep '\(\w\+\s\)\{2,\}'。这只是一个良好的起点,可以进行优化。例如,将 2 更改为 4 然后看看会发生什么。 - Andi
@Andi,到目前为止这个工作得相当不错。我需要更深入地检查一下以确定它的可靠性! - supersize
@supersize 很高兴听到我能帮上忙。你扩展了一些 grep 命令吗?你能发布你的最终解决方案,这样我就可以编辑答案并添加它了吗? - Andi
@Andi 很抱歉晚回复,但我一直忙于其他事情。我发现如果我们可以排除先前的“if”或“unless”,那将是很好的,这样它就会更接近所需的结果。我有许多 Ruby 方法匹配但仅因条件而存在。 - supersize
@Andi 把这个当作最佳答案吧! - supersize

1

我受到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.

1
你可以使用正则表达式来查找任何未被尖括号包含(捕获大多数HTML标签和Ruby)或在style,script或title标签内部的内容。

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

如果您发现其他标签也能够通过,请将它们添加到例外列表中。

我注意到有人投了这个答案的反对票。请问,能否解释一下原因?我很乐意根据您的建议进行改进。 - Sekalf Nroc

1

i18n-tasks自定义任务页面中提到了一些“提取器”。

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

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

我没有尝试过它们,因此无法评论它们的有效性。


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.

它应该在查找硬编码文本方面相当准确。


不错的想法,但实际上这会产生大量的长行,这些行在HAML中也是CSS类。 - supersize
你可以利用这个方法+ nokogiri来使用views/partials。但是你需要跳过erb运行的预处理器,以便看到erb标签并有一些基于过滤的东西,因为你会将erb标签(<%= %>)视为文本。你可能需要编写脚本来复制erb文件并删除. erb扩展名,但我认为你可以很快编写一些东西来执行此操作。 - engineerDave

-2
为什么在开发和测试环境中,当翻译缺失时不抛出异常?在开发和测试环境中,您可以添加以下内容:
Rails.application.configure do |config|
  config.action_view.raise_on_missing_translations = true
end

这应该会有所帮助。如需更多详细信息,请阅读this


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

i18n-tasks missing

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

3
此问题不是关于缺失翻译,而是要查找硬编码文本并将其移动到翻译文件中。 - supersize

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