active_i18n 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 (138) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +105 -0
  4. data/Rakefile +35 -0
  5. data/app/assets/images/active_i18n/flags.png +0 -0
  6. data/app/assets/javascripts/active_i18n.js +1 -0
  7. data/app/assets/javascripts/active_i18n/layout.js.coffee +31 -0
  8. data/app/assets/stylesheets/active_i18n.css.sass +5 -0
  9. data/app/assets/stylesheets/active_i18n/application.css +13 -0
  10. data/app/assets/stylesheets/active_i18n/flags.css.scss +258 -0
  11. data/app/assets/stylesheets/active_i18n/list.css.sass +70 -0
  12. data/app/assets/stylesheets/active_i18n/sidebar.css.sass +60 -0
  13. data/app/assets/stylesheets/active_i18n/structure.css.sass +4 -0
  14. data/app/controllers/active_i18n/application_controller.rb +4 -0
  15. data/app/helpers/active_i18n/view_helper.rb +66 -0
  16. data/app/views/active_i18n/_content.html.haml +36 -0
  17. data/app/views/active_i18n/_sidebar.html.haml +5 -0
  18. data/app/views/layouts/active_i18n/application.html.erb +14 -0
  19. data/config/locales/en.yml +76 -0
  20. data/config/routes.rb +2 -0
  21. data/lib/active_i18n.rb +32 -0
  22. data/lib/active_i18n/active_admin.rb +28 -0
  23. data/lib/active_i18n/base_store.rb +42 -0
  24. data/lib/active_i18n/engine.rb +18 -0
  25. data/lib/active_i18n/translations_store.rb +26 -0
  26. data/lib/active_i18n/version.rb +3 -0
  27. data/lib/tasks/active_i18n_tasks.rake +4 -0
  28. data/spec/dummy/README.rdoc +261 -0
  29. data/spec/dummy/Rakefile +7 -0
  30. data/spec/dummy/app/admin/admin_users.rb +20 -0
  31. data/spec/dummy/app/admin/dashboard.rb +33 -0
  32. data/spec/dummy/app/admin/translation.rb +4 -0
  33. data/spec/dummy/app/assets/javascripts/active_admin.js +2 -0
  34. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  35. data/spec/dummy/app/assets/stylesheets/active_admin.css.scss +32 -0
  36. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  37. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  38. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  39. data/spec/dummy/app/models/admin_user.rb +17 -0
  40. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  41. data/spec/dummy/config.ru +4 -0
  42. data/spec/dummy/config/application.rb +66 -0
  43. data/spec/dummy/config/boot.rb +10 -0
  44. data/spec/dummy/config/database.yml +25 -0
  45. data/spec/dummy/config/environment.rb +5 -0
  46. data/spec/dummy/config/environments/development.rb +37 -0
  47. data/spec/dummy/config/environments/production.rb +67 -0
  48. data/spec/dummy/config/environments/test.rb +37 -0
  49. data/spec/dummy/config/initializers/active_admin.rb +210 -0
  50. data/spec/dummy/config/initializers/active_i18n.rb +3 -0
  51. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  52. data/spec/dummy/config/initializers/devise.rb +256 -0
  53. data/spec/dummy/config/initializers/inflections.rb +15 -0
  54. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  55. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  56. data/spec/dummy/config/initializers/session_store.rb +8 -0
  57. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  58. data/spec/dummy/config/locales/devise.en.yml +59 -0
  59. data/spec/dummy/config/locales/en.yml +5 -0
  60. data/spec/dummy/config/locales/en_test.yml +7 -0
  61. data/spec/dummy/config/locales/pl_test.yml +5 -0
  62. data/spec/dummy/config/routes.rb +7 -0
  63. data/spec/dummy/db/development.sqlite3 +0 -0
  64. data/spec/dummy/db/migrate/20140811102607_devise_create_admin_users.rb +48 -0
  65. data/spec/dummy/db/migrate/20140811102609_create_admin_notes.rb +17 -0
  66. data/spec/dummy/db/migrate/20140811102610_move_admin_notes_to_comments.rb +26 -0
  67. data/spec/dummy/db/schema.rb +49 -0
  68. data/spec/dummy/db/test.sqlite3 +0 -0
  69. data/spec/dummy/log/development.log +36840 -0
  70. data/spec/dummy/log/test.log +961 -0
  71. data/spec/dummy/public/404.html +26 -0
  72. data/spec/dummy/public/422.html +26 -0
  73. data/spec/dummy/public/500.html +25 -0
  74. data/spec/dummy/public/favicon.ico +0 -0
  75. data/spec/dummy/script/rails +6 -0
  76. data/spec/dummy/spec/factories/admin_users.rb +6 -0
  77. data/spec/dummy/spec/models/admin_user_spec.rb +5 -0
  78. data/spec/dummy/tmp/cache/assets/C58/410/sprockets%2F5c7886d2d5716b050cd38b9121769471 +0 -0
  79. data/spec/dummy/tmp/cache/assets/C7F/FE0/sprockets%2Fd8b50477b1b153638c7346534a0877da +0 -0
  80. data/spec/dummy/tmp/cache/assets/C8C/900/sprockets%2F1112043d14fe51296aa033bd024d0b78 +0 -0
  81. data/spec/dummy/tmp/cache/assets/C9A/D60/sprockets%2Fa62368179337c7154198e2786eeec9a8 +0 -0
  82. data/spec/dummy/tmp/cache/assets/CAD/C50/sprockets%2F8319a9f588005b0a424b90472c6a9a3f +0 -0
  83. data/spec/dummy/tmp/cache/assets/CAF/020/sprockets%2F9454bc172681345fa525aff08281b74c +0 -0
  84. data/spec/dummy/tmp/cache/assets/CB8/1D0/sprockets%2Fb510c0fc9803866436178e77582c7bad +0 -0
  85. data/spec/dummy/tmp/cache/assets/CBC/0B0/sprockets%2Fc0bba633769759659c7d4f0a2224499d +0 -0
  86. data/spec/dummy/tmp/cache/assets/CBF/620/sprockets%2F109dfac52e95799730667ba8e11e2765 +0 -0
  87. data/spec/dummy/tmp/cache/assets/CCD/670/sprockets%2F08edc1d5a073b0625304ba682985a24b +0 -0
  88. data/spec/dummy/tmp/cache/assets/CDB/040/sprockets%2Fc732474e67003a4eb840eb44c5ca9385 +0 -0
  89. data/spec/dummy/tmp/cache/assets/CDD/600/sprockets%2F65df7604a9339ce6a3d1923b472ee400 +0 -0
  90. data/spec/dummy/tmp/cache/assets/CE1/540/sprockets%2F305fa586dc7c7615d59e593120abf353 +0 -0
  91. data/spec/dummy/tmp/cache/assets/CEA/470/sprockets%2F8303f8f5f77c51100f64ff283ea6757a +0 -0
  92. data/spec/dummy/tmp/cache/assets/CEC/BA0/sprockets%2F7c5072074b471dff1cbf726f3786e548 +0 -0
  93. data/spec/dummy/tmp/cache/assets/D10/870/sprockets%2F5e7ab7f11ed7390a5ff8950121c40e49 +0 -0
  94. data/spec/dummy/tmp/cache/assets/D24/D10/sprockets%2Ff884c60f003f6ce75e3ef9f53891375a +0 -0
  95. data/spec/dummy/tmp/cache/assets/D28/200/sprockets%2Fb030b1c02160352cc756faec0ef883d5 +0 -0
  96. data/spec/dummy/tmp/cache/assets/D29/620/sprockets%2F3d664b0b71ca2fb901d77dce24215a32 +0 -0
  97. data/spec/dummy/tmp/cache/assets/D2D/2F0/sprockets%2Fd8ccd71f1767785f8489039e3d6c8a5b +0 -0
  98. data/spec/dummy/tmp/cache/assets/D33/CA0/sprockets%2F4dbc63d52f13068b8e72f3dd1107ba27 +0 -0
  99. data/spec/dummy/tmp/cache/assets/D36/2D0/sprockets%2Fcdfd2af48a61389a0dc7c751025504b7 +0 -0
  100. data/spec/dummy/tmp/cache/assets/D38/540/sprockets%2F86e1ad844bc9df4491a2a52b870421db +0 -0
  101. data/spec/dummy/tmp/cache/assets/D41/DE0/sprockets%2F9c89ee33751a67901a0ceead0d82781b +0 -0
  102. data/spec/dummy/tmp/cache/assets/D43/110/sprockets%2Fd5e364fe2e128443f5250e419af9bbc8 +0 -0
  103. data/spec/dummy/tmp/cache/assets/D44/3F0/sprockets%2F29e1206c858c89cf5453cf370dc2eca4 +0 -0
  104. data/spec/dummy/tmp/cache/assets/D45/110/sprockets%2F87892bd05e664b62bdbbc1e3704b67d9 +0 -0
  105. data/spec/dummy/tmp/cache/assets/D45/240/sprockets%2F5fa87c4a361e5f2866c52e12257c9ead +0 -0
  106. data/spec/dummy/tmp/cache/assets/D46/EB0/sprockets%2F663efa9a78c238c8a3aaf09a07d74627 +0 -0
  107. data/spec/dummy/tmp/cache/assets/D48/640/sprockets%2F9f4f18d910b678b1d0777e04cdaf6f24 +0 -0
  108. data/spec/dummy/tmp/cache/assets/D4B/C50/sprockets%2Ff28e143f4b4887e0f5e8cff05227c55b +0 -0
  109. data/spec/dummy/tmp/cache/assets/D59/D70/sprockets%2Fed9f0de1b65ae8d7ef89087c83728461 +0 -0
  110. data/spec/dummy/tmp/cache/assets/D60/F90/sprockets%2F85a232fb35c16bf87279047aa1ccbbb2 +0 -0
  111. data/spec/dummy/tmp/cache/assets/D62/770/sprockets%2F76a285eb6576ee1f11132bcd07f0eea0 +0 -0
  112. data/spec/dummy/tmp/cache/assets/D67/0C0/sprockets%2F09eed8ed6f341c0c429007ab0219ee7c +0 -0
  113. data/spec/dummy/tmp/cache/assets/D68/E10/sprockets%2F36d13da052a68af78a38a6dec93bd900 +0 -0
  114. data/spec/dummy/tmp/cache/assets/D6C/2F0/sprockets%2F107964995ee0c0bae0b46fdae574fa42 +0 -0
  115. data/spec/dummy/tmp/cache/assets/D6D/540/sprockets%2Fedbc4e34cd1e2cc70b7428678932aa92 +0 -0
  116. data/spec/dummy/tmp/cache/assets/D72/C80/sprockets%2Fa1430f4544581c9e76e56fcfdbe41c3e +0 -0
  117. data/spec/dummy/tmp/cache/assets/D7B/5F0/sprockets%2Fa4b788c26c44568cb71b3c79edc4b7f4 +0 -0
  118. data/spec/dummy/tmp/cache/assets/D8A/7E0/sprockets%2F2ce302007a5d81840ddc07b7cb1d5ffc +0 -0
  119. data/spec/dummy/tmp/cache/assets/D8F/670/sprockets%2F810ec022c6fe22bdec817bd7c0d808c1 +0 -0
  120. data/spec/dummy/tmp/cache/assets/D93/4C0/sprockets%2F857ecd2092cee11f740b3cf2e373ad2a +0 -0
  121. data/spec/dummy/tmp/cache/assets/D97/F90/sprockets%2Fc016a87d244c59a9a39ca8a90febe10b +0 -0
  122. data/spec/dummy/tmp/cache/assets/DA4/970/sprockets%2Fa93e382f3ec0e5b8cf765c062b946bcd +0 -0
  123. data/spec/dummy/tmp/cache/assets/DA8/D80/sprockets%2F0c96c0d9696bd756aad0d36bcf77db47 +0 -0
  124. data/spec/dummy/tmp/cache/assets/DBB/7C0/sprockets%2F00b6b9b17a4f12bae8eb17ef61abe731 +0 -0
  125. data/spec/dummy/tmp/cache/assets/DC7/A30/sprockets%2F5c6134fae4cb1a1dc4ae77cf661d42e9 +0 -0
  126. data/spec/dummy/tmp/cache/assets/DC9/A70/sprockets%2Fa0ca172bddf418f3ccd34a8e77725a8d +0 -0
  127. data/spec/dummy/tmp/cache/assets/DCE/840/sprockets%2F266fbe1ca258f3ccfec16753dafd4409 +0 -0
  128. data/spec/dummy/tmp/cache/assets/DDE/420/sprockets%2Ffb8b186d5bf0307f86f65fc787d2adeb +0 -0
  129. data/spec/dummy/tmp/cache/assets/DEE/CC0/sprockets%2Fa3dbe0de23a16d72f3abc3cd9388b80a +0 -0
  130. data/spec/dummy/tmp/cache/assets/DF1/BE0/sprockets%2Fcbdfaa7ea4d66d31e20da6754b4534dc +0 -0
  131. data/spec/dummy/tmp/cache/assets/DFA/E20/sprockets%2Ffe14bdb79b2a9dbf0b539198d3aba6b4 +0 -0
  132. data/spec/dummy/tmp/cache/assets/E27/B80/sprockets%2Fbced6cfc13bcfab45a1fa5b479d15486 +0 -0
  133. data/spec/dummy/tmp/cache/assets/E57/9A0/sprockets%2Fdf25986ad4babcf83acc6ac19e2a04fd +0 -0
  134. data/spec/lib/active_i18n_base_score_spec.rb +21 -0
  135. data/spec/lib/active_i18n_spec.rb +27 -0
  136. data/spec/lib/active_i18n_translations_store_spec.rb +34 -0
  137. data/spec/spec_helper.rb +15 -0
  138. metadata +471 -0
@@ -0,0 +1,70 @@
1
+ .active-i19n-list > .lang
2
+ height: 35px
3
+
4
+
5
+ .active-i19n-list > .panel
6
+ background: transparent
7
+ & > h3
8
+ margin-bottom: 0
9
+ & > *
10
+ color: #7f8c8d
11
+ font-weight: 400
12
+ padding-right: 6px
13
+ font-size: 14px
14
+ text-decoration: none
15
+ i.fa
16
+ margin-right: 5px
17
+ color: #2c3e50
18
+ .panel_contents
19
+ padding: 0
20
+
21
+
22
+ .active-i19n-list .translation
23
+ border-bottom: #d3d8dc 1px solid
24
+ font-size: 14px
25
+ & > div
26
+ min-height: 90px
27
+ border-bottom: #d3d8dc 1px solid
28
+ text-overflow: ellipsis
29
+ overflow: hidden
30
+ &:last-child
31
+ border: none
32
+ .original
33
+ background: #fff
34
+ overflow: hidden
35
+ .lang
36
+ border-color: transparent
37
+
38
+ .lang
39
+ color: #7f8c8d
40
+ float: left
41
+ width: 130px
42
+ height: 90px
43
+ p
44
+ padding: 12px 15px
45
+ margin-bottom: 0
46
+ .flag
47
+ margin-right: 8px
48
+ .content-wrapper
49
+ border-left: #d3d8dc 1px solid
50
+ margin-left: 130px
51
+ min-height: 90px
52
+ .content
53
+ padding: 12px 15px
54
+ &.blank
55
+ color: #7f8c8d
56
+ font-style: italic
57
+ fieldset.inputs
58
+ padding-top: 0px
59
+ background: transparent
60
+ border: none
61
+ margin-bottom: 0px
62
+ padding-bottom: 0
63
+ textarea
64
+ height: 50px
65
+ fieldset.actions
66
+ margin-left: 10px
67
+ margin-top: 0px
68
+ padding-top: 0px
69
+ .translated .content-wrapper .content
70
+ cursor: pointer
@@ -0,0 +1,60 @@
1
+ .admin_translations #sidebar
2
+ .sidebar_section
3
+ background: transparent
4
+ .panel_contents
5
+ margin: 0
6
+ padding: 0
7
+ form.filter_form
8
+ padding: 15px
9
+ border-bottom: 1px solid #d3d8dc
10
+ input
11
+ padding: 8px
12
+ .scopes-list
13
+ padding: 15px
14
+ color: #7f8c8d
15
+ font-size: 13px
16
+ p
17
+ padding: 0 0 4px 0
18
+ margin: 0
19
+ i.fa
20
+ margin-right: 8px
21
+ color: #2c3e50
22
+ ul
23
+ list-style: none
24
+ padding: 0
25
+ margin: 0
26
+ ul ul
27
+ border-left: #d3d8dc 1px solid
28
+ margin-left: 5px
29
+ li
30
+ list-style: none
31
+ padding: 0
32
+ margin: 0
33
+ padding: 2px 0 2px 10px
34
+
35
+ li li
36
+ background: image-url("active_i18n/li.png") no-repeat 0 10px
37
+ &:last-child
38
+ padding-bottom: 0
39
+ li.unselected ul
40
+ display: none
41
+ li.selected > p
42
+ a
43
+ color: #2c3e50
44
+ font-weight: 600
45
+ & > i
46
+ &.close
47
+ display: none
48
+ &.open
49
+ display: inline
50
+ color: #e74c3c
51
+ li.unselected > p > i
52
+ &.close
53
+ display: inline
54
+ &.open
55
+ display: none
56
+ a
57
+ color: #7f8c8d
58
+ text-decoration: none
59
+ &:hover
60
+ text-decoration: underline
@@ -0,0 +1,4 @@
1
+ .admin_translations #sidebar
2
+
3
+ .admin_translations #main_content_wrapper
4
+
@@ -0,0 +1,4 @@
1
+ module ActiveI18n
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,66 @@
1
+ module ActiveI18n
2
+ module ViewHelper
3
+ def render_scopes
4
+ capture_haml do
5
+ ActiveI18n::BaseStore.scopes.each_pair do |key, value|
6
+ haml_concat li_scope(key, value, key.to_s)
7
+ end
8
+ end
9
+ end
10
+
11
+ def available_locales
12
+ capture_haml do
13
+ haml_tag :select, id: "change_locale" do
14
+ I18n.available_locales.each do |locale|
15
+ haml_tag :option,
16
+ value: locale,
17
+ selected: locale == ActiveI18n.locale,
18
+ data: {url: url_for(translation_locale: locale)} do
19
+ haml_concat [locale.to_s, I18n.t(locale, :scope => "active_i18n.languages", :locale => :en)].join(" - ")
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ def li_scope(key, value, scope)
27
+ return unless ActiveI18n::BaseStore.is_scope?(value)
28
+ capture_haml do
29
+ haml_tag :li, :class => params[:scope].to_s.match(scope) ? "selected" : "unselected" do
30
+ haml_tag :p do
31
+ haml_tag(:i, "", :class => "close fa fa-folder")
32
+ haml_tag(:i, "", :class => "open fa fa-folder-open")
33
+ haml_tag :a, :href => admin_translations_path(scope: scope) do
34
+ haml_concat key
35
+ end
36
+ end
37
+ haml_tag :ul do
38
+ haml_concat value.collect{|k, v| li_scope(k, v, scope+"."+k.to_s)}.join("").html_safe
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ def scope_table(scope)
45
+ capture_haml do
46
+ ActiveI18n::BaseStore.translations(scope).each do |e|
47
+
48
+ end
49
+ end
50
+ end
51
+
52
+ def linkify_scope(scope="")
53
+ link_scopes = []
54
+ capture_haml do
55
+ scope.to_s.split(".").each_with_index do |key, i|
56
+ haml_tag :span, ">>", :class => "breadcrumb_sep" if i!=0
57
+ link_scopes.push key
58
+ haml_tag :a, :href => admin_translations_path(scope: link_scopes.join(".")) do
59
+ haml_tag :i, :class => "fa fa-folder-open"
60
+ haml_concat key.to_s
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,36 @@
1
+ .active-i19n-list
2
+ .lang= available_locales
3
+
4
+ .panel
5
+ %h3=linkify_scope(params[:scope])
6
+
7
+ .panel_contents
8
+ - ActiveI18n::BaseStore.translations(params[:scope]).each do |key_value|
9
+ .translation
10
+ .original
11
+ .lang
12
+ %p
13
+ %i.flag{:class => "flag-#{I18n.default_locale.to_s}"}
14
+ = t(I18n.default_locale, :scope => "active_i18n.languages")
15
+ .content-wrapper
16
+ .content
17
+ = I18n.t(key_value[0], :scope => params[:scope], :locale => I18n.default_locale)
18
+ .translated
19
+ .lang
20
+ %p
21
+ %i.flag{class: "flag-#{ActiveI18n.locale}"}
22
+ = t(ActiveI18n.locale, :scope => "active_i18n.languages")
23
+ - if false
24
+ %p
25
+ %b ONE
26
+ .content-wrapper
27
+ .content{:class => I18n.t(key_value[0], :scope => params[:scope], :locale => ActiveI18n.locale, :default => "").present? ? "present" : "blank"}
28
+ = I18n.t(key_value[0], :scope => params[:scope], :locale => ActiveI18n.locale, :default => t(:no_translation, :scope => "active_i18n.labels"))
29
+ = semantic_form_for "translation", url: url_for(scope: params[:scope], key: key_value[0], :action => "translate") do |f|
30
+ = f.inputs do
31
+ = f.input :content, :as => :text, :label => false, :input_html => {:value => I18n.t(key_value[0], :scope => params[:scope], :locale => ActiveI18n.locale, :default => "")}
32
+ = f.actions do
33
+ = f.action :submit, :as => :input
34
+ = f.action :cancel, :as => :link, :wrapper_html => {:class => "cancel"}
35
+
36
+
@@ -0,0 +1,5 @@
1
+
2
+ %form.filter_form{style: "display: none"}
3
+ %input{type: "text", placeholder: I18n.t("active_i18n.labels.search_placecholder")}
4
+ .scopes-list
5
+ %ul= render_scopes
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>ActiveI18n</title>
5
+ <%= stylesheet_link_tag "active_i18n/application", :media => "all" %>
6
+ <%= javascript_include_tag "active_i18n/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,76 @@
1
+ en:
2
+ active_i18n:
3
+ labels:
4
+ translations: Translations
5
+ scopes: "Scopes"
6
+ search:placecholder: Search translation
7
+ no_translation: No translation
8
+ languages:
9
+ af: Afrikaans
10
+ sq: Albanian
11
+ ar: Arabic
12
+ eu: Basque
13
+ be: Belarusian
14
+ bs: Bosnian
15
+ bg: Bulgarian
16
+ ca: Catalan
17
+ hr: Croatian
18
+ zh_cn: Chinese
19
+ zh_tw: Chinese
20
+ cs: Czech
21
+ da: Danish
22
+ nl: Dutch
23
+ en: English
24
+ en:us: English
25
+ et: Estonian
26
+ fa: Farsi
27
+ fil: Filipino
28
+ fi: Finnish
29
+ fr: French
30
+ ga: Gaelic
31
+ gl: Gallego
32
+ ka: Georgian
33
+ de: German
34
+ de:du: German
35
+ el: Greek
36
+ gu: Gujarati
37
+ he: Hebrew
38
+ hi: Hindi
39
+ hu: Hungarian
40
+ is: Icelandic
41
+ id: Indonesian
42
+ it: Italian
43
+ ja: Japanese
44
+ kn: Kannada
45
+ km: Khmer
46
+ ko: Korean
47
+ lo: Lao
48
+ lt: Lithuanian
49
+ lv: Latvian
50
+ ml: Malayalam
51
+ ms: Malaysian
52
+ mi:tn: Maori
53
+ mi:wwow: Maori
54
+ mn: Mongolian
55
+ no: Norwegian
56
+ no:gr: Norwegian
57
+ nn: Nynorsk
58
+ pl: Polish
59
+ pt: Portuguese
60
+ pt:br: Portuguese
61
+ ro: Romanian
62
+ ru: Russian
63
+ sm: Samoan
64
+ sr: Serbian
65
+ sk: Slovak
66
+ sl: Slovenian
67
+ so: Somali
68
+ es: Spanish
69
+ sv: Swedish
70
+ tl: Tagalog
71
+ ta: Tamil
72
+ th: Thai
73
+ to: Tongan
74
+ tr: Turkish
75
+ uk: Ukrainian
76
+ vi: Vietnamese
@@ -0,0 +1,2 @@
1
+ ActiveI18n::Engine.routes.draw do
2
+ end
@@ -0,0 +1,32 @@
1
+ require "activeadmin"
2
+ require "active_i18n/engine"
3
+ require "active_i18n/base_store"
4
+ require "active_i18n/translations_store"
5
+ require "active_i18n/active_admin"
6
+
7
+ module ActiveI18n
8
+ def self.config(config)
9
+ throw "You have to define store for translations" unless config[:store]
10
+ translations_store = config[:store]
11
+ base_store = I18n.backend
12
+ I18n.backend = I18n::Backend::Chain.new(translations_store, base_store)
13
+ BaseStore.set_backend(base_store)
14
+ BaseStore.set_except_filter(config[:except]) if config[:except]
15
+ TranslationsStore.set_backend(translations_store)
16
+ end
17
+
18
+ def self.store_translation(value, scope)
19
+ TranslationsStore.store_translation(value, scope, locale)
20
+ end
21
+
22
+ def self.setLocale(locale)
23
+ if I18n.available_locales.include?(locale.to_sym)
24
+ @locale = locale.to_sym
25
+ return true
26
+ end
27
+ end
28
+
29
+ def self.locale
30
+ @locale ||= I18n.available_locales.sort{|a| a == I18n.default_locale ? 1 : -1}.first
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+
2
+ ActiveAdmin.module_eval do
3
+ def self.register_translation name, menu_options = {}
4
+
5
+ self.register_page name do
6
+ menu({:label => proc{ I18n.t("active_i18n.labels.translations") }}.merge(menu_options))
7
+
8
+ sidebar "Translations", :class => "active", :partial => "active_i18n/sidebar"
9
+
10
+ content do
11
+ render("active_i18n/content")
12
+ end
13
+
14
+ controller do
15
+ before_filter :set_locale, :only => :index
16
+
17
+ def set_locale
18
+ ActiveI18n.setLocale(params[:translation_locale]) if params[:translation_locale]
19
+ end
20
+ end
21
+
22
+ page_action :translate, :method => :post do
23
+ ActiveI18n.store_translation(params[:translation], [params[:scope], params[:key]].join("."))
24
+ render :text => params[:translation]
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,42 @@
1
+ module ActiveI18n
2
+ module BaseStore
3
+ extend(Module.new {
4
+ def set_backend(backend)
5
+ @backend = backend
6
+ end
7
+
8
+ def set_except_filter(array)
9
+ @except_filter = array
10
+ end
11
+
12
+ def scopes
13
+ translations_hash
14
+ end
15
+
16
+ def translations_hash
17
+ t = @backend.send(:translations)[I18n.default_locale]
18
+ t = filter(t) if @except_filter
19
+ t
20
+ end
21
+
22
+ def translations(scope)
23
+ return [] unless scope
24
+ scope.split(".").inject(translations_hash){|m,e| m = m[e.to_sym]}.select{|a| !is_scope?(a)}
25
+ end
26
+
27
+ def is_scope?(value)
28
+ value.kind_of? Hash
29
+ end
30
+
31
+ def filter(original)
32
+ @except_filter.each do |except_scope|
33
+ if except_scope.to_s.split(".").size > 1
34
+ else
35
+ original = original.except(except_scope.to_sym)
36
+ end
37
+ end
38
+ original
39
+ end
40
+ })
41
+ end
42
+ end