如何识别未使用的i18n键?

23
我正在开发一个已有的Rails应用程序,并使用本地化文件en.yml保存大部分应用程序的文本。目前,我们没有将其本地化成其他语言,因此只有一个文件,但是我们在视图中放置translate('some.key')表明添加另一种语言将非常简单,比如,sp.yml
问题是en.yml已经变得足够复杂,我怀疑并不是所有的键都被使用了。
除了使用每个键进行git grepping以查找translate调用外,有没有快速的方法来识别应用程序未显式调用的本地化键?
5个回答

16

请看这篇关于“应用国际化的主要问题”的文章你感兴趣的段落是:“清除未使用的翻译”

具体而言,建议您通过查看源代码以及记录生产应用程序中使用的翻译键来进行以下操作:

module I18n
  module Registry
    protected
    def lookup(locale, key, scope = [], options = {})
      @log ||= Logger.new(File.join(Rails.root, 'log', 'i18n_registry.log'))
      @log.info key
      super
    end
  end
end

I18n::Backend::Simple.send :include, I18n::Registry

希望能有所帮助。


10

3
可能未被使用是指它会在难以检测的情况下产生误报,例如I18n.t(method_returning_the_key)。可以通过config/i18n-tasks.yml忽略这些键。 - glebm
1
@glebm - 感谢您的澄清。顺便问一下,您是如何如此迅速地发现有关您宝石的提及的呢? - Nathan Long
2
我在 Stack Overflow 上搜索了这个名称 :) - glebm

1

自从我第一次遇到这个问题以来已经过了很多年。问题并没有变得更小,我比以往任何时候都更加沮丧。

这是一个实验性项目,它钩入翻译查找并在Redis中递增翻译键计数器:

https://github.com/paladinsoftware/i18n-counter

这个想法是你可以拉取统计数据并进行比较。(目前正在进行中,当然我很乐意得到帮助)

你可能会问:“那不会减慢查找速度吗?”

当然,你是正确的,但是额外开销几乎不可感知,看看这个基准测试。

require 'benchmark'
n = 100000
Benchmark.bm do |x|
  x.report { ENV['ENABLE_I18N_COUNTER'] = 'true'; n.times do ; I18n.translate('application.contract_not_available.header'); end }
  x.report { ENV['ENABLE_I18N_COUNTER'] = 'false'; n.times do ; I18n.translate('application.contract_not_available.header'); end }
end

 ---------------------------------------------
| Benchmark  | Seconds   | Sec pr translation |
|------------| --------- | ------------------ |
| with redis | 48.280000 | 0.0004828          |
| without    |  9.010000 | 0.0000901          |
 ---------------------------------------------

每次查找的开销大约为3毫秒。这归结于您在每个页面/请求中执行的查找次数。


-1

获取那些正在使用的,然后删除其余的。这是我使用的方法。

实际上,我将它们设置为active=0,但这可能对您不起作用

更新
事实证明我表述不清楚。

有两种方法来看待这个问题:从源文件或翻译文件。如果您从源文件查看,则需要识别所有正在使用的字符串,并最终删除所有未使用的字符串。

如果您从翻译文件查看,则需要查看源代码并确定它们是否仍在使用,正如您在问题中提到的那样。

没有其他方法。


我不明白你的意思。我在说文件中的行,你是在说数据库的行吗? - Nathan Long
我没有使用 Rails 的经验,但是我了解的大多数 i18n 解决方案都有一种导出所有可翻译字符串的方式。请导出所有可翻译字符串,然后循环遍历所有字符串并检查哪些字符串不再使用(在您的导出中查找)。 - Tom van der Woerdt
我不是在问如何比较两个本地化文件;我是在问如何检查应用程序代码使用了哪些本地化键。 - Nathan Long
我正在回答那个问题 :-) 一个文件使用翻译,另一个文件保存翻译。 - Tom van der Woerdt
“另一个文件”是我的应用程序代码,跨越数十个文件。我真的在寻找一个针对Rails的特定解决方案;也许是一个gem,它可以运行应用程序代码并查找对translate方法的调用。 - Nathan Long
那么你最初是如何生成翻译文件的呢?难道不是使用像 xgettext 这样的工具导出它们吗?如果你手动将所有可翻译的字符串移动到一个文件中,那么通常就需要手动完成所有操作。如果你使用标准工具如 xgettext,这些事情就变得容易得多了。 - Tom van der Woerdt

-2

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