Как я могу идентифицировать неиспользуемые ключи i18n?

Я работаю над существующим Rails-приложением и использую файл локализации en.yml, чтобы сохранить большую часть текста приложения. На данный момент мы не локализуемся на каких-либо других языках, поэтому есть только один файл, но тот факт, что мы помещаем translate('some.key') в наши представления, означает, что добавление другого языка будет таким же простым, как добавление другого файла - скажем, sp.yml

Проблема в том, что en.yml вырос до такой степени, что я сомневаюсь, что все ключи используются.

Помимо git grepping для translate вызовов с использованием каждого ключа, есть ли быстрый способ идентифицировать ключи локализации, которые явно не вызываются приложением?

Ответы

Ответ 1

Взгляните на эту статью о "Основные проблемы, интернационализирующие ваше приложение" . Вас интересует параграф: " Избавление от неиспользуемых переводов".

В частности, он рекомендует просматривать исходный код, а также регистрировать, какие ключи перевода будут использоваться в вашем рабочем приложении, следующим образом:

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

Надеюсь, что это поможет.

Ответ 2

I18n-tasks gem

Я только что услышал об этом камне, который включает задачу показать "потенциально неиспользуемые переводы".

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

Ответ 3

Получить те, которые активно используются, а затем удалить остальные. Это то, что я использую.

На самом деле я установил их в active=0, но это может не сработать для вас

Обновление
Оказывается, я был неясен.

Есть два способа взглянуть на это: из исходных файлов или из файлов перевода. Если вы посмотрите из исходных файлов, вам нужно определить все используемые строки и, наконец, удалить все неиспользуемые строки.

Если вы посмотрите из файлов перевода, вам нужно посмотреть на источник и определить, все ли они используются, как вы упомянули в вопросе.

Нет другого пути.

Ответ 4

Прошло много лет с тех пор, как я впервые пришел к этому вопросу, поскольку у меня была такая же проблема. Проблема не уменьшилась, я больше расстроен, чем когда-либо.

Вот экспериментальный проект, он перехватывает поиск в переводе и увеличивает счетчик ключей трансляции в 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 мс. Это сводится к количеству поисковых запросов, которые вы выполняете на странице/запросе.