awesome_translations 0.0.2

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 (168) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +30 -0
  4. data/Rakefile +23 -0
  5. data/app/assets/javascripts/awesome_translations/application.js +13 -0
  6. data/app/assets/stylesheets/awesome_translations/application.css.scss +14 -0
  7. data/app/assets/stylesheets/awesome_translations/groups.css.scss +18 -0
  8. data/app/assets/stylesheets/awesome_translations/layout.css.scss +51 -0
  9. data/app/controllers/awesome_translations/application_controller.rb +4 -0
  10. data/app/controllers/awesome_translations/groups_controller.rb +38 -0
  11. data/app/controllers/awesome_translations/handlers_controller.rb +17 -0
  12. data/app/controllers/awesome_translations/translations_controller.rb +4 -0
  13. data/app/helpers/awesome_translations/application_helper.rb +4 -0
  14. data/app/models/awesome_translations/group.rb +43 -0
  15. data/app/models/awesome_translations/handler.rb +45 -0
  16. data/app/models/awesome_translations/translated_value.rb +47 -0
  17. data/app/models/awesome_translations/translation.rb +88 -0
  18. data/app/views/awesome_translations/groups/show.html.haml +28 -0
  19. data/app/views/awesome_translations/handlers/index.html.haml +13 -0
  20. data/app/views/awesome_translations/handlers/show.html.haml +12 -0
  21. data/app/views/layouts/awesome_translations/application.html.haml +24 -0
  22. data/config/routes.rb +7 -0
  23. data/lib/awesome_translations.rb +18 -0
  24. data/lib/awesome_translations/config.rb +7 -0
  25. data/lib/awesome_translations/engine.rb +3 -0
  26. data/lib/awesome_translations/erb_inspector.rb +45 -0
  27. data/lib/awesome_translations/erb_inspector/file_inspector.rb +88 -0
  28. data/lib/awesome_translations/erb_inspector/translation_inspector.rb +69 -0
  29. data/lib/awesome_translations/handlers.rb +25 -0
  30. data/lib/awesome_translations/handlers/base_handler.rb +2 -0
  31. data/lib/awesome_translations/handlers/erb_handler.rb +35 -0
  32. data/lib/awesome_translations/handlers/global_handler.rb +31 -0
  33. data/lib/awesome_translations/handlers/model_handler.rb +95 -0
  34. data/lib/awesome_translations/handlers/validations_handler.rb +70 -0
  35. data/lib/awesome_translations/model_inspector.rb +137 -0
  36. data/lib/awesome_translations/model_inspector/attribute.rb +12 -0
  37. data/lib/awesome_translations/object_extensions.rb +13 -0
  38. data/lib/awesome_translations/version.rb +3 -0
  39. data/lib/tasks/awesome_translations_tasks.rake +29 -0
  40. data/spec/controllers/groups_controller_spec.rb +34 -0
  41. data/spec/controllers/handlers_controller_spec.rb +16 -0
  42. data/spec/controllers/users_controller_spec.rb +18 -0
  43. data/spec/dummy/README.rdoc +28 -0
  44. data/spec/dummy/Rakefile +6 -0
  45. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  46. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  47. data/spec/dummy/app/controllers/application_controller.rb +17 -0
  48. data/spec/dummy/app/controllers/locales_controller.rb +6 -0
  49. data/spec/dummy/app/controllers/users_controller.rb +32 -0
  50. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  51. data/spec/dummy/app/models/role.rb +4 -0
  52. data/spec/dummy/app/models/user.rb +7 -0
  53. data/spec/dummy/app/views/layouts/application.html.haml +21 -0
  54. data/spec/dummy/app/views/users/_partial_test.html.haml +1 -0
  55. data/spec/dummy/app/views/users/index.html.haml +16 -0
  56. data/spec/dummy/app/views/users/show.html.erb +6 -0
  57. data/spec/dummy/bin/bundle +3 -0
  58. data/spec/dummy/bin/rails +4 -0
  59. data/spec/dummy/bin/rake +4 -0
  60. data/spec/dummy/config.ru +4 -0
  61. data/spec/dummy/config/application.rb +28 -0
  62. data/spec/dummy/config/boot.rb +5 -0
  63. data/spec/dummy/config/database.yml +25 -0
  64. data/spec/dummy/config/environment.rb +5 -0
  65. data/spec/dummy/config/environments/development.rb +32 -0
  66. data/spec/dummy/config/environments/production.rb +80 -0
  67. data/spec/dummy/config/environments/test.rb +39 -0
  68. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  69. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  70. data/spec/dummy/config/initializers/inflections.rb +16 -0
  71. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  72. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  73. data/spec/dummy/config/initializers/session_store.rb +3 -0
  74. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  75. data/spec/dummy/config/locales/awesome_translations/app/views/users/da.yml +5 -0
  76. data/spec/dummy/config/locales/awesome_translations/app/views/users/de.yml +5 -0
  77. data/spec/dummy/config/locales/awesome_translations/app/views/users/en.yml +5 -0
  78. data/spec/dummy/config/locales/awesome_translations/da.yml +4 -0
  79. data/spec/dummy/config/locales/awesome_translations/de.yml +4 -0
  80. data/spec/dummy/config/locales/awesome_translations/en.yml +4 -0
  81. data/spec/dummy/config/locales/awesome_translations/models/role/da.yml +6 -0
  82. data/spec/dummy/config/locales/awesome_translations/models/role/de.yml +6 -0
  83. data/spec/dummy/config/locales/awesome_translations/models/role/en.yml +6 -0
  84. data/spec/dummy/config/locales/awesome_translations/models/user/da.yml +12 -0
  85. data/spec/dummy/config/locales/awesome_translations/models/user/de.yml +12 -0
  86. data/spec/dummy/config/locales/awesome_translations/models/user/en.yml +12 -0
  87. data/spec/dummy/config/locales/en.yml +23 -0
  88. data/spec/dummy/config/routes.rb +7 -0
  89. data/spec/dummy/db/development.sqlite3 +0 -0
  90. data/spec/dummy/db/migrate/20141018081559_create_users.rb +9 -0
  91. data/spec/dummy/db/migrate/20141018081640_create_roles.rb +10 -0
  92. data/spec/dummy/db/schema.rb +29 -0
  93. data/spec/dummy/db/test.sqlite3 +0 -0
  94. data/spec/dummy/log/development.log +16953 -0
  95. data/spec/dummy/log/test.log +4992 -0
  96. data/spec/dummy/public/404.html +58 -0
  97. data/spec/dummy/public/422.html +58 -0
  98. data/spec/dummy/public/500.html +57 -0
  99. data/spec/dummy/public/favicon.ico +0 -0
  100. data/spec/dummy/tmp/cache/assets/development/sass/79bc6a1530be4e47bb2bf0dda4943bc0e439789f/application.css.scssc +0 -0
  101. data/spec/dummy/tmp/cache/assets/development/sass/79bc6a1530be4e47bb2bf0dda4943bc0e439789f/groups.css.scssc +0 -0
  102. data/spec/dummy/tmp/cache/assets/development/sass/79bc6a1530be4e47bb2bf0dda4943bc0e439789f/layout.css.scssc +0 -0
  103. data/spec/dummy/tmp/cache/assets/development/sprockets/0cc5658eb161251c8bd64e1cf25e2191 +0 -0
  104. data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  105. data/spec/dummy/tmp/cache/assets/development/sprockets/1dfc909a73e53e47b341f67cfd8a3fc3 +0 -0
  106. data/spec/dummy/tmp/cache/assets/development/sprockets/2128d293dc8ef13115c1f5d64b5acfc9 +0 -0
  107. data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  108. data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  109. data/spec/dummy/tmp/cache/assets/development/sprockets/3bd5629974bb1919d009bcb1da7a7e49 +0 -0
  110. data/spec/dummy/tmp/cache/assets/development/sprockets/50b9bcf05a8718d9cb5b99276f154ea9 +0 -0
  111. data/spec/dummy/tmp/cache/assets/development/sprockets/5316fc0620afefc2ba81b690c8e2c34d +0 -0
  112. data/spec/dummy/tmp/cache/assets/development/sprockets/538966109f3bbd58bfb717ad57a37096 +0 -0
  113. data/spec/dummy/tmp/cache/assets/development/sprockets/58b9ed99ad62ba462ca6a9272b96bef3 +0 -0
  114. data/spec/dummy/tmp/cache/assets/development/sprockets/697d977cf9fc7e54534f5e29b0832836 +0 -0
  115. data/spec/dummy/tmp/cache/assets/development/sprockets/6aab60b365535cc305f37a738e75868b +0 -0
  116. data/spec/dummy/tmp/cache/assets/development/sprockets/6db8498274efddac6691248cc9afe855 +0 -0
  117. data/spec/dummy/tmp/cache/assets/development/sprockets/81ab882fef1228d654a7c697f2324309 +0 -0
  118. data/spec/dummy/tmp/cache/assets/development/sprockets/908bf508cc68079cab720d6b9c36cb95 +0 -0
  119. data/spec/dummy/tmp/cache/assets/development/sprockets/91090eda0f104056144ac17a4fcae91c +0 -0
  120. data/spec/dummy/tmp/cache/assets/development/sprockets/a3c8104e5830cd7047c6a3a1c1e2ba32 +0 -0
  121. data/spec/dummy/tmp/cache/assets/development/sprockets/b512f2b016bd3aef8c28fa661e01308c +0 -0
  122. data/spec/dummy/tmp/cache/assets/development/sprockets/bd49bb0a6f5dfd284a750fb9cab40d85 +0 -0
  123. data/spec/dummy/tmp/cache/assets/development/sprockets/c39fce5fa19b758734af29527d4185ca +0 -0
  124. data/spec/dummy/tmp/cache/assets/development/sprockets/c8ecba0dbc7774cd6db79cb7fbe1ef3e +0 -0
  125. data/spec/dummy/tmp/cache/assets/development/sprockets/cb595904fcf7acdedf2b95571442fc59 +0 -0
  126. data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  127. data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  128. data/spec/dummy/tmp/cache/assets/development/sprockets/eb9ed717a7ef467bf260b11dfc8451eb +0 -0
  129. data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  130. data/spec/dummy/tmp/cache/assets/test/sass/79bc6a1530be4e47bb2bf0dda4943bc0e439789f/application.css.scssc +0 -0
  131. data/spec/dummy/tmp/cache/assets/test/sass/79bc6a1530be4e47bb2bf0dda4943bc0e439789f/groups.css.scssc +0 -0
  132. data/spec/dummy/tmp/cache/assets/test/sass/79bc6a1530be4e47bb2bf0dda4943bc0e439789f/layout.css.scssc +0 -0
  133. data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  134. data/spec/dummy/tmp/cache/assets/test/sprockets/2128d293dc8ef13115c1f5d64b5acfc9 +0 -0
  135. data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  136. data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  137. data/spec/dummy/tmp/cache/assets/test/sprockets/50b9bcf05a8718d9cb5b99276f154ea9 +0 -0
  138. data/spec/dummy/tmp/cache/assets/test/sprockets/5316fc0620afefc2ba81b690c8e2c34d +0 -0
  139. data/spec/dummy/tmp/cache/assets/test/sprockets/538966109f3bbd58bfb717ad57a37096 +0 -0
  140. data/spec/dummy/tmp/cache/assets/test/sprockets/58b9ed99ad62ba462ca6a9272b96bef3 +0 -0
  141. data/spec/dummy/tmp/cache/assets/test/sprockets/697d977cf9fc7e54534f5e29b0832836 +0 -0
  142. data/spec/dummy/tmp/cache/assets/test/sprockets/6aab60b365535cc305f37a738e75868b +0 -0
  143. data/spec/dummy/tmp/cache/assets/test/sprockets/6db8498274efddac6691248cc9afe855 +0 -0
  144. data/spec/dummy/tmp/cache/assets/test/sprockets/81ab882fef1228d654a7c697f2324309 +0 -0
  145. data/spec/dummy/tmp/cache/assets/test/sprockets/908bf508cc68079cab720d6b9c36cb95 +0 -0
  146. data/spec/dummy/tmp/cache/assets/test/sprockets/91090eda0f104056144ac17a4fcae91c +0 -0
  147. data/spec/dummy/tmp/cache/assets/test/sprockets/a3c8104e5830cd7047c6a3a1c1e2ba32 +0 -0
  148. data/spec/dummy/tmp/cache/assets/test/sprockets/b512f2b016bd3aef8c28fa661e01308c +0 -0
  149. data/spec/dummy/tmp/cache/assets/test/sprockets/bd49bb0a6f5dfd284a750fb9cab40d85 +0 -0
  150. data/spec/dummy/tmp/cache/assets/test/sprockets/c39fce5fa19b758734af29527d4185ca +0 -0
  151. data/spec/dummy/tmp/cache/assets/test/sprockets/cb595904fcf7acdedf2b95571442fc59 +0 -0
  152. data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  153. data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  154. data/spec/dummy/tmp/cache/assets/test/sprockets/eb9ed717a7ef467bf260b11dfc8451eb +0 -0
  155. data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  156. data/spec/factories/user.rb +7 -0
  157. data/spec/handlers/erb_handler_spec.rb +35 -0
  158. data/spec/handlers/global_handler_spec.rb +19 -0
  159. data/spec/handlers/model_handler_spec.rb +30 -0
  160. data/spec/handlers/validations_handler_spec.rb +25 -0
  161. data/spec/handlers_spec.rb +9 -0
  162. data/spec/lib/erb_inspector/file_inspector_spec.rb +21 -0
  163. data/spec/lib/erb_inspector/translation_inspector_spec.rb +23 -0
  164. data/spec/lib/erb_inspector_spec.rb +26 -0
  165. data/spec/models/awesome_translations/handler_spec.rb +8 -0
  166. data/spec/models/awesome_translations/translated_value_spec.rb +43 -0
  167. data/spec/spec_helper.rb +56 -0
  168. metadata +505 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: eb9aa28cecb9db09e8e5b94091ee641118f753da
4
+ data.tar.gz: 10209c2fad35cfebb5b404f3a037c437a180844a
5
+ SHA512:
6
+ metadata.gz: c5c58a3b8caeefb176258e7edc2dc6c310a65c984ce04c7886d2c25b55a69d20901a5c8ce61ebe8c43ace2d08421db038eeadd061b345338a3f7e74330b09e1a
7
+ data.tar.gz: 7c0c29cb0deba63f6e46bc109fb4ba08317b155c20903d45a3958ebe12c5742f9d1aa9275d3151460e08651260063438926dc1b32042f6a87526e2badf6e7fe0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2014 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ [![Build Status](https://api.shippable.com/projects/544232fcb904a4b21567a417/badge?branchName=master)](https://app.shippable.com/projects/544232fcb904a4b21567a417/builds/latest)
2
+ [![Code Climate](https://codeclimate.com/github/kaspernj/awesome_translations/badges/gpa.svg)](https://codeclimate.com/github/kaspernj/awesome_translations)
3
+ [![Test Coverage](https://codeclimate.com/github/kaspernj/awesome_translations/badges/coverage.svg)](https://codeclimate.com/github/kaspernj/awesome_translations)
4
+
5
+ # AwesomeTranslations
6
+
7
+ ## Install
8
+
9
+ ```ruby
10
+ gem 'awesome_translations', group: :development
11
+ ```
12
+
13
+ Then run the following:
14
+ ```
15
+ bundle exec rake awesome_translations:install
16
+ ```
17
+
18
+ Insert this into your "routes.rb" file:
19
+ ```ruby
20
+ mount AwesomeTranslations::Engine => "/awesome_translations" if Rails.env.development?
21
+ ```
22
+
23
+ ## Translating your application
24
+
25
+ Start a Rails server for your project and go to the namespace called something like "http://localhost:3000/awesome_translations". Start translating your app through the webinterface.
26
+
27
+
28
+ # License
29
+
30
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'AwesomeTranslations'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,14 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require awesome_translations/layout
13
+ *= require awesome_translations/groups
14
+ */
@@ -0,0 +1,18 @@
1
+ body.controller_groups {
2
+ &.action_show {
3
+ .line-content {
4
+ font-family: Monospace;
5
+ border: 1px solid black;
6
+ background-color: lightgrey;
7
+ padding: 5px;
8
+
9
+ pre {
10
+ margin: 0px;
11
+ }
12
+ }
13
+
14
+ .line-spacer {
15
+ height: 10px;
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,51 @@
1
+ html, body {
2
+ width: 100%;
3
+ height: 100%;
4
+ margin: 0px;
5
+ padding: 0px;
6
+ font-family: "Open Sans";
7
+ font-size: 14px;
8
+ }
9
+
10
+ h1 {
11
+ font-size: 40px;
12
+ font-family: "Raleway";
13
+ }
14
+
15
+ a:link, a:visited {
16
+ color: steelblue;
17
+ text-decoration: none;
18
+ }
19
+
20
+ a:active, a:hover {
21
+ text-decoration: underline;
22
+ }
23
+
24
+ table.main-table {
25
+ width: 100%;
26
+ height: 100%;
27
+ border-collapse: separate;
28
+ border-spacing: 0px;
29
+
30
+ td.main-logo {
31
+ font-size: 40px;
32
+ font-family: "Raleway";
33
+ padding: 22px;
34
+ }
35
+
36
+ td.main-menu {
37
+ border-top: 1px solid black;
38
+ border-bottom: 1px solid black;
39
+ padding: 10px;
40
+ }
41
+
42
+ td.main-content {
43
+ height: 100%;
44
+ vertical-align: top;
45
+ padding: 12px;
46
+ }
47
+ }
48
+
49
+ table > thead > tr > th {
50
+ text-align: left;
51
+ }
@@ -0,0 +1,4 @@
1
+ module AwesomeTranslations
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,38 @@
1
+ class AwesomeTranslations::GroupsController < AwesomeTranslations::ApplicationController
2
+ before_filter :set_handler
3
+ before_filter :set_group
4
+
5
+ def index
6
+ end
7
+
8
+ def show
9
+ @translations = @group.translations
10
+ end
11
+
12
+ def update
13
+ @group.translations.each do |translation|
14
+ next unless params[:t].key?(translation.key)
15
+
16
+ values = params[:t][translation.key]
17
+ values.each do |locale, value|
18
+ translated_value = translation.translated_value_for_locale(locale)
19
+ translated_value.value = value
20
+ translated_value.save!
21
+ end
22
+ end
23
+
24
+ I18n.backend.reload!
25
+
26
+ redirect_to handler_group_path(@handler, @group)
27
+ end
28
+
29
+ private
30
+
31
+ def set_handler
32
+ @handler = AwesomeTranslations::Handler.find(params[:handler_id])
33
+ end
34
+
35
+ def set_group
36
+ @group = AwesomeTranslations::Group.find_by_handler_and_id(@handler, params[:id])
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ class AwesomeTranslations::HandlersController < AwesomeTranslations::ApplicationController
2
+ before_filter :set_handler
3
+
4
+ def index
5
+ @handlers = AwesomeTranslations::Handler.all
6
+ end
7
+
8
+ def show
9
+ @groups = @handler.groups
10
+ end
11
+
12
+ private
13
+
14
+ def set_handler
15
+ @handler = AwesomeTranslations::Handler.find(params[:id]) if params[:id]
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ class AwesomeTranslations::TranslationsController < AwesomeTranslations::ApplicationController
2
+ def index
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module AwesomeTranslations
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,43 @@
1
+ class AwesomeTranslations::Group
2
+ attr_reader :handler, :id, :data
3
+
4
+ def self.find_by_handler_and_id(handler, id)
5
+ handler.groups.each do |group|
6
+ return group if group.id == id.to_s
7
+ end
8
+
9
+ raise ActiveRecord::RecordNotFound, "Group not found by handler and ID: '#{handler.name}', '#{id}'."
10
+ end
11
+
12
+ def initialize(args)
13
+ @handler, @id, @data = args[:handler], args[:id], args[:data]
14
+ end
15
+
16
+ def translations
17
+ @handler.translations_for_group(self)
18
+ end
19
+
20
+ def to_param
21
+ id
22
+ end
23
+
24
+ def param_key
25
+ id
26
+ end
27
+
28
+ def name
29
+ if @data && @data[:name].present?
30
+ return @data[:name].presence
31
+ end
32
+
33
+ return id
34
+ end
35
+
36
+ def to_s
37
+ "<AwesomeTranslations::Group id=\"#{@id}\" name=\"#{@name}\">"
38
+ end
39
+
40
+ def inspect
41
+ to_s
42
+ end
43
+ end
@@ -0,0 +1,45 @@
1
+ class AwesomeTranslations::Handler
2
+ def self.all
3
+ AwesomeTranslations::Handlers.list
4
+ end
5
+
6
+ def self.find(id)
7
+ AwesomeTranslations::Handlers.list.each do |handler|
8
+ return handler if handler.id == id.to_s
9
+ end
10
+
11
+ raise ActiveRecord::RecordNotFound, "Handlers not found: '#{id}'."
12
+ end
13
+
14
+ def initialize(data)
15
+ @data = data
16
+ end
17
+
18
+ def id
19
+ @data[:id]
20
+ end
21
+
22
+ def to_param
23
+ id
24
+ end
25
+
26
+ def param_key
27
+ id
28
+ end
29
+
30
+ def name
31
+ @data[:name]
32
+ end
33
+
34
+ def const
35
+ AwesomeTranslations::Handlers.const_get(@data[:const_name])
36
+ end
37
+
38
+ def translations
39
+ const.new.translations
40
+ end
41
+
42
+ def groups
43
+ const.new.groups
44
+ end
45
+ end
@@ -0,0 +1,47 @@
1
+ require "fileutils"
2
+
3
+ class AwesomeTranslations::TranslatedValue
4
+ attr_accessor :file, :locale, :key, :value
5
+
6
+ def initialize(data)
7
+ @file, @locale, @key, @value = data[:file], data[:locale], data[:key], data[:value]
8
+ end
9
+
10
+ def to_s
11
+ "<AwesomeTranslations::TranslatedValue file=\"#{@file}\" locale=\"#{@locale}\" key=\"#{@key}\" value=\"#{@value}\">"
12
+ end
13
+
14
+ alias inspect to_s
15
+
16
+ def save!
17
+ dir = File.dirname(@file)
18
+ FileUtils.mkdir_p(dir) unless File.exists?(dir)
19
+ File.open(@file, "w") { |fp| fp.write("#{@locale}:\n") } unless File.exists?(@file)
20
+
21
+ translations = YAML.load(File.read(@file))
22
+ translations ||= {}
23
+
24
+ translations[@locale.to_s] ||= {}
25
+ current = translations[@locale.to_s]
26
+
27
+ key_parts = key.split(".")
28
+ last_index = key_parts.length - 1
29
+ key_parts.each_with_index do |key_part, index|
30
+ key_part = key_part.to_s
31
+
32
+ if index == last_index
33
+ if @value.empty?
34
+ current.delete(key_part)
35
+ else
36
+ current[key_part] = value
37
+ end
38
+ else
39
+ current[key_part] ||= {}
40
+ current = current[key_part]
41
+ end
42
+ end
43
+
44
+ I18n.load_path << file unless I18n.load_path.include?(file)
45
+ File.open(file, "w") { |fp| fp.write(YAML.dump(translations)) }
46
+ end
47
+ end
@@ -0,0 +1,88 @@
1
+ class AwesomeTranslations::Translation
2
+ attr_reader :dir, :key, :file_path, :line_no
3
+
4
+ def initialize(data)
5
+ @data = data
6
+ @dir, @key, @file_path, @full_path, @line_no = data[:dir], data[:key], data[:file_path], data[:full_path], data[:line_no]
7
+
8
+ raise "Dir wasn't valid: '#{@dir}'." unless @dir.present?
9
+ end
10
+
11
+ def id
12
+ raise "stub!"
13
+ end
14
+
15
+ def to_param
16
+ id
17
+ end
18
+
19
+ def name
20
+ key
21
+ end
22
+
23
+ def translated_values
24
+ result = []
25
+
26
+ I18n.available_locales.each do |locale|
27
+ next unless value_for?(locale)
28
+
29
+ translated_value = AwesomeTranslations::TranslatedValue.new(
30
+ file: "#{dir}/#{locale}.yml",
31
+ key: @key,
32
+ locale: locale,
33
+ value: value(locale: locale)
34
+ )
35
+ end
36
+
37
+ return result
38
+ end
39
+
40
+ def translated_value_for_locale(locale)
41
+ AwesomeTranslations::TranslatedValue.new(
42
+ file: "#{dir}/#{locale}.yml",
43
+ key: @key,
44
+ locale: locale,
45
+ value: value_for?(locale) ? value(locale: locale) : ""
46
+ )
47
+ end
48
+
49
+ def value_for?(locale)
50
+ I18n.with_locale(locale) { return I18n.exists?(@key) }
51
+ end
52
+
53
+ def value(args = {})
54
+ locale = (args[:locale] || I18n.locale || I18n.default_locale).to_sym
55
+
56
+ return nil unless value_for?(locale)
57
+ I18n.with_locale(locale) { return I18n.t(@key) }
58
+ end
59
+
60
+ def file_line_content?
61
+ if @full_path && @line_no && File.exists?(@full_path)
62
+ return true
63
+ else
64
+ return false
65
+ end
66
+ end
67
+
68
+ def file_line_content
69
+ count = 0
70
+
71
+ File.open(@full_path, "r") do |fp|
72
+ fp.each_line do |line|
73
+ count += 1
74
+ return line if count == @line_no
75
+ end
76
+ end
77
+
78
+ raise "Could not find line #{@line_no}. Read #{count}"
79
+ end
80
+
81
+ def to_s
82
+ "<AwesomeTranslations::Translation key=\"#{@key}\" dir=\"#{@dir}\">"
83
+ end
84
+
85
+ def inspect
86
+ to_s
87
+ end
88
+ end