Commit 6d9041698c7a8015a647d54910832e17918dd68f

Authored by Antonio Terceiro
1 parent b04427d2

Adding fast_gettext source in vendor/

(ActionItem1315)
Showing 57 changed files with 3374 additions and 0 deletions   Show diff stats
lib/fast_gettext 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext
0 2 \ No newline at end of file
... ...
lib/fast_gettext.rb 0 → 120000
... ... @@ -0,0 +1 @@
  1 +../vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext.rb
0 2 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/CHANGELOG 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +0.4.14 -- "" is translated as "", not as gettext meta information
  2 +0.4.0 -- pluralisation_rules is no longer stored in each repository, only retrived. Added Chain and Logger repository.
  3 +0.3.6 -- FastGettext.default_locale=
  4 +0.3.5 -- FastGettext.default_text_domain=
  5 +0.3.4 -- Exceptions are thrown, not returned when translating without text domain
  6 +0.3 -- pluralisation methods accept/return n plural forms, contrary to singular/plural before
0 7 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/README.markdown 0 → 100644
... ... @@ -0,0 +1,196 @@
  1 +FastGettext
  2 +===========
  3 +GetText but 3.5 x faster, 560 x less memory, simple, clean namespace (7 vs 34) and threadsave!
  4 +
  5 +It supports multiple backends (.mo, .po, .yml files, Database(ActiveRecor + any other), Chain, Loggers) and can easily be extended.
  6 +
  7 +[Example Rails application](https://github.com/grosser/gettext_i18n_rails_example)
  8 +
  9 +Comparison
  10 +==========
  11 +<table>
  12 + <tr>
  13 + <td></td>
  14 + <td width="100">Hash</td>
  15 + <td width="150">FastGettext</td>
  16 + <td width="100">GetText</td>
  17 + <td width="100">ActiveSupport I18n::Simple</td>
  18 + </tr>
  19 + <tr>
  20 + <td>Speed*</td>
  21 + <td>0.82s</td>
  22 + <td>1.36s</td>
  23 + <td>4.88s</td>
  24 + <td>21.77s</td>
  25 + </tr>
  26 + <tr>
  27 + <td>RAM*</td>
  28 + <td>4K</td>
  29 + <td>8K</td>
  30 + <td>4480K</td>
  31 + <td>10100K</td>
  32 + </tr>
  33 + <tr>
  34 + <td>Included backends</td>
  35 + <td></td>
  36 + <td>db, yml, mo, po, logger, chain</td>
  37 + <td>mo</td>
  38 + <td>yml</td>
  39 + </tr>
  40 +</table>
  41 +<small>*50.000 translations with ruby enterprise 1.8.6 through `rake benchmark`</small>
  42 +
  43 +Setup
  44 +=====
  45 +### 1. Install
  46 + sudo gem install fast_gettext
  47 +
  48 +### 2. Add a translation repository
  49 +
  50 +From mo files (traditional/default)
  51 + FastGettext.add_text_domain('my_app',:path=>'locale')
  52 +
  53 +Or po files (less maintenance than mo)
  54 + FastGettext.add_text_domain('my_app',:path=>'locale', :type=>:po)
  55 +
  56 +Or yaml files (use I18n syntax/indentation)
  57 + FastGettext.add_text_domain('my_app',:path=>'config/locales', :type=>:yaml)
  58 +
  59 +Or database (scaleable, good for many locales/translators)
  60 + # db access is cached <-> only first lookup hits the db
  61 + require "fast_gettext/translation_repository/db"
  62 + include FastGettext::TranslationRepository::Db.require_models #load and include default models
  63 + FastGettext.add_text_domain('my_app', :type=>:db, :model=>TranslationKey)
  64 +
  65 +### 3. Choose text domain and locale for translation
  66 +Do this once in every Thread. (e.g. Rails -> ApplicationController)
  67 + FastGettext.text_domain = 'my_app'
  68 + FastGettext.available_locales = ['de','en','fr','en_US','en_UK'] # only allow these locales to be set (optional)
  69 + FastGettext.locale = 'de'
  70 +
  71 +### 4. Start translating
  72 + include FastGettext::Translation
  73 + _('Car') == 'Auto'
  74 + _('not-found') == 'not-found'
  75 + s_('Namespace|no-found') == 'not-found'
  76 + n_('Axis','Axis',3) == 'Achsen' #German plural of Axis
  77 +
  78 +
  79 +Managing translations
  80 +============
  81 +### mo/po-files
  82 +Generate .po or .mo files using GetText parser (example tasks at [gettext_i18n_rails](http://github.com/grosser/gettext_i18n_rails))
  83 +
  84 +Tell Gettext where your .mo or .po files lie, e.g. for locale/de/my_app.po and locale/de/LC_MESSAGES/my_app.mo
  85 + FastGettext.add_text_domain('my_app',:path=>'locale')
  86 +
  87 +Use the [original GetText](http://github.com/mutoh/gettext) to create and manage po/mo-files.
  88 +(Work on a po/mo parser & reader that is easier to use has started, contributions welcome @ [pomo](http://github.com/grosser/pomo) )
  89 +
  90 +###Database
  91 +[Example migration for ActiveRecord](http://github.com/grosser/fast_gettext/blob/master/examples/db/migration.rb)
  92 +The default plural seperator is `||||` but you may overwrite it (or suggest a better one..).
  93 +
  94 +This is usable with any model DataMapper/Sequel or any other(non-database) backend, the only thing you need to do is respond to the self.translation(key, locale) call.
  95 +If you want to use your own models, have a look at the [default models](http://github.com/grosser/fast_gettext/tree/master/lib/fast_gettext/translation_repository/db_models) to see what you want/need to implement.
  96 +
  97 +To manage translations via a Web GUI, use a [Rails application and the translation_db_engine](http://github.com/grosser/translation_db_engine)
  98 +
  99 +Rails
  100 +=======================
  101 +Try the [gettext_i18n_rails plugin](http://github.com/grosser/gettext_i18n_rails), it simplifies the setup.
  102 +Try the [translation_db_engine](http://github.com/grosser/translation_db_engine), to manage your translations in a db.
  103 +
  104 +Setting `available_locales`,`text_domain` or `locale` will not work inside the `evironment.rb`,
  105 +since it runs in a different thread then e.g. controllers, so set them inside your application_controller.
  106 +
  107 + #environment.rb after initializers
  108 + Object.send(:include,FastGettext::Translation)
  109 + FastGettext.add_text_domain('accounting',:path=>'locale')
  110 + FastGettext.add_text_domain('frontend',:path=>'locale')
  111 + ...
  112 +
  113 + #application_controller.rb
  114 + class ApplicationController ...
  115 + include FastGettext::Translation
  116 + before_filter :set_locale
  117 + def set_locale
  118 + FastGettext.available_locales = ['de','en',...]
  119 + FastGettext.text_domain = 'frontend'
  120 + session[:locale] = I18n.locale = FastGettext.set_locale(params[:locale] || session[:locale] || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en')
  121 + end
  122 +
  123 +
  124 +Advanced features
  125 +=================
  126 +###Abnormal pluralisation
  127 +Pluralisation rules can be set directly via a lambda (see specs/), or by using the Gettext
  128 +plural definition (see spec/locale/en/test_plural.po or [Plural expressions for all languages](http://translate.sourceforge.net/wiki/l10n/pluralforms).
  129 +
  130 +
  131 +###default_text_domain
  132 +If you only use one text domain, setting `FastGettext.default_text_domain = 'app'`
  133 +is sufficient and no more `text_domain=` is needed
  134 +
  135 +###default_locale
  136 +If the simple rule of "first `availble_locale` or 'en'" is not suficcient for you, set `FastGettext.default_locale = 'de'`.
  137 +
  138 +###default_available_locales
  139 +Fallback when no available_locales are set
  140 +
  141 +###Chains
  142 +You can use any number of repositories to find a translation. Simply add them to a chain and when
  143 +the first cannot translate a given key, the next is asked and so forth.
  144 + repos = [
  145 + FastGettext::TranslationRepository.build('new', :path=>'....'),
  146 + FastGettext::TranslationRepository.build('old', :path=>'....')
  147 + ]
  148 + FastGettext.add_text_domain 'combined', :type=>:chain, :chain=>repos
  149 +
  150 +###Logger
  151 +When you want to know which keys could not be translated or were used, add a Logger to a Chain:
  152 + repos = [
  153 + FastGettext::TranslationRepository.build('app', :path=>'....')
  154 + FastGettext::TranslationRepository.build('logger', :type=>:logger, :callback=>lamda{|key_or_array_of_ids| ... }),
  155 + }
  156 + FastGettext.add_text_domain 'combined', :type=>:chain, :chain=>repos
  157 +If the Logger is in position #1 it will see all translations, if it is in position #2 it will only see the unfound.
  158 +Unfound may not always mean missing, if you chose not to translate a word because the key is a good translation, it will appear nevertheless.
  159 +A lambda or anything that responds to `call` will do as callback. A good starting point may be `examples/missing_translations_logger.rb`.
  160 +
  161 +###Plugins
  162 +Want a xml version ?
  163 +Write your own TranslationRepository!
  164 + #fast_gettext/translation_repository/xxx.rb
  165 + module FastGettext
  166 + module TranslationRepository
  167 + class Wtf
  168 + define initialize(name,options), [key], plural(*keys) and
  169 + either inherit from TranslationRepository::Base or define available_locales and pluralisation_rule
  170 + end
  171 + end
  172 + end
  173 +
  174 +
  175 +FAQ
  176 +===
  177 + - [Problems with ActiveRecord messages?](http://wiki.github.com/grosser/fast_gettext/activerecord)
  178 +
  179 +
  180 +TODO
  181 +====
  182 + - YML backend that reads ActiveSupport::I18n files
  183 + - any ideas ? :D
  184 +
  185 +Author
  186 +======
  187 +Mo/Po-file parsing from Masao Mutoh, see vendor/README
  188 +
  189 +###Contributors
  190 + - [geekq](http://www.innoq.com/blog/vd)
  191 + - [Matt Sanford](http://blog.mzsanford.com)
  192 + - Rudolf Gavlas
  193 +
  194 +[Michael Grosser](http://pragmatig.wordpress.com)
  195 +grosser.michael@gmail.com
  196 +Hereby placed under public domain, do what you want, just do not hold me accountable...
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/Rakefile 0 → 100644
... ... @@ -0,0 +1,32 @@
  1 +task :default => :spec
  2 +require 'spec/rake/spectask'
  3 +Spec::Rake::SpecTask.new {|t| t.spec_opts = ['--color']}
  4 +
  5 +task :benchmark do
  6 + puts "Running on #{RUBY}"
  7 + %w[baseline ideal fast_gettext original i18n_simple].each do |bench|
  8 + puts `ruby benchmark/#{bench}.rb`
  9 + puts ""
  10 + end
  11 +end
  12 +
  13 +task :namespaces do
  14 + puts `ruby benchmark/namespace/original.rb`
  15 + puts `ruby benchmark/namespace/fast_gettext.rb`
  16 +end
  17 +
  18 +begin
  19 + require 'jeweler'
  20 + project_name = 'fast_gettext'
  21 + Jeweler::Tasks.new do |gem|
  22 + gem.name = project_name
  23 + gem.summary = "A simple, fast and threadsafe implementation of GetText"
  24 + gem.email = "grosser.michael@gmail.com"
  25 + gem.homepage = "http://github.com/grosser/#{project_name}"
  26 + gem.authors = ["Michael Grosser"]
  27 + end
  28 +
  29 + Jeweler::GemcutterTasks.new
  30 +rescue LoadError
  31 + puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
  32 +end
0 33 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/VERSION 0 → 120000
... ... @@ -0,0 +1 @@
  1 +lib/fast_gettext/VERSION
0 2 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/base.rb 0 → 100644
... ... @@ -0,0 +1,42 @@
  1 +require 'rubygems'
  2 +require 'benchmark'
  3 +
  4 +RUNS = 50_0000
  5 +DEFAULTS = {:memory=>0}
  6 +
  7 +def locale_folder(domain)
  8 + path = case domain
  9 + when 'test' then File.join(File.expand_path(File.dirname(__FILE__)),'..','spec','locale')
  10 + when 'large' then File.join(File.expand_path(File.dirname(__FILE__)),'locale')
  11 + end
  12 +
  13 + mo = File.join(path,'de','LC_MESSAGES',"#{domain}.mo")
  14 + raise unless File.exist?(mo)
  15 + path
  16 +end
  17 +
  18 +def results_test(&block)
  19 + print "#{(result(&block)).to_s.strip.split(' ').first}s / #{memory}K <-> "
  20 +end
  21 +
  22 +def results_large
  23 + print "#{(result {_('login') == 'anmelden'}).to_s.strip.split(' ').first}s / #{memory}K"
  24 + puts ""
  25 +end
  26 +
  27 +def result
  28 + result =Benchmark.measure do
  29 + RUNS.times do
  30 + raise "not translated" unless yield
  31 + end
  32 + end
  33 + result
  34 +end
  35 +
  36 +def memory
  37 + pid = Process.pid
  38 + map = `pmap -d #{pid}`
  39 + map.split("\n").last.strip.squeeze(' ').split(' ')[3].to_i - DEFAULTS[:memory]
  40 +end
  41 +
  42 +DEFAULTS[:memory] = memory + 4 #4 => 0 for base calls
0 43 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/baseline.rb 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +require 'benchmark/base'
  2 +
  3 +puts "Baseline: (doing nothing in a loop)"
  4 +results_test{true}
  5 +puts ""
0 6 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/fast_gettext.rb 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +require 'benchmark/base'
  2 +
  3 +$LOAD_PATH.unshift 'lib'
  4 +require 'fast_gettext'
  5 +include FastGettext::Translation
  6 +
  7 +FastGettext.available_locales = ['de','en']
  8 +FastGettext.locale = 'de'
  9 +
  10 +puts "FastGettext:"
  11 +FastGettext.add_text_domain('test',:path=>locale_folder('test'))
  12 +FastGettext.text_domain = 'test'
  13 +results_test{_('car') == 'Auto'}
  14 +
  15 +#i cannot add the large file, since its an internal applications mo file
  16 +FastGettext.add_text_domain('large',:path=>locale_folder('large'))
  17 +FastGettext.text_domain = 'large'
  18 +results_large
0 19 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/i18n_simple.rb 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +require 'benchmark/base'
  2 +require 'activesupport'
  3 +I18n.backend = I18n::Backend::Simple.new
  4 +I18n.load_path = ['benchmark/locale/de.yml']
  5 +I18n.locale = :de
  6 +puts "ActiveSupport I18n::Backend::Simple :"
  7 +results_test{I18n.translate('activerecord.models.car')=='Auto'}
0 8 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/ideal.rb 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +require 'benchmark/base'
  2 +
  3 +$LOAD_PATH.unshift 'lib'
  4 +
  5 +module FastestGettext
  6 + def set_domain(folder,domain,locale)
  7 + @data = {}
  8 + require 'fast_gettext/vendor/mofile'
  9 + FastGettext::GetText::MOFile.open(File.join(folder,locale,'LC_MESSAGES',"#{domain}.mo"), "UTF-8").each{|k,v|@data[k]=v}
  10 + end
  11 + def _(word)
  12 + @data[word]
  13 + end
  14 +end
  15 +
  16 +
  17 +include FastestGettext
  18 +set_domain(locale_folder('test'),'test','de')
  19 +puts "Ideal: (primitive Hash lookup)"
  20 +results_test{_('car') == 'Auto'}
  21 +
  22 +#i cannot add the large file, since its an internal applications mo file
  23 +set_domain(locale_folder('large'),'large','de')
  24 +results_large
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/misc/threadsave.rb 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +require 'benchmark'
  2 +BASELINE = 0
  3 +def test
  4 + result = Benchmark.measure {1_000_000.times{ yield }}
  5 + result.to_s.strip.split(' ').first.to_f - BASELINE
  6 +end
  7 +
  8 +BASELINE = (test{})
  9 +Thread.current[:library_name]={}
  10 +other = "x"
  11 +puts "Ruby #{VERSION}"
  12 +
  13 +puts "generic:"
  14 +puts " Symbol: #{test{Thread.current[:library_name][:just_a_symbol]}}s"
  15 +puts " String concat: #{test{Thread.current["xxxxxx"<<other.to_s]}}s"
  16 +puts " String add: #{test{Thread.current["xxxxxx"+other.to_s]}}s"
  17 +puts " String insert: #{test{Thread.current["xxxxxx#{other}"]}}s"
  18 +
  19 +puts "single:"
  20 +puts " Symbol: #{test{Thread.current[:long_unique_symbol]}}s"
  21 +puts " String: #{test{Thread.current["xxxxxx"]}}s"
0 22 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/namespace/fast_gettext.rb 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +#Iconv will not be defined, unless it is found -> normalize test results for users that have Iconv/those who do not have it
  2 +begin;require 'iconv';rescue;LoadError;end
  3 +initial = methods.count + Module.constants.count
  4 +
  5 +#FastGettext
  6 +$LOAD_PATH.unshift File.join(File.dirname(__FILE__),'..','..','lib')
  7 +require 'fast_gettext'
  8 +FastGettext.locale = 'de'
  9 +FastGettext.add_text_domain 'test', :path=>'spec/locale'
  10 +FastGettext.text_domain = 'test'
  11 +include FastGettext::Translation
  12 +raise unless _('car')=='Auto'
  13 +
  14 +puts "FastGettext"
  15 +puts methods.count + Module.constants.count - initial
0 16 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/namespace/original.rb 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +require 'rubygems'
  2 +initial = methods.count + Module.constants.count
  3 +
  4 +#GetText
  5 +gem 'gettext', '>=2.0.0'
  6 +require 'gettext'
  7 +GetText.locale = 'de'
  8 +GetText.bindtextdomain('test',:path=>'spec/locale')
  9 +include GetText
  10 +raise unless _('car') == 'Auto'
  11 +
  12 +
  13 +puts "GetText"
  14 +puts methods.count + Module.constants.count - initial
0 15 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/benchmark/original.rb 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +require 'benchmark/base'
  2 +
  3 +begin
  4 +gem 'gettext', '>=2.0.0'
  5 +rescue LoadError
  6 + $LOAD_PATH.unshift 'lib'
  7 +end
  8 +require 'gettext'
  9 +include GetText
  10 +
  11 +self.locale = 'de'
  12 +
  13 +puts "GetText #{GetText::VERSION}:"
  14 +bindtextdomain('test',:path=>locale_folder('test'))
  15 +results_test{_('car') == 'Auto'}
  16 +
  17 +#i cannot add the large file, since its an internal applications mo file
  18 +bindtextdomain('large',:path=>locale_folder('large'))
  19 +results_large
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/examples/db/migration.rb 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +class CreateTranslationTables < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :translation_keys do |t|
  4 + t.string :key, :unique=>true, :null=>false
  5 + t.timestamps
  6 + end
  7 + add_index :translation_keys, :key #I am not sure if this helps....
  8 +
  9 + create_table :translation_texts do |t|
  10 + t.text :text
  11 + t.string :locale
  12 + t.integer :translation_key_id, :null=>false
  13 + t.timestamps
  14 + end
  15 + add_index :translation_texts, :translation_key_id
  16 + end
  17 +
  18 + def self.down
  19 + drop_table :translation_keys
  20 + drop_table :translation_texts
  21 + end
  22 +end
0 23 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/examples/missing_translation_logger.rb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +class MissingTranslationLogger
  2 + def call(unfound)
  3 + logger.warn "#{FastGettext.locale}: #{unfound}" unless FastGettext.locale == 'en'
  4 + end
  5 +
  6 + private
  7 +
  8 + def logger
  9 + return @logger if @logger
  10 + require 'logger'
  11 + @logger = Logger.new("log/unfound_translations", 2, 5*(1024**2))#max 2x 5mb logfile
  12 + end
  13 +end
0 14 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/fast_gettext.gemspec 0 → 100644
... ... @@ -0,0 +1,122 @@
  1 +# Generated by jeweler
  2 +# DO NOT EDIT THIS FILE DIRECTLY
  3 +# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
  4 +# -*- encoding: utf-8 -*-
  5 +
  6 +Gem::Specification.new do |s|
  7 + s.name = %q{fast_gettext}
  8 + s.version = "0.5.1"
  9 +
  10 + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
  11 + s.authors = ["Michael Grosser"]
  12 + s.date = %q{2010-01-30}
  13 + s.email = %q{grosser.michael@gmail.com}
  14 + s.extra_rdoc_files = [
  15 + "README.markdown"
  16 + ]
  17 + s.files = [
  18 + ".gitignore",
  19 + "CHANGELOG",
  20 + "README.markdown",
  21 + "Rakefile",
  22 + "VERSION",
  23 + "benchmark/base.rb",
  24 + "benchmark/baseline.rb",
  25 + "benchmark/fast_gettext.rb",
  26 + "benchmark/i18n_simple.rb",
  27 + "benchmark/ideal.rb",
  28 + "benchmark/locale/de.yml",
  29 + "benchmark/locale/de/LC_MESSAGES/large.mo",
  30 + "benchmark/misc/threadsave.rb",
  31 + "benchmark/namespace/fast_gettext.rb",
  32 + "benchmark/namespace/original.rb",
  33 + "benchmark/original.rb",
  34 + "examples/db/migration.rb",
  35 + "examples/missing_translation_logger.rb",
  36 + "fast_gettext.gemspec",
  37 + "lib/fast_gettext.rb",
  38 + "lib/fast_gettext/mo_file.rb",
  39 + "lib/fast_gettext/po_file.rb",
  40 + "lib/fast_gettext/storage.rb",
  41 + "lib/fast_gettext/translation.rb",
  42 + "lib/fast_gettext/translation_repository.rb",
  43 + "lib/fast_gettext/translation_repository/base.rb",
  44 + "lib/fast_gettext/translation_repository/chain.rb",
  45 + "lib/fast_gettext/translation_repository/db.rb",
  46 + "lib/fast_gettext/translation_repository/db_models/translation_key.rb",
  47 + "lib/fast_gettext/translation_repository/db_models/translation_text.rb",
  48 + "lib/fast_gettext/translation_repository/logger.rb",
  49 + "lib/fast_gettext/translation_repository/mo.rb",
  50 + "lib/fast_gettext/translation_repository/po.rb",
  51 + "lib/fast_gettext/translation_repository/yaml.rb",
  52 + "spec/aa_unconfigued_spec.rb",
  53 + "spec/fast_gettext/mo_file_spec.rb",
  54 + "spec/fast_gettext/storage_spec.rb",
  55 + "spec/fast_gettext/translation_repository/base_spec.rb",
  56 + "spec/fast_gettext/translation_repository/chain_spec.rb",
  57 + "spec/fast_gettext/translation_repository/db_spec.rb",
  58 + "spec/fast_gettext/translation_repository/logger_spec.rb",
  59 + "spec/fast_gettext/translation_repository/mo_spec.rb",
  60 + "spec/fast_gettext/translation_repository/po_spec.rb",
  61 + "spec/fast_gettext/translation_repository/yaml_spec.rb",
  62 + "spec/fast_gettext/translation_repository_spec.rb",
  63 + "spec/fast_gettext/translation_spec.rb",
  64 + "spec/fast_gettext_spec.rb",
  65 + "spec/locale/de/LC_MESSAGES/test.mo",
  66 + "spec/locale/de/test.po",
  67 + "spec/locale/en/LC_MESSAGES/plural_test.mo",
  68 + "spec/locale/en/LC_MESSAGES/test.mo",
  69 + "spec/locale/en/plural_test.po",
  70 + "spec/locale/en/test.po",
  71 + "spec/locale/yaml/de.yml",
  72 + "spec/locale/yaml/en.yml",
  73 + "spec/locale/yaml/notfound.yml",
  74 + "spec/spec_helper.rb",
  75 + "spec/vendor/fake_load_path/iconv.rb",
  76 + "spec/vendor/iconv_spec.rb",
  77 + "spec/vendor/string_spec.rb",
  78 + "vendor/README.rdoc",
  79 + "vendor/empty.mo",
  80 + "vendor/iconv.rb",
  81 + "vendor/mofile.rb",
  82 + "vendor/poparser.rb",
  83 + "vendor/string.rb"
  84 + ]
  85 + s.homepage = %q{http://github.com/grosser/fast_gettext}
  86 + s.rdoc_options = ["--charset=UTF-8"]
  87 + s.require_paths = ["lib"]
  88 + s.rubygems_version = %q{1.3.5}
  89 + s.summary = %q{A simple, fast and threadsafe implementation of GetText}
  90 + s.test_files = [
  91 + "spec/spec_helper.rb",
  92 + "spec/aa_unconfigued_spec.rb",
  93 + "spec/vendor/fake_load_path/iconv.rb",
  94 + "spec/vendor/iconv_spec.rb",
  95 + "spec/vendor/string_spec.rb",
  96 + "spec/fast_gettext_spec.rb",
  97 + "spec/fast_gettext/translation_repository_spec.rb",
  98 + "spec/fast_gettext/translation_repository/mo_spec.rb",
  99 + "spec/fast_gettext/translation_repository/db_spec.rb",
  100 + "spec/fast_gettext/translation_repository/yaml_spec.rb",
  101 + "spec/fast_gettext/translation_repository/logger_spec.rb",
  102 + "spec/fast_gettext/translation_repository/base_spec.rb",
  103 + "spec/fast_gettext/translation_repository/po_spec.rb",
  104 + "spec/fast_gettext/translation_repository/chain_spec.rb",
  105 + "spec/fast_gettext/translation_spec.rb",
  106 + "spec/fast_gettext/mo_file_spec.rb",
  107 + "spec/fast_gettext/storage_spec.rb",
  108 + "examples/missing_translation_logger.rb",
  109 + "examples/db/migration.rb"
  110 + ]
  111 +
  112 + if s.respond_to? :specification_version then
  113 + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
  114 + s.specification_version = 3
  115 +
  116 + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
  117 + else
  118 + end
  119 + else
  120 + end
  121 +end
  122 +
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext.rb 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +require 'fast_gettext/mo_file'
  2 +require 'fast_gettext/storage'
  3 +require 'fast_gettext/translation'
  4 +require 'fast_gettext/translation_repository'
  5 +require 'fast_gettext/vendor/string'
  6 +
  7 +module FastGettext
  8 + include FastGettext::Storage
  9 + extend self
  10 +
  11 + VERSION = File.read( File.join(File.dirname(__FILE__), 'fast_gettext', 'VERSION') ).strip
  12 + LOCALE_REX = /^[a-z]{2}$|^[a-z]{2}_[A-Z]{2}$/
  13 + NAMESPACE_SEPERATOR = '|'
  14 +
  15 + # users should not include FastGettext, since this would conterminate their namespace
  16 + # rather use
  17 + # FastGettext.locale = ..
  18 + # FastGettext.text_domain = ..
  19 + # and
  20 + # include FastGettext::Translation
  21 + FastGettext::Translation.public_instance_methods.each do |method|
  22 + define_method method do |*args|
  23 + Translation.send(method,*args)
  24 + end
  25 + end
  26 +
  27 + def add_text_domain(name,options)
  28 + translation_repositories[name] = TranslationRepository.build(name,options)
  29 + end
  30 +end
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/VERSION 0 → 100644
... ... @@ -0,0 +1 @@
  1 +0.5.1
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/mo_file.rb 0 → 100644
... ... @@ -0,0 +1,67 @@
  1 +require 'fast_gettext/vendor/mofile'
  2 +module FastGettext
  3 + # Responsibility:
  4 + # - abstract mo files for Mo Repository
  5 + class MoFile
  6 + PLURAL_SEPERATOR = "\000"
  7 +
  8 + # file => path or FastGettext::GetText::MOFile
  9 + def initialize(file)
  10 + if file.is_a? FastGettext::GetText::MOFile
  11 + @data = file
  12 + else
  13 + @data = FastGettext::GetText::MOFile.open(file, "UTF-8")
  14 + end
  15 + make_singular_and_plural_available
  16 + end
  17 +
  18 + def [](key)
  19 + @data[key]
  20 + end
  21 +
  22 + #returns the plural forms or all singular translations that where found
  23 + def plural(*msgids)
  24 + translations = plural_translations(msgids)
  25 + return translations unless translations.empty?
  26 + msgids.map{|msgid| self[msgid] || msgid} #try to translate each id
  27 + end
  28 +
  29 + def pluralisation_rule
  30 + #gettext uses 0 as default rule, which would turn off all pluralisation, very clever...
  31 + #additionally parsing fails when directly accessing po files, so this line was taken from gettext/mofile
  32 + (@data['']||'').split("\n").each do |line|
  33 + return lambda{|n|eval($2)} if /^Plural-Forms:\s*nplurals\s*\=\s*(\d*);\s*plural\s*\=\s*([^;]*)\n?/ =~ line
  34 + end
  35 + nil
  36 + end
  37 +
  38 + def self.empty
  39 + MoFile.new(File.join(File.dirname(__FILE__),'vendor','empty.mo'))
  40 + end
  41 +
  42 + private
  43 +
  44 + #(if plural==singular, prefer singular)
  45 + def make_singular_and_plural_available
  46 + data = {}
  47 + @data.each do |key,translation|
  48 + next unless key.include? PLURAL_SEPERATOR
  49 + singular, plural = split_plurals(key)
  50 + translation = split_plurals(translation)
  51 + data[singular] ||= translation[0]
  52 + data[plural] ||= translation[1]
  53 + end
  54 + @data.merge!(data){|key,old,new| old}
  55 + end
  56 +
  57 + def split_plurals(singular_plural)
  58 + singular_plural.split(PLURAL_SEPERATOR)
  59 + end
  60 +
  61 + # Car, Cars => [Auto,Autos] or []
  62 + def plural_translations(msgids)
  63 + plurals = self[msgids*PLURAL_SEPERATOR]
  64 + if plurals then split_plurals(plurals) else [] end
  65 + end
  66 + end
  67 +end
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/po_file.rb 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +require 'fast_gettext/mo_file'
  2 +module FastGettext
  3 + # Responsibility:
  4 + # - abstract po files for Po Repository
  5 + # TODO refactor...
  6 + class PoFile
  7 + def self.to_mo_file(file)
  8 + require 'fast_gettext/vendor/poparser'
  9 + mo_file = FastGettext::GetText::MOFile.new
  10 + FastGettext::GetText::PoParser.new.parse(File.read(file),mo_file)
  11 + MoFile.new(mo_file)
  12 + end
  13 + end
  14 +end
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/storage.rb 0 → 100644
... ... @@ -0,0 +1,188 @@
  1 +module FastGettext
  2 + # Responsibility:
  3 + # - store data threadsave
  4 + # - provide error messages when repositories are unconfigured
  5 + # - accept/reject locales that are set by the user
  6 + module Storage
  7 + class NoTextDomainConfigured < RuntimeError
  8 + def to_s
  9 + "Current textdomain (#{FastGettext.text_domain.inspect}) was not added, use FastGettext.add_text_domain !"
  10 + end
  11 + end
  12 +
  13 + [:available_locales, :_locale, :text_domain, :pluralisation_rule].each do |method_name|
  14 + key = "fast_gettext_#{method_name}".to_sym
  15 + define_method method_name do
  16 + Thread.current[key]
  17 + end
  18 +
  19 + define_method "#{method_name}=" do |value|
  20 + Thread.current[key]=value
  21 + update_current_cache
  22 + end
  23 + end
  24 + private :_locale, :_locale=
  25 +
  26 +
  27 + def available_locales
  28 + Thread.current[:fast_gettext_available_locales] || default_available_locales
  29 + end
  30 +
  31 + # == cattr_accessor :default_available_locales
  32 + @@default_available_locales = nil
  33 + def default_available_locales=(avail_locales)
  34 + @@default_available_locales = avail_locales
  35 + update_current_cache
  36 + end
  37 +
  38 + def default_available_locales
  39 + @@default_available_locales
  40 + end
  41 +
  42 +
  43 + def text_domain
  44 + Thread.current[:fast_gettext_text_domain] || default_text_domain
  45 + end
  46 +
  47 + # == cattr_accessor :default_text_domain
  48 + @@default_text_domain = nil
  49 + def default_text_domain=(domain)
  50 + @@default_text_domain = domain
  51 + update_current_cache
  52 + end
  53 +
  54 + def default_text_domain
  55 + @@default_text_domain
  56 + end
  57 +
  58 +
  59 + def pluralisation_rule
  60 + Thread.current[:fast_gettext_pluralisation_rule] || current_repository.pluralisation_rule || lambda{|i| i!=1}
  61 + end
  62 +
  63 + def current_cache
  64 + Thread.current[:fast_gettext_current_cache] || {}
  65 + end
  66 +
  67 + def current_cache=(cache)
  68 + Thread.current[:fast_gettext_current_cache] = cache
  69 + end
  70 +
  71 + #global, since re-parsing whole folders takes too much time...
  72 + @@translation_repositories={}
  73 + def translation_repositories
  74 + @@translation_repositories
  75 + end
  76 +
  77 + # used to speedup simple translations, does not work for pluralisation
  78 + # caches[text_domain][locale][key]=translation
  79 + @@caches={}
  80 + def caches
  81 + @@caches
  82 + end
  83 +
  84 + def current_repository
  85 + translation_repositories[text_domain] || raise(NoTextDomainConfigured)
  86 + end
  87 +
  88 + def key_exist?(key)
  89 + !!(cached_find key)
  90 + end
  91 +
  92 + def cached_find(key)
  93 + translation = current_cache[key]
  94 + return translation if translation or translation == false #found or was not found before
  95 + current_cache[key] = current_repository[key] || false
  96 + end
  97 +
  98 + def cached_plural_find(*keys)
  99 + key = '||||' + keys * '||||'
  100 + translation = current_cache[key]
  101 + return translation if translation or translation == false #found or was not found before
  102 + current_cache[key] = current_repository.plural(*keys) || false
  103 + end
  104 +
  105 + def locale
  106 + _locale || ( default_locale || (available_locales||[]).first || 'en' )
  107 + end
  108 +
  109 + def locale=(new_locale)
  110 + new_locale = best_locale_in(new_locale)
  111 + self._locale = new_locale if new_locale
  112 + end
  113 +
  114 + # for chaining: puts set_locale('xx') == 'xx' ? 'applied' : 'rejected'
  115 + # returns the current locale, not the one that was supplied
  116 + # like locale=(), whoes behavior cannot be changed
  117 + def set_locale(new_locale)
  118 + self.locale = new_locale
  119 + locale
  120 + end
  121 +
  122 + @@default_locale = nil
  123 + def default_locale=(new_locale)
  124 + @@default_locale = best_locale_in(new_locale)
  125 + update_current_cache
  126 + end
  127 +
  128 + def default_locale
  129 + @@default_locale
  130 + end
  131 +
  132 + #Opera: de-DE,de;q=0.9,en;q=0.8
  133 + #Firefox de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
  134 + #IE6/7 de
  135 + #nil if nothing matches
  136 + def best_locale_in(locales)
  137 + formatted_sorted_locales(locales).each do |candidate|
  138 + return candidate if not available_locales
  139 + return candidate if available_locales.include?(candidate)
  140 + return candidate[0..1] if available_locales.include?(candidate[0..1])#available locales include a langauge
  141 + end
  142 + return nil#nothing found im sorry :P
  143 + end
  144 +
  145 + #turn off translation if none was defined to disable all resulting errors
  146 + def silence_errors
  147 + require 'fast_gettext/translation_repository/base'
  148 + translation_repositories[text_domain] = TranslationRepository::Base.new('x')
  149 + end
  150 +
  151 + private
  152 +
  153 + # de-de,DE-CH;q=0.9 -> ['de_DE','de_CH']
  154 + def formatted_sorted_locales(locales)
  155 + found = weighted_locales(locales).reject{|x|x.empty?}.sort_by{|l|l.last}.reverse #sort them by weight which is the last entry
  156 + found.flatten.map{|l| format_locale(l)}
  157 + end
  158 +
  159 + #split the locale and seperate it into different languages
  160 + #de-de,de;q=0.9,en;q=0.8 => [['de-de','de','0.5'], ['en','0.8']]
  161 + def weighted_locales(locales)
  162 + locales = locales.to_s.gsub(/\s/,'')
  163 + found = [[]]
  164 + locales.split(',').each do |part|
  165 + if part =~ /;q=/ #contains language and weight ?
  166 + found.last << part.split(/;q=/)
  167 + found.last.flatten!
  168 + found << []
  169 + else
  170 + found.last << part
  171 + end
  172 + end
  173 + found
  174 + end
  175 +
  176 + #de-de -> de_DE
  177 + def format_locale(locale)
  178 + locale.sub(/^([a-zA-Z]{2})[-_]([a-zA-Z]{2})$/){$1.downcase+'_'+$2.upcase}
  179 + end
  180 +
  181 + def update_current_cache
  182 + caches[text_domain] ||= {}
  183 + caches[text_domain][locale] ||= {}
  184 + caches[text_domain][locale][""] = false #ignore gettext meta key when translating
  185 + self.current_cache = caches[text_domain][locale]
  186 + end
  187 + end
  188 +end
0 189 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation.rb 0 → 100644
... ... @@ -0,0 +1,53 @@
  1 +module FastGettext
  2 + # this module should be included
  3 + # Responsibility:
  4 + # - direct translation queries to the current repository
  5 + # - handle untranslated values
  6 + # - understand / enforce namespaces
  7 + # - decide which plural form is used
  8 + module Translation
  9 + extend self
  10 +
  11 + #make it usable in class definition, e.g.
  12 + # class Y
  13 + # include FastGettext::Translation
  14 + # @@x = _('y')
  15 + # end
  16 + def self.included(klas) #:nodoc:
  17 + klas.extend self
  18 + end
  19 +
  20 + def _(key)
  21 + FastGettext.cached_find(key) or key
  22 + end
  23 +
  24 + #translate pluralized
  25 + # some languages have up to 4 plural forms...
  26 + # n_(singular, plural, plural form 2, ..., count)
  27 + # n_('apple','apples',3)
  28 + def n_(*keys)
  29 + count = keys.pop
  30 + translations = FastGettext.cached_plural_find *keys
  31 + selected = FastGettext.pluralisation_rule.call(count)
  32 + selected = selected ? 1 : 0 unless selected.is_a? Numeric #convert booleans to numbers
  33 + translations[selected] || keys[selected] || keys.last
  34 + end
  35 +
  36 + #translate, but discard namespace if nothing was found
  37 + # Car|Tire -> Tire if no translation could be found
  38 + def s_(key,seperator=nil)
  39 + translation = FastGettext.cached_find(key) and return translation
  40 + key.split(seperator||NAMESPACE_SEPERATOR).last
  41 + end
  42 +
  43 + #tell gettext: this string need translation (will be found during parsing)
  44 + def N_(translate)
  45 + translate
  46 + end
  47 +
  48 + #tell gettext: this string need translation (will be found during parsing)
  49 + def Nn_(*keys)
  50 + keys
  51 + end
  52 + end
  53 +end
0 54 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository.rb 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +module FastGettext
  2 + # Responsibility:
  3 + # - decide which repository to choose from given input
  4 + module TranslationRepository
  5 + extend self
  6 +
  7 + # only single-word types supported atm (mytype works, MyType will not)
  8 + def build(name, options)
  9 + type = options[:type] || :mo
  10 + class_name = type.to_s.capitalize
  11 + unless FastGettext::TranslationRepository.constants.map{|c|c.to_s}.include?(class_name)
  12 + require "fast_gettext/translation_repository/#{type}"
  13 + end
  14 + eval(class_name).new(name,options)
  15 + end
  16 + end
  17 +end
0 18 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/base.rb 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 +module FastGettext
  2 + module TranslationRepository
  3 + # Responsibility:
  4 + # - base for all repositories
  5 + # - fallback as empty repository, that cannot translate anything but does not crash
  6 + class Base
  7 + def initialize(name,options={})
  8 + @name = name
  9 + @options = options
  10 + end
  11 +
  12 + def pluralisation_rule
  13 + nil
  14 + end
  15 +
  16 + def available_locales
  17 + []
  18 + end
  19 +
  20 + def [](key)
  21 + current_translations[key]
  22 + end
  23 +
  24 + def plural(*keys)
  25 + current_translations.plural(*keys)
  26 + end
  27 +
  28 + protected
  29 +
  30 + def current_translations
  31 + MoFile.empty
  32 + end
  33 +
  34 + def find_files_in_locale_folders(relative_file_path,path)
  35 + path ||= "locale"
  36 + raise "path #{path} cound not be found!" unless File.exist?(path)
  37 +
  38 + @files = {}
  39 + Dir[File.join(path,'*')].each do |locale_folder|
  40 + next unless File.basename(locale_folder) =~ LOCALE_REX
  41 + file = File.join(locale_folder,relative_file_path)
  42 + next unless File.exist? file
  43 + locale = File.basename(locale_folder)
  44 + @files[locale] = yield(locale,file)
  45 + end
  46 + end
  47 + end
  48 + end
  49 +end
0 50 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/chain.rb 0 → 100644
... ... @@ -0,0 +1,43 @@
  1 +require 'fast_gettext/translation_repository/base'
  2 +
  3 +module FastGettext
  4 + module TranslationRepository
  5 + # Responsibility:
  6 + # - delegate calls to members of the chain in turn
  7 + #TODO cache should be expired after a repo was added
  8 + class Chain < Base
  9 + attr_accessor :chain
  10 +
  11 + def initialize(name,options={})
  12 + super
  13 + self.chain = options[:chain]
  14 + end
  15 +
  16 + def available_locales
  17 + chain.map{|c|c.available_locales}.flatten.uniq
  18 + end
  19 +
  20 + def pluralisation_rule
  21 + chain.each do |c|
  22 + result = c.pluralisation_rule and return result
  23 + end
  24 + nil
  25 + end
  26 +
  27 + def [](key)
  28 + chain.each do |c|
  29 + result = c[key] and return result
  30 + end
  31 + nil
  32 + end
  33 +
  34 + def plural(*keys)
  35 + chain.each do |c|
  36 + result = c.plural(*keys)
  37 + return result unless result.compact.empty?
  38 + end
  39 + []
  40 + end
  41 + end
  42 + end
  43 +end
0 44 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/db.rb 0 → 100644
... ... @@ -0,0 +1,57 @@
  1 +require 'active_record'
  2 +module FastGettext
  3 + module TranslationRepository
  4 + # Responsibility:
  5 + # - provide access to translations in database through a database abstraction
  6 + #
  7 + # Options:
  8 + # :model => Model that represents your keys
  9 + # you can either use the models supplied under db/, extend them or build your own
  10 + # only constraints:
  11 + # key: find_by_key, translations
  12 + # translation: text, locale
  13 + class Db
  14 + def initialize(name,options={})
  15 + @model = options[:model]
  16 + end
  17 +
  18 + @@seperator = '||||' # string that seperates multiple plurals
  19 + def self.seperator=(sep);@@seperator = sep;end
  20 + def self.seperator;@@seperator;end
  21 +
  22 + def available_locales
  23 + if @model.respond_to? :available_locales
  24 + @model.available_locales || []
  25 + else
  26 + []
  27 + end
  28 + end
  29 +
  30 + def pluralisation_rule
  31 + if @model.respond_to? :pluralsation_rule
  32 + @model.pluralsation_rule
  33 + else
  34 + nil
  35 + end
  36 + end
  37 +
  38 + def [](key)
  39 + @model.translation(key, FastGettext.locale)
  40 + end
  41 +
  42 + def plural(*args)
  43 + if translation = @model.translation(args*self.class.seperator, FastGettext.locale)
  44 + translation.to_s.split(self.class.seperator)
  45 + else
  46 + []
  47 + end
  48 + end
  49 +
  50 + def self.require_models
  51 + require 'fast_gettext/translation_repository/db_models/translation_key'
  52 + require 'fast_gettext/translation_repository/db_models/translation_text'
  53 + FastGettext::TranslationRepository::DbModels
  54 + end
  55 + end
  56 + end
  57 +end
0 58 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/db_models/translation_key.rb 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +module FastGettext::TranslationRepository
  2 + module DbModels
  3 + class TranslationKey < ActiveRecord::Base
  4 + has_many :translations, :class_name=>'TranslationText'
  5 + accepts_nested_attributes_for :translations, :allow_destroy => true
  6 +
  7 + validates_uniqueness_of :key
  8 + validates_presence_of :key
  9 +
  10 + def self.translation(key, locale)
  11 + return unless translation_key = find_by_key(key)
  12 + return unless translation_text = translation_key.translations.find_by_locale(locale)
  13 + translation_text.text
  14 + end
  15 +
  16 + def self.available_locales
  17 + @@available_locales ||= TranslationText.count(:group=>:locale).keys.sort
  18 + end
  19 +
  20 + #this is only for ActiveSupport to get polymorphic_url FastGettext::... namespace free
  21 + def self.model_name
  22 + ActiveSupport::ModelName.new('TranslationKey')
  23 + end
  24 + end
  25 + end
  26 +end
0 27 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/db_models/translation_text.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +module FastGettext::TranslationRepository
  2 + module DbModels
  3 + class TranslationText < ActiveRecord::Base
  4 + belongs_to :key, :class_name=>'TranslationKey'
  5 + validates_presence_of :locale
  6 + validates_uniqueness_of :locale, :scope=>:translation_key_id
  7 + end
  8 + end
  9 +end
0 10 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/logger.rb 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +require 'fast_gettext/translation_repository/base'
  2 +
  3 +module FastGettext
  4 + module TranslationRepository
  5 + # This should be used in a TranslationRepository::Chain, so tat untranslated keys can be found
  6 + # Responsibility:
  7 + # - log every translation call
  8 + class Logger < Base
  9 + attr_accessor :callback
  10 +
  11 + def initialize(name,options={})
  12 + super
  13 + self.callback = options[:callback]
  14 + end
  15 +
  16 + def [](key)
  17 + callback.call(key)
  18 + nil
  19 + end
  20 +
  21 + def plural(*keys)
  22 + callback.call(keys)
  23 + []
  24 + end
  25 + end
  26 + end
  27 +end
0 28 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/mo.rb 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +require 'fast_gettext/translation_repository/base'
  2 +module FastGettext
  3 + module TranslationRepository
  4 + # Responsibility:
  5 + # - find and store mo files
  6 + # - provide access to translations in mo files
  7 + class Mo < Base
  8 + def initialize(name,options={})
  9 + find_and_store_files(name,options)
  10 + super
  11 + end
  12 +
  13 + def available_locales
  14 + @files.keys
  15 + end
  16 +
  17 + def pluralisation_rule
  18 + current_translations.pluralisation_rule
  19 + end
  20 +
  21 + protected
  22 +
  23 + def find_and_store_files(name,options)
  24 + # parse all .mo files with the right name, that sit in locale/LC_MESSAGES folders
  25 + find_files_in_locale_folders(File.join('LC_MESSAGES',"#{name}.mo"), options[:path]) do |locale,file|
  26 + @files[locale] = MoFile.new(file)
  27 + end
  28 + end
  29 +
  30 + def current_translations
  31 + @files[FastGettext.locale] || MoFile.empty
  32 + end
  33 + end
  34 + end
  35 +end
0 36 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/po.rb 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +require 'fast_gettext/translation_repository/base'
  2 +require 'fast_gettext/translation_repository/mo'
  3 +module FastGettext
  4 + module TranslationRepository
  5 + # Responsibility:
  6 + # - find and store po files
  7 + # - provide access to translations in po files
  8 + class Po < Mo
  9 + protected
  10 + def find_and_store_files(name,options)
  11 + require 'fast_gettext/po_file'
  12 + find_files_in_locale_folders("#{name}.po",options[:path]) do |locale,file|
  13 + @files[locale] = PoFile.to_mo_file(file)
  14 + end
  15 + end
  16 + end
  17 + end
  18 +end
0 19 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/translation_repository/yaml.rb 0 → 100644
... ... @@ -0,0 +1,72 @@
  1 +require 'fast_gettext/translation_repository/base'
  2 +require 'yaml'
  3 +
  4 +module FastGettext
  5 + module TranslationRepository
  6 + # Responsibility:
  7 + # - find and store yaml files
  8 + # - provide access to translations in yaml files
  9 + class Yaml < Base
  10 + def initialize(name,options={})
  11 + find_and_store_files(options)
  12 + super
  13 + end
  14 +
  15 + def available_locales
  16 + @files.keys
  17 + end
  18 +
  19 + def plural(*keys)
  20 + ['one', 'other', 'plural2', 'plural3'].map do |name|
  21 + self[yaml_dot_notation(keys.first, name)]
  22 + end
  23 + end
  24 +
  25 + def pluralisation_rule
  26 + self['pluralisation_rule'] ? lambda{|n| eval(self['pluralisation_rule']) } : nil
  27 + end
  28 +
  29 + protected
  30 +
  31 + MAX_FIND_DEPTH = 10
  32 +
  33 + def find_and_store_files(options)
  34 + @files = {}
  35 + path = options[:path] || 'config/locales'
  36 + Dir["#{path}/??.yml"].each do |yaml_file|
  37 + locale = yaml_file.match(/([a-z]{2})\.yml$/)[1]
  38 + @files[locale] = load_yaml(yaml_file, locale)
  39 + end
  40 + end
  41 +
  42 + def current_translations
  43 + @files[FastGettext.locale] || super
  44 + end
  45 +
  46 + # Given a yaml file return a hash of key -> translation
  47 + def load_yaml(file, locale)
  48 + yaml = YAML.load_file(file)
  49 + yaml_hash_to_dot_notation(yaml[locale])
  50 + end
  51 +
  52 + def yaml_hash_to_dot_notation(yaml_hash)
  53 + add_yaml_key({}, nil, yaml_hash)
  54 + end
  55 +
  56 + def add_yaml_key(result, prefix, hash)
  57 + hash.each_pair do |key, value|
  58 + if value.kind_of?(Hash)
  59 + add_yaml_key(result, yaml_dot_notation(prefix, key), value)
  60 + else
  61 + result[yaml_dot_notation(prefix, key)] = value
  62 + end
  63 + end
  64 + result
  65 + end
  66 +
  67 + def yaml_dot_notation(a,b)
  68 + a ? "#{a}.#{b}" : b
  69 + end
  70 + end
  71 + end
  72 +end
0 73 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/vendor/README.rdoc 0 → 100644
... ... @@ -0,0 +1,236 @@
  1 += Ruby-GetText-Package
  2 +
  3 +Ruby-GetText-Package is a Localization(L10n) library and tool
  4 +which is modeled after the GNU gettext package.
  5 +
  6 +This library translates original messages to localized
  7 +messages using client-side locale information(environment
  8 +variable or CGI variable).
  9 +
  10 +The tools for developers support creating, useing, and modifying
  11 +localized message files(message catalogs).
  12 +
  13 +((*Rails*))
  14 +Rails support has been removed.
  15 +Rails / ActiveRecord specific code now lives in gettext_rails and gettext_activerecord.
  16 +
  17 +== Website
  18 +* homepage[http://www.yotabanana.com/hiki/ruby-gettext.html]
  19 +* on rubyforge[http://gettext/rubyforge.org/]
  20 +* on github[http://github.com/gettext/]
  21 +
  22 +== Features
  23 +* Simple APIs(similar to GNU gettext)
  24 +
  25 +* rgettext creates po-files from
  26 + * ruby scripts
  27 + * glade-2 XML file(.glade)
  28 + * ERB file(.rhtml, .erb)
  29 + * Anything (with your own parsers)
  30 + * The po-files are compatible to GNU gettext.
  31 +
  32 +* rmsgfmt creates a mo-file from a po-file.
  33 + The mo-file is compatible to GNU gettext(msgfmt).
  34 +
  35 +* textdomain's scope is adapt to ruby class/module mechanism.
  36 + * A class/module can have plural textdomains.
  37 + * a message is looked up in its class/module and ancestors.
  38 +
  39 +* CGI support (gettext/cgi)
  40 + * Locale is retrieved from client informations
  41 + (HTTP_ACCEPT_LANGUAGE, HTTP_ACCEPT_CHARSET, QUERY_STRING(lang), Cookies(lang)).
  42 +
  43 +* String%() is extended to use named argument such as <tt>%{foo}" %{:foo => 1}</tt>.
  44 + Notes that Ruby-1.9.x supports this format by itself.
  45 +
  46 +== Requirements
  47 +* {Ruby 1.8.3 or later}[http://www.ruby-lang.org]
  48 +* {Rubygems}[http://www.rubygems.org/]
  49 +* {locale gem}[http://rubyforge.org/projects/locale/]
  50 + * $ gem install locale
  51 +* (for development only)
  52 + * {GNU gettext 0.10.35 or later}[http://www.gnu.org/software/gettext/gettext.html]
  53 + * {Racc-1.4.3 or later}[http://www.ruby-lang.org/raa/list.rhtml?name=racc]
  54 + * (for compiling src/rmsgfmt.ry only)
  55 +
  56 +== Install
  57 +* Uninstall old gettext if exists.
  58 + (sudo/su on POSIX system)
  59 + gem uninstall gettext
  60 +
  61 +* gem
  62 + #from github (edge/unstable)
  63 + (sudo/su on POSIX system)
  64 + gem install locale
  65 + gem install mutoh-gettext -s http://gems.github.com/
  66 +
  67 + #from rubyforge (stable)
  68 + (sudo/su on POSIX system)
  69 + gem install locale
  70 + gem install gettext
  71 +
  72 +* download tar-ball
  73 + # De-Compress archive and enter its top directory.
  74 + (sudo/su on POSIX system)
  75 + ruby setup.rb
  76 +
  77 +You can also install files in your favorite directory by
  78 +supplying setup.rb some options. Try <tt>ruby setup.rb --help</tt>.
  79 +
  80 +== Usage
  81 +===Translation
  82 +- _: Basic translation method
  83 + Translates the message.
  84 + _("Hello")
  85 +
  86 +The gettext methods comes in 3 combinable flavors
  87 +- n: Pluralized
  88 + Returns singular or plural form, depending on how many you have.
  89 + n_("Apple", "%{num} Apples", 3)
  90 + n_(["Apple", "%{num} Apples"], 3)
  91 +
  92 +- p: context aware
  93 + A context is a prefix to your translation, usefull when one word has different meanings, depending on its context.
  94 + p_("Printer","Open") <=> p_("File","Open")
  95 + is the same as s_("Printer|Open") <=> s_("File|Open")
  96 +
  97 +- s: without context
  98 + If a translation could not be found, return the msgid without context.
  99 + s_("Printer|Open") => "Öffnen" #translation found
  100 + s_("Printer|Open") => "Open" #translation not found
  101 +
  102 +- combinations
  103 + np_("Fruit", "Apple", "%{num} Apples", 3)
  104 + ns_("Fruit|Apple","%{num} Apples", 3)
  105 +
  106 + np_(["Fruit","Apple","%{num} Apples"], 3)
  107 + ns_(["Fruit|Apple","%{num} Apples"], 3)
  108 +
  109 +- N_, Nn_: Makes dynamic translation messages readable for the gettext parser.
  110 + <tt>_(fruit)</tt> cannot be understood by the gettext parser. To help the parser find all your translations,
  111 + you can add <tt>fruit = N_("Apple")</tt> which does not translate, but tells the parser: "Apple" needs translation.
  112 +
  113 + fruit = N_("Apple") # same as fruit = "Apple"
  114 + _(fruit) # does a normal translation
  115 +
  116 + fruits = Nn_("Apple", "%{num} Apples")
  117 + n_(fruits, 3)
  118 +
  119 +=== Locale / Domain
  120 +GetText stores the locale your are using
  121 + GetText.locale = "en_US" # translate into english from now on
  122 + GetText.locale # => en_US
  123 +Or
  124 + include GetText
  125 + set_locale "en_US"
  126 +
  127 +Each locale can have different sets of translations (text domains) (e.g. Financial terms + Human-resource terms)
  128 + GetText.bindtextdomain('financial')
  129 +Or
  130 + include GetText
  131 + bindtextdomain('financial')
  132 +
  133 +For more details and options, have a look at the samples folder or
  134 +consult the tutorial[http://www.yotabanana.com/hiki/ruby-gettext-howto.html].
  135 +
  136 +
  137 +== License
  138 +This program is licenced under the same licence as Ruby.
  139 +(See the file 'COPYING'.)
  140 +
  141 +* mofile.rb
  142 + * Copyright (C) 2001-2009 Masao Mutoh <mutoh at highwhay.ne.jp>
  143 + * Copyright (C) 2001,2002 Masahiro Sakai <s01397ms at sfc.keio.ac.jp>
  144 +
  145 +* gettext.rb
  146 + * Copyright (C) 2001-2009 Masao Mutoh <mutoh at highwhay.ne.jp>
  147 + * Copyright (C) 2001,2002 Masahiro Sakai <s01397ms at sfc.keio.ac.jp>
  148 +
  149 +* rgettext
  150 + * Copyright (C) 2001-2009 Masao Mutoh <mutoh at highwhay.ne.jp>
  151 + * Copyright (C) 2001,2002 Yasushi Shoji <yashi at atmark-techno.com>
  152 +
  153 +* setup.rb
  154 + * Copyright (C) 2000-2005 Minero Aoki <aamine at loveruby.net>
  155 + * This file is released under LGPL. See the top of the install.rb.
  156 +
  157 +* Others
  158 + * Copyright (C) 2001-2009 Masao Mutoh <mutoh at highwhay.ne.jp>
  159 +
  160 +
  161 +== Translators
  162 +* Bosnian(bs) - Sanjin Sehic <saserr at gmail.com>
  163 +* Bulgarian(bg) - Sava Chankov <sava.chankov at gmail.com>
  164 +* Catalan(ca) - Ramon Salvadó <rsalvado at gnuine.com>
  165 +* Chinese(Simplified)(zh_CN)
  166 + * Yang Bob <bob.yang.dev at gmail.com> (current)
  167 + * Yingfeng <blogyingfeng at gmail.com>
  168 +* Chinese(Traditional)(zh_TW)
  169 + * Yang Bob <bob.yang.dev at gmail.com> (current)
  170 + * LIN CHUNG-YI <xmarsh at gmail.com>
  171 +* Croatian(hr) - Sanjin Sehic <saserr at gmail.com>
  172 +* Czech(cs) - Karel Miarka <kajism at yahoo.com>
  173 +* Dutch(nl) - Menno Jonkers <ruby-gettext at jonkers.com>
  174 +* Esperanto(eo) - Malte Milatz <malte at gmx-topmail.de>
  175 +* Estonian(et) - Erkki Eilonen <erkki at itech.ee>
  176 +* French(fr)
  177 + * Vincent Isambart <vincent.isambart at gmail.com> (current)
  178 + * David Sulc <davidsulc at gmail.com>
  179 + * Laurent Sansonetti <laurent.sansonetti at gmail.com>
  180 +* German(de)
  181 + * Patrick Lenz <patrick at limited-overload.de> (current)
  182 + * Detlef Reichl <detlef.reichl at gmx.org>
  183 + * Sven Herzberg <herzi at abi02.de>
  184 + * Sascha Ebach <se at digitale-wertschoepfung.de>
  185 +* Greek(el) - Vassilis Rizopoulos <damphyr at gmx.net>
  186 +* Hungarian(hu) - Tamás Tompa <tompata at gmail.com>
  187 +* Italian(it)
  188 + * Marco Lazzeri <marco.lazzeri at gmail.com>
  189 + * Gabriele Renzi <surrender_it at yahoo.it>
  190 +* Japanese(ja) - Masao Mutoh <mutoh at highway.ne.jp>
  191 +* Korean(ko) - Gyoung-Yoon Noh <nohmad at gmail.com>
  192 +* Latvian(lv) - Aivars Akots <aivars.akots at gmail.com>
  193 +* Norwegian(nb) - Runar Ingebrigtsen <runar at mopo.no>
  194 +* Portuguese(Brazil)(pt_BR)
  195 + * Antonio S. de A. Terceiro <terceiro at softwarelivre.org> (current)
  196 + * Joao Pedrosa <joaopedrosa at gmail.com>
  197 +* Russian(ru) - Yuri Kozlov <kozlov.y at gmail.com>
  198 +* Serbian(sr) - Slobodan Paunović" <slobodan.paunovic at gmail.com>
  199 +* Spanish(es)
  200 + * David Espada <davinci at escomposlinux.org> (current)
  201 + * David Moreno Garza <damog at damog.net>
  202 +* Swedish(sv) - Nikolai Weibull <mailing-lists.ruby-talk at rawuncut.elitemail.org>
  203 +* Ukrainian(ua) - Alex Rootoff <rootoff at pisem.net>
  204 +* Vietnamese(vi) - Ngoc Dao Thanh <ngocdaothanh at gmail.com>
  205 +
  206 +== Status of translations
  207 +* Bosnian(bs) - 1.90.0 (old)
  208 +* Bulgarian(bg) - 2.0.0pre1 (new)
  209 +* Catalan(ca) - 2.0.0pre1
  210 +* Croatian(hr) - 1.90.0 (old)
  211 +* Chinese(zh_CN) - 2.0.0pre1
  212 +* Chinese(zh_TW) - 2.0.0pre1
  213 +* Czech(cs) - 1.9.0 (old)
  214 +* Dutch(nl) - 1.90.0 (old)
  215 +* English(default) - 1.90.0 (old)
  216 +* Esperanto(eo) - 2.0.0pre1
  217 +* Estonian(et) - 2.0.0pre1
  218 +* French(fr) - 2.0.0pre1
  219 +* German(de) - 2.0.0pre1
  220 +* Greek(el) - 2.0.0pre1
  221 +* Hungarian(hu) - 2.0.0pre1
  222 +* Italian(it) - 1.6.0 (old)
  223 +* Japanese(ja) - 2.0.0pre1
  224 +* Korean(ko) - 1.9.0 (old)
  225 +* Latvian(lv) - 2.0.0pre1 (new)
  226 +* Norwegian(nb) - 2.0.0pre1
  227 +* Portuguese(Brazil)(pt_BR) - 2.0.0pre1
  228 +* Russian(ru) - 2.0.0pre1
  229 +* Serbian(sr) - 1.91.0 (old)
  230 +* Spanish(es) - 2.0.0pre1
  231 +* Swedish(sv) - 0.8.0 (too much old)
  232 +* Ukrainian(ua) - 2.0.0pre1
  233 +* Vietnamese(vi) - 2.0.0pre1
  234 +
  235 +== Maintainer
  236 +Masao Mutoh <mutoh at highway.ne.jp>
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/vendor/empty.mo 0 → 100644
No preview for this file type
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/vendor/iconv.rb 0 → 100644
... ... @@ -0,0 +1,107 @@
  1 +=begin
  2 + iconv.rb - Pseudo Iconv class. Supports Iconv.iconv, Iconv.conv.
  3 +
  4 + For Matz Ruby:
  5 + If you don't have iconv but glib2, this library uses glib2 iconv functions.
  6 +
  7 + For JRuby:
  8 + Use Java String class to convert strings.
  9 +
  10 + Copyright (C) 2004-2007 Masao Mutoh
  11 +
  12 + You may redistribute it and/or modify it under the same
  13 + license terms as Ruby.
  14 +
  15 + $Id: iconv.rb,v 1.6 2007/11/08 14:21:22 mutoh Exp $
  16 +=end
  17 +
  18 +#Modifications
  19 +#wrapped inside FastGettext namespace to reduce conflic
  20 +
  21 +begin
  22 + require 'iconv'
  23 +rescue LoadError
  24 + # Provides Iconv.iconv which normally is provided through Ruby/GLib(1) functions.
  25 + # This library is required for 'gettext'.
  26 + # If you require 'gettext/iconv', it tries to call Ruby/GLib function
  27 + # when it doesn't find original Iconv class(iconv.so) it adds a pseudo class.
  28 + #
  29 + # One-click Ruby Installer for Win32 hadn’t had iconv and there hadn’t been a way to install iconv.so itself for Win32.
  30 + # And JRuby hadn’t had Iconv.
  31 + # I’ve not checked them currently, but if they’ve supported iconv now, we don’t need this anymore...
  32 + #
  33 + # (1) Ruby/GLib is a module which is provided from Ruby-GNOME2 Project.
  34 + # You can get binaries for Win32(One-Click Ruby Installer).
  35 + # <URL: http://ruby-gnome2.sourceforge.jp/>
  36 + module FastGettext
  37 + class Iconv2
  38 + module Failure; end
  39 + class InvalidEncoding < ArgumentError; include Failure; end
  40 + class IllegalSequence < ArgumentError; include Failure; end
  41 + class InvalidCharacter < ArgumentError; include Failure; end
  42 +
  43 + if RUBY_PLATFORM =~ /java/
  44 + def self.conv(to, from, str)
  45 + raise InvalidCharacter, "the 3rd argument is nil" unless str
  46 + begin
  47 + str = java.lang.String.new(str.unpack("C*").to_java(:byte), from)
  48 + str.getBytes(to).to_ary.pack("C*")
  49 + rescue java.io.UnsupportedEncodingException
  50 + raise InvalidEncoding
  51 + end
  52 + end
  53 + else
  54 + begin
  55 + require 'glib2'
  56 +
  57 + def self.check_glib_version?(major, minor, micro) # :nodoc:
  58 + (GLib::BINDING_VERSION[0] > major ||
  59 + (GLib::BINDING_VERSION[0] == major &&
  60 + GLib::BINDING_VERSION[1] > minor) ||
  61 + (GLib::BINDING_VERSION[0] == major &&
  62 + GLib::BINDING_VERSION[1] == minor &&
  63 + GLib::BINDING_VERSION[2] >= micro))
  64 + end
  65 +
  66 + if check_glib_version?(0, 11, 0)
  67 + # This is a function equivalent of Iconv.iconv.
  68 + # * to: encoding name for destination
  69 + # * from: encoding name for source
  70 + # * str: strings to be converted
  71 + # * Returns: Returns an Array of converted strings.
  72 + def self.conv(to, from, str)
  73 + begin
  74 + GLib.convert(str, to, from)
  75 + rescue GLib::ConvertError => e
  76 + case e.code
  77 + when GLib::ConvertError::NO_CONVERSION
  78 + raise InvalidEncoding.new(str)
  79 + when GLib::ConvertError::ILLEGAL_SEQUENCE
  80 + raise IllegalSequence.new(str)
  81 + else
  82 + raise InvalidCharacter.new(str)
  83 + end
  84 + end
  85 + end
  86 + else
  87 + def self.conv(to, from, str) # :nodoc:
  88 + begin
  89 + GLib.convert(str, to, from)
  90 + rescue
  91 + raise IllegalSequence.new(str)
  92 + end
  93 + end
  94 + end
  95 + rescue LoadError
  96 + def self.conv(to, from, str) # :nodoc:
  97 + warn "Iconv was not found." if $DEBUG
  98 + str
  99 + end
  100 + end
  101 + end
  102 + def self.iconv(to, from, str)
  103 + conv(to, from, str).split(//)
  104 + end
  105 + end
  106 + end
  107 +end
0 108 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/vendor/mofile.rb 0 → 100644
... ... @@ -0,0 +1,296 @@
  1 +=begin
  2 + mofile.rb - A simple class for operating GNU MO file.
  3 +
  4 + Copyright (C) 2003-2008 Masao Mutoh
  5 + Copyright (C) 2002 Masahiro Sakai, Masao Mutoh
  6 + Copyright (C) 2001 Masahiro Sakai
  7 +
  8 + Masahiro Sakai <s01397ms at sfc.keio.ac.jp>
  9 + Masao Mutoh <mutoh at highway.ne.jp>
  10 +
  11 + You can redistribute this file and/or modify it under the same term
  12 + of Ruby. License of Ruby is included with Ruby distribution in
  13 + the file "README".
  14 +
  15 + $Id: mo.rb,v 1.10 2008/06/17 16:40:52 mutoh Exp $
  16 +=end
  17 +
  18 +require 'iconv'
  19 +require 'stringio'
  20 +
  21 +#Modifications:
  22 +# use Iconv or FastGettext::Icvon
  23 +
  24 +module FastGettext
  25 + module GetText
  26 + class MOFile < Hash
  27 + class InvalidFormat < RuntimeError; end;
  28 +
  29 + attr_reader :filename
  30 +
  31 + Header = Struct.new(:magic,
  32 + :revision,
  33 + :nstrings,
  34 + :orig_table_offset,
  35 + :translated_table_offset,
  36 + :hash_table_size,
  37 + :hash_table_offset)
  38 +
  39 + # The following are only used in .mo files
  40 + # with minor revision >= 1.
  41 + class HeaderRev1 < Header
  42 + attr_accessor :n_sysdep_segments,
  43 + :sysdep_segments_offset,
  44 + :n_sysdep_strings,
  45 + :orig_sysdep_tab_offset,
  46 + :trans_sysdep_tab_offset
  47 + end
  48 +
  49 + MAGIC_BIG_ENDIAN = "\x95\x04\x12\xde"
  50 + MAGIC_LITTLE_ENDIAN = "\xde\x12\x04\x95"
  51 +
  52 + def self.open(arg = nil, output_charset = nil)
  53 + result = self.new(output_charset)
  54 + result.load(arg)
  55 + end
  56 +
  57 + def initialize(output_charset = nil)
  58 + @filename = nil
  59 + @last_modified = nil
  60 + @little_endian = true
  61 + @output_charset = output_charset
  62 + super()
  63 + end
  64 +
  65 + def update!
  66 + if FileTest.exist?(@filename)
  67 + st = File.stat(@filename)
  68 + load(@filename) unless (@last_modified == [st.ctime, st.mtime])
  69 + else
  70 + warn "#{@filename} was lost." if $DEBUG
  71 + clear
  72 + end
  73 + self
  74 + end
  75 +
  76 + def load(arg)
  77 + if arg.kind_of? String
  78 + begin
  79 + st = File.stat(arg)
  80 + @last_modified = [st.ctime, st.mtime]
  81 + rescue Exception
  82 + end
  83 + load_from_file(arg)
  84 + else
  85 + load_from_stream(arg)
  86 + end
  87 + @filename = arg
  88 + self
  89 + end
  90 +
  91 + def load_from_stream(io)
  92 + magic = io.read(4)
  93 + case magic
  94 + when MAGIC_BIG_ENDIAN
  95 + @little_endian = false
  96 + when MAGIC_LITTLE_ENDIAN
  97 + @little_endian = true
  98 + else
  99 + raise InvalidFormat.new(sprintf("Unknown signature %s", magic.dump))
  100 + end
  101 +
  102 + endian_type6 = @little_endian ? 'V6' : 'N6'
  103 + endian_type_astr = @little_endian ? 'V*' : 'N*'
  104 +
  105 + header = HeaderRev1.new(magic, *(io.read(4 * 6).unpack(endian_type6)))
  106 +
  107 + if header.revision == 1
  108 + # FIXME: It doesn't support sysdep correctly.
  109 + header.n_sysdep_segments = io.read(4).unpack(endian_type6)
  110 + header.sysdep_segments_offset = io.read(4).unpack(endian_type6)
  111 + header.n_sysdep_strings = io.read(4).unpack(endian_type6)
  112 + header.orig_sysdep_tab_offset = io.read(4).unpack(endian_type6)
  113 + header.trans_sysdep_tab_offset = io.read(4).unpack(endian_type6)
  114 + elsif header.revision > 1
  115 + raise InvalidFormat.new(sprintf("file format revision %d isn't supported", header.revision))
  116 + end
  117 + io.pos = header.orig_table_offset
  118 + orig_table_data = io.read((4 * 2) * header.nstrings).unpack(endian_type_astr)
  119 +
  120 + io.pos = header.translated_table_offset
  121 + trans_table_data = io.read((4 * 2) * header.nstrings).unpack(endian_type_astr)
  122 +
  123 + original_strings = Array.new(header.nstrings)
  124 + for i in 0...header.nstrings
  125 + io.pos = orig_table_data[i * 2 + 1]
  126 + original_strings[i] = io.read(orig_table_data[i * 2 + 0])
  127 + end
  128 +
  129 + clear
  130 + for i in 0...header.nstrings
  131 + io.pos = trans_table_data[i * 2 + 1]
  132 + str = io.read(trans_table_data[i * 2 + 0])
  133 +
  134 + if (! original_strings[i]) || original_strings[i] == ""
  135 + if str
  136 + @charset = nil
  137 + @nplurals = nil
  138 + @plural = nil
  139 + str.each_line{|line|
  140 + if /^Content-Type:/i =~ line and /charset=((?:\w|-)+)/i =~ line
  141 + @charset = $1
  142 + elsif /^Plural-Forms:\s*nplurals\s*\=\s*(\d*);\s*plural\s*\=\s*([^;]*)\n?/ =~ line
  143 + @nplurals = $1
  144 + @plural = $2
  145 + end
  146 + break if @charset and @nplurals
  147 + }
  148 + @nplurals = "1" unless @nplurals
  149 + @plural = "0" unless @plural
  150 + end
  151 + else
  152 + if @output_charset
  153 + begin
  154 + iconv = Iconv || FastGettext::Iconv
  155 + str = iconv.conv(@output_charset, @charset, str) if @charset
  156 + rescue iconv::Failure
  157 + if $DEBUG
  158 + warn "@charset = ", @charset
  159 + warn"@output_charset = ", @output_charset
  160 + warn "msgid = ", original_strings[i]
  161 + warn "msgstr = ", str
  162 + end
  163 + end
  164 + end
  165 + end
  166 + self[original_strings[i]] = str.freeze
  167 + end
  168 + self
  169 + end
  170 +
  171 + # Is this number a prime number ?
  172 + # http://apidock.com/ruby/Prime
  173 + def prime?(number)
  174 + ('1' * number) !~ /^1?$|^(11+?)\1+$/
  175 + end
  176 +
  177 + def next_prime(seed)
  178 + require 'mathn'
  179 + prime = Prime.new
  180 + while current = prime.succ
  181 + return current if current > seed
  182 + end
  183 + end
  184 +
  185 + # From gettext-0.12.1/gettext-runtime/intl/hash-string.h
  186 + # Defines the so called `hashpjw' function by P.J. Weinberger
  187 + # [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
  188 + # 1986, 1987 Bell Telephone Laboratories, Inc.]
  189 + HASHWORDBITS = 32
  190 + def hash_string(str)
  191 + hval = 0
  192 + i = 0
  193 + str.each_byte do |b|
  194 + break if b == '\0'
  195 + hval <<= 4
  196 + hval += b.to_i
  197 + g = hval & (0xf << (HASHWORDBITS - 4))
  198 + if (g != 0)
  199 + hval ^= g >> (HASHWORDBITS - 8)
  200 + hval ^= g
  201 + end
  202 + end
  203 + hval
  204 + end
  205 +
  206 + def save_to_stream(io)
  207 + #Save data as little endian format.
  208 + header_size = 4 * 7
  209 + table_size = 4 * 2 * size
  210 +
  211 + hash_table_size = next_prime((size * 4) / 3)
  212 + hash_table_size = 3 if hash_table_size <= 2
  213 + header = Header.new(
  214 + MAGIC_LITTLE_ENDIAN, # magic
  215 + 0, # revision
  216 + size, # nstrings
  217 + header_size, # orig_table_offset
  218 + header_size + table_size, # translated_table_offset
  219 + hash_table_size, # hash_table_size
  220 + header_size + table_size * 2 # hash_table_offset
  221 + )
  222 + io.write(header.to_a.pack('a4V*'))
  223 +
  224 + ary = to_a
  225 + ary.sort!{|a, b| a[0] <=> b[0]} # sort by original string
  226 +
  227 + pos = header.hash_table_size * 4 + header.hash_table_offset
  228 +
  229 + orig_table_data = Array.new()
  230 + ary.each{|item, _|
  231 + orig_table_data.push(item.size)
  232 + orig_table_data.push(pos)
  233 + pos += item.size + 1 # +1 is <NUL>
  234 + }
  235 + io.write(orig_table_data.pack('V*'))
  236 +
  237 + trans_table_data = Array.new()
  238 + ary.each{|_, item|
  239 + trans_table_data.push(item.size)
  240 + trans_table_data.push(pos)
  241 + pos += item.size + 1 # +1 is <NUL>
  242 + }
  243 + io.write(trans_table_data.pack('V*'))
  244 +
  245 + hash_tab = Array.new(hash_table_size)
  246 + j = 0
  247 + ary[0...size].each {|key, _|
  248 + hash_val = hash_string(key)
  249 + idx = hash_val % hash_table_size
  250 + if hash_tab[idx] != nil
  251 + incr = 1 + (hash_val % (hash_table_size - 2))
  252 + begin
  253 + if (idx >= hash_table_size - incr)
  254 + idx -= hash_table_size - incr
  255 + else
  256 + idx += incr
  257 + end
  258 + end until (hash_tab[idx] == nil)
  259 + end
  260 + hash_tab[idx] = j + 1
  261 + j += 1
  262 + }
  263 + hash_tab.collect!{|i| i ? i : 0}
  264 +
  265 + io.write(hash_tab.pack('V*'))
  266 +
  267 + ary.each{|item, _| io.write(item); io.write("\0") }
  268 + ary.each{|_, item| io.write(item); io.write("\0") }
  269 +
  270 + self
  271 + end
  272 +
  273 + def load_from_file(filename)
  274 + @filename = filename
  275 + begin
  276 + File.open(filename, 'rb'){|f| load_from_stream(f)}
  277 + rescue => e
  278 + e.set_backtrace("File: #{@filename}")
  279 + raise e
  280 + end
  281 + end
  282 +
  283 + def save_to_file(filename)
  284 + File.open(filename, 'wb'){|f| save_to_stream(f)}
  285 + end
  286 +
  287 + def set_comment(msgid_or_sym, comment)
  288 + #Do nothing
  289 + end
  290 +
  291 +
  292 + attr_accessor :little_endian, :path, :last_modified
  293 + attr_reader :charset, :nplurals, :plural
  294 + end
  295 + end
  296 +end
0 297 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/vendor/poparser.rb 0 → 100644
... ... @@ -0,0 +1,331 @@
  1 +=begin
  2 + poparser.rb - Generate a .mo
  3 +
  4 + Copyright (C) 2003-2009 Masao Mutoh <mutoh at highway.ne.jp>
  5 +
  6 + You may redistribute it and/or modify it under the same
  7 + license terms as Ruby.
  8 +=end
  9 +
  10 +#MODIFIED
  11 +# removed include GetText etc
  12 +# added stub translation method _(x)
  13 +require 'racc/parser'
  14 +
  15 +module FastGettext
  16 +module GetText
  17 +
  18 + class PoParser < Racc::Parser
  19 +
  20 + def _(x)
  21 + x
  22 + end
  23 +
  24 +module_eval <<'..end src/poparser.ry modeval..id7a99570e05', 'src/poparser.ry', 108
  25 + def unescape(orig)
  26 + ret = orig.gsub(/\\n/, "\n")
  27 + ret.gsub!(/\\t/, "\t")
  28 + ret.gsub!(/\\r/, "\r")
  29 + ret.gsub!(/\\"/, "\"")
  30 + ret
  31 + end
  32 +
  33 + def parse(str, data, ignore_fuzzy = true)
  34 + @comments = []
  35 + @data = data
  36 + @fuzzy = false
  37 + @msgctxt = ""
  38 + $ignore_fuzzy = ignore_fuzzy
  39 +
  40 + str.strip!
  41 + @q = []
  42 + until str.empty? do
  43 + case str
  44 + when /\A\s+/
  45 + str = $'
  46 + when /\Amsgctxt/
  47 + @q.push [:MSGCTXT, $&]
  48 + str = $'
  49 + when /\Amsgid_plural/
  50 + @q.push [:MSGID_PLURAL, $&]
  51 + str = $'
  52 + when /\Amsgid/
  53 + @q.push [:MSGID, $&]
  54 + str = $'
  55 + when /\Amsgstr/
  56 + @q.push [:MSGSTR, $&]
  57 + str = $'
  58 + when /\A\[(\d+)\]/
  59 + @q.push [:PLURAL_NUM, $1]
  60 + str = $'
  61 + when /\A\#~(.*)/
  62 + $stderr.print _("Warning: obsolete msgid exists.\n")
  63 + $stderr.print " #{$&}\n"
  64 + @q.push [:COMMENT, $&]
  65 + str = $'
  66 + when /\A\#(.*)/
  67 + @q.push [:COMMENT, $&]
  68 + str = $'
  69 + when /\A\"(.*)\"/
  70 + @q.push [:STRING, $1]
  71 + str = $'
  72 + else
  73 + #c = str[0,1]
  74 + #@q.push [:STRING, c]
  75 + str = str[1..-1]
  76 + end
  77 + end
  78 + @q.push [false, '$end']
  79 + if $DEBUG
  80 + @q.each do |a,b|
  81 + puts "[#{a}, #{b}]"
  82 + end
  83 + end
  84 + @yydebug = true if $DEBUG
  85 + do_parse
  86 +
  87 + if @comments.size > 0
  88 + @data.set_comment(:last, @comments.join("\n"))
  89 + end
  90 + @data
  91 + end
  92 +
  93 + def next_token
  94 + @q.shift
  95 + end
  96 +
  97 + def on_message(msgid, msgstr)
  98 + if msgstr.size > 0
  99 + @data[msgid] = msgstr
  100 + @data.set_comment(msgid, @comments.join("\n"))
  101 + end
  102 + @comments.clear
  103 + @msgctxt = ""
  104 + end
  105 +
  106 + def on_comment(comment)
  107 + @fuzzy = true if (/fuzzy/ =~ comment)
  108 + @comments << comment
  109 + end
  110 +
  111 +
  112 +..end src/poparser.ry modeval..id7a99570e05
  113 +
  114 +##### racc 1.4.5 generates ###
  115 +
  116 +racc_reduce_table = [
  117 + 0, 0, :racc_error,
  118 + 0, 10, :_reduce_none,
  119 + 2, 10, :_reduce_none,
  120 + 2, 10, :_reduce_none,
  121 + 2, 10, :_reduce_none,
  122 + 2, 12, :_reduce_5,
  123 + 1, 13, :_reduce_none,
  124 + 1, 13, :_reduce_none,
  125 + 4, 15, :_reduce_8,
  126 + 5, 16, :_reduce_9,
  127 + 2, 17, :_reduce_10,
  128 + 1, 17, :_reduce_none,
  129 + 3, 18, :_reduce_12,
  130 + 1, 11, :_reduce_13,
  131 + 2, 14, :_reduce_14,
  132 + 1, 14, :_reduce_15 ]
  133 +
  134 +racc_reduce_n = 16
  135 +
  136 +racc_shift_n = 26
  137 +
  138 +racc_action_table = [
  139 + 3, 13, 5, 7, 9, 15, 16, 17, 20, 17,
  140 + 13, 17, 13, 13, 11, 17, 23, 20, 13, 17 ]
  141 +
  142 +racc_action_check = [
  143 + 1, 16, 1, 1, 1, 12, 12, 12, 18, 18,
  144 + 7, 14, 15, 9, 3, 19, 20, 21, 23, 25 ]
  145 +
  146 +racc_action_pointer = [
  147 + nil, 0, nil, 14, nil, nil, nil, 3, nil, 6,
  148 + nil, nil, 0, nil, 4, 5, -6, nil, 2, 8,
  149 + 8, 11, nil, 11, nil, 12 ]
  150 +
  151 +racc_action_default = [
  152 + -1, -16, -2, -16, -3, -13, -4, -16, -6, -16,
  153 + -7, 26, -16, -15, -5, -16, -16, -14, -16, -8,
  154 + -16, -9, -11, -16, -10, -12 ]
  155 +
  156 +racc_goto_table = [
  157 + 12, 22, 14, 4, 24, 6, 2, 8, 18, 19,
  158 + 10, 21, 1, nil, nil, nil, 25 ]
  159 +
  160 +racc_goto_check = [
  161 + 5, 9, 5, 3, 9, 4, 2, 6, 5, 5,
  162 + 7, 8, 1, nil, nil, nil, 5 ]
  163 +
  164 +racc_goto_pointer = [
  165 + nil, 12, 5, 2, 4, -7, 6, 9, -7, -17 ]
  166 +
  167 +racc_goto_default = [
  168 + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil ]
  169 +
  170 +racc_token_table = {
  171 + false => 0,
  172 + Object.new => 1,
  173 + :COMMENT => 2,
  174 + :MSGID => 3,
  175 + :MSGCTXT => 4,
  176 + :MSGID_PLURAL => 5,
  177 + :MSGSTR => 6,
  178 + :STRING => 7,
  179 + :PLURAL_NUM => 8 }
  180 +
  181 +racc_use_result_var = true
  182 +
  183 +racc_nt_base = 9
  184 +
  185 +Racc_arg = [
  186 + racc_action_table,
  187 + racc_action_check,
  188 + racc_action_default,
  189 + racc_action_pointer,
  190 + racc_goto_table,
  191 + racc_goto_check,
  192 + racc_goto_default,
  193 + racc_goto_pointer,
  194 + racc_nt_base,
  195 + racc_reduce_table,
  196 + racc_token_table,
  197 + racc_shift_n,
  198 + racc_reduce_n,
  199 + racc_use_result_var ]
  200 +
  201 +Racc_token_to_s_table = [
  202 +'$end',
  203 +'error',
  204 +'COMMENT',
  205 +'MSGID',
  206 +'MSGCTXT',
  207 +'MSGID_PLURAL',
  208 +'MSGSTR',
  209 +'STRING',
  210 +'PLURAL_NUM',
  211 +'$start',
  212 +'msgfmt',
  213 +'comment',
  214 +'msgctxt',
  215 +'message',
  216 +'string_list',
  217 +'single_message',
  218 +'plural_message',
  219 +'msgstr_plural',
  220 +'msgstr_plural_line']
  221 +
  222 +Racc_debug_parser = true
  223 +
  224 +##### racc system variables end #####
  225 +
  226 + # reduce 0 omitted
  227 +
  228 + # reduce 1 omitted
  229 +
  230 + # reduce 2 omitted
  231 +
  232 + # reduce 3 omitted
  233 +
  234 + # reduce 4 omitted
  235 +
  236 +module_eval <<'.,.,', 'src/poparser.ry', 25
  237 + def _reduce_5( val, _values, result )
  238 + @msgctxt = unescape(val[1]) + "\004"
  239 + result
  240 + end
  241 +.,.,
  242 +
  243 + # reduce 6 omitted
  244 +
  245 + # reduce 7 omitted
  246 +
  247 +module_eval <<'.,.,', 'src/poparser.ry', 48
  248 + def _reduce_8( val, _values, result )
  249 + if @fuzzy and $ignore_fuzzy
  250 + if val[1] != ""
  251 + $stderr.print _("Warning: fuzzy message was ignored.\n")
  252 + $stderr.print " msgid '#{val[1]}'\n"
  253 + else
  254 + on_message('', unescape(val[3]))
  255 + end
  256 + @fuzzy = false
  257 + else
  258 + on_message(@msgctxt + unescape(val[1]), unescape(val[3]))
  259 + end
  260 + result = ""
  261 + result
  262 + end
  263 +.,.,
  264 +
  265 +module_eval <<'.,.,', 'src/poparser.ry', 65
  266 + def _reduce_9( val, _values, result )
  267 + if @fuzzy and $ignore_fuzzy
  268 + if val[1] != ""
  269 + $stderr.print _("Warning: fuzzy message was ignored.\n")
  270 + $stderr.print "msgid = '#{val[1]}\n"
  271 + else
  272 + on_message('', unescape(val[3]))
  273 + end
  274 + @fuzzy = false
  275 + else
  276 + on_message(@msgctxt + unescape(val[1]) + "\000" + unescape(val[3]), unescape(val[4]))
  277 + end
  278 + result = ""
  279 + result
  280 + end
  281 +.,.,
  282 +
  283 +module_eval <<'.,.,', 'src/poparser.ry', 76
  284 + def _reduce_10( val, _values, result )
  285 + if val[0].size > 0
  286 + result = val[0] + "\000" + val[1]
  287 + else
  288 + result = ""
  289 + end
  290 + result
  291 + end
  292 +.,.,
  293 +
  294 + # reduce 11 omitted
  295 +
  296 +module_eval <<'.,.,', 'src/poparser.ry', 84
  297 + def _reduce_12( val, _values, result )
  298 + result = val[2]
  299 + result
  300 + end
  301 +.,.,
  302 +
  303 +module_eval <<'.,.,', 'src/poparser.ry', 91
  304 + def _reduce_13( val, _values, result )
  305 + on_comment(val[0])
  306 + result
  307 + end
  308 +.,.,
  309 +
  310 +module_eval <<'.,.,', 'src/poparser.ry', 99
  311 + def _reduce_14( val, _values, result )
  312 + result = val.delete_if{|item| item == ""}.join
  313 + result
  314 + end
  315 +.,.,
  316 +
  317 +module_eval <<'.,.,', 'src/poparser.ry', 103
  318 + def _reduce_15( val, _values, result )
  319 + result = val[0]
  320 + result
  321 + end
  322 +.,.,
  323 +
  324 + def _reduce_none( val, _values, result )
  325 + result
  326 + end
  327 +
  328 + end # class PoParser
  329 +
  330 +end # module GetText
  331 +end
0 332 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/lib/fast_gettext/vendor/string.rb 0 → 100644
... ... @@ -0,0 +1,74 @@
  1 +#! /usr/bin/ruby
  2 +=begin
  3 + string.rb - Extension for String.
  4 +
  5 + Copyright (C) 2005,2006 Masao Mutoh
  6 +
  7 + You may redistribute it and/or modify it under the same
  8 + license terms as Ruby.
  9 +=end
  10 +
  11 +# Extension for String class. This feature is included in Ruby 1.9 or later.
  12 +begin
  13 + raise unless ("a %{x}" % {:x=>'b'}) == 'a b'
  14 +rescue ArgumentError
  15 + class String
  16 + alias :_fast_gettext_old_format_m :% # :nodoc:
  17 +
  18 + PERCENT_MATCH_RE = Regexp.union(
  19 + /%%/,
  20 + /%\{([-\.\w]+)\}/,
  21 + /%<([-\.\w]+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/
  22 + )
  23 +
  24 + # call-seq:
  25 + # %(hash)
  26 + #
  27 + # Default: "%s, %s" % ["Masao", "Mutoh"]
  28 + # Extended:
  29 + # "%{firstname}, %{lastname}" % {:firstname=>"Masao",:lastname=>"Mutoh"} == "Masao Mutoh"
  30 + # with field type such as d(decimal), f(float), ...
  31 + # "%<age>d, %<weight>.1f" % {:age => 10, :weight => 43.4} == "10 43.4"
  32 + # This is the recommanded way for Ruby-GetText
  33 + # because the translators can understand the meanings of the keys easily.
  34 + def %(args)
  35 + if args.kind_of? Hash
  36 + #stringify keys
  37 + replace = {}
  38 + args.each{|k,v|replace[k.to_s]=v}
  39 +
  40 + #replace occurances
  41 + ret = dup
  42 + ret.gsub!(PERCENT_MATCH_RE) do |match|
  43 + if match == '%%'
  44 + '%'
  45 + elsif $1
  46 + replace.has_key?($1) ? replace[$1] : match
  47 + elsif $2
  48 + replace.has_key?($2) ? sprintf("%#{$3}", replace[$2]) : match
  49 + end
  50 + end
  51 + ret
  52 + else
  53 + ret = gsub(/%([{<])/, '%%\1')
  54 + ret._fast_gettext_old_format_m(args)
  55 + end
  56 + end
  57 + end
  58 +end
  59 +
  60 +# 1.9.1 if you misspell a %{key} your whole page would blow up, no thanks...
  61 +begin
  62 + ("%{b}" % {:a=>'b'})
  63 +rescue KeyError
  64 + class String
  65 + alias :_fast_gettext_old_format_m :%
  66 + def %(*args)
  67 + begin
  68 + _fast_gettext_old_format_m(*args)
  69 + rescue KeyError
  70 + self
  71 + end
  72 + end
  73 + end
  74 +end
0 75 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/aa_unconfigued_spec.rb 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +require File.join(File.dirname(__FILE__),'spec_helper')
  2 +
  3 +describe 'unconfigured' do
  4 + it "gives a useful error message when trying to just translate" do
  5 + FastGettext.text_domain = nil
  6 + begin
  7 + FastGettext._('x')
  8 + "".should == "success!?"
  9 + rescue FastGettext::Storage::NoTextDomainConfigured
  10 + end
  11 + end
  12 +
  13 + it "gives a useful error message when only locale was set" do
  14 + FastGettext.locale = 'de'
  15 + begin
  16 + FastGettext._('x')
  17 + "".should == "success!?"
  18 + rescue FastGettext::Storage::NoTextDomainConfigured
  19 + end
  20 + end
  21 +end
0 22 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/mo_file_spec.rb 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','spec_helper')
  3 +
  4 +de_file = File.join(current_folder,'..','locale','de','LC_MESSAGES','test.mo')
  5 +de = FastGettext::MoFile.new(de_file)
  6 +
  7 +describe FastGettext::MoFile do
  8 + before :all do
  9 + File.exist?(de_file).should == true
  10 + end
  11 +
  12 + it "parses a file" do
  13 + de['car'].should == 'Auto'
  14 + end
  15 +
  16 + it "stores untranslated values as nil" do
  17 + de['Car|Model'].should == nil
  18 + end
  19 +
  20 + it "finds pluralized values" do
  21 + de.plural('Axis','Axis').should == ['Achse','Achsen']
  22 + end
  23 +
  24 + it "returns singular translations when pluralisation could not be found" do
  25 + de.plural('Axis','Axis','Axis').should == ['Achse','Achse','Achse']
  26 + end
  27 +
  28 + it "returns ids when not plural and singular translations could not be found" do
  29 + de.plural('Axis','Axis','NOTFOUND').should == ['Achse','Achse','NOTFOUND']
  30 + end
  31 +
  32 + it "can access plurals through []" do
  33 + de['Axis'].should == 'Achse' #singular
  34 + end
  35 +end
0 36 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/storage_spec.rb 0 → 100644
... ... @@ -0,0 +1,309 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','spec_helper')
  3 +
  4 +describe 'Storage' do
  5 + include FastGettext::Storage
  6 +
  7 + before do
  8 + #reset everything to nil
  9 + self.available_locales = nil
  10 + self.default_text_domain = nil
  11 + self.default_locale = nil
  12 + send(:_locale=,nil)#nil is not allowed to be set...
  13 + default_locale.should be_nil
  14 + available_locales.should be_nil
  15 + locale.should == 'en'
  16 + end
  17 +
  18 + def thread_save(method, value)
  19 + send("#{method}=",value)
  20 +
  21 + # mess around with other threads
  22 + 100.times do
  23 + Thread.new {FastGettext.send("#{method}=",'en')}
  24 + end
  25 +
  26 + send(method) == value
  27 + end
  28 +
  29 + {:locale=>'de', :available_locales=>['de'], :text_domain=>'xx', :pluralisation_rule=>lambda{|x|x==4}}.each do |method, value|
  30 + it "stores #{method} thread-save" do
  31 + thread_save(method, value).should == true
  32 + end
  33 + end
  34 +
  35 + it "stores translation_repositories non-thread-safe" do
  36 + self.translation_repositories[:x]=1
  37 + t = Thread.new{self.translation_repositories[:x]=2}
  38 + t.join
  39 + self.translation_repositories[:x].should == 2
  40 + end
  41 +
  42 + describe :pluralisation_rule do
  43 + it "defaults to singular-if-1 when it is not set" do
  44 + stub!(:current_repository).and_return mock('',:pluralisation_rule=>nil)
  45 + self.pluralisation_rule = nil
  46 + pluralisation_rule.call(1).should == false
  47 + pluralisation_rule.call(0).should == true
  48 + pluralisation_rule.call(2).should == true
  49 + end
  50 + end
  51 +
  52 + describe :default_locale do
  53 + it "stores default_locale non-thread-safe" do
  54 + thread_save(:default_locale, 'de').should == false
  55 + end
  56 +
  57 + it "does not overwrite locale" do
  58 + self.locale = 'de'
  59 + self.default_locale = 'yy'
  60 + self.locale.should == 'de'
  61 + end
  62 +
  63 + it "falls back to default if locale is missing" do
  64 + self.default_locale = 'yy'
  65 + self.locale.should == 'yy'
  66 + end
  67 +
  68 + it "does not set non-available-locales as default" do
  69 + self.available_locales = ['xx']
  70 + self.default_locale = 'yy'
  71 + self.default_locale.should == nil
  72 + end
  73 +
  74 + it "can set default_locale to nil" do
  75 + self.default_locale = 'xx'
  76 + self.default_locale = nil
  77 + default_locale.should be_nil
  78 + end
  79 + end
  80 +
  81 + describe :default_text_domain do
  82 + it "stores default_text_domain non-thread-safe" do
  83 + thread_save(:default_text_domain, 'xx').should == false
  84 + end
  85 +
  86 + it "uses default_text_domain when text_domain is not set" do
  87 + self.text_domain = nil
  88 + self.default_text_domain = 'x'
  89 + text_domain.should == 'x'
  90 + end
  91 +
  92 + it "does not use default when domain is set" do
  93 + self.text_domain = 'x'
  94 + self.default_text_domain = 'y'
  95 + text_domain.should == 'x'
  96 + end
  97 + end
  98 +
  99 + describe :default_available_locales do
  100 + after do
  101 + self.default_available_locales = nil
  102 + end
  103 +
  104 + it "stores default_available_locales non-thread-safe" do
  105 + thread_save(:default_available_locales, 'xx').should == false
  106 + end
  107 +
  108 + it "uses default_available_locales when available_locales is not set" do
  109 + self.available_locales = nil
  110 + self.default_available_locales = 'x'
  111 + available_locales.should == 'x'
  112 + end
  113 +
  114 + it "does not use default when available_locales is set" do
  115 + self.available_locales = 'x'
  116 + self.default_available_locales = 'y'
  117 + available_locales.should == 'x'
  118 + end
  119 + end
  120 +
  121 + describe :locale do
  122 + it "stores everything as long as available_locales is not set" do
  123 + self.available_locales = nil
  124 + self.locale = 'XXX'
  125 + locale.should == 'XXX'
  126 + end
  127 +
  128 + it "is en if no locale and no available_locale were set" do
  129 + FastGettext.send(:_locale=,nil)
  130 + self.available_locales = nil
  131 + locale.should == 'en'
  132 + end
  133 +
  134 + it "does not change the locale if locales was called with nil" do
  135 + self.locale = nil
  136 + locale.should == 'en'
  137 + end
  138 +
  139 + it "is the first available_locale if one was set" do
  140 + self.available_locales = ['de']
  141 + locale.should == 'de'
  142 + end
  143 +
  144 + it "does not store a locale if it is not available" do
  145 + self.available_locales = ['de']
  146 + self.locale = 'en'
  147 + locale.should == 'de'
  148 + end
  149 +
  150 + it "set_locale returns the old locale if the new could not be set" do
  151 + self.locale = 'de'
  152 + self.available_locales = ['de']
  153 + self.set_locale('en').should == 'de'
  154 + end
  155 +
  156 + {
  157 + 'Opera' => "de-DE,de;q=0.9,en;q=0.8",
  158 + 'Firefox' => "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3",
  159 + }.each do |browser,accept_language|
  160 + it "sets the locale from #{browser} headers" do
  161 + FastGettext.available_locales = ['de_DE','de','xx']
  162 + FastGettext.locale = 'xx'
  163 + FastGettext.locale = accept_language
  164 + FastGettext.locale.should == 'de_DE'
  165 + end
  166 + end
  167 +
  168 + it "sets a unimportant locale if it is the only available" do
  169 + FastGettext.available_locales = ['en','xx']
  170 + FastGettext.locale = "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3"
  171 + FastGettext.locale.should == 'en'
  172 + end
  173 +
  174 + it "sets the locale with the highest wheight" do
  175 + FastGettext.available_locales = ['en','de']
  176 + FastGettext.locale = "xx-us;q=0.5,de-de,de;q=0.8,en;q=0.9"
  177 + FastGettext.locale.should == 'en'
  178 + end
  179 +
  180 + it "sets the locale from languages" do
  181 + FastGettext.available_locales = ['de']
  182 + FastGettext.locale = "xx-us;q=0.5,de-de;q=0.8,en-uk;q=0.9"
  183 + FastGettext.locale.should == 'de'
  184 + end
  185 +
  186 + it "sets locale from comma seperated" do
  187 + FastGettext.available_locales = ['de_DE','en','xx']
  188 + FastGettext.locale = "de,de-de,en"
  189 + FastGettext.locale.should == 'de_DE'
  190 + end
  191 + end
  192 +
  193 + describe :silence_errors do
  194 + before do
  195 + FastGettext.text_domain = 'xxx'
  196 + end
  197 +
  198 + it "raises when a textdomain was empty" do
  199 + begin
  200 + FastGettext._('x')
  201 + "".should == "success!?"
  202 + rescue FastGettext::Storage::NoTextDomainConfigured
  203 + end
  204 + end
  205 +
  206 + it "can silence erros" do
  207 + FastGettext.silence_errors
  208 + FastGettext._('x').should == 'x'
  209 + end
  210 + end
  211 +
  212 + describe :current_cache do
  213 + before do
  214 + FastGettext.text_domain = 'xxx'
  215 + FastGettext.available_locales = ['de','en']
  216 + FastGettext.locale = 'de'
  217 + FastGettext.current_repository.stub!(:"[]").with('abc').and_return 'old'
  218 + FastGettext.current_repository.stub!(:"[]").with('unfound').and_return nil
  219 + FastGettext._('abc')
  220 + FastGettext._('unfound')
  221 + FastGettext.locale = 'en'
  222 + end
  223 +
  224 + it "stores a translation seperate by locale" do
  225 + FastGettext.current_cache['abc'].should == nil
  226 + end
  227 +
  228 + it "stores a translation seperate by domain" do
  229 + FastGettext.locale = 'de'
  230 + FastGettext.text_domain = nil
  231 + FastGettext.current_cache['abc'].should == nil
  232 + end
  233 +
  234 + it "cache is restored through setting of default_text_domain" do
  235 + FastGettext.locale = 'de'
  236 + FastGettext.text_domain = nil
  237 + FastGettext.default_text_domain = 'xxx'
  238 + FastGettext.current_cache['abc'].should == 'old'
  239 + end
  240 +
  241 + it "cache is restored through setting of default_locale" do
  242 + FastGettext.send(:_locale=,nil)#reset locale to nil
  243 + FastGettext.default_locale = 'de'
  244 + FastGettext.locale.should == 'de'
  245 + FastGettext.current_cache['abc'].should == 'old'
  246 + end
  247 +
  248 + it "stores a translation permanently" do
  249 + FastGettext.locale = 'de'
  250 + FastGettext.current_cache['abc'].should == 'old'
  251 + end
  252 +
  253 + it "stores a unfound translation permanently" do
  254 + FastGettext.locale = 'de'
  255 + FastGettext.current_cache['unfound'].should == false
  256 + end
  257 + end
  258 +
  259 + describe :key_exist? do
  260 + it "does not find default keys" do
  261 + FastGettext._('abcde')
  262 + key_exist?('abcde').should be_false
  263 + end
  264 +
  265 + it "finds using the current repository" do
  266 + should_receive(:current_repository).and_return '1234'=>'1'
  267 + key_exist?('1234').should == true
  268 + end
  269 +
  270 + it "sets the current cache with a found result" do
  271 + should_receive(:current_repository).and_return 'xxx'=>'1'
  272 + key_exist?('xxx')
  273 + current_cache['xxx'].should == '1'
  274 + end
  275 +
  276 + it "does not overwrite an existing cache value" do
  277 + current_cache['xxx']='xxx'
  278 + stub!(:current_repository).and_return 'xxx'=>'1'
  279 + key_exist?('xxx')
  280 + current_cache['xxx'].should == 'xxx'
  281 + end
  282 +
  283 + it "is false for gettext meta key" do
  284 + key_exist?("").should == false
  285 + end
  286 + end
  287 +
  288 + describe :cached_find do
  289 + it "is nil for gettext meta key" do
  290 + cached_find("").should == false
  291 + end
  292 + end
  293 +
  294 + describe FastGettext::Storage::NoTextDomainConfigured do
  295 + it "shows what to do" do
  296 + FastGettext::Storage::NoTextDomainConfigured.new.to_s.should =~ /FastGettext\.add_text_domain/
  297 + end
  298 +
  299 + it "warns when text_domain is nil" do
  300 + FastGettext.text_domain = nil
  301 + FastGettext::Storage::NoTextDomainConfigured.new.to_s.should =~ /\(nil\)/
  302 + end
  303 +
  304 + it "shows current text_domain" do
  305 + FastGettext.text_domain = 'xxx'
  306 + FastGettext::Storage::NoTextDomainConfigured.new('xxx').to_s.should =~ /xxx/
  307 + end
  308 + end
  309 +end
0 310 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_repository/base_spec.rb 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','..','spec_helper')
  3 +require 'fast_gettext/translation_repository/base'
  4 +
  5 +describe 'FastGettext::TranslationRepository::Base' do
  6 + before do
  7 + @rep = FastGettext::TranslationRepository::Base.new('x')
  8 + end
  9 +
  10 + it "can be built" do
  11 + @rep.available_locales.should == []
  12 + end
  13 +
  14 + it "cannot translate" do
  15 + @rep['car'].should == nil
  16 + end
  17 +
  18 + it "cannot pluralize" do
  19 + @rep.plural('Axis','Axis').should == ['Axis','Axis']
  20 + end
  21 +end
0 22 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_repository/chain_spec.rb 0 → 100644
... ... @@ -0,0 +1,82 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','..','spec_helper')
  3 +
  4 +class MockRepo
  5 + def [](key)#should_receive :[] does not work so well...
  6 + singular key
  7 + end
  8 +end
  9 +
  10 +describe 'FastGettext::TranslationRepository::Chain' do
  11 + describe "empty chain" do
  12 + before do
  13 + @rep = FastGettext::TranslationRepository.build('chain', :chain=>[], :type=>:chain)
  14 + end
  15 +
  16 + it "has no locales" do
  17 + @rep.available_locales.should == []
  18 + end
  19 +
  20 + it "cannot translate" do
  21 + @rep['car'].should == nil
  22 + end
  23 +
  24 + it "cannot pluralize" do
  25 + @rep.plural('Axis','Axis').should == []
  26 + end
  27 +
  28 + it "has no pluralisation rule" do
  29 + @rep.pluralisation_rule.should == nil
  30 + end
  31 + end
  32 +
  33 + describe "filled chain" do
  34 + before do
  35 + @one = MockRepo.new
  36 + @one.stub!(:singular).with('xx').and_return 'one'
  37 + @two = MockRepo.new
  38 + @two.stub!(:singular).with('xx').and_return 'two'
  39 + @rep = FastGettext::TranslationRepository.build('chain', :chain=>[@one, @two], :type=>:chain)
  40 + end
  41 +
  42 + describe :singular do
  43 + it "uses the first repo in the chain if it responds" do
  44 + @rep['xx'].should == 'one'
  45 + end
  46 +
  47 + it "uses the second repo in the chain if the first does not respond" do
  48 + @one.should_receive(:singular).and_return nil
  49 + @rep['xx'].should == 'two'
  50 + end
  51 + end
  52 +
  53 + describe :plural do
  54 + it "uses the first repo in the chain if it responds" do
  55 + @one.should_receive(:plural).with('a','b').and_return ['A','B']
  56 + @rep.plural('a','b').should == ['A','B']
  57 + end
  58 +
  59 + it "uses the second repo in the chain if the first does not respond" do
  60 + @one.should_receive(:plural).with('a','b').and_return [nil,nil]
  61 + @two.should_receive(:plural).with('a','b').and_return ['A','B']
  62 + @rep.plural('a','b').should == ['A','B']
  63 + end
  64 + end
  65 +
  66 + describe :available_locales do
  67 + it "should be the sum of all added repositories" do
  68 + @one.should_receive(:available_locales).and_return ['de']
  69 + @two.should_receive(:available_locales).and_return ['de','en']
  70 + @rep.available_locales.should == ['de','en']
  71 + end
  72 + end
  73 +
  74 + describe :pluralisation_rule do
  75 + it "chooses the first that exists" do
  76 + @one.should_receive(:pluralisation_rule).and_return nil
  77 + @two.should_receive(:pluralisation_rule).and_return 'x'
  78 + @rep.pluralisation_rule.should == 'x'
  79 + end
  80 + end
  81 + end
  82 +end
0 83 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_repository/db_spec.rb 0 → 100644
... ... @@ -0,0 +1,72 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','..','spec_helper')
  3 +
  4 +require 'active_record'
  5 +require 'fast_gettext/translation_repository/db'
  6 +
  7 +include FastGettext::TranslationRepository::Db.require_models
  8 +describe FastGettext::TranslationRepository::Db do
  9 +
  10 + before :all do
  11 + ActiveRecord::Base.establish_connection({
  12 + :adapter => "sqlite3",
  13 + :database => ":memory:"
  14 + })
  15 +
  16 + #create model table
  17 + #TODO surpress output ?
  18 + ActiveRecord::Schema.define(:version => 1) do
  19 + create_table :translation_keys do |t|
  20 + t.string :key, :unique=>true, :null=>false
  21 + t.timestamps
  22 + end
  23 + create_table :translation_texts do |t|
  24 + t.string :text, :locale
  25 + t.integer :translation_key_id, :null=>false
  26 + t.timestamps
  27 + end
  28 + end
  29 + end
  30 +
  31 + before do
  32 + TranslationKey.delete_all
  33 + TranslationText.delete_all
  34 + FastGettext.locale = 'de'
  35 + @rep = FastGettext::TranslationRepository::Db.new('x', :model=>TranslationKey)
  36 + end
  37 +
  38 + def create_translation(key, text)
  39 + translation_key = TranslationKey.create!(:key=>key)
  40 + TranslationText.create!(:translation_key_id=>translation_key.id, :text=>text, :locale=>'de')
  41 + end
  42 +
  43 + it "reads locales from the db" do
  44 + locales = ['de','en','es']
  45 + locales.reverse.each do |locale|
  46 + TranslationText.create!(:translation_key_id=>1, :text=>'asdasd', :locale=>locale)
  47 + end
  48 + @rep.available_locales.should == locales
  49 + end
  50 +
  51 + it "has no pluralisation_rule by default" do
  52 + @rep.pluralisation_rule.should == nil
  53 + end
  54 +
  55 + it "cannot translate when no models are present" do
  56 + @rep['car'].should == nil
  57 + end
  58 +
  59 + it "can translate" do
  60 + create_translation 'car', 'Auto'
  61 + @rep['car'].should == 'Auto'
  62 + end
  63 +
  64 + it "cannot pluralize when no model is present" do
  65 + @rep.plural('Axis','Axis').should == []
  66 + end
  67 +
  68 + it "can pluralize" do
  69 + create_translation 'Axis||||Axis', 'Achse||||Achsen'
  70 + @rep.plural('Axis','Axis').should == ['Achse','Achsen']
  71 + end
  72 +end
0 73 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_repository/logger_spec.rb 0 → 100644
... ... @@ -0,0 +1,41 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','..','spec_helper')
  3 +
  4 +describe 'FastGettext::TranslationRepository::Logger' do
  5 + before do
  6 + @callback = lambda{}
  7 + @rep = FastGettext::TranslationRepository.build('test', :type=>:logger, :callback=>@callback)
  8 + @rep.is_a?(FastGettext::TranslationRepository::Logger).should be_true
  9 + end
  10 + subject{@rep}
  11 +
  12 + it{ should have(0).available_locales}
  13 +
  14 + it "has no pluralisation_rule" do
  15 + @rep.pluralisation_rule.should == nil
  16 + end
  17 +
  18 + describe :single do
  19 + it "logs every call" do
  20 + @callback.should_receive(:call).with('the_key')
  21 + @rep['the_key']
  22 + end
  23 +
  24 + it "returns nil" do
  25 + @callback.should_receive(:call).with('the_key').and_return 'something'
  26 + @rep['the_key'].should == nil
  27 + end
  28 + end
  29 +
  30 + describe :plural do
  31 + it "logs every call" do
  32 + @callback.should_receive(:call).with(['a','b'])
  33 + @rep.plural('a','b')
  34 + end
  35 +
  36 + it "returns an empty array" do
  37 + @callback.should_receive(:call).with(['a','b']).and_return 'something'
  38 + @rep.plural('a','b').should == []
  39 + end
  40 + end
  41 +end
0 42 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_repository/mo_spec.rb 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','..','spec_helper')
  3 +
  4 +
  5 +describe 'FastGettext::TranslationRepository::Mo' do
  6 + before do
  7 + @rep = FastGettext::TranslationRepository.build('test',:path=>File.join(current_folder,'..','..','locale'))
  8 + @rep.is_a?(FastGettext::TranslationRepository::Mo).should be_true
  9 + end
  10 +
  11 + it "can be built" do
  12 + @rep.available_locales.sort.should == ['de','en']
  13 + end
  14 +
  15 + it "can translate" do
  16 + FastGettext.locale = 'de'
  17 + @rep['car'].should == 'Auto'
  18 + end
  19 +
  20 + it "can pluralize" do
  21 + FastGettext.locale = 'de'
  22 + @rep.plural('Axis','Axis').should == ['Achse','Achsen']
  23 + end
  24 +
  25 + it "has access to the mo repositories pluralisation rule" do
  26 + FastGettext.locale = 'en'
  27 + rep = FastGettext::TranslationRepository.build('plural_test',:path=>File.join(current_folder,'..','..','locale'))
  28 + rep['car'].should == 'Test'#just check it is loaded correctly
  29 + rep.pluralisation_rule.call(2).should == 3
  30 + end
  31 +end
0 32 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_repository/po_spec.rb 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','..','spec_helper')
  3 +
  4 +
  5 +describe 'FastGettext::TranslationRepository::Po' do
  6 + before do
  7 + @rep = FastGettext::TranslationRepository.build('test',:path=>File.join(current_folder,'..','..','locale'),:type=>:po)
  8 + @rep.is_a?(FastGettext::TranslationRepository::Po).should be_true
  9 + end
  10 +
  11 + it "can be built" do
  12 + @rep.available_locales.sort.should == ['de','en']
  13 + end
  14 +
  15 + it "can translate" do
  16 + FastGettext.locale = 'de'
  17 + @rep['car'].should == 'Auto'
  18 + end
  19 +
  20 + it "can pluralize" do
  21 + FastGettext.locale = 'de'
  22 + @rep.plural('Axis','Axis').should == ['Achse','Achsen']
  23 + end
  24 +
  25 + it "has access to the mo repositories pluralisation rule" do
  26 + FastGettext.locale = 'en'
  27 + rep = FastGettext::TranslationRepository.build('plural_test',:path=>File.join(current_folder,'..','..','locale'),:type=>:po)
  28 + rep['car'].should == 'Test'#just check it is loaded correctly
  29 + rep.pluralisation_rule.call(2).should == 3
  30 + end
  31 +end
0 32 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_repository/yaml_spec.rb 0 → 100644
... ... @@ -0,0 +1,61 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','..','spec_helper')
  3 +
  4 +describe 'FastGettext::TranslationRepository::Yaml' do
  5 + before do
  6 + @rep = FastGettext::TranslationRepository.build('test', :path => File.join(current_folder,'..', '..', 'locale', 'yaml'), :type => :yaml)
  7 + @rep.is_a?(FastGettext::TranslationRepository::Yaml).should be_true
  8 + FastGettext.locale = 'de'
  9 + end
  10 +
  11 + it "can be built" do
  12 + @rep.available_locales.sort.should == ['de', 'en']
  13 + end
  14 +
  15 + it "translates nothing when locale is unsupported" do
  16 + FastGettext.locale = 'xx'
  17 + @rep['simple'].should == nil
  18 + end
  19 +
  20 + it "does not translated categories" do
  21 + @rep['cars'].should == nil
  22 + end
  23 +
  24 + it "can translate simple" do
  25 + @rep['simple'].should == 'einfach'
  26 + end
  27 +
  28 + it "can translate nested" do
  29 + @rep['cars.car'].should == 'Auto'
  30 + end
  31 +
  32 + it "can pluralize" do
  33 + @rep.plural('cars.axis').should == ['Achse', 'Achsen', nil, nil]
  34 + end
  35 +
  36 + it "handles unfound plurals with nil" do
  37 + @rep.plural('cars.xxx').should == [nil, nil, nil, nil]
  38 + end
  39 +
  40 + it "can be used to translate plural forms" do
  41 + FastGettext.stub!(:current_repository).and_return @rep
  42 + FastGettext.n_('cars.axis','cars.axis',2).should == 'Achsen'
  43 + FastGettext.n_('cars.axis',2).should == 'Achsen'
  44 + FastGettext.n_('cars.axis',1).should == 'Achse'
  45 + end
  46 +
  47 + it "can be used to do wanky pluralisation rules" do
  48 + FastGettext.stub!(:current_repository).and_return @rep
  49 + 4.times do |i|
  50 + @rep.stub!(:pluralisation_rule).and_return lambda{i}
  51 + FastGettext.n_('cars.silly',1).should == i.to_s
  52 + end
  53 + end
  54 +
  55 + it "can use custom pluraliztion rules" do
  56 + FastGettext.locale = 'en'
  57 + {0 => 0, 1 => 1, 2 => 2, 3 => 0}.each do |input, expected|
  58 + @rep.pluralisation_rule.call(input).should == expected
  59 + end
  60 + end
  61 +end
0 62 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_repository_spec.rb 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','spec_helper')
  3 +
  4 +module FastGettext
  5 + module TranslationRepository
  6 + class Dummy
  7 + attr_accessor :name, :options
  8 + def initialize(name, options)
  9 + @name = name
  10 + @options = options
  11 + end
  12 + end
  13 + end
  14 +end
  15 +
  16 +describe FastGettext::TranslationRepository do
  17 + describe "build" do
  18 + it "auto requires class by default" do
  19 + lambda { FastGettext::TranslationRepository.build('xx', { :type => 'invalid'}) }.should raise_error(LoadError)
  20 + end
  21 +
  22 + it "can have auto-require disabled" do
  23 + FastGettext::TranslationRepository.build('xx', { :type => 'dummy' })
  24 + end
  25 +
  26 + it "makes a new repository" do
  27 + options = { :type => 'dummy', :external => true }
  28 + repo = FastGettext::TranslationRepository.build('xx', options)
  29 + repo.class.should == FastGettext::TranslationRepository::Dummy
  30 + repo.name.should == 'xx'
  31 + repo.options.should == options
  32 + end
  33 + end
  34 +end
0 35 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext/translation_spec.rb 0 → 100644
... ... @@ -0,0 +1,152 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','spec_helper')
  3 +
  4 +describe FastGettext::Translation do
  5 + include FastGettext::Translation
  6 +
  7 + before do
  8 + default_setup
  9 + end
  10 +
  11 + describe "unknown locale" do
  12 + before do
  13 + FastGettext.available_locales = nil
  14 + FastGettext.locale = 'xx'
  15 + end
  16 +
  17 + it "does not translate" do
  18 + _('car').should == 'car'
  19 + end
  20 +
  21 + it "does not translate plurals" do
  22 + n_('car','cars',2).should == 'cars'
  23 + end
  24 + end
  25 +
  26 + describe :_ do
  27 + it "translates simple text" do
  28 + _('car').should == 'Auto'
  29 + end
  30 +
  31 + it "returns key if not translation was found" do
  32 + _('NOT|FOUND').should == 'NOT|FOUND'
  33 + end
  34 +
  35 + it "does not return the gettext meta information" do
  36 + _('').should == ''
  37 + end
  38 + end
  39 +
  40 + describe :n_ do
  41 + before do
  42 + FastGettext.pluralisation_rule = nil
  43 + end
  44 +
  45 + it "translates pluralized" do
  46 + n_('Axis','Axis',1).should == 'Achse'
  47 + n_('Axis','Axis',2).should == 'Achsen'
  48 + n_('Axis','Axis',0).should == 'Achsen'
  49 + end
  50 +
  51 + describe "pluralisations rules" do
  52 + it "supports abstract pluralisation rules" do
  53 + FastGettext.pluralisation_rule = lambda{|n|2}
  54 + n_('a','b','c','d',4).should == 'c'
  55 + end
  56 +
  57 + it "supports false as singular" do
  58 + FastGettext.pluralisation_rule = lambda{|n|n!=2}
  59 + n_('singular','plural','c','d',2).should == 'singular'
  60 + end
  61 +
  62 + it "supports true as plural" do
  63 + FastGettext.pluralisation_rule = lambda{|n|n==2}
  64 + n_('singular','plural','c','d',2).should == 'plural'
  65 + end
  66 + end
  67 +
  68 + it "returns the appropriate key if no translation was found" do
  69 + n_('NOTFOUND','NOTFOUNDs',1).should == 'NOTFOUND'
  70 + n_('NOTFOUND','NOTFOUNDs',2).should == 'NOTFOUNDs'
  71 + end
  72 +
  73 + it "returns the last key when no translation was found and keys where to short" do
  74 + FastGettext.pluralisation_rule = lambda{|x|4}
  75 + n_('Apple','Apples',2).should == 'Apples'
  76 + end
  77 + end
  78 +
  79 + describe :s_ do
  80 + it "translates simple text" do
  81 + s_('car').should == 'Auto'
  82 + end
  83 +
  84 + it "returns cleaned key if a translation was not found" do
  85 + s_("XXX|not found").should == "not found"
  86 + end
  87 +
  88 + it "can use a custom seperator" do
  89 + s_("XXX/not found",'/').should == "not found"
  90 + end
  91 + end
  92 +
  93 + describe :N_ do
  94 + it "returns the key" do
  95 + N_('XXXXX').should == 'XXXXX'
  96 + end
  97 + end
  98 +
  99 + describe :Nn_ do
  100 + it "returns the keys as array" do
  101 + Nn_('X','Y').should == ['X','Y']
  102 + end
  103 + end
  104 +
  105 + describe :caching do
  106 + describe :cache_hit do
  107 + before do
  108 + FastGettext.translation_repositories.replace({})
  109 + #singular cache keys
  110 + FastGettext.current_cache['xxx'] = '1'
  111 +
  112 + #plural cache keys
  113 + FastGettext.current_cache['||||xxx'] = ['1','2']
  114 + FastGettext.current_cache['||||xxx||||yyy'] = ['1','2']
  115 + end
  116 +
  117 + it "uses the cache when translating with _" do
  118 + _('xxx').should == '1'
  119 + end
  120 +
  121 + it "uses the cache when translating with s_" do
  122 + s_('xxx').should == '1'
  123 + end
  124 +
  125 + it "uses the cache when translating with n_" do
  126 + n_('xxx','yyy',1).should == '1'
  127 + end
  128 +
  129 + it "uses the cache when translating with n_ and single argument" do
  130 + n_('xxx',1).should == '1'
  131 + end
  132 + end
  133 +
  134 + it "caches different locales seperatly" do
  135 + FastGettext.locale = 'en'
  136 + _('car').should == 'car'
  137 + FastGettext.locale = 'de'
  138 + _('car').should == 'Auto'
  139 + end
  140 +
  141 + it "caches different textdomains seperatly" do
  142 + _('car').should == 'Auto'
  143 +
  144 + FastGettext.translation_repositories['fake'] = {}
  145 + FastGettext.text_domain = 'fake'
  146 + _('car').should == 'car'
  147 +
  148 + FastGettext.text_domain = 'test'
  149 + _('car').should == 'Auto'
  150 + end
  151 + end
  152 +end
0 153 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/fast_gettext_spec.rb 0 → 100644
... ... @@ -0,0 +1,43 @@
  1 +require File.expand_path("spec_helper", File.dirname(__FILE__))
  2 +
  3 +default_setup
  4 +class IncludeTest
  5 + include FastGettext::Translation
  6 + @@xx = _('car')
  7 + def self.ext
  8 + _('car')
  9 + end
  10 + def inc
  11 + _('car')
  12 + end
  13 + def self.xx
  14 + @@xx
  15 + end
  16 +end
  17 +
  18 +describe FastGettext do
  19 + include FastGettext
  20 + before :all do
  21 + default_setup
  22 + end
  23 +
  24 + it "provides access to FastGettext::Translations methods" do
  25 + FastGettext._('car').should == 'Auto'
  26 + _('car').should == 'Auto'
  27 + s_("XXX|not found").should == "not found"
  28 + n_('Axis','Axis',1).should == 'Achse'
  29 + N_('XXXXX').should == 'XXXXX'
  30 + Nn_('X','Y').should == ['X','Y']
  31 + end
  32 +
  33 + it "is extended to a class and included into a class" do
  34 + IncludeTest.ext.should == 'Auto'
  35 + IncludeTest.ext.should == 'Auto'
  36 + IncludeTest.new.inc.should == 'Auto'
  37 + IncludeTest.xx.should == 'Auto'
  38 + end
  39 +
  40 + it "has a VERSION" do
  41 + FastGettext::VERSION.should =~ /^\d+\.\d+\.\d+$/
  42 + end
  43 +end
0 44 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/spec_helper.rb 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +# ---- requirements
  2 +require 'rubygems'
  3 +$LOAD_PATH.unshift File.expand_path("../lib", File.dirname(__FILE__))
  4 +require 'fast_gettext'
  5 +
  6 +# ---- revert to defaults
  7 +Spec::Runner.configure do |config|
  8 + config.before :all do
  9 + FastGettext.locale = 'de'
  10 + FastGettext.available_locales = nil
  11 + end
  12 +end
  13 +
  14 +# ---- Helpers
  15 +def pending_it(text,&block)
  16 + it text do
  17 + pending(&block)
  18 + end
  19 +end
  20 +
  21 +def default_setup
  22 + FastGettext.add_text_domain('test',:path=>File.join(File.dirname(__FILE__),'locale'))
  23 + FastGettext.text_domain = 'test'
  24 + FastGettext.available_locales = ['en','de']
  25 + FastGettext.locale = 'de'
  26 +end
0 27 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/vendor/fake_load_path/iconv.rb 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +#simulate file not found
  2 +raise LoadError
0 3 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/vendor/iconv_spec.rb 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +$LOAD_PATH.unshift File.expand_path("../../lib", current_folder)
  3 +
  4 +describe 'Iconv' do
  5 + it "also works when Iconv was not found locally" do
  6 + #prepare load path
  7 + $LOAD_PATH.unshift File.join(current_folder,'fake_load_path')
  8 + test = 1
  9 + begin
  10 + require 'iconv'
  11 + rescue LoadError
  12 + test = 2
  13 + end
  14 + test.should == 2
  15 +
  16 + #load fast_gettext
  17 + require 'fast_gettext'
  18 +
  19 + FastGettext.add_text_domain('test',:path=>File.join(File.dirname(__FILE__),'..','locale'))
  20 + FastGettext.text_domain = 'test'
  21 + FastGettext.available_locales = ['en','de']
  22 + FastGettext.locale = 'de'
  23 +
  24 + #translate
  25 + FastGettext._('car').should == 'Auto'
  26 + end
  27 +end
0 28 \ No newline at end of file
... ...
vendor/terceiro-fast_gettext-fe7bb09e30f7b1b5876a3b7a18fe8a254c6f59cb/spec/vendor/string_spec.rb 0 → 100644
... ... @@ -0,0 +1,77 @@
  1 +current_folder = File.dirname(__FILE__)
  2 +require File.join(current_folder,'..','spec_helper')
  3 +
  4 +#just to make sure we did not mess up while copying...
  5 +describe String do
  6 + it "does not translate twice" do
  7 + ("%{a} %{b}" % {:a=>'%{b}',:b=>'c'}).should == '%{b} c'
  8 + end
  9 +
  10 + describe "old % style replacement" do
  11 + it "substitudes using % + Hash" do
  12 + ("x%{name}y" %{:name=>'a'}).should == 'xay'
  13 + end
  14 +
  15 + it "does not substitute after %%" do
  16 + ("%%{num} oops" % {:num => 1}).should == '%{num} oops'
  17 + end
  18 +
  19 + it "does not substitute when nothing could be found" do
  20 + ("abc" % {:x=>1}).should == 'abc'
  21 + end
  22 +
  23 + if RUBY_VERSION < '1.9' # this does not longer work in 1.9, use :"my weird string"
  24 + it "sustitutes strings" do
  25 + ("a%{b}c" % {'b'=>1}).should == 'a1c'
  26 + end
  27 +
  28 + it "sustitutes strings with -" do
  29 + ("a%{b-a}c" % {'b-a'=>1}).should == 'a1c'
  30 + end
  31 +
  32 + it "sustitutes string with ." do
  33 + ("a%{b.a}c" % {'b.a'=>1}).should == 'a1c'
  34 + end
  35 +
  36 + it "sustitutes string with number" do
  37 + ("a%{1}c" % {'1'=>1}).should == 'a1c'
  38 + end
  39 + end
  40 + end
  41 +
  42 + describe 'old sprintf style' do
  43 + it "substitudes using % + Array" do
  44 + ("x%sy%s" % ['a','b']).should == 'xayb'
  45 + end
  46 +
  47 + if RUBY_VERSION < '1.9' # this does not longer work in 1.9, ArgumentError is raised
  48 + it "does not remove %{} style replacements" do
  49 + ("%{name} x%sy%s" % ['a','b']).should == '%{name} xayb'
  50 + end
  51 +
  52 + it "does not remove %<> style replacement" do
  53 + ("%{name} %<num>f %s" % ['x']).should == "%{name} %<num>f x"
  54 + end
  55 + end
  56 + end
  57 +
  58 + describe 'ruby 1.9 style %< replacement' do
  59 + it "does not substitute after %%" do
  60 + ("%%<num> oops" % {:num => 1}).should == '%<num> oops'
  61 + end
  62 +
  63 + it "subsitutes %<something>d" do
  64 + ("x%<hello>dy" % {:hello=>1}).should == 'x1y'
  65 + end
  66 +
  67 + it "substitutes #b" do
  68 + ("%<num>#b" % {:num => 1}).should == "0b1"
  69 + end
  70 + end
  71 +
  72 + if RUBY_VERSION >= '1.9'
  73 + it "does not raise when key was not found" do
  74 + ("%{typo} xxx" % {:something=>1}).should == "%{typo} xxx"
  75 + end
  76 + end
  77 +end
0 78 \ No newline at end of file
... ...