tml-rails 4.3.6 → 4.3.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 31518cae75a56656469869252dc6393c4685f142
4
- data.tar.gz: 99b866f3875844de045df3cdd2a2b9875c29d5a0
3
+ metadata.gz: 9326f9cd017dbc9d697e2c7dab50c0ff2d70c41b
4
+ data.tar.gz: 1898fcb898316d57b4de91356a66524dd18c5a4c
5
5
  SHA512:
6
- metadata.gz: 63d6f040d7c11669c625a4f9c9eb97229f44c88eb1d780f16557c74375a0858deba3a884bedee6e6ae2ef23704ec0b6f0b84d132a8e36cb83353747b683fe6da
7
- data.tar.gz: 0aca72492fd0871e46dbcd67dde9ce1394718c5312c2c316ce3c72bf48ee67b8c93d03a9eb1d25ed86bf83a613d116a0eb752626288df9aba3686a720160269d
6
+ metadata.gz: 598ce0a929c08a22c956d35857bb63f5e52959b3e2381e5a3a1ec79bd0c5df1223b56efdee91bf72edd1f5c3bda03659a271639a7a61921b704724d7be442b6e
7
+ data.tar.gz: 2470d1f1ac1f5024299fadaf636e7408e5cc38c50a251493d00c1ae7263bf7fc65904b69385d218a6f28f16a1fcda1c5bfe73932156797403ffbd6c6b91eebd8
data/README.md CHANGED
@@ -53,11 +53,44 @@ Tml must be used with caching enabled.
53
53
 
54
54
  If you are already using Rails caching, you probably already specify it in your production file, like the following:
55
55
 
56
+ Memcache
57
+
56
58
  config/environments/production.rb
57
59
 
58
60
  ```ruby
59
- config.cache_store = :mem_cache_store, Dalli::Client.new('localhost:11211', {:namespace => 'myapplication'})
60
- config.identity_cache_store = :mem_cache_store, Dalli::Client.new('localhost:11211', {:namespace => 'myapplication'})
61
+ config.cache_store = :mem_cache_store, { :namespace => 'my_cache' }
62
+ ```
63
+
64
+ Memcache for multiple servers
65
+
66
+ ```ruby
67
+ config.cache_store = :mem_cache_store, '123.456.78.9:1001', '123.456.78.9:1002'
68
+ ```
69
+
70
+ Memcache with Dalli
71
+
72
+ ```ruby
73
+ config.cache_store = :mem_cache_store, Dalli::Client.new('localhost:11211', {
74
+ :namespace => 'my_cache'
75
+ })
76
+ ```
77
+
78
+ Redis
79
+
80
+ ```ruby
81
+ config.cache_store = :redis_store, {
82
+ :host => 'localhost',
83
+ :port => 6379,
84
+ :db => 0,
85
+ :namespace => 'my_cache',
86
+ :expires_in => 90.minutes
87
+ }
88
+ ```
89
+
90
+ Tip: to clear up Redis cache
91
+
92
+ ```sh
93
+ $ redis-cli FLUSHALL
61
94
  ```
62
95
 
63
96
  Then all you need to do is specify that you want to use the Rails cache adapter:
@@ -76,11 +109,12 @@ Alternatively, you can provide a separate memcache server to store your translat
76
109
 
77
110
  ```ruby
78
111
  config.cache = {
79
- :enabled => true,
80
- :adapter => 'memcache',
81
- :host => 'localhost:11211',
82
- :version => 1,
83
- :timeout => 3600
112
+ :enabled => true,
113
+ :adapter => 'memcache',
114
+ :host => 'localhost:11211',
115
+ :namespace => 'translations',
116
+ :version => 1,
117
+ :timeout => 3600
84
118
  }
85
119
  ```
86
120
 
@@ -88,11 +122,14 @@ You can also use Redis to persist your translations cache:
88
122
 
89
123
  ```ruby
90
124
  config.cache = {
91
- :enabled => true,
92
- :adapter => 'redis',
93
- :host => 'localhost:6379',
94
- :version => 1,
95
- :timeout => 3600
125
+ :enabled => true,
126
+ :adapter => 'redis',
127
+ :host => 'localhost',
128
+ :port => 6379,
129
+ :password => 'password',
130
+ :namespace => 'translations',
131
+ :version => 1,
132
+ :timeout => 3600
96
133
  }
97
134
  ```
98
135
 
@@ -0,0 +1,46 @@
1
+ <%
2
+ opts[:element] ||= 'div'
3
+ opts[:class] ||= 'dropdown'
4
+ %>
5
+
6
+ <<%= opts[:element] %> class="<%= opts[:class] %>" style="<%= opts[:style] %>">
7
+ <a href="#" role="button" class="<%= opts[:class] || 'dropdown' %>-toggle" data-toggle="dropdown">
8
+ <%= tml_language_name_tag(tml_current_language, opts) %>
9
+ </a>
10
+
11
+ <ul class="dropdown-menu" role="menu">
12
+
13
+ <% tml_application.languages.each do |lang| %>
14
+
15
+ <li role="presentation">
16
+ <%=link_to({:locale => lang.locale}) do %>
17
+
18
+ <%= tml_language_name_tag(lang, opts) %>
19
+
20
+ <% end %>
21
+ </li>
22
+
23
+ <% end %>
24
+
25
+ <% if opts[:toggle] %>
26
+ <li role='presentation' class='divider'></li>
27
+ <li role='presentation'>
28
+ <a href='javascript:void(0);' onclick='Tml.Utils.toggleInlineTranslations()'>
29
+ <%= tr(opts[:toggle_label] || 'Help Us Translate') %>
30
+ </a>
31
+ </li>
32
+ <% end %>
33
+
34
+ <li role='presentation' class='divider'></li>
35
+
36
+ <div style="font-size:8px;color:#ccc;text-align: center">
37
+ <a href="http://translationexchange.com">
38
+ <img style="padding: 10px;border: 0px;background-repeat: no-repeat;background-size: 14px 17px;
39
+ background-image:url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAABQCAYAAABCiMhGAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCQTg4MTEyOEU0NkIxMUUzODhCMEJEOUNDRDQ0QkU0MiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCQTg4MTEyOUU0NkIxMUUzODhCMEJEOUNDRDQ0QkU0MiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkJBODgxMTI2RTQ2QjExRTM4OEIwQkQ5Q0NENDRCRTQyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkJBODgxMTI3RTQ2QjExRTM4OEIwQkQ5Q0NENDRCRTQyIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+mszKSAAAAqFJREFUeNrsnE1IFVEYhr+53QiKEIkgpCBwJSH9SITkqkVELXJZ0iYIqRaBCZWgoWKikRBI1KVNmyg3gVKQ0CZE+9kHQYukaGP2I6iEP1ffc+dc7iwK5s5Mx3PPvC88zGxm5s4zc85853JmvNardwTxwC1wGuyWdGQGvARduaH23wUJkJHFcgoclnTmKzgIIT8yWOlNsQiVPeB+8c74hmWNMNXqzqimh0JqlIxVeigkr2Tk6aGQtQwdlEIZlEEZlEEZEZONuf0YmASLYNNGPRI1e8FFsHUjZNwAg5Zd3GHwHuw02Uw+WShCZRr0m+4zPljc9D+alpG1WMYW0zJsfgplxMGTYp1BGZRBGZRBGZRBGZRBGZRBGZRBGQxlUAZlUAZlUAZlUAZlUAZlUAZlUIbDMmyeYr3KO6OUJdMyGiyWcdS0DPV+ykMLRRwD16JuHGc60gV9Fd6KP/Vxs/hTEDvBbIT9nQLNEdp8XkpTH0/GMRl3bladJpi7EWQcB89dfLSW24EdAeOsM0T2gQkWXX4bf6P7mlTL2KFFbE97Ob4NvAO70j42UcdTbyHU2jo28Qwe7zXYb2nl6mXE3DzwF6DJ5kGrkjFv4EBP4laHBjKjZDz7zwfJgTOWi3iVG2qfVTKui//ZhMTaXmD9Hmi1XMSf4m9UMubAIfAY/Epg58t62QcuWyxhQfx37A7grvgcHKipgdU5UPWX538LuBlh8Deu+4oVS2X8BN8h4p+j1jlNMOW+5lQ8+QmpsIQpusr5vsYV8EUqNElWoKojHpYKTlIyusFtqfAkIWMA9IgDiStD/cXXIY4kjowHoE0cSlQZj8AlcSxRZDwF58XBhJGxFlgfBWfF0YSR4QXK62ZxOGFk1OtR7QlxPGFkjIBGSUHWBRgAlJNpO4bVinwAAAAASUVORK5CYII=);"/>
40
+ <br>
41
+ Powered By Translation Exchange
42
+ </a>
43
+ </div>
44
+ </ul>
45
+ </<%= opts[:element] %>>
46
+
@@ -0,0 +1,17 @@
1
+ <%= link_to('#',
2
+ :onclick => opts[:method] || 'Tml.UI.LanguageSelector.show(); return false;',
3
+ :style => (opts[:style] || 'padding-right:5px;text-decoration:none'),
4
+ :class => opts[:class]
5
+ ) do %>
6
+ <% unless opts[:hide_flag] %>
7
+ <%= image_tag(tml_current_language.flag_url, :style => "align:middle") %>
8
+ &nbsp;
9
+ <% end %>
10
+ <% if opts[:language] == :native %>
11
+ <%= tml_current_language.native_name %>
12
+ <% elsif opts[:language] == :english %>
13
+ <%= tml_current_language.english_name %>
14
+ <% else %>
15
+ <%= tml_current_language.english_name %>
16
+ <% end %>
17
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <div style="<%=opts[:style]%>" class="<%=opts[:class]%>">
2
+ <% tml_application.languages.each_with_index do |lang, index| %>
3
+ <% next if opts[:limit] and index >= opts[:limit] %>
4
+
5
+
6
+ <%= link_to(params.merge(:locale => lang.locale), :style => (opts[:style] || 'padding-right:5px;text-decoration:none'), :class => opts[:class]) do %>
7
+ <% if opts[:flags_only] or opts[:flags] %>
8
+ <%= image_tag(lang.flag_url) %>
9
+ <% else %>
10
+ <%= tml_language_name_tag(lang, opts) %>
11
+ <% end %>
12
+ <% end %>
13
+
14
+ <% end %>
15
+ </div>
@@ -0,0 +1,32 @@
1
+ <script>
2
+ function tml_change_locale(locale) {
3
+ var query_parts = window.location.href.split('#');
4
+ var anchor = query_parts.length > 1 ? query_parts[1] : null;
5
+ query_parts = query_parts[0].split('?');
6
+ var query = query_parts.length > 1 ? query_parts[1] : null;
7
+
8
+ var params = {};
9
+ if (query) {
10
+ var vars = query.split('&');
11
+ for (var i = 0; i < vars.length; i++) {
12
+ var pair = vars[i].split('=');
13
+ params[pair[0]] = pair[1];
14
+ }
15
+ }
16
+ params['locale'] = locale;
17
+
18
+ query = [];
19
+ var keys = Object.keys(params);
20
+ for (i = 0; i < keys.length; i++) {
21
+ query.push(keys[i] + "=" + params[keys[i]]);
22
+ }
23
+
24
+ var destination = query_parts[0];
25
+ if (query.length > 0)
26
+ destination = destination + '?' + query.join("&");
27
+ if (anchor)
28
+ destination = destination + '#' + anchor;
29
+
30
+ window.location = destination;
31
+ }
32
+ </script>
@@ -0,0 +1,15 @@
1
+ <%= render(:partial => '/tml_rails/tags/language_selector_js') %>
2
+
3
+ <select id="tml_language_selector" onchange="tml_change_locale(this.options[this.selectedIndex].value)" style="<%=opts[:style]%>" class="<%=opts[:class]%>">
4
+ <% tml_application.languages.each do |lang| %>
5
+ <option dir='ltr' value="<%=lang.locale%>" <%="selected" if lang.locale == tml_current_locale %>>
6
+ <% if opts[:language] == :native %>
7
+ <%= lang.native_name %>
8
+ <% elsif opts[:language] == :english %>
9
+ <%= lang.english_name %>
10
+ <% else %>
11
+ <%= lang.english_name %>
12
+ <% end %>
13
+ </option>
14
+ <% end %>
15
+ </select>
data/lib/tasks/tml.rake CHANGED
@@ -42,17 +42,17 @@ namespace :tml do
42
42
 
43
43
  desc 'generates local file cache'
44
44
  task :generate => :environment do
45
- Tml::Generators::Cache::File.new.run
45
+ Tml::Generators::File.new.run
46
46
  end
47
47
 
48
48
  desc 'rolls back to the previous version'
49
49
  task :rollback => :environment do
50
- Tml::Generators::Cache::File.new.rollback
50
+ Tml::Generators::File.new.rollback
51
51
  end
52
52
 
53
53
  desc 'rolls up to the next version'
54
54
  task :rollup => :environment do
55
- Tml::Generators::Cache::File.new.rollup
55
+ Tml::Generators::File.new.rollup
56
56
  end
57
57
 
58
58
  end
@@ -33,7 +33,6 @@
33
33
  class Tml::CacheAdapters::Rails < Tml::Cache
34
34
 
35
35
  def initialize
36
- Tml.logger.info('Initializing Rails cache...')
37
36
  @cache = Rails.cache
38
37
  end
39
38
 
@@ -91,7 +90,7 @@ class Tml::CacheAdapters::Rails < Tml::Cache
91
90
  end
92
91
 
93
92
  def clear(opts = {})
94
- info("Cache clear")
93
+ info('Cache clear')
95
94
  rescue Exception => ex
96
95
  warn("Failed to clear cache: #{ex.message}")
97
96
  end
@@ -113,17 +113,18 @@ module TmlRails
113
113
  end
114
114
 
115
115
  unless tml_session_params[:locale]
116
- if tml_tools_enabled? # gets translator and locale from the cookie
117
- tml_session_params.merge!(:cookies => request.cookies)
118
- else
119
- session[:locale] = tml_user_preferred_locale unless session[:locale]
120
- session[:locale] = params[:locale] if params[:locale]
121
- tml_session_params.merge!(:locale => session[:locale] || Tml.config.default_locale)
122
- end
116
+ tml_session_params.merge!(:cookies => cookies)
117
+ tml_session_params.merge!(:change_locale => true) if params[:locale]
118
+ tml_session_params.merge!(:locale => params[:locale] || tml_user_preferred_locale)
123
119
  end
124
120
 
125
121
  Tml.session.init(tml_session_params)
126
122
 
123
+ # if user sets locale manually, update the cookie for future use
124
+ if tml_session_params[:change_locale]
125
+ cookies[Tml.session.cookie_name] = Tml::Utils.encode(Tml.session.cookie_params)
126
+ end
127
+
127
128
  if defined? I18n.enforce_available_locales
128
129
  I18n.enforce_available_locales = false
129
130
  end
@@ -56,36 +56,42 @@ module TmlRails
56
56
  end
57
57
 
58
58
  def tml_language_flag_tag(lang = tml_current_language, opts = {})
59
- return "" unless tml_application.feature_enabled?(:language_flags)
60
- html = image_tag(lang.flag_url, :style => "vertical-align:middle;", :title => lang.native_name)
61
- html << "&nbsp;".html_safe
59
+ return '' unless tml_application.feature_enabled?(:language_flags)
60
+ html = image_tag(lang.flag_url, :style => (opts[:style] || 'vertical-align:middle;'), :title => lang.native_name)
61
+ html << '&nbsp;&nbsp;'.html_safe
62
62
  html.html_safe
63
63
  end
64
64
 
65
65
  def tml_language_name_tag(lang = tml_current_language, opts = {})
66
66
  show_flag = opts[:flag].nil? ? true : opts[:flag]
67
- name_type = opts[:name].nil? ? :full : opts[:name] # :full, :native, :english, :locale
68
- linked = opts[:linked].nil? ? true : opts[:linked]
67
+ name_type = opts[:language].nil? ? :english : opts[:language] # :full, :native, :english, :locale
69
68
 
70
- html = "<span style='white-space: nowrap'>"
69
+ html = []
70
+ html << "<span style='white-space: nowrap'>"
71
71
  html << tml_language_flag_tag(lang, opts) if show_flag
72
72
  html << "<span dir='ltr'>"
73
73
 
74
74
  name = case name_type
75
75
  when :native then lang.native_name
76
- when :english then lang.english_name
76
+ when :full then lang.full_name
77
77
  when :locale then lang.locale
78
- else lang.full_name
78
+ else lang.english_name
79
79
  end
80
80
 
81
- html << name
82
- html << "</span></span>"
83
- html.html_safe
81
+ html << name.to_s
82
+ html << '</span></span>'
83
+ html.join().html_safe
84
84
  end
85
85
 
86
86
  def tml_language_selector_tag(type = nil, opts = {})
87
87
  return unless Tml.config.enabled?
88
- render(:partial => '/tml_rails/tags/language_selector', :locals => {:type => type, :opts => opts})
88
+
89
+ type ||= :default
90
+ unless [:bootstrap, :default, :inline, :select].include?(type.to_sym)
91
+ return "Unsupported language selector #{type}"
92
+ end
93
+
94
+ render(:partial => "/tml_rails/tags/language_selector_#{type}", :locals => {:opts => opts})
89
95
  end
90
96
 
91
97
  def tml_language_strip_tag(opts = {})
@@ -30,5 +30,5 @@
30
30
  #++
31
31
 
32
32
  module TmlRails
33
- VERSION = '4.3.6'
33
+ VERSION = '4.3.7'
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tml-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.6
4
+ version: 4.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Berkovich
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-28 00:00:00.000000000 Z
11
+ date: 2015-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -49,7 +49,11 @@ files:
49
49
  - README.md
50
50
  - Rakefile
51
51
  - app/controllers/tml_rails/tools_controller.rb
52
- - app/views/tml_rails/tags/_language_selector.html.erb
52
+ - app/views/tml_rails/tags/_language_selector_bootstrap.html.erb
53
+ - app/views/tml_rails/tags/_language_selector_default.html.erb
54
+ - app/views/tml_rails/tags/_language_selector_inline.html.erb
55
+ - app/views/tml_rails/tags/_language_selector_js.html.erb
56
+ - app/views/tml_rails/tags/_language_selector_select.html.erb
53
57
  - app/views/tml_rails/tags/_language_strip.html.erb
54
58
  - app/views/tml_rails/tags/_powered_by_trex.html.erb
55
59
  - app/views/tml_rails/tags/_scripts.html.erb
@@ -1,82 +0,0 @@
1
- <% if tml_session.tools_enabled? or type.blank? %>
2
- <%
3
- if tml_session.tools_enabled?
4
- opts[:method] = 'Tml.UI.LanguageSelector.show(); return false;'
5
- end
6
- %>
7
-
8
- <%= link_to('#',
9
- :onclick => (opts[:method] || "alert('Custom language selector can be specified by passing it in the method attribute of the language selector tag.');"),
10
- :style => (opts[:style] || 'padding-right:5px;text-decoration:none'),
11
- :class => opts[:class]
12
- ) do %>
13
- <% unless opts[:hide_flag] %>
14
- <%= image_tag(tml_current_language.flag_url, :style => "align:middle") %>
15
- &nbsp;
16
- <% end %>
17
- <% if opts[:language] == :native %>
18
- <%= tml_current_language.native_name %>
19
- <% elsif opts[:language] == :english %>
20
- <%= tml_current_language.english_name %>
21
- <% else %>
22
- <%= tml_current_language.english_name %>
23
- <% end %>
24
- <% end %>
25
-
26
- <% elsif type == :list %>
27
- <div style="padding-top:10px;">
28
- <% tml_application.languages.each_with_index do |lang, index| %>
29
- <% next if opts[:limit] and index >= opts[:limit] %>
30
- <%= link_to(params.merge(:locale => lang.locale), :style => (opts[:style] || 'padding-right:5px;text-decoration:none'), :class => opts[:class]) do %>
31
- <% if opts[:flags_only] or opts[:flags] %>
32
- <%= image_tag(lang.flag_url) %>
33
- <% end %>
34
- <% unless opts[:flags_only] %>
35
- <%= lang.english_name %>
36
- <% end %>
37
- <% end %>
38
- <% end %>
39
- </div>
40
-
41
- <% elsif type == :dropdown %>
42
-
43
- <script>
44
- function tml_change_locale(selector) {
45
- var query_parts = window.location.href.split('?');
46
- var query = query_parts.length > 1 ? query_parts[1] : null;
47
- var params = {};
48
- if (query) {
49
- var vars = query.split('&');
50
- for (var i = 0; i < vars.length; i++) {
51
- var pair = vars[i].split('=');
52
- params[pair[0]] = pair[1];
53
- }
54
- }
55
- params['locale'] = selector.options[selector.selectedIndex].value;
56
-
57
- query = [];
58
- var keys = Object.keys(params);
59
- for (var i = 0; i < keys.length; i++) {
60
- query.push(encodeURIComponent(keys[i]) + "=" + encodeURIComponent(params[keys[i]]));
61
- }
62
-
63
- var destination = query_parts[0] + '?' + query.join("&");
64
- window.location = destination;
65
- }
66
- </script>
67
-
68
- <select id="tml_language_selector" onchange="tml_change_locale(this)" style="<%=opts[:style]%>" class="<%=opts[:class]%>">
69
- <% tml_application.languages.each do |lang| %>
70
- <option dir='ltr' value="<%=lang.locale%>" <%="selected" if lang.locale == tml_current_locale %>>
71
- <% if opts[:language] == :native %>
72
- <%= lang.native_name %>
73
- <% elsif opts[:language] == :english %>
74
- <%= lang.english_name %>
75
- <% else %>
76
- <%= lang.english_name %>
77
- <% end %>
78
- </option>
79
- <% end %>
80
- </select>
81
-
82
- <% end %>