检查 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)。
大多数似乎都提供交互模式,因此您可以使用它们来识别硬编码文本,即使您不想自动提取它也是如此。
我已经尝试过其中的任何一个,所以无法评论它们的有效性。
我们的一些开发人员(包括我)并不总是认真对待将文本放入本地化文件,结果是大量硬编码文本分散在大量视图中。 我想知道你们中是否有人有想法在视图中自动搜索硬编码文本?有没有人有工具或方法来检查这个?我在想一个漂亮的 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)。
大多数似乎都提供交互模式,因此您可以使用它们来识别硬编码文本,即使您不想自动提取它也是如此。
我已经尝试过其中的任何一个,所以无法评论它们的有效性。