rails_i18n_manager 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +7 -0
  3. data/README.md +177 -0
  4. data/Rakefile +18 -0
  5. data/app/controllers/rails_i18n_manager/application_controller.rb +5 -0
  6. data/app/controllers/rails_i18n_manager/translation_apps_controller.rb +71 -0
  7. data/app/controllers/rails_i18n_manager/translations_controller.rb +248 -0
  8. data/app/helpers/rails_i18n_manager/application_helper.rb +74 -0
  9. data/app/helpers/rails_i18n_manager/custom_form_builder.rb +223 -0
  10. data/app/jobs/rails_i18n_manager/application_job.rb +5 -0
  11. data/app/jobs/rails_i18n_manager/translations_import_job.rb +70 -0
  12. data/app/lib/rails_i18n_manager/forms/base.rb +25 -0
  13. data/app/lib/rails_i18n_manager/forms/translation_file_form.rb +55 -0
  14. data/app/lib/rails_i18n_manager/google_translate.rb +72 -0
  15. data/app/models/rails_i18n_manager/application_record.rb +20 -0
  16. data/app/models/rails_i18n_manager/translation_app.rb +108 -0
  17. data/app/models/rails_i18n_manager/translation_key.rb +161 -0
  18. data/app/models/rails_i18n_manager/translation_value.rb +11 -0
  19. data/app/views/layouts/rails_i18n_manager/application.html.slim +55 -0
  20. data/app/views/layouts/rails_i18n_manager/application.js.erb +5 -0
  21. data/app/views/rails_i18n_manager/form_builder/_basic_field.html.erb +108 -0
  22. data/app/views/rails_i18n_manager/form_builder/_error_notification.html.erb +7 -0
  23. data/app/views/rails_i18n_manager/shared/_flash.html.slim +6 -0
  24. data/app/views/rails_i18n_manager/translation_apps/_breadcrumbs.html.slim +12 -0
  25. data/app/views/rails_i18n_manager/translation_apps/_filter_bar.html.slim +9 -0
  26. data/app/views/rails_i18n_manager/translation_apps/form.html.slim +30 -0
  27. data/app/views/rails_i18n_manager/translation_apps/index.html.slim +27 -0
  28. data/app/views/rails_i18n_manager/translations/_breadcrumbs.html.slim +17 -0
  29. data/app/views/rails_i18n_manager/translations/_filter_bar.html.slim +17 -0
  30. data/app/views/rails_i18n_manager/translations/_form.html.slim +29 -0
  31. data/app/views/rails_i18n_manager/translations/_sub_nav.html.slim +7 -0
  32. data/app/views/rails_i18n_manager/translations/_translation_value_fields.html.slim +10 -0
  33. data/app/views/rails_i18n_manager/translations/edit.html.slim +6 -0
  34. data/app/views/rails_i18n_manager/translations/import.html.slim +26 -0
  35. data/app/views/rails_i18n_manager/translations/index.html.slim +50 -0
  36. data/config/locales/en.yml +5 -0
  37. data/config/routes.rb +22 -0
  38. data/db/migrate/20221001001344_add_rails_i18n_manager_tables.rb +26 -0
  39. data/lib/rails_i18n_manager/config.rb +20 -0
  40. data/lib/rails_i18n_manager/engine.rb +42 -0
  41. data/lib/rails_i18n_manager/version.rb +3 -0
  42. data/lib/rails_i18n_manager.rb +60 -0
  43. data/public/rails_i18n_manager/application.css +67 -0
  44. data/public/rails_i18n_manager/application.js +37 -0
  45. data/public/rails_i18n_manager/favicon.ico +0 -0
  46. data/public/rails_i18n_manager/utility.css +99 -0
  47. metadata +292 -0
@@ -0,0 +1,26 @@
1
+ class AddRailsI18nManagerTables < ActiveRecord::Migration[6.0]
2
+ def change
3
+
4
+ create_table :rails_i18n_manager_translation_apps do |t|
5
+ t.string :name
6
+ t.string :default_locale
7
+ t.text :additional_locales
8
+ t.timestamps
9
+ end
10
+
11
+ create_table :rails_i18n_manager_translation_keys do |t|
12
+ t.string :key
13
+ t.references :translation_app, index: { name: 'index_translation_keys_on_translation_app_id' }
14
+ t.boolean :active, default: true, null: false
15
+ t.datetime :updated_at
16
+ end
17
+
18
+ create_table :rails_i18n_manager_translation_values do |t|
19
+ t.references :translation_key, index: { name: 'index_translation_values_on_translation_key_id' }
20
+ t.string :locale, limit: 5
21
+ t.string :translation
22
+ t.datetime :updated_at
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ module RailsI18nManager
2
+ class Config
3
+
4
+ @@google_translate_api_key = nil
5
+ mattr_reader :google_translate_api_key
6
+
7
+ def self.google_translate_api_key=(val)
8
+ @@google_translate_api_key = val
9
+ end
10
+
11
+ ### List retrieved from Google Translate (2022)
12
+ @@valid_locales = ["af", "am", "ar", "az", "be", "bg", "bn", "bs", "ca", "ceb", "co", "cs", "cy", "da", "de", "el", "en", "eo", "es", "et", "eu", "fa", "fi", "fr", "fy", "ga", "gd", "gl", "gu", "ha", "haw", "he", "hi", "hmn", "hr", "ht", "hu", "hy", "id", "ig", "is", "it", "iw", "ja", "jw", "ka", "kk", "km", "kn", "ko", "ku", "ky", "la", "lb", "lo", "lt", "lv", "mg", "mi", "mk", "ml", "mn", "mr", "ms", "mt", "my", "ne", "nl", "no", "ny", "or", "pa", "pl", "ps", "pt", "ro", "ru", "rw", "sd", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "st", "su", "sv", "sw", "ta", "te", "tg", "th", "tk", "tl", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "xh", "yi", "yo", "zh", "zh-CN", "zh-TW", "zu"].freeze
13
+ mattr_accessor :valid_locales
14
+
15
+ def self.valid_locales=(locales_array)
16
+ @@valid_locales = locales_array
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,42 @@
1
+ require 'slim'
2
+ require 'active_sort_order'
3
+ require 'kaminari'
4
+ require "zip"
5
+ require "activerecord-import"
6
+ require "csv"
7
+
8
+ module RailsI18nManager
9
+ class Engine < ::Rails::Engine
10
+ isolate_namespace RailsI18nManager
11
+
12
+ paths["app/models"] << "app/lib"
13
+
14
+ initializer "rails_i18n_manager.load_static_assets" do |app|
15
+ ### Expose static assets
16
+ app.middleware.use ::ActionDispatch::Static, "#{root}/public"
17
+ end
18
+
19
+ ### Were not using sprockets were just storing everything in public
20
+ ### Sprockets Config below
21
+ # initializer "rails_i18n_manager.assets.precompile" do |app|
22
+ # app.config.assets.precompile << "rails_i18n_manager_manifest.js" ### manifest file required
23
+ # app.config.assets.precompile << "rails_i18n_manager/favicon.ico"
24
+
25
+ # ### Automatically precompile assets in specified folders
26
+ # ["app/assets/images/"].each do |folder|
27
+ # dir = app.root.join(folder)
28
+
29
+ # if Dir.exist?(dir)
30
+ # Dir.glob(File.join(dir, "**/*")).each do |f|
31
+ # asset_name = f.to_s
32
+ # .split(folder).last # Remove fullpath
33
+ # .sub(/^\/*/, '') ### Remove leading '/'
34
+
35
+ # app.config.assets.precompile << asset_name
36
+ # end
37
+ # end
38
+ # end
39
+ # end
40
+
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ module RailsI18nManager
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,60 @@
1
+ require "rails_i18n_manager/engine"
2
+ require "rails_i18n_manager/config"
3
+
4
+ module RailsI18nManager
5
+
6
+ def self.config(&block)
7
+ c = RailsI18nManager::Config
8
+
9
+ if block_given?
10
+ block.call(c)
11
+ else
12
+ return c
13
+ end
14
+ end
15
+
16
+ def self.fetch_flattened_dot_notation_keys(translations_hash)
17
+ keys = []
18
+
19
+ translations_hash.each do |_locale, h|
20
+ h.each do |k,v|
21
+ _recursive_fetch_keys(list: keys, key: k, val: v)
22
+ end
23
+ end
24
+
25
+ return keys.uniq
26
+ end
27
+
28
+ def self._recursive_fetch_keys(list:, key:, val:, prev_dot_notation_key: nil)
29
+ if prev_dot_notation_key
30
+ dot_notation_key = [prev_dot_notation_key, key].compact.join(".")
31
+ else
32
+ dot_notation_key = key
33
+ end
34
+
35
+ if val.is_a?(Hash)
36
+ val.each do |inner_key, inner_val|
37
+ _recursive_fetch_keys(list: list, key: inner_key, val: inner_val, prev_dot_notation_key: dot_notation_key)
38
+ end
39
+ else
40
+ list << dot_notation_key
41
+ end
42
+ end
43
+
44
+ def self.hash_deep_set(hash, keys_array, val)
45
+ if !hash.is_a?(::Hash)
46
+ raise TypeError.new("Invalid object passed to #{__method__}, must be a Hash")
47
+ end
48
+
49
+ keys_array[0...-1].inject(hash){|result, key|
50
+ if !result[key].is_a?(Hash)
51
+ result[key] = {}
52
+ end
53
+
54
+ result[key]
55
+ }.send(:[]=, keys_array.last, val)
56
+
57
+ return hash
58
+ end
59
+
60
+ end
@@ -0,0 +1,67 @@
1
+ h1, h2, h3, h4, h5{
2
+ color: #424242;
3
+ }
4
+
5
+ body{
6
+ background-color: #F5F6F6;
7
+ padding-top: 80px;
8
+ padding-bottom: 20px;
9
+ }
10
+
11
+ label{
12
+ margin-right: 10px;
13
+ }
14
+
15
+ footer{
16
+ position: fixed;
17
+ text-align: center;
18
+ bottom: 10px;
19
+ right: 0;
20
+ left: 0;
21
+ }
22
+
23
+ .btn-default{
24
+ border-color: gray;
25
+ background-color: gray;
26
+ background-image: none;
27
+ }
28
+
29
+ .breadcrumb-item:before{
30
+ content: "/":
31
+ }
32
+
33
+ .form-group{
34
+ margin-bottom: 15px !important;
35
+ }
36
+
37
+ select{
38
+ min-width: 300px;
39
+ }
40
+
41
+ form label{
42
+ margin-bottom: 5px;
43
+ font-weight: bold;
44
+ }
45
+
46
+ .nav-link.active{
47
+ font-weight: bold;
48
+ }
49
+
50
+ .navbar-nav .nav-item{
51
+ margin-left: 10px;
52
+ }
53
+
54
+ .navbar-brand{
55
+ font-weight: bold;
56
+ text-decoration: underline;
57
+ }
58
+
59
+ .ss-main{
60
+ // for slimselect.js
61
+ background-image: none !important;
62
+ height: 38px;
63
+ }
64
+
65
+ .ss-option{
66
+ min-height: 32px !important;
67
+ }
@@ -0,0 +1,37 @@
1
+ window.init = function(){
2
+ $("form").attr("autocomplete", "off");
3
+
4
+ $('.field_with_errors').addClass('is-invalid');
5
+
6
+ var alerts = $(".alert:not(.permanent)")
7
+ setTimeout(function(){
8
+ alerts.fadeOut();
9
+ }, 8000);
10
+
11
+ autosize($('textarea'));
12
+
13
+ $("select").each(function(){
14
+ $(this).removeClass("form-select");
15
+
16
+ new SlimSelect({
17
+ select: this,
18
+ settings: {
19
+ //contentLocation: document.body,
20
+ contentLocation: this.parentElement,
21
+ closeOnSelect: !this.hasAttribute("multiple"),
22
+ openPosition: 'down', // options: auto, up, down
23
+ //placeholderText: "Select Value",
24
+ placeholderText: "Select...",
25
+ //searchPlaceholder: 'Search',
26
+ //searchText: 'No Results',
27
+ //searchingText: 'Searching...',
28
+ maxValuesShown: 999, // defaults to 20, max selected items show in multi-selects
29
+ //maxValuesShown: 20,
30
+ }
31
+ })
32
+ });
33
+ }
34
+
35
+ $(function(){
36
+ window.init();
37
+ });
@@ -0,0 +1,99 @@
1
+ .no-gutter{
2
+ padding:0 !important;
3
+ }
4
+ .bold{
5
+ font-weight:bold !important;
6
+ }
7
+ .no-bold{
8
+ font-weight:400 !important;
9
+ }
10
+ .italic{
11
+ font-style: italic !important;
12
+ }
13
+ .underline{
14
+ text-decoration:underline !important;
15
+ }
16
+ .space-left{
17
+ margin-left:5px !important;
18
+ }
19
+ .space-left2{
20
+ margin-left:10px !important;
21
+ }
22
+ .space-left3{
23
+ margin-left:15px !important;
24
+ }
25
+ .space-left4{
26
+ margin-left:20px !important;
27
+ }
28
+ .space-left5{
29
+ margin-left:30px !important;
30
+ }
31
+ .space-right{
32
+ margin-right:5px !important;
33
+ }
34
+ .space-right2{
35
+ margin-right:10px !important;
36
+ }
37
+ .space-right3{
38
+ margin-right:15px !important;
39
+ }
40
+ .space-right4{
41
+ margin-right:20px !important;
42
+ }
43
+ .space-right5{
44
+ margin-right:30px !important;
45
+ }
46
+ .space-above{
47
+ margin-top:5px !important;
48
+ }
49
+ .space-above2{
50
+ margin-top:10px !important;
51
+ }
52
+ .space-above3{
53
+ margin-top:20px !important;
54
+ }
55
+ .space-above4{
56
+ margin-top:30px !important;
57
+ }
58
+ .space-above5{
59
+ margin-top:40px !important;
60
+ }
61
+ .space-below{
62
+ margin-bottom:5px !important;
63
+ }
64
+ .space-below2{
65
+ margin-bottom:10px !important;
66
+ }
67
+ .space-below3{
68
+ margin-bottom:15px !important;
69
+ }
70
+ .space-below4{
71
+ margin-bottom:20px !important;
72
+ }
73
+ .space-below5{
74
+ margin-bottom:30px !important;
75
+ }
76
+ .width-100{
77
+ width:100%;
78
+ }
79
+ .width-90{
80
+ width: 90%;
81
+ }
82
+ .table-text-center{
83
+ th td{
84
+ text-align:center !important;
85
+ }
86
+ }
87
+ .display-table{
88
+ height:130px;
89
+ display:table;
90
+ }
91
+ .display-table .vertical-align{
92
+ display:table-cell;
93
+ vertical-align:middle;
94
+ }
95
+
96
+
97
+ .hidden{
98
+ display: none !important;
99
+ }
metadata ADDED
@@ -0,0 +1,292 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_i18n_manager
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Weston Ganger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-08-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '5.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: slim
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: kaminari
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: active_sort_order
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: easy_translate
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubyzip
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activerecord-import
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sqlite3
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec-rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: factory_bot_rails
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: database_cleaner
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rails-controller-testing
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: faker
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: minitest_change_assertions
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ description: Web interface to manage i18n translations for your apps to facilitate
210
+ the editors of your translations. Provides a low-tech and complete workflow for
211
+ importing, translating, and exporting your I18n translation files. Design to allows
212
+ you to keep the translation files inside your projects git repository where they
213
+ should be.
214
+ email:
215
+ - weston@westonganger.com
216
+ executables: []
217
+ extensions: []
218
+ extra_rdoc_files: []
219
+ files:
220
+ - LICENSE
221
+ - README.md
222
+ - Rakefile
223
+ - app/controllers/rails_i18n_manager/application_controller.rb
224
+ - app/controllers/rails_i18n_manager/translation_apps_controller.rb
225
+ - app/controllers/rails_i18n_manager/translations_controller.rb
226
+ - app/helpers/rails_i18n_manager/application_helper.rb
227
+ - app/helpers/rails_i18n_manager/custom_form_builder.rb
228
+ - app/jobs/rails_i18n_manager/application_job.rb
229
+ - app/jobs/rails_i18n_manager/translations_import_job.rb
230
+ - app/lib/rails_i18n_manager/forms/base.rb
231
+ - app/lib/rails_i18n_manager/forms/translation_file_form.rb
232
+ - app/lib/rails_i18n_manager/google_translate.rb
233
+ - app/models/rails_i18n_manager/application_record.rb
234
+ - app/models/rails_i18n_manager/translation_app.rb
235
+ - app/models/rails_i18n_manager/translation_key.rb
236
+ - app/models/rails_i18n_manager/translation_value.rb
237
+ - app/views/layouts/rails_i18n_manager/application.html.slim
238
+ - app/views/layouts/rails_i18n_manager/application.js.erb
239
+ - app/views/rails_i18n_manager/form_builder/_basic_field.html.erb
240
+ - app/views/rails_i18n_manager/form_builder/_error_notification.html.erb
241
+ - app/views/rails_i18n_manager/shared/_flash.html.slim
242
+ - app/views/rails_i18n_manager/translation_apps/_breadcrumbs.html.slim
243
+ - app/views/rails_i18n_manager/translation_apps/_filter_bar.html.slim
244
+ - app/views/rails_i18n_manager/translation_apps/form.html.slim
245
+ - app/views/rails_i18n_manager/translation_apps/index.html.slim
246
+ - app/views/rails_i18n_manager/translations/_breadcrumbs.html.slim
247
+ - app/views/rails_i18n_manager/translations/_filter_bar.html.slim
248
+ - app/views/rails_i18n_manager/translations/_form.html.slim
249
+ - app/views/rails_i18n_manager/translations/_sub_nav.html.slim
250
+ - app/views/rails_i18n_manager/translations/_translation_value_fields.html.slim
251
+ - app/views/rails_i18n_manager/translations/edit.html.slim
252
+ - app/views/rails_i18n_manager/translations/import.html.slim
253
+ - app/views/rails_i18n_manager/translations/index.html.slim
254
+ - config/locales/en.yml
255
+ - config/routes.rb
256
+ - db/migrate/20221001001344_add_rails_i18n_manager_tables.rb
257
+ - lib/rails_i18n_manager.rb
258
+ - lib/rails_i18n_manager/config.rb
259
+ - lib/rails_i18n_manager/engine.rb
260
+ - lib/rails_i18n_manager/version.rb
261
+ - public/rails_i18n_manager/application.css
262
+ - public/rails_i18n_manager/application.js
263
+ - public/rails_i18n_manager/favicon.ico
264
+ - public/rails_i18n_manager/utility.css
265
+ homepage: https://github.com/westonganger/rails_i18n_manager
266
+ licenses:
267
+ - MIT
268
+ metadata: {}
269
+ post_install_message:
270
+ rdoc_options: []
271
+ require_paths:
272
+ - lib
273
+ required_ruby_version: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ version: '0'
278
+ required_rubygems_version: !ruby/object:Gem::Requirement
279
+ requirements:
280
+ - - ">="
281
+ - !ruby/object:Gem::Version
282
+ version: '0'
283
+ requirements: []
284
+ rubygems_version: 3.4.6
285
+ signing_key:
286
+ specification_version: 4
287
+ summary: Web interface to manage i18n translations for your apps to facilitate the
288
+ editors of your translations. Provides a low-tech and complete workflow for importing,
289
+ translating, and exporting your I18n translation files. Design to allows you to
290
+ keep the translation files inside your projects git repository where they should
291
+ be.
292
+ test_files: []