refinerycms-i18n 0.9.8.12 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,28 @@
1
+ @refinerycms @i18n
2
+ Feature: Translation Support using i18n
3
+ In order to have translation support using i18n
4
+ As an administrator
5
+ I want to use the dashboard
6
+
7
+ Background:
8
+ Given I am a logged in refinery user
9
+ And my locale is en
10
+ When I go to the Dashboard
11
+
12
+ @i18n
13
+ Scenario: Translation options available
14
+ Then I should see "English Change language"
15
+
16
+ @i18n
17
+ Scenario: Change Language to Slovenian and back to English
18
+ When I follow "English Change language"
19
+ And I follow "Slovenian"
20
+ Then I should be on the Dashboard
21
+ And I should see "Slovenian Spremeni Jezik"
22
+ And I should not see "Switch to your website"
23
+ # Back to English
24
+ When I follow "Slovenian Spremeni Jezik"
25
+ And I follow "English"
26
+ Then I should be on the Dashboard
27
+ And I should see "Switch to your website"
28
+ And I should not see "Spremeni Jezik"
data/lib/gemspec.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- version = '0.9.8.12'
2
+ version = '0.9.9'
3
3
  raise "Could not get version so gemspec can not be built" if version.nil?
4
4
  files = Dir.glob("**/*").flatten.reject do |file|
5
5
  file =~ /\.gem(spec)?$/
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.require_paths = %w(lib)
19
19
 
20
20
  s.add_dependency 'refinerycms', '>= 0.9.8'
21
- s.add_dependency 'routing-filter', '~> 0.1.6'
21
+ s.add_dependency 'routing-filter', '~> 0.1'
22
22
 
23
23
  s.files = [
24
24
  '#{files.join("',\n '")}'
data/lib/refinery/i18n.rb CHANGED
@@ -22,12 +22,12 @@ module Refinery
22
22
  def find_or_set_locale
23
23
  if ::Refinery::I18n.enabled?
24
24
  if ::Refinery::I18n.has_locale?(locale = params[:locale].try(:to_sym))
25
- ::I18n.locale = locale
25
+ Thread.current[:globalize_locale] = ::I18n.locale = locale
26
26
  elsif locale.present? and locale != ::Refinery::I18n.default_frontend_locale
27
- params[:locale] = I18n.locale = ::Refinery::I18n.default_frontend_locale
27
+ Thread.current[:globalize_locale] = params[:locale] = I18n.locale = ::Refinery::I18n.default_frontend_locale
28
28
  redirect_to(params, :notice => "The locale '#{locale.to_s}' is not supported.") and return
29
29
  else
30
- ::I18n.locale = ::Refinery::I18n.default_frontend_locale
30
+ Thread.current[:globalize_locale] = ::I18n.locale = ::Refinery::I18n.default_frontend_locale
31
31
  end
32
32
  end
33
33
  end
@@ -36,7 +36,8 @@ module Refinery
36
36
  end
37
37
 
38
38
  ::Admin::BaseController.class_eval do
39
- prepend_before_filter :find_or_set_locale
39
+ # globalize! should be prepended first so that it runs after find_or_set_locale
40
+ prepend_before_filter :globalize!, :find_or_set_locale
40
41
 
41
42
  def find_or_set_locale
42
43
  if (params[:set_locale].present? and ::Refinery::I18n.locales.include?(params[:set_locale].to_sym))
@@ -47,12 +48,23 @@ module Refinery
47
48
  end
48
49
  end
49
50
 
50
- protected :find_or_set_locale
51
+ def globalize!
52
+ Thread.current[:globalize_locale] = (params[:switch_locale] || ::Refinery::I18n.default_frontend_locale)
53
+ end
54
+
55
+ protected :find_or_set_locale, :globalize!
51
56
  end
52
57
  end
53
58
 
54
59
  config.after_initialize do
55
60
  ::Refinery::I18n.setup! if defined?(RefinerySetting) and RefinerySetting.table_exists?
61
+
62
+ Refinery::Plugin.register do |plugin|
63
+ plugin.name = "refinery_i18n"
64
+ plugin.version = %q{0.9.9}
65
+ plugin.hide_from_menu = true
66
+ plugin.always_allow_access = true
67
+ end
56
68
  end
57
69
 
58
70
  end
@@ -112,12 +124,20 @@ module Refinery
112
124
 
113
125
  def default_frontend_locale
114
126
  (@default_frontend_locale ||= RefinerySetting.find_or_set(:i18n_translation_default_frontend_locale,
115
- :en, {
127
+ :en, {
116
128
  :scoping => 'refinery',
117
129
  :callback_proc_as_string => %q{::Refinery::I18n.setup!}
118
130
  })).to_sym
119
131
  end
120
132
 
133
+ def frontend_locales
134
+ @frontend_locales ||= RefinerySetting.find_or_set(:i18n_translation_frontend_locales,
135
+ [self.default_frontend_locale], {
136
+ :scoping => 'refinery',
137
+ :callback_proc_as_string => %q{::Refinery::I18n.setup!}
138
+ })
139
+ end
140
+
121
141
  def locales
122
142
  @locales ||= RefinerySetting.find_or_set(:i18n_translation_locales, self.built_in_locales,
123
143
  {
@@ -138,6 +158,7 @@ module Refinery
138
158
  @default_locale = nil
139
159
  @default_frontend_locale = nil
140
160
  @current_locale = nil
161
+ @frontend_locales = nil
141
162
 
142
163
  self.load_base_locales!
143
164
  self.load_refinery_locales!
@@ -1,35 +1,37 @@
1
1
  require 'fileutils'
2
2
 
3
- class Translate::File
4
- attr_accessor :path
3
+ module Translate
4
+ class File
5
+ attr_accessor :path
5
6
 
6
- def initialize(path)
7
- self.path = path
8
- end
7
+ def initialize(path)
8
+ self.path = path
9
+ end
9
10
 
10
- def write(keys)
11
- FileUtils.mkdir_p File.dirname(path)
12
- File.open(path, "w") do |file|
13
- file.puts keys_to_yaml(Translate::File.deep_stringify_keys(keys))
11
+ def write(keys)
12
+ FileUtils.mkdir_p File.dirname(path)
13
+ File.open(path, "w") do |file|
14
+ file.puts keys_to_yaml(Translate::File.deep_stringify_keys(keys))
15
+ end
14
16
  end
15
- end
16
17
 
17
- def read
18
- File.exists?(path) ? YAML::load(IO.read(path)) : {}
19
- end
18
+ def read
19
+ File.exists?(path) ? YAML::load(IO.read(path)) : {}
20
+ end
20
21
 
21
- # Stringifying keys for prettier YAML
22
- def self.deep_stringify_keys(hash)
23
- hash.inject({}) { |result, (key, value)|
24
- value = deep_stringify_keys(value) if value.is_a? Hash
25
- result[(key.to_s rescue key) || key] = value
26
- result
27
- }
28
- end
22
+ # Stringifying keys for prettier YAML
23
+ def self.deep_stringify_keys(hash)
24
+ hash.inject({}) { |result, (key, value)|
25
+ value = deep_stringify_keys(value) if value.is_a? Hash
26
+ result[(key.to_s rescue key) || key] = value
27
+ result
28
+ }
29
+ end
29
30
 
30
- private
31
- def keys_to_yaml(keys)
32
- # Using ya2yaml, if available, for UTF8 support
33
- keys.respond_to?(:ya2yaml) ? keys.ya2yaml(:escape_as_utf8 => true) : keys.to_yaml
31
+ private
32
+ def keys_to_yaml(keys)
33
+ # Using ya2yaml, if available, for UTF8 support
34
+ keys.respond_to?(:ya2yaml) ? keys.ya2yaml(:escape_as_utf8 => true) : keys.to_yaml
35
+ end
34
36
  end
35
- end
37
+ end
@@ -1,123 +1,125 @@
1
1
  require 'pathname'
2
2
 
3
- class Translate::Keys
4
- # Allows keys extracted from lookups in files to be cached
5
- def self.files
6
- @@files ||= Translate::Keys.new.files
7
- end
3
+ module Translate
4
+ class KeysKeys
5
+ # Allows keys extracted from lookups in files to be cached
6
+ def self.files
7
+ @@files ||= Translate::Keys.new.files
8
+ end
8
9
 
9
- # Allows flushing of the files cache
10
- def self.files=(files)
11
- @@files = files
12
- end
10
+ # Allows flushing of the files cache
11
+ def self.files=(files)
12
+ @@files = files
13
+ end
13
14
 
14
- def files
15
- @files ||= extract_files
16
- end
17
- alias_method :to_hash, :files
15
+ def files
16
+ @files ||= extract_files
17
+ end
18
+ alias_method :to_hash, :files
18
19
 
19
- def keys
20
- files.keys
21
- end
22
- alias_method :to_a, :keys
20
+ def keys
21
+ files.keys
22
+ end
23
+ alias_method :to_a, :keys
23
24
 
24
- def i18n_keys(locale)
25
- I18n.backend.send(:init_translations) unless I18n.backend.initialized?
26
- extract_i18n_keys(I18n.backend.send(:translations)[locale.to_sym]).sort
27
- end
25
+ def i18n_keys(locale)
26
+ I18n.backend.send(:init_translations) unless I18n.backend.initialized?
27
+ extract_i18n_keys(I18n.backend.send(:translations)[locale.to_sym]).sort
28
+ end
28
29
 
29
- # Convert something like:
30
- #
31
- # {
32
- # :pressrelease => {
33
- # :label => {
34
- # :one => "Pressmeddelande"
35
- # }
36
- # }
37
- # }
38
- #
39
- # to:
40
- #
41
- # {'pressrelease.label.one' => "Pressmeddelande"}
42
- #
43
- def self.to_shallow_hash(hash)
44
- hash.inject({}) do |shallow_hash, (key, value)|
45
- if value.is_a?(Hash)
46
- to_shallow_hash(value).each do |sub_key, sub_value|
47
- shallow_hash[[key, sub_key].join(".")] = sub_value
30
+ # Convert something like:
31
+ #
32
+ # {
33
+ # :pressrelease => {
34
+ # :label => {
35
+ # :one => "Pressmeddelande"
36
+ # }
37
+ # }
38
+ # }
39
+ #
40
+ # to:
41
+ #
42
+ # {'pressrelease.label.one' => "Pressmeddelande"}
43
+ #
44
+ def self.to_shallow_hash(hash)
45
+ hash.inject({}) do |shallow_hash, (key, value)|
46
+ if value.is_a?(Hash)
47
+ to_shallow_hash(value).each do |sub_key, sub_value|
48
+ shallow_hash[[key, sub_key].join(".")] = sub_value
49
+ end
50
+ else
51
+ shallow_hash[key.to_s] = value
48
52
  end
49
- else
50
- shallow_hash[key.to_s] = value
53
+ shallow_hash
51
54
  end
52
- shallow_hash
53
55
  end
54
- end
55
56
 
56
- # Convert something like:
57
- #
58
- # {'pressrelease.label.one' => "Pressmeddelande"}
59
- #
60
- # to:
61
- #
62
- # {
63
- # :pressrelease => {
64
- # :label => {
65
- # :one => "Pressmeddelande"
66
- # }
67
- # }
68
- # }
69
- def self.to_deep_hash(hash)
70
- hash.inject({}) do |deep_hash, (key, value)|
71
- keys = key.to_s.split('.').reverse
72
- leaf_key = keys.shift
73
- key_hash = keys.inject({leaf_key.to_sym => value}) { |hash, key| {key.to_sym => hash} }
74
- deep_merge!(deep_hash, key_hash)
75
- deep_hash
57
+ # Convert something like:
58
+ #
59
+ # {'pressrelease.label.one' => "Pressmeddelande"}
60
+ #
61
+ # to:
62
+ #
63
+ # {
64
+ # :pressrelease => {
65
+ # :label => {
66
+ # :one => "Pressmeddelande"
67
+ # }
68
+ # }
69
+ # }
70
+ def self.to_deep_hash(hash)
71
+ hash.inject({}) do |deep_hash, (key, value)|
72
+ keys = key.to_s.split('.').reverse
73
+ leaf_key = keys.shift
74
+ key_hash = keys.inject({leaf_key.to_sym => value}) { |hash, key| {key.to_sym => hash} }
75
+ deep_merge!(deep_hash, key_hash)
76
+ deep_hash
77
+ end
76
78
  end
77
- end
78
79
 
79
- # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
80
- def self.deep_merge!(hash1, hash2)
81
- merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
82
- hash1.merge!(hash2, &merger)
83
- end
80
+ # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
81
+ def self.deep_merge!(hash1, hash2)
82
+ merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
83
+ hash1.merge!(hash2, &merger)
84
+ end
84
85
 
85
- private
86
- def extract_i18n_keys(hash, parent_keys = [])
87
- hash.inject([]) do |keys, (key, value)|
88
- full_key = parent_keys + [key]
89
- if value.is_a?(Hash)
90
- # Nested hash
91
- keys += extract_i18n_keys(value, full_key)
92
- elsif value.present?
93
- # String leaf node
94
- keys << full_key.join(".")
86
+ private
87
+ def extract_i18n_keys(hash, parent_keys = [])
88
+ hash.inject([]) do |keys, (key, value)|
89
+ full_key = parent_keys + [key]
90
+ if value.is_a?(Hash)
91
+ # Nested hash
92
+ keys += extract_i18n_keys(value, full_key)
93
+ elsif value.present?
94
+ # String leaf node
95
+ keys << full_key.join(".")
96
+ end
97
+ keys
95
98
  end
96
- keys
97
99
  end
98
- end
99
100
 
100
- def extract_files
101
- files_to_scan.inject(HashWithIndifferentAccess.new) do |files, file|
102
- IO.read(file).scan(i18n_lookup_pattern).flatten.map(&:to_sym).each do |key|
103
- files[key] ||= []
104
- path = Pathname.new(File.expand_path(file)).relative_path_from(Pathname.new(Rails.root)).to_s
105
- files[key] << path unless files[key].include?(path)
101
+ def extract_files
102
+ files_to_scan.inject(HashWithIndifferentAccess.new) do |files, file|
103
+ IO.read(file).scan(i18n_lookup_pattern).flatten.map(&:to_sym).each do |key|
104
+ files[key] ||= []
105
+ path = Pathname.new(File.expand_path(file)).relative_path_from(Pathname.new(Rails.root)).to_s
106
+ files[key] << path unless files[key].include?(path)
107
+ end
108
+ files
106
109
  end
107
- files
108
110
  end
109
- end
110
111
 
111
- def i18n_lookup_pattern
112
- /\b(?:I18n\.t|I18n\.translate|t)(?:\s|\():?'([a-z0-9_]+.[a-z0-9_.]+)'\)?/
113
- end
112
+ def i18n_lookup_pattern
113
+ /\b(?:I18n\.t|I18n\.translate|t)(?:\s|\():?'([a-z0-9_]+.[a-z0-9_.]+)'\)?/
114
+ end
114
115
 
115
- def files_to_scan
116
- Dir.glob(File.join(files_root_dir, "{app,config,lib}", "**","*.{rb,erb,rhtml}")) +
117
- Dir.glob(File.join(files_root_dir, "public", "javascripts", "**","*.js"))
118
- end
116
+ def files_to_scan
117
+ Dir.glob(File.join(files_root_dir, "{app,config,lib}", "**","*.{rb,erb,rhtml}")) +
118
+ Dir.glob(File.join(files_root_dir, "public", "javascripts", "**","*.js"))
119
+ end
119
120
 
120
- def files_root_dir
121
- Rails.root
121
+ def files_root_dir
122
+ Rails.root
123
+ end
122
124
  end
123
- end
125
+ end
data/lib/translate/log.rb CHANGED
@@ -1,39 +1,42 @@
1
1
  require 'fileutils'
2
- class Translate::Log
3
- attr_accessor :from_locale, :to_locale, :keys
4
2
 
5
- def initialize(from_locale, to_locale, keys)
6
- self.from_locale = from_locale
7
- self.to_locale = to_locale
8
- self.keys = keys
9
- end
3
+ module Translate
4
+ class Log
5
+ attr_accessor :from_locale, :to_locale, :keys
10
6
 
11
- def write_to_file
12
- current_texts = File.exists?(file_path) ? file.read : {}
13
- current_texts.merge!(from_texts)
14
- file.write(current_texts)
15
- end
7
+ def initialize(from_locale, to_locale, keys)
8
+ self.from_locale = from_locale
9
+ self.to_locale = to_locale
10
+ self.keys = keys
11
+ end
16
12
 
17
- def read
18
- file.read
19
- end
13
+ def write_to_file
14
+ current_texts = File.exists?(file_path) ? file.read : {}
15
+ current_texts.merge!(from_texts)
16
+ file.write(current_texts)
17
+ end
20
18
 
21
- private
22
- def file
23
- @file ||= Translate::File.new(file_path)
24
- end
19
+ def read
20
+ file.read
21
+ end
25
22
 
26
- def from_texts
27
- Translate::File.deep_stringify_keys(Translate::Keys.to_deep_hash(keys.inject({}) do |hash, key|
28
- hash[key] = I18n.backend.send(:lookup, from_locale, key)
29
- hash
30
- end))
31
- end
23
+ private
24
+ def file
25
+ @file ||= Translate::File.new(file_path)
26
+ end
27
+
28
+ def from_texts
29
+ Translate::File.deep_stringify_keys(Translate::Keys.to_deep_hash(keys.inject({}) do |hash, key|
30
+ hash[key] = I18n.backend.send(:lookup, from_locale, key)
31
+ hash
32
+ end))
33
+ end
32
34
 
33
- def file_path
34
- #make sure diff log dir exists
35
- translate_log_dir = File.join(RAILS_ROOT, 'log', 'translate')
36
- FileUtils.mkdir_p(translate_log_dir)
37
- File.join(translate_log_dir, "from_#{from_locale}_to_#{to_locale}.yml")
35
+ def file_path
36
+ #make sure diff log dir exists
37
+ translate_log_dir = File.join(RAILS_ROOT, 'log', 'translate')
38
+ FileUtils.mkdir_p(translate_log_dir)
39
+ File.join(translate_log_dir, "from_#{from_locale}_to_#{to_locale}.yml")
40
+ end
38
41
  end
39
- end
42
+ end
@@ -1,20 +1,22 @@
1
- class Translate::Storage
2
- attr_accessor :locale
1
+ module Translate
2
+ class Storage
3
+ attr_accessor :locale
3
4
 
4
- def initialize(locale)
5
- self.locale = locale.to_sym
6
- end
5
+ def initialize(locale)
6
+ self.locale = locale.to_sym
7
+ end
7
8
 
8
- def write_to_file
9
- Translate::File.new(file_path).write(keys)
10
- end
9
+ def write_to_file
10
+ Translate::File.new(file_path).write(keys)
11
+ end
11
12
 
12
- private
13
- def keys
14
- {locale => I18n.backend.send(:translations)[locale]}
15
- end
13
+ private
14
+ def keys
15
+ {locale => I18n.backend.send(:translations)[locale]}
16
+ end
16
17
 
17
- def file_path
18
- File.join(Translate.locales_dir, "#{locale}.yml")
18
+ def file_path
19
+ File.join(Translate.locales_dir, "#{locale}.yml")
20
+ end
19
21
  end
20
- end
22
+ end
metadata CHANGED
@@ -5,9 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 9
8
- - 8
9
- - 12
10
- version: 0.9.8.12
8
+ - 9
9
+ version: 0.9.9
11
10
  platform: ruby
12
11
  authors:
13
12
  - Resolve Digital
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-12-02 00:00:00 +13:00
17
+ date: 2011-01-13 00:00:00 +13:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -44,8 +43,7 @@ dependencies:
44
43
  segments:
45
44
  - 0
46
45
  - 1
47
- - 6
48
- version: 0.1.6
46
+ version: "0.1"
49
47
  type: :runtime
50
48
  version_requirements: *id002
51
49
  description: i18n logic extracted from RefineryCMS, for Refinery CMS.
@@ -115,6 +113,7 @@ files:
115
113
  - config/locales/vi.yml
116
114
  - config/locales/zh-CN.yml
117
115
  - config/locales/zh-TW.yml
116
+ - features/dashboard.feature
118
117
  - i18n-js-readme.rdoc
119
118
  - lib/gemspec.rb
120
119
  - lib/refinery/i18n-filter.rb