Logging un-translated strings in rails
Problem statement:
Which of our strings are not translated yet in our Ruby on Rails app?
Unfortunately there’s no easy way to know for sure. One solution is to log untranslated strings as soon as they appear - the following solution applies to the spree-i18n
extension but should be easily adaptable to other contexts.
What we do here is monkey patching I18n#t
, to check whether the original I18n#t
told us that there’s no translation and log it in that case. Then we return whatever the original I18n#t
gave us:
I18n.class_eval do
class << self
alias_method :alias_for_t, :t
end
# make t log missing translations
def self.t( keyz, options = {})
translation = self.alias_for_t( keyz, options )
if translation =~ /translation missing:/
MISSING_TRANSLATION.info translation
end
return translation
end
end
end
To initialize the logger:
class MissingTranslationLogger < Logger
def format_message(severity, timestamp, progname, msg)
"#{msg}\n"
end
end
logfile = File.open('log/missing_translations.log', 'a')
# optional: # logfile.sync = true
MISSING_TRANSLATION = MissingTranslationLogger.new(logfile)
You’ll need to place those two code snipplets in apropriate places. I’ve put the first one in vendor/extensions/site/site_extension.rb
and the second one into config/initializers/missing_translation_logger.rb
.
Hope somebody’ll find this snippet useful.
Tomáš Pospíšek