lit 0.0.4.2 → 0.0.4.3

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/README.md CHANGED
@@ -60,7 +60,7 @@ mount Lit::Engine => "/lit"
60
60
  * Better cache
61
61
  * Support for other key value providers (ie. Redis does not support Array types in easy way)
62
62
  * Integration with ActiveAdmin
63
-
63
+ * Add versioning
64
64
 
65
65
  ### License
66
66
 
@@ -12,7 +12,7 @@
12
12
  //
13
13
  //= require jquery
14
14
  //= require jquery_ujs
15
- //= require jquery-ui
15
+ // require jquery-ui
16
16
  //= require bootstrap
17
17
  //= require_tree .
18
18
 
@@ -1,6 +1,8 @@
1
1
  module Lit
2
2
  class ApplicationController < ActionController::Base
3
3
  before_filter :authenticate
4
+ before_filter :stop_hits_counter
5
+ after_filter :restore_hits_counter
4
6
 
5
7
  private
6
8
  def authenticate
@@ -8,5 +10,13 @@ module Lit
8
10
  send(Lit.authentication_function)
9
11
  end
10
12
  end
13
+
14
+ def stop_hits_counter
15
+ Lit.init.cache.stop_hits_counter
16
+ end
17
+
18
+ def restore_hits_counter
19
+ Lit.init.cache.restore_hits_counter
20
+ end
11
21
  end
12
22
  end
@@ -1,7 +1,7 @@
1
1
  require_dependency "lit/application_controller"
2
2
 
3
3
  module Lit
4
- class DashboardController < ApplicationController
4
+ class DashboardController < ::Lit::ApplicationController
5
5
  def index
6
6
  @locales = Lit::Locale.ordered
7
7
  end
@@ -0,0 +1,31 @@
1
+ require_dependency "lit/application_controller"
2
+
3
+ module Lit
4
+ class LocalesController < ApplicationController
5
+ def index
6
+ @locales = Locale.ordered.all
7
+
8
+ respond_to do |format|
9
+ format.html # index.html.erb
10
+ format.json { render json: @locales }
11
+ end
12
+ end
13
+
14
+ def hide
15
+ @locale = Locale.find(params[:id])
16
+ @locale.is_hidden = !@locale.is_hidden?
17
+ @locale.save
18
+ respond_to :js
19
+ end
20
+
21
+ def destroy
22
+ @locale = Locale.find(params[:id])
23
+ @locale.destroy
24
+
25
+ respond_to do |format|
26
+ format.html { redirect_to locales_url }
27
+ format.json { head :no_content }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,5 +1,5 @@
1
1
  module Lit
2
- class LocalizationKeysController < ApplicationController
2
+ class LocalizationKeysController < ::Lit::ApplicationController
3
3
  before_filter :get_localization_scope, :except=>[:destroy]
4
4
 
5
5
  def index
@@ -1,5 +1,5 @@
1
1
  module Lit
2
- class LocalizationsController < ApplicationController
2
+ class LocalizationsController < ::Lit::ApplicationController
3
3
  before_filter :find_localization_key
4
4
  before_filter :find_localization
5
5
 
@@ -3,6 +3,7 @@ module Lit
3
3
 
4
4
  ## SCOPES
5
5
  scope :ordered, proc{ order('locale ASC') }
6
+ scope :visible, proc{ where(:is_hidden=>false) }
6
7
 
7
8
  ## ASSOCIATIONS
8
9
  has_many :localizations, :dependent=>:destroy
@@ -1,5 +1,6 @@
1
1
  module Lit
2
2
  class LocalizationKey < ActiveRecord::Base
3
+ attr_accessor :interpolated_key
3
4
 
4
5
  ## SCOPES
5
6
  scope :completed, proc{ where(:is_completed=>true) }
@@ -25,11 +26,10 @@ module Lit
25
26
  end
26
27
 
27
28
  def clone_localizations
28
- first_localization = self.localizations.first
29
29
  new_created = false
30
30
  Lit::Locale.find_each do |locale|
31
31
  self.localizations.where(:locale_id=>locale.id).first_or_create do |l|
32
- l.default_value = first_localization.get_value
32
+ l.default_value = interpolated_key
33
33
  new_created = true
34
34
  end
35
35
  end
@@ -1,4 +1,13 @@
1
1
  <%= link_to "Lost in translation", root_path, :class=>'brand' %>
2
2
  <ul class="nav">
3
3
  <li><%= link_to "Translate!", lit.localization_keys_path %></li>
4
+ <li class="dropdown">
5
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
6
+ Settings
7
+ <b class="caret"></b>
8
+ </a>
9
+ <ul class="dropdown-menu">
10
+ <li><%= link_to "Locales", lit.locales_path %></li>
11
+ </ul>
12
+ </li>
4
13
  </ul>
@@ -0,0 +1 @@
1
+ <%= link_to locale.is_hidden? ? 'Show' : 'Hide', hide_locale_path(locale), :method=>:put, :remote=>true %>
@@ -0,0 +1 @@
1
+ $('#hide_link_<%= @locale.id %>').html("<%= j render(:partial=>"hide_link", :locals=>{:locale=>@locale}) %>");
@@ -0,0 +1,20 @@
1
+ <h1>Listing locales</h1>
2
+
3
+ <table class="table table-stripped">
4
+ <tr>
5
+ <th>Locale</th>
6
+ <th width="100">Options</th>
7
+ </tr>
8
+
9
+ <% @locales.each do |locale| %>
10
+ <tr>
11
+ <td><%= locale %></td>
12
+ <td>
13
+ <span id="hide_link_<%= locale.id %>"><%= render :partial=>"hide_link", :locals=>{:locale=>locale} %></span>
14
+ <%= link_to 'Destroy', locale, method: :delete, data: { confirm: 'Are you sure?' } %>
15
+ </td>
16
+ </tr>
17
+ <% end %>
18
+ </table>
19
+
20
+
@@ -5,6 +5,7 @@
5
5
  <tr class="localization_key_row" data-id="<%= lk.id %>">
6
6
  <td>
7
7
  <strong><%= lk.localization_key %></strong>
8
+ <span class="badge"><%= Lit.init.cache.get_global_hits_counter(lk.localization_key) %></span>
8
9
  <div class="localization_keys_options">
9
10
  <%= link_to lit.star_localization_key_path(lk), :remote=>true, :class=>"star_icon" do %>
10
11
  <%= draw_icon lk.is_starred? ? 'star' : 'star-empty' %>
@@ -19,11 +20,11 @@
19
20
  <tr>
20
21
  <%- localization = lk.localizations.where(:locale_id=>Lit.init.cache.find_locale(locale).id).first %>
21
22
  <% unless localization %>
22
- <%- lk.clone_localizations %>
23
+ <% Lit.init.cache.refresh_key("#{locale}.#{lk.localization_key}") %>
23
24
  <%- localization = lk.localizations.where(:locale_id=>Lit.init.cache.find_locale(locale).id).first %>
24
25
  <% end %>
25
26
  <td class="localization_row" data-id="<%= localization.id%>" data-edit="<%= edit_localization_key_localization_path(lk, localization) %>" data-editing=0 data-content="<%= ejs(Lit.init.cache["#{locale}.#{lk.localization_key}"])%>">
26
- <%= Lit.init.cache["#{locale}.#{lk.localization_key}"] || localization.get_value %>
27
+ <%= Lit.init.cache["#{locale}.#{lk.localization_key}"] %>
27
28
  </td>
28
29
  <td class="locale_row">
29
30
  <%= image_tag "lit/famfamfam_flags/#{locale[0,2]}.png" %>
data/config/routes.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  Lit::Engine.routes.draw do
2
2
 
3
+ resources :locales, :only=>[:index, :destroy] do
4
+ put :hide, :on=>:member
5
+ end
3
6
  resources :localization_keys, :only=>[:index, :destroy] do
4
7
  member do
5
8
  get :star
@@ -0,0 +1,5 @@
1
+ class AddIsHiddenToLocales < ActiveRecord::Migration
2
+ def change
3
+ add_column :lit_locales, :is_hidden, :boolean, :default=>false
4
+ end
5
+ end
data/lib/lit.rb CHANGED
@@ -5,12 +5,16 @@ module Lit
5
5
  mattr_accessor :authentication_function
6
6
  mattr_accessor :key_value_engine
7
7
  mattr_accessor :storage_options
8
+ mattr_accessor :humanize_key
9
+ mattr_accessor :fallback
8
10
  class << self
9
11
  attr_accessor :loader
10
12
  end
11
13
  def self.init
12
- if self.loader.nil?
14
+ @@table_exists ||= Lit::Locale.table_exists?
15
+ if self.loader.nil? && @@table_exists
13
16
  self.loader ||= Loader.new
17
+ Lit.humanize_key = true if Lit.humanize_key.nil?
14
18
  #if loading all translations on start, migrations have to be performed
15
19
  #already, fails on first deploy
16
20
  #self.loader.cache.load_all_translations
@@ -1,4 +1,8 @@
1
1
  module Lit
2
2
  class HashStorage < Hash
3
+ def incr(key)
4
+ self.[key] ||= 0
5
+ self.[key] += 1
6
+ end
3
7
  end
4
8
  end
@@ -2,9 +2,8 @@ require 'redis'
2
2
  module Lit
3
3
  extend self
4
4
  def redis
5
- return @redis if @redis
6
- @redis = Redis.connect(:thread_safe => true)
7
- @redis
5
+ $redis = Redis.connect unless $redis
6
+ $redis
8
7
  end
9
8
  class RedisStorage
10
9
  def initialize
@@ -19,9 +18,12 @@ module Lit
19
18
  Lit.redis.set(_prefixed_key(k).to_s, v.to_s)
20
19
  end
21
20
 
21
+ def delete(k)
22
+ Lit.redis.del k
23
+ end
24
+
22
25
  def clear
23
- Lit.redis.del self.keys
24
- save
26
+ Lit.redis.del(self.keys) if self.keys.length > 0
25
27
  end
26
28
 
27
29
  def keys
@@ -32,6 +34,16 @@ module Lit
32
34
  Lit.redis.exists(_prefixed_key(key))
33
35
  end
34
36
 
37
+ def incr(key)
38
+ Lit.redis.incr(_prefixed_key(key))
39
+ end
40
+
41
+ def sort
42
+ Lit.redis.keys.sort.map do |k|
43
+ [k, self.[](k)]
44
+ end
45
+ end
46
+
35
47
  private
36
48
  def _prefixed_key(key="")
37
49
  prefix = "lit:"
data/lib/lit/cache.rb CHANGED
@@ -3,10 +3,13 @@ module Lit
3
3
 
4
4
  def initialize
5
5
  @localizations = Lit.get_key_value_engine
6
+ @hits_counter = Lit.get_key_value_engine
7
+ @hits_counter_working = true
6
8
  end
7
9
 
8
10
  def [](key)
9
- @localizations[key]
11
+ update_hits_count(key)
12
+ @localizations[key]
10
13
  end
11
14
 
12
15
  def []=(key, value)
@@ -22,34 +25,44 @@ module Lit
22
25
  end
23
26
 
24
27
  def update_locale(key, value)
28
+ key = key.to_s
25
29
  locale_key, key_without_locale = split_key(key)
26
- #Lit.init.logger.info "key: #{key}"
27
- #Lit.init.logger.info "key_without_locale: #{key_without_locale}"
28
- #Lit.init.logger.info "value: #{value}"
29
30
  locale = find_locale(locale_key)
30
31
  localization = find_localization(locale, key_without_locale, value)
31
- @localizations[key] = localization.get_value
32
+ @localizations[key] = localization.get_value if localization
32
33
  end
33
34
 
34
- def load_all_translations
35
+ def load_all_translations(oninit=false)
35
36
  Lit.init.logger.info "loading all translations"
36
- Localization.includes([:locale, :localization_key]).find_each do |l|
37
- @localizations[l.full_key] = l.get_value
37
+ doinit = false
38
+ first = Localization.order('id ASC').first
39
+ last = Localization.order('id DESC').first
40
+ if not first or not last or (not @localizations.has_key?(first.full_key) or
41
+ not @localizations.has_key?(last.full_key))
42
+ doinit = true
43
+ end
44
+
45
+ if oninit==false || doinit==true
46
+ Localization.includes([:locale, :localization_key]).find_each do |l|
47
+ @localizations[l.full_key] = l.get_value
48
+ end
38
49
  end
39
50
  end
40
51
 
41
52
  def refresh_key(key)
53
+ key = key.to_s
42
54
  Lit.init.logger.info "refreshing key: #{key}"
43
55
  locale_key, key_without_locale = split_key(key)
44
56
  locale = find_locale(locale_key)
45
57
  localization = find_localization(locale, key_without_locale)
46
- @localizations[key] = localization.get_value
58
+ @localizations[key] = localization.get_value if localization
47
59
  end
48
60
 
49
61
  def delete_key(key)
62
+ key = key.to_s
50
63
  Lit.init.logger.info "deleting key: #{key}"
51
64
  @localizations.delete(key)
52
- locale_key, key_without_locale = split_key(key)
65
+ key_without_locale = split_key(key).last
53
66
  @localization_keys.delete(key_without_locale)
54
67
  I18n.backend.reload!
55
68
  end
@@ -57,11 +70,14 @@ module Lit
57
70
  def reset
58
71
  @locale_cache = {}
59
72
  @localizations = Lit.get_key_value_engine
73
+ @localizations.clear
60
74
  @localization_keys = Lit.get_key_value_engine
75
+ @localization_keys.clear
61
76
  load_all_translations
62
77
  end
63
78
 
64
79
  def find_locale(locale_key)
80
+ locale_key = locale_key.to_s
65
81
  @locale_cache ||= {}
66
82
  unless @locale_cache.has_key?(locale_key)
67
83
  #Lit.init.logger.info "looking for locale: #{locale_key}"
@@ -76,7 +92,11 @@ module Lit
76
92
  def export
77
93
  keys = {}
78
94
  reset
79
- @localizations.sort.each do |(l_key, value)|
95
+ db_localizations = {}
96
+ Lit::Localization.find_each do |l|
97
+ db_localizations[l.full_key] = l.get_value
98
+ end
99
+ db_localizations.sort.each do |(l_key, value)|
80
100
  current = keys
81
101
  yaml_keys = l_key.split('.')
82
102
 
@@ -93,61 +113,93 @@ module Lit
93
113
  keys.to_yaml
94
114
  end
95
115
 
116
+ def get_global_hits_counter(key)
117
+ @hits_counter['global_hits_counter.'+key]
118
+ end
119
+
120
+ def get_hits_counter(key)
121
+ @hits_counter['hits_counter.'+key]
122
+ end
123
+
124
+ def stop_hits_counter
125
+ @hits_counter_working = false
126
+ end
127
+
128
+ def restore_hits_counter
129
+ @hits_counter_working = true
130
+ end
131
+
96
132
  private
97
133
 
98
134
  def find_localization(locale, key_without_locale, value=nil)
99
135
  unless value.is_a?(Hash)
100
136
  localization_key = find_localization_key(key_without_locale)
101
- create = false
102
137
  localization = Lit::Localization.where(:locale_id=>locale.id).
103
138
  where(:localization_key_id=>localization_key.id).first_or_create do |l|
104
139
  if value.is_a?(Array)
105
- if value.length > 1
106
- new_value = nil
107
- value_clone = value.dup
108
- while v = value_clone.pop
109
- lk = Lit::LocalizationKey.where(:localization_key=>v).first
110
- if lk
111
- loca = Lit::Localization.where(:locale_id=>locale.id).
112
- where(:localization_key_id=>lk.id).first
113
- new_value = loca.get_value if loca and loca.get_value.present?
114
-
140
+ new_value = nil
141
+ value_clone = value.dup
142
+ while (v = value_clone.shift) && v.present?
143
+ pv = parse_value(v, locale)
144
+ new_value = pv unless pv.nil?
145
+ end
146
+ value = new_value
147
+ else
148
+ value = parse_value(value, locale) unless value.nil?
149
+ end
150
+ if value.nil?
151
+ if Lit.fallback
152
+ @locale_cache.keys.each do |lc|
153
+ if lc != locale.locale
154
+ nk = "#{lc}.#{key_without_locale}"
155
+ v = @localizations[nk]
156
+ value = v if v.present? and value.nil?
115
157
  end
116
158
  end
117
- value = new_value.nil? ? value.last : new_value
118
- else
119
- value = value.first
120
159
  end
160
+ value = key_without_locale.split('.').last.humanize if value.nil? &&
161
+ Lit.humanize_key
121
162
  end
122
- l.default_value = value.to_s
123
- #Lit.init.logger.info "creating new localization: #{key_without_locale}"
124
- #Lit.init.logger.info "creating new localization with value: #{value}"
125
- #Lit.init.logger.info "creating new localization with value: #{value.class}"
126
- create = true
163
+ l.default_value = value
127
164
  end
128
- localization_key.clone_localizations if create and localization_key.localizations.count(:id)==1
129
165
  localization
130
166
  else
131
167
  Lit.init.logger.info "returning value for hash: #{key_without_locale}: #{value.to_s}"
132
- l = Localization.new
133
- l.default_value = value
134
- l
168
+ nil
135
169
  end
136
170
  end
137
171
 
172
+ ## checks parameter type and returns value basing on it
173
+ ## symbols are beeing looked up in db
174
+ ## string are returned directly
175
+ ## procs are beeing called (once)
176
+ ## hashes are converted do string (for now)
177
+ def parse_value(v, locale)
178
+ new_value = nil
179
+ case v
180
+ when Symbol then
181
+ lk = Lit::LocalizationKey.where(:localization_key=>v.to_s).first
182
+ if lk
183
+ loca = Lit::Localization.where(:locale_id=>locale.id).
184
+ where(:localization_key_id=>lk.id).first
185
+ new_value = loca.get_value if loca and loca.get_value.present?
186
+ end
187
+ when String then
188
+ new_value = v
189
+ when Proc then
190
+ new_value = v.call
191
+ else
192
+ new_value = v.to_s
193
+ end
194
+ new_value
195
+ end
196
+
138
197
  def find_localization_key(key_without_locale)
139
198
  @localization_keys ||= Lit.get_key_value_engine
140
199
  unless @localization_keys.has_key?(key_without_locale)
141
- localization_key = Lit::LocalizationKey.where(:localization_key=>key_without_locale).first_or_create!
142
- @localization_keys[key_without_locale] = localization_key.id
143
- #Lit.init.logger.info "creating key: #{key_without_locale} with id #{localization_key.id}"
144
- localization_key
200
+ find_or_create_localization_key(key_without_locale)
145
201
  else
146
- #Lit.init.logger.info "current keys: #{@localization_keys.keys}"
147
- #Lit.init.logger.info "And I was looking for key: #{key_without_locale}"
148
- #Lit.init.logger.info "And store has currently #{@localization_keys[key_without_locale]}"
149
- #Lit.init.logger.info Lit::LocalizationKey.all
150
- Lit::LocalizationKey.find(@localization_keys[key_without_locale])
202
+ Lit::LocalizationKey.find_by_id(@localization_keys[key_without_locale]) || find_or_create_localization_key(key_without_locale)
151
203
  end
152
204
  end
153
205
 
@@ -158,5 +210,20 @@ module Lit
158
210
  [locale_key, key_without_locale]
159
211
  end
160
212
 
213
+ def find_or_create_localization_key(key_without_locale)
214
+ #Lit.init.logger.info "creating key: #{key_without_locale} with id #{localization_key.id}"
215
+ localization_key = Lit::LocalizationKey.where(:localization_key=>key_without_locale).first_or_create!
216
+ @localization_keys[key_without_locale] = localization_key.id
217
+ localization_key
218
+ end
219
+
220
+ def update_hits_count(key)
221
+ if @hits_counter_working
222
+ key_without_locale = split_key(key).last
223
+ @hits_counter.incr('hits_counter.'+key)
224
+ @hits_counter.incr('global_hits_counter.'+key_without_locale)
225
+ end
226
+ end
227
+
161
228
  end
162
229
  end
@@ -18,14 +18,13 @@ module Lit
18
18
  end
19
19
 
20
20
  def available_locales
21
- Lit::Locale.ordered.all.map{|l| l.locale.to_sym }
21
+ Lit::Locale.ordered.visible.all.map{|l| l.locale.to_sym }
22
22
  end
23
23
 
24
24
  # Stores the given translations.
25
25
  #
26
26
  # @param [String] locale the locale (ie "en") to store translations for
27
27
  # @param [Hash] data nested key-value pairs to be added as blurbs
28
- # @param [Hash] options unused part of the I18n API
29
28
  def store_translations(locale, data, options = {})
30
29
  super
31
30
  #Lit.init.logger.info "store translation: #{locale}, data: #{data}, options: #{options}"
@@ -36,13 +35,18 @@ module Lit
36
35
  private
37
36
 
38
37
  def lookup(locale, key, scope = [], options = {})
39
- #Lit.init.logger.info "lookup translation: #{key}, scope: #{scope}, options: #{options}"
40
38
  parts = I18n.normalize_keys(locale, key, scope, options[:separator])
41
39
  key_with_locale = parts.join('.')
40
+
41
+ ## check in cache or in simple backend
42
42
  content = @cache[key_with_locale] || super
43
- #Lit.init.logger.info "options[:default]: #{options[:default].class}"
44
- #Lit.init.logger.info "options[:default]: #{options[:default]}"
45
- @cache[key_with_locale] = (options[:default] || "") if content.nil?
43
+
44
+ ## store value if not found
45
+ if content.nil?
46
+ @cache[key_with_locale] = options[:default]
47
+ content = @cache[key_with_locale]
48
+ end
49
+ ## return translated content
46
50
  content
47
51
  end
48
52
 
data/lib/lit/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lit
2
- VERSION = "0.0.4.2"
2
+ VERSION = "0.0.4.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4.2
4
+ version: 0.0.4.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-15 00:00:00.000000000 Z
12
+ date: 2013-09-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -76,7 +76,7 @@ dependencies:
76
76
  - !ruby/object:Gem::Version
77
77
  version: '2.1'
78
78
  - !ruby/object:Gem::Dependency
79
- name: sqlite3
79
+ name: pg
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  none: false
82
82
  requirements:
@@ -374,6 +374,7 @@ files:
374
374
  - app/assets/stylesheets/lit/dashboard.css
375
375
  - app/controllers/lit/application_controller.rb
376
376
  - app/controllers/lit/dashboard_controller.rb
377
+ - app/controllers/lit/locales_controller.rb
377
378
  - app/controllers/lit/localization_keys_controller.rb
378
379
  - app/controllers/lit/localizations_controller.rb
379
380
  - app/helpers/lit/application_helper.rb
@@ -393,6 +394,9 @@ files:
393
394
  - app/views/layouts/lit/_navigation.html.erb
394
395
  - app/views/layouts/lit/application.html.erb
395
396
  - app/views/lit/dashboard/index.html.erb
397
+ - app/views/lit/locales/_hide_link.html.erb
398
+ - app/views/lit/locales/hide.js.erb
399
+ - app/views/lit/locales/index.html.erb
396
400
  - app/views/lit/localization_keys/destroy.js.erb
397
401
  - app/views/lit/localization_keys/index.html.erb
398
402
  - app/views/lit/localization_keys/star.js.erb
@@ -404,6 +408,7 @@ files:
404
408
  - db/migrate/20121103174049_create_lit_localization_keys.rb
405
409
  - db/migrate/20121103182106_create_lit_localizations.rb
406
410
  - db/migrate/20121225112100_add_is_completed_and_is_starred_to_localization_keys.rb
411
+ - db/migrate/20130511111904_add_is_hidden_to_locales.rb
407
412
  - lib/lit/adapters/hash_storage.rb
408
413
  - lib/lit/adapters/redis_storage.rb
409
414
  - lib/lit/cache.rb
@@ -438,7 +443,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
438
443
  version: '0'
439
444
  requirements: []
440
445
  rubyforge_project:
441
- rubygems_version: 1.8.24
446
+ rubygems_version: 1.8.23
442
447
  signing_key:
443
448
  specification_version: 3
444
449
  summary: Database powered i18n backend with web gui