tolk 3.0.1 → 4.0.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.
@@ -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 %>
@@ -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
@@ -23,6 +23,16 @@ module Tolk
23
23
  # strip translation texts automatically
24
24
  attr_accessor :strip_texts
25
25
 
26
+ # specify line width which Yaml.dump will use to break lines. -1 for not breaking
27
+ attr_accessor :yaml_line_width
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
+
26
36
  def reset
27
37
  @exclude_gems_token = false
28
38
 
@@ -78,6 +88,12 @@ module Tolk
78
88
  'zh-CN' => 'Chinese (Simplified)',
79
89
  'zh-TW' => 'Chinese (Traditional)'
80
90
  }
91
+
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 = []
81
97
  end
82
98
  end
83
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.1"
2
+ VERSION = "4.0.0"
3
3
  end
@@ -22,7 +22,7 @@ module Tolk
22
22
  if payload.respond_to?(:ya2yaml)
23
23
  payload.ya2yaml(:syck_compatible => true)
24
24
  else
25
- ::YAML.dump(payload)
25
+ ::YAML.dump(payload, line_width: Tolk::Config.yaml_line_width)
26
26
  end
27
27
  end
28
28
  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.1
4
+ version: 4.0.0
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: 2017-11-23 00:00:00.000000000 Z
15
+ date: 2020-07-22 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,6 +157,11 @@ 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
@@ -163,7 +188,7 @@ homepage: https://github.com/tolk/tolk
163
188
  licenses:
164
189
  - MIT
165
190
  metadata: {}
166
- post_install_message:
191
+ post_install_message:
167
192
  rdoc_options: []
168
193
  require_paths:
169
194
  - lib
@@ -171,16 +196,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
171
196
  requirements:
172
197
  - - ">="
173
198
  - !ruby/object:Gem::Version
174
- version: 2.2.2
199
+ version: 2.5.0
175
200
  required_rubygems_version: !ruby/object:Gem::Requirement
176
201
  requirements:
177
202
  - - ">="
178
203
  - !ruby/object:Gem::Version
179
204
  version: '0'
180
205
  requirements: []
181
- rubyforge_project:
182
- rubygems_version: 2.7.2
183
- signing_key:
206
+ rubygems_version: 3.1.4
207
+ signing_key:
184
208
  specification_version: 4
185
209
  summary: Rails engine providing web interface for managing i18n yaml files
186
210
  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
- }