rails-i18nterface 0.1.5 → 0.1.6
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.
- checksums.yaml +7 -0
- data/app/assets/javascripts/rails_i18nterface/application.js +1 -1
- data/app/assets/javascripts/rails_i18nterface/base.js +6 -2
- data/app/assets/stylesheets/rails_i18nterface/application.css +1 -1
- data/app/controllers/rails_i18nterface/translate_controller.rb +23 -30
- data/app/helpers/rails_i18nterface/translate_helper.rb +12 -13
- data/app/models/rails_i18nterface/translation.rb +23 -0
- data/app/views/rails_i18nterface/translate/index.html.erb +1 -1
- data/config/routes.rb +3 -3
- data/db/migrate/20130422115639_rename_translation_to_namespace.rb +8 -0
- data/lib/rails-i18nterface/keys.rb +15 -13
- data/lib/rails-i18nterface/log.rb +2 -2
- data/lib/rails-i18nterface/sourcefiles.rb +11 -6
- data/lib/rails-i18nterface/storage.rb +3 -3
- data/lib/rails-i18nterface/utils.rb +5 -9
- data/lib/rails-i18nterface/version.rb +1 -1
- data/lib/rails-i18nterface/yamlfile.rb +5 -5
- data/lib/rails-i18nterface.rb +7 -7
- data/spec/controllers/translate_controller_spec.rb +29 -29
- data/spec/internal/app/models/article.rb +1 -1
- data/spec/internal/config/routes.rb +2 -2
- data/spec/internal/db/combustion_test.sqlite +0 -0
- data/spec/internal/db/schema.rb +2 -0
- data/spec/internal/log/test.log +1380 -546
- data/spec/lib/keys_spec.rb +63 -63
- data/spec/lib/log_spec.rb +12 -11
- data/spec/lib/sourcefiles_spec.rb +11 -11
- data/spec/lib/storage_spec.rb +7 -7
- data/spec/lib/utils_spec.rb +1 -1
- data/spec/lib/yamlfile_spec.rb +5 -5
- data/spec/models/translation_spec.rb +9 -0
- data/spec/spec_helper.rb +19 -4
- metadata +84 -67
- data/app/models/translation.rb +0 -4
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4247f071313c096f5b0101c05d322d81469698be
|
4
|
+
data.tar.gz: dac5a3a210a13e2d6a9c084fa943262d12f519a9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 89af3200a75dadecada9ff5d64c3aff54f542d27f7642eec4608775adfb2b534e422931ab051f9c3bd9bac769f05689ee301bde5f47f76c369826a767fd05a00
|
7
|
+
data.tar.gz: 0ed1c842b643b7adf9040c204f1db74f1259a787d6c88c09f98e22d393427944aa598868d5e0fe2f741c1bf2ee07bbb01cbf45b502c1398d775610efd99ae357
|
@@ -67,10 +67,14 @@ $.domReady(function() {
|
|
67
67
|
url: 'delete/'+key,
|
68
68
|
method: 'delete',
|
69
69
|
success: function(resp) {
|
70
|
-
|
70
|
+
if (resp == error) {
|
71
|
+
alert(resp.msg);
|
72
|
+
} else {
|
73
|
+
alert(resp);
|
74
|
+
}
|
71
75
|
},
|
72
76
|
error: function(resp,msg) {
|
73
|
-
alert("Error: "+
|
77
|
+
alert("Error: " + msg);
|
74
78
|
}
|
75
79
|
})
|
76
80
|
}
|
@@ -20,8 +20,8 @@ module RailsI18nterface
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def destroy
|
23
|
-
term = Translation.find_by_key(params[:key])
|
24
|
-
if term.destroy
|
23
|
+
term = RailsI18nterface::Translation.find_by_key(params[:key])
|
24
|
+
if term and term.destroy
|
25
25
|
render json: 'ok'
|
26
26
|
else
|
27
27
|
render json: 'error'
|
@@ -31,46 +31,35 @@ module RailsI18nterface
|
|
31
31
|
def load_db_translations
|
32
32
|
@versions = {}
|
33
33
|
@dbvalues = {@to_locale => {}}
|
34
|
-
(Translation.where(:locale => @to_locale) || []).each
|
34
|
+
(RailsI18nterface::Translation.where(:locale => @to_locale) || []).each do |translation|
|
35
35
|
@versions[translation.key] = translation.updated_at.to_i
|
36
36
|
yaml_value = I18n.backend.send(:lookup, @to_locale, translation.key)
|
37
|
-
if
|
37
|
+
if yaml_value && translation.value != yaml_value
|
38
38
|
translation.value = yaml_value
|
39
|
-
Translation.where(key: translation.key).first.update_attribute(:value, yaml_value)
|
39
|
+
RailsI18nterface::Translation.where(key: translation.key).first.update_attribute(:value, yaml_value)
|
40
40
|
end
|
41
41
|
@dbvalues[@to_locale][translation.key] = translation.value
|
42
42
|
@keys << translation.key
|
43
|
-
|
43
|
+
end
|
44
44
|
@keys.uniq!
|
45
45
|
end
|
46
46
|
|
47
47
|
def export
|
48
48
|
locale = params[:locale].to_sym
|
49
49
|
keys = {locale => I18n.backend.send(:translations)[locale] || {}}
|
50
|
-
Translation.where(:locale => @to_locale).each
|
50
|
+
RailsI18nterface::Translation.where(:locale => @to_locale).each do |translation|
|
51
51
|
next if !translation.value or translation.value == ''
|
52
|
-
set_nested(keys[locale], translation.key.split(
|
53
|
-
|
52
|
+
set_nested(keys[locale], translation.key.split('.'), translation.value)
|
53
|
+
end
|
54
54
|
remove_blanks keys
|
55
|
-
|
55
|
+
puts keys
|
56
|
+
yaml = RailsI18nterface::Yamlfile.new(nil).keys_to_yaml(keys)
|
56
57
|
response.headers['Content-Disposition'] = "attachment; filename=#{locale}.yml"
|
57
58
|
render :text => yaml
|
58
59
|
end
|
59
60
|
|
60
61
|
def update
|
61
|
-
params[:key]
|
62
|
-
t = Translation.where(:key => k, :locale => @to_locale).first
|
63
|
-
unless t
|
64
|
-
t = Translation.new
|
65
|
-
t.key = k
|
66
|
-
t.locale = @to_locale
|
67
|
-
end
|
68
|
-
next if t.value == v
|
69
|
-
if params[:version][k].to_i == t.updated_at.to_i
|
70
|
-
t.value = v
|
71
|
-
end
|
72
|
-
t.save
|
73
|
-
}
|
62
|
+
RailsI18nterface::Translation.update(@to_locale, params[:key])
|
74
63
|
if I18n.backend.respond_to? :store_translations
|
75
64
|
I18n.backend.store_translations(@to_locale, RailsI18nterface::Keys.to_deep_hash(params[:key]))
|
76
65
|
end
|
@@ -83,7 +72,7 @@ module RailsI18nterface
|
|
83
72
|
|
84
73
|
def reload
|
85
74
|
RailsI18nterface::Keys.files = nil
|
86
|
-
redirect_to :
|
75
|
+
redirect_to root_path(params.slice(:filter, :sort_by, :key_type, :key_pattern, :text_type, :text_pattern))
|
87
76
|
end
|
88
77
|
|
89
78
|
private
|
@@ -93,9 +82,12 @@ module RailsI18nterface
|
|
93
82
|
keys = (@files.keys.map(&:to_s) + RailsI18nterface::Keys.new.i18n_keys(@from_locale)).uniq
|
94
83
|
keys.reject! do |key|
|
95
84
|
from_text = lookup(@from_locale, key)
|
96
|
-
# When translating from one language to another,
|
97
|
-
#
|
98
|
-
|
85
|
+
# When translating from one language to another,
|
86
|
+
# make sure there is a text to translate from.
|
87
|
+
# Always exclude non string translation objects
|
88
|
+
# as we don't support editing them in the UI.
|
89
|
+
(@from_locale != @to_locale && !from_text.present?) ||
|
90
|
+
(from_text.present? && !from_text.is_a?(String))
|
99
91
|
end
|
100
92
|
end
|
101
93
|
|
@@ -142,11 +134,12 @@ module RailsI18nterface
|
|
142
134
|
def filter_by_text_pattern
|
143
135
|
return if params[:text_pattern].blank?
|
144
136
|
@keys.reject! do |key|
|
137
|
+
lookup_key = lookup(@from_locale, key)
|
145
138
|
case params[:text_type]
|
146
139
|
when 'contains'
|
147
|
-
!
|
140
|
+
!lookup_key.present? || !lookup_key.to_s.downcase.index(params[:text_pattern].downcase)
|
148
141
|
when 'equals'
|
149
|
-
!
|
142
|
+
!lookup_key.present? || lookup_key.to_s.downcase != params[:text_pattern].downcase
|
150
143
|
else
|
151
144
|
raise "Unknown text_type '#{params[:text_type]}'"
|
152
145
|
end
|
@@ -211,7 +204,7 @@ module RailsI18nterface
|
|
211
204
|
def old_from_text(key)
|
212
205
|
return @old_from_text[key] if @old_from_text && @old_from_text[key]
|
213
206
|
@old_from_text = {}
|
214
|
-
text = key.split(".").
|
207
|
+
text = key.split(".").reduce(log_hash) do |hash, k|
|
215
208
|
hash ? hash[k] : nil
|
216
209
|
end
|
217
210
|
@old_from_text[key] = text
|
@@ -14,20 +14,18 @@ module RailsI18nterface
|
|
14
14
|
filter << "<i>#{label}</i>"
|
15
15
|
else
|
16
16
|
link_params = params.merge({param_name.to_s => type})
|
17
|
-
link_params.merge!({
|
17
|
+
link_params.merge!({'page' => nil}) if param_name.to_s != 'page'
|
18
18
|
filter << link_to(label, link_params)
|
19
19
|
end
|
20
20
|
end
|
21
|
-
filter.join(
|
21
|
+
filter.join(' | ')
|
22
22
|
end
|
23
23
|
|
24
24
|
def n_lines(text, line_size)
|
25
25
|
n_lines = 1
|
26
26
|
if text.present?
|
27
27
|
n_lines = text.split("\n").size
|
28
|
-
if n_lines == 1 && text.length > line_size
|
29
|
-
n_lines = text.length / line_size + 1
|
30
|
-
end
|
28
|
+
n_lines = text.length / line_size + 1 if n_lines == 1 && text.length > line_size
|
31
29
|
end
|
32
30
|
n_lines
|
33
31
|
end
|
@@ -36,14 +34,14 @@ module RailsI18nterface
|
|
36
34
|
out = '<ul>'
|
37
35
|
dirs = {}
|
38
36
|
root = []
|
39
|
-
h.each do |k,v|
|
37
|
+
h.each do |k, v|
|
40
38
|
if v.is_a? Hash
|
41
39
|
dirs[k] = v
|
42
40
|
else
|
43
41
|
root << k
|
44
42
|
end
|
45
43
|
end
|
46
|
-
out <<
|
44
|
+
out << '<li class="dir"><span class="display" data-id="."></span>ROOT'
|
47
45
|
out << " <span class=\"num\">(#{root.length})</span>"
|
48
46
|
out << '<ul>'
|
49
47
|
root.each do |key|
|
@@ -51,19 +49,20 @@ module RailsI18nterface
|
|
51
49
|
end
|
52
50
|
out << '</ul>'
|
53
51
|
out << '</ul>'
|
54
|
-
out << list_namespace('',dirs)
|
52
|
+
out << list_namespace('', dirs)
|
55
53
|
end
|
56
54
|
|
57
|
-
def list_namespace(k,h)
|
55
|
+
def list_namespace(k, h)
|
58
56
|
out = '<ul>'
|
59
57
|
k != '' && k += '.'
|
60
|
-
h.each do |key,val|
|
58
|
+
h.each do |key, val|
|
61
59
|
if val.is_a? Hash
|
62
|
-
out << "<li class=\"dir\"><span class=\"display\" data-id=\"#{k+key.to_s}\"></span
|
60
|
+
out << "<li class=\"dir\"><span class=\"display\" data-id=\"#{k + key.to_s}\"></span>"
|
61
|
+
out << key.to_s
|
63
62
|
out << " <span class=\"num\">(#{val.length})</span>"
|
64
|
-
out << list_namespace(k+key.to_s,val)
|
63
|
+
out << list_namespace(k + key.to_s, val)
|
65
64
|
else
|
66
|
-
out << "<li class=\"item\" data-id=\"#{k+key.to_s}\">#{key}"
|
65
|
+
out << "<li class=\"item\" data-id=\"#{k + key.to_s}\">#{key}"
|
67
66
|
end
|
68
67
|
out << '</li>'
|
69
68
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class RailsI18nterface::Translation < ActiveRecord::Base
|
2
|
+
|
3
|
+
def self.update(locale, keys)
|
4
|
+
keys.each do |k, v|
|
5
|
+
t = RailsI18nterface::Translation.where(key: k, locale: locale).first
|
6
|
+
if t
|
7
|
+
if !v || v == ''
|
8
|
+
t.destroy!
|
9
|
+
next
|
10
|
+
elsif t.value != v
|
11
|
+
t.value = v
|
12
|
+
t.save!
|
13
|
+
end
|
14
|
+
elsif v != ''
|
15
|
+
t = RailsI18nterface::Translation.new
|
16
|
+
t.key = k
|
17
|
+
t.locale = locale
|
18
|
+
t.save!
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -19,7 +19,7 @@
|
|
19
19
|
<div class="center">
|
20
20
|
<label>Show:</label> <%= simple_filter(show_filters).html_safe %>
|
21
21
|
Found <strong><%= @total_entries %></strong> messages
|
22
|
-
<%= link_to "Reload messages", translate_reload_path %>
|
22
|
+
<%= link_to "Reload messages", translate_reload_path(params) %>
|
23
23
|
</div>
|
24
24
|
|
25
25
|
</h1>
|
data/config/routes.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
RailsI18nterface::Engine.routes.draw do
|
2
|
-
root :
|
2
|
+
root to: 'translate#index'
|
3
3
|
|
4
4
|
put '/translate' => 'translate#update'
|
5
|
-
get '/reload' => 'translate#reload', :
|
6
|
-
get '/export' => 'translate#export', :
|
5
|
+
get '/reload' => 'translate#reload', as: 'translate_reload'
|
6
|
+
get '/export' => 'translate#export', as: 'translate_export'
|
7
7
|
delete '/delete/*key' => 'translate#destroy', format: false
|
8
8
|
end
|
@@ -5,15 +5,15 @@ module RailsI18nterface
|
|
5
5
|
|
6
6
|
# Allows keys extracted from lookups in files to be cached
|
7
7
|
def self.files
|
8
|
-
|
8
|
+
@files ||= new.files
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.names
|
12
|
-
|
12
|
+
@names || new.names
|
13
13
|
end
|
14
14
|
# Allows flushing of the files cache
|
15
15
|
def self.files=(files)
|
16
|
-
|
16
|
+
@files = files
|
17
17
|
end
|
18
18
|
|
19
19
|
def files
|
@@ -37,7 +37,7 @@ module RailsI18nterface
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def untranslated_keys
|
40
|
-
self.class.translated_locales.
|
40
|
+
self.class.translated_locales.reduce({}) do |missing, locale|
|
41
41
|
missing[locale] = i18n_keys(I18n.default_locale).map do |key|
|
42
42
|
I18n.backend.send(:lookup, locale, key).nil? ? key : nil
|
43
43
|
end.compact
|
@@ -48,14 +48,16 @@ module RailsI18nterface
|
|
48
48
|
def missing_keys
|
49
49
|
locale = I18n.default_locale
|
50
50
|
yaml_keys = {}
|
51
|
-
yaml_keys = Storage.file_paths(locale).
|
51
|
+
yaml_keys = Storage.file_paths(locale).reduce({}) do |keys, path|
|
52
52
|
keys = keys.deep_merge(Yamlfile.new(path).read[locale.to_s])
|
53
53
|
end
|
54
54
|
files.reject { |key, file| self.class.contains_key?(yaml_keys, key) }
|
55
55
|
end
|
56
56
|
|
57
57
|
def self.translated_locales
|
58
|
-
I18n.available_locales.reject
|
58
|
+
I18n.available_locales.reject do |locale|
|
59
|
+
[:root, I18n.default_locale.to_sym].include?(locale)
|
60
|
+
end
|
59
61
|
end
|
60
62
|
|
61
63
|
# Checks if a nested hash contains the keys in dot separated I18n key.
|
@@ -76,10 +78,10 @@ module RailsI18nterface
|
|
76
78
|
# contains_key?("foo.bar.baz.bla", key) # => false
|
77
79
|
#
|
78
80
|
def self.contains_key?(hash, key)
|
79
|
-
keys = key.to_s.split(
|
81
|
+
keys = key.to_s.split('.')
|
80
82
|
return false if keys.empty?
|
81
|
-
!keys.
|
82
|
-
memo.is_a?(Hash) ? memo.try(:[],
|
83
|
+
!keys.reduce(HashWithIndifferentAccess.new(hash)) do |memo, k|
|
84
|
+
memo.is_a?(Hash) ? memo.try(:[], k) : nil
|
83
85
|
end.nil?
|
84
86
|
end
|
85
87
|
|
@@ -98,10 +100,10 @@ module RailsI18nterface
|
|
98
100
|
# {'pressrelease.label.one' => "Pressmeddelande"}
|
99
101
|
#
|
100
102
|
def self.to_shallow_hash(hash)
|
101
|
-
hash.
|
103
|
+
hash.reduce({}) do |shallow_hash, (key, value)|
|
102
104
|
if value.is_a?(Hash)
|
103
105
|
to_shallow_hash(value).each do |sub_key, sub_value|
|
104
|
-
shallow_hash[[key, sub_key].join(
|
106
|
+
shallow_hash[[key, sub_key].join('.')] = sub_value
|
105
107
|
end
|
106
108
|
else
|
107
109
|
shallow_hash[key.to_s] = value
|
@@ -124,10 +126,10 @@ module RailsI18nterface
|
|
124
126
|
# }
|
125
127
|
# }
|
126
128
|
def self.to_deep_hash(hash)
|
127
|
-
hash.
|
129
|
+
hash.reduce({}) do |deep_hash, (key, value)|
|
128
130
|
keys = key.to_s.split('.').reverse
|
129
131
|
leaf_key = keys.shift
|
130
|
-
key_hash = keys.
|
132
|
+
key_hash = keys.reduce({leaf_key.to_sym => value}) { |h, k| { k.to_sym => h } }
|
131
133
|
deep_merge!(deep_hash, key_hash)
|
132
134
|
deep_hash
|
133
135
|
end
|
@@ -24,14 +24,14 @@ module RailsI18nterface
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def from_texts
|
27
|
-
file.deep_stringify_keys(Keys.to_deep_hash(keys.
|
27
|
+
file.deep_stringify_keys(Keys.to_deep_hash(keys.reduce({ }) do |hash, key|
|
28
28
|
hash[key] = I18n.backend.send(:lookup, from_locale, key)
|
29
29
|
hash
|
30
30
|
end))
|
31
31
|
end
|
32
32
|
|
33
33
|
def file_path
|
34
|
-
File.join(Rails.root,
|
34
|
+
File.join(Rails.root, 'config', 'locales', 'log', "from_#{from_locale}_to_#{to_locale}.yml")
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -2,9 +2,14 @@ module RailsI18nterface
|
|
2
2
|
module Sourcefiles
|
3
3
|
|
4
4
|
def self.extract_files
|
5
|
-
i18n_lookup_pattern = /\b
|
5
|
+
i18n_lookup_pattern = /\b
|
6
|
+
(?:I18n\.t|I18n\.translate|t)
|
7
|
+
(?:\s|\():?(?:'|")
|
8
|
+
(\.?[a-z0-9_\.]+)
|
9
|
+
(?:'|")
|
10
|
+
/x
|
6
11
|
f = {}
|
7
|
-
self.files_to_scan.
|
12
|
+
self.files_to_scan.reduce(HashWithIndifferentAccess.new) do |files, file|
|
8
13
|
f = files.merge! self.populate_keys(file, i18n_lookup_pattern)
|
9
14
|
end
|
10
15
|
f.merge self.extract_activerecords
|
@@ -30,8 +35,8 @@ module RailsI18nterface
|
|
30
35
|
end
|
31
36
|
|
32
37
|
def self.files_to_scan
|
33
|
-
Dir.glob(File.join(Storage.root_dir,
|
34
|
-
Dir.glob(File.join(Storage.root_dir,
|
38
|
+
Dir.glob(File.join(Storage.root_dir, '{app,config,lib}', '**', '*.{rb,erb,haml,slim,rhtml}')) +
|
39
|
+
Dir.glob(File.join(Storage.root_dir, '{public,app/assets}', 'javascripts', '**', '*.{js,coffee}'))
|
35
40
|
end
|
36
41
|
|
37
42
|
def self.extract_activerecords
|
@@ -43,14 +48,14 @@ module RailsI18nterface
|
|
43
48
|
while matchdata != nil
|
44
49
|
model = matchdata[1]
|
45
50
|
files["activerecord.models.#{model}"] = ['db/schema.rb']
|
46
|
-
files.merge!(self.extract_attributes(model,matchdata[2]))
|
51
|
+
files.merge!(self.extract_attributes(model, matchdata[2]))
|
47
52
|
matchdata = regex.match(matchdata.post_match)
|
48
53
|
end
|
49
54
|
end
|
50
55
|
files
|
51
56
|
end
|
52
57
|
|
53
|
-
def self.extract_attributes(model,txt)
|
58
|
+
def self.extract_attributes(model, txt)
|
54
59
|
files = {}
|
55
60
|
regex = Regexp.new('\s*t\.[-_0-9a-z]*\s*"([^"]*?)"')
|
56
61
|
matchdata = regex.match(txt)
|
@@ -11,7 +11,7 @@ module RailsI18nterface
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.file_paths(locale)
|
14
|
-
Dir.glob(File.join(root_dir,
|
14
|
+
Dir.glob(File.join(root_dir, 'config', 'locales', '**', "#{locale}.yml"))
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.root_dir
|
@@ -21,11 +21,11 @@ module RailsI18nterface
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def keys
|
24
|
-
{locale => I18n.backend.send(:translations)[locale]}
|
24
|
+
{ locale => I18n.backend.send(:translations)[locale] }
|
25
25
|
end
|
26
26
|
|
27
27
|
def file_path
|
28
|
-
File.join(self.class.root_dir,
|
28
|
+
File.join(self.class.root_dir, 'config', 'locales', "#{locale}.yml")
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|