i18n_template 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile.rails23_r187 +8 -0
  3. data/Gemfile.rails30_r193 +8 -0
  4. data/Gemfile.rails31_r193 +8 -0
  5. data/README.md +250 -0
  6. data/Rakefile +1 -0
  7. data/bin/i18n_template +5 -0
  8. data/i18n_template.gemspec +26 -0
  9. data/lib/i18n_template.rb +28 -0
  10. data/lib/i18n_template/document.rb +460 -0
  11. data/lib/i18n_template/extractor.rb +4 -0
  12. data/lib/i18n_template/extractor/base.rb +44 -0
  13. data/lib/i18n_template/extractor/gettext.rb +127 -0
  14. data/lib/i18n_template/extractor/plain.rb +43 -0
  15. data/lib/i18n_template/extractor/yaml.rb +53 -0
  16. data/lib/i18n_template/handler.rb +61 -0
  17. data/lib/i18n_template/node.rb +74 -0
  18. data/lib/i18n_template/railtie.rb +7 -0
  19. data/lib/i18n_template/runner.rb +61 -0
  20. data/lib/i18n_template/runner/base.rb +11 -0
  21. data/lib/i18n_template/runner/extract_phrases.rb +70 -0
  22. data/lib/i18n_template/tasks.rb +2 -0
  23. data/lib/i18n_template/translation.rb +62 -0
  24. data/lib/i18n_template/translator.rb +5 -0
  25. data/lib/i18n_template/translator/i18n.rb +24 -0
  26. data/lib/i18n_template/version.rb +3 -0
  27. data/test/abstract_unit.rb +11 -0
  28. data/test/document_test.rb +316 -0
  29. data/test/fixtures/handling_if_blocks.yml +23 -0
  30. data/test/fixtures/ignored_markup.yml +15 -0
  31. data/test/fixtures/incorrect_node_markup.yml +17 -0
  32. data/test/fixtures/nested_nodes.yml +16 -0
  33. data/test/fixtures/nested_wrapped_text.yml +15 -0
  34. data/test/fixtures/phrase_fully_ignored.yml +14 -0
  35. data/test/fixtures/phrase_with_embed_words_and_scriptlet.yml +17 -0
  36. data/test/fixtures/phrase_with_single_char_to_ignore.yml +19 -0
  37. data/test/fixtures/replacing_br_with_newline.yml +15 -0
  38. data/test/fixtures/skipping_ignored_blocks.yml +15 -0
  39. data/test/fixtures/spans_as_phrases.yml +18 -0
  40. data/test/fixtures/table.yml +35 -0
  41. data/test/fixtures/text_with_braces.yml +17 -0
  42. data/test/fixtures/text_with_brackets.yml +17 -0
  43. data/test/fixtures/wrapped_key_propagation.yml +15 -0
  44. data/test/fixtures/wrapping_eval_blocks.yml +17 -0
  45. data/test/fixtures_rendering_test.rb +46 -0
  46. data/test/inline_rendering_test.rb +27 -0
  47. data/test/support/i18n_test_case_helper.rb +12 -0
  48. data/test/templates/_footer.html.erb +3 -0
  49. data/test/templates/greeting.html.erb +1 -0
  50. data/test/templates/layouts/application.html.erb +5 -0
  51. data/test/templates/users/_account.html.erb +3 -0
  52. data/test/templates/users/_profile.html.erb +6 -0
  53. data/test/templates/users/index.html.erb +5 -0
  54. data/test/templates/users/show.html.erb +4 -0
  55. data/test/templates_rendering_test.rb +81 -0
  56. data/test/translate_test.rb +72 -0
  57. metadata +156 -0
@@ -0,0 +1,23 @@
1
+ template: |
2
+ <div>
3
+ <%- if total_price -%>
4
+ <div>Total price: <span><%= total_price %></span></div>
5
+ <%- else -%>
6
+ <div>Total price: N/A</div>
7
+ <%- end -%>
8
+ </div>
9
+
10
+ assigns: {}
11
+
12
+ locals:
13
+ :total_price:
14
+
15
+ phrases:
16
+ - 'Total price: [1]{total price}[/1]'
17
+ - 'Total price: N/A'
18
+
19
+ translations:
20
+ - 'Игого: [1]{total price}[/1]'
21
+ - 'Игого: ХЗ'
22
+
23
+ rendered: "<div>\n <div>Игого: ХЗ</div>\n</div>\n"
@@ -0,0 +1,15 @@
1
+ template: |
2
+ <div><span><span i18n="p">Welcome!</span></span> <span i18n="i">We are glad to meet you here</span></div>
3
+
4
+ assigns: {}
5
+
6
+ locals: {}
7
+
8
+ phrases:
9
+ - 'Welcome!'
10
+
11
+ translations:
12
+ - 'Бобро пожаловаться!'
13
+
14
+ rendered: |
15
+ <div><span><span>Бобро пожаловаться!</span></span> <span>We are glad to meet you here</span></div>
@@ -0,0 +1,17 @@
1
+ template: |
2
+ <div id="level1">Hello, <%= user_name %>! <div id="level2">Welcome to our site</div></div>
3
+
4
+ assigns: {}
5
+
6
+ locals:
7
+ :user_name: joe@site.com
8
+
9
+ phrases:
10
+ - 'Hello, {user name}! [1]Welcome to our site[/1]'
11
+ - 'Welcome to our site'
12
+
13
+ translations:
14
+ - 'Кревед, joe@site.com! [1]Рады видеть вас на вашем сайте[/1]'
15
+
16
+ rendered: |
17
+ <div id="level1">Кревед, joe@site.com! Рады видеть вас на вашем сайте</div>
@@ -0,0 +1,16 @@
1
+ template: |
2
+ <div><span>This is <span>Wrong</span> <%= message %> </span> markup</div>
3
+
4
+ assigns: {}
5
+
6
+ locals:
7
+ :message: html
8
+
9
+ phrases:
10
+ - 'NNODE[1]This is {message} [/1] markup'
11
+
12
+ translations:
13
+ - 'NNODE[1]Это {message} [/1] разметка'
14
+
15
+ rendered: |
16
+ <div>NNODE<span><span>Это html </span></span> разметка</div>
@@ -0,0 +1,15 @@
1
+ template: |
2
+ <div><span><span>Welcome!</span></span> We are glad to meet you here</div>
3
+
4
+ assigns: {}
5
+
6
+ locals: {}
7
+
8
+ phrases:
9
+ - '[1]Welcome![/1] We are glad to meet you here'
10
+
11
+ translations:
12
+ - '[1]Бобро пожаловаться![/1] Век бы вас не видать'
13
+
14
+ rendered: |
15
+ <div><span><span>Бобро пожаловаться!</span></span> Век бы вас не видать</div>
@@ -0,0 +1,14 @@
1
+ template: |
2
+ <td id="step<%= step_number %>_4" colspan="4" i18n="i">&#160;</td>
3
+
4
+ assigns: {}
5
+
6
+ locals:
7
+ :step_number: 2
8
+
9
+ phrases: []
10
+
11
+ translations: []
12
+
13
+ rendered: |
14
+ <td id="step2_4" colspan="4">&#160;</td>
@@ -0,0 +1,17 @@
1
+ template: |
2
+ <p>Welcome <em>mister</em> <%= name %> from <%= from %> into&nbsp;&nbsp;<em>the city</em></p>
3
+
4
+ assigns: {}
5
+
6
+ locals:
7
+ :name: Vasia Pupkin
8
+ :from: Gonduras
9
+
10
+ phrases:
11
+ - 'Welcome [1]mister[/1] {name} from {from} into&nbsp;&nbsp;[2]the city[/2]'
12
+
13
+ translations:
14
+ - 'Willkommen [1]Herr[/1] {name} aus {from} in&nbsp;&nbsp;[2]der Stadt[/2]'
15
+
16
+ rendered: |
17
+ <p>Willkommen <em>Herr</em> Vasia Pupkin aus Gonduras in&nbsp;&nbsp;<em>der Stadt</em></p>
@@ -0,0 +1,19 @@
1
+ template: |
2
+ <td class="text">
3
+ <label for="merchant_address1"><i18n>Address 1</i18n> <span class="rA" i18n="i">*</span></label>
4
+ </td>
5
+
6
+ assigns: {}
7
+
8
+ locals: {}
9
+
10
+ phrases:
11
+ - 'Address 1'
12
+
13
+ translations:
14
+ - 'Адрессо одно'
15
+
16
+ rendered: |
17
+ <td class="text">
18
+ <label for="merchant_address1">Адрессо одно <span class="rA">*</span></label>
19
+ </td>
@@ -0,0 +1,15 @@
1
+ template: |
2
+ <label for="merchant_address1">Address 1<br/>(required)</label>
3
+
4
+ assigns: {}
5
+
6
+ locals: {}
7
+
8
+ phrases:
9
+ - 'Address 1[nl](required)'
10
+
11
+ translations:
12
+ - 'Адрессо одно[nl](обязательно)'
13
+
14
+ rendered: |
15
+ <label for="merchant_address1">Адрессо одно<br />(обязательно)</label>
@@ -0,0 +1,15 @@
1
+ template: |
2
+ <div><span><span>Welcome!</span></span></div> <script>alert("Hello!")</script>
3
+
4
+ assigns: {}
5
+
6
+ locals: {}
7
+
8
+ phrases:
9
+ - 'Welcome!'
10
+
11
+ translations:
12
+ - 'Бобро пожаловаться!'
13
+
14
+ rendered: |
15
+ <div><span><span>Бобро пожаловаться!</span></span></div> <script>alert("Hello!")</script>
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+ template: |
3
+ <div><span><span i18n="p">Welcome!</span></span> <span i18n="p">We are glad to meet you here</span></div>
4
+
5
+ assigns: {}
6
+
7
+ locals: {}
8
+
9
+ phrases:
10
+ - 'Welcome!'
11
+ - 'We are glad to meet you here'
12
+
13
+ translations:
14
+ - 'Бобро пожаловаться!'
15
+ - 'Век бы вас не видать'
16
+
17
+ rendered: |
18
+ <div><span><span>Бобро пожаловаться!</span></span> <span>Век бы вас не видать</span></div>
@@ -0,0 +1,35 @@
1
+ # encoding: UTF-8
2
+ template: |
3
+ <table>
4
+ <tr>
5
+ <th>First Name</th><td><%= first_name %></td>
6
+ </tr>
7
+ <tr>
8
+ <th>Last Name</th><td><%= last_name %></td>
9
+ </tr>
10
+ </table>
11
+
12
+ assigns: {}
13
+
14
+ locals:
15
+ :first_name: Jack
16
+ :last_name: Daniels
17
+
18
+ phrases:
19
+ - 'First Name'
20
+ - 'Last Name'
21
+
22
+ translations:
23
+ - '[1]Name[/1]'
24
+ - '[1]Nachname[/1]'
25
+
26
+ rendered: |
27
+ <table>
28
+ <tr>
29
+ <th>Name</th><td>Jack</td>
30
+ </tr>
31
+ <tr>
32
+ <th>Nachname</th><td>Daniels</td>
33
+ </tr>
34
+ </table>
35
+
@@ -0,0 +1,17 @@
1
+ template: |
2
+ <div>hello #{user}</div>
3
+ <span i18n="i">today is #{day}</span>
4
+
5
+ assigns: {}
6
+
7
+ locals: {}
8
+
9
+ phrases:
10
+ - "hello [ns][lcb]user[rcb]"
11
+
12
+ translations:
13
+ - "hallo [ns][lcb]benutzer[rcb]"
14
+
15
+ rendered: |
16
+ <div>hallo #{benutzer}</div>
17
+ <span>today is #{day}</span>
@@ -0,0 +1,17 @@
1
+ template: |
2
+ <div>hello [1]user[/1]</div>
3
+ <span i18n="i">today is [1]day[/1]</span>
4
+
5
+ assigns: {}
6
+
7
+ locals: {}
8
+
9
+ phrases:
10
+ - "hello [lsb]1[rsb]user[lsb]/1[rsb]"
11
+
12
+ translations:
13
+ - "hallo [lsb]1[rsb]benutzer[lsb]/1[rsb]"
14
+
15
+ rendered: |
16
+ <div>hallo [1]benutzer[/1]</div>
17
+ <span>today is [1]day[/1]</span>
@@ -0,0 +1,15 @@
1
+ template: |
2
+ <div><span><span>Welcome!</span></span></div>
3
+
4
+ assigns: {}
5
+
6
+ locals: {}
7
+
8
+ phrases:
9
+ - 'Welcome!'
10
+
11
+ translations:
12
+ - 'Бобро пожаловаться!'
13
+
14
+ rendered: |
15
+ <div><span><span>Бобро пожаловаться!</span></span></div>
@@ -0,0 +1,17 @@
1
+ # encoding: UTF-8
2
+ template: |
3
+ <div>Total price: <span><%= total_price %></span></div>
4
+
5
+ assigns: {}
6
+
7
+ locals:
8
+ :total_price: $10.99
9
+
10
+ phrases:
11
+ - 'Total price: [1]{total price}[/1]'
12
+
13
+ translations:
14
+ - 'Игого: [1]{total price}[/1]'
15
+
16
+ rendered: |
17
+ <div>Игого: <span>$10.99</span></div>
@@ -0,0 +1,46 @@
1
+ require 'abstract_unit'
2
+ require 'yaml'
3
+
4
+ class FixturesRenderingTest < ActionView::TestCase
5
+ include I18nTestCaseHelper
6
+
7
+ FIXTURES = Dir['test/fixtures/*.yml'].sort.map { |file_name|
8
+ name = File.basename(file_name, '.yml')
9
+ begin
10
+ data = YAML.load_file(file_name)
11
+ rescue => e
12
+ puts "Error occurs in fixture: #{file_name}"
13
+ raise e
14
+ end
15
+ [ name, data ]
16
+ }
17
+
18
+ FIXTURES.each do |name, data|
19
+ define_method("test_#{name}") do
20
+ %w(template assigns locals phrases translations rendered).each do |key|
21
+ data[key] or raise ArgumentError, "Please specify '#{key}' key"
22
+ end
23
+
24
+ data['assigns'].each do |key, val|
25
+ instance_variable_set("@#{key}", val)
26
+ end
27
+
28
+ data['phrases'].size.times do |i|
29
+ add_translation(data['phrases'][i], data['translations'][i])
30
+ end
31
+
32
+ document = I18nTemplate::Document.new(data['template'])
33
+ document.preprocess!
34
+ assert_equal(data['phrases'], document.phrases)
35
+
36
+ render({
37
+ :inline => data['template'],
38
+ :locals => data['locals'],
39
+ :type => :erb
40
+ })
41
+
42
+ assert_equal(data['rendered'], rendered)
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_unit'
3
+
4
+ class InlineRenderingTest < ActionView::TestCase
5
+ include I18nTestCaseHelper
6
+
7
+ def test_assigns
8
+ template = '<div>Comments count: <%= @post.comments.count %></div>'
9
+
10
+ add_translation 'Comments count: {post comments count}',
11
+ 'Anzahl die Kommentare: {post comments count}'
12
+
13
+ @post = Object.new
14
+ @post.instance_eval do
15
+ def comments
16
+ %w(one two three)
17
+ end
18
+ end
19
+
20
+ result = '<div>Anzahl die Kommentare: 3</div>'
21
+
22
+ render :inline => template, :type => :erb
23
+
24
+ assert_equal(result, rendered)
25
+ end
26
+
27
+ end
@@ -0,0 +1,12 @@
1
+ module I18nTestCaseHelper
2
+ def setup
3
+ super
4
+ I18n.backend.send(:translations).clear
5
+ end
6
+
7
+ def add_translation(key, value)
8
+ I18n.backend.store_translations(I18n.locale, {
9
+ key => value
10
+ })
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ <div>
2
+ Copyright <%= @current_year %>. All rights reserved.
3
+ </div>
@@ -0,0 +1 @@
1
+ <h2>Hello <%= @user_name %>, <%= message %></h2>
@@ -0,0 +1,5 @@
1
+ <html>
2
+ <body>
3
+ <%= yield %>
4
+ </body>
5
+ </html>
@@ -0,0 +1,3 @@
1
+ <div>
2
+ <strong>Email</strong>: <%= @account[:email] %>
3
+ </div>
@@ -0,0 +1,6 @@
1
+ <p>
2
+ <strong>First name</strong>: <%= @profile[:first_name] %>
3
+ </p>
4
+ <p>
5
+ <strong>Last name</strong>: <%= @profile[:last_name] %>
6
+ </p>
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <%- @user_names.each do |user_name| -%>
3
+ <li><%= user_name %></li>
4
+ <%- end -%>
5
+ </ul>
@@ -0,0 +1,4 @@
1
+ <div>
2
+ <%= render :partial => 'users/account' %>
3
+ <%= render :partial => 'users/profile' %>
4
+ </div>
@@ -0,0 +1,81 @@
1
+ # encoding: UTF-8
2
+ require 'abstract_unit'
3
+
4
+ class TemplatesRenderingTest < ActionView::TestCase
5
+ include I18nTestCaseHelper
6
+
7
+ def setup
8
+ ActionController::Base.view_paths = ['test/templates']
9
+ end
10
+
11
+ def test_partial_rendering_wo_translations
12
+ @current_year = 2011
13
+
14
+ render :partial=> 'footer'
15
+
16
+ assert_equal(<<-DATA, rendered)
17
+ <div>~Copyright 2011. All rights reserved.</div>
18
+ DATA
19
+ end
20
+
21
+ def test_file_rendering
22
+ @user_name = 'Jack Daniels'
23
+
24
+ add_translation 'Hello {user name}, {message}',
25
+ 'Привет {user name}, {message}'
26
+
27
+ render :file => 'greeting', :locals => {
28
+ :message => "Nice day today!"
29
+ }
30
+
31
+ assert_equal(<<-DATA, rendered)
32
+ <h2>Привет Jack Daniels, Nice day today!</h2>
33
+ DATA
34
+ end
35
+
36
+ def test_file_with_layout_rendering
37
+ @user_names = %w(bob alice)
38
+
39
+ render :file => 'users/index', :layout => 'layouts/application'
40
+
41
+ assert_equal(<<-DATA, rendered)
42
+ <html>
43
+ <body>
44
+ <ul>
45
+ <li>bob</li>
46
+ <li>alice</li>
47
+ </ul>
48
+
49
+ </body>
50
+ </html>
51
+ DATA
52
+ end
53
+
54
+ def test_file_with_partials_rendering
55
+ add_translation '[1]Email[/1]: {account email}',
56
+ '[1]Мыло[/1]: {account email}'
57
+
58
+ add_translation '[1]First name[/1]: {profile first name}',
59
+ '[1]Имя[/1]: {profile first name}'
60
+
61
+ add_translation '[1]Last name[/1]: {profile last name}',
62
+ '[1]Фамилия[/1]: {profile last name}'
63
+
64
+ @account = { :email => 'jack@daniels.com' }
65
+ @profile = { :first_name => 'Jack', :last_name => 'Daniels' }
66
+
67
+ render :file => 'users/show'
68
+
69
+ assert_equal(<<-DATA, rendered)
70
+ <div>
71
+ <div><strong>Мыло</strong>: jack@daniels.com</div>
72
+
73
+ <p><strong>Имя</strong>: Jack</p>
74
+ <p><strong>Фамилия</strong>: Daniels</p>
75
+
76
+ </div>
77
+ DATA
78
+ end
79
+
80
+ end
81
+