exvo_globalize 0.3.1 → 0.3.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/app/controllers/globalize_translations_controller.rb +27 -4
- data/app/models/globalize_translation.rb +1 -3
- data/app/views/globalize_translations/list.html.haml +11 -0
- data/app/views/layouts/exvo_globalize.html.haml +40 -0
- data/config/routes.rb +1 -0
- data/lib/exvo_globalize/backend/chain.rb +1 -1
- data/lib/exvo_globalize/backend/flatten.rb +2 -2
- data/lib/exvo_globalize/backend/globalize_store.rb +9 -10
- data/lib/exvo_globalize/engine.rb +6 -0
- data/lib/exvo_globalize/globalize_app.rb +1 -1
- data/lib/exvo_globalize/helpers.rb +32 -0
- data/lib/exvo_globalize/version.rb +1 -1
- data/lib/exvo_globalize.rb +1 -0
- data/lib/tasks/dump.rake +2 -6
- data/spec/controllers/globalize_translations_controller_spec.rb +46 -5
- data/spec/exvo_globalize/flatten_spec.rb +7 -7
- data/spec/exvo_globalize/globalize_store_spec.rb +15 -0
- data/spec/models/globalize_translation_spec.rb +1 -1
- metadata +6 -4
@@ -8,17 +8,40 @@ class GlobalizeTranslationsController < ApplicationController
|
|
8
8
|
respond_to :html, :json
|
9
9
|
|
10
10
|
def show
|
11
|
-
# returns {"default_locale":"en","pl":{"hello.world":"Witaj \u015bwiecie","hello.earth":"Witaj ziemio"},"en":{"hello.world":"Hello world","hello.earth":"Hello Earth"}}
|
12
11
|
@translations = I18n.backend.available_app_translations.merge({ :default_locale => I18n.default_locale })
|
13
12
|
respond_with @translations
|
14
13
|
end
|
15
14
|
|
15
|
+
def list
|
16
|
+
@languages = I18n.backend.available_locales.sort_by(&:to_s)
|
17
|
+
|
18
|
+
hash = case params[:type]
|
19
|
+
when "yaml-app"
|
20
|
+
I18n.backend.available_app_translations
|
21
|
+
when "yaml"
|
22
|
+
I18n.backend.simple.available_translations
|
23
|
+
when "db"
|
24
|
+
I18n.backend.globalize_store.available_translations
|
25
|
+
else
|
26
|
+
I18n.backend.available_translations
|
27
|
+
end
|
28
|
+
|
29
|
+
@translations = params[:locale].present? ? { params[:locale].to_sym => hash[params[:locale].to_sym] } : hash
|
30
|
+
end
|
31
|
+
|
16
32
|
def update
|
17
|
-
|
18
|
-
|
33
|
+
translations = @globalize_app.fetch_translations
|
34
|
+
|
35
|
+
if translations.present? and !translations.has_key?("errors")
|
36
|
+
if I18n.backend.store_nested_translations(translations)
|
37
|
+
flash.now[:notice] = 'Translations updated'
|
38
|
+
else
|
39
|
+
flash.now[:alert] = 'There was a problem while updating translations'
|
40
|
+
end
|
19
41
|
else
|
20
|
-
flash.now[:alert] =
|
42
|
+
flash.now[:alert] = "There was a problem while fetching translations: #{translations["errors"].to_s.downcase}"
|
21
43
|
end
|
44
|
+
|
22
45
|
render :show
|
23
46
|
end
|
24
47
|
|
@@ -2,9 +2,7 @@ class GlobalizeTranslation < ActiveRecord::Base
|
|
2
2
|
|
3
3
|
# based on https://github.com/svenfuchs/i18n-active_record/blob/master/lib/i18n/backend/active_record/translation.rb
|
4
4
|
|
5
|
-
|
6
|
-
scoped(:conditions => { :locale => locale.to_s })
|
7
|
-
end
|
5
|
+
scope :ordered, :order => :key
|
8
6
|
|
9
7
|
def self.lookup(keys)
|
10
8
|
column_name = connection.quote_column_name('key')
|
@@ -0,0 +1,11 @@
|
|
1
|
+
= form_tag list_globalize_translations_path, :class => "search", :method => :get do
|
2
|
+
%p
|
3
|
+
I18n backend:
|
4
|
+
= select_tag "type", options_for_select([ ["Globalize store (database)", "db"], ["YAML (application)", "yaml-app"], ["YAML (application and gems)", "yaml"] ], :selected => params[:type]), :include_blank => "All"
|
5
|
+
|
6
|
+
Language:
|
7
|
+
= select_tag "locale", options_for_select(@languages, :selected => params[:locale]), :include_blank => "All"
|
8
|
+
|
9
|
+
= submit_tag "show"
|
10
|
+
|
11
|
+
= raw(HashToHTML(@translations)) if @translations.present?
|
@@ -4,6 +4,10 @@
|
|
4
4
|
%title= "Exvo Globalize translations"
|
5
5
|
%meta{ :name => "robots", :content => "noindex, nofollow" }
|
6
6
|
:css
|
7
|
+
html, body, fieldset, form, input, select, textarea {
|
8
|
+
font: 13px/130% "Lucida Grande", Tahoma, Verdana, Helvetica, Arial, sans-serif;
|
9
|
+
}
|
10
|
+
|
7
11
|
p.request_host {
|
8
12
|
background: #f9fdf1;
|
9
13
|
border: 1px solid #d2e1b8;
|
@@ -22,7 +26,43 @@
|
|
22
26
|
margin: 0.2em auto;
|
23
27
|
}
|
24
28
|
|
29
|
+
form p {
|
30
|
+
background: #f9fdf1;
|
31
|
+
border: 1px solid #d2e1b8;
|
32
|
+
margin: 1em 0;
|
33
|
+
padding: 1em 1.2em;
|
34
|
+
width: 600px;
|
35
|
+
}
|
36
|
+
|
37
|
+
select {
|
38
|
+
margin-right: 12px;
|
39
|
+
}
|
40
|
+
|
41
|
+
ul {
|
42
|
+
margin-bottom: 1em;
|
43
|
+
padding-left: 1em;
|
44
|
+
}
|
45
|
+
|
46
|
+
li {
|
47
|
+
color: #eee;
|
48
|
+
list-style: disc;
|
49
|
+
}
|
50
|
+
|
51
|
+
li strong {
|
52
|
+
color: #509e43;
|
53
|
+
margin-right: 0.2em;
|
54
|
+
}
|
55
|
+
|
56
|
+
li span {
|
57
|
+
color: black;
|
58
|
+
}
|
59
|
+
|
25
60
|
%body
|
61
|
+
%p
|
62
|
+
= link_to 'Main page', globalize_translations_path
|
63
|
+
|
|
64
|
+
= link_to 'Translations list', list_globalize_translations_path
|
65
|
+
|
26
66
|
%p.request_host
|
27
67
|
Request host:
|
28
68
|
%span= @globalize_app.request_host
|
data/config/routes.rb
CHANGED
@@ -7,7 +7,7 @@ module I18n
|
|
7
7
|
# returning a combined hash with translations from all chained backends
|
8
8
|
def available_translations
|
9
9
|
# reverse, so that the translations from the first backend (GlobalizeStore) overwrite/overshadow others
|
10
|
-
@available_translations ||= backends.map { |backend| backend.available_translations }.reverse.inject(&:
|
10
|
+
@available_translations ||= backends.map { |backend| backend.available_translations }.reverse.inject(&:deep_merge)
|
11
11
|
end
|
12
12
|
|
13
13
|
# Return a hash only with Application translations
|
@@ -9,9 +9,9 @@ module I18n
|
|
9
9
|
hash.map do |main_key, main_value|
|
10
10
|
main_key.to_s.split(".").reverse.inject(main_value) do |value, key|
|
11
11
|
if value.is_a?(Hash)
|
12
|
-
{ key.
|
12
|
+
{ key.to_sym => nest_translations(value) }
|
13
13
|
else
|
14
|
-
{ key.
|
14
|
+
{ key.to_sym => value }
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end.inject(&:deep_merge)
|
@@ -13,15 +13,14 @@ module I18n
|
|
13
13
|
GlobalizeTranslation.available_locales
|
14
14
|
end
|
15
15
|
|
16
|
-
# returns a Hash with all translations
|
17
|
-
#
|
16
|
+
# returns a nested Hash with all translations
|
17
|
+
# { :en => { :hello => { :world => "Hello world", :earth => "Hello Earth" } } } ...
|
18
18
|
def available_translations(locale = nil)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
19
|
+
translations = locale.present? ? GlobalizeTranslation.where(:locale => locale).ordered : GlobalizeTranslation.ordered
|
20
|
+
|
21
|
+
translations.inject({}) do |result, element|
|
22
|
+
result.deep_merge( { element["locale"].to_sym => nest_translations(element["key"] => element["value"]) } )
|
23
|
+
end
|
25
24
|
end
|
26
25
|
|
27
26
|
def store_translations(locale, data, options = {})
|
@@ -32,7 +31,7 @@ module I18n
|
|
32
31
|
end
|
33
32
|
|
34
33
|
def store_flatten_translation(locale, key, value)
|
35
|
-
GlobalizeTranslation.
|
34
|
+
GlobalizeTranslation.where(:locale => locale).lookup(expand_keys(key)).delete_all
|
36
35
|
GlobalizeTranslation.create(:locale => locale.to_s, :key => key.to_s, :value => value)
|
37
36
|
end
|
38
37
|
|
@@ -40,7 +39,7 @@ module I18n
|
|
40
39
|
|
41
40
|
def lookup(locale, key, scope = [], options = {})
|
42
41
|
key = normalize_flat_keys(locale, key, scope, options[:separator])
|
43
|
-
result = GlobalizeTranslation.
|
42
|
+
result = GlobalizeTranslation.where(:locale => locale).lookup(key).all
|
44
43
|
|
45
44
|
if result.empty?
|
46
45
|
nil
|
@@ -20,5 +20,11 @@ module ExvoGlobalize
|
|
20
20
|
# GlobalizeStore first (database backed), YAML files second (Simple backend, the default one)
|
21
21
|
I18n.backend = I18n::Backend::Chain.new(I18n::Backend::GlobalizeStore.new, I18n.backend)
|
22
22
|
end
|
23
|
+
|
24
|
+
initializer "exvo_globalize.configure_helpers" do |app|
|
25
|
+
ActiveSupport.on_load(:action_view) do
|
26
|
+
ActionView::Base.send :include, ExvoGlobalize::Helpers
|
27
|
+
end
|
28
|
+
end
|
23
29
|
end
|
24
30
|
end
|
@@ -24,7 +24,7 @@ class GlobalizeApp
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def globalize_host
|
27
|
-
Rails.env.production? ? "globalize.exvo.com" : "globalize.exvo.co"
|
27
|
+
Rails.env.production? or ENV['GLOBALIZE_USE_PRODUCTION_SERVER'] == 'true' ? "globalize.exvo.com" : "globalize.exvo.co"
|
28
28
|
end
|
29
29
|
|
30
30
|
def translations_uri
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ExvoGlobalize
|
2
|
+
module Helpers
|
3
|
+
|
4
|
+
# Prints nested Hash as a nested <ul> and <li> tags
|
5
|
+
# - keys are wrapped in <strong> tags
|
6
|
+
# - values are wrapped in <span> tags
|
7
|
+
def HashToHTML(hash, opts = {})
|
8
|
+
return if !hash.is_a?(Hash)
|
9
|
+
|
10
|
+
indent_level = opts.fetch(:indent_level) { 0 }
|
11
|
+
|
12
|
+
out = " " * indent_level + "<ul>\n"
|
13
|
+
|
14
|
+
hash.each do |key, value|
|
15
|
+
out += " " * (indent_level + 2) + "<li><strong>#{key}:</strong>"
|
16
|
+
|
17
|
+
if value.is_a?(Hash)
|
18
|
+
out += "\n" + HashToHTML(value, :indent_level => indent_level + 2) + " " * (indent_level + 2) + "</li>\n"
|
19
|
+
elsif value.is_a?(Array)
|
20
|
+
out += " <span>[ #{value.join(', ')} ]</span></li>\n"
|
21
|
+
elsif value.is_a?(Proc)
|
22
|
+
out += " <span>" + CGI::escapeHTML(value.to_s) + "</span></li>\n"
|
23
|
+
else
|
24
|
+
out += " <span>#{value}</span></li>\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
out += " " * indent_level + "</ul>\n"
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
data/lib/exvo_globalize.rb
CHANGED
@@ -5,6 +5,7 @@ require 'exvo_globalize/backend/flatten'
|
|
5
5
|
require "exvo_globalize/backend/globalize_store"
|
6
6
|
require "exvo_globalize/backend/simple"
|
7
7
|
require 'exvo_globalize/globalize_app'
|
8
|
+
require 'exvo_globalize/helpers'
|
8
9
|
require 'haml'
|
9
10
|
require 'httparty'
|
10
11
|
require 'awesome_print'
|
data/lib/tasks/dump.rake
CHANGED
@@ -2,16 +2,12 @@ namespace :"globalize:translations:dump" do
|
|
2
2
|
desc "Dump GlobalizeStore I18n translations as YAML"
|
3
3
|
task :yaml => :environment do
|
4
4
|
puts "Dumping translations as YAML..."
|
5
|
-
|
6
|
-
translations = backend.available_translations
|
7
|
-
puts backend.nest_translations(translations).ya2yaml
|
5
|
+
puts I18n.backend.globalize_store.available_translations.ya2yaml
|
8
6
|
end
|
9
7
|
|
10
8
|
desc "Dump GlobalizeStore I18n translations as Ruby Hash"
|
11
9
|
task :ruby => :environment do
|
12
10
|
puts "Dumping translations as Ruby Hash..."
|
13
|
-
|
14
|
-
translations = backend.available_translations
|
15
|
-
ap backend.nest_translations(translations), { :plain => true, :indent => 2, :sorted_hash_keys => true }
|
11
|
+
ap I18n.backend.globalize_store.available_translations, { :plain => true, :indent => 2, :sorted_hash_keys => true }
|
16
12
|
end
|
17
13
|
end
|
@@ -58,11 +58,7 @@ describe GlobalizeTranslationsController do
|
|
58
58
|
let(:intro) { "Introduction" }
|
59
59
|
let(:translations) { { :en => { :intro => { :title => intro } } } }
|
60
60
|
|
61
|
-
before
|
62
|
-
controller.stub!(:require_admin).and_return(true)
|
63
|
-
GlobalizeApp.any_instance.stub(:fetch_translations) { translations }
|
64
|
-
put :update
|
65
|
-
end
|
61
|
+
before { fetch_translations(translations) }
|
66
62
|
|
67
63
|
it "updates the translations" do
|
68
64
|
I18n.t(:title, :scope => :intro).should eq(intro)
|
@@ -77,6 +73,51 @@ describe GlobalizeTranslationsController do
|
|
77
73
|
end
|
78
74
|
end
|
79
75
|
|
76
|
+
describe "PUT :update with error from Globalize" do
|
77
|
+
let(:message) { "Not found" }
|
78
|
+
let(:translations) { { "errors" => message } }
|
79
|
+
|
80
|
+
before { fetch_translations(translations) }
|
81
|
+
|
82
|
+
it "sets a flash alert" do
|
83
|
+
flash[:alert].should_not be_empty
|
84
|
+
end
|
85
|
+
|
86
|
+
it "displays a flash alert" do
|
87
|
+
page.should have_selector('p.alert')
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "GET :list" do
|
92
|
+
before do
|
93
|
+
@title = Factory(:i18n_title)
|
94
|
+
controller.stub!(:require_admin).and_return(true)
|
95
|
+
|
96
|
+
# invalidate #available_translations cache before each run
|
97
|
+
I18n.backend.instance_variable_set(:@available_translations, nil)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "displays all available translations" do
|
101
|
+
get :list
|
102
|
+
page.should have_selector('li span', :text => @title.value)
|
103
|
+
page.should have_selector('li span', :text => 'YAML Nested Title')
|
104
|
+
end
|
105
|
+
|
106
|
+
it "displays available translations in the GlobalizeStore backend" do
|
107
|
+
get :list, { :type => 'db', :locale => 'en' }
|
108
|
+
page.should have_selector('li span', :text => @title.value)
|
109
|
+
page.should_not have_selector('li span', :text => 'YAML Nested Title')
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def fetch_translations(translations_stub)
|
118
|
+
controller.stub!(:require_admin).and_return(true)
|
119
|
+
GlobalizeApp.any_instance.stub(:fetch_translations) { translations_stub }
|
120
|
+
put :update
|
80
121
|
end
|
81
122
|
|
82
123
|
end
|
@@ -5,18 +5,18 @@ describe ExvoGlobalize do
|
|
5
5
|
let(:backend) { I18n.backend.globalize_store }
|
6
6
|
|
7
7
|
it "should not change a normal hash" do
|
8
|
-
hash = {
|
8
|
+
hash = { :hello => "Hello", :world => "World" }
|
9
9
|
backend.nest_translations(hash).should eq(hash)
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should not change a nested hash" do
|
13
|
-
nested_hash = {
|
13
|
+
nested_hash = { :en => { :hello => "Hello World!", :world => "World!" } }
|
14
14
|
backend.nest_translations(nested_hash).should eq(nested_hash)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should nest a simple flatten hash" do
|
18
18
|
hash = { "hello.world" => "Hello World!" }
|
19
|
-
nested_hash = {
|
19
|
+
nested_hash = { :hello => { :world => "Hello World!" } }
|
20
20
|
backend.nest_translations(hash).should eq(nested_hash)
|
21
21
|
end
|
22
22
|
|
@@ -29,10 +29,10 @@ describe ExvoGlobalize do
|
|
29
29
|
}
|
30
30
|
|
31
31
|
nested_hash = {
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
:en => {
|
33
|
+
:hello => {
|
34
|
+
:world => "Hello World!",
|
35
|
+
:earth => "Hello Earth!"
|
36
36
|
}
|
37
37
|
}
|
38
38
|
}
|
@@ -6,6 +6,9 @@ describe ExvoGlobalize do
|
|
6
6
|
let(:i18n_nested_header) { Factory(:i18n_nested_header) }
|
7
7
|
let(:i18n_title) { Factory(:i18n_title) }
|
8
8
|
|
9
|
+
# invalidate #available_translations cache before each run
|
10
|
+
before { I18n.backend.instance_variable_set(:@available_translations, nil) }
|
11
|
+
|
9
12
|
it "respects the default_locale setting" do
|
10
13
|
I18n.default_locale.should eq(:en)
|
11
14
|
end
|
@@ -57,10 +60,22 @@ describe ExvoGlobalize do
|
|
57
60
|
I18n.backend.simple.available_translations[:en][:yaml][:title].should eq('YAML Nested Title')
|
58
61
|
end
|
59
62
|
|
63
|
+
it "lists available translations from the GlobalizeStore backend" do
|
64
|
+
i18n_nested_header.value.should eq(I18n.backend.globalize_store.available_translations[:en][:nested][:header])
|
65
|
+
end
|
66
|
+
|
60
67
|
it "lists available app translations" do
|
61
68
|
I18n.backend.available_app_translations[:en][:helpers][:select].has_key?(:prompt).should be_true
|
62
69
|
end
|
63
70
|
|
71
|
+
it "lists all available translations" do
|
72
|
+
I18n.backend.available_translations[:en][:yaml][:title].should eql('YAML Nested Title')
|
73
|
+
end
|
74
|
+
|
75
|
+
it "lists all available translations prioritizing the GlobalizeStore backend" do
|
76
|
+
i18n_title.value.should eql(I18n.backend.available_translations[:en][:title])
|
77
|
+
end
|
78
|
+
|
64
79
|
it "excludes fixtures from app_translations and does so without breaking the I18n.load_path" do
|
65
80
|
I18n.backend.available_app_translations[:en].has_key?(:title).should be_false
|
66
81
|
I18n.backend.available_translations[:en].has_key?(:title).should be_true
|
@@ -14,7 +14,7 @@ describe GlobalizeTranslation do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "returns a translation for scoped locale" do
|
17
|
-
i18n_title.value.should eq(GlobalizeTranslation.locale
|
17
|
+
i18n_title.value.should eq(GlobalizeTranslation.where(:locale => :en).lookup(:title).first.value)
|
18
18
|
end
|
19
19
|
|
20
20
|
it "lists available locales" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exvo_globalize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 2
|
10
|
+
version: 0.3.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "Pawe\xC5\x82 Go\xC5\x9Bcicki"
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-09-06 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -275,6 +275,7 @@ files:
|
|
275
275
|
- app/controllers/globalize_translations_controller.rb
|
276
276
|
- app/models/globalize_translation.rb
|
277
277
|
- app/views/globalize_translations/_flash_messages.html.haml
|
278
|
+
- app/views/globalize_translations/list.html.haml
|
278
279
|
- app/views/globalize_translations/show.html.haml
|
279
280
|
- app/views/layouts/exvo_globalize.html.haml
|
280
281
|
- config/locales/ar.yml
|
@@ -339,6 +340,7 @@ files:
|
|
339
340
|
- lib/exvo_globalize/backend/simple.rb
|
340
341
|
- lib/exvo_globalize/engine.rb
|
341
342
|
- lib/exvo_globalize/globalize_app.rb
|
343
|
+
- lib/exvo_globalize/helpers.rb
|
342
344
|
- lib/exvo_globalize/version.rb
|
343
345
|
- lib/generators/exvo_globalize/exvo_globalize_generator.rb
|
344
346
|
- lib/generators/exvo_globalize/templates/migration.rb
|