i18n-inline_forms 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.
- data/Gemfile +3 -0
- data/Gemfile.lock +91 -0
- data/MIT-LICENSE +21 -0
- data/README +0 -0
- data/README.textile +70 -0
- data/Rakefile +2 -0
- data/i18n-inline_forms.gemspec +33 -0
- data/lib/i18n/backend/inline_forms.rb +62 -0
- data/lib/i18n/backend/inline_forms/missing.rb +66 -0
- data/lib/i18n/backend/inline_forms/store_procs.rb +39 -0
- data/lib/i18n/backend/inline_forms/translation.rb +132 -0
- data/lib/i18n/inline_forms.rb +1 -0
- data/lib/i18n/inline_forms/version.rb +6 -0
- data/test/all.rb +7 -0
- data/test/api_test.rb +30 -0
- data/test/inline_forms_test.rb +54 -0
- data/test/missing_test.rb +71 -0
- data/test/test_helper.rb +56 -0
- data/test/test_setup.rb +92 -0
- metadata +171 -0
    
        data/Gemfile
    ADDED
    
    
    
        data/Gemfile.lock
    ADDED
    
    | @@ -0,0 +1,91 @@ | |
| 1 | 
            +
            PATH
         | 
| 2 | 
            +
              remote: .
         | 
| 3 | 
            +
              specs:
         | 
| 4 | 
            +
                i18n-inline_forms (0.1)
         | 
| 5 | 
            +
                  i18n (>= 0.5.0)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            GEM
         | 
| 8 | 
            +
              remote: http://rubygems.org/
         | 
| 9 | 
            +
              specs:
         | 
| 10 | 
            +
                actionpack (3.2.2)
         | 
| 11 | 
            +
                  activemodel (= 3.2.2)
         | 
| 12 | 
            +
                  activesupport (= 3.2.2)
         | 
| 13 | 
            +
                  builder (~> 3.0.0)
         | 
| 14 | 
            +
                  erubis (~> 2.7.0)
         | 
| 15 | 
            +
                  journey (~> 1.0.1)
         | 
| 16 | 
            +
                  rack (~> 1.4.0)
         | 
| 17 | 
            +
                  rack-cache (~> 1.1)
         | 
| 18 | 
            +
                  rack-test (~> 0.6.1)
         | 
| 19 | 
            +
                  sprockets (~> 2.1.2)
         | 
| 20 | 
            +
                activemodel (3.2.2)
         | 
| 21 | 
            +
                  activesupport (= 3.2.2)
         | 
| 22 | 
            +
                  builder (~> 3.0.0)
         | 
| 23 | 
            +
                activesupport (3.2.2)
         | 
| 24 | 
            +
                  i18n (~> 0.6)
         | 
| 25 | 
            +
                  multi_json (~> 1.0)
         | 
| 26 | 
            +
                builder (3.0.0)
         | 
| 27 | 
            +
                diff-lcs (1.1.3)
         | 
| 28 | 
            +
                erubis (2.7.0)
         | 
| 29 | 
            +
                git (1.2.5)
         | 
| 30 | 
            +
                hike (1.2.1)
         | 
| 31 | 
            +
                i18n (0.6.0)
         | 
| 32 | 
            +
                jeweler (1.5.2)
         | 
| 33 | 
            +
                  bundler (~> 1.0.0)
         | 
| 34 | 
            +
                  git (>= 1.2.5)
         | 
| 35 | 
            +
                  rake
         | 
| 36 | 
            +
                journey (1.0.3)
         | 
| 37 | 
            +
                json (1.6.5)
         | 
| 38 | 
            +
                multi_json (1.1.0)
         | 
| 39 | 
            +
                rack (1.4.1)
         | 
| 40 | 
            +
                rack-cache (1.2)
         | 
| 41 | 
            +
                  rack (>= 0.4)
         | 
| 42 | 
            +
                rack-ssl (1.3.2)
         | 
| 43 | 
            +
                  rack
         | 
| 44 | 
            +
                rack-test (0.6.1)
         | 
| 45 | 
            +
                  rack (>= 1.0)
         | 
| 46 | 
            +
                railties (3.2.2)
         | 
| 47 | 
            +
                  actionpack (= 3.2.2)
         | 
| 48 | 
            +
                  activesupport (= 3.2.2)
         | 
| 49 | 
            +
                  rack-ssl (~> 1.3.2)
         | 
| 50 | 
            +
                  rake (>= 0.8.7)
         | 
| 51 | 
            +
                  rdoc (~> 3.4)
         | 
| 52 | 
            +
                  thor (~> 0.14.6)
         | 
| 53 | 
            +
                rake (0.9.2.2)
         | 
| 54 | 
            +
                rcov (1.0.0)
         | 
| 55 | 
            +
                rdoc (3.12)
         | 
| 56 | 
            +
                  json (~> 1.4)
         | 
| 57 | 
            +
                rspec (2.8.0)
         | 
| 58 | 
            +
                  rspec-core (~> 2.8.0)
         | 
| 59 | 
            +
                  rspec-expectations (~> 2.8.0)
         | 
| 60 | 
            +
                  rspec-mocks (~> 2.8.0)
         | 
| 61 | 
            +
                rspec-core (2.8.0)
         | 
| 62 | 
            +
                rspec-expectations (2.8.0)
         | 
| 63 | 
            +
                  diff-lcs (~> 1.1.2)
         | 
| 64 | 
            +
                rspec-mocks (2.8.0)
         | 
| 65 | 
            +
                rspec-rails (2.8.1)
         | 
| 66 | 
            +
                  actionpack (>= 3.0)
         | 
| 67 | 
            +
                  activesupport (>= 3.0)
         | 
| 68 | 
            +
                  railties (>= 3.0)
         | 
| 69 | 
            +
                  rspec (~> 2.8.0)
         | 
| 70 | 
            +
                shoulda (3.0.1)
         | 
| 71 | 
            +
                  shoulda-context (~> 1.0.0)
         | 
| 72 | 
            +
                  shoulda-matchers (~> 1.0.0)
         | 
| 73 | 
            +
                shoulda-context (1.0.0)
         | 
| 74 | 
            +
                shoulda-matchers (1.0.0)
         | 
| 75 | 
            +
                sprockets (2.1.2)
         | 
| 76 | 
            +
                  hike (~> 1.2)
         | 
| 77 | 
            +
                  rack (~> 1.0)
         | 
| 78 | 
            +
                  tilt (~> 1.1, != 1.3.0)
         | 
| 79 | 
            +
                thor (0.14.6)
         | 
| 80 | 
            +
                tilt (1.3.3)
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            PLATFORMS
         | 
| 83 | 
            +
              ruby
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            DEPENDENCIES
         | 
| 86 | 
            +
              bundler (~> 1.0.0)
         | 
| 87 | 
            +
              i18n-inline_forms!
         | 
| 88 | 
            +
              jeweler (~> 1.5.2)
         | 
| 89 | 
            +
              rcov
         | 
| 90 | 
            +
              rspec-rails
         | 
| 91 | 
            +
              shoulda
         | 
    
        data/MIT-LICENSE
    ADDED
    
    | @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            Copyright (c) 2010 Sven Fuchs <svenfuchs@artweb-design.de>
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Permission is hereby granted, free of charge, to any person obtaining
         | 
| 4 | 
            +
            a copy of this software and associated documentation files (the
         | 
| 5 | 
            +
            "Software"), to deal in the Software without restriction, including
         | 
| 6 | 
            +
            without limitation the rights to use, copy, modify, merge, publish,
         | 
| 7 | 
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         | 
| 8 | 
            +
            permit persons to whom the Software is furnished to do so, subject to
         | 
| 9 | 
            +
            the following conditions:
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            The above copyright notice and this permission notice shall be
         | 
| 12 | 
            +
            included in all copies or substantial portions of the Software.
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         | 
| 15 | 
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         | 
| 16 | 
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         | 
| 17 | 
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         | 
| 18 | 
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         | 
| 19 | 
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         | 
| 20 | 
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         | 
| 21 | 
            +
             | 
    
        data/README
    ADDED
    
    | 
            File without changes
         | 
    
        data/README.textile
    ADDED
    
    | @@ -0,0 +1,70 @@ | |
| 1 | 
            +
            h1. I18n::Backend::InlineForms
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This repository contains the I18n InlineForms backend and support code that has been extracted from the "I18n":http://github.com/svenfuchs/i18n.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            h2. Installation
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            For Bundler put the following in your Gemfile:
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            <pre>
         | 
| 10 | 
            +
              gem 'i18n-inline_forms'
         | 
| 11 | 
            +
            </pre>
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            Next create a active record model named @Translation@ with the Rails Generator.
         | 
| 14 | 
            +
            Your migration should look like this:
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            <pre>
         | 
| 17 | 
            +
              class CreateTranslations < InlineForms::Migration
         | 
| 18 | 
            +
                def self.up
         | 
| 19 | 
            +
                  create_table :translations do |t|
         | 
| 20 | 
            +
                    t.string :locale
         | 
| 21 | 
            +
                    t.string :key
         | 
| 22 | 
            +
                    t.text   :value
         | 
| 23 | 
            +
                    t.text   :interpolations
         | 
| 24 | 
            +
                    t.boolean :is_proc, :default => false
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    t.timestamps
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def self.down
         | 
| 31 | 
            +
                  drop_table :translations
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            </pre>
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            With this translation model you will be able to manage your translation, and add new translations or languages through
         | 
| 37 | 
            +
            it.
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            To load @I18n::Backend::InlineForms@ into your Rails application, create a new file in *config/initializers* named *locale.rb*.
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            A simple configuration for your locale.rb could look like this:
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            <pre>
         | 
| 44 | 
            +
              require 'i18n/backend/inline_forms'
         | 
| 45 | 
            +
              I18n.backend = I18n::Backend::InlineForms.new
         | 
| 46 | 
            +
            </pre>
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            A more adavanced example (Thanks Moritz), which uses YAML files and InlineForms for lookups:
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            <pre>
         | 
| 51 | 
            +
              require 'i18n/backend/inline_forms'
         | 
| 52 | 
            +
              I18n.backend = I18n::Backend::InlineForms.new
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              I18n::Backend::InlineForms.send(:include, I18n::Backend::Memoize)
         | 
| 55 | 
            +
              I18n::Backend::InlineForms.send(:include, I18n::Backend::Flatten)
         | 
| 56 | 
            +
              I18n::Backend::Simple.send(:include, I18n::Backend::Memoize)
         | 
| 57 | 
            +
              I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              I18n.backend = I18n::Backend::Chain.new(I18n::Backend::Simple.new, I18n.backend)
         | 
| 60 | 
            +
            </pre>
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            h2. Usage
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            You can now use @I18n.t('Your String')@ to lookup translations in the database.
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            h2. Maintainers
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            * Sven Fuchs
         | 
| 69 | 
            +
             | 
| 70 | 
            +
             | 
    
        data/Rakefile
    ADDED
    
    
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            $:.unshift File.expand_path('../lib', __FILE__)
         | 
| 4 | 
            +
            require 'i18n/inline_forms/version'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Gem::Specification.new do |s|
         | 
| 7 | 
            +
              s.name         = "i18n-inline_forms"
         | 
| 8 | 
            +
              s.version      = I18n::InlineForms::VERSION
         | 
| 9 | 
            +
              s.authors      = ["Ace Suares"]
         | 
| 10 | 
            +
              s.email        = "ace@suares.com"
         | 
| 11 | 
            +
              s.homepage     = "http://github.com/acesuares/i18n-inline_forms"
         | 
| 12 | 
            +
              s.summary      = "I18n InlineForms backend"
         | 
| 13 | 
            +
              s.description  = "I18n InlineForms backend. Allows to store translations in a database using InlineForms, e.g. for providing a web-interface for managing translations. Forked from i18n-active_record by Sven Fuchs."
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              s.platform     = Gem::Platform::RUBY
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              s.add_dependency 'i18n', '>= 0.5.0'
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              s.rubyforge_project = "i18n-inline_forms"
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              s.files         = `git ls-files`.split("\n")
         | 
| 22 | 
            +
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 23 | 
            +
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 24 | 
            +
              s.require_paths = ["lib"]
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              s.add_development_dependency(%q<rspec-rails>, [">= 0"])
         | 
| 27 | 
            +
              s.add_development_dependency(%q<shoulda>, [">= 0"])
         | 
| 28 | 
            +
              s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
         | 
| 29 | 
            +
              s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
         | 
| 30 | 
            +
              s.add_development_dependency(%q<rcov>, [">= 0"])
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            end
         | 
| 33 | 
            +
             | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            require 'i18n/backend/base'
         | 
| 2 | 
            +
            require 'i18n/backend/inline_forms/translation'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module I18n
         | 
| 5 | 
            +
              module Backend
         | 
| 6 | 
            +
                class InlineForms
         | 
| 7 | 
            +
                  autoload :Missing,     'i18n/backend/inline_forms/missing'
         | 
| 8 | 
            +
                  autoload :StoreProcs,  'i18n/backend/inline_forms/store_procs'
         | 
| 9 | 
            +
                  autoload :Translation, 'i18n/backend/inline_forms/translation'
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  module Implementation
         | 
| 12 | 
            +
                    include Base, Flatten
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def available_locales
         | 
| 15 | 
            +
                      begin
         | 
| 16 | 
            +
                        Translation.available_locales
         | 
| 17 | 
            +
                      rescue ::InlineForms::StatementInvalid
         | 
| 18 | 
            +
                        []
         | 
| 19 | 
            +
                      end
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    def store_translations(locale, data, options = {})
         | 
| 23 | 
            +
                      escape = options.fetch(:escape, true)
         | 
| 24 | 
            +
                      flatten_translations(locale, data, escape, false).each do |key, value|
         | 
| 25 | 
            +
                        Translation.locale(locale).lookup(expand_keys(key)).delete_all
         | 
| 26 | 
            +
                        Translation.create(:locale => locale.to_s, :key => key.to_s, :value => value)
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  protected
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    def lookup(locale, key, scope = [], options = {})
         | 
| 33 | 
            +
                      key = normalize_flat_keys(locale, key, scope, options[:separator])
         | 
| 34 | 
            +
                      result = Translation.locale(locale).lookup(key).all
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      if result.empty?
         | 
| 37 | 
            +
                        nil
         | 
| 38 | 
            +
                      elsif result.first.key == key
         | 
| 39 | 
            +
                        result.first.value
         | 
| 40 | 
            +
                      else
         | 
| 41 | 
            +
                        chop_range = (key.size + FLATTEN_SEPARATOR.size)..-1
         | 
| 42 | 
            +
                        result = result.inject({}) do |hash, r|
         | 
| 43 | 
            +
                          hash[r.key.slice(chop_range)] = r.value
         | 
| 44 | 
            +
                          hash
         | 
| 45 | 
            +
                        end
         | 
| 46 | 
            +
                        result.deep_symbolize_keys
         | 
| 47 | 
            +
                      end
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    # For a key :'foo.bar.baz' return ['foo', 'foo.bar', 'foo.bar.baz']
         | 
| 51 | 
            +
                    def expand_keys(key)
         | 
| 52 | 
            +
                      key.to_s.split(FLATTEN_SEPARATOR).inject([]) do |keys, key|
         | 
| 53 | 
            +
                        keys << [keys.last, key].compact.join(FLATTEN_SEPARATOR)
         | 
| 54 | 
            +
                      end
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  include Implementation
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
| 62 | 
            +
             | 
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            #  This extension stores translation stub records for missing translations to
         | 
| 2 | 
            +
            #  the database.
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
            #  This is useful if you have a web based translation tool. It will populate
         | 
| 5 | 
            +
            #  the database with untranslated keys as the application is being used. A
         | 
| 6 | 
            +
            #  translator can then go through these and add missing translations.
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            #  Example usage:
         | 
| 9 | 
            +
            #
         | 
| 10 | 
            +
            #     I18n::Backend::Chain.send(:include, I18n::Backend::InlineForms::Missing)
         | 
| 11 | 
            +
            #     I18n.backend = I18n::Backend::Chain.new(I18n::Backend::InlineForms.new, I18n::Backend::Simple.new)
         | 
| 12 | 
            +
            #
         | 
| 13 | 
            +
            #  Stub records for pluralizations will also be created for each key defined
         | 
| 14 | 
            +
            #  in i18n.plural.keys.
         | 
| 15 | 
            +
            #
         | 
| 16 | 
            +
            #  For example:
         | 
| 17 | 
            +
            #
         | 
| 18 | 
            +
            #    # en.yml
         | 
| 19 | 
            +
            #    en:
         | 
| 20 | 
            +
            #      i18n:
         | 
| 21 | 
            +
            #        plural:
         | 
| 22 | 
            +
            #          keys: [:zero, :one, :other]
         | 
| 23 | 
            +
            #
         | 
| 24 | 
            +
            #    # pl.yml
         | 
| 25 | 
            +
            #    pl:
         | 
| 26 | 
            +
            #      i18n:
         | 
| 27 | 
            +
            #        plural:
         | 
| 28 | 
            +
            #          keys: [:zero, :one, :few, :other]
         | 
| 29 | 
            +
            #
         | 
| 30 | 
            +
            #  It will also persist interpolation keys in Translation#interpolations so
         | 
| 31 | 
            +
            #  translators will be able to review and use them.
         | 
| 32 | 
            +
            module I18n
         | 
| 33 | 
            +
              module Backend
         | 
| 34 | 
            +
                class InlineForms
         | 
| 35 | 
            +
                  module Missing
         | 
| 36 | 
            +
                    include Flatten
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def store_default_translations(locale, key, options = {})
         | 
| 39 | 
            +
                      count, scope, default, separator = options.values_at(:count, :scope, :default, :separator)
         | 
| 40 | 
            +
                      separator ||= I18n.default_separator
         | 
| 41 | 
            +
                      key = normalize_flat_keys(locale, key, scope, separator)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                      unless InlineForms::Translation.locale(locale).lookup(key).exists?
         | 
| 44 | 
            +
                        interpolations = options.keys - I18n::RESERVED_KEYS
         | 
| 45 | 
            +
                        keys = count ? I18n.t('i18n.plural.keys', :locale => locale).map { |k| [key, k].join(FLATTEN_SEPARATOR) } : [key]
         | 
| 46 | 
            +
                        keys.each { |key| store_default_translation(locale, key, interpolations) }
         | 
| 47 | 
            +
                      end
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    def store_default_translation(locale, key, interpolations)
         | 
| 51 | 
            +
                      translation = InlineForms::Translation.new :locale => locale.to_s, :key => key
         | 
| 52 | 
            +
                      translation.interpolations = interpolations
         | 
| 53 | 
            +
                      translation.save
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    def translate(locale, key, options = {})
         | 
| 57 | 
            +
                      super
         | 
| 58 | 
            +
                    rescue I18n::MissingTranslationData => e
         | 
| 59 | 
            +
                      self.store_default_translations(locale, key, options)
         | 
| 60 | 
            +
                      raise e
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
            end
         | 
| 66 | 
            +
             | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            # This module is intended to be mixed into the InlineForms backend to allow
         | 
| 2 | 
            +
            # storing Ruby Procs as translation values in the database.
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
            #   I18n.backend = I18n::Backend::InlineForms.new
         | 
| 5 | 
            +
            #   I18n::Backend::InlineForms::Translation.send(:include, I18n::Backend::InlineForms::StoreProcs)
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # The StoreProcs module requires the ParseTree and ruby2ruby gems and therefor
         | 
| 8 | 
            +
            # was extracted from the original backend.
         | 
| 9 | 
            +
            #
         | 
| 10 | 
            +
            # ParseTree is not compatible with Ruby 1.9.
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            begin
         | 
| 13 | 
            +
              require 'ruby2ruby'
         | 
| 14 | 
            +
              require 'parse_tree'
         | 
| 15 | 
            +
              require 'parse_tree_extensions'
         | 
| 16 | 
            +
            rescue LoadError => e
         | 
| 17 | 
            +
              puts "can't use StoreProcs because: #{e.message}"
         | 
| 18 | 
            +
            end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            module I18n
         | 
| 21 | 
            +
              module Backend
         | 
| 22 | 
            +
                class InlineForms
         | 
| 23 | 
            +
                  module StoreProcs
         | 
| 24 | 
            +
                    def value=(v)
         | 
| 25 | 
            +
                      case v
         | 
| 26 | 
            +
                      when Proc
         | 
| 27 | 
            +
                        write_attribute(:value, v.to_ruby)
         | 
| 28 | 
            +
                        write_attribute(:is_proc, true)
         | 
| 29 | 
            +
                      else
         | 
| 30 | 
            +
                        write_attribute(:value, v)
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    Translation.send(:include, self) if method(:to_s).respond_to?(:to_ruby)
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| 39 | 
            +
             | 
| @@ -0,0 +1,132 @@ | |
| 1 | 
            +
            require 'inline_forms'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module I18n
         | 
| 4 | 
            +
              module Backend
         | 
| 5 | 
            +
                # InlineForms model used to store actual translations to the database.
         | 
| 6 | 
            +
                #
         | 
| 7 | 
            +
                # This model expects a table like the following to be already set up in
         | 
| 8 | 
            +
                # your the database:
         | 
| 9 | 
            +
                #
         | 
| 10 | 
            +
                #   create_table :translations do |t|
         | 
| 11 | 
            +
                #     t.string :locale
         | 
| 12 | 
            +
                #     t.string :key
         | 
| 13 | 
            +
                #     t.text   :value
         | 
| 14 | 
            +
                #     t.text   :interpolations
         | 
| 15 | 
            +
                #     t.boolean :is_proc, :default => false
         | 
| 16 | 
            +
                #   end
         | 
| 17 | 
            +
                #
         | 
| 18 | 
            +
             | 
| 19 | 
            +
             | 
| 20 | 
            +
                # 2012-03-10 'key' is a reserved keyword in MySQL 5 so we create the table
         | 
| 21 | 
            +
                # like this:
         | 
| 22 | 
            +
                # 
         | 
| 23 | 
            +
                #   create_table :translations do |t|
         | 
| 24 | 
            +
                #     t.string :locale
         | 
| 25 | 
            +
                #     t.string :thekey
         | 
| 26 | 
            +
                #     t.text   :value
         | 
| 27 | 
            +
                #     t.text   :interpolations
         | 
| 28 | 
            +
                #     t.boolean :is_proc, :default => false
         | 
| 29 | 
            +
                #   end
         | 
| 30 | 
            +
                #
         | 
| 31 | 
            +
                # and in our model we alias key alias_attribute :key, :thekey
         | 
| 32 | 
            +
                #
         | 
| 33 | 
            +
                #also rails 3 scoping
         | 
| 34 | 
            +
                #
         | 
| 35 | 
            +
             | 
| 36 | 
            +
             | 
| 37 | 
            +
                #
         | 
| 38 | 
            +
                # This model supports to named scopes :locale and :lookup. The :locale
         | 
| 39 | 
            +
                # scope simply adds a condition for a given locale:
         | 
| 40 | 
            +
                #
         | 
| 41 | 
            +
                #   I18n::Backend::InlineForms::Translation.locale(:en).all
         | 
| 42 | 
            +
                #   # => all translation records that belong to the :en locale
         | 
| 43 | 
            +
                #
         | 
| 44 | 
            +
                # The :lookup scope adds a condition for looking up all translations
         | 
| 45 | 
            +
                # that either start with the given keys (joined by an optionally given
         | 
| 46 | 
            +
                # separator or I18n.default_separator) or that exactly have this key.
         | 
| 47 | 
            +
                #
         | 
| 48 | 
            +
                #   # with translations present for :"foo.bar" and :"foo.baz"
         | 
| 49 | 
            +
                #   I18n::Backend::InlineForms::Translation.lookup(:foo)
         | 
| 50 | 
            +
                #   # => an array with both translation records :"foo.bar" and :"foo.baz"
         | 
| 51 | 
            +
                #
         | 
| 52 | 
            +
                #   I18n::Backend::InlineForms::Translation.lookup([:foo, :bar])
         | 
| 53 | 
            +
                #   I18n::Backend::InlineForms::Translation.lookup(:"foo.bar")
         | 
| 54 | 
            +
                #   # => an array with the translation record :"foo.bar"
         | 
| 55 | 
            +
                #
         | 
| 56 | 
            +
                # When the StoreProcs module was mixed into this model then Procs will
         | 
| 57 | 
            +
                # be stored to the database as Ruby code and evaluated when :value is
         | 
| 58 | 
            +
                # called.
         | 
| 59 | 
            +
                #
         | 
| 60 | 
            +
                #   Translation = I18n::Backend::InlineForms::Translation
         | 
| 61 | 
            +
                #   Translation.create \
         | 
| 62 | 
            +
                #     :locale => 'en'
         | 
| 63 | 
            +
                #     :key    => 'foo'
         | 
| 64 | 
            +
                #     :value  => lambda { |key, options| 'FOO' }
         | 
| 65 | 
            +
                #   Translation.find_by_locale_and_key('en', 'foo').value
         | 
| 66 | 
            +
                #   # => 'FOO'
         | 
| 67 | 
            +
                class InlineForms
         | 
| 68 | 
            +
                  class Translation < ::InlineForms::Base
         | 
| 69 | 
            +
                    TRUTHY_CHAR = "\001"
         | 
| 70 | 
            +
                    FALSY_CHAR = "\002"
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    set_table_name 'translations'
         | 
| 73 | 
            +
                    attr_protected :is_proc, :interpolations
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    serialize :value
         | 
| 76 | 
            +
                    serialize :interpolations, Array
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    alias_attribute :key, :thekey
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    scope :locale, lambda { |locale|
         | 
| 81 | 
            +
                      where('locale = ? ', locale.to_s)
         | 
| 82 | 
            +
                    }
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    scope :lookup, lambda { |keys, *separator|
         | 
| 85 | 
            +
                      keys = Array(keys).map! { |key| key.to_s }
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                      unless separator.empty?
         | 
| 88 | 
            +
                        warn "[DEPRECATION] Giving a separator to Translation.lookup is deprecated. " <<
         | 
| 89 | 
            +
                          "You can change the internal separator by overwriting FLATTEN_SEPARATOR."
         | 
| 90 | 
            +
                      end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                      namespace = "#{keys.last}#{I18n::Backend::Flatten::FLATTEN_SEPARATOR}%"
         | 
| 93 | 
            +
                      where("thekey IN (?) OR thekey LIKE ?", keys, namespace)
         | 
| 94 | 
            +
                    }
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                    class << self
         | 
| 97 | 
            +
                      def available_locales
         | 
| 98 | 
            +
                        Translation.select(:locale).uniq.map { |t| t.locale.to_sym }
         | 
| 99 | 
            +
                      end
         | 
| 100 | 
            +
                    end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                    def interpolates?(key)
         | 
| 103 | 
            +
                      self.interpolations.include?(key) if self.interpolations
         | 
| 104 | 
            +
                    end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    def value
         | 
| 107 | 
            +
                      value = read_attribute(:value)
         | 
| 108 | 
            +
                      if is_proc
         | 
| 109 | 
            +
                        Kernel.eval(value)
         | 
| 110 | 
            +
                      elsif value == FALSY_CHAR
         | 
| 111 | 
            +
                        false
         | 
| 112 | 
            +
                      elsif value == TRUTHY_CHAR
         | 
| 113 | 
            +
                        true
         | 
| 114 | 
            +
                      else
         | 
| 115 | 
            +
                        value
         | 
| 116 | 
            +
                      end
         | 
| 117 | 
            +
                    end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                    def value=(value)
         | 
| 120 | 
            +
                      if value === false
         | 
| 121 | 
            +
                        value = FALSY_CHAR
         | 
| 122 | 
            +
                      elsif value === true
         | 
| 123 | 
            +
                        value = TRUTHY_CHAR
         | 
| 124 | 
            +
                      end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                      write_attribute(:value, value)
         | 
| 127 | 
            +
                    end
         | 
| 128 | 
            +
                  end
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
              end
         | 
| 131 | 
            +
            end
         | 
| 132 | 
            +
             | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            require 'i18n'
         | 
    
        data/test/all.rb
    ADDED
    
    
    
        data/test/api_test.rb
    ADDED
    
    | @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            require File.expand_path('../test_helper', __FILE__)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class I18nInlineFormsApiTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              def setup
         | 
| 5 | 
            +
                I18n.backend = I18n::Backend::InlineForms.new
         | 
| 6 | 
            +
                super
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              def self.can_store_procs?
         | 
| 10 | 
            +
                I18n::Backend::InlineForms.included_modules.include?(I18n::Backend::InlineForms::StoreProcs)
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              include I18n::Tests::Basics
         | 
| 14 | 
            +
              include I18n::Tests::Defaults
         | 
| 15 | 
            +
              include I18n::Tests::Interpolation
         | 
| 16 | 
            +
              include I18n::Tests::Link
         | 
| 17 | 
            +
              include I18n::Tests::Lookup
         | 
| 18 | 
            +
              include I18n::Tests::Pluralization
         | 
| 19 | 
            +
              include I18n::Tests::Procs if can_store_procs?
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              include I18n::Tests::Localization::Date
         | 
| 22 | 
            +
              include I18n::Tests::Localization::DateTime
         | 
| 23 | 
            +
              include I18n::Tests::Localization::Time
         | 
| 24 | 
            +
              include I18n::Tests::Localization::Procs if can_store_procs?
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              test "make sure we use an InlineForms backend" do
         | 
| 27 | 
            +
                assert_equal I18n::Backend::InlineForms, I18n.backend.class
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end if defined?(InlineForms)
         | 
| 30 | 
            +
             | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            require File.expand_path('../test_helper', __FILE__)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class I18nBackendInlineFormsTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              def setup
         | 
| 5 | 
            +
                I18n.backend = I18n::Backend::InlineForms.new
         | 
| 6 | 
            +
                store_translations(:en, :foo => { :bar => 'bar', :baz => 'baz' })
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              def teardown
         | 
| 10 | 
            +
                I18n::Backend::InlineForms::Translation.destroy_all
         | 
| 11 | 
            +
                super
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              test "store_translations does not allow ambiguous keys (1)" do
         | 
| 15 | 
            +
                I18n::Backend::InlineForms::Translation.delete_all
         | 
| 16 | 
            +
                I18n.backend.store_translations(:en, :foo => 'foo')
         | 
| 17 | 
            +
                I18n.backend.store_translations(:en, :foo => { :bar => 'bar' })
         | 
| 18 | 
            +
                I18n.backend.store_translations(:en, :foo => { :baz => 'baz' })
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                translations = I18n::Backend::InlineForms::Translation.locale(:en).lookup('foo').all
         | 
| 21 | 
            +
                assert_equal %w(bar baz), translations.map(&:value)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                assert_equal({ :bar => 'bar', :baz => 'baz' }, I18n.t(:foo))
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              test "store_translations does not allow ambiguous keys (2)" do
         | 
| 27 | 
            +
                I18n::Backend::InlineForms::Translation.delete_all
         | 
| 28 | 
            +
                I18n.backend.store_translations(:en, :foo => { :bar => 'bar' })
         | 
| 29 | 
            +
                I18n.backend.store_translations(:en, :foo => { :baz => 'baz' })
         | 
| 30 | 
            +
                I18n.backend.store_translations(:en, :foo => 'foo')
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                translations = I18n::Backend::InlineForms::Translation.locale(:en).lookup('foo').all
         | 
| 33 | 
            +
                assert_equal %w(foo), translations.map(&:value)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                assert_equal 'foo', I18n.t(:foo)
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              test "can store translations with keys that are translations containing special chars" do
         | 
| 39 | 
            +
                I18n.backend.store_translations(:es, :"Pagina's" => "Pagina's" )
         | 
| 40 | 
            +
                assert_equal "Pagina's", I18n.t(:"Pagina's", :locale => :es)
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              with_mocha do
         | 
| 44 | 
            +
                test "missing translations table does not cause an error in #available_locales" do
         | 
| 45 | 
            +
                  I18n::Backend::InlineForms::Translation.expects(:available_locales).raises(::InlineForms::StatementInvalid)
         | 
| 46 | 
            +
                  assert_equal [], I18n.backend.available_locales
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              def test_expand_keys
         | 
| 51 | 
            +
                assert_equal %w(foo foo.bar foo.bar.baz), I18n.backend.send(:expand_keys, :'foo.bar.baz')
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end if defined?(InlineForms)
         | 
| 54 | 
            +
             | 
| @@ -0,0 +1,71 @@ | |
| 1 | 
            +
            require File.expand_path('../test_helper', __FILE__)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class I18nInlineFormsMissingTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              class Backend < I18n::Backend::InlineForms
         | 
| 5 | 
            +
                include I18n::Backend::InlineForms::Missing
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def setup
         | 
| 9 | 
            +
                I18n.backend.store_translations(:en, :bar => 'Bar', :i18n => { :plural => { :keys => [:zero, :one, :other] } })
         | 
| 10 | 
            +
                I18n.backend = I18n::Backend::Chain.new(Backend.new, I18n.backend)
         | 
| 11 | 
            +
                I18n::Backend::InlineForms::Translation.delete_all
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              test "can persist interpolations" do
         | 
| 15 | 
            +
                translation = I18n::Backend::InlineForms::Translation.new(:key => 'foo', :value => 'bar', :locale => :en)
         | 
| 16 | 
            +
                translation.interpolations = %w(count name)
         | 
| 17 | 
            +
                translation.save
         | 
| 18 | 
            +
                assert translation.valid?
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              test "lookup persists the key" do
         | 
| 22 | 
            +
                I18n.t('foo.bar.baz')
         | 
| 23 | 
            +
                assert_equal 1, I18n::Backend::InlineForms::Translation.count
         | 
| 24 | 
            +
                assert I18n::Backend::InlineForms::Translation.locale(:en).find_by_key('foo.bar.baz')
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              test "lookup does not persist the key twice" do
         | 
| 28 | 
            +
                2.times { I18n.t('foo.bar.baz') }
         | 
| 29 | 
            +
                assert_equal 1, I18n::Backend::InlineForms::Translation.count
         | 
| 30 | 
            +
                assert I18n::Backend::InlineForms::Translation.locale(:en).find_by_key('foo.bar.baz')
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              test "lookup persists interpolation keys when looked up directly" do
         | 
| 34 | 
            +
                I18n.t('foo.bar.baz', :cow => "lucy" )  # creates stub translation.
         | 
| 35 | 
            +
                translation_stub = I18n::Backend::InlineForms::Translation.locale(:en).lookup('foo.bar.baz').first
         | 
| 36 | 
            +
                assert translation_stub.interpolates?(:cow)
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              test "creates one stub per pluralization" do
         | 
| 40 | 
            +
                I18n.t('foo', :count => 999)
         | 
| 41 | 
            +
                translations = I18n::Backend::InlineForms::Translation.locale(:en).find_all_by_key %w{ foo.zero foo.one foo.other }
         | 
| 42 | 
            +
                assert_equal 3, translations.length
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              test "creates no stub for base key in pluralization" do
         | 
| 46 | 
            +
                I18n.t('foo', :count => 999)
         | 
| 47 | 
            +
                assert_equal 3, I18n::Backend::InlineForms::Translation.locale(:en).lookup("foo").count
         | 
| 48 | 
            +
                assert !I18n::Backend::InlineForms::Translation.locale(:en).find_by_key("foo")
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              test "creates a stub when a custom separator is used" do
         | 
| 52 | 
            +
                I18n.t('foo|baz', :separator => '|')
         | 
| 53 | 
            +
                I18n::Backend::InlineForms::Translation.locale(:en).lookup("foo.baz").first.update_attributes!(:value => 'baz!')
         | 
| 54 | 
            +
                assert_equal 'baz!', I18n.t('foo|baz', :separator => '|')
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              test "creates a stub per pluralization when a custom separator is used" do
         | 
| 58 | 
            +
                I18n.t('foo|bar', :count => 999, :separator => '|')
         | 
| 59 | 
            +
                translations = I18n::Backend::InlineForms::Translation.locale(:en).find_all_by_key %w{ foo.bar.zero foo.bar.one foo.bar.other }
         | 
| 60 | 
            +
                assert_equal 3, translations.length
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              test "creates a stub when a custom separator is used and the key contains the flatten separator (a dot character)" do
         | 
| 64 | 
            +
                key = 'foo|baz.zab'
         | 
| 65 | 
            +
                I18n.t(key, :separator => '|')
         | 
| 66 | 
            +
                I18n::Backend::InlineForms::Translation.locale(:en).lookup("foo.baz\001zab").first.update_attributes!(:value => 'baz!')
         | 
| 67 | 
            +
                assert_equal 'baz!', I18n.t(key, :separator => '|')
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            end if defined?(InlineForms)
         | 
| 71 | 
            +
             | 
    
        data/test/test_helper.rb
    ADDED
    
    | @@ -0,0 +1,56 @@ | |
| 1 | 
            +
            require 'test_setup'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            I18n::Tests.parse_options!
         | 
| 4 | 
            +
            require 'bundler/setup'
         | 
| 5 | 
            +
            $:.unshift File.expand_path("../lib", File.dirname(__FILE__))
         | 
| 6 | 
            +
            require 'i18n/inline_forms'
         | 
| 7 | 
            +
            require 'i18n/tests'
         | 
| 8 | 
            +
            require 'mocha'
         | 
| 9 | 
            +
            I18n::Tests.setup_inline_forms
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            class Test::Unit::TestCase
         | 
| 12 | 
            +
              def self.test(name, &block)
         | 
| 13 | 
            +
                test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
         | 
| 14 | 
            +
                defined = instance_method(test_name) rescue false
         | 
| 15 | 
            +
                raise "#{test_name} is already defined in #{self}" if defined
         | 
| 16 | 
            +
                if block_given?
         | 
| 17 | 
            +
                  define_method(test_name, &block)
         | 
| 18 | 
            +
                else
         | 
| 19 | 
            +
                  define_method(test_name) do
         | 
| 20 | 
            +
                    flunk "No implementation provided for #{name}"
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              def self.with_mocha
         | 
| 26 | 
            +
                yield if Object.respond_to?(:expects)
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              def teardown
         | 
| 30 | 
            +
                I18n.locale = nil
         | 
| 31 | 
            +
                I18n.default_locale = :en
         | 
| 32 | 
            +
                I18n.load_path = []
         | 
| 33 | 
            +
                I18n.available_locales = nil
         | 
| 34 | 
            +
                I18n.backend = nil
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              def translations
         | 
| 38 | 
            +
                I18n.backend.instance_variable_get(:@translations)
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              def store_translations(*args)
         | 
| 42 | 
            +
                data   = args.pop
         | 
| 43 | 
            +
                locale = args.pop || :en
         | 
| 44 | 
            +
                I18n.backend.store_translations(locale, data)
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              def locales_dir
         | 
| 48 | 
            +
                File.dirname(__FILE__) + '/test_data/locales'
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            Object.class_eval do
         | 
| 53 | 
            +
              def meta_class
         | 
| 54 | 
            +
                class << self; self; end
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
            end unless Object.method_defined?(:meta_class)
         | 
    
        data/test/test_setup.rb
    ADDED
    
    | @@ -0,0 +1,92 @@ | |
| 1 | 
            +
            $KCODE = 'u' if RUBY_VERSION <= '1.9'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'rubygems'
         | 
| 4 | 
            +
            require 'test/unit'
         | 
| 5 | 
            +
            require 'optparse'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            # Do not load the i18n gem from libraries like active_support.
         | 
| 8 | 
            +
            #
         | 
| 9 | 
            +
            # This is required for testing against Rails 2.3 because active_support/vendor.rb#24 tries
         | 
| 10 | 
            +
            # to load I18n using the gem method. Instead, we want to test the local library of course.
         | 
| 11 | 
            +
            alias :gem_for_ruby_19 :gem # for 1.9. gives a super ugly seg fault otherwise
         | 
| 12 | 
            +
            def gem(gem_name, *version_requirements)
         | 
| 13 | 
            +
              puts("skipping loading the i18n gem ...") && return if gem_name =='i18n'
         | 
| 14 | 
            +
              super(gem_name, *version_requirements)
         | 
| 15 | 
            +
            end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            module I18n
         | 
| 18 | 
            +
              module Tests
         | 
| 19 | 
            +
                class << self
         | 
| 20 | 
            +
                  def options
         | 
| 21 | 
            +
                    @options ||= { :with => [], :adapter => 'sqlite3' }
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def parse_options!
         | 
| 25 | 
            +
                    OptionParser.new do |o|
         | 
| 26 | 
            +
                      o.on('-w', '--with DEPENDENCIES', 'Define dependencies') do |dep|
         | 
| 27 | 
            +
                        options[:with] = dep.split(',').map { |group| group.to_sym }
         | 
| 28 | 
            +
                      end
         | 
| 29 | 
            +
                    end.parse!
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    options[:with].each do |dep|
         | 
| 32 | 
            +
                      case dep
         | 
| 33 | 
            +
                      when :sqlite3, :mysql, :postgres
         | 
| 34 | 
            +
                        @options[:adapter] = dep
         | 
| 35 | 
            +
                      when :r23, :'rails-2.3.x'
         | 
| 36 | 
            +
                        ENV['BUNDLE_GEMFILE'] = 'ci/Gemfile.rails-2.3.x'
         | 
| 37 | 
            +
                      when :r3, :'rails-3.0.x'
         | 
| 38 | 
            +
                        ENV['BUNDLE_GEMFILE'] = 'ci/Gemfile.rails-3.x'
         | 
| 39 | 
            +
                      when :'no-rails'
         | 
| 40 | 
            +
                        ENV['BUNDLE_GEMFILE'] = 'ci/Gemfile.no-rails'
         | 
| 41 | 
            +
                      end
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    ENV['BUNDLE_GEMFILE'] ||= 'ci/Gemfile.all'
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def setup_inline_forms
         | 
| 48 | 
            +
                    begin
         | 
| 49 | 
            +
                      require 'inline_forms'
         | 
| 50 | 
            +
                      InlineForms::Base.connection
         | 
| 51 | 
            +
                      true
         | 
| 52 | 
            +
                    rescue LoadError => e
         | 
| 53 | 
            +
                      puts "can't use InlineForms backend because: #{e.message}"
         | 
| 54 | 
            +
                    rescue InlineForms::ConnectionNotEstablished
         | 
| 55 | 
            +
                      require 'i18n/backend/inline_forms'
         | 
| 56 | 
            +
                      require 'i18n/backend/inline_forms/store_procs'
         | 
| 57 | 
            +
                      connect_inline_forms
         | 
| 58 | 
            +
                      true
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  def connect_inline_forms
         | 
| 63 | 
            +
                    connect_adapter
         | 
| 64 | 
            +
                    InlineForms::Migration.verbose = false
         | 
| 65 | 
            +
                    InlineForms::Schema.define(:version => 1) do
         | 
| 66 | 
            +
                      create_table :translations, :force => true do |t|
         | 
| 67 | 
            +
                        t.string :locale
         | 
| 68 | 
            +
                        t.string :key
         | 
| 69 | 
            +
                        t.text :value
         | 
| 70 | 
            +
                        t.text :interpolations
         | 
| 71 | 
            +
                        t.boolean :is_proc, :default => false
         | 
| 72 | 
            +
                      end
         | 
| 73 | 
            +
                      add_index :translations, [:locale, :key], :unique => true
         | 
| 74 | 
            +
                    end
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  def connect_adapter
         | 
| 78 | 
            +
                    case options[:adapter].to_sym
         | 
| 79 | 
            +
                    when :sqlite3
         | 
| 80 | 
            +
                      InlineForms::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
         | 
| 81 | 
            +
                    when :mysql
         | 
| 82 | 
            +
                      # CREATE DATABASE i18n_unittest;
         | 
| 83 | 
            +
                      # CREATE USER 'i18n'@'localhost' IDENTIFIED BY '';
         | 
| 84 | 
            +
                      # GRANT ALL PRIVILEGES ON i18n_unittest.* to 'i18n'@'localhost';
         | 
| 85 | 
            +
                      InlineForms::Base.establish_connection(:adapter => "mysql", :database => "i18n_unittest", :username => "i18n", :password => "", :host => "localhost")
         | 
| 86 | 
            +
                    end
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
            end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
             | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,171 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification 
         | 
| 2 | 
            +
            name: i18n-inline_forms
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            +
              hash: 9
         | 
| 5 | 
            +
              prerelease: 
         | 
| 6 | 
            +
              segments: 
         | 
| 7 | 
            +
              - 0
         | 
| 8 | 
            +
              - 1
         | 
| 9 | 
            +
              version: "0.1"
         | 
| 10 | 
            +
            platform: ruby
         | 
| 11 | 
            +
            authors: 
         | 
| 12 | 
            +
            - Ace Suares
         | 
| 13 | 
            +
            autorequire: 
         | 
| 14 | 
            +
            bindir: bin
         | 
| 15 | 
            +
            cert_chain: []
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            date: 2012-03-10 00:00:00 Z
         | 
| 18 | 
            +
            dependencies: 
         | 
| 19 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 20 | 
            +
              name: i18n
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 23 | 
            +
                none: false
         | 
| 24 | 
            +
                requirements: 
         | 
| 25 | 
            +
                - - ">="
         | 
| 26 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 27 | 
            +
                    hash: 11
         | 
| 28 | 
            +
                    segments: 
         | 
| 29 | 
            +
                    - 0
         | 
| 30 | 
            +
                    - 5
         | 
| 31 | 
            +
                    - 0
         | 
| 32 | 
            +
                    version: 0.5.0
         | 
| 33 | 
            +
              type: :runtime
         | 
| 34 | 
            +
              version_requirements: *id001
         | 
| 35 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 36 | 
            +
              name: rspec-rails
         | 
| 37 | 
            +
              prerelease: false
         | 
| 38 | 
            +
              requirement: &id002 !ruby/object:Gem::Requirement 
         | 
| 39 | 
            +
                none: false
         | 
| 40 | 
            +
                requirements: 
         | 
| 41 | 
            +
                - - ">="
         | 
| 42 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 43 | 
            +
                    hash: 3
         | 
| 44 | 
            +
                    segments: 
         | 
| 45 | 
            +
                    - 0
         | 
| 46 | 
            +
                    version: "0"
         | 
| 47 | 
            +
              type: :development
         | 
| 48 | 
            +
              version_requirements: *id002
         | 
| 49 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 50 | 
            +
              name: shoulda
         | 
| 51 | 
            +
              prerelease: false
         | 
| 52 | 
            +
              requirement: &id003 !ruby/object:Gem::Requirement 
         | 
| 53 | 
            +
                none: false
         | 
| 54 | 
            +
                requirements: 
         | 
| 55 | 
            +
                - - ">="
         | 
| 56 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 57 | 
            +
                    hash: 3
         | 
| 58 | 
            +
                    segments: 
         | 
| 59 | 
            +
                    - 0
         | 
| 60 | 
            +
                    version: "0"
         | 
| 61 | 
            +
              type: :development
         | 
| 62 | 
            +
              version_requirements: *id003
         | 
| 63 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 64 | 
            +
              name: bundler
         | 
| 65 | 
            +
              prerelease: false
         | 
| 66 | 
            +
              requirement: &id004 !ruby/object:Gem::Requirement 
         | 
| 67 | 
            +
                none: false
         | 
| 68 | 
            +
                requirements: 
         | 
| 69 | 
            +
                - - ~>
         | 
| 70 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 71 | 
            +
                    hash: 23
         | 
| 72 | 
            +
                    segments: 
         | 
| 73 | 
            +
                    - 1
         | 
| 74 | 
            +
                    - 0
         | 
| 75 | 
            +
                    - 0
         | 
| 76 | 
            +
                    version: 1.0.0
         | 
| 77 | 
            +
              type: :development
         | 
| 78 | 
            +
              version_requirements: *id004
         | 
| 79 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 80 | 
            +
              name: jeweler
         | 
| 81 | 
            +
              prerelease: false
         | 
| 82 | 
            +
              requirement: &id005 !ruby/object:Gem::Requirement 
         | 
| 83 | 
            +
                none: false
         | 
| 84 | 
            +
                requirements: 
         | 
| 85 | 
            +
                - - ~>
         | 
| 86 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 87 | 
            +
                    hash: 7
         | 
| 88 | 
            +
                    segments: 
         | 
| 89 | 
            +
                    - 1
         | 
| 90 | 
            +
                    - 5
         | 
| 91 | 
            +
                    - 2
         | 
| 92 | 
            +
                    version: 1.5.2
         | 
| 93 | 
            +
              type: :development
         | 
| 94 | 
            +
              version_requirements: *id005
         | 
| 95 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 96 | 
            +
              name: rcov
         | 
| 97 | 
            +
              prerelease: false
         | 
| 98 | 
            +
              requirement: &id006 !ruby/object:Gem::Requirement 
         | 
| 99 | 
            +
                none: false
         | 
| 100 | 
            +
                requirements: 
         | 
| 101 | 
            +
                - - ">="
         | 
| 102 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 103 | 
            +
                    hash: 3
         | 
| 104 | 
            +
                    segments: 
         | 
| 105 | 
            +
                    - 0
         | 
| 106 | 
            +
                    version: "0"
         | 
| 107 | 
            +
              type: :development
         | 
| 108 | 
            +
              version_requirements: *id006
         | 
| 109 | 
            +
            description: I18n InlineForms backend. Allows to store translations in a database using InlineForms, e.g. for providing a web-interface for managing translations. Forked from i18n-active_record by Sven Fuchs.
         | 
| 110 | 
            +
            email: ace@suares.com
         | 
| 111 | 
            +
            executables: []
         | 
| 112 | 
            +
             | 
| 113 | 
            +
            extensions: []
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            extra_rdoc_files: []
         | 
| 116 | 
            +
             | 
| 117 | 
            +
            files: 
         | 
| 118 | 
            +
            - Gemfile
         | 
| 119 | 
            +
            - Gemfile.lock
         | 
| 120 | 
            +
            - MIT-LICENSE
         | 
| 121 | 
            +
            - README
         | 
| 122 | 
            +
            - README.textile
         | 
| 123 | 
            +
            - Rakefile
         | 
| 124 | 
            +
            - i18n-inline_forms.gemspec
         | 
| 125 | 
            +
            - lib/i18n/backend/inline_forms.rb
         | 
| 126 | 
            +
            - lib/i18n/backend/inline_forms/missing.rb
         | 
| 127 | 
            +
            - lib/i18n/backend/inline_forms/store_procs.rb
         | 
| 128 | 
            +
            - lib/i18n/backend/inline_forms/translation.rb
         | 
| 129 | 
            +
            - lib/i18n/inline_forms.rb
         | 
| 130 | 
            +
            - lib/i18n/inline_forms/version.rb
         | 
| 131 | 
            +
            - test/all.rb
         | 
| 132 | 
            +
            - test/api_test.rb
         | 
| 133 | 
            +
            - test/inline_forms_test.rb
         | 
| 134 | 
            +
            - test/missing_test.rb
         | 
| 135 | 
            +
            - test/test_helper.rb
         | 
| 136 | 
            +
            - test/test_setup.rb
         | 
| 137 | 
            +
            homepage: http://github.com/acesuares/i18n-inline_forms
         | 
| 138 | 
            +
            licenses: []
         | 
| 139 | 
            +
             | 
| 140 | 
            +
            post_install_message: 
         | 
| 141 | 
            +
            rdoc_options: []
         | 
| 142 | 
            +
             | 
| 143 | 
            +
            require_paths: 
         | 
| 144 | 
            +
            - lib
         | 
| 145 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 146 | 
            +
              none: false
         | 
| 147 | 
            +
              requirements: 
         | 
| 148 | 
            +
              - - ">="
         | 
| 149 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 150 | 
            +
                  hash: 3
         | 
| 151 | 
            +
                  segments: 
         | 
| 152 | 
            +
                  - 0
         | 
| 153 | 
            +
                  version: "0"
         | 
| 154 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 155 | 
            +
              none: false
         | 
| 156 | 
            +
              requirements: 
         | 
| 157 | 
            +
              - - ">="
         | 
| 158 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 159 | 
            +
                  hash: 3
         | 
| 160 | 
            +
                  segments: 
         | 
| 161 | 
            +
                  - 0
         | 
| 162 | 
            +
                  version: "0"
         | 
| 163 | 
            +
            requirements: []
         | 
| 164 | 
            +
             | 
| 165 | 
            +
            rubyforge_project: i18n-inline_forms
         | 
| 166 | 
            +
            rubygems_version: 1.8.15
         | 
| 167 | 
            +
            signing_key: 
         | 
| 168 | 
            +
            specification_version: 3
         | 
| 169 | 
            +
            summary: I18n InlineForms backend
         | 
| 170 | 
            +
            test_files: []
         | 
| 171 | 
            +
             |