gettext_simple_rails 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/config/default.po +11 -0
  3. data/config/poedit_ruby_parser.conf +6 -0
  4. data/lib/gettext_simple_rails/cache_handler.rb +45 -0
  5. data/lib/gettext_simple_rails/i18n_injector.rb +22 -3
  6. data/lib/gettext_simple_rails/model_inspector.rb +1 -5
  7. data/lib/gettext_simple_rails/setup_helper.rb +50 -0
  8. data/lib/gettext_simple_rails/version.rb +1 -1
  9. data/lib/gettext_simple_rails.rb +18 -0
  10. data/lib/tasks/gettext_simple_rails_tasks.rake +53 -3
  11. data/spec/active_record_spec.rb +8 -12
  12. data/spec/cache_handler_spec.rb +26 -0
  13. data/spec/date_translator_spec.rb +8 -12
  14. data/spec/dummy/config/locales_gettext/da/LC_MESSAGES/default.mo +0 -0
  15. data/spec/dummy/config/locales_gettext/da/LC_MESSAGES/default.po +361 -0
  16. data/spec/dummy/config/locales_gettext/en/LC_MESSAGES/default.po +11 -0
  17. data/spec/dummy/config/locales_gettext/static_translation_file.json +1 -0
  18. data/spec/dummy/lib/gettext_simple_rails/models/role_model_translations.rb +21 -0
  19. data/spec/dummy/lib/gettext_simple_rails/models/user_model_translations.rb +22 -0
  20. data/spec/dummy/log/test.log +193 -0
  21. data/spec/gettext_simple_rails_spec.rb +8 -12
  22. data/spec/poedit_config_with_ruby.conf +116 -0
  23. data/spec/poedit_config_without_ruby.conf +101 -0
  24. data/spec/setup_helper_spec.rb +41 -0
  25. metadata +25 -7
  26. data/spec/dummy/lib/gettext_simple_rails/active_record_translator_translations.rb +0 -18
  27. data/spec/dummy/lib/gettext_simple_rails/date_translator_translations.rb +0 -60
  28. data/spec/dummy/lib/gettext_simple_rails/number_translator_translations.rb +0 -48
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a87f38683b4bbeb1223fc58afd9c567339cde259
4
- data.tar.gz: b6be09ff859f2771112810d69c62c220bdb584c6
3
+ metadata.gz: 290c37e74f1b7060f1649328790356f73f7e57db
4
+ data.tar.gz: fea853034aee895ed19ef44075f954bd4bc2b4b3
5
5
  SHA512:
6
- metadata.gz: 6659037d43de6e7e6284a06ff49f95609ac098a3027fc5696b25311d5c6c835bf03c9bd4f54a734e58b11bf87a2fa03b94ffa9a65f47c22e2cd2537cb227f375
7
- data.tar.gz: a0a4794a71e4641ef3438e368b0c33532e4a93b2f5716c574d8f0a43a548f0afb32ccca8d187ed35cb8e97738f8f6a07a2e9c211dc8f68c3fa23070eb870162b
6
+ metadata.gz: de85e09d2606b44b9f846ae09806e2dc6fe443ff6fb8e5ab17ef43c30725e0f25894a3ec01704192412e97c775d9fee5f418bb117ffe360d19a52b0d54a468d2
7
+ data.tar.gz: a1efaa6beb26249ef35bb37a2af13986fd1bd74dd78f28bd80db5d748d7c4ffa7221320fa7653494f58febf1319ced88c4945fa4a11d7ce9709821458d1dfa77
data/config/default.po ADDED
@@ -0,0 +1,11 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: %{PROJECT_NAME}\n"
4
+ "Language: %{LOCALE}\n"
5
+ "MIME-Version: 1.0\n"
6
+ "Content-Type: text/plain; charset=UTF-8\n"
7
+ "Content-Transfer-Encoding: 8bit\n"
8
+ "X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
9
+ "X-Poedit-Basepath: ../../../../\n"
10
+ "X-Poedit-SourceCharset: UTF-8\n"
11
+ "X-Poedit-SearchPath-0: .\n"
@@ -0,0 +1,6 @@
1
+ [Parsers/Ruby]
2
+ Extensions=*.rb;*.rhtml;*.erb;*.haml
3
+ Command=rgettext_poedit -o %o %F
4
+ KeywordItem=-k%k
5
+ FileItem=%f
6
+ CharsetItem=--from-code=%c
@@ -0,0 +1,45 @@
1
+ class GettextSimpleRails::CacheHandler
2
+ def newest_po_file
3
+ newest_time = nil
4
+ newest_path = nil
5
+
6
+ I18n.available_locales.each do |locale|
7
+ default_path_file = "#{Rails.root}/config/locales_gettext/#{locale}/LC_MESSAGES/default.po"
8
+ next unless File.exists?(default_path_file)
9
+ time = File.mtime(default_path_file)
10
+ newest_time = time if newest_time == nil || time > newest_time
11
+ newest_path = default_path_file
12
+ end
13
+
14
+ return newest_path
15
+ end
16
+
17
+ def static_cache_file_path
18
+ "#{Rails.root}/config/locales_gettext/static_translation_file.json"
19
+ end
20
+
21
+ def cache_file_too_old?
22
+ if !File.exists?(static_cache_file_path)
23
+ return true
24
+ elsif File.mtime(static_cache_file_path) < File.mtime(newest_po_file)
25
+ return true
26
+ else
27
+ return false
28
+ end
29
+ end
30
+
31
+ def write_static_translation_file
32
+ require "gettext_simple"
33
+ gs = GettextSimple.new(:i18n => true)
34
+ gs.load_dir("#{Rails.root}/config/locales_gettext")
35
+ gs.register_kernel_methods
36
+
37
+ injector = GettextSimpleRails::I18nInjector.new(:store_in_hash => true)
38
+ injector.inject_model_translations(gs)
39
+ injector.inject_translator_translations(gs)
40
+
41
+ File.open(static_cache_file_path, "w") do |fp|
42
+ fp.write(injector.store_hash.to_json)
43
+ end
44
+ end
45
+ end
@@ -1,7 +1,11 @@
1
1
  class GettextSimpleRails::I18nInjector
2
+ attr_reader :store_hash
3
+
2
4
  def initialize(args = {})
5
+ @args = args
3
6
  @debug = args[:debug]
4
7
  @i18n_backend = I18n.config.backend
8
+ @store_hash = {} if args[:store_in_hash]
5
9
  end
6
10
 
7
11
  def inject_translator_translations(gettext_simple)
@@ -72,11 +76,18 @@ class GettextSimpleRails::I18nInjector
72
76
  end
73
77
  end
74
78
 
75
- @i18n_backend.store_translations(locale.to_sym, data)
79
+ store_translations(locale, data)
76
80
  end
77
81
  end
78
82
  end
79
83
 
84
+ def inject_from_static_translation_file(args)
85
+ translation_hash = JSON.parse(File.read(args[:path]))
86
+ translation_hash.each do |locale, language_hash|
87
+ store_translations(locale, language_hash)
88
+ end
89
+ end
90
+
80
91
  private
81
92
 
82
93
  def debug(str)
@@ -107,7 +118,7 @@ private
107
118
  end
108
119
  end
109
120
 
110
- @i18n_backend.store_translations(locale.to_sym, translation_hash)
121
+ store_translations(locale, translation_hash)
111
122
  end
112
123
  else
113
124
  raise "Unknown class: '#{translations.class.name}'."
@@ -134,6 +145,14 @@ private
134
145
  end
135
146
  end
136
147
 
137
- @i18n_backend.store_translations(locale.to_sym, translation_hash)
148
+ store_translations(locale, translation_hash)
149
+ end
150
+
151
+ def store_translations(locale, translation_hash)
152
+ if @args[:store_in_hash]
153
+ @store_hash.deep_merge!({locale.to_sym => translation_hash})
154
+ else
155
+ @i18n_backend.store_translations(locale.to_sym, translation_hash)
156
+ end
138
157
  end
139
158
  end
@@ -1,7 +1,6 @@
1
1
  class GettextSimpleRails::ModelInspector
2
2
  def self.model_classes
3
3
  clazzes = []
4
-
5
4
  ::Rails.application.eager_load!
6
5
 
7
6
  ::Object.constants.each do |clazz|
@@ -25,10 +24,7 @@ class GettextSimpleRails::ModelInspector
25
24
  end
26
25
 
27
26
  def paperclip_attachments
28
- if !::Kernel.const_defined?("Paperclip")
29
- return []
30
- end
31
-
27
+ return [] unless ::Kernel.const_defined?("Paperclip")
32
28
  Paperclip::AttachmentRegistry.names_for(@clazz).each do |name|
33
29
  yield(name)
34
30
  end
@@ -0,0 +1,50 @@
1
+ class GettextSimpleRails::SetupHelper
2
+ def initialize(args)
3
+ @args = args
4
+ end
5
+
6
+ def poedit_config_path
7
+ if @args[:poedit_config_path]
8
+ return @args[:poedit_config_path]
9
+ else
10
+ "#{ENV["HOME"]}/.poedit/config"
11
+ end
12
+ end
13
+
14
+ def poedit_config_has_ruby_parser?
15
+ config_content = File.read(poedit_config_path)
16
+ return config_content.include?("[Parsers/Ruby]")
17
+ end
18
+
19
+ def poedit_add_ruby_parser_to_config
20
+ sample_path = "#{File.dirname(__FILE__)}/../../config/poedit_ruby_parser.conf"
21
+ sample_content = File.read(sample_path).strip
22
+ config_content = File.read(poedit_config_path).strip
23
+
24
+ File.open(poedit_config_path, "w") do |fp|
25
+ fp.puts(config_content)
26
+ fp.puts(sample_content)
27
+ end
28
+ end
29
+
30
+ def poedit_config_has_ruby_in_list_of_parsers?
31
+ config_content = File.read(poedit_config_path).strip
32
+ parsers_list_match = config_content.match(/\[Parsers\]\s+List=(.+?)\n/)
33
+ list = parsers_list_match[1].split(";")
34
+ return list.include?("Ruby")
35
+ end
36
+
37
+ def poedit_config_add_ruby_to_list_of_parsers
38
+ config_content = File.read(poedit_config_path).strip
39
+ parsers_list_match = config_content.match(/\[Parsers\]\s+List=(.+?)\n/)
40
+ list = parsers_list_match[1].split(";")
41
+ list << "Ruby"
42
+
43
+ new_config = config_content.gsub(parsers_list_match[0], "[Parsers]\nList=#{list.join(";")}\n")
44
+ raise "Could not add Ruby to list of parsers." if new_config == config_content
45
+
46
+ File.open(poedit_config_path, "w") do |fp|
47
+ fp.puts(new_config)
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module GettextSimpleRails
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -36,6 +36,24 @@ module GettextSimpleRails
36
36
  end
37
37
  end
38
38
 
39
+ def self.init
40
+ require "gettext_simple"
41
+ gettext_simple = GettextSimple.new(:i18n => true)
42
+ gettext_simple.load_dir("#{Rails.root}/config/locales_gettext")
43
+ gettext_simple.register_kernel_methods
44
+
45
+ injector = GettextSimpleRails::I18nInjector.new
46
+ cache_handler = GettextSimpleRails::CacheHandler.new
47
+
48
+ if cache_handler.cache_file_too_old?
49
+ puts "[GettextSimpleRails] Cache file too old - regenerating."
50
+ cache_handler.write_static_translation_file
51
+ end
52
+
53
+ puts "[GettextSimpleRails] Injecting translations from cache."
54
+ injector.inject_from_static_translation_file(:path => cache_handler.static_cache_file_path)
55
+ end
56
+
39
57
  class Translators
40
58
  def self.const_missing(name)
41
59
  require "#{::File.dirname(__FILE__)}/gettext_simple_rails/translators/#{::StringCases.camel_to_snake(name)}"
@@ -41,7 +41,6 @@ namespace :gettext_simple_rails do
41
41
  end
42
42
 
43
43
  fp.puts " end"
44
-
45
44
  fp.puts ""
46
45
  fp.puts " def self.relationship_translations"
47
46
 
@@ -50,7 +49,6 @@ namespace :gettext_simple_rails do
50
49
  end
51
50
 
52
51
  fp.puts " end"
53
-
54
52
  fp.puts ""
55
53
  fp.puts " def self.paperclip_attachments"
56
54
 
@@ -59,7 +57,6 @@ namespace :gettext_simple_rails do
59
57
  end
60
58
 
61
59
  fp.puts " end"
62
-
63
60
  fp.puts ""
64
61
  fp.puts " def self.model_name"
65
62
  fp.puts " puts _('#{inspector.gettext_key}.one')"
@@ -70,4 +67,57 @@ namespace :gettext_simple_rails do
70
67
  end
71
68
  end
72
69
  end
70
+
71
+ task "create" => :environment do
72
+ require "fileutils"
73
+ I18n.available_locales.each do |locale|
74
+ dir_path = "#{Rails.root}/config/locales_gettext/#{locale}/LC_MESSAGES"
75
+ file_path = "#{dir_path}/default.po"
76
+
77
+ if File.exists?(file_path)
78
+ puts "Skipping #{locale} because a .po-file already exists in: #{file_path}"
79
+ next
80
+ end
81
+
82
+ FileUtils.mkdir_p(dir_path) unless File.exists?(dir_path)
83
+
84
+ project_name = Rails.application.class.parent_name
85
+
86
+ content = File.read("#{File.dirname(__FILE__)}/../../config/default.po")
87
+ content.gsub!("%{PROJECT_NAME}", project_name)
88
+ content.gsub!("%{LOCALE}", locale.to_s)
89
+
90
+ File.open(file_path, "w") do |fp|
91
+ fp.write(content)
92
+ end
93
+
94
+ puts "Created default config for #{locale} in: #{file_path}"
95
+ end
96
+ end
97
+
98
+ task "create_poedit_ruby_parser" do
99
+ setup_helper = GettextSimpleRails::SetupHelper
100
+ raise "POEdit config file could not be found in: #{setup_helper.poedit_config_path}" unless File.exists?(setup_helper.poedit_config_path)
101
+
102
+ if setup_helper.poedit_config_has_ruby_parser?
103
+ puts "Ruby parser already exists."
104
+ else
105
+ setup_helper.poedit_add_ruby_parser_to_config
106
+ puts "Added Ruby-parser to config."
107
+ end
108
+
109
+ if setup_helper.poedit_config_has_ruby_in_list_of_parsers?
110
+ puts "Ruby already in list of parsers."
111
+ else
112
+ setup_helper.poedit_config_add_ruby_to_list_of_parsers
113
+ puts "Added Ruby to list of parsers."
114
+ end
115
+ end
116
+
117
+ task "generate_static_translation_file" => :environment do
118
+ cache_handler = GettextSimpleRails::CacheHandler.new
119
+ cache_handler.write_static_translation_file
120
+
121
+ puts "Static translation file saved in #{cache_handler.static_cache_file_path}"
122
+ end
73
123
  end
@@ -2,18 +2,14 @@ require "spec_helper"
2
2
 
3
3
  describe GettextSimpleRails::Translators::ActiveRecordTranslator do
4
4
  before do
5
- if !$translations_generated_for_date_translator
6
- $translations_generated_for_date_translator = true
7
-
8
- # Make it possible to call the Rake task.
9
- ::Dummy::Application.load_tasks
10
-
11
- # Clean up any existing translations.
12
- FileUtils.rm_r(GettextSimpleRails.translation_dir) if File.exists?(GettextSimpleRails.translation_dir)
13
-
14
- # Generate model translations so we can check them.
15
- ::Rake::Task["gettext_simple_rails:generate_translator_files"].invoke
16
- end
5
+ # Make it possible to call the Rake task.
6
+ ::Dummy::Application.load_tasks
7
+
8
+ # Clean up any existing translations.
9
+ FileUtils.rm_r(GettextSimpleRails.translation_dir) if File.exists?(GettextSimpleRails.translation_dir)
10
+
11
+ # Generate model translations so we can check them.
12
+ ::Rake::Task["gettext_simple_rails:generate_translator_files"].execute
17
13
  end
18
14
 
19
15
  it "should generate translations for validations" do
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+ require "rake"
3
+ require "fileutils"
4
+
5
+ describe GettextSimpleRails::CacheHandler do
6
+ before do
7
+ ::Dummy::Application.load_tasks
8
+ end
9
+
10
+ it "should register when the cache is too old" do
11
+ static_translation_file_path = "#{Rails.root}/config/locales_gettext/static_translation_file.json"
12
+ File.unlink(static_translation_file_path) if File.exists?(static_translation_file_path)
13
+ ::Rake::Task["gettext_simple_rails:generate_translator_files"].execute
14
+ ::Rake::Task["gettext_simple_rails:generate_static_translation_file"].execute
15
+ static_file_time = File.mtime(static_translation_file_path)
16
+
17
+ cache_handler = GettextSimpleRails::CacheHandler.new
18
+ time = File.mtime(cache_handler.newest_po_file)
19
+ assert time < static_file_time
20
+ cache_handler.cache_file_too_old?.should eq false
21
+
22
+ sleep 1
23
+ FileUtils.touch(cache_handler.newest_po_file)
24
+ cache_handler.cache_file_too_old?.should eq true
25
+ end
26
+ end
@@ -2,18 +2,14 @@ require "spec_helper"
2
2
 
3
3
  describe GettextSimpleRails::Translators::DateTranslator do
4
4
  before do
5
- if !$translations_generated_for_date_translator
6
- $translations_generated_for_date_translator = true
7
-
8
- # Make it possible to call the Rake task.
9
- ::Dummy::Application.load_tasks
10
-
11
- # Clean up any existing translations.
12
- FileUtils.rm_r(GettextSimpleRails.translation_dir) if File.exists?(GettextSimpleRails.translation_dir)
13
-
14
- # Generate model translations so we can check them.
15
- ::Rake::Task["gettext_simple_rails:generate_translator_files"].invoke
16
- end
5
+ # Make it possible to call the Rake task.
6
+ ::Dummy::Application.load_tasks
7
+
8
+ # Clean up any existing translations.
9
+ FileUtils.rm_r(GettextSimpleRails.translation_dir) if File.exists?(GettextSimpleRails.translation_dir)
10
+
11
+ # Generate model translations so we can check them.
12
+ ::Rake::Task["gettext_simple_rails:generate_translator_files"].execute
17
13
  end
18
14
 
19
15
  it "generates month names translations" do