【问题标题】:How can I identify unused i18n keys?如何识别未使用的 i18n 密钥?
【发布时间】:2012-01-29 10:38:54
【问题描述】:

我正在开发一个现有的 Rails 应用程序,并使用本地化文件 en.yml 来保存应用程序的大部分文本。目前,我们没有本地化到任何其他语言,所以只有一个文件,但我们将translate('some.key') 放入我们的视图这一事实意味着添加另一种语言就像添加另一个文件一样简单 - 比如说, sp.yml

问题是,en.yml 已经发展到我怀疑所有密钥都在使用的地步了。

除了git grepping 使用每个键调用translate 之外,是否有一种快速方法可以识别应用未显式调用的本地化键?

【问题讨论】:

    标签: ruby-on-rails internationalization ruby-on-rails-3.1


    【解决方案1】:

    自从我第一次遇到这个问题以来已经有很多年了,因为我遇到了完全相同的问题。问题并没有变小,我比以往任何时候都更沮丧。

    这是一个实验项目,它挂钩到翻译查找并增加 Redis 中的翻译键计数器:

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

    这个想法是您可以提取统计数据并进行比较。 (WIP 暂时,我很想得到 c 的帮助)

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

    您当然是对的,但开销几乎不明显,请查看此基准。

    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 毫秒 pr 查找。它归结为您在每个页面/请求中进行的查找次数。

    【讨论】:

      【解决方案2】:

      看看这篇关于 "Key issues internationalizing your app"的文章。您感兴趣的段落是:“摆脱未使用的翻译”。

      具体来说,它建议查看您的源代码并记录在您的生产应用程序中使用的翻译键,如下所示:

      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
      

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        I18n 任务宝石

        我刚刚听说了这个 gem,其中包括一个显示“可能未使用的翻译”的任务。

        https://github.com/glebm/i18n-tasks

        【讨论】:

        • 可能未使用,因为它会给难以检测的情况提供误报,例如I18n.t(method_returning_the_key)。可以使用 config/i18n-tasks.yml 忽略此类键。
        • @glebm - 感谢您的澄清。顺便说一句,您是如何这么快就发现您的宝石被提及的?
        • 我在 SO 上搜索了这个名字 :)
        【解决方案4】:

        你可以试试

        $ ruby script/plugin install http://github.com/o2sources/unused_translations/tree/master
        $ script/unused_translations config/locales/en.yml 
        

        来源: http://www.railslodge.com/plugins/1547-unused-i18n-translations

        【讨论】:

          【解决方案5】:

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

          实际上我将它们设置为active=0,但这可能不适合你

          更新
          原来我不清楚。

          有两种方法可以查看:从源文件或从翻译文件。如果从源文件中查看,则需要识别所有正在使用的字符串,最后删除所有未使用的字符串。

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

          没有其他办法。

          【讨论】:

          • 我不明白你的意思。我说的是文件中的行。您是在谈论数据库行吗?
          • 我对 Rails 没有任何经验,但我知道的大多数 i18n 解决方案都有导出所有可翻译字符串的方法。导出所有可翻译的字符串,然后遍历所有字符串并检查哪些不再使用(查看您的导出)。
          • 我不是在问如何比较两个本地化文件;我在问如何检查应用程序代码使用了哪些本地化键。
          • 我正在回答这个问题 :-) 一个文件使用翻译,另一个文件保存翻译。
          • “另一个文件”是我的应用程序代码,它跨越了几十个文件。我真的在寻找特定于 Rails 的解决方案;可能是一个 gem,它会运行应用程序代码并查找对 translate 方法的调用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-10
          • 2022-01-14
          • 1970-01-01
          相关资源
          最近更新 更多