Files
grecia/app/models/i18n_content.rb
Javi Martín 41dba842a6 Cache I18nContent translations
This way we avoid fetching each translation every time it's requested.
This reduces the amount of queries in the development logs and also
makes the test suite faster.
2020-12-15 11:57:09 +01:00

106 lines
3.1 KiB
Ruby

class I18nContent < ApplicationRecord
validates :key, uniqueness: true
translates :value, touch: true
globalize_accessors
# flat_hash returns a flattened hash, a hash with a single level of
# depth in which each key is composed from the keys of the original
# hash (whose value is not a hash) by typing in the key of the route
# from the first level of the original hash
#
# Examples:
#
# hash = {
# 'key1' => 'value1',
# 'key2' => { 'key3' => 'value2',
# 'key4' => { 'key5' => 'value3' } }
# }
#
# I18nContent.flat_hash(hash) = {
# 'key1' => 'value1',
# 'key2.key3' => 'value2',
# 'key2.key4.key5' => 'value3'
# }
#
# I18nContent.flat_hash(hash, 'string') = {
# 'string.key1' => 'value1',
# 'string.key2.key3' => 'value2',
# 'string.key2.key4.key5' => 'value3'
# }
#
# I18nContent.flat_hash(hash, 'string', { 'key6' => 'value4' }) = {
# 'key6' => 'value4',
# 'string.key1' => 'value1',
# 'string.key2.key3' => 'value2',
# 'string.key2.key4.key5' => 'value3'
# }
def self.flat_hash(input, path = nil, output = {})
return output.update({ path => input }) unless input.is_a? Hash
input.map { |key, value| flat_hash(value, [path, key].compact.join("."), output) }
output
end
def self.content_for(tab)
translations_for(tab).map do |string|
I18nContent.find_or_initialize_by(key: string)
end
end
def self.translations_for(tab)
if tab.to_s == "basic"
basic_translations
else
flat_hash(translations_hash_for(tab)).keys
end
end
def self.translations_hash_for(tab)
I18n.backend.send(:init_translations) unless I18n.backend.initialized?
I18n.backend.send(:translations)[I18n.locale].select do |key, _translations|
key.to_s == tab.to_s
end
end
def self.basic_translations
%w[
debates.index.section_footer.title
debates.index.section_footer.description
debates.index.section_footer.help_text_1
debates.index.section_footer.help_text_2
debates.new.info
debates.new.info_link
debates.new.more_info
debates.new.recommendation_one
debates.new.recommendation_two
debates.new.recommendation_three
debates.new.recommendation_four
debates.new.recommendations_title
proposals.index.section_footer.title
proposals.index.section_footer.description
proposals.new.more_info
proposals.new.recommendation_one
proposals.new.recommendation_two
proposals.new.recommendation_three
proposals.new.recommendations_title
polls.index.section_footer.title
polls.index.section_footer.description
legislation.processes.index.section_footer.title
legislation.processes.index.section_footer.description
budgets.index.section_footer.title
budgets.index.section_footer.description
]
end
def self.translations_hash(locale)
Rails.cache.fetch(translation_class.where(locale: locale)) do
all.map do |content|
[content.key, translation_class.find_by(i18n_content_id: content, locale: locale)&.value]
end.to_h
end
end
end