interpret 0.1.1 → 0.1.2
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/Gemfile +4 -0
- data/Rakefile +6 -0
- data/app/models/interpret/translation.rb +23 -15
- data/interpret.gemspec +1 -1
- data/lib/generators/interpret/setup_generator.rb +1 -3
- data/lib/interpret/capistrano.rb +15 -12
- data/lib/interpret/version.rb +1 -1
- data/public/stylesheets/folder.png +0 -0
- data/public/stylesheets/interpret_style.css +10 -22
- data/spec/database_helpers.rb +15 -0
- data/spec/models/translation_spec.rb +68 -0
- data/spec/spec_helper.rb +35 -0
- data/test_app/Capfile +4 -0
- data/test_app/Gemfile +2 -3
- data/test_app/config/deploy.rb +24 -0
- metadata +9 -14
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -16,7 +16,7 @@ module Interpret
|
|
16
16
|
# Generates a hash representing the tree structure of the translations
|
17
17
|
# for the given locale. It includes only "folders" in the sense of
|
18
18
|
# locale keys that includes some real translations, or other keys.
|
19
|
-
def get_tree(lang = I18n.
|
19
|
+
def get_tree(lang = I18n.default_locale)
|
20
20
|
t = arel_table
|
21
21
|
all_trans = locale(lang).select(t[:key]).where(t[:key].matches("%.%")).all
|
22
22
|
|
@@ -40,6 +40,9 @@ module Interpret
|
|
40
40
|
translations.each do |e|
|
41
41
|
LazyHash.lazy_add(res, "#{e.locale}.#{e.key}", e.value)
|
42
42
|
end
|
43
|
+
if res.keys.size != 1
|
44
|
+
raise IndexError, "Generated hash must have only one root key. Your translation data in datrabase may be corrupted."
|
45
|
+
end
|
43
46
|
res
|
44
47
|
end
|
45
48
|
|
@@ -152,24 +155,24 @@ module Interpret
|
|
152
155
|
files = Dir[Rails.root.join("config", "locales", "*.yml").to_s]
|
153
156
|
|
154
157
|
@languages = {}
|
155
|
-
@main = {}
|
156
158
|
files.each do |f|
|
157
159
|
ar = YAML.load_file f
|
158
160
|
lang = ar.keys.first
|
159
|
-
@languages
|
160
|
-
|
161
|
-
|
162
|
-
@
|
161
|
+
if @languages.has_key?(lang.to_s)
|
162
|
+
@languages[lang.to_s] = @languages[lang.to_s].deep_merge(ar.first[1])
|
163
|
+
else
|
164
|
+
@languages[lang.to_s] = ar.first[1]
|
163
165
|
end
|
164
166
|
end
|
165
167
|
|
168
|
+
@main = @languages[I18n.default_locale.to_s].clone
|
166
169
|
sync(@main)
|
167
170
|
end
|
168
171
|
|
169
172
|
private
|
170
173
|
def sync(hash, prefix = "", existing = nil)
|
171
174
|
if existing.nil?
|
172
|
-
translations = locale(
|
175
|
+
translations = locale(I18n.default_locale).all
|
173
176
|
existing = export(translations)
|
174
177
|
existing = existing.first[1] unless existing.empty?
|
175
178
|
end
|
@@ -180,7 +183,7 @@ module Interpret
|
|
180
183
|
if hash[x].kind_of?(Hash)
|
181
184
|
sync(hash[x], "#{prefix}#{x}.", existing[x])
|
182
185
|
else
|
183
|
-
old = locale(
|
186
|
+
old = locale(I18n.default_locale).find_by_key("#{prefix}#{x}")
|
184
187
|
|
185
188
|
unless old
|
186
189
|
# Creates the new entry
|
@@ -200,29 +203,34 @@ module Interpret
|
|
200
203
|
# Check if the the given key exists in all languages except @main. If
|
201
204
|
# not, create an entry.
|
202
205
|
def check_in_other_langs(key)
|
203
|
-
(@languages.keys - [
|
206
|
+
(@languages.keys - [I18n.default_locale]).each do |lang|
|
204
207
|
trans = locale(lang).find_by_key(key)
|
205
208
|
if trans.nil?
|
206
209
|
create! :locale => lang,
|
207
210
|
:key => key,
|
208
|
-
:value => ""
|
211
|
+
:value => "untranslated"
|
209
212
|
Interpret.logger.info "Created inexistent key [#{key}] for lang [#{lang}]"
|
210
213
|
end
|
211
214
|
end
|
212
215
|
end
|
213
216
|
|
214
|
-
def create_new_translation(
|
217
|
+
def create_new_translation(missing_key)
|
215
218
|
@languages.keys.each do |lang|
|
216
219
|
origin_hash = @languages[lang].clone
|
217
|
-
|
220
|
+
value = nil
|
221
|
+
missing_key.split(".")[0..-2].each do |key|
|
222
|
+
if origin_hash[key].nil?
|
223
|
+
value = "untranslated"
|
224
|
+
break
|
225
|
+
end
|
218
226
|
origin_hash = origin_hash[key]
|
219
227
|
end
|
220
|
-
value
|
228
|
+
value ||= origin_hash[missing_key.split(".").last]
|
221
229
|
create! :locale => lang,
|
222
|
-
:key =>
|
230
|
+
:key => missing_key,
|
223
231
|
:value => value
|
224
232
|
end
|
225
|
-
Interpret.logger.info "New key created [#{
|
233
|
+
Interpret.logger.info "New key created [#{missing_key}] for languages #{@languages.keys.inspect}"
|
226
234
|
end
|
227
235
|
|
228
236
|
def remove_unused_keys(hash, prefix = "")
|
data/interpret.gemspec
CHANGED
@@ -13,9 +13,7 @@ module Interpret
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def copy_images
|
16
|
-
copy_file "stylesheets/
|
17
|
-
copy_file "stylesheets/minus_icon.gif", "public/stylesheets/minus_icon.gif"
|
18
|
-
|
16
|
+
copy_file "stylesheets/folder.png", "public/stylesheets/folder.png"
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
data/lib/interpret/capistrano.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
]
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
namespace :interpret do
|
3
|
+
def rails_env
|
4
|
+
fetch(:rails_env, false) ? "RAILS_ENV=#{fetch(:rails_env)}" : ''
|
5
|
+
end
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
def roles
|
8
|
+
fetch(:delayed_job_server_role, :app)
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Update translations keys in database"
|
12
|
+
task :update, :roles => lambda {roles} do
|
13
|
+
run "cd #{current_path};#{rails_env} rake interpret:update"
|
14
|
+
end
|
12
15
|
end
|
13
|
-
end
|
14
16
|
|
15
|
-
after "deploy:update_code", "interpret:update"
|
17
|
+
after "deploy:update_code", "interpret:update"
|
18
|
+
end
|
data/lib/interpret/version.rb
CHANGED
Binary file
|
@@ -353,25 +353,26 @@ html body * dd.clear
|
|
353
353
|
}
|
354
354
|
|
355
355
|
body {
|
356
|
-
font-family: Helvetica;
|
356
|
+
font-family: "Lucida Grande", Helvetica;
|
357
357
|
}
|
358
358
|
|
359
359
|
#container {
|
360
360
|
border: .3em solid #333;
|
361
361
|
}
|
362
362
|
|
363
|
-
#header {
|
363
|
+
#header, .header {
|
364
364
|
padding: 0 1em;
|
365
365
|
margin-top: 1em;
|
366
366
|
color: #FFF;
|
367
367
|
background-color: #666;
|
368
|
+
border-radius: 5px;
|
368
369
|
}
|
369
370
|
|
370
371
|
table {
|
371
372
|
border-collapse:collapse;
|
372
373
|
width: 100%;
|
373
|
-
border-right: 1px solid #
|
374
|
-
border-left: 1px solid #
|
374
|
+
border-right: 1px solid #CCC;
|
375
|
+
border-left: 1px solid #CCC;
|
375
376
|
}
|
376
377
|
|
377
378
|
td, th {
|
@@ -388,7 +389,7 @@ td:last-child, td:last-child {
|
|
388
389
|
}
|
389
390
|
|
390
391
|
tr {
|
391
|
-
border-bottom:1px solid
|
392
|
+
border-bottom:1px solid #CCC;
|
392
393
|
cursor: hand;
|
393
394
|
cursor: pointer;
|
394
395
|
}
|
@@ -396,7 +397,6 @@ tr {
|
|
396
397
|
|
397
398
|
tr:hover {
|
398
399
|
background-color: #DDD;
|
399
|
-
height: 6.5em;
|
400
400
|
-moz-transition: background .4s linear;
|
401
401
|
-o-transition: background .4s linear;
|
402
402
|
-webkit-transition: background .4s linear;
|
@@ -415,7 +415,7 @@ tr.header:hover {
|
|
415
415
|
-webkit-transition: none;
|
416
416
|
height: 2em;
|
417
417
|
}
|
418
|
-
tr.header th {
|
418
|
+
tr.header th {;
|
419
419
|
color: #EEE;
|
420
420
|
}
|
421
421
|
|
@@ -506,7 +506,6 @@ tbody td a {
|
|
506
506
|
|
507
507
|
.best_in_place textarea {
|
508
508
|
width: 100%;
|
509
|
-
height: 6em;
|
510
509
|
border: transparent;
|
511
510
|
font-size: .9em;
|
512
511
|
}
|
@@ -516,17 +515,10 @@ tbody td a {
|
|
516
515
|
padding: .4em;
|
517
516
|
}
|
518
517
|
#tree_sidebar li {
|
519
|
-
list-style-image: url("/stylesheets/
|
518
|
+
list-style-image: url("/stylesheets/folder.png");
|
520
519
|
font-weight: normal;
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
#tree_sidebar li.current {
|
525
|
-
list-style-image: url("/stylesheets/minus_icon.gif");
|
526
|
-
}
|
527
|
-
|
528
|
-
#tree_sidebar li.current {
|
529
|
-
font-weight: bold;
|
520
|
+
padding-bottom: 5px;
|
521
|
+
letter-spacing: 1px;
|
530
522
|
}
|
531
523
|
|
532
524
|
#tree_sidebar a {
|
@@ -536,7 +528,3 @@ tbody td a {
|
|
536
528
|
#tree_sidebar a:hover {
|
537
529
|
text-decoration: underline;
|
538
530
|
}
|
539
|
-
|
540
|
-
#loading_sidebar {
|
541
|
-
display: none;
|
542
|
-
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module DatabaseHelpers
|
2
|
+
|
3
|
+
def migrate_database
|
4
|
+
silence_stream(STDOUT) do
|
5
|
+
ActiveRecord::Migrator.migrate File.expand_path('../../test_app/db/migrate/', __FILE__)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def drop_all_tables
|
10
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
11
|
+
ActiveRecord::Base.connection.drop_table(table)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Interpret::Translation do
|
4
|
+
|
5
|
+
let(:en_yml) {"""
|
6
|
+
en:
|
7
|
+
p1: Hello world!
|
8
|
+
folder1:
|
9
|
+
pr1: Hi
|
10
|
+
folder2:
|
11
|
+
pr1: Some other text here
|
12
|
+
folder3:
|
13
|
+
pr1: More phrases
|
14
|
+
sub:
|
15
|
+
name: This is a 2 level subfolder
|
16
|
+
subsub:
|
17
|
+
name: With another nested folder inside
|
18
|
+
other:
|
19
|
+
name: folder
|
20
|
+
"""
|
21
|
+
}
|
22
|
+
|
23
|
+
def file2db(string_file)
|
24
|
+
hash = YAML.load string_file
|
25
|
+
|
26
|
+
lang = hash.keys.first
|
27
|
+
records = Interpret::Translation.send(:parse_hash, hash.first[1], lang)
|
28
|
+
Interpret::Translation.transaction do
|
29
|
+
records.each {|x| x.save!}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe ".get_tree" do
|
34
|
+
it "should return a hash representing a tree folder structure of the i18n keys" do
|
35
|
+
file2db(en_yml)
|
36
|
+
Interpret::Translation.get_tree('en').should == {'index' => {
|
37
|
+
'folder1' => {},
|
38
|
+
'folder2' => {},
|
39
|
+
'folder3' => {
|
40
|
+
'sub' => {
|
41
|
+
'subsub' => {}
|
42
|
+
},
|
43
|
+
'other' => {}
|
44
|
+
}
|
45
|
+
}}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe ".export" do
|
50
|
+
it "should return a hash representing the yml locale file for the given translations" do
|
51
|
+
file2db(en_yml)
|
52
|
+
translations = Interpret::Translation.all
|
53
|
+
Interpret::Translation.export(translations).should == YAML.load(en_yml)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe ".import" do
|
58
|
+
pending
|
59
|
+
end
|
60
|
+
|
61
|
+
describe ".dump" do
|
62
|
+
pending
|
63
|
+
end
|
64
|
+
|
65
|
+
describe ".update" do
|
66
|
+
pending
|
67
|
+
end
|
68
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Configure Rails Envinronment
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
|
4
|
+
require File.expand_path('../../test_app/config/environment', __FILE__)
|
5
|
+
require "rails/test_help"
|
6
|
+
require "rspec/rails"
|
7
|
+
require "database_helpers"
|
8
|
+
|
9
|
+
ActionMailer::Base.delivery_method = :test
|
10
|
+
ActionMailer::Base.perform_deliveries = true
|
11
|
+
ActionMailer::Base.default_url_options[:host] = "test.com"
|
12
|
+
|
13
|
+
Rails.backtrace_cleaner.remove_silencers!
|
14
|
+
|
15
|
+
include DatabaseHelpers
|
16
|
+
# Run any available migration
|
17
|
+
puts 'Setting up database...'
|
18
|
+
drop_all_tables
|
19
|
+
migrate_database
|
20
|
+
|
21
|
+
# Load support files
|
22
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each{|f| require f}
|
23
|
+
|
24
|
+
|
25
|
+
RSpec.configure do |config|
|
26
|
+
# Remove this line if you don't want RSpec's should and should_not
|
27
|
+
# methods or matchers
|
28
|
+
require 'rspec/expectations'
|
29
|
+
|
30
|
+
config.include RSpec::Matchers
|
31
|
+
config.include DatabaseHelpers
|
32
|
+
|
33
|
+
# == Mock Framework
|
34
|
+
config.mock_with :rspec
|
35
|
+
end
|
data/test_app/Capfile
ADDED
data/test_app/Gemfile
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
require '../lib/interpret/capistrano'
|
2
|
+
|
3
|
+
set :application, "set your application name here"
|
4
|
+
set :repository, "set your repository location here"
|
5
|
+
|
6
|
+
set :scm, :subversion
|
7
|
+
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
|
8
|
+
|
9
|
+
role :web, "your web-server here" # Your HTTP server, Apache/etc
|
10
|
+
role :app, "your app-server here" # This may be the same as your `Web` server
|
11
|
+
role :db, "your primary db-server here", :primary => true # This is where Rails migrations will run
|
12
|
+
role :db, "your slave db-server here"
|
13
|
+
|
14
|
+
# If you are using Passenger mod_rails uncomment this:
|
15
|
+
# if you're still using the script/reapear helper you will need
|
16
|
+
# these http://github.com/rails/irs_process_scripts
|
17
|
+
|
18
|
+
# namespace :deploy do
|
19
|
+
# task :start do ; end
|
20
|
+
# task :stop do ; end
|
21
|
+
# task :restart, :roles => :app, :except => { :no_release => true } do
|
22
|
+
# run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
|
23
|
+
# end
|
24
|
+
# end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interpret
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 25
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
8
|
+
- 2
|
9
|
+
version: 0.1.2
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Roger Campos
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-02-
|
17
|
+
date: 2011-02-15 00:00:00 +01:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,7 +25,6 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ~>
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 1
|
30
28
|
segments:
|
31
29
|
- 3
|
32
30
|
- 0
|
@@ -42,7 +40,6 @@ dependencies:
|
|
42
40
|
requirements:
|
43
41
|
- - ~>
|
44
42
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 11
|
46
43
|
segments:
|
47
44
|
- 0
|
48
45
|
- 5
|
@@ -58,7 +55,6 @@ dependencies:
|
|
58
55
|
requirements:
|
59
56
|
- - ">="
|
60
57
|
- !ruby/object:Gem::Version
|
61
|
-
hash: 3
|
62
58
|
segments:
|
63
59
|
- 0
|
64
60
|
version: "0"
|
@@ -72,7 +68,6 @@ dependencies:
|
|
72
68
|
requirements:
|
73
69
|
- - ">="
|
74
70
|
- !ruby/object:Gem::Version
|
75
|
-
hash: 103
|
76
71
|
segments:
|
77
72
|
- 0
|
78
73
|
- 30
|
@@ -88,7 +83,6 @@ dependencies:
|
|
88
83
|
requirements:
|
89
84
|
- - ">="
|
90
85
|
- !ruby/object:Gem::Version
|
91
|
-
hash: -1876988247
|
92
86
|
segments:
|
93
87
|
- 3
|
94
88
|
- 0
|
@@ -104,7 +98,6 @@ dependencies:
|
|
104
98
|
requirements:
|
105
99
|
- - ">="
|
106
100
|
- !ruby/object:Gem::Version
|
107
|
-
hash: 21
|
108
101
|
segments:
|
109
102
|
- 0
|
110
103
|
- 1
|
@@ -118,9 +111,8 @@ dependencies:
|
|
118
111
|
requirement: &id007 !ruby/object:Gem::Requirement
|
119
112
|
none: false
|
120
113
|
requirements:
|
121
|
-
- -
|
114
|
+
- - ~>
|
122
115
|
- !ruby/object:Gem::Version
|
123
|
-
hash: 9
|
124
116
|
segments:
|
125
117
|
- 2
|
126
118
|
- 5
|
@@ -172,6 +164,10 @@ files:
|
|
172
164
|
- public/javascripts/jquery.purr.js
|
173
165
|
- public/stylesheets/folder.png
|
174
166
|
- public/stylesheets/interpret_style.css
|
167
|
+
- spec/database_helpers.rb
|
168
|
+
- spec/models/translation_spec.rb
|
169
|
+
- spec/spec_helper.rb
|
170
|
+
- test_app/Capfile
|
175
171
|
- test_app/Gemfile
|
176
172
|
- test_app/README
|
177
173
|
- test_app/Rakefile
|
@@ -186,6 +182,7 @@ files:
|
|
186
182
|
- test_app/config/application.rb
|
187
183
|
- test_app/config/boot.rb
|
188
184
|
- test_app/config/database.yml
|
185
|
+
- test_app/config/deploy.rb
|
189
186
|
- test_app/config/environment.rb
|
190
187
|
- test_app/config/environments/development.rb
|
191
188
|
- test_app/config/environments/production.rb
|
@@ -238,7 +235,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
238
235
|
requirements:
|
239
236
|
- - ">="
|
240
237
|
- !ruby/object:Gem::Version
|
241
|
-
hash: 3
|
242
238
|
segments:
|
243
239
|
- 0
|
244
240
|
version: "0"
|
@@ -247,7 +243,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
247
243
|
requirements:
|
248
244
|
- - ">="
|
249
245
|
- !ruby/object:Gem::Version
|
250
|
-
hash: 3
|
251
246
|
segments:
|
252
247
|
- 0
|
253
248
|
version: "0"
|