Как я могу идентифицировать неиспользуемые ключи 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 мс. Это сводится к количеству поисковых запросов, которые вы выполняете на странице/запросе.
Ответ 5
Возможно, вы захотите попробовать
$ 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