interpret 0.1.5 → 0.2.0
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.
- data/app/controllers/interpret/missing_translations_controller.rb +15 -0
- data/app/controllers/interpret/search_controller.rb +14 -6
- data/app/controllers/interpret/translations_controller.rb +5 -17
- data/app/models/interpret/expiration_observer.rb +3 -0
- data/app/models/interpret/translation.rb +8 -6
- data/app/views/interpret/missing_translations/index.html.erb +33 -0
- data/app/views/interpret/search/_blank_search.html.erb +32 -0
- data/app/views/interpret/search/{perform.html.erb → _filled_search.html.erb} +1 -1
- data/app/views/interpret/search/index.html.erb +5 -31
- data/app/views/interpret/translations/_listing.html.erb +3 -1
- data/app/views/layouts/interpret.html.erb +3 -1
- data/config/routes.rb +2 -4
- data/lib/interpret/version.rb +1 -1
- data/lib/tasks/interpret.rake +2 -2
- metadata +25 -24
@@ -0,0 +1,15 @@
|
|
1
|
+
class Interpret::MissingTranslationsController < Interpret::BaseController
|
2
|
+
def index
|
3
|
+
unless I18n.locale == I18n.default_locale
|
4
|
+
res = ActiveRecord::Base.connection.execute("select t.value, t.key from
|
5
|
+
translations t where
|
6
|
+
t.locale ='#{I18n.default_locale}'
|
7
|
+
and (select count(*) from
|
8
|
+
translations t2 where
|
9
|
+
t2.key = t.key and
|
10
|
+
t2.locale ='#{I18n.locale}') =
|
11
|
+
0")
|
12
|
+
@missing_translations = res.map{|x| {:ref_value => YAML.load(x["value"]), :key => x["key"]}}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,9 +1,17 @@
|
|
1
1
|
class Interpret::SearchController < Interpret::BaseController
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
def index
|
3
|
+
if request.post?
|
4
|
+
opts = {}
|
5
|
+
opts[:key] = params[:key] if params[:key].present?
|
6
|
+
opts[:value] = params[:value] if params[:value].present?
|
7
|
+
redirect_to interpret_search_url(opts)
|
8
|
+
else
|
9
|
+
if params[:key].present? || params[:value].present?
|
10
|
+
t = Interpret::Translation.arel_table
|
11
|
+
search_key = params[:key].present? ? params[:key].split(" ").map{|x| "%#{CGI.escape(x)}%"} : []
|
12
|
+
search_value = params[:value].present? ? params[:value].split(" ").map{|x| "%#{CGI.escape(x)}%"} : []
|
13
|
+
@translations = Interpret::Translation.locale(I18n.locale).where(t[:key].matches_all(search_key).or(t[:value].matches_all(search_value)) )
|
14
|
+
end
|
15
|
+
end
|
8
16
|
end
|
9
17
|
end
|
@@ -55,27 +55,15 @@ class Interpret::TranslationsController < Interpret::BaseController
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
def new
|
59
|
-
@reference = Interpret::Translation.find(params[:translation_id])
|
60
|
-
if @reference.locale === I18n.locale.to_s
|
61
|
-
redirect_to interpret_root_path
|
62
|
-
return
|
63
|
-
end
|
64
|
-
@translation = Interpret::Translation.new :locale => I18n.locale, :key => @reference.key
|
65
|
-
end
|
66
|
-
|
67
58
|
def create
|
68
|
-
@
|
69
|
-
if @reference.locale == I18n.locale.to_s
|
70
|
-
redirect_to interpret_root_path
|
71
|
-
return
|
72
|
-
end
|
73
|
-
@translation = Interpret::Translation.new params[:interpret_translation].merge(:locale => I18n.locale, :key => @reference.key)
|
59
|
+
@translation = Interpret::Translation.new params[:interpret_translation]
|
74
60
|
|
75
61
|
if @translation.save
|
76
|
-
|
62
|
+
flash[:notice] = "New translation created for #{@translation.key}"
|
63
|
+
redirect_to request.env["HTTP_REFERER"]
|
77
64
|
else
|
78
|
-
|
65
|
+
flash[:alert] = "Error when creating a new translation"
|
66
|
+
redirect_to request.env["HTTP_REFERER"]
|
79
67
|
end
|
80
68
|
end
|
81
69
|
|
@@ -2,7 +2,7 @@ module Interpret
|
|
2
2
|
|
3
3
|
class Translation < I18n::Backend::ActiveRecord::Translation
|
4
4
|
default_scope order('locale ASC')
|
5
|
-
|
5
|
+
validates_uniqueness_of :key, :scope => :locale
|
6
6
|
|
7
7
|
class << self
|
8
8
|
# Generates a hash representing the tree structure of the translations
|
@@ -32,7 +32,7 @@ module Interpret
|
|
32
32
|
translations.each do |e|
|
33
33
|
LazyHash.add(res, "#{e.locale}.#{e.key}", e.value)
|
34
34
|
end
|
35
|
-
if res.keys.size != 1
|
35
|
+
if res.any? && res.keys.size != 1
|
36
36
|
raise IndexError, "Generated hash must have only one root key. Your translation data in database may be corrupted."
|
37
37
|
end
|
38
38
|
res
|
@@ -58,7 +58,7 @@ module Interpret
|
|
58
58
|
records.each do |x|
|
59
59
|
if tr = locale(lang).find_by_key(x.key)
|
60
60
|
tr.value = x.value
|
61
|
-
tr.save
|
61
|
+
tr.save(:validate => false)
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -80,7 +80,7 @@ module Interpret
|
|
80
80
|
|
81
81
|
# TODO: Replace with activerecord-import bulk inserts
|
82
82
|
transaction do
|
83
|
-
records.each {|x| x.save
|
83
|
+
records.each {|x| x.save(:validate => false)}
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -196,7 +196,8 @@ module Interpret
|
|
196
196
|
trans = locale(lang).find_by_key(key)
|
197
197
|
if trans.nil?
|
198
198
|
if value = get_value_from_hash(@languages[lang], key)
|
199
|
-
|
199
|
+
foo = new( :locale => lang, :key => key, :value => value )
|
200
|
+
foo.save(:validate => false)
|
200
201
|
Interpret.logger.info "New key created [#{key}] for language [#{lang}]"
|
201
202
|
end
|
202
203
|
end
|
@@ -212,7 +213,8 @@ module Interpret
|
|
212
213
|
end
|
213
214
|
|
214
215
|
def create_new_translation(missing_key, main_value)
|
215
|
-
|
216
|
+
foo = new(:locale => I18n.default_locale, :key => missing_key, :value => main_value)
|
217
|
+
foo.save(:validate => false)
|
216
218
|
Interpret.logger.info "New key created [#{missing_key}] for language [#{I18n.default_locale}]"
|
217
219
|
|
218
220
|
check_in_other_langs(missing_key)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<% if I18n.locale == I18n.default_locale %>
|
2
|
+
<p>There can't be missing translations for the main language</p>
|
3
|
+
<% elsif @missing_translations.empty? %>
|
4
|
+
<p>There are no missing translations</p>
|
5
|
+
<% else %>
|
6
|
+
<p>There are <%= @missing_translations.size %> missing translations in [<%= I18n.locale %>]. You can
|
7
|
+
create them below and you can see the translation key and also the original
|
8
|
+
content in the reference language [ <%= I18n.default_locale %> ]
|
9
|
+
</p>
|
10
|
+
<table>
|
11
|
+
<thead>
|
12
|
+
<tr class="header">
|
13
|
+
<th>Key</th>
|
14
|
+
<th>Value in [ <%= I18n.default_locale %> ]</th>
|
15
|
+
<th>Your translation to [ <%= I18n.locale %> ]</th>
|
16
|
+
</tr>
|
17
|
+
</thead>
|
18
|
+
<% @missing_translations.each do |trans| %>
|
19
|
+
<tr>
|
20
|
+
<td><%= trans[:key] %></td>
|
21
|
+
<td><%= trans[:ref_value] %></td>
|
22
|
+
<td>
|
23
|
+
<%= form_for Interpret::Translation.new, :url => interpret_translations_path do |f| %>
|
24
|
+
<%= f.hidden_field "locale", :value => I18n.locale %>
|
25
|
+
<%= f.hidden_field "key", :value => trans[:key] %>
|
26
|
+
<%= f.text_area :value, :rows => 4, :cols => 60 %>
|
27
|
+
<%= submit_tag "Create" %>
|
28
|
+
<% end %>
|
29
|
+
</td>
|
30
|
+
</tr>
|
31
|
+
<% end %>
|
32
|
+
</table>
|
33
|
+
<% end %>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<% interpret_title "Interpret - Search" %>
|
2
|
+
|
3
|
+
<div id="header">
|
4
|
+
<h1>Search translations</h1>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div id="search">
|
8
|
+
<p>Enter a search term for the key and/or the value of the translation</p>
|
9
|
+
|
10
|
+
<%= form_tag interpret_search_path do %>
|
11
|
+
<%= label_tag "key", "Key value" %>
|
12
|
+
<br />
|
13
|
+
<%= text_field_tag "key" %>
|
14
|
+
<br />
|
15
|
+
|
16
|
+
<%= label_tag "value", "Translation text" %>
|
17
|
+
<br />
|
18
|
+
<%= text_field_tag "value" %>
|
19
|
+
<br />
|
20
|
+
|
21
|
+
<%= submit_tag "SEARCH" %>
|
22
|
+
|
23
|
+
<% end %>
|
24
|
+
|
25
|
+
<% content_for :sidebar do %>
|
26
|
+
<h2>Search</h2>
|
27
|
+
<p>
|
28
|
+
You can use this search feature to look into all the translations. Can be filtered by language, key and phrase.
|
29
|
+
</p>
|
30
|
+
<% end %>
|
31
|
+
</div>
|
32
|
+
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<%= @translations.size %> results found.
|
19
19
|
</p>
|
20
20
|
<div id="side_search">
|
21
|
-
<%= form_tag
|
21
|
+
<%= form_tag interpret_search_path do %>
|
22
22
|
<%= label_tag "key", "Key value" %>
|
23
23
|
<br />
|
24
24
|
<%= text_field_tag "key", params[:key] %>
|
@@ -1,31 +1,5 @@
|
|
1
|
-
<%
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
<div id="search">
|
8
|
-
<p>Enter a search term for the key and/or the value of the translation</p>
|
9
|
-
|
10
|
-
<%= form_tag interpret_search_for_path do %>
|
11
|
-
<%= label_tag "key", "Key value" %>
|
12
|
-
<br />
|
13
|
-
<%= text_field_tag "key" %>
|
14
|
-
<br />
|
15
|
-
|
16
|
-
<%= label_tag "value", "Translation text" %>
|
17
|
-
<br />
|
18
|
-
<%= text_field_tag "value" %>
|
19
|
-
<br />
|
20
|
-
|
21
|
-
<%= submit_tag "SEARCH" %>
|
22
|
-
|
23
|
-
<% end %>
|
24
|
-
|
25
|
-
<% content_for :sidebar do %>
|
26
|
-
<h2>Search</h2>
|
27
|
-
<p>
|
28
|
-
You can use this search feature to look into all the translations. Can be filtered by language, key and phrase.
|
29
|
-
</p>
|
30
|
-
<% end %>
|
31
|
-
</div>
|
1
|
+
<% unless @translations %>
|
2
|
+
<%= render "blank_search" %>
|
3
|
+
<% else %>
|
4
|
+
<%= render "filled_search" %>
|
5
|
+
<% end %>
|
@@ -2,6 +2,7 @@
|
|
2
2
|
<thead>
|
3
3
|
<tr class="header">
|
4
4
|
<% if @references %>
|
5
|
+
<th>Key</th>
|
5
6
|
<th>Master translation [<%= I18n.default_locale %>]</th>
|
6
7
|
<% else %>
|
7
8
|
<th>Key</th>
|
@@ -39,6 +40,7 @@
|
|
39
40
|
<% @references.each do |x| %>
|
40
41
|
<% trans = @translations.detect{|y| y.key == x.key} %>
|
41
42
|
<tr<%= " id='translation_#{trans.id}'" if trans %><%= " class='protected'" if x.protected %>>
|
43
|
+
<td style='width:5%'><%= x.key %></td>
|
42
44
|
<td style='width:50%'><%= x.value %></td>
|
43
45
|
<td style='width:50%'>
|
44
46
|
<% if trans %>
|
@@ -48,7 +50,7 @@
|
|
48
50
|
:activator => "#translation_#{trans.id}",
|
49
51
|
:sanitize => false %>
|
50
52
|
<% else %>
|
51
|
-
<%= link_to "
|
53
|
+
<%= link_to "Create this missing translation", interpret_missing_translations_path %>
|
52
54
|
<% end %>
|
53
55
|
</td>
|
54
56
|
</tr>
|
@@ -10,7 +10,8 @@
|
|
10
10
|
<% unless @interpret_user && !@interpret_admin %>
|
11
11
|
<%= interpret_section_link_to "Tools", interpret_tools_path %> |
|
12
12
|
<% end %>
|
13
|
-
<%= interpret_section_link_to "Search", interpret_search_path %>
|
13
|
+
<%= interpret_section_link_to "Search", interpret_search_path %> |
|
14
|
+
<%= interpret_section_link_to "Missing translations", interpret_missing_translations_path %>
|
14
15
|
<hr />
|
15
16
|
</div>
|
16
17
|
<div class="menu grid_4">
|
@@ -18,6 +19,7 @@
|
|
18
19
|
<% Interpret::Translation.available_locales.each do |locale| %>
|
19
20
|
<% opts = {:locale => locale} %>
|
20
21
|
<% opts[:key] = params[:key] if params[:key] %>
|
22
|
+
<% opts[:value] = params[:value] if params[:value] %>
|
21
23
|
<%= link_to locale, opts %>
|
22
24
|
<% end %>
|
23
25
|
<hr />
|
data/config/routes.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
scope Interpret.scope do
|
3
3
|
namespace :interpret do
|
4
|
-
resources :translations, :only => [:edit, :update] do
|
5
|
-
resources :translations, :only => [:new, :create]
|
6
|
-
|
4
|
+
resources :translations, :only => [:edit, :update, :create] do
|
7
5
|
collection do
|
8
6
|
get :live_edit
|
9
7
|
end
|
@@ -19,7 +17,7 @@ Rails.application.routes.draw do
|
|
19
17
|
end
|
20
18
|
|
21
19
|
match "search", :to => "search#index"
|
22
|
-
|
20
|
+
resources :missing_translations
|
23
21
|
|
24
22
|
root :to => "translations#index"
|
25
23
|
end
|
data/lib/interpret/version.rb
CHANGED
data/lib/tasks/interpret.rake
CHANGED
@@ -2,12 +2,12 @@ namespace :interpret do
|
|
2
2
|
desc 'Copy all the translations from config/locales/*.yml into DB backend'
|
3
3
|
task :dump => :environment do
|
4
4
|
Interpret::Translation.dump
|
5
|
-
eval(Interpret.sweeper.classify).instance.send(:
|
5
|
+
eval(Interpret.sweeper.classify).instance.send(:expire_cache_all) if Interpret.sweeper
|
6
6
|
end
|
7
7
|
|
8
8
|
desc 'Synchronize the keys used in db backend with the ones on *.yml files'
|
9
9
|
task :update => :environment do
|
10
10
|
Interpret::Translation.update
|
11
|
-
eval(Interpret.sweeper.classify).instance.send(:
|
11
|
+
eval(Interpret.sweeper.classify).instance.send(:expire_cache_all) if Interpret.sweeper
|
12
12
|
end
|
13
13
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interpret
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Roger Campos
|
@@ -15,13 +15,12 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-10-07 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: rails
|
23
22
|
prerelease: false
|
24
|
-
|
23
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
24
|
none: false
|
26
25
|
requirements:
|
27
26
|
- - ~>
|
@@ -33,11 +32,11 @@ dependencies:
|
|
33
32
|
- 3
|
34
33
|
version: 3.0.3
|
35
34
|
type: :runtime
|
36
|
-
|
35
|
+
requirement: *id001
|
37
36
|
- !ruby/object:Gem::Dependency
|
38
37
|
name: i18n
|
39
38
|
prerelease: false
|
40
|
-
|
39
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
41
40
|
none: false
|
42
41
|
requirements:
|
43
42
|
- - ~>
|
@@ -49,11 +48,11 @@ dependencies:
|
|
49
48
|
- 0
|
50
49
|
version: 0.5.0
|
51
50
|
type: :runtime
|
52
|
-
|
51
|
+
requirement: *id002
|
53
52
|
- !ruby/object:Gem::Dependency
|
54
53
|
name: i18n-active_record
|
55
54
|
prerelease: false
|
56
|
-
|
55
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
57
56
|
none: false
|
58
57
|
requirements:
|
59
58
|
- - ">="
|
@@ -63,11 +62,11 @@ dependencies:
|
|
63
62
|
- 0
|
64
63
|
version: "0"
|
65
64
|
type: :runtime
|
66
|
-
|
65
|
+
requirement: *id003
|
67
66
|
- !ruby/object:Gem::Dependency
|
68
67
|
name: ya2yaml
|
69
68
|
prerelease: false
|
70
|
-
|
69
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
71
70
|
none: false
|
72
71
|
requirements:
|
73
72
|
- - ">="
|
@@ -79,11 +78,11 @@ dependencies:
|
|
79
78
|
- 0
|
80
79
|
version: 0.30.0
|
81
80
|
type: :runtime
|
82
|
-
|
81
|
+
requirement: *id004
|
83
82
|
- !ruby/object:Gem::Dependency
|
84
83
|
name: best_in_place
|
85
84
|
prerelease: false
|
86
|
-
|
85
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
87
86
|
none: false
|
88
87
|
requirements:
|
89
88
|
- - ">="
|
@@ -95,11 +94,11 @@ dependencies:
|
|
95
94
|
- 7
|
96
95
|
version: 0.1.7
|
97
96
|
type: :runtime
|
98
|
-
|
97
|
+
requirement: *id005
|
99
98
|
- !ruby/object:Gem::Dependency
|
100
99
|
name: lazyhash
|
101
100
|
prerelease: false
|
102
|
-
|
101
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
103
102
|
none: false
|
104
103
|
requirements:
|
105
104
|
- - ">="
|
@@ -111,11 +110,11 @@ dependencies:
|
|
111
110
|
- 1
|
112
111
|
version: 0.1.1
|
113
112
|
type: :runtime
|
114
|
-
|
113
|
+
requirement: *id006
|
115
114
|
- !ruby/object:Gem::Dependency
|
116
115
|
name: rspec-rails
|
117
116
|
prerelease: false
|
118
|
-
|
117
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
119
118
|
none: false
|
120
119
|
requirements:
|
121
120
|
- - ~>
|
@@ -126,7 +125,7 @@ dependencies:
|
|
126
125
|
- 5
|
127
126
|
version: "2.5"
|
128
127
|
type: :development
|
129
|
-
|
128
|
+
requirement: *id007
|
130
129
|
description: Manage your app translations with an i18n active_record backend
|
131
130
|
email:
|
132
131
|
- roger@itnig.net
|
@@ -142,13 +141,16 @@ files:
|
|
142
141
|
- README.md
|
143
142
|
- Rakefile
|
144
143
|
- app/controllers/interpret/base_controller.rb
|
144
|
+
- app/controllers/interpret/missing_translations_controller.rb
|
145
145
|
- app/controllers/interpret/search_controller.rb
|
146
146
|
- app/controllers/interpret/tools_controller.rb
|
147
147
|
- app/controllers/interpret/translations_controller.rb
|
148
148
|
- app/models/interpret/expiration_observer.rb
|
149
149
|
- app/models/interpret/translation.rb
|
150
|
+
- app/views/interpret/missing_translations/index.html.erb
|
151
|
+
- app/views/interpret/search/_blank_search.html.erb
|
152
|
+
- app/views/interpret/search/_filled_search.html.erb
|
150
153
|
- app/views/interpret/search/index.html.erb
|
151
|
-
- app/views/interpret/search/perform.html.erb
|
152
154
|
- app/views/interpret/tools/index.html.erb
|
153
155
|
- app/views/interpret/translations/_listing.html.erb
|
154
156
|
- app/views/interpret/translations/index.html.erb
|
@@ -261,7 +263,6 @@ files:
|
|
261
263
|
- test_app/public/stylesheets/private.css
|
262
264
|
- test_app/script/rails
|
263
265
|
- test_app/vendor/plugins/.gitkeep
|
264
|
-
has_rdoc: true
|
265
266
|
homepage: https://github.com/rogercampos/interpret
|
266
267
|
licenses: []
|
267
268
|
|
@@ -291,7 +292,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
291
292
|
requirements: []
|
292
293
|
|
293
294
|
rubyforge_project: interpret
|
294
|
-
rubygems_version: 1.
|
295
|
+
rubygems_version: 1.8.6
|
295
296
|
signing_key:
|
296
297
|
specification_version: 3
|
297
298
|
summary: Manage your app translations with an i18n active_record backend
|