Tuesday, 1 July 2014

Translatable String

class TranslatedString
def initialize(owner, key)
@owner, @key = owner, key
end
def [](lang)
@owner.get_translated_value(@key, lang)
end
def to_h
@owner.translated_values[@key]
end
def []=(lang, value)
@owner.set_translated_value(@key, value, lang)
end
end
class Product
module Translatable
def translated_values
@translated_values ||= {}
end
def value_of_translated(key)
translated_values[key] ||= {}
end
def get_translated_value(key, lang = default_locale)
value_of_translated(key)[lang]
end
def set_translated_value(key, value, lang = default_locale)
if value.is_a? Hash
value.each {|lang, value| value_of_translated(key)[lang] = value}
else
value_of_translated(key)[lang] = value
end
end
def get_translated_string(key)
instance_variable_set("@#{key}", TranslatedString.new(self, key)) unless instance_variable_get("@#{key}")
instance_variable_get("@#{key}")
end
def set_translated_string(key, value)
get_translated_string(key)[default_locale] = value
end
end
end
class Product
include Translatable
def default_locale
:en_AU
end
def description
get_translated_string(:description)
end
def description=(value)
set_translated_string(:description, value)
end
end
product = Product.new
product.description[:en] = 'foo'
product.description = "foo"
product.description = {en_AU: "description", el_GR: "περιγραφή"}
product.description.to_h
view raw gistfile1.rb hosted with ❤ by GitHub

No comments:

Post a Comment