pax_global_header 0000666 0000000 0000000 00000000064 13663247353 0014526 g ustar 00root root 0000000 0000000 52 comment=af55160c0f025fecfade95b59e0492614c9beb71
fast_gettext-2.0.3/ 0000775 0000000 0000000 00000000000 13663247353 0014231 5 ustar 00root root 0000000 0000000 fast_gettext-2.0.3/.gitignore 0000664 0000000 0000000 00000000024 13663247353 0016215 0 ustar 00root root 0000000 0000000 pkg
benchmark/locle
fast_gettext-2.0.3/.rubocop.yml 0000664 0000000 0000000 00000001257 13663247353 0016510 0 ustar 00root root 0000000 0000000 AllCops:
TargetRubyVersion: 2.4 # keep in sync with minimum version
Exclude:
- vendor/**/*
- gemfiles/vendor/**/*
- lib/fast_gettext/vendor/**/*
- spec/**/* # TODO
- gemfiles/**/* # TODO
Metrics:
Enabled: false
Style/StringLiterals:
Enabled: false
Gemspec/OrderedDependencies:
Enabled: false
Style/WordArray:
EnforcedStyle: brackets
Style/IfUnlessModifier:
Enabled: false
Lint/AssignmentInCondition:
Enabled: false
Style/Documentation:
Enabled: false
Style/Lambda:
EnforcedStyle: literal
Naming/MethodName:
Enabled: false
Style/SymbolArray:
EnforcedStyle: brackets
Style/PerlBackrefs:
Enabled: false
Style/DoubleNegation:
Enabled: false
fast_gettext-2.0.3/.travis.yml 0000664 0000000 0000000 00000001262 13663247353 0016343 0 ustar 00root root 0000000 0000000 script: "bundle exec rake spec"
sudo: false
rvm:
- 2.4
- 2.5
- 2.6
gemfile:
- gemfiles/rails42.gemfile
- gemfiles/rails52.gemfile
branches:
only: master
maxtrix:
include:
- name: Rubocop
rvm: 2.4 # keep in sync with oldest ruby
script: bundle exec rubocop
- name: Benchmark
rvm: 2.6 # keep in sync with newest ruby
script: gem i gettext && gem i activesupport && bundle exec rake benchmark
- name: Namespaces
rvm: 2.6 # keep in sync with newest ruby
script:
- echo 'gem "gettext"' >> $BUNDLE_GEMFILE
- echo 'gem "iconv"' >> $BUNDLE_GEMFILE
- bundle install --no-deployment && bundle exec rake namespaces
fast_gettext-2.0.3/CHANGELOG 0000664 0000000 0000000 00000002230 13663247353 0015440 0 ustar 00root root 0000000 0000000 2.0.0 -- Changed p_ separator to \0004 https://github.com/grosser/fast_gettext/pull/107 add np and add gettext aliases
1.6.0 -- Remove restrictions around yaml file names
1.1.0 -- translations are no longer eager loaded for improved startup performance, pass `eager_load: true` to preload for example in preforked web server
1.0.0 -- do not enforce attr_accessible unless ProtectedAttributes are loaded
0.9.0 -- reworked internals of caching to be pluggable
0.7.0 -- set_locale resets to default locale if none of the available locales was tried to set
0.6.0 -- plurals use singular translations as fallback e.g. you translated 'Axis' then n_('Axis','Axis',1) would return the translation for 'Axis' if no plural translation was found
0.4.14 -- "" is translated as "", not as gettext meta information
0.4.0 -- pluralisation_rules is no longer stored in each repository, only retrieved. Added Chain and Logger repository.
0.3.6 -- FastGettext.default_locale=
0.3.5 -- FastGettext.default_text_domain=
0.3.4 -- Exceptions are thrown, not returned when translating without text domain
0.3 -- pluralisation methods accept/return n plural forms, contrary to singular/plural before
fast_gettext-2.0.3/Gemfile 0000664 0000000 0000000 00000000105 13663247353 0015520 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
source "https://rubygems.org"
gemspec
fast_gettext-2.0.3/Gemfile.lock 0000664 0000000 0000000 00000003410 13663247353 0016451 0 ustar 00root root 0000000 0000000 PATH
remote: .
specs:
fast_gettext (2.0.3)
GEM
remote: https://rubygems.org/
specs:
activemodel (5.2.2)
activesupport (= 5.2.2)
activerecord (5.2.2)
activemodel (= 5.2.2)
activesupport (= 5.2.2)
arel (>= 9.0)
activesupport (5.2.2)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
arel (9.0.0)
ast (2.4.0)
bump (0.7.0)
concurrent-ruby (1.1.3)
diff-lcs (1.3)
forking_test_runner (1.3.0)
parallel_tests (>= 1.3.7)
i18n (1.2.0)
concurrent-ruby (~> 1.0)
jaro_winkler (1.5.1)
minitest (5.11.3)
parallel (1.12.1)
parallel_tests (2.27.0)
parallel
parser (2.5.3.0)
ast (~> 2.4.0)
powerpack (0.1.2)
rainbow (3.0.0)
rake (12.3.2)
rspec (3.8.0)
rspec-core (~> 3.8.0)
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-core (3.8.0)
rspec-support (~> 3.8.0)
rspec-expectations (3.8.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-mocks (3.8.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-support (3.8.0)
rubocop (0.61.1)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
parser (>= 2.5, != 2.5.1.1)
powerpack (~> 0.1)
rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.4.0)
ruby-progressbar (1.10.0)
single_cov (1.3.0)
sqlite3 (1.3.13)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
unicode-display_width (1.4.0)
wwtd (1.3.0)
PLATFORMS
ruby
DEPENDENCIES
activerecord
bump
fast_gettext!
forking_test_runner
i18n
rake
rspec
rubocop
single_cov
sqlite3
wwtd
BUNDLED WITH
1.17.2
fast_gettext-2.0.3/Rakefile 0000664 0000000 0000000 00000001602 13663247353 0015675 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require 'bundler/setup'
require 'bundler/gem_tasks'
require 'bump/tasks'
require 'wwtd/tasks'
desc "Run test matrix as defined in .travis.yml on current ruby"
task default: "wwtd:local"
desc "Run tests"
task :spec do
sh "forking-test-runner spec --rspec --merge-coverage --quiet --no-fixtures --no-ar"
end
desc "Benchmark different translation frameworks"
task :benchmark do
puts "Running on #{RUBY_DESCRIPTION}"
Bundler.with_original_env do
["baseline", "ideal", "fast_gettext", "original", "i18n_simple"].each do |bench|
sh "ruby ./benchmark/#{bench}.rb"
puts
end
end
end
desc "Show namespace differences between translation frameworks"
task :namespaces do
sh "ruby benchmark/namespace/original.rb"
sh "ruby benchmark/namespace/fast_gettext.rb"
end
desc "Check code against ruby style guide"
task :rubocop do
sh "rubocop"
end
fast_gettext-2.0.3/Readme.md 0000664 0000000 0000000 00000033657 13663247353 0015766 0 ustar 00root root 0000000 0000000 FastGettext
===========
GetText but 12 x faster, 530 x less garbage, clean namespace (8 vs 26), simple and threadsafe!
It supports multiple backends (.mo, .po, .yml files, Database(ActiveRecord + any other), Chain, Loggers) and can easily be extended.
[Example Rails application](https://github.com/grosser/gettext_i18n_rails_example)
Comparison
==========
|
Hash |
FastGettext |
GetText |
ActiveSupport I18n::Simple |
Speed* |
0.08s |
0.14s |
1.75s |
3.75s |
Objects* |
11K |
15K |
8017K |
7107K |
Included backends |
|
db, yml, mo, po, logger, chain |
mo |
yml (db/key-value/po/chain in other I18n backends) |
*500.000 translations with ruby 2.5.3 through `bundle exec rake benchmark`
Setup
=====
### 1. Install
```Bash
gem install fast_gettext
```
### 2. Add a translation repository
From mo files (traditional/default)
```Ruby
FastGettext.add_text_domain('my_app', path: 'locale')
```
Or po files (less maintenance than mo)
```Ruby
FastGettext.add_text_domain('my_app', path: 'locale', type: :po)
# ignore_fuzzy: true to not use fuzzy translations
# report_warning: false to hide warnings about obsolete/fuzzy translations
```
Or yaml files (use I18n syntax/indentation)
```Ruby
# A single locale can be segmented in multiple yaml files but they all should be
# named with a `qq.yml` suffix, where `qq` is the locale name.
FastGettext.add_text_domain('my_app', path: 'config/locales', type: :yaml)
```
Or database (scaleable, good for many locales/translators)
```Ruby
# db access is cached <-> only first lookup hits the db
require "fast_gettext/translation_repository/db"
FastGettext::TranslationRepository::Db.require_models # load and include default models
FastGettext.add_text_domain('my_app', type: :db, model: TranslationKey)
```
### 3. Choose text domain and locale for translation
Do this once in every Thread. (e.g. Rails -> ApplicationController)
```Ruby
FastGettext.text_domain = 'my_app'
FastGettext.available_locales = ['de', 'en', 'fr', 'en_US', 'en_UK'] # only allow these locales to be set (optional)
FastGettext.locale = 'de'
```
### 4. Start translating
FastGettext supports all the translation methods of [ruby-gettext](http://github.com/ruby-gettext/gettext) with added support for block defaults.
(to get `*gettext` methods, use `FastGettext::TranslationAliased`)
#### `_()` or `gettext()`: basic translation
```ruby
extend FastGettext::Translation
_('Car') == 'Auto' # found translation for 'Car'
_('not-found') == 'not-found' # The msgid is returned by default
```
#### `n_()` or `ngettext()`: pluralization
```ruby
n_('Car', 'Cars', 1) == 'Auto'
n_('Car', 'Cars', 2) == 'Autos' # German plural of Cars
```
You'll often want to interpolate the results of `n_()` using ruby builtin `%` operator.
```ruby
n_('Car', '%{n} Cars', 2) % { n: count } == '2 Autos'
```
#### `p_()` or `pgettext()`: translation with context
```ruby
p_('File', 'Open') == _("File\004Open") == "öffnen"
p_('Context', 'not-found') == 'not-found'
```
#### `s_()` or `sgettext()`: translation with namespace
```ruby
s_('File|Open') == _('File|Open') == "öffnen"
s_('Context|not-found') == 'not-found'
```
The difference between `s_()` and `p_()` is largely based on how the translations
are stored. Your preference will be based on your workflow and translation editing
tools.
#### `pn_()` or `pngettext()`: context-aware pluralized
```ruby
pn_('Fruit', 'Apple', 'Apples', 3) == 'Äpfel'
pn_('Fruit', 'Apple', 'Apples', 1) == 'Apfel'
```
#### `sn_()` or `sngettext()`: without context pluralized
```ruby
sn_('Fruit|Apple', 'Apples', 3) == 'Äpfel'
sn_('Fruit|Apple', 'Apples', 1) == 'Apfel'
```
#### `N_()` and `Nn_()`: make dynamic translations available to the parser.
In many instances, your strings will not be found by the ruby parsing. These methods
allow for those strings to be discovered.
```
N_("active"); N_("inactive"); N_("paused") # possible value of status for parser to find.
Nn_("active", "inactive", "paused") # alternative method
_("Your account is %{account_state}.") % { account_state: _(status) }
```
Managing translations
=====================
### mo/po-files
Generate .po or .mo files using GetText parser (example tasks at [gettext_i18n_rails](http://github.com/grosser/gettext_i18n_rails))
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
```Ruby
FastGettext.add_text_domain('my_app', path: 'locale')
```
Use the [original GetText](http://github.com/ruby-gettext/gettext) to create and manage po/mo-files.
(Work on a po/mo parser & reader that is easier to use has started, contributions welcome @ [get_pomo](http://github.com/grosser/get_pomo) )
### Database
[Example migration for ActiveRecord](http://github.com/grosser/fast_gettext/blob/master/examples/db/migration.rb)
The default plural separator is `||||` but you may overwrite it (or suggest a better one...).
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.
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.
To manage translations via a Web GUI, use a [Rails application and the translation_db_engine](http://github.com/grosser/translation_db_engine)
Rails
=======================
Try the [gettext_i18n_rails plugin](http://github.com/grosser/gettext_i18n_rails), it simplifies the setup.
Try the [translation_db_engine](http://github.com/grosser/translation_db_engine), to manage your translations in a db.
Setting `available_locales`,`text_domain` or `locale` will not work inside the `environment.rb`,
since it runs in a different thread then e.g. controllers, so set them inside your application_controller.
```Ruby
# config/environment.rb after initializers
Object.send(:include, FastGettext::Translation)
FastGettext.add_text_domain('accounting', path: 'locale')
FastGettext.add_text_domain('frontend', path: 'locale')
...
# app/controllers/application_controller.rb
class ApplicationController ...
include FastGettext::Translation
before_filter :set_locale
def set_locale
FastGettext.available_locales = ['de', 'en', ...]
FastGettext.text_domain = 'frontend'
FastGettext.set_locale(params[:locale] || session[:locale] || request.env['HTTP_ACCEPT_LANGUAGE'])
session[:locale] = I18n.locale = FastGettext.locale
end
```
Advanced features
=================
### Abnormal pluralisation
Plurals are selected by index, think of it as `['car', 'cars'][index]`
A pluralisation rule decides which form to use e.g. in english its `count == 1 ? 0 : 1`.
If you have any languages that do not fit this rule, you have to add a custom pluralisation rule.
Via Ruby:
```Ruby
FastGettext.pluralisation_rule = ->(count){ count > 5 ? 1 : (count > 2 ? 0 : 2)}
```
Via mo/pofile:
```
Plural-Forms: nplurals=2; plural=n==2?3:4;
```
[Plural expressions for all languages](http://translate.sourceforge.net/wiki/l10n/pluralforms).
### default_text_domain
If you only use one text domain, setting `FastGettext.default_text_domain = 'app'`
is sufficient and no more `text_domain=` is needed
### default_locale
If the simple rule of "first `available_locale` or 'en'" is not sufficient for you, set `FastGettext.default_locale = 'de'`.
### default_available_locales
Fallback when no available_locales are set
### with_locale
If there is content from different locales that you wish to display, you should use the with_locale option as below:
```Ruby
FastGettext.with_locale 'gsw_CH' do
FastGettext._('Car was successfully created.')
end
# => "Z auto isch erfolgriich gspeicharat worda."
```
### Chains
You can use any number of repositories to find a translation. Simply add them to a chain and when
the first cannot translate a given key, the next is asked and so forth.
```Ruby
repos = [
FastGettext::TranslationRepository.build('new', path: '....'),
FastGettext::TranslationRepository.build('old', path: '....')
]
FastGettext.add_text_domain 'combined', type: :chain, chain: repos
```
### Merge
In some cases you can benefit from using merge repositories as an alternative to chains. They behave nearly the same. The difference is in the internal
data structure. While chain repos iterate over the whole chain for each translation, merge repositories select and store the first translation at the time
a subordinate repository is added. This puts the burden on the load phase and speeds up the translations.
```Ruby
repos = [
FastGettext::TranslationRepository.build('new', path: '....'),
FastGettext::TranslationRepository.build('old', path: '....')
]
domain = FastGettext.add_text_domain 'combined', type: :merge, chain: repos
```
Downside of this approach is that you have to reload the merge repo each time a language is changed.
```Ruby
FastGettext.locale = 'de'
domain.reload
```
### Logger
When you want to know which keys could not be translated or were used, add a Logger to a Chain:
```Ruby
repos = [
FastGettext::TranslationRepository.build('app', path: '....')
FastGettext::TranslationRepository.build('logger', type: :logger, callback: ->(key_or_array_of_ids) { ... }),
}
FastGettext.add_text_domain 'combined', type: :chain, chain: repos
```
If the Logger is in position #1 it will see all translations, if it is in position #2 it will only see the unfound.
Unfound may not always mean missing, if you choose not to translate a word because the key is a good translation, it will appear nevertheless.
A lambda or anything that responds to `call` will do as callback. A good starting point may be `examples/missing_translations_logger.rb`.
### Plugins
Want an xml version?
Write your own TranslationRepository!
```Ruby
# fast_gettext/translation_repository/wtf.rb
module FastGettext
module TranslationRepository
class Wtf
define initialize(name,options), [key], plural(*keys) and
either inherit from TranslationRepository::Base or define available_locales and pluralisation_rule
end
end
end
```
### Multi domain support
If you have more than one gettext domain, there are two sets of functions
available:
```Ruby
extend FastGettext::TranslationMultidomain
d_("domainname", "string") # finds 'string' in domain domainname
dn_("domainname", "string", "strings", 1) # ditto
dp_("domainname", "context", "key")
ds_("domainname", "context|key")
dnp_("domainname", "context", "string", "strings")
dns_("domainname", "context|string", "strings")
```
These are helper methods so you don't need to write:
```Ruby
FastGettext.with_domain("domainname") { _("string") }
```
It is useful in Rails plugins in the views for example. The second set of
functions are D functions which search for string in _all_ domains. If there
are multiple translations in different domains, it returns them in random
order (depends on the Ruby hash implementation).
```Ruby
extend FastGettext::TranslationMultidomain
D_("string") # finds 'string' in any domain
Dn_("string", "strings", 1) # ditto
Dp_("context", "key")
Ds_("context|key")
Dnp_("context", "string", "strings")
Dns_("context|string", "strings")
```
Alternatively you can use [merge repository](https://github.com/grosser/fast_gettext#merge) to achieve the same behavior.
#### Block defaults
All the translation methods (including MultiDomain) support a block default, a feature not provided by ruby-gettext. When a translation is
not found, if a block is provided the block is always returned. Otherwise, a key is returned. Methods doing pluralization will attempt a simple translation of alternate keys.
```ruby
_('not-found'){ "alternative default" } == alternate default
```
This block default is useful when the default is a very long passage of text that wouldn't make a useful key. You can also instrument logging not found keys.
```ruby
_('terms-and-conditions'){
load_terms_and_conditions
request_terms_and_conditions_translation_from_legal
}
# Override _ with logging
def _(key, &block)
result = gettext(key){ nil } # nil returned when not found
log_missing_translation_key(key) if result.nil?
result || (block ? block.call : key)
end
```
FAQ
===
- [Problems with ActiveRecord messages?](http://wiki.github.com/grosser/fast_gettext/activerecord)
- [Iconv require error in 1.9.2](http://exceptionz.wordpress.com/2010/02/03/how-to-fix-the-iconv-require-error-in-ruby-1-9)
Authors
=======
Mo/Po-file parsing from Masao Mutoh, see vendor/README
### [Contributors](http://github.com/grosser/fast_gettext/contributors)
- [geekq](http://www.innoq.com/blog/vd)
- [Matt Sanford](http://blog.mzsanford.com)
- [Antonio Terceiro](http://softwarelivre.org/terceiro)
- [J. Pablo Fernández](http://pupeno.com)
- Rudolf Gavlas
- [Ramón Cahenzli](http://www.psy-q.ch)
- [Rainux Luo](http://rainux.org)
- [Dmitry Borodaenko](https://github.com/angdraug)
- [Kouhei Sutou](https://github.com/kou)
- [Hoang Nghiem](https://github.com/hoangnghiem)
- [Costa Shapiro](https://github.com/costa)
- [Jamie Dyer](https://github.com/kernow)
- [Stephan Kulow](https://github.com/coolo)
- [Fotos Georgiadis](https://github.com/fotos)
- [Lukáš Zapletal](https://github.com/lzap)
- [Dominic Cleal](https://github.com/domcleal)
- [Tomas Strachota](https://github.com/tstrachota)
- [Martin Meier](https://github.com/mameier)
- [morcoteg](https://github.com/morcoteg)
- [Daniel Schepers](https://github.com/tall-dan)
- [Robert Graff](https://github.com/rgraff)
[Michael Grosser](http://grosser.it)
michael@grosser.it
License: MIT, some vendor parts under the same license terms as Ruby (see headers)
[](https://travis-ci.org/grosser/fast_gettext)
fast_gettext-2.0.3/benchmark/ 0000775 0000000 0000000 00000000000 13663247353 0016163 5 ustar 00root root 0000000 0000000 fast_gettext-2.0.3/benchmark/base.rb 0000664 0000000 0000000 00000001764 13663247353 0017432 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require 'benchmark'
$LOAD_PATH.unshift 'lib'
RUNS = 500_000
def locale_folder(domain)
path =
case domain
when 'test' then File.join(__dir__, '..', 'spec', 'locale')
when 'large' then File.join(__dir__, 'locale')
end
mo = File.join(path, 'de', 'LC_MESSAGES', "#{domain}.mo")
raise unless File.exist?(mo)
path
end
def results_test(&block)
print "#{result(&block)}s / #{memory}K <-> "
end
def results_large
print "#{(result { _('login') == 'anmelden' })}s / #{memory}K / #{namespace}"
puts ""
end
def result
Benchmark.realtime do
RUNS.times do
raise "not translated" unless yield
end
end.round(2)
end
def memory
(calculate_memory - @default_memory) / 1000
end
def calculate_memory
GC.stat[:total_allocated_objects]
end
def namespace
calculate_namespace - @default_namespace
end
def calculate_namespace
methods.size
end
GC.start
GC.disable
@default_memory = calculate_memory
@default_namespace = calculate_namespace
fast_gettext-2.0.3/benchmark/baseline.rb 0000664 0000000 0000000 00000000201 13663247353 0020263 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require_relative 'base'
puts "Baseline: (doing nothing in a loop)"
results_test { true }
puts ""
fast_gettext-2.0.3/benchmark/fast_gettext.rb 0000664 0000000 0000000 00000001064 13663247353 0021212 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require_relative 'base'
require 'fast_gettext'
include FastGettext::Translation # rubocop:disable Style/MixinUsage
FastGettext.available_locales = ['de', 'en']
FastGettext.locale = 'de'
puts "FastGettext:"
FastGettext.add_text_domain('test', path: locale_folder('test'))
FastGettext.text_domain = 'test'
results_test { _('car') == 'Auto' }
# i cannot add the large file, since its an internal applications mo file
FastGettext.add_text_domain('large', path: locale_folder('large'))
FastGettext.text_domain = 'large'
results_large
fast_gettext-2.0.3/benchmark/i18n_simple.rb 0000664 0000000 0000000 00000000636 13663247353 0020645 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require_relative 'base'
begin
gem 'activesupport', '>=5.2.0'
rescue LoadError => e
abort "Install the activesupport gem -- #{e}"
end
require 'active_support'
I18n.backend = I18n::Backend::Simple.new
I18n.load_path = ['benchmark/locale/de.yml']
I18n.locale = :de
puts "ActiveSupport I18n::Backend::Simple :"
results_test { I18n.translate('activerecord.models.car') == 'Auto' }
fast_gettext-2.0.3/benchmark/ideal.rb 0000664 0000000 0000000 00000001244 13663247353 0017567 0 ustar 00root root 0000000 0000000 # frozen_string_literal: true
require_relative 'base'
module FastestGettext
def set_domain(folder, domain, locale)
@data = {}
require 'fast_gettext/vendor/mofile'
FastGettext::GetText::MOFile.open(File.join(folder, locale, 'LC_MESSAGES', "#{domain}.mo"), "UTF-8").each { |k, v| @data[k] = v }
end
def _(word)
@data[word]
end
end
include FastestGettext # rubocop:disable Style/MixinUsage
set_domain(locale_folder('test'), 'test', 'de')
puts "Ideal: (primitive Hash lookup)"
results_test { _('car') == 'Auto' }
# i cannot add the large file, since its an internal applications mo file
set_domain(locale_folder('large'), 'large', 'de')
results_large
fast_gettext-2.0.3/benchmark/locale/ 0000775 0000000 0000000 00000000000 13663247353 0017422 5 ustar 00root root 0000000 0000000 fast_gettext-2.0.3/benchmark/locale/de.yml 0000664 0000000 0000000 00000007124 13663247353 0020541 0 ustar 00root root 0000000 0000000 # German translations for Ruby on Rails
# by Clemens Kofler (clemens@railway.at)
de:
date:
formats:
default: "%d.%m.%Y"
short: "%e. %b"
long: "%e. %B %Y"
only_day: "%e"
day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag]
abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa]
month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember]
abbr_month_names: [~, Jan, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez]
time:
formats:
default: "%A, %e. %B %Y, %H:%M Uhr"
short: "%e. %B, %H:%M Uhr"
long: "%A, %e. %B %Y, %H:%M Uhr"
time: "%H:%M"
am: "vormittags"
pm: "nachmittags"
datetime:
distance_in_words:
half_a_minute: 'eine halbe Minute'
less_than_x_seconds:
zero: 'weniger als 1 Sekunde'
one: 'weniger als 1 Sekunde'
other: 'weniger als {{count}} Sekunden'
x_seconds:
one: '1 Sekunde'
other: '{{count}} Sekunden'
less_than_x_minutes:
zero: 'weniger als 1 Minute'
one: 'weniger als eine Minute'
other: 'weniger als {{count}} Minuten'
x_minutes:
one: '1 Minute'
other: '{{count}} Minuten'
about_x_hours:
one: 'etwa 1 Stunde'
other: 'etwa {{count}} Stunden'
x_days:
one: '1 Tag'
other: '{{count}} Tage'
about_x_months:
one: 'etwa 1 Monat'
other: 'etwa {{count}} Monate'
x_months:
one: '1 Monat'
other: '{{count}} Monate'
about_x_years:
one: 'etwa 1 Jahr'
other: 'etwa {{count}} Jahre'
over_x_years:
one: 'mehr als 1 Jahr'
other: 'mehr als {{count}} Jahre'
number:
format:
precision: 2
separator: ','
delimiter: '.'
currency:
format:
unit: '€'
format: '%n%u'
separator:
delimiter:
precision:
percentage:
format:
delimiter: ""
precision:
format:
delimiter: ""
human:
format:
delimiter: ""
precision: 1
support:
array:
sentence_connector: "und"
skip_last_comma: true
activerecord:
errors:
template:
header:
one: "Konnte dieses {{model}} Objekt nicht speichern: 1 Fehler."
other: "Konnte dieses {{model}} Objekt nicht speichern: {{count}} Fehler."
body: "Bitte überprüfen Sie die folgenden Felder:"
format:
separator: ' '
messages:
inclusion: "ist kein gültiger Wert"
exclusion: "ist nicht verfügbar"
invalid: "ist nicht gültig"
confirmation: "stimmt nicht mit der Bestätigung überein"
accepted: "muss akzeptiert werden"
empty: "muss ausgefüllt werden"
blank: "muss ausgefüllt werden"
too_long: "ist zu lang (nicht mehr als {{count}} Zeichen)"
too_short: "ist zu kurz (nicht weniger als {{count}} Zeichen)"
wrong_length: "hat die falsche Länge (muss genau {{count}} Zeichen haben)"
taken: "ist bereits vergeben"
not_a_number: "ist keine Zahl"
greater_than: "muss größer als {{count}} sein"
greater_than_or_equal_to: "muss größer oder gleich {{count}} sein"
equal_to: "muss genau {{count}} sein"
less_than: "muss kleiner als {{count}} sein"
less_than_or_equal_to: "muss kleiner oder gleich {{count}} sein"
odd: "muss ungerade sein"
even: "muss gerade sein"
models:
car: 'BAUTO'
cars: 'CAUTO'
Car: 'DAUTO'
models:
car: 'Auto'
fast_gettext-2.0.3/benchmark/locale/de/ 0000775 0000000 0000000 00000000000 13663247353 0020012 5 ustar 00root root 0000000 0000000 fast_gettext-2.0.3/benchmark/locale/de/LC_MESSAGES/ 0000775 0000000 0000000 00000000000 13663247353 0021577 5 ustar 00root root 0000000 0000000 fast_gettext-2.0.3/benchmark/locale/de/LC_MESSAGES/large.mo 0000664 0000000 0000000 00000334070 13663247353 0023235 0 ustar 00root root 0000000 0000000 ! B X X ! "X DX YX tX X C X > X ? ,Y lY A Y * Y Y = Z LZ
aZ 5 lZ
Z 5 Z Z Z
[ [ [
"[ -[ 4[ F[
][ k[
{[ , [ ( [ D [ $\ 1\
@\ K\ \\ x\ \ \ \ \ \ \ \ \ \ ] ]
] !] ?] U] i] ) r] ] ) ] ] ] ] ] ^ ^ 4^ L^ `^ r^ ^ ^ ^
^
^ ^ ^ ^
^ ^ ^ ^
_ _ +_
<_ J_ \_ d_ l_ _ _ _ _ _ _ g` ] {` ` 2 ` a 3a Ea Ua la |a ' a &