Commit 6d9041698c7a8015a647d54910832e17918dd68f
1 parent
b04427d2
Exists in
master
and in
28 other branches
Adding fast_gettext source in vendor/
(ActionItem1315)
Showing
57 changed files
with
3374 additions
and
0 deletions
Show diff stats
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
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
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
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 | ... | ... |