grosser-fast_gettext 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +39 -25
- data/Rakefile +1 -0
- data/VERSION.yml +1 -1
- data/lib/fast_gettext/translation_repository/db.rb +59 -0
- data/lib/fast_gettext/translation_repository/db/translation_key.rb +12 -0
- data/lib/fast_gettext/translation_repository/db/translation_text.rb +5 -0
- data/spec/fast_gettext/translation_repository/db_spec.rb +71 -0
- metadata +7 -2
data/README.markdown
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
FastGettext
|
2
2
|
===========
|
3
|
-
GetText but 3.5 x faster,
|
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 (atm: .mo files, .po files, ActiveRecord, Chain) and can easily be extended.
|
4
6
|
|
5
7
|
[Example Rails application](https://github.com/grosser/gettext_i18n_rails_example)
|
6
8
|
|
@@ -12,13 +14,6 @@ Or from source:
|
|
12
14
|
git clone git://github.com/grosser/fast_gettext.git
|
13
15
|
cd fast_gettext && rake install
|
14
16
|
|
15
|
-
Generate .po or .mo files using GetText parser (example tasks at [gettext_i18n_rails](http://github.com/grosser/gettext_i18n_rails))
|
16
|
-
|
17
|
-
Tell Gettext where your .mo or .po files lie:
|
18
|
-
#e.g. for locale/de/my_app.po and locale/de/LC_MESSAGES/my_app.mo
|
19
|
-
#add :type=>:po and it will read directly from po files (not recommended for production since po-parsing can crash!)
|
20
|
-
FastGettext.add_text_domain('my_app',:path=>'locale')
|
21
|
-
|
22
17
|
Choose text domain and locale for translation
|
23
18
|
FastGettext.text_domain = 'my_app'
|
24
19
|
FastGettext.available_locales = ['de','en','fr','en_US','en_UK'] # only allow these locales to be set (optional)
|
@@ -34,28 +29,50 @@ Start translating
|
|
34
29
|
Disable translation errors(like no text domain setup) while doing e.g. console session / testing
|
35
30
|
FastGettext.silence_errors
|
36
31
|
|
32
|
+
Translations
|
33
|
+
============
|
34
|
+
### Default: .mo-files
|
35
|
+
Generate .po or .mo files using GetText parser (example tasks at [gettext_i18n_rails](http://github.com/grosser/gettext_i18n_rails))
|
36
|
+
|
37
|
+
Tell Gettext where your .mo or .po files lie:
|
38
|
+
#e.g. for locale/de/my_app.po and locale/de/LC_MESSAGES/my_app.mo
|
39
|
+
#add :type=>:po and it will read directly from po files (not recommended for production since po-parsing can crash!)
|
40
|
+
FastGettext.add_text_domain('my_app',:path=>'locale')
|
41
|
+
|
42
|
+
ATM you have to use the [original GetText](http://github.com/mutoh/gettext) to create and manage your po/mo-files.
|
43
|
+
I already started work on a po/mo parser & reader that is easier to use, contributions welcome @ [pomo](http://github.com/grosser/pomo)
|
44
|
+
|
45
|
+
###Database
|
46
|
+
!!!This is very new/alpha-ish atm and surely will change!!!
|
47
|
+
Eesy to maintain especially with many translations and multiple locales.
|
48
|
+
ATM the default implementation is a bit clumsy, it is build so that the model can be substituted by your own.
|
49
|
+
FastGettext.add_text_domain('my_app', :type=>:db, :model=>TranslationKey)
|
50
|
+
#the model should be the model that represents the keys, you can use FastGettext::TranslationRepository::DB::TranslationKey
|
51
|
+
#the model must have string:key and translations
|
52
|
+
#a Translation must have string:text and string:locale
|
53
|
+
|
54
|
+
To get started have a look at the tests in `spec/fast_gettext/translation_repository/db_spec.rb`(includes migrations) or the models
|
55
|
+
in `lib/fast_gettext/translation_repository/db/translation_key`.
|
56
|
+
|
37
57
|
Performance
|
38
58
|
===========
|
39
|
-
50_000 translations speed / memory
|
40
|
-
small translation file <-> large translation file
|
59
|
+
50_000 translations speed / memory
|
60
|
+
small translation file <-> large translation file
|
61
|
+
(ruby enterprise 1.8.6, your results may vary, try `rake benchmark`)
|
41
62
|
Baseline: (doing nothing in a loop)
|
42
|
-
0.
|
63
|
+
0.250000s / 0K <->
|
43
64
|
|
44
65
|
Ideal: (primitive Hash lookup)
|
45
|
-
0.
|
66
|
+
0.820000s / 4K <-> 0.760000s / 4K
|
46
67
|
|
47
68
|
FastGettext:
|
48
|
-
1.360000s /
|
69
|
+
1.360000s / 8K <-> 1.320000s / 8K
|
49
70
|
|
50
71
|
GetText 2.0.1:
|
51
|
-
4.
|
72
|
+
4.880000s / 4480K <-> 4.810000s / 4480K
|
52
73
|
|
53
74
|
ActiveSupport I18n::Backend::Simple :
|
54
|
-
21.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
75
|
+
21.770000s / 10100K <->
|
59
76
|
|
60
77
|
Thread Safety and Rails
|
61
78
|
=======================
|
@@ -88,11 +105,6 @@ then e.g. controllers, so set them inside your application_controller.
|
|
88
105
|
include FastGettext::Translation
|
89
106
|
...
|
90
107
|
|
91
|
-
Updating translations
|
92
|
-
=====================
|
93
|
-
ATM you have to use the [original GetText](http://github.com/mutoh/gettext) to create and manage your po/mo-files.
|
94
|
-
I already started work on a po/mo parser & reader that is easier to use, contributions welcome @ [pomo](http://github.com/grosser/pomo)
|
95
|
-
|
96
108
|
Advanced features
|
97
109
|
=================
|
98
110
|
###Abnormal pluralisation
|
@@ -127,7 +139,7 @@ Unfound may not always mean missing, if you chose not to translate a word becaus
|
|
127
139
|
A lambda or anything that responds to `call` will do as callback. A good starting point may be `examples/missing_translations_logger.rb`.
|
128
140
|
|
129
141
|
###Plugins
|
130
|
-
Want a yml, xml
|
142
|
+
Want a yml, xml version ?
|
131
143
|
Write your own TranslationRepository!
|
132
144
|
#fast_gettext/translation_repository/xxx.rb
|
133
145
|
module FastGettext
|
@@ -145,6 +157,8 @@ FAQ
|
|
145
157
|
|
146
158
|
TODO
|
147
159
|
====
|
160
|
+
- some cleanup required, repositories should not have locale
|
161
|
+
- DB::TranslationKey responds_to? :available_locales should be false when it is not defined, maybe testing bug
|
148
162
|
- use `default_locale=(x)` internally, atm the default is available_locales.first || 'en'
|
149
163
|
- use `default_text_domain=(x)` internally, atm default is nil...
|
150
164
|
|
data/Rakefile
CHANGED
data/VERSION.yml
CHANGED
@@ -0,0 +1,59 @@
|
|
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
|
+
translation = translation(key) and translation.text
|
40
|
+
end
|
41
|
+
|
42
|
+
def plural(*args)
|
43
|
+
translation = translation(args*self.class.seperator)
|
44
|
+
if translation
|
45
|
+
translation.text.to_s.split(self.class.seperator)
|
46
|
+
else
|
47
|
+
[]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
protected
|
52
|
+
|
53
|
+
def translation(key)
|
54
|
+
return unless key = @model.find_by_key(key)
|
55
|
+
key.translations.find_by_locale(FastGettext.locale)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class FastGettext::TranslationRepository::DB::TranslationKey < ActiveRecord::Base
|
2
|
+
has_many :translations, :class_name=>'TranslationText'
|
3
|
+
validates_uniqueness_of :key
|
4
|
+
validates_presence_of :key
|
5
|
+
|
6
|
+
# TODO this should not be necessary, but
|
7
|
+
# TranslationKey.respond_to? :available_locales
|
8
|
+
# returns true even if this is not defined...
|
9
|
+
def self.available_locales
|
10
|
+
[]
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
current_folder = File.dirname(__FILE__)
|
2
|
+
require File.join(current_folder,'..','..','spec_helper')
|
3
|
+
|
4
|
+
require 'activerecord'
|
5
|
+
require 'fast_gettext/translation_repository/db'
|
6
|
+
require 'fast_gettext/translation_repository/db/translation_key'
|
7
|
+
require 'fast_gettext/translation_repository/db/translation_text'
|
8
|
+
|
9
|
+
include FastGettext::TranslationRepository
|
10
|
+
|
11
|
+
describe FastGettext::TranslationRepository::DB do
|
12
|
+
before :all do
|
13
|
+
ActiveRecord::Base.establish_connection({
|
14
|
+
:adapter => "sqlite3",
|
15
|
+
:database => ":memory:"
|
16
|
+
})
|
17
|
+
|
18
|
+
#create model table
|
19
|
+
#TODO surpress output ?
|
20
|
+
ActiveRecord::Schema.define(:version => 1) do
|
21
|
+
create_table :translation_keys do |t|
|
22
|
+
t.string :key, :unique=>true, :null=>false
|
23
|
+
t.timestamps
|
24
|
+
end
|
25
|
+
create_table :translation_texts do |t|
|
26
|
+
t.string :text, :locale
|
27
|
+
t.integer :translation_key_id, :null=>false
|
28
|
+
t.timestamps
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
before do
|
34
|
+
DB::TranslationKey.delete_all
|
35
|
+
DB::TranslationText.delete_all
|
36
|
+
FastGettext.locale = 'de'
|
37
|
+
@rep = FastGettext::TranslationRepository::DB.new('x', :model=>DB::TranslationKey)
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_translation(key, text)
|
41
|
+
translation_key = DB::TranslationKey.create!(:key=>key)
|
42
|
+
DB::TranslationText.create!(:translation_key_id=>translation_key.id, :text=>text, :locale=>'de')
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can be built" do
|
46
|
+
# pending #this is weird, it responds to :available_locales, but it is not defined...
|
47
|
+
@rep.available_locales.should == []
|
48
|
+
end
|
49
|
+
|
50
|
+
it "has no pluralisation_rule by default" do
|
51
|
+
@rep.pluralisation_rule.should == nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "cannot translate when no models are present" do
|
55
|
+
@rep['car'].should == nil
|
56
|
+
end
|
57
|
+
|
58
|
+
it "can translate" do
|
59
|
+
create_translation 'car', 'Auto'
|
60
|
+
@rep['car'].should == 'Auto'
|
61
|
+
end
|
62
|
+
|
63
|
+
it "cannot pluralize when no model is present" do
|
64
|
+
@rep.plural('Axis','Axis').should == []
|
65
|
+
end
|
66
|
+
|
67
|
+
it "can pluralize" do
|
68
|
+
create_translation 'Axis||||Axis', 'Achse||||Achsen'
|
69
|
+
@rep.plural('Axis','Axis').should == ['Achse','Achsen']
|
70
|
+
end
|
71
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grosser-fast_gettext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Grosser
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-24 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -34,6 +34,9 @@ files:
|
|
34
34
|
- lib/fast_gettext/translation_repository.rb
|
35
35
|
- lib/fast_gettext/translation_repository/base.rb
|
36
36
|
- lib/fast_gettext/translation_repository/chain.rb
|
37
|
+
- lib/fast_gettext/translation_repository/db.rb
|
38
|
+
- lib/fast_gettext/translation_repository/db/translation_key.rb
|
39
|
+
- lib/fast_gettext/translation_repository/db/translation_text.rb
|
37
40
|
- lib/fast_gettext/translation_repository/logger.rb
|
38
41
|
- lib/fast_gettext/translation_repository/mo.rb
|
39
42
|
- lib/fast_gettext/translation_repository/po.rb
|
@@ -42,6 +45,7 @@ files:
|
|
42
45
|
- spec/fast_gettext/storage_spec.rb
|
43
46
|
- spec/fast_gettext/translation_repository/base_spec.rb
|
44
47
|
- spec/fast_gettext/translation_repository/chain_spec.rb
|
48
|
+
- spec/fast_gettext/translation_repository/db_spec.rb
|
45
49
|
- spec/fast_gettext/translation_repository/logger_spec.rb
|
46
50
|
- spec/fast_gettext/translation_repository/mo_spec.rb
|
47
51
|
- spec/fast_gettext/translation_repository/po_spec.rb
|
@@ -98,6 +102,7 @@ test_files:
|
|
98
102
|
- spec/fast_gettext/translation_repository/logger_spec.rb
|
99
103
|
- spec/fast_gettext/translation_repository/base_spec.rb
|
100
104
|
- spec/fast_gettext/translation_repository/po_spec.rb
|
105
|
+
- spec/fast_gettext/translation_repository/db_spec.rb
|
101
106
|
- spec/fast_gettext/translation_repository/mo_spec.rb
|
102
107
|
- spec/fast_gettext/mo_file_spec.rb
|
103
108
|
- spec/aa_unconfigued_spec.rb
|