rosetta-rails 0.1.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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/builds/rosetta/application.css +1 -0
  6. data/app/assets/builds/rosetta/application.js +8290 -0
  7. data/app/assets/config/rosetta_manifest.js +2 -0
  8. data/app/assets/javascripts/rosetta/application.js +2 -0
  9. data/app/assets/javascripts/rosetta/controllers/application.js +9 -0
  10. data/app/assets/javascripts/rosetta/controllers/dialog_controller.js +40 -0
  11. data/app/assets/javascripts/rosetta/controllers/index.js +4 -0
  12. data/app/assets/stylesheets/rosetta/application.css +49 -0
  13. data/app/controllers/concerns/rosetta/locale_scoped.rb +16 -0
  14. data/app/controllers/rosetta/application_controller.rb +5 -0
  15. data/app/controllers/rosetta/locales/deploys_controller.rb +12 -0
  16. data/app/controllers/rosetta/locales/translations/missing_controller.rb +9 -0
  17. data/app/controllers/rosetta/locales/translations_controller.rb +17 -0
  18. data/app/controllers/rosetta/locales_controller.rb +31 -0
  19. data/app/controllers/rosetta/translations_controller.rb +35 -0
  20. data/app/helpers/rosetta/application_helper.rb +7 -0
  21. data/app/helpers/rosetta/dialog_helper.rb +11 -0
  22. data/app/helpers/rosetta/navigation_helper.rb +21 -0
  23. data/app/helpers/rosetta/translation_helper.rb +9 -0
  24. data/app/jobs/rosetta/application_job.rb +4 -0
  25. data/app/mailers/rosetta/application_mailer.rb +6 -0
  26. data/app/models/rosetta/application_record.rb +5 -0
  27. data/app/models/rosetta/locale.rb +31 -0
  28. data/app/models/rosetta/translation.rb +6 -0
  29. data/app/models/rosetta/translation_key.rb +7 -0
  30. data/app/views/layouts/rosetta/_dialog.html.erb +25 -0
  31. data/app/views/layouts/rosetta/_flashes.html.erb +7 -0
  32. data/app/views/layouts/rosetta/_navbar.html.erb +7 -0
  33. data/app/views/layouts/rosetta/application.html.erb +25 -0
  34. data/app/views/rosetta/locales/_form.html.erb +33 -0
  35. data/app/views/rosetta/locales/_locale.html.erb +19 -0
  36. data/app/views/rosetta/locales/index.html.erb +31 -0
  37. data/app/views/rosetta/locales/new.html.erb +4 -0
  38. data/app/views/rosetta/locales/translations/_navigation.html.erb +14 -0
  39. data/app/views/rosetta/locales/translations/_translation_key.html.erb +14 -0
  40. data/app/views/rosetta/locales/translations/index.html.erb +52 -0
  41. data/app/views/rosetta/translations/edit.html.erb +21 -0
  42. data/config/initializers/pagy.rb +220 -0
  43. data/config/routes.rb +18 -0
  44. data/db/migrate/20240830123523_create_rosetta_tables.rb +33 -0
  45. data/lib/rosetta/configuration.rb +17 -0
  46. data/lib/rosetta/engine.rb +12 -0
  47. data/lib/rosetta/locale_session.rb +16 -0
  48. data/lib/rosetta/store.rb +75 -0
  49. data/lib/rosetta/version.rb +3 -0
  50. data/lib/rosetta-rails.rb +48 -0
  51. data/lib/tasks/rosetta_tasks.rake +4 -0
  52. metadata +163 -0
@@ -0,0 +1,220 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Pagy initializer file (9.0.9)
4
+ # Customize only what you really need and notice that the core Pagy works also without any of the following lines.
5
+ # Should you just cherry pick part of this file, please maintain the require-order of the extras
6
+
7
+
8
+ # Pagy Variables
9
+ # See https://ddnexus.github.io/pagy/docs/api/pagy#variables
10
+ # You can set any pagy variable as a Pagy::DEFAULT. They can also be overridden per instance by just passing them to
11
+ # Pagy.new|Pagy::Countless.new|Pagy::Calendar::*.new or any of the #pagy* controller methods
12
+ # Here are the few that make more sense as DEFAULTs:
13
+ # Pagy::DEFAULT[:limit] = 20 # default
14
+ # Pagy::DEFAULT[:size] = 7 # default
15
+ # Pagy::DEFAULT[:ends] = true # default
16
+ # Pagy::DEFAULT[:page_param] = :page # default
17
+ # Pagy::DEFAULT[:count_args] = [] # example for non AR ORMs
18
+ # Pagy::DEFAULT[:max_pages] = 3000 # example
19
+
20
+
21
+ # Extras
22
+ # See https://ddnexus.github.io/pagy/categories/extra
23
+
24
+
25
+ # Legacy Compatibility Extras
26
+
27
+ # Size extra: Enable the Array type for the `:size` variable (e.g. `size: [1,4,4,1]`)
28
+ # See https://ddnexus.github.io/pagy/docs/extras/size
29
+ # require 'pagy/extras/size' # must be required before the other extras
30
+
31
+
32
+ # Backend Extras
33
+
34
+ # Arel extra: For better performance utilizing grouped ActiveRecord collections:
35
+ # See: https://ddnexus.github.io/pagy/docs/extras/arel
36
+ # require 'pagy/extras/arel'
37
+
38
+ # Array extra: Paginate arrays efficiently, avoiding expensive array-wrapping and without overriding
39
+ # See https://ddnexus.github.io/pagy/docs/extras/array
40
+ # require 'pagy/extras/array'
41
+
42
+ # Calendar extra: Add pagination filtering by calendar time unit (year, quarter, month, week, day)
43
+ # See https://ddnexus.github.io/pagy/docs/extras/calendar
44
+ # require 'pagy/extras/calendar'
45
+ # Default for each calendar unit class in IRB:
46
+ # >> Pagy::Calendar::Year::DEFAULT
47
+ # >> Pagy::Calendar::Quarter::DEFAULT
48
+ # >> Pagy::Calendar::Month::DEFAULT
49
+ # >> Pagy::Calendar::Week::DEFAULT
50
+ # >> Pagy::Calendar::Day::DEFAULT
51
+ #
52
+ # Uncomment the following lines, if you need calendar localization without using the I18n extra
53
+ # module LocalizePagyCalendar
54
+ # def localize(time, opts)
55
+ # ::I18n.l(time, **opts)
56
+ # end
57
+ # end
58
+ # Pagy::Calendar.prepend LocalizePagyCalendar
59
+
60
+ # Countless extra: Paginate without any count, saving one query per rendering
61
+ # See https://ddnexus.github.io/pagy/docs/extras/countless
62
+ # require 'pagy/extras/countless'
63
+ # Pagy::DEFAULT[:countless_minimal] = false # default (eager loading)
64
+
65
+ # Elasticsearch Rails extra: Paginate `ElasticsearchRails::Results` objects
66
+ # See https://ddnexus.github.io/pagy/docs/extras/elasticsearch_rails
67
+ # Default :pagy_search method: change only if you use also
68
+ # the searchkick or meilisearch extra that defines the same
69
+ # Pagy::DEFAULT[:elasticsearch_rails_pagy_search] = :pagy_search
70
+ # Default original :search method called internally to do the actual search
71
+ # Pagy::DEFAULT[:elasticsearch_rails_search] = :search
72
+ # require 'pagy/extras/elasticsearch_rails'
73
+
74
+ # Headers extra: http response headers (and other helpers) useful for API pagination
75
+ # See http://ddnexus.github.io/pagy/extras/headers
76
+ # require 'pagy/extras/headers'
77
+ # Pagy::DEFAULT[:headers] = { page: 'Current-Page',
78
+ # limit: 'Page-Items',
79
+ # count: 'Total-Count',
80
+ # pages: 'Total-Pages' } # default
81
+
82
+ # Keyset extra: Paginate with the Pagy keyset pagination technique
83
+ # See http://ddnexus.github.io/pagy/extras/keyset
84
+ # require 'pagy/extras/keyset'
85
+
86
+ # Meilisearch extra: Paginate `Meilisearch` result objects
87
+ # See https://ddnexus.github.io/pagy/docs/extras/meilisearch
88
+ # Default :pagy_search method: change only if you use also
89
+ # the elasticsearch_rails or searchkick extra that define the same method
90
+ # Pagy::DEFAULT[:meilisearch_pagy_search] = :pagy_search
91
+ # Default original :search method called internally to do the actual search
92
+ # Pagy::DEFAULT[:meilisearch_search] = :ms_search
93
+ # require 'pagy/extras/meilisearch'
94
+
95
+ # Metadata extra: Provides the pagination metadata to Javascript frameworks like Vue.js, react.js, etc.
96
+ # See https://ddnexus.github.io/pagy/docs/extras/metadata
97
+ # you must require the JS Tools internal extra (BEFORE the metadata extra) ONLY if you need also the :sequels
98
+ # require 'pagy/extras/js_tools'
99
+ # require 'pagy/extras/metadata'
100
+ # For performance reasons, you should explicitly set ONLY the metadata you use in the frontend
101
+ # Pagy::DEFAULT[:metadata] = %i[scaffold_url page prev next last] # example
102
+
103
+ # Searchkick extra: Paginate `Searchkick::Results` objects
104
+ # See https://ddnexus.github.io/pagy/docs/extras/searchkick
105
+ # Default :pagy_search method: change only if you use also
106
+ # the elasticsearch_rails or meilisearch extra that defines the same
107
+ # Pagy::DEFAULT[:searchkick_pagy_search] = :pagy_search
108
+ # Default original :search method called internally to do the actual search
109
+ # Pagy::DEFAULT[:searchkick_search] = :search
110
+ # require 'pagy/extras/searchkick'
111
+ # uncomment if you are going to use Searchkick.pagy_search
112
+ # Searchkick.extend Pagy::Searchkick
113
+
114
+
115
+ # Frontend Extras
116
+
117
+ # Bootstrap extra: Add nav, nav_js and combo_nav_js helpers and templates for Bootstrap pagination
118
+ # See https://ddnexus.github.io/pagy/docs/extras/bootstrap
119
+ # require 'pagy/extras/bootstrap'
120
+
121
+ # Bulma extra: Add nav, nav_js and combo_nav_js helpers and templates for Bulma pagination
122
+ # See https://ddnexus.github.io/pagy/docs/extras/bulma
123
+ # require 'pagy/extras/bulma'
124
+
125
+ # Pagy extra: Add the pagy styled versions of the javascript-powered navs
126
+ # and a few other components to the Pagy::Frontend module.
127
+ # See https://ddnexus.github.io/pagy/docs/extras/pagy
128
+ # require 'pagy/extras/pagy'
129
+
130
+ # Multi size var used by the *_nav_js helpers
131
+ # See https://ddnexus.github.io/pagy/docs/extras/pagy#steps
132
+ # Pagy::DEFAULT[:steps] = { 0 => 5, 540 => 7, 720 => 9 } # example
133
+
134
+
135
+ # Feature Extras
136
+
137
+ # Gearbox extra: Automatically change the limit per page depending on the page number
138
+ # See https://ddnexus.github.io/pagy/docs/extras/gearbox
139
+ # require 'pagy/extras/gearbox'
140
+ # set to false only if you want to make :gearbox_extra an opt-in variable
141
+ # Pagy::DEFAULT[:gearbox_extra] = false # default true
142
+ # Pagy::DEFAULT[:gearbox_limit] = [15, 30, 60, 100] # default
143
+
144
+ # Limit extra: Allow the client to request a custom limit per page with an optional selector UI
145
+ # See https://ddnexus.github.io/pagy/docs/extras/limit
146
+ # require 'pagy/extras/limit'
147
+ # set to false only if you want to make :limit_extra an opt-in variable
148
+ # Pagy::DEFAULT[:limit_extra] = false # default true
149
+ # Pagy::DEFAULT[:limit_param] = :limit # default
150
+ # Pagy::DEFAULT[:limit_max] = 100 # default
151
+
152
+ # Overflow extra: Allow for easy handling of overflowing pages
153
+ # See https://ddnexus.github.io/pagy/docs/extras/overflow
154
+ # require 'pagy/extras/overflow'
155
+ # Pagy::DEFAULT[:overflow] = :empty_page # default (other options: :last_page and :exception)
156
+
157
+ # Trim extra: Remove the page=1 param from links
158
+ # See https://ddnexus.github.io/pagy/docs/extras/trim
159
+ # require 'pagy/extras/trim'
160
+ # set to false only if you want to make :trim_extra an opt-in variable
161
+ # Pagy::DEFAULT[:trim_extra] = false # default true
162
+
163
+ # Standalone extra: Use pagy in non Rack environment/gem
164
+ # See https://ddnexus.github.io/pagy/docs/extras/standalone
165
+ # require 'pagy/extras/standalone'
166
+ # Pagy::DEFAULT[:url] = 'http://www.example.com/subdir' # optional default
167
+
168
+ # Jsonapi extra: Implements JSON:API specifications
169
+ # See https://ddnexus.github.io/pagy/docs/extras/jsonapi
170
+ # require 'pagy/extras/jsonapi' # must be required after the other extras
171
+ # set to false only if you want to make :jsonapi an opt-in variable
172
+ # Pagy::DEFAULT[:jsonapi] = false # default true
173
+
174
+ # Rails
175
+ # Enable the .js file required by the helpers that use javascript
176
+ # (pagy*_nav_js, pagy*_combo_nav_js, and pagy_limit_selector_js)
177
+ # See https://ddnexus.github.io/pagy/docs/api/javascript
178
+
179
+ # With the asset pipeline
180
+ # Sprockets need to look into the pagy javascripts dir, so add it to the assets paths
181
+ # Rails.application.config.assets.paths << Pagy.root.join('javascripts')
182
+
183
+ # I18n
184
+
185
+ # Pagy internal I18n: ~18x faster using ~10x less memory than the i18n gem
186
+ # See https://ddnexus.github.io/pagy/docs/api/i18n
187
+ # Notice: No need to configure anything in this section if your app uses only "en"
188
+ # or if you use the i18n extra below
189
+ #
190
+ # Examples:
191
+ # load the "de" built-in locale:
192
+ # Pagy::I18n.load(locale: 'de')
193
+ #
194
+ # load the "de" locale defined in the custom file at :filepath:
195
+ # Pagy::I18n.load(locale: 'de', filepath: 'path/to/pagy-de.yml')
196
+ #
197
+ # load the "de", "en" and "es" built-in locales:
198
+ # (the first passed :locale will be used also as the default_locale)
199
+ # Pagy::I18n.load({ locale: 'de' },
200
+ # { locale: 'en' },
201
+ # { locale: 'es' })
202
+ #
203
+ # load the "en" built-in locale, a custom "es" locale,
204
+ # and a totally custom locale complete with a custom :pluralize proc:
205
+ # (the first passed :locale will be used also as the default_locale)
206
+ # Pagy::I18n.load({ locale: 'en' },
207
+ # { locale: 'es', filepath: 'path/to/pagy-es.yml' },
208
+ # { locale: 'xyz', # not built-in
209
+ # filepath: 'path/to/pagy-xyz.yml',
210
+ # pluralize: lambda{ |count| ... } )
211
+
212
+
213
+ # I18n extra: uses the standard i18n gem which is ~18x slower using ~10x more memory
214
+ # than the default pagy internal i18n (see above)
215
+ # See https://ddnexus.github.io/pagy/docs/extras/i18n
216
+ # require 'pagy/extras/i18n'
217
+
218
+
219
+ # When you are done setting your own default freeze it, so it will not get changed accidentally
220
+ Pagy::DEFAULT.freeze
data/config/routes.rb ADDED
@@ -0,0 +1,18 @@
1
+ Rosetta::Engine.routes.draw do
2
+ root to: "locales#index"
3
+
4
+ resources :locales do
5
+ scope module: :locales do
6
+ resources :translations, only: :index
7
+ resources :deploys, only: :create
8
+
9
+ namespace :translations do
10
+ resources :missing, only: :index
11
+ end
12
+ end
13
+ end
14
+
15
+ resources :translation_keys do
16
+ resource :translation, only: %i[edit update]
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ class CreateRosettaTables < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :rosetta_locales do |t|
4
+ t.string :name
5
+ t.string :code
6
+ t.boolean :published, default: false
7
+
8
+ t.timestamps
9
+
10
+ t.index :code, unique: true
11
+ end
12
+
13
+ create_table :rosetta_translation_keys do |t|
14
+ t.text :value
15
+
16
+ t.timestamps
17
+
18
+ t.index :value, unique: true
19
+ end
20
+
21
+ create_table :rosetta_translations do |t|
22
+ t.text :value
23
+ t.references :locale, null: false
24
+ t.references :translation_key, null: false
25
+
26
+ t.timestamps
27
+
28
+ t.index [ :locale_id, :translation_key_id ], unique: true
29
+ t.foreign_key :rosetta_locales, column: :locale_id
30
+ t.foreign_key :rosetta_translation_keys, column: :translation_key_id
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ module Rosetta
2
+ class Configuration
3
+ attr_reader :default_locale
4
+ attr_accessor :parent_controller_class
5
+
6
+ DefaultLocale = Struct.new(:name, :code)
7
+
8
+ def initialize
9
+ set_default_locale(name: "English", code: "en")
10
+ @parent_controller_class = "ActionController::Base"
11
+ end
12
+
13
+ def set_default_locale(name:, code:)
14
+ @default_locale = DefaultLocale.new(name, code)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ require "turbo-rails"
2
+ require "pagy"
3
+
4
+ module Rosetta
5
+ class Engine < ::Rails::Engine
6
+ isolate_namespace Rosetta
7
+
8
+ initializer "rosetta.assets.precompile" do |app|
9
+ app.config.assets.precompile += %w[rosetta_manifest.js]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ module Rosetta
2
+ class LocaleSession
3
+ def locale
4
+ @locale ||= Locale.default_locale
5
+ end
6
+
7
+ def locale=(value)
8
+ case value
9
+ when Locale
10
+ @locale = value
11
+ when String, Symbol
12
+ @locale = Locale.find_by(code: value) || Locale.default_locale
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,75 @@
1
+ module Rosetta
2
+ class Store
3
+ class_attribute :locale_stores, default: Concurrent::Map.new
4
+
5
+ attr_reader :locale, :cache_expiration_timestamp
6
+
7
+ def self.for_locale(locale)
8
+ store = locale_stores[locale.code.to_sym] ||= new(locale)
9
+ store.touch!(locale.updated_at)
10
+ store
11
+ end
12
+
13
+ def initialize(locale)
14
+ @locale = locale
15
+ @cache_expiration_timestamp = @locale.updated_at
16
+ @autodiscovery_queue = Queue.new
17
+
18
+ start_key_autodiscovery!
19
+ end
20
+
21
+ def lookup(key_value)
22
+ if translations.has_key?(key_value)
23
+ translations[key_value]
24
+ else
25
+ @autodiscovery_queue << key_value
26
+ # Set the key in the translations store to locate it
27
+ # once only.
28
+ translations[key_value] = nil
29
+ end
30
+ end
31
+
32
+ def reload!
33
+ @translations = nil
34
+ end
35
+
36
+ def touch!(timestamp)
37
+ return if @cache_expiration_timestamp == timestamp
38
+
39
+ @cache_expiration_timestamp = timestamp
40
+ reload!
41
+ end
42
+
43
+ def translations
44
+ @translations ||= load_translations
45
+ end
46
+
47
+ private
48
+
49
+ def load_translations
50
+ loaded_translations = Rosetta.with_locale(@locale) do
51
+ TranslationKey
52
+ .includes(:translation_in_current_locale)
53
+ .map do |translation_key|
54
+ [ translation_key.value, translation_key.translation_in_current_locale&.value ]
55
+ end.to_h
56
+ end
57
+
58
+ Concurrent::Hash.new.merge(loaded_translations)
59
+ end
60
+
61
+ def start_key_autodiscovery!
62
+ Thread.new do
63
+ Thread.current.name = "Rosetta #{locale.code} store thread"
64
+
65
+ loop do
66
+ key_value = @autodiscovery_queue.pop
67
+
68
+ unless TranslationKey.exists?(value: key_value)
69
+ TranslationKey.create!(value: key_value)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,3 @@
1
+ module Rosetta
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,48 @@
1
+ require "rosetta/version"
2
+ require "rosetta/engine"
3
+
4
+ require "rosetta/locale_session"
5
+ require "rosetta/store"
6
+ require "rosetta/configuration"
7
+
8
+ module Rosetta
9
+ module Base
10
+ def locale
11
+ locale_session.locale
12
+ end
13
+
14
+ def locale=(code)
15
+ locale_session.locale = code
16
+ end
17
+
18
+ def with_locale(locale, &block)
19
+ locale_was = Rosetta.locale
20
+ self.locale = locale
21
+
22
+ begin
23
+ yield
24
+ ensure
25
+ self.locale = locale_was
26
+ end
27
+ end
28
+
29
+ def locale_session
30
+ Thread.current[:rosetta_locale_session] ||= LocaleSession.new
31
+ end
32
+
33
+ def translate(key, locale: Rosetta.locale)
34
+ store = Store.for_locale(locale)
35
+ store.lookup(key)
36
+ end
37
+
38
+ def config
39
+ @configuration ||= Configuration.new
40
+ end
41
+
42
+ def configure
43
+ config.tap { |config| yield(config) }
44
+ end
45
+ end
46
+
47
+ extend Base
48
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :rosetta do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rosetta-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Vincent Rolea
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-09-19 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: 6.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 6.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: turbo-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: concurrent-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pagy
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '7.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '7.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: appraisal
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Unobstrusive Internationalization solution for Rails applications.
84
+ email:
85
+ - 3525369+virolea@users.noreply.github.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - MIT-LICENSE
91
+ - README.md
92
+ - Rakefile
93
+ - app/assets/builds/rosetta/application.css
94
+ - app/assets/builds/rosetta/application.js
95
+ - app/assets/config/rosetta_manifest.js
96
+ - app/assets/javascripts/rosetta/application.js
97
+ - app/assets/javascripts/rosetta/controllers/application.js
98
+ - app/assets/javascripts/rosetta/controllers/dialog_controller.js
99
+ - app/assets/javascripts/rosetta/controllers/index.js
100
+ - app/assets/stylesheets/rosetta/application.css
101
+ - app/controllers/concerns/rosetta/locale_scoped.rb
102
+ - app/controllers/rosetta/application_controller.rb
103
+ - app/controllers/rosetta/locales/deploys_controller.rb
104
+ - app/controllers/rosetta/locales/translations/missing_controller.rb
105
+ - app/controllers/rosetta/locales/translations_controller.rb
106
+ - app/controllers/rosetta/locales_controller.rb
107
+ - app/controllers/rosetta/translations_controller.rb
108
+ - app/helpers/rosetta/application_helper.rb
109
+ - app/helpers/rosetta/dialog_helper.rb
110
+ - app/helpers/rosetta/navigation_helper.rb
111
+ - app/helpers/rosetta/translation_helper.rb
112
+ - app/jobs/rosetta/application_job.rb
113
+ - app/mailers/rosetta/application_mailer.rb
114
+ - app/models/rosetta/application_record.rb
115
+ - app/models/rosetta/locale.rb
116
+ - app/models/rosetta/translation.rb
117
+ - app/models/rosetta/translation_key.rb
118
+ - app/views/layouts/rosetta/_dialog.html.erb
119
+ - app/views/layouts/rosetta/_flashes.html.erb
120
+ - app/views/layouts/rosetta/_navbar.html.erb
121
+ - app/views/layouts/rosetta/application.html.erb
122
+ - app/views/rosetta/locales/_form.html.erb
123
+ - app/views/rosetta/locales/_locale.html.erb
124
+ - app/views/rosetta/locales/index.html.erb
125
+ - app/views/rosetta/locales/new.html.erb
126
+ - app/views/rosetta/locales/translations/_navigation.html.erb
127
+ - app/views/rosetta/locales/translations/_translation_key.html.erb
128
+ - app/views/rosetta/locales/translations/index.html.erb
129
+ - app/views/rosetta/translations/edit.html.erb
130
+ - config/initializers/pagy.rb
131
+ - config/routes.rb
132
+ - db/migrate/20240830123523_create_rosetta_tables.rb
133
+ - lib/rosetta-rails.rb
134
+ - lib/rosetta/configuration.rb
135
+ - lib/rosetta/engine.rb
136
+ - lib/rosetta/locale_session.rb
137
+ - lib/rosetta/store.rb
138
+ - lib/rosetta/version.rb
139
+ - lib/tasks/rosetta_tasks.rake
140
+ homepage: https://github.com/virolea/rosetta
141
+ licenses:
142
+ - MIT
143
+ metadata: {}
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ requirements: []
159
+ rubygems_version: 3.5.3
160
+ signing_key:
161
+ specification_version: 4
162
+ summary: Unobstrusive Internationalization solution for Rails applications.
163
+ test_files: []