Module: SimplesIdeias::I18n

Extended by:
I18n
Included in:
I18n
Defined in:
lib/i18n-js.rb,
lib/i18n-js/engine.rb,
lib/i18n-js/railtie.rb,
lib/i18n-js/version.rb,
lib/i18n-js/middleware.rb

Defined Under Namespace

Modules: Version Classes: Engine, Middleware, Railtie

Constant Summary collapse

MERGER =

deep_merge by Stefan Rusterholz, see www.ruby-forum.com/topic/142809

proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &MERGER) : v2 }

Instance Method Summary collapse

Instance Method Details

#assert_usable_configuration!Object

Under rails 3.1.1 and higher, perform a check to ensure that the full environment will be available during asset compilation. This is required to ensure I18n is loaded.



17
18
19
20
21
# File 'lib/i18n-js.rb', line 17

def assert_usable_configuration!
  @usable_configuration ||= Rails.version >= "3.1.1" &&
    Rails.configuration.assets.initialize_on_precompile ||
    raise("Cannot precompile i18n-js translations unless environment is initialized. Please set config.assets.initialize_on_precompile to true.")
end

#configObject

Load configuration file for partial exporting and custom output directory



91
92
93
94
95
96
97
# File 'lib/i18n-js.rb', line 91

def config
  if config?
    (YAML.load_file(config_file) || {}).with_indifferent_access
  else
    {}
  end
end

#config?Boolean

Check if configuration file exist

Returns:

  • (Boolean)


100
101
102
# File 'lib/i18n-js.rb', line 100

def config?
  File.file? config_file
end

#config_fileObject



27
28
29
# File 'lib/i18n-js.rb', line 27

def config_file
  Rails.root.join("config/i18n-js.yml")
end

#configured_segmentsObject



69
70
71
72
73
74
75
76
77
78
79
# File 'lib/i18n-js.rb', line 69

def configured_segments
  config[:translations].each_with_object({}) do |options,segments|
    options.reverse_merge!(:only => "*")
    if options[:file] =~ ::I18n::INTERPOLATION_PATTERN
      segments.merge!(segments_per_locale(options[:file],options[:only]))
    else
      result = segment_for_scope(options[:only])
      segments[options[:file]] = result unless result.empty?
    end
  end
end

#deep_merge(target, hash) ⇒ Object

:nodoc:



168
169
170
# File 'lib/i18n-js.rb', line 168

def deep_merge(target, hash) # :nodoc:
  target.merge(hash, &MERGER)
end

#deep_merge!(target, hash) ⇒ Object

:nodoc:



172
173
174
# File 'lib/i18n-js.rb', line 172

def deep_merge!(target, hash) # :nodoc:
  target.merge!(hash, &MERGER)
end

#export!Object

Export translations to JavaScript, considering settings from configuration file



45
46
47
48
49
# File 'lib/i18n-js.rb', line 45

def export!
  translation_segments.each do |filename, translations|
    save(translations, filename)
  end
end

#export_dirObject



31
32
33
34
35
36
37
# File 'lib/i18n-js.rb', line 31

def export_dir
  if has_asset_pipeline?
    "app/assets/javascripts/i18n"
  else
    "public/javascripts"
  end
end

#filter(translations, scopes) ⇒ Object

Filter translations according to the specified scope.



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/i18n-js.rb', line 142

def filter(translations, scopes)
  scopes = scopes.split(".") if scopes.is_a?(String)
  scopes = scopes.clone
  scope = scopes.shift

  if scope == "*"
    results = {}
    translations.each do |scope, translations|
      tmp = scopes.empty? ? translations : filter(translations, scopes)
      results[scope.to_sym] = tmp unless tmp.nil?
    end
    return results
  elsif translations.has_key?(scope.to_sym)
    return {scope.to_sym => scopes.empty? ? translations[scope.to_sym] : filter(translations[scope.to_sym], scopes)}
  end
  nil
end

#has_asset_pipeline?Boolean

Returns:

  • (Boolean)


23
24
25
# File 'lib/i18n-js.rb', line 23

def has_asset_pipeline?
  Rails.configuration.respond_to?(:assets) && Rails.configuration.assets.enabled
end

#javascript_fileObject



39
40
41
# File 'lib/i18n-js.rb', line 39

def javascript_file
  Rails.root.join(export_dir, "i18n.js")
end

#save(translations, file) ⇒ Object

Convert translations to JSON string and save file.



119
120
121
122
123
124
125
126
127
128
129
# File 'lib/i18n-js.rb', line 119

def save(translations, file)
  file = Rails.root.join(file)
  FileUtils.mkdir_p File.dirname(file)

  File.open(file, "w+") do |f|
    f << %(var I18n = I18n || {};\n)
    f << %(I18n.translations = );
    f << translations.to_json
    f << %(;)
  end
end

#scoped_translations(scopes) ⇒ Object

:nodoc:



131
132
133
134
135
136
137
138
139
# File 'lib/i18n-js.rb', line 131

def scoped_translations(scopes) # :nodoc:
  result = {}

  [scopes].flatten.each do |scope|
    deep_merge! result, filter(translations, scope)
  end

  result
end

#segment_for_scope(scope) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/i18n-js.rb', line 61

def segment_for_scope(scope)
  if scope == "*"
    translations
  else
    scoped_translations(scope)
  end
end

#segments_per_locale(pattern, scope) ⇒ Object



51
52
53
54
55
56
57
58
59
# File 'lib/i18n-js.rb', line 51

def segments_per_locale(pattern,scope)
  ::I18n.available_locales.each_with_object({}) do |locale,segments|
    result = scoped_translations("#{locale}.#{scope}")
    unless result.empty?
      segment_name = ::I18n.interpolate(pattern,{:locale => locale})
      segments[segment_name] = result
    end
  end
end

#setup!Object

Copy configuration and JavaScript library files to config/i18n-js.yml and public/javascripts/i18n.js.



106
107
108
109
# File 'lib/i18n-js.rb', line 106

def setup!
  FileUtils.cp(File.dirname(__FILE__) + "/../vendor/assets/javascripts/i18n.js", javascript_file) unless Rails.version >= "3.1"
  FileUtils.cp(File.dirname(__FILE__) + "/../config/i18n-js.yml", config_file) unless config?
end

#translation_segmentsObject



81
82
83
84
85
86
87
# File 'lib/i18n-js.rb', line 81

def translation_segments
  if config? && config[:translations]
    configured_segments
  else
    {"#{export_dir}/translations.js" => translations}
  end
end

#translationsObject

Initialize and return translations



161
162
163
164
165
166
# File 'lib/i18n-js.rb', line 161

def translations
  ::I18n.backend.instance_eval do
    init_translations unless initialized?
    translations
  end
end

#update!Object

Retrieve an updated JavaScript library from Github.



112
113
114
115
116
# File 'lib/i18n-js.rb', line 112

def update!
  require "open-uri"
  contents = open("https://raw.github.com/fnando/i18n-js/master/vendor/assets/javascripts/i18n.js").read
  File.open(javascript_file, "w+") {|f| f << contents}
end