globalize3 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2008, 2009 Joshua Harvey
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,80 @@
1
+ h1. Globalize3
2
+
3
+ Globalize3 is the successor of Globalize for Rails. Globalize is targeted at ActiveRecord 3.
4
+
5
+ It is compatible with and builds on the new "I18n api in Ruby on Rails":http://guides.rubyonrails.org/i18n.html. and adds model translations to ActiveRecord.
6
+
7
+ Globalize3 is much more lightweight and compatible than its predecessor was. Model translations in Globalize3 use default ActiveRecord features and do not limit any ActiveRecord functionality any more.
8
+
9
+ h2. Requirements
10
+
11
+ ActiveRecord > 3.0.0.rc
12
+ I18n
13
+
14
+ h2. Installation
15
+
16
+ To install Globalize3 with its default setup just use:
17
+
18
+ <pre><code>
19
+ $ gem install globalize3
20
+ </code></pre>
21
+
22
+ h2. Model translations
23
+
24
+ Model translations allow you to translate your models' attribute values. E.g.
25
+
26
+ <pre><code>
27
+ class Post < ActiveRecord::Base
28
+ translates :title, :text
29
+ end
30
+ </code></pre>
31
+
32
+ Allows you to values for the attributes :title and :text per locale:
33
+
34
+ <pre><code>
35
+ I18n.locale = :en
36
+ post.title # => Globalize3 rocks!
37
+
38
+ I18n.locale = :he
39
+ post.title # => גלובאלייז2 שולט!
40
+ </code></pre>
41
+
42
+ In order to make this work, you'll need to add the appropriate translation tables. Globalize3 comes with a handy helper method to help you do this. It's called @create_translation_table!@. Here's an example:
43
+
44
+ <pre><code>
45
+ class CreatePosts < ActiveRecord::Migration
46
+ def self.up
47
+ create_table :posts do |t|
48
+ t.timestamps
49
+ end
50
+ Post.create_translation_table! :title => :string, :text => :text
51
+ end
52
+ def self.down
53
+ drop_table :posts
54
+ Post.drop_translation_table!
55
+ end
56
+ end
57
+ </code></pre>
58
+
59
+ Note that the ActiveRecord model @Post@ must already exist and have a @translates@ directive listing the translated fields.
60
+
61
+ h2. Migration from Globalize for Rails (version 1)
62
+
63
+ See this script by Tomasz Stachewicz: http://gist.github.com/120867
64
+
65
+ h2. Alternative Solutions
66
+
67
+ * "Veger's fork":http://github.com/veger/globalize2 - uses default AR schema for the default locale, delegates to the translations table for other locales only
68
+ * "TranslatableColumns":http://github.com/iain/translatable_columns - have multiple languages of the same attribute in a model (Iain Hecker)
69
+ * "localized_record":http://github.com/glennpow/localized_record - allows records to have localized attributes without any modifications to the database (Glenn Powell)
70
+ * "model_translations":http://github.com/janne/model_translations - Minimal implementation of Globalize2 style model translations (Jan Andersson)
71
+
72
+ h2. Related solutions
73
+
74
+ * "globalize2_versioning":http://github.com/joshmh/globalize2_versioning - acts_as_versioned style versioning for globalize2 (Joshua Harvey)
75
+ * "i18n_multi_locales_validations":http://github.com/ZenCocoon/i18n_multi_locales_validations - multi-locales attributes validations to validates attributes from globalize2 translations models (Sébastien Grosjean)
76
+ * "globalize2 Demo App":http://github.com/svenfuchs/globalize2-demo - demo application for globalize2 (Sven Fuchs)</li>
77
+ * "migrate_from_globalize1":http://gist.github.com/120867 - migrate model translations from Globalize1 to globalize2 (Tomasz Stachewicz)</li>
78
+ * "easy_globalize2_accessors":http://github.com/astropanic/easy_globalize2_accessors - easily access (read and write) globalize2-translated fields (astropanic, Tomasz Stachewicz)</li>
79
+ * "globalize2-easy-translate":http://github.com/bsamman/globalize2-easy-translate - adds methods to easily access or set translated attributes to your model (bsamman)</li>
80
+ * "batch_translations":http://github.com/alvarezrilla/batch_translations - allow saving multiple globalize2 translations in the same request (Jose Alvarez Rilla)</li>
@@ -0,0 +1,22 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Run all tests.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.pattern = 'test/**/*_test.rb'
12
+ t.verbose = true
13
+ end
14
+
15
+ desc 'Generate documentation.'
16
+ Rake::RDocTask.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'Globalize3'
19
+ rdoc.options << '--line-numbers' << '--inline-source'
20
+ rdoc.rdoc_files.include('README')
21
+ rdoc.rdoc_files.include('lib/**/*.rb')
22
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.1
@@ -0,0 +1,17 @@
1
+ require 'patches/active_record/xml_attribute_serializer'
2
+
3
+ module Globalize
4
+ autoload :ActiveRecord, 'globalize/active_record'
5
+
6
+ class << self
7
+ def fallbacks?
8
+ I18n.respond_to?(:fallbacks)
9
+ end
10
+
11
+ def fallbacks(locale)
12
+ fallbacks? ? I18n.fallbacks[locale] : [locale.to_sym]
13
+ end
14
+ end
15
+ end
16
+
17
+ ActiveRecord::Base.extend(Globalize::ActiveRecord::ActMacro)
@@ -0,0 +1,55 @@
1
+ module Globalize
2
+ class MigrationError < StandardError; end
3
+ class MigrationMissingTranslatedField < MigrationError; end
4
+ class BadMigrationFieldType < MigrationError; end
5
+
6
+ module ActiveRecord
7
+ autoload :ActMacro, 'globalize/active_record/act_macro'
8
+ autoload :Adapter, 'globalize/active_record/adapter'
9
+ autoload :Attributes, 'globalize/active_record/attributes'
10
+ autoload :ClassMethods, 'globalize/active_record/class_methods'
11
+ autoload :InstanceMethods, 'globalize/active_record/instance_methods'
12
+ autoload :Migration, 'globalize/active_record/migration'
13
+
14
+ class << self
15
+ def build_translation_class(target, options)
16
+ options[:table_name] ||= "#{target.table_name.singularize}_translations"
17
+
18
+ klass = target.const_defined?(:Translation) ?
19
+ target.const_get(:Translation) :
20
+ target.const_set(:Translation, Class.new(::ActiveRecord::Base))
21
+
22
+ klass.class_eval do
23
+ set_table_name(options[:table_name])
24
+
25
+ belongs_to target.name.underscore.gsub('/', '_')
26
+
27
+ class << self
28
+ def by_locale(locale)
29
+ where(:locale => locale.to_s)
30
+ end
31
+
32
+ def by_locales(locales)
33
+ where(:locale => locales.map(&:to_s))
34
+ end
35
+
36
+ # TODO build is not defined here even when called through record.translations.find_or_initialize_by_locale(...)
37
+ # def find_or_initialize_by_locale(locale)
38
+ # by_locale(locale.to_s).first || build(:locale => locale.to_s)
39
+ # end
40
+ end
41
+
42
+ def locale
43
+ read_attribute(:locale).to_sym
44
+ end
45
+
46
+ def locale=(locale)
47
+ write_attribute(:locale, locale.to_s)
48
+ end
49
+ end
50
+
51
+ klass
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,51 @@
1
+ module Globalize
2
+ module ActiveRecord
3
+ module ActMacro
4
+ def locale
5
+ (defined?(@@locale) && @@locale)
6
+ end
7
+
8
+ def locale=(locale)
9
+ @@locale = locale
10
+ end
11
+
12
+ def translates(*attr_names)
13
+ return if translates?
14
+ options = attr_names.extract_options!
15
+
16
+ class_inheritable_accessor :translation_class, :translated_attribute_names
17
+ class_inheritable_writer :required_attributes
18
+
19
+ self.translation_class = ActiveRecord.build_translation_class(self, options)
20
+ self.translated_attribute_names = attr_names.map(&:to_sym)
21
+
22
+ include InstanceMethods
23
+ extend ClassMethods, Migration
24
+
25
+ after_save :save_translations!
26
+ has_many :translations, :class_name => translation_class.name,
27
+ :foreign_key => class_name.foreign_key,
28
+ :dependent => :delete_all
29
+
30
+ scope :with_translations, lambda { |locale|
31
+ conditions = required_attributes.map do |attribute|
32
+ "#{quoted_translation_table_name}.#{attribute} IS NOT NULL"
33
+ end
34
+ conditions << "#{quoted_translation_table_name}.locale = ?"
35
+ { :include => :translations, :conditions => [conditions.join(' AND '), locale] }
36
+ }
37
+
38
+ attr_names.each { |attr_name| translated_attr_accessor(attr_name) }
39
+ end
40
+
41
+ def class_name
42
+ class_name = table_name[table_name_prefix.length..-(table_name_suffix.length + 1)].camelize
43
+ pluralize_table_names ? class_name.singularize : class_name
44
+ end
45
+
46
+ def translates?
47
+ included_modules.include?(InstanceMethods)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,82 @@
1
+ module Globalize
2
+ module ActiveRecord
3
+ class Adapter
4
+ # The cache caches attributes that already were looked up for read access.
5
+ # The stash keeps track of new or changed values that need to be saved.
6
+ attr_reader :record, :cache, :stash
7
+
8
+ def initialize(record)
9
+ @record = record
10
+ @cache = Attributes.new
11
+ @stash = Attributes.new
12
+ end
13
+
14
+ def fetch(locale, attr_name)
15
+ cache.contains?(locale, attr_name) ?
16
+ cache.read(locale, attr_name) :
17
+ cache.write(locale, attr_name, fetch_attribute(locale, attr_name))
18
+ end
19
+
20
+ def write(locale, attr_name, value)
21
+ stash.write(locale, attr_name, value)
22
+ cache.write(locale, attr_name, value)
23
+ end
24
+
25
+ def save_translations!
26
+ stash.each do |locale, attrs|
27
+ # TODO use find_or_initialize_by_locale
28
+ translation = record.translations.by_locale(locale.to_s).first
29
+ translation ||= record.translations.build(:locale => locale.to_s)
30
+ attrs.each { |attr_name, value| translation[attr_name] = value }
31
+ translation.save!
32
+ end
33
+ stash.clear
34
+ end
35
+
36
+ def reset
37
+ cache.clear
38
+ # stash.clear
39
+ end
40
+
41
+ protected
42
+
43
+ def fetch_translation(locale)
44
+ locale = locale.to_sym
45
+ record.translations.loaded? ? record.translations.detect { |t| t.locale == locale } :
46
+ record.translations.by_locale(locale)
47
+ end
48
+
49
+ def fetch_translations(locale)
50
+ # only query if not already included with :include => translations
51
+ record.translations.loaded? ? record.translations :
52
+ record.translations.by_locales(Globalize.fallbacks(locale))
53
+ end
54
+
55
+ def fetch_attribute(locale, attr_name)
56
+ translations = fetch_translations(locale)
57
+ value, requested_locale = nil, locale
58
+
59
+ Globalize.fallbacks(locale).each do |fallback|
60
+ translation = translations.detect { |t| t.locale == fallback }
61
+ value = translation && translation.send(attr_name)
62
+ locale = fallback && break if value
63
+ end
64
+
65
+ set_metadata(value, :locale => locale, :requested_locale => requested_locale)
66
+ value
67
+ end
68
+
69
+ def set_metadata(object, metadata)
70
+ if object.respond_to?(:translation_metadata)
71
+ object.translation_metadata.merge!(meta_data)
72
+ end
73
+ end
74
+
75
+ def translation_metadata_accessor(object)
76
+ return if obj.respond_to?(:translation_metadata)
77
+ class << object; attr_accessor :translation_metadata end
78
+ object.translation_metadata ||= {}
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,25 @@
1
+ # Helper class for storing values per locale. Used by Globalize::Adapter
2
+ # to stash and cache attribute values.
3
+ module Globalize
4
+ module ActiveRecord
5
+ class Attributes < Hash
6
+ def [](locale)
7
+ locale = locale.to_sym
8
+ self[locale] = {} unless has_key?(locale)
9
+ self.fetch(locale)
10
+ end
11
+
12
+ def contains?(locale, attr_name)
13
+ self[locale].has_key?(attr_name)
14
+ end
15
+
16
+ def read(locale, attr_name)
17
+ self[locale][attr_name]
18
+ end
19
+
20
+ def write(locale, attr_name, value)
21
+ self[locale][attr_name] = value
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,68 @@
1
+ module Globalize
2
+ module ActiveRecord
3
+ module ClassMethods
4
+ delegate :set_translation_table_name, :to => :translation_class
5
+
6
+ def with_locale(locale)
7
+ previous_locale, self.locale = self.locale, locale
8
+ result = yield
9
+ self.locale = previous_locale
10
+ result
11
+ end
12
+
13
+ def translation_table_name
14
+ translation_class.table_name
15
+ end
16
+
17
+ def quoted_translation_table_name
18
+ translation_class.quoted_table_name
19
+ end
20
+
21
+ def required_attributes
22
+ @required_attributes ||= reflect_on_all_validations.select do |validation|
23
+ validation.macro == :validates_presence_of && translated_attribute_names.include?(validation.name)
24
+ end.map(&:name)
25
+ end
26
+
27
+ def respond_to?(method, *args, &block)
28
+ method.to_s =~ /^find_by_(\w+)$/ && translated_attribute_names.include?($1.to_sym) || super
29
+ end
30
+
31
+ def method_missing(method, *args)
32
+ if method.to_s =~ /^find_by_(\w+)$/ && translated_attribute_names.include?($1.to_sym)
33
+ find_first_by_translated_attr_and_locales($1, args.first)
34
+ else
35
+ super
36
+ end
37
+ end
38
+
39
+ protected
40
+
41
+ def find_first_by_translated_attr_and_locales(name, value)
42
+ query = "#{translated_attr_name(name)} = ? AND #{translated_attr_name('locale')} IN (?)"
43
+ locales = Globalize.fallbacks(locale || I18n.locale).map(&:to_s)
44
+ find(
45
+ :first,
46
+ :joins => :translations,
47
+ :conditions => [query, value, locales],
48
+ :readonly => false
49
+ )
50
+ end
51
+
52
+ def translated_attr_accessor(name)
53
+ define_method "#{name}=", lambda { |value|
54
+ globalize.write(self.class.locale || I18n.locale, name, value)
55
+ self[name] = value
56
+ }
57
+ define_method name, lambda { |*args|
58
+ globalize.fetch(args.first || self.class.locale || I18n.locale, name)
59
+ }
60
+ alias_method "#{name}_before_type_cast", name
61
+ end
62
+
63
+ def translated_attr_name(name)
64
+ "#{translation_class.table_name}.#{name}"
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,63 @@
1
+ module Globalize
2
+ module ActiveRecord
3
+ module InstanceMethods
4
+ def globalize
5
+ @globalize ||= Adapter.new self
6
+ end
7
+
8
+ def attributes
9
+ self.attribute_names.inject({}) do |attrs, name|
10
+ attrs[name] = read_attribute(name) ||
11
+ (globalize.fetch(I18n.locale, name) rescue nil)
12
+ attrs
13
+ end
14
+ end
15
+
16
+ def attributes=(attributes, *args)
17
+ if attributes.respond_to?(:delete) && locale = attributes.delete(:locale)
18
+ self.class.with_locale(locale) { super }
19
+ else
20
+ super
21
+ end
22
+ end
23
+
24
+ def attribute_names
25
+ translated_attribute_names.map(&:to_s) + super
26
+ end
27
+
28
+ def available_locales
29
+ translations.select('DISTINCT locale').map(&:locale)
30
+ end
31
+
32
+ def translated_locales
33
+ translations.map(&:locale)
34
+ end
35
+
36
+ def translated_attributes
37
+ translated_attribute_names.inject({}) do |attributes, name|
38
+ attributes.merge(name => send(name))
39
+ end
40
+ end
41
+
42
+ def set_translations(options)
43
+ options.keys.each do |locale|
44
+ translation = translations.find_by_locale(locale.to_s) ||
45
+ translations.build(:locale => locale.to_s)
46
+ translation.update_attributes!(options[locale])
47
+ end
48
+ end
49
+
50
+ def reload(options = nil)
51
+ translated_attribute_names.each { |name| @attributes.delete(name.to_s) }
52
+ globalize.reset
53
+ super(options)
54
+ end
55
+
56
+ protected
57
+
58
+ def save_translations!
59
+ globalize.save_translations!
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,44 @@
1
+ module Globalize
2
+ module ActiveRecord
3
+ module Migration
4
+ def create_translation_table!(fields)
5
+ translated_attribute_names.each do |f|
6
+ raise MigrationMissingTranslatedField, "Missing translated field #{f}" unless fields[f]
7
+ end
8
+
9
+ fields.each do |name, type|
10
+ if translated_attribute_names.include?(name) && ![:string, :text].include?(type)
11
+ raise BadMigrationFieldType, "Bad field type for #{name}, should be :string or :text"
12
+ end
13
+ end
14
+
15
+ self.connection.create_table(translation_table_name) do |t|
16
+ t.references table_name.sub(/^#{table_name_prefix}/, "").singularize
17
+ t.string :locale
18
+ fields.each do |name, type|
19
+ t.column name, type
20
+ end
21
+ t.timestamps
22
+ end
23
+
24
+ self.connection.add_index(
25
+ translation_table_name,
26
+ "#{table_name.sub(/^#{table_name_prefix}/, "").singularize}_id",
27
+ :name => translation_index_name
28
+ )
29
+ end
30
+
31
+ def translation_index_name
32
+ require 'digest/sha1'
33
+ # FIXME what's the max size of an index name?
34
+ index_name = "index_#{translation_table_name}_on_#{self.table_name.singularize}_id"
35
+ index_name.size < 50 ? index_name : "index_#{Digest::SHA1.hexdigest(index_name)}"
36
+ end
37
+
38
+ def drop_translation_table!
39
+ self.connection.remove_index(translation_table_name, :name => translation_index_name) rescue nil
40
+ self.connection.drop_table(translation_table_name)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,3 @@
1
+ module Globalize
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,41 @@
1
+ # A simple exception handler that behaves like the default exception handler
2
+ # but additionally logs missing translations to a given log.
3
+ #
4
+ # Useful for identifying missing translations during testing.
5
+ #
6
+ # E.g.
7
+ #
8
+ # require 'globalize/i18n/missing_translations_log_handler'
9
+ # I18n.missing_translations_logger = RAILS_DEFAULT_LOGGER
10
+ # I18n.exception_handler = :missing_translations_log_handler
11
+ #
12
+ # To set up a different log file:
13
+ #
14
+ # logger = Logger.new("#{RAILS_ROOT}/log/missing_translations.log")
15
+ # I18n.missing_translations_logger = logger
16
+
17
+ module I18n
18
+ @@missing_translations_logger = nil
19
+
20
+ class << self
21
+ def missing_translations_logger
22
+ @@missing_translations_logger ||= begin
23
+ require 'logger' unless defined?(Logger)
24
+ Logger.new(STDOUT)
25
+ end
26
+ end
27
+
28
+ def missing_translations_logger=(logger)
29
+ @@missing_translations_logger = logger
30
+ end
31
+
32
+ def missing_translations_log_handler(exception, locale, key, options)
33
+ if MissingTranslationData === exception
34
+ missing_translations_logger.warn(exception.message)
35
+ return exception.message
36
+ else
37
+ raise exception
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ # A simple exception handler that behaves like the default exception handler
2
+ # but also raises on missing translations.
3
+ #
4
+ # Useful for identifying missing translations during testing.
5
+ #
6
+ # E.g.
7
+ #
8
+ # require 'globalize/i18n/missing_translations_raise_handler'
9
+ # I18n.exception_handler = :missing_translations_raise_handler
10
+ module I18n
11
+ class << self
12
+ def missing_translations_raise_handler(exception, locale, key, options)
13
+ raise exception
14
+ end
15
+ end
16
+ end
17
+
18
+ I18n.exception_handler = :missing_translations_raise_handler
19
+
20
+ ActionView::Helpers::TranslationHelper.module_eval do
21
+ def translate(key, options = {})
22
+ I18n.translate(key, options)
23
+ end
24
+ alias :t :translate
25
+ end
@@ -0,0 +1,12 @@
1
+ require 'active_record/serializers/xml_serializer'
2
+
3
+ ActiveRecord::XmlSerializer::Attribute.class_eval do
4
+ def compute_type_with_translations
5
+ if @serializable.class.translated_attribute_names.include?(name.to_sym)
6
+ :string
7
+ else
8
+ compute_type_without_translations
9
+ end
10
+ end
11
+ alias_method_chain :compute_type, :translations
12
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: globalize3
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Sven Fuchs
14
+ - Joshua Harvey
15
+ - Clemens Kofler
16
+ - John-Paul Bader
17
+ autorequire:
18
+ bindir: bin
19
+ cert_chain: []
20
+
21
+ date: 2010-07-30 00:00:00 +02:00
22
+ default_executable:
23
+ dependencies:
24
+ - !ruby/object:Gem::Dependency
25
+ name: activerecord
26
+ prerelease: false
27
+ requirement: &id001 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ hash: 7712042
33
+ segments:
34
+ - 3
35
+ - 0
36
+ - 0
37
+ - rc
38
+ version: 3.0.0.rc
39
+ type: :runtime
40
+ version_requirements: *id001
41
+ description: "Rails I18n: de-facto standard library for ActiveRecord 3 model/data translation."
42
+ email: nobody@globalize-rails.org
43
+ executables: []
44
+
45
+ extensions: []
46
+
47
+ extra_rdoc_files: []
48
+
49
+ files:
50
+ - lib/globalize/active_record/act_macro.rb
51
+ - lib/globalize/active_record/adapter.rb
52
+ - lib/globalize/active_record/attributes.rb
53
+ - lib/globalize/active_record/class_methods.rb
54
+ - lib/globalize/active_record/instance_methods.rb
55
+ - lib/globalize/active_record/migration.rb
56
+ - lib/globalize/active_record.rb
57
+ - lib/globalize/version.rb
58
+ - lib/globalize.rb
59
+ - lib/i18n/missing_translations_log_handler.rb
60
+ - lib/i18n/missing_translations_raise_handler.rb
61
+ - lib/patches/active_record/xml_attribute_serializer.rb
62
+ - LICENSE
63
+ - Rakefile
64
+ - README.textile
65
+ - VERSION
66
+ has_rdoc: true
67
+ homepage: http://github.com/svenfuchs/globlize3
68
+ licenses: []
69
+
70
+ post_install_message:
71
+ rdoc_options: []
72
+
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ hash: 3
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ requirements: []
94
+
95
+ rubyforge_project: "[none]"
96
+ rubygems_version: 1.3.7
97
+ signing_key:
98
+ specification_version: 3
99
+ summary: "Rails I18n: de-facto standard library for ActiveRecord 3 model/data translation"
100
+ test_files: []
101
+