cas-cms 0.1.0

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 (126) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +43 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/cas_manifest.js +2 -0
  6. data/app/assets/images/cas/black-star.svg +4 -0
  7. data/app/assets/images/cas/check.svg +4 -0
  8. data/app/assets/images/cas/dropzone-in.svg +4 -0
  9. data/app/assets/images/cas/loading.gif +0 -0
  10. data/app/assets/images/cas/white-star.svg +4 -0
  11. data/app/assets/javascripts/cas/application.js +51 -0
  12. data/app/assets/javascripts/cas/fileupload_manifest.js +269 -0
  13. data/app/assets/javascripts/cas/plugins/cas_image_gallery.js +353 -0
  14. data/app/assets/javascripts/cas/vendor/file_upload/canvas-to-blob.min.js +2 -0
  15. data/app/assets/javascripts/cas/vendor/file_upload/jquery.fileupload-image.js +326 -0
  16. data/app/assets/javascripts/cas/vendor/file_upload/jquery.fileupload-process.js +178 -0
  17. data/app/assets/javascripts/cas/vendor/file_upload/jquery.fileupload.js +1482 -0
  18. data/app/assets/javascripts/cas/vendor/file_upload/jquery.iframe-transport.js +224 -0
  19. data/app/assets/javascripts/cas/vendor/file_upload/jquery.ui.widget.js +572 -0
  20. data/app/assets/javascripts/cas/vendor/file_upload/load-image.all.min.js +2 -0
  21. data/app/assets/javascripts/cas/vendor/jquery.ui.touch-punch.min.js +11 -0
  22. data/app/assets/javascripts/cas/vendor/selectize.min.js +3 -0
  23. data/app/assets/stylesheets/cas/application.sass +17 -0
  24. data/app/assets/stylesheets/cas/colors.sass +6 -0
  25. data/app/assets/stylesheets/cas/form.sass +99 -0
  26. data/app/assets/stylesheets/cas/layout.sass +68 -0
  27. data/app/assets/stylesheets/cas/mixins.sass +34 -0
  28. data/app/assets/stylesheets/cas/plugins/attachments_form.sass +16 -0
  29. data/app/assets/stylesheets/cas/plugins/image_gallery.sass +128 -0
  30. data/app/assets/stylesheets/cas/tables.sass +13 -0
  31. data/app/assets/stylesheets/cas/typography.sass +27 -0
  32. data/app/assets/stylesheets/cas/vendors/selectize.default.css +394 -0
  33. data/app/assets/stylesheets/cas/vendors/simplegrid.css +298 -0
  34. data/app/controllers/cas/api/files_controller.rb +88 -0
  35. data/app/controllers/cas/application_controller.rb +17 -0
  36. data/app/controllers/cas/devise/sessions_controller.rb +9 -0
  37. data/app/controllers/cas/file_uploads_controller.rb +14 -0
  38. data/app/controllers/cas/sections/application_controller.rb +23 -0
  39. data/app/controllers/cas/sections/categories_controller.rb +47 -0
  40. data/app/controllers/cas/sections/contents_controller.rb +144 -0
  41. data/app/controllers/cas/sections_controller.rb +7 -0
  42. data/app/controllers/cas/users_controller.rb +61 -0
  43. data/app/helpers/cas/application_helper.rb +4 -0
  44. data/app/helpers/cas/form_helper.rb +11 -0
  45. data/app/jobs/cas/application_job.rb +4 -0
  46. data/app/jobs/cas/images/delete_job.rb +11 -0
  47. data/app/jobs/cas/images/promote_job.rb +11 -0
  48. data/app/jobs/cas/increment_pageviews_job.rb +11 -0
  49. data/app/models/cas/application_record.rb +5 -0
  50. data/app/models/cas/category.rb +6 -0
  51. data/app/models/cas/content.rb +59 -0
  52. data/app/models/cas/media_file.rb +77 -0
  53. data/app/models/cas/section.rb +10 -0
  54. data/app/models/cas/site.rb +5 -0
  55. data/app/models/cas/user.rb +39 -0
  56. data/app/uploaders/file_uploader.rb +26 -0
  57. data/app/views/cas/devise/sessions/new.html.erb +24 -0
  58. data/app/views/cas/sections/categories/_form.html.erb +19 -0
  59. data/app/views/cas/sections/categories/edit.html.erb +5 -0
  60. data/app/views/cas/sections/categories/index.html.erb +28 -0
  61. data/app/views/cas/sections/categories/new.html.erb +5 -0
  62. data/app/views/cas/sections/contents/_form_attachments.html.erb +42 -0
  63. data/app/views/cas/sections/contents/_form_attachments_template.html.erb +11 -0
  64. data/app/views/cas/sections/contents/_form_for_content.html.erb +85 -0
  65. data/app/views/cas/sections/contents/_form_for_survey.html.erb +36 -0
  66. data/app/views/cas/sections/contents/_form_images.html.erb +86 -0
  67. data/app/views/cas/sections/contents/edit.html.erb +6 -0
  68. data/app/views/cas/sections/contents/index.html.erb +71 -0
  69. data/app/views/cas/sections/contents/new.html.erb +5 -0
  70. data/app/views/cas/sections/index.html.erb +21 -0
  71. data/app/views/cas/shared/_error_messages.html.erb +12 -0
  72. data/app/views/cas/users/_form.html.erb +11 -0
  73. data/app/views/cas/users/edit.html.erb +2 -0
  74. data/app/views/cas/users/index.html.erb +34 -0
  75. data/app/views/cas/users/new.html.erb +2 -0
  76. data/app/views/layouts/cas/application.html.erb +71 -0
  77. data/config/initializers/acts_as_taggable.rb +1 -0
  78. data/config/initializers/devise.rb +277 -0
  79. data/config/initializers/shrine.rb +50 -0
  80. data/config/initializers/simple_form.rb +169 -0
  81. data/config/locales/devise.en.yml +64 -0
  82. data/config/locales/pt-BR.yml +242 -0
  83. data/config/locales/simple_form.en.yml +31 -0
  84. data/config/routes.rb +31 -0
  85. data/db/migrate/20170129212144_create_cas_sites.rb +15 -0
  86. data/db/migrate/20170219172958_create_cas_sections.rb +12 -0
  87. data/db/migrate/20170219175007_create_cas_contents.rb +17 -0
  88. data/db/migrate/20170612204500_create_cas_users.rb +14 -0
  89. data/db/migrate/20170613174724_create_cas_media_files.rb +20 -0
  90. data/db/migrate/20170613175912_create_cas_categories.rb +14 -0
  91. data/db/migrate/20170614171928_add_columns_to_cas_contents.rb +12 -0
  92. data/db/migrate/20170614172904_add_column_to_cas_sections.rb +6 -0
  93. data/db/migrate/20170615235532_add_devise_to_cas_users.rb +49 -0
  94. data/db/migrate/20170616011202_remove_password_from_cas_users.rb +5 -0
  95. data/db/migrate/20170618014204_v3_migration_fields.rb +30 -0
  96. data/db/migrate/20170623182702_add_column_category_id_to_cas_content.rb +6 -0
  97. data/db/migrate/20170624024648_rename_url_to_path_in_files.rb +7 -0
  98. data/db/migrate/20170625192119_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +36 -0
  99. data/db/migrate/20170625192120_add_missing_unique_indices.acts_as_taggable_on_engine.rb +26 -0
  100. data/db/migrate/20170625192121_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +20 -0
  101. data/db/migrate/20170625192122_add_missing_taggable_index.acts_as_taggable_on_engine.rb +15 -0
  102. data/db/migrate/20170625192123_change_collation_for_tag_names.acts_as_taggable_on_engine.rb +15 -0
  103. data/db/migrate/20170625192124_add_missing_indexes_on_taggings.acts_as_taggable_on_engine.rb +23 -0
  104. data/db/migrate/20170713210101_add_location_to_cas_content.rb +5 -0
  105. data/db/migrate/20170714043036_add_url_to_content.rb +5 -0
  106. data/db/migrate/20170718201535_add_embedded_to_content.rb +5 -0
  107. data/db/migrate/20170801171952_categories_with_jsonb_metadata.rb +6 -0
  108. data/db/migrate/20170801173256_add_published_at_to_cas_contents.rb +6 -0
  109. data/db/migrate/20170801175407_add_description_to_cas_categories.rb +5 -0
  110. data/db/migrate/20170830000000_add_data_search_extensions.rb +17 -0
  111. data/db/migrate/20170830000001_add_search_index_to_cas_contents.rb +20 -0
  112. data/db/migrate/20170830000002_use_uuid_with_acts_as_taggable_references.rb +17 -0
  113. data/db/migrate/20170919181809_pageviews_default_to_zero.rb +9 -0
  114. data/db/migrate/20171201191059_add_domains_to_cas_site.rb +6 -0
  115. data/lib/cas.rb +22 -0
  116. data/lib/cas/config.rb +42 -0
  117. data/lib/cas/engine.rb +33 -0
  118. data/lib/cas/form_field.rb +54 -0
  119. data/lib/cas/remote_callbacks.rb +36 -0
  120. data/lib/cas/section_config.rb +84 -0
  121. data/lib/cas/setup.rb +43 -0
  122. data/lib/cas/version.rb +3 -0
  123. data/lib/devise/custom_failure.rb +16 -0
  124. data/lib/tasks/cas_tasks.rake +4 -0
  125. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  126. metadata +560 -0
@@ -0,0 +1,50 @@
1
+ require 'shrine'
2
+
3
+ Shrine.plugin :activerecord
4
+ Shrine.plugin :presign_endpoint
5
+ Shrine.plugin :backgrounding
6
+
7
+ if Rails.env.test?
8
+ s3_options = {
9
+ access_key_id: 'access_key_id',
10
+ secret_access_key: 'secret_access_key',
11
+ region: 'us-east-1',
12
+ bucket: 'com.bucket'
13
+ }
14
+ require "shrine/storage/file_system"
15
+
16
+ Shrine.storages = {
17
+ cache: Shrine::Storage::FileSystem.new("tmp/uploads", prefix: "cache"),
18
+ store: Shrine::Storage::FileSystem.new("tmp/uploads", prefix: "store")
19
+ }
20
+ else
21
+ if ENV["S3_ACCESS_KEY_ID"].blank?
22
+ msg = "You need to configure S3 credentials. See the README.md for more details."
23
+ puts msg
24
+ Rails.logger.error msg
25
+ end
26
+
27
+ s3_options = {
28
+ access_key_id: ENV.fetch("S3_ACCESS_KEY_ID"),
29
+ secret_access_key: ENV.fetch("S3_SECRET_ACCESS_KEY"),
30
+ region: ENV.fetch("S3_REGION"),
31
+ bucket: ENV.fetch("S3_BUCKET"),
32
+ }
33
+
34
+ require "shrine/storage/s3"
35
+ config = Cas::Config.new.uploads
36
+ Shrine.storages = {
37
+ cache: Shrine::Storage::S3.new(prefix: config[:cache_directory_prefix], **s3_options),
38
+ store: Shrine::Storage::S3.new(prefix: config[:store_directory_prefix], **s3_options),
39
+ }
40
+ end
41
+
42
+ Shrine::Attacher.promote do |data|
43
+ Rails.logger.info "Shrine promoting file scheduled"
44
+ ::Cas::Images::PromoteJob.perform_async(data)
45
+ end
46
+
47
+ Shrine::Attacher.delete do |data|
48
+ Rails.logger.info "Shrine deleting file scheduled"
49
+ ::Cas::Images::DeleteJob.perform_async(data)
50
+ end
@@ -0,0 +1,169 @@
1
+ # Use this setup block to configure all options available in SimpleForm.
2
+ SimpleForm.setup do |config|
3
+ # Wrappers are used by the form builder to generate a
4
+ # complete input. You can remove any component from the
5
+ # wrapper, change the order or even add your own to the
6
+ # stack. The options given below are used to wrap the
7
+ # whole input.
8
+ config.wrappers :default, class: :input,
9
+ hint_class: :field_with_hint, error_class: :field_with_errors do |b|
10
+ ## Extensions enabled by default
11
+ # Any of these extensions can be disabled for a
12
+ # given input by passing: `f.input EXTENSION_NAME => false`.
13
+ # You can make any of these extensions optional by
14
+ # renaming `b.use` to `b.optional`.
15
+
16
+ # Determines whether to use HTML5 (:email, :url, ...)
17
+ # and required attributes
18
+ b.use :html5
19
+
20
+ # Calculates placeholders automatically from I18n
21
+ # You can also pass a string as f.input placeholder: "Placeholder"
22
+ b.use :placeholder
23
+
24
+ ## Optional extensions
25
+ # They are disabled unless you pass `f.input EXTENSION_NAME => true`
26
+ # to the input. If so, they will retrieve the values from the model
27
+ # if any exists. If you want to enable any of those
28
+ # extensions by default, you can change `b.optional` to `b.use`.
29
+
30
+ # Calculates maxlength from length validations for string inputs
31
+ # and/or database column lengths
32
+ b.optional :maxlength
33
+
34
+ # Calculate minlength from length validations for string inputs
35
+ b.optional :minlength
36
+
37
+ # Calculates pattern from format validations for string inputs
38
+ b.optional :pattern
39
+
40
+ # Calculates min and max from length validations for numeric inputs
41
+ b.optional :min_max
42
+
43
+ # Calculates readonly automatically from readonly attributes
44
+ b.optional :readonly
45
+
46
+ ## Inputs
47
+ b.use :label_input
48
+ b.use :hint, wrap_with: { tag: :span, class: :hint }
49
+ b.use :error, wrap_with: { tag: :span, class: :error }
50
+
51
+ ## full_messages_for
52
+ # If you want to display the full error message for the attribute, you can
53
+ # use the component :full_error, like:
54
+ #
55
+ # b.use :full_error, wrap_with: { tag: :span, class: :error }
56
+ end
57
+
58
+ # The default wrapper to be used by the FormBuilder.
59
+ config.default_wrapper = :default
60
+
61
+ # Define the way to render check boxes / radio buttons with labels.
62
+ # Defaults to :nested for bootstrap config.
63
+ # inline: input + label
64
+ # nested: label > input
65
+ config.boolean_style = :nested
66
+
67
+ # Default class for buttons
68
+ config.button_class = 'btn'
69
+
70
+ # Method used to tidy up errors. Specify any Rails Array method.
71
+ # :first lists the first message for each field.
72
+ # Use :to_sentence to list all errors for each field.
73
+ # config.error_method = :first
74
+
75
+ # Default tag used for error notification helper.
76
+ config.error_notification_tag = :div
77
+
78
+ # CSS class to add for error notification helper.
79
+ config.error_notification_class = 'error_notification'
80
+
81
+ # ID to add for error notification helper.
82
+ # config.error_notification_id = nil
83
+
84
+ # Series of attempts to detect a default label method for collection.
85
+ # config.collection_label_methods = [ :to_label, :name, :title, :to_s ]
86
+
87
+ # Series of attempts to detect a default value method for collection.
88
+ # config.collection_value_methods = [ :id, :to_s ]
89
+
90
+ # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
91
+ # config.collection_wrapper_tag = nil
92
+
93
+ # You can define the class to use on all collection wrappers. Defaulting to none.
94
+ # config.collection_wrapper_class = nil
95
+
96
+ # You can wrap each item in a collection of radio/check boxes with a tag,
97
+ # defaulting to :span.
98
+ # config.item_wrapper_tag = :span
99
+
100
+ # You can define a class to use in all item wrappers. Defaulting to none.
101
+ # config.item_wrapper_class = nil
102
+
103
+ # How the label text should be generated altogether with the required text.
104
+ # config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" }
105
+
106
+ # You can define the class to use on all labels. Default is nil.
107
+ # config.label_class = nil
108
+
109
+ # You can define the default class to be used on forms. Can be overriden
110
+ # with `html: { :class }`. Defaulting to none.
111
+ # config.default_form_class = nil
112
+
113
+ # You can define which elements should obtain additional classes
114
+ # config.generate_additional_classes_for = [:wrapper, :label, :input]
115
+
116
+ # Whether attributes are required by default (or not). Default is true.
117
+ # config.required_by_default = true
118
+
119
+ # Tell browsers whether to use the native HTML5 validations (novalidate form option).
120
+ # These validations are enabled in SimpleForm's internal config but disabled by default
121
+ # in this configuration, which is recommended due to some quirks from different browsers.
122
+ # To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations,
123
+ # change this configuration to true.
124
+ config.browser_validations = false
125
+
126
+ # Collection of methods to detect if a file type was given.
127
+ # config.file_methods = [ :mounted_as, :file?, :public_filename ]
128
+
129
+ # Custom mappings for input types. This should be a hash containing a regexp
130
+ # to match as key, and the input type that will be used when the field name
131
+ # matches the regexp as value.
132
+ # config.input_mappings = { /count/ => :integer }
133
+
134
+ # Custom wrappers for input types. This should be a hash containing an input
135
+ # type as key and the wrapper that will be used for all inputs with specified type.
136
+ # config.wrapper_mappings = { string: :prepend }
137
+
138
+ # Namespaces where SimpleForm should look for custom input classes that
139
+ # override default inputs.
140
+ # config.custom_inputs_namespaces << "CustomInputs"
141
+
142
+ # Default priority for time_zone inputs.
143
+ # config.time_zone_priority = nil
144
+
145
+ # Default priority for country inputs.
146
+ # config.country_priority = nil
147
+
148
+ # When false, do not use translations for labels.
149
+ # config.translate_labels = true
150
+
151
+ # Automatically discover new inputs in Rails' autoload path.
152
+ # config.inputs_discovery = true
153
+
154
+ # Cache SimpleForm inputs discovery
155
+ # config.cache_discovery = !Rails.env.development?
156
+
157
+ # Default class for inputs
158
+ # config.input_class = nil
159
+
160
+ # Define the default class of the input wrapper of the boolean input.
161
+ config.boolean_label_class = 'checkbox'
162
+
163
+ # Defines if the default input wrapper class should be included in radio
164
+ # collection wrappers.
165
+ # config.include_default_input_wrapper_class = true
166
+
167
+ # Defines which i18n scope will be used in Simple Form.
168
+ # config.i18n_scope = 'simple_form'
169
+ end
@@ -0,0 +1,64 @@
1
+ # Additional translations at https://github.com/plataformatec/devise/wiki/I18n
2
+
3
+ en:
4
+ devise:
5
+ confirmations:
6
+ confirmed: "Your email address has been successfully confirmed."
7
+ send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
8
+ send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
9
+ failure:
10
+ already_authenticated: "You are already signed in."
11
+ inactive: "Your account is not activated yet."
12
+ invalid: "Invalid %{authentication_keys} or password."
13
+ locked: "Your account is locked."
14
+ last_attempt: "You have one more attempt before your account is locked."
15
+ not_found_in_database: "Invalid %{authentication_keys} or password."
16
+ timeout: "Your session expired. Please sign in again to continue."
17
+ unauthenticated: "You need to sign in or sign up before continuing."
18
+ unconfirmed: "You have to confirm your email address before continuing."
19
+ mailer:
20
+ confirmation_instructions:
21
+ subject: "Confirmation instructions"
22
+ reset_password_instructions:
23
+ subject: "Reset password instructions"
24
+ unlock_instructions:
25
+ subject: "Unlock instructions"
26
+ email_changed:
27
+ subject: "Email Changed"
28
+ password_change:
29
+ subject: "Password Changed"
30
+ omniauth_callbacks:
31
+ failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
32
+ success: "Successfully authenticated from %{kind} account."
33
+ passwords:
34
+ no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
35
+ send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
36
+ send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
37
+ updated: "Your password has been changed successfully. You are now signed in."
38
+ updated_not_active: "Your password has been changed successfully."
39
+ registrations:
40
+ destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
41
+ signed_up: "Welcome! You have signed up successfully."
42
+ signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
43
+ signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
44
+ signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
45
+ update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
46
+ updated: "Your account has been updated successfully."
47
+ sessions:
48
+ signed_in: "Signed in successfully."
49
+ signed_out: "Signed out successfully."
50
+ already_signed_out: "Signed out successfully."
51
+ unlocks:
52
+ send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
53
+ send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
54
+ unlocked: "Your account has been unlocked successfully. Please sign in to continue."
55
+ errors:
56
+ messages:
57
+ already_confirmed: "was already confirmed, please try signing in"
58
+ confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
59
+ expired: "has expired, please request a new one"
60
+ not_found: "not found"
61
+ not_locked: "was not locked"
62
+ not_saved:
63
+ one: "1 error prohibited this %{resource} from being saved:"
64
+ other: "%{count} errors prohibited this %{resource} from being saved:"
@@ -0,0 +1,242 @@
1
+ ---
2
+ pt-BR:
3
+ activerecord:
4
+ attributes:
5
+ cas/user:
6
+ name: 'Nome'
7
+ password: 'Senha'
8
+ password_confirmation: 'Confirmação de Senha'
9
+ errors:
10
+ messages:
11
+ record_invalid: 'A validação falhou: %{errors}'
12
+ restrict_dependent_destroy:
13
+ has_one: Não é possível excluir o registro pois existe um %{record} dependente
14
+ has_many: Não é possível excluir o registro pois existem %{record} dependentes
15
+ views:
16
+ pagination:
17
+ first: "&laquo; Primeira"
18
+ last: "Última &raquo;"
19
+ previous: "&lsaquo; Anterior"
20
+ next: "Próxima &rsaquo;"
21
+ truncate: "&hellip;"
22
+ helpers:
23
+ page_entries_info:
24
+ one_page:
25
+ display_entries:
26
+ zero: "No %{entry_name} found"
27
+ one: "Displaying <b>1</b> %{entry_name}"
28
+ other: "Displaying <b>all %{count}</b> %{entry_name}"
29
+ more_pages:
30
+ display_entries: "Displaying %{entry_name} <b>%{first}&nbsp;-&nbsp;%{last}</b> of <b>%{total}</b> in total"
31
+ date:
32
+ abbr_day_names:
33
+ - Dom
34
+ - Seg
35
+ - Ter
36
+ - Qua
37
+ - Qui
38
+ - Sex
39
+ - Sáb
40
+ abbr_month_names:
41
+ -
42
+ - Jan
43
+ - Fev
44
+ - Mar
45
+ - Abr
46
+ - Mai
47
+ - Jun
48
+ - Jul
49
+ - Ago
50
+ - Set
51
+ - Out
52
+ - Nov
53
+ - Dez
54
+ day_names:
55
+ - Domingo
56
+ - Segunda-feira
57
+ - Terça-feira
58
+ - Quarta-feira
59
+ - Quinta-feira
60
+ - Sexta-feira
61
+ - Sábado
62
+ formats:
63
+ default: "%d/%m/%Y"
64
+ long: "%d de %B de %Y"
65
+ short: "%d de %B"
66
+ month_names:
67
+ -
68
+ - Janeiro
69
+ - Fevereiro
70
+ - Março
71
+ - Abril
72
+ - Maio
73
+ - Junho
74
+ - Julho
75
+ - Agosto
76
+ - Setembro
77
+ - Outubro
78
+ - Novembro
79
+ - Dezembro
80
+ order:
81
+ - :day
82
+ - :month
83
+ - :year
84
+ datetime:
85
+ distance_in_words:
86
+ about_x_hours:
87
+ one: aproximadamente 1 hora
88
+ other: aproximadamente %{count} horas
89
+ about_x_months:
90
+ one: aproximadamente 1 mês
91
+ other: aproximadamente %{count} meses
92
+ about_x_years:
93
+ one: aproximadamente 1 ano
94
+ other: aproximadamente %{count} anos
95
+ almost_x_years:
96
+ one: quase 1 ano
97
+ other: quase %{count} anos
98
+ half_a_minute: meio minuto
99
+ less_than_x_minutes:
100
+ one: menos de um minuto
101
+ other: menos de %{count} minutos
102
+ less_than_x_seconds:
103
+ one: menos de 1 segundo
104
+ other: menos de %{count} segundos
105
+ over_x_years:
106
+ one: mais de 1 ano
107
+ other: mais de %{count} anos
108
+ x_days:
109
+ one: 1 dia
110
+ other: "%{count} dias"
111
+ x_minutes:
112
+ one: 1 minuto
113
+ other: "%{count} minutos"
114
+ x_months:
115
+ one: 1 mês
116
+ other: "%{count} meses"
117
+ x_years:
118
+ one: 1 ano
119
+ other: "%{count} anos"
120
+ x_seconds:
121
+ one: 1 segundo
122
+ other: "%{count} segundos"
123
+ prompts:
124
+ day: Dia
125
+ hour: Hora
126
+ minute: Minuto
127
+ month: Mês
128
+ second: Segundo
129
+ year: Ano
130
+ errors:
131
+ format: "%{attribute} %{message}"
132
+ messages:
133
+ accepted: deve ser aceito
134
+ blank: não pode ficar em branco
135
+ present: deve ficar em branco
136
+ confirmation: não é igual a %{attribute}
137
+ empty: não pode ficar vazio
138
+ equal_to: deve ser igual a %{count}
139
+ even: deve ser par
140
+ exclusion: não está disponível
141
+ greater_than: deve ser maior que %{count}
142
+ greater_than_or_equal_to: deve ser maior ou igual a %{count}
143
+ inclusion: não está incluído na lista
144
+ invalid: não é válido
145
+ less_than: deve ser menor que %{count}
146
+ less_than_or_equal_to: deve ser menor ou igual a %{count}
147
+ model_invalid: 'A validação falhou: %{errors}'
148
+ not_a_number: não é um número
149
+ not_an_integer: não é um número inteiro
150
+ odd: deve ser ímpar
151
+ required: é obrigatório(a)
152
+ taken: já está em uso
153
+ too_long:
154
+ one: 'é muito longo (máximo: 1 caracter)'
155
+ other: 'é muito longo (máximo: %{count} caracteres)'
156
+ too_short:
157
+ one: 'é muito curto (mínimo: 1 caracter)'
158
+ other: 'é muito curto (mínimo: %{count} caracteres)'
159
+ wrong_length:
160
+ one: não possui o tamanho esperado (1 caracter)
161
+ other: não possui o tamanho esperado (%{count} caracteres)
162
+ other_than: deve ser diferente de %{count}
163
+ template:
164
+ body: 'Por favor, verifique o(s) seguinte(s) campo(s):'
165
+ header:
166
+ one: 'Não foi possível gravar %{model}: 1 erro'
167
+ other: 'Não foi possível gravar %{model}: %{count} erros'
168
+ helpers:
169
+ select:
170
+ prompt: Por favor selecione
171
+ submit:
172
+ create: Criar %{model}
173
+ submit: Salvar %{model}
174
+ update: Atualizar %{model}
175
+ number:
176
+ currency:
177
+ format:
178
+ delimiter: "."
179
+ format: "%u %n"
180
+ precision: 2
181
+ separator: ","
182
+ significant: false
183
+ strip_insignificant_zeros: false
184
+ unit: R$
185
+ format:
186
+ delimiter: "."
187
+ precision: 3
188
+ separator: ","
189
+ significant: false
190
+ strip_insignificant_zeros: false
191
+ human:
192
+ decimal_units:
193
+ format: "%n %u"
194
+ units:
195
+ billion:
196
+ one: bilhão
197
+ other: bilhões
198
+ million:
199
+ one: milhão
200
+ other: milhões
201
+ quadrillion:
202
+ one: quatrilhão
203
+ other: quatrilhões
204
+ thousand: mil
205
+ trillion:
206
+ one: trilhão
207
+ other: trilhões
208
+ unit: ''
209
+ format:
210
+ delimiter: ""
211
+ precision: 3
212
+ significant: true
213
+ strip_insignificant_zeros: true
214
+ storage_units:
215
+ format: "%n %u"
216
+ units:
217
+ byte:
218
+ one: Byte
219
+ other: Bytes
220
+ gb: GB
221
+ kb: KB
222
+ mb: MB
223
+ tb: TB
224
+ percentage:
225
+ format:
226
+ delimiter: "."
227
+ format: "%n%"
228
+ precision:
229
+ format:
230
+ delimiter: "."
231
+ support:
232
+ array:
233
+ last_word_connector: " e "
234
+ two_words_connector: " e "
235
+ words_connector: ", "
236
+ time:
237
+ am: ''
238
+ formats:
239
+ default: "%a, %d de %B de %Y, %H:%M:%S %z"
240
+ long: "%d de %B de %Y, %H:%M"
241
+ short: "%d/%B/%Y, %H:%M"
242
+ pm: ''