tolk 3.0.2 → 4.0.1

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.
@@ -6,5 +6,5 @@
6
6
  <%= text_field_tag :q, params[:q] %>
7
7
  within key:
8
8
  <%= text_field_tag :k, params[:k] %>
9
- <%= submit_tag "Search", :name => nil %>
9
+ <%= submit_tag "Search", name: nil, class: 'btn' %>
10
10
  <% end %>
@@ -1,62 +1,68 @@
1
- <h3 class="search">
2
- <%= render :partial => "form", :locals => { :locale => @locale } %>
3
- </h3>
1
+ <%= render 'tolk/nav' %>
4
2
 
5
- <div class="search_exits">
6
- <%= link_to "Phrases missing translation", @locale %>
7
- &nbsp;
8
- <%= link_to "Completed translations", tolk.all_locale_path(@locale) %>
3
+ <div class="search">
4
+ <%= render partial: "form", locals: { locale: @locale } %>
9
5
  </div>
10
6
 
11
- <div class="translations">
12
- <% if @phrases.any? %>
7
+ <% if @phrases.any? %>
8
+ <div class="translations">
13
9
  <%= form_for @locale do |locale_form| %>
14
- <table class="translations">
15
- <tr>
16
- <th class="translation"><%= @locale.language_name -%></th>
17
- <th class="actions"></th>
18
- <th class="key"><%= Tolk::Locale.primary_language_name -%></th>
19
- </tr>
20
- <% @phrases.each do |phrase| %>
10
+ <table>
11
+ <thead>
12
+ <tr>
13
+ <th><%= @locale.language_name -%></th>
14
+ <th class="actions"></th>
15
+ <th><%= Tolk::Locale.primary_language_name -%></th>
16
+ </tr>
17
+ </thead>
18
+ <tbody>
19
+ <% @phrases.each do |phrase| %>
20
+ <% if translation = phrase.translations.where(locale_id: @locale.id).first || Tolk::Translation.new(locale: @locale, phrase: phrase) %>
21
+ <tr>
22
+ <td class="translation">
23
+ <%= hidden_field_tag :"translations[][id]", translation.id, id: "#{translation.object_id}_id" %>
24
+ <%= hidden_field_tag :"translations[][phrase_id]", phrase.id, id: "#{translation.object_id}_phrase_id" %>
25
+ <%= hidden_field_tag :"translations[][locale_id]", translation.locale_id, id: "#{translation.object_id}_locale_id" %>
26
+ <%= text_area_tag :"translations[][text]", format_i18n_text_area_value(translation.text),
27
+ class: "locale",
28
+ id: "#{translation.object_id}_text",
29
+ onfocus: "$(this).up('tr').addClassName('active');",
30
+ onblur: "$(this).up('tr').removeClassName('active');" %>
31
+ </td>
32
+ <td class="actions">
33
+ <a class="copy" href="#" tabindex="-1" title="Copy original translation">&larr;</a><br>
34
+ <span class="warning" title="Interpolation keys don't match">⚠</span>
35
+ </td>
36
+ <td class="original">
37
+ <%= text_area_tag :"translations[][original_text]", format_i18n_text_area_value(phrase.translations.primary.text), disabled: true %>
21
38
 
22
- <% if translation = phrase.translations.where(locale_id: @locale.id).first || Tolk::Translation.new(:locale => @locale, :phrase => phrase) %>
23
- <tr>
24
- <td class="translation">
25
- <%= hidden_field_tag :"translations[][id]", translation.id, :id => "#{translation.object_id}_id" %>
26
- <%= hidden_field_tag :"translations[][phrase_id]", phrase.id, :id => "#{translation.object_id}_phrase_id" %>
27
- <%= hidden_field_tag :"translations[][locale_id]", translation.locale_id, :id => "#{translation.object_id}_locale_id" %>
28
- <%= text_area_tag :"translations[][text]", format_i18n_text_area_value(translation.text), :class => "locale", :id => "#{translation.object_id}_text", :onfocus => "$(this).up('tr').addClassName('active');", :onblur => "$(this).up('tr').removeClassName('active');" %>
29
- </td>
30
- <td class="actions">
31
- <a class="copy" href="#" tabindex="-1" title="Copy original translation">&larr;</a><br>
32
- <span class="warning" title="Interpolation keys don't match">⚠</span>
33
- </td>
34
- <td class="original">
35
- <%= text_area_tag :"translations[][original_text]", format_i18n_text_area_value(phrase.translations.primary.text), :disabled => true %>
39
+ <% if params[:q].present? -%>
40
+ <%= highlight(format_i18n_value(phrase.translations.primary.text), params[:q]) -%>
41
+ <% else -%>
42
+ <%= format_i18n_value(phrase.translations.primary.text) -%>
43
+ <% end -%>
44
+ <%= boolean_warning if phrase.translations.primary.boolean? -%>
36
45
 
37
- <% if params[:q].present? -%>
38
- <%= highlight(format_i18n_value(phrase.translations.primary.text), params[:q]) -%>
39
- <% else -%>
40
- <%= format_i18n_value(phrase.translations.primary.text) -%>
41
- <% end -%>
42
- <%= boolean_warning if phrase.translations.primary.boolean? -%>
43
-
44
- <span class="key" title="<%= phrase.key %>"><%= params[:k].present? ?
45
- highlight(h(truncate(phrase.key, :length => 100)), params[:k]) :
46
- h(truncate(phrase.key, :length => 100)) %></span>
47
- </td>
48
- </tr>
46
+ <span class="translation-key" title="<%= phrase.key %>"><%= params[:k].present? ?
47
+ highlight(h(truncate(phrase.key, length: 100)), params[:k]) :
48
+ h(truncate(phrase.key, length: 100)) %></span>
49
+ </td>
50
+ </tr>
51
+ <% end %>
49
52
  <% end %>
50
- <% end %>
53
+ </tbody>
51
54
  </table>
52
55
  <div class="table_submit">
53
- <p><%= locale_form.submit "Save changes", :class => 'save' %></p>
56
+ <p><%= locale_form.submit "Save changes", class: 'save-translations btn btn--large' %></p>
54
57
  </div>
55
58
  <% end %>
56
- <div class="paginate">
57
- <%= tolk_paginate @phrases %>
58
- </div>
59
- <% else %>
60
- <p style="text-align: left">No search results.</p>
61
- <% end %>
62
- </div>
59
+ <%= tolk_paginate @phrases %>
60
+ </div>
61
+ <% else %>
62
+ <div class="empty-state">
63
+ <%= render 'tolk/no_data.svg' %>
64
+ <p class="empty-state__msg">
65
+ No search results.
66
+ </p>
67
+ </div>
68
+ <% end %>
@@ -0,0 +1,4 @@
1
+ # Add the assets for Rails 6 app
2
+ if defined?(Rails)
3
+ Rails.application.config.assets.precompile += %w[tolk/application.js tolk/application.css]
4
+ end
@@ -409,4 +409,5 @@ Tolk.config do |config|
409
409
  # config.mapping['zu'] = 'Zulu'
410
410
  # config.mapping['zu-ZA'] = 'Zulu (South Africa)
411
411
 
412
+ # config.base_controller = 'ApplicationController'
412
413
  end
@@ -26,6 +26,13 @@ module Tolk
26
26
  # specify line width which Yaml.dump will use to break lines. -1 for not breaking
27
27
  attr_accessor :yaml_line_width
28
28
 
29
+ # specify controller to inherit from to keep Tolk controllers
30
+ # in the same context than the rest of your app
31
+ attr_accessor :base_controller
32
+
33
+ # Ignore specific keys
34
+ attr_accessor :ignore_keys
35
+
29
36
  def reset
30
37
  @exclude_gems_token = false
31
38
 
@@ -83,6 +90,10 @@ module Tolk
83
90
  }
84
91
 
85
92
  @yaml_line_width = Psych::Handler::OPTIONS.line_width # Psych::Handler::DumperOptions uses 0 as "default" for unset
93
+
94
+ @base_controller = 'ActionController::Base'
95
+
96
+ @ignore_keys = []
86
97
  end
87
98
  end
88
99
 
@@ -24,27 +24,27 @@ module Tolk
24
24
  data = locale.read_locale_file
25
25
  return unless data
26
26
 
27
- phrases = Tolk::Phrase.all
27
+ phrases_by_key = Tolk::Phrase.all.index_by(&:key)
28
+ translated_phrase_ids = Set.new(locale.translations.pluck(:phrase_id))
28
29
  count = 0
29
30
 
30
31
  data.each do |key, value|
31
- phrase = phrases.detect {|p| p.key == key}
32
-
33
- if phrase
34
- translation = locale.translations.new(:text => value, :phrase => phrase)
35
- if translation.save
36
- count = count + 1
37
- elsif translation.errors[:variables].present?
38
- puts "[WARN] Key '#{key}' from '#{locale_name}.yml' could not be saved: #{translation.errors[:variables].first}"
39
- end
40
- else
32
+ phrase = phrases_by_key[key]
33
+ unless phrase
41
34
  puts "[ERROR] Key '#{key}' was found in '#{locale_name}.yml' but #{Tolk::Locale.primary_language_name} translation is missing"
35
+ next
36
+ end
37
+ next if translated_phrase_ids.include?(phrase.id)
38
+ translation = locale.translations.new(:text => value, :phrase => phrase)
39
+ if translation.save
40
+ count = count + 1
41
+ elsif translation.errors[:variables].present?
42
+ puts "[WARN] Key '#{key}' from '#{locale_name}.yml' could not be saved: #{translation.errors[:variables].first}"
42
43
  end
43
44
  end
44
45
 
45
46
  puts "[INFO] Imported #{count} keys from #{locale_name}.yml"
46
47
  end
47
-
48
48
  end
49
49
 
50
50
  def read_locale_file
@@ -30,7 +30,8 @@ module Tolk
30
30
  I18n.backend.send :init_translations unless I18n.backend.initialized? # force load
31
31
  end
32
32
  translations = flat_hash(I18n.backend.send(:translations)[primary_locale.name.to_sym])
33
- filter_out_i18n_keys(translations.merge(read_primary_locale_file))
33
+ filtered = filter_out_i18n_keys(translations.merge(read_primary_locale_file))
34
+ filter_out_ignored_keys(filtered)
34
35
  end
35
36
 
36
37
  def read_primary_locale_file
@@ -62,30 +63,44 @@ module Tolk
62
63
  primary_locale = self.primary_locale
63
64
 
64
65
  # Handle deleted phrases
65
- translations.present? ? Tolk::Phrase.where(["tolk_phrases.key NOT IN (?)", translations.keys]).destroy_all : Tolk::Phrase.destroy_all
66
+ Tolk::Phrase.where.not(:key => translations.keys).destroy_all
66
67
 
67
- phrases = Tolk::Phrase.all
68
+ phrases_by_key = Tolk::Phrase.all.index_by(&:key)
69
+ primary_translation_by_phrase_id = primary_locale.translations.index_by(&:phrase_id)
68
70
 
69
71
  translations.each do |key, value|
70
72
  next if value.is_a?(Proc)
71
73
  # Create phrase and primary translation if missing
72
- existing_phrase = phrases.detect {|p| p.key == key} || Tolk::Phrase.create!(:key => key)
73
- translation = existing_phrase.translations.primary || primary_locale.translations.build(:phrase_id => existing_phrase.id)
74
+ phrase = phrases_by_key[key] || Tolk::Phrase.create!(:key => key)
75
+ translation = primary_translation_by_phrase_id[phrase.id]
76
+ translation ||= primary_locale.translations.build(:phrase => phrase)
74
77
  translation.text = value
75
78
 
76
79
  if translation.changed? && !translation.new_record?
77
80
  # Set the primary updated flag if the primary translation has changed and it is not a new record.
78
- existing_phrase.translations.where(Tolk::Translation.arel_table[:locale_id].not_eq(primary_locale.id)).update_all({ :primary_updated => true })
81
+ phrase.translations.where.not(:locale_id => primary_locale.id).update_all({ :primary_updated => true })
79
82
  end
80
83
 
81
84
  translation.primary = true
82
- translation.save!
85
+ translation.save! if translation.changed?
83
86
  end
84
87
  end
85
88
 
86
89
  def filter_out_i18n_keys(flat_hash)
87
90
  flat_hash.reject { |key, value| key.starts_with? "i18n" }
88
91
  end
92
+
93
+ def filter_out_ignored_keys(flat_hash)
94
+ ignored = Tolk.config.ignore_keys
95
+
96
+ return flat_hash unless ignored.any?
97
+
98
+ ignored_escaped = ignored.map { |key| Regexp.escape(key) }
99
+
100
+ regexp = Regexp.new(/\A(#{ignored_escaped.join('|')})(:?\.|\Z)/)
101
+
102
+ flat_hash.reject { |key, _| regexp === key }
103
+ end
89
104
  end
90
105
  end
91
106
  end
@@ -1,3 +1,3 @@
1
1
  module Tolk
2
- VERSION = "3.0.2"
2
+ VERSION = "4.0.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tolk
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
@@ -9,10 +9,10 @@ authors:
9
9
  - Emilio Tagua
10
10
  - Thomas Darde
11
11
  - Ferran Basora
12
- autorequire:
12
+ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2018-03-19 00:00:00.000000000 Z
15
+ date: 2020-11-04 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rails
@@ -42,6 +42,20 @@ dependencies:
42
42
  - - ">="
43
43
  - !ruby/object:Gem::Version
44
44
  version: 0.8.6
45
+ - !ruby/object:Gem::Dependency
46
+ name: sassc
47
+ requirement: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ type: :runtime
53
+ prerelease: false
54
+ version_requirements: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
45
59
  - !ruby/object:Gem::Dependency
46
60
  name: capybara
47
61
  requirement: !ruby/object:Gem::Requirement
@@ -60,16 +74,22 @@ dependencies:
60
74
  name: sqlite3
61
75
  requirement: !ruby/object:Gem::Requirement
62
76
  requirements:
63
- - - ">="
77
+ - - "~>"
64
78
  - !ruby/object:Gem::Version
65
- version: '0'
79
+ version: '1.3'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.5'
66
83
  type: :development
67
84
  prerelease: false
68
85
  version_requirements: !ruby/object:Gem::Requirement
69
86
  requirements:
70
- - - ">="
87
+ - - "~>"
71
88
  - !ruby/object:Gem::Version
72
- version: '0'
89
+ version: '1.3'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '1.5'
73
93
  - !ruby/object:Gem::Dependency
74
94
  name: mocha
75
95
  requirement: !ruby/object:Gem::Requirement
@@ -128,7 +148,7 @@ files:
128
148
  - app/assets/javascripts/tolk/libraries.js
129
149
  - app/assets/stylesheets/tolk/application.css
130
150
  - app/assets/stylesheets/tolk/reset.css
131
- - app/assets/stylesheets/tolk/screen.css
151
+ - app/assets/stylesheets/tolk/screen.scss
132
152
  - app/controllers/tolk/application_controller.rb
133
153
  - app/controllers/tolk/locales_controller.rb
134
154
  - app/controllers/tolk/searches_controller.rb
@@ -137,12 +157,18 @@ files:
137
157
  - app/models/tolk/phrase.rb
138
158
  - app/models/tolk/translation.rb
139
159
  - app/views/layouts/tolk/application.html.erb
160
+ - app/views/tolk/_blank_canva.svg
161
+ - app/views/tolk/_empty.svg
162
+ - app/views/tolk/_houra.svg
163
+ - app/views/tolk/_nav.html.erb
164
+ - app/views/tolk/_no_data.svg
140
165
  - app/views/tolk/locales/all.html.erb
141
166
  - app/views/tolk/locales/index.html.erb
142
167
  - app/views/tolk/locales/show.atom.builder
143
168
  - app/views/tolk/locales/show.html.erb
144
169
  - app/views/tolk/searches/_form.html.erb
145
170
  - app/views/tolk/searches/show.html.erb
171
+ - config/initializers/assets.rb
146
172
  - config/initializers/will_paginate.rb
147
173
  - config/routes.rb
148
174
  - lib/generators/tolk/install_generator.rb
@@ -163,7 +189,7 @@ homepage: https://github.com/tolk/tolk
163
189
  licenses:
164
190
  - MIT
165
191
  metadata: {}
166
- post_install_message:
192
+ post_install_message:
167
193
  rdoc_options: []
168
194
  require_paths:
169
195
  - lib
@@ -171,16 +197,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
171
197
  requirements:
172
198
  - - ">="
173
199
  - !ruby/object:Gem::Version
174
- version: 2.2.2
200
+ version: 2.5.0
175
201
  required_rubygems_version: !ruby/object:Gem::Requirement
176
202
  requirements:
177
203
  - - ">="
178
204
  - !ruby/object:Gem::Version
179
205
  version: '0'
180
206
  requirements: []
181
- rubyforge_project:
182
- rubygems_version: 2.7.6
183
- signing_key:
207
+ rubygems_version: 3.1.4
208
+ signing_key:
184
209
  specification_version: 4
185
210
  summary: Rails engine providing web interface for managing i18n yaml files
186
211
  test_files: []
@@ -1,401 +0,0 @@
1
- /*-------------------------------------------------
2
- Defaults
3
- -------------------------------------------------*/
4
-
5
- acronym, abbr {
6
- font-variant: small-caps;
7
- text-transform: lowercase;
8
- font-weight: bold;
9
- }
10
-
11
- .center {text-align: center;}
12
- .large {font-size: larger;}
13
- .small {font-size: smaller;}
14
- strong {font-weight: bold;}
15
- em {font-style: italic;}
16
-
17
- .clear {clear: both;}
18
- .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
19
- .clearfix { display: inline-block; }
20
- .clearfix{ display: block; }
21
-
22
- a {color: #888;}
23
- a:hover {color: #000;}
24
-
25
- /*-------------------------------------------------
26
- Layout
27
- -------------------------------------------------*/
28
-
29
- body {
30
- font-family: "Lucida Sans", "Lucida Grande", "Lucida Sans Unicode", sans-serif;
31
- background: #e5e5e5;
32
- color: #333;
33
- margin: 0;
34
- padding: 0;
35
- font-size: 14px;
36
- line-height: 21px;
37
- text-align: left;
38
- }
39
-
40
- div#container {
41
- margin: 2% 4%;
42
- padding: 25px;
43
- background: #fff;
44
- -webkit-border-radius: 20px;
45
- -moz-border-radius: 20px;
46
- border-radius: 20px;
47
- box-shadow: 0px 0px 15px rgba(00,00,00,0.5);
48
- -moz-box-shadow: 0px 0px 15px rgba(00,00,00,0.5);
49
- -webkit-box-shadow: 0px 0px 15px rgba(00,00,00,0.5);
50
- }
51
-
52
- div#head {
53
- margin: -25px -25px 0;
54
- background: #111;
55
- color: #999;
56
- padding: 25px 25px 20px 15px;
57
- -webkit-border-top-left-radius: 20px;
58
- -webkit-border-top-right-radius: 20px;
59
- -moz-border-radius-topleft: 20px;
60
- -moz-border-radius-topright: 20px;
61
- border-top-left-radius: 20px;
62
- border-top-right-radius: 20px;
63
- font-size: 18px;
64
- }
65
-
66
- div#head a {
67
- color: #2fadcf;
68
- font-weight: bold;
69
- text-decoration: none;
70
- }
71
-
72
- div#head span {
73
- padding: 8px 6px;
74
- margin-right: 1px;
75
- }
76
-
77
- div#head span.home {
78
- background: #333;
79
- }
80
-
81
- div#head span.locale {
82
- background: #444;
83
- }
84
-
85
- div#head span.locale a {
86
- color: #fff;
87
- }
88
-
89
- div#head span.locale form.button_to {
90
- display: inline;
91
- }
92
-
93
- div#head span.locale form.button_to div {
94
- display: inline;
95
- }
96
-
97
- div#head span.locale form.button_to div input {
98
- color: #fff;
99
- background: none;
100
- border: 0;
101
- font-weight: bold;
102
- text-decoration: none;
103
- font-size: 18px;
104
- color: #2fadcf;
105
- cursor: pointer;
106
- }
107
-
108
- div#head span:first-child {
109
- padding-left: 12px;
110
- -webkit-border-top-left-radius: 10px;
111
- -webkit-border-bottom-left-radius: 10px;
112
- -moz-border-radius-topleft: 10px;
113
- -moz-border-radius-bottomleft: 10px;
114
- border-top-left-radius: 10px;
115
- border-bottom-left-radius: 10px;
116
- }
117
-
118
- div#head span:last-child {
119
- padding-right: 12px;
120
- -webkit-border-top-right-radius: 10px;
121
- -webkit-border-bottom-right-radius: 10px;
122
- -moz-border-radius-topright: 10px;
123
- -moz-border-radius-bottomright: 10px;
124
- border-top-right-radius: 10px;
125
- border-bottom-right-radius: 10px;
126
- }
127
-
128
- h2,
129
- h3 {
130
- font-size: 18px;
131
- color: #2fadcf;
132
- margin: 25px 0 10px;
133
- }
134
-
135
- h2 span,
136
- h3 span {
137
- font-size: 13px;
138
- color: #888;
139
- }
140
-
141
- ul.locales {
142
- margin: 25px 0;
143
- }
144
-
145
- ul.locales li {
146
- width: 300px;
147
- display: block;
148
- float: left;
149
- margin: 0 10px 10px 0;
150
- /* background: #fff;
151
- -webkit-border-radius: 5px;
152
- -moz-border-radius: 5px;
153
- border-radius: 5px;
154
- border: 1px solid #e5e5e5;
155
- padding: 5px 10px;*/
156
- }
157
-
158
- ul.locales a {
159
- font-weight: bold;
160
- text-decoration: underline;
161
- color: #2fadcf;
162
- }
163
-
164
- /*ul.locales li:hover {
165
- background: #f5f5f5;
166
- border-color: #ccc;
167
- }*/
168
-
169
- ul.locales span.missing_translations {
170
- color: #fff;
171
- font-weight: bold;
172
- background: #c00;
173
- font-size: 9px;
174
- padding: 3px;
175
- -webkit-border-radius: 3px;
176
- -moz-border-radius: 3px;
177
- border-radius: 3px;
178
- line-height: 9px;
179
- vertical-align: top;
180
- display: inline-block;
181
- }
182
-
183
- ul.locales span {
184
- font-size: 13px;
185
- color: #666;
186
- }
187
-
188
- div.submit {
189
- background: #f5f5f5;
190
- margin: 25px -25px -25px;
191
- padding: 15px 25px;
192
- border-top: 1px dashed #ccc;
193
- -webkit-border-bottom-right-radius: 20px;
194
- -webkit-border-bottom-left-radius: 20px;
195
- -moz-border-radius-bottomright: 20px;
196
- -moz-border-radius-bottomleft: 20px;
197
- border-bottom-right-radius: 20px;
198
- border-bottom-left-radius: 20px;
199
- }
200
-
201
- span.updated {
202
- font-size: 11px;
203
- padding: 1px;
204
- background: #ffc;
205
- color: #777;
206
- margin-bottom: 10px;
207
- float: right;
208
- }
209
-
210
- div.table_submit {
211
- background: #f5f5f5;
212
- margin: -25px 0 0;
213
- padding: 12px 15px 15px;
214
- text-align: left;
215
- }
216
-
217
- div.table_submit input.save {
218
- border: 0;
219
- font-weight: bold;
220
- text-decoration: none;
221
- font-size: 18px;
222
- color: #fff;
223
- cursor: pointer;
224
- border-radius: 10px;
225
- padding: 8px 10px;
226
- background: #444;
227
- }
228
-
229
-
230
- div.translations {
231
- width: 96%;
232
- text-align: center;
233
- }
234
-
235
- span.notice {
236
- background: #ffc;
237
- color: #666;
238
- font-size: 12px;
239
- padding: 2px 5px;
240
- margin: -5px 0 15px;
241
- display: inline-block;
242
- }
243
-
244
- div.previous {
245
- color: #999;
246
- margin: 5px 0;
247
- padding: 1px 8px 4px;
248
- }
249
-
250
- div.updated {
251
- background: #ffc;
252
- padding: 1px 8px 4px;
253
- }
254
-
255
- table.translations div.previous span.key {
256
- margin: 0 0 -2px;
257
- padding: 0;
258
- }
259
-
260
- table.translations div.updated span.key {
261
- margin: 0 0 -2px;
262
- color: orange !important;
263
- padding: 0;
264
- }
265
-
266
- /*-------------------------------------------------
267
- Translation tables
268
- -------------------------------------------------*/
269
-
270
- table.translations {
271
- margin: 0 0 25px;
272
- width: 100%;
273
- text-align: left;
274
- }
275
-
276
- table.translations td,
277
- table.translations th {
278
- font-size: 14px;
279
- color: #222;
280
- padding: 12px 8px;
281
- border-bottom: 1px solid #e5e5e5;
282
- vertical-align: top;
283
- width: 48%;
284
- }
285
-
286
- table.translations th {
287
- border-bottom-color: #bbb;
288
- font-size: 11px;
289
- font-weight: bold;
290
- text-transform: uppercase;
291
- color: #999;
292
- padding-bottom: 2px;
293
- }
294
-
295
- table.translations th.actions {
296
- width: 50px;
297
- }
298
-
299
- table.translations textarea.locale {
300
- font-family: "Lucida Sans", "Lucida Grande", "Lucida Sans Unicode", sans-serif;
301
- font-size: 14px;
302
- line-height: 21px;
303
- color: #222;
304
- padding: 1px;
305
- width: 100%;
306
- height: 42px;
307
- }
308
-
309
- table.translations span.key {
310
- color: #aaa;
311
- font-size: 9px;
312
- display: block;
313
- }
314
-
315
- table.translations td.translation {
316
- padding: 10px 8px;
317
- }
318
-
319
- table.translations td.actions {
320
- width: 50px;
321
- text-align: center;
322
- }
323
-
324
- table.translations td.actions a {
325
- font-weight: bold;
326
- text-decoration: none;
327
- }
328
-
329
- table.translations td.actions .warning {
330
- font-weight: bold;
331
- font-size: 25px;
332
- color: orange;
333
- padding: 2px 4px;
334
- display: none;
335
- cursor: help;
336
- }
337
-
338
- table.translations tr.active td {
339
- background: #edf9fe;
340
- }
341
-
342
- table.translations .highlight {
343
- background-color: yellow;
344
- }
345
-
346
- table.translations .original textarea {
347
- display: none;
348
- }
349
-
350
- table.translations .original .interpolation,
351
- table.translations .original .carriage_return,
352
- table.translations .original .boolean {
353
- color: #2fadcf;
354
- font-family: Courier, monospace;
355
- font-weight: bold;
356
- cursor: help;
357
- }
358
-
359
- table.translations .original .carriage_return:before {
360
- content: "¶";
361
- }
362
-
363
- /*-------------------------------------------------
364
- Pagination
365
- -------------------------------------------------*/
366
-
367
- div.paginate {
368
- margin: 15px auto 20px;
369
- font-size: 12px;
370
- color: #777;
371
- }
372
-
373
- div.paginate a,
374
- div.paginate span {
375
- padding: 2px 6px;
376
- text-decoration: none;
377
- }
378
-
379
- div.paginate a:hover,
380
- div.paginate span.current {
381
- -webkit-border-radius: 5px;
382
- -moz-border-radius: 5px;
383
- border-radius: 5px;
384
- background: #eee;
385
- color: #333;
386
- }
387
-
388
- div.paginate .next_page,
389
- div.paginate .prev_page {
390
- margin: 0 15px;
391
- -webkit-border-radius: 5px;
392
- -moz-border-radius: 5px;
393
- border-radius: 5px;
394
- border: 1px solid #bbb;
395
- padding: 4px 8px;
396
- }
397
-
398
- div.paginate .disabled {
399
- color: #ccc;
400
- border-color: #eee;
401
- }