172 lines
5.0 KiB
Ruby
172 lines
5.0 KiB
Ruby
# require 'ruby-debug'
|
|
## patches for the i18n support (aka multi languages support)
|
|
require 'i18n'
|
|
|
|
module I18n
|
|
class Config
|
|
def site_locale
|
|
@site_locale ||= default_site_locale
|
|
end
|
|
|
|
def site_locale=(site_locale)
|
|
@site_locale = site_locale.to_sym rescue nil
|
|
end
|
|
|
|
def default_site_locale
|
|
@@default_site_locale ||= :en
|
|
end
|
|
|
|
def default_site_locale=(site_locale)
|
|
@@default_site_locale = site_locale.to_sym rescue nil
|
|
end
|
|
end
|
|
|
|
class << self
|
|
# Write methods which delegates to the configuration object
|
|
%w(site_locale default_site_locale).each do |method|
|
|
module_eval <<-DELEGATORS, __FILE__, __LINE__ + 1
|
|
def #{method}
|
|
config.#{method}
|
|
end
|
|
|
|
def #{method}=(value)
|
|
config.#{method} = (value)
|
|
end
|
|
DELEGATORS
|
|
end
|
|
|
|
# Executes block with given I18n.site_locale set.
|
|
def with_site_locale(tmp_locale = nil)
|
|
if tmp_locale
|
|
current_locale = self.site_locale
|
|
self.site_locale = tmp_locale
|
|
end
|
|
yield
|
|
ensure
|
|
self.site_locale = current_locale if tmp_locale
|
|
end
|
|
end
|
|
end
|
|
|
|
## CARRIERWAVE ##
|
|
require 'carrierwave/orm/mongoid'
|
|
|
|
module CarrierWave
|
|
module Mongoid
|
|
def mount_uploader_with_localization(column, uploader=nil, options={}, &block)
|
|
mount_uploader_without_localization(column, uploader, options, &block)
|
|
|
|
define_method(:read_uploader) { |name| self.send(name.to_sym) }
|
|
define_method(:write_uploader) { |name, value| self.send(:"#{name.to_sym}=", value) }
|
|
end
|
|
|
|
alias_method_chain :mount_uploader, :localization
|
|
end
|
|
end
|
|
|
|
## MONGOID-I18n ##
|
|
|
|
# TODO: fork https://github.com/Papipo/mongoid_i18n
|
|
module Mongoid
|
|
module Criterion
|
|
class Selector< Hash
|
|
def []=(key, value)
|
|
key = "#{key}.#{::I18n.site_locale}" if fields[key.to_s].try(:type) == Mongoid::I18n::LocalizedField
|
|
super
|
|
end
|
|
end
|
|
end
|
|
|
|
module I18n
|
|
|
|
included do
|
|
cattr_accessor :localized_fields_list
|
|
end
|
|
|
|
module ClassMethods
|
|
|
|
def localized_fields(*args)
|
|
self.localized_fields_list = [*args].collect
|
|
end
|
|
|
|
def field(name, options = {})
|
|
if localized_field?(name)
|
|
options.merge!(:type => LocalizedField, :default => LocalizedField.new)
|
|
end
|
|
super
|
|
end
|
|
|
|
protected
|
|
|
|
def localized_field?(name)
|
|
# puts "options[:type] = #{options[:type].inspect} / #{(options[:type] == LocalizedField).inspect}"
|
|
|
|
# return true if options[:type] == LocalizedField
|
|
|
|
# puts "self.localized_fields_list = #{self.localized_fields_list.inspect} / #{meth.inspect}"
|
|
|
|
(self.localized_fields_list || []).any? do |rule|
|
|
case rule
|
|
when String, Symbol then name.to_s == rule.to_s
|
|
when Regexp then !(name.to_s =~ rule).nil?
|
|
else
|
|
false
|
|
end
|
|
end.tap do |result|
|
|
# options[:type] = LocalizedField if result
|
|
|
|
# puts "#{name.inspect}... localized ? #{result.inspect}"
|
|
end
|
|
end
|
|
|
|
def create_accessors(name, meth, options = {})
|
|
if options[:type] == LocalizedField
|
|
if options[:use_default_if_empty] != false # nil or true
|
|
define_method(meth) do
|
|
value = read_attribute(name)
|
|
if value.is_a?(Hash)
|
|
value[::I18n.site_locale.to_s] || value[::I18n.default_site_locale.to_s] rescue ''
|
|
else
|
|
value
|
|
end
|
|
end
|
|
else
|
|
define_method(meth) do
|
|
value = read_attribute(name)
|
|
if value.is_a?(Hash)
|
|
read_attribute(name)[::I18n.site_locale.to_s] rescue ''
|
|
else
|
|
value
|
|
end
|
|
end
|
|
end
|
|
define_method("#{meth}=") do |value|
|
|
# debugger
|
|
# puts "@attributes[name].present? = #{@attributes[name].present?.inspect} / !@attributes[name].is_a?(Hash) #{(!@attributes[name].is_a?(Hash)).inspect}"
|
|
if !@attributes[name].nil? && !@attributes[name].is_a?(Hash)
|
|
@attributes[name] = { ::I18n.default_site_locale.to_s => @attributes[name] }
|
|
end
|
|
|
|
# puts "value = #{value.inspect} / #{meth}"
|
|
|
|
value = if value.is_a?(Hash)
|
|
(@attributes[name] || {}).merge(value)
|
|
else
|
|
(@attributes[name] || {}).merge(::I18n.site_locale.to_s => value)
|
|
end
|
|
value = value.delete_if { |key, value| value.blank? } if options[:clear_empty_values] != false
|
|
write_attribute(name, value)
|
|
end
|
|
define_method("#{meth}_translations") { read_attribute(name) }
|
|
if options[:clear_empty_values] != false
|
|
define_method("#{meth}_translations=") { |value| write_attribute(name, value.delete_if { |key, value| value.blank? }) }
|
|
else
|
|
define_method("#{meth}_translations=") { |value| write_attribute(name, value) }
|
|
end
|
|
else
|
|
super
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end |