roda-project 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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/bin/console +11 -0
  3. data/bin/roda-project +6 -0
  4. data/bin/roda-project.rb +9 -0
  5. data/bin/setup +8 -0
  6. data/lib/roda/project/cli.rb +134 -0
  7. data/lib/roda/project/context.rb +136 -0
  8. data/lib/roda/project/helpers/ids.rb +15 -0
  9. data/lib/roda/project/helpers/input.rb +20 -0
  10. data/lib/roda/project/helpers/template.rb +37 -0
  11. data/lib/roda/project/version.rb +7 -0
  12. data/lib/roda/project.rb +54 -0
  13. data/lib/roda/templates/base/app/app.rb.erb +87 -0
  14. data/lib/roda/templates/base/scaffold/AGENTS.md +9 -0
  15. data/lib/roda/templates/base/scaffold/Gemfile.erb +51 -0
  16. data/lib/roda/templates/base/scaffold/Guardfile +25 -0
  17. data/lib/roda/templates/base/scaffold/README.md +29 -0
  18. data/lib/roda/templates/base/scaffold/Rakefile.erb +209 -0
  19. data/lib/roda/templates/base/scaffold/app/config/config.rb.erb +25 -0
  20. data/lib/roda/templates/base/scaffold/app/config/locales/en.yml +273 -0
  21. data/lib/roda/templates/base/scaffold/app/config/locales/foo/en.yml +2 -0
  22. data/lib/roda/templates/base/scaffold/app/config/locales/foo/pt-br.yml +2 -0
  23. data/lib/roda/templates/base/scaffold/app/config/locales/pt-br.yml +244 -0
  24. data/lib/roda/templates/base/scaffold/app/config/providers/logger.rb +9 -0
  25. data/lib/roda/templates/base/scaffold/app/config/providers/mailer.rb +11 -0
  26. data/lib/roda/templates/base/scaffold/app/routes/foo.rb.erb +7 -0
  27. data/lib/roda/templates/base/scaffold/boot.rb.erb +35 -0
  28. data/lib/roda/templates/base/scaffold/config.ru.erb +13 -0
  29. data/lib/roda/templates/base/scaffold/public/css/app.css +1 -0
  30. data/lib/roda/templates/base/scaffold/public/exception_page.css +16 -0
  31. data/lib/roda/templates/base/scaffold/public/images/roda-project.png +0 -0
  32. data/lib/roda/templates/base/scaffold/public/js/app.js +27 -0
  33. data/lib/roda/templates/database/app/config/providers/db/conn.rb +15 -0
  34. data/lib/roda/templates/database/db/seeds.rb +1 -0
  35. data/lib/roda/templates/front-end/app/assets/css/app.css +20 -0
  36. data/lib/roda/templates/front-end/app/assets/js/app.js +7 -0
  37. data/lib/roda/templates/front-end/app/assets/js/some/foo.js +5 -0
  38. data/lib/roda/templates/front-end/app/views/foo/bar.erb +1 -0
  39. data/lib/roda/templates/front-end/app/views/foo/html.rb +6 -0
  40. data/lib/roda/templates/front-end/app/views/html.rb +22 -0
  41. data/lib/roda/templates/front-end/app/views/index.erb +1 -0
  42. data/lib/roda/templates/front-end/app/views/layout.erb +13 -0
  43. data/lib/roda/templates/front-end/esbuild.js +39 -0
  44. data/lib/roda/templates/front-end/package.json +20 -0
  45. data/lib/roda/templates/rodauth/app/models/account.rb +2 -0
  46. data/lib/roda/templates/rodauth/app/views/create-account.erb +9 -0
  47. data/lib/roda/templates/rodauth/db/migrations/001_add_rodauth.rb +71 -0
  48. data/lib/roda/templates/tests/minitest/spec/app/app_spec.rb.erb +15 -0
  49. data/lib/roda/templates/tests/minitest/spec/app/routes/foo_spec.rb +8 -0
  50. data/lib/roda/templates/tests/minitest/spec/app/routes/test_branch_spec.rb +4 -0
  51. data/lib/roda/templates/tests/minitest/spec/app/views/html_spec.rb +0 -0
  52. data/lib/roda/templates/tests/minitest/spec/spec_helper.rb.erb +33 -0
  53. data/lib/roda/templates/tests/rspec/spec/app/app_spec.rb.erb +15 -0
  54. data/lib/roda/templates/tests/rspec/spec/app/routes/foo_spec.rb +8 -0
  55. data/lib/roda/templates/tests/rspec/spec/app/routes/test_branch_spec.rb +4 -0
  56. data/lib/roda/templates/tests/rspec/spec/app/views/html_spec.rb +0 -0
  57. data/lib/roda/templates/tests/rspec/spec/spec_helper.rb.erb +19 -0
  58. metadata +142 -0
@@ -0,0 +1,209 @@
1
+ # Rakefile
2
+
3
+ require "fileutils"
4
+
5
+ # List rake tasks
6
+ task :default do
7
+ system("rake -T")
8
+ end
9
+ <% if context.database? %>
10
+ # DB Migrate Task
11
+ namespace :db do
12
+ desc "Migrate the database. Optional: provide target version, e.g., 'rake db:migrate[123]'"
13
+ task :migrate, [:target] do |t, args|
14
+ require_relative "boot"
15
+ require "sequel"
16
+ require "sequel/extensions/migration"
17
+
18
+ Sequel.extension :migration
19
+ db = Providers::DB::Conn.get
20
+ if args[:target]
21
+ Sequel::Migrator.run(db, "db/migrations", target: args[:target].to_i)
22
+ else
23
+ Sequel::Migrator.run(db, "db/migrations")
24
+ end
25
+ puts "Database migration complete."
26
+ end
27
+ end
28
+ <% end %>
29
+ # Console Task
30
+ desc "Open a console with application context (alias: rake c)"
31
+ task :console do
32
+ system("irb -r ./boot.rb")
33
+ end
34
+ task c: :console
35
+
36
+ # Lint Task
37
+ desc "Run lint"
38
+ task :lint do
39
+ system("bundle exec standardrb")
40
+ end
41
+
42
+ # Lint Fix Task
43
+ desc "Auto fix lint warnings"
44
+ task "lint:fix" do
45
+ system("bundle exec standardrb --fix")
46
+ end
47
+
48
+ # Test Task
49
+ desc "Run tests"
50
+ task :test do<% if context.rspec? %>
51
+ system("RACK_ENV=test bundle exec rspec")<% else %>
52
+ system("RACK_ENV=test bundle exec minitest spec/")<% end %>
53
+ end
54
+
55
+ # Development Server Task
56
+ desc "Exec development server"
57
+ task :dev do
58
+ system("RACK_ENV=development bundle exec puma --port 4000")
59
+ end
60
+
61
+ # Development Watch Task
62
+ desc "Exec development server watching for changes"
63
+ task "dev:watch" do
64
+ system("RACK_ENV=development bundle exec guard")
65
+ end
66
+
67
+ # Development Assets Task
68
+ desc "Watch and compile assets"
69
+ task :assets do
70
+ system("npm i && npm run build")
71
+ end
72
+
73
+ # Development Assets Task
74
+ desc "Watch and compile assets"
75
+ task "assets:watch" do
76
+ system("npm i && npm run build:watch")
77
+ end
78
+
79
+ # Production Server Task
80
+ desc "Exec production server"
81
+ task :prod do
82
+ if ENV["DATABASE_URL"].nil?
83
+ puts("DATABASE_URL is empty")
84
+ exit 1
85
+ end
86
+ if ENV["SESSION_SECRET"].nil?
87
+ puts("SESSION_SECRET is empty")
88
+ exit 1
89
+ end
90
+ system("RUBYOPT=--yjit RUBY_YJIT_ENABLE=1 RACK_ENV=production bundle exec puma --port 4000")
91
+ end
92
+
93
+ # Generate Tasks
94
+ namespace :g do<% if context.database? %>
95
+ desc "Generate an empty Sequel migration. Usage: 'rake generate:migration[migration_name]'"
96
+ task :migration, [:migration_name] do |t, args|
97
+ migration_name = args[:migration_name]
98
+ if migration_name.nil? || migration_name.empty?
99
+ puts "Usage: rake generate:migration[migration_name]"
100
+ exit 1
101
+ end
102
+
103
+ migrations_path = File.expand_path("./db/migrations", __dir__)
104
+ FileUtils.mkdir_p(migrations_path) unless File.directory?(migrations_path)
105
+
106
+ existing_migrations = Dir.glob(File.join(migrations_path, "*.rb"))
107
+ max_number = existing_migrations.map do |file|
108
+ File.basename(file).match(/^(\d+)/)&.captures&.first.to_i
109
+ end.max || 0
110
+ next_number = (max_number + 1).to_s.rjust(3, "0")
111
+
112
+ filename = File.join(migrations_path, "#{next_number}_#{migration_name}.rb")
113
+
114
+ content = <<~RUBY
115
+ Sequel.migration do
116
+ up do
117
+ # add your migration here
118
+ end
119
+
120
+ down do
121
+ # remove your migration here
122
+ end
123
+ end
124
+ RUBY
125
+
126
+ File.write(filename, content)
127
+ puts "Created migration: #{filename}"
128
+ end
129
+ <% end %>
130
+ desc "Generate routes and tests, also generate views if views directory is present. Usage: 'rake generate:routes[branch_name,route1,method:route2]'"
131
+ task :routes, [:branch_name, :routes] do |t, args|
132
+ branch_name = args.branch_name
133
+ routes_list = [args.routes].concat(args.extras)
134
+
135
+ if branch_name.nil? || branch_name.empty? || routes_list.nil? || routes_list.empty?
136
+ puts "Usage: rake generate:routes[branch_name,route1,route2:method]"
137
+ exit 1
138
+ end
139
+
140
+ must_generate_views = Dir.exist?(File.expand_path("../../app/views", __dir__))
141
+ ensure_and_get_path = proc do |path|
142
+ base_path = File.expand_path(path, __dir__)
143
+ full_path_dir = File.join(base_path, File.dirname(branch_name))
144
+ FileUtils.mkdir_p(full_path_dir) unless File.directory?(full_path_dir)
145
+
146
+ base_path
147
+ end
148
+ parse_route_string = proc do
149
+ name, method = route_str.split(":", 2)
150
+ method ||= "get"
151
+ [method, name]
152
+ end
153
+
154
+ # Generate routes
155
+ filename = File.join(ensure_and_get_path.call("../../app/routes"), "#{branch_name}.rb")
156
+ route_definitions = routes_list.map do |route_str|
157
+ method, name = parse_route_string.call(route_str)
158
+ view_line = (method == "get" && must_generate_views) ? "\n view('#{name}')" : ""
159
+ " r.#{method} \"#{name}\" do#{view_line}\n end"
160
+ end.join("\n\n")
161
+
162
+ content = <<~RUBY
163
+ class <%= context.const_project_name %>
164
+ branch "#{branch_name}" do |r|
165
+ #{route_definitions}
166
+ end
167
+ end
168
+ RUBY
169
+ File.write(filename, content)
170
+ puts "Created routes file: #{filename}"
171
+
172
+ # Generate views
173
+ if must_generate_views
174
+ branch_views_dir = File.join(File.expand_path("../../app/views", __dir__), branch_name)
175
+ FileUtils.mkdir_p(branch_views_dir)
176
+ routes_list.each do |route_str|
177
+ method, name = parse_route_string.call(route_str)
178
+ if method == "get"
179
+ view_filename = File.join(branch_views_dir, "#{name}.erb")
180
+ File.write(view_filename, "")
181
+ puts "Created view file: #{view_filename}"
182
+ end
183
+ end
184
+ end
185
+
186
+ # Generate tests
187
+ test_filename = File.join(ensure_and_get_path.call("../../spec/app/routes"), "#{branch_name}_spec.rb")
188
+ nesting_level = branch_name.count("/")
189
+ relative_spec_helper_path = "../" * (2 + nesting_level) + "spec_helper"
190
+
191
+ test_route_definitions = routes_list.map do |route_str|
192
+ method, name = parse_route_string.call(route_str)
193
+ " it \"responds to #{method.upcase} /#{branch_name}/#{name}\" do\n" \
194
+ " #{method} \"/#{branch_name}/#{name}\"\n" \
195
+ " expect(last_response.status).to eq(200)\n" \
196
+ " end"
197
+ end.join("\n")
198
+
199
+ test_content = <<~RUBY
200
+ require_relative "#{relative_spec_helper_path}"
201
+
202
+ describe "Routes for #{branch_name}" do
203
+ #{test_route_definitions}
204
+ end
205
+ RUBY
206
+ File.write(test_filename, test_content)
207
+ puts "Created test file: #{test_filename}"
208
+ end
209
+ end
@@ -0,0 +1,25 @@
1
+ module Config
2
+ class << self
3
+ def get
4
+ @config ||= {
5
+ secret: ENV["SESSION_SECRET"] || 'DEV-ONLY-8<FQF8HiF)>l0hbPk£vBQ#IrYsoO}14k\l+-/gIU[j}l0hbPk£vBQ#IrY',
6
+ environment:,
7
+ hmac_secret: ENV["RODAUTH_HMAC_SECRET"] || 'DEV-ONLY',
8
+ jwt_secret: ENV["JWT_SECRET"] || 'DEV-ONLY',
9
+ i18n: {
10
+ translations: ["app/config/locales", "app/config/locales/foo"],
11
+ locale: ["en", "pt-br"]
12
+ },<% if context.database? %>
13
+ db: {
14
+ url: not_production? ? <%= context.dev_db_url %> : ENV["DATABASE_URL"]
15
+ }<% end %>
16
+ }
17
+ end
18
+
19
+ def not_production? = environment != "production"
20
+
21
+ def environment
22
+ ENV["RACK_ENV"] || "development"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,273 @@
1
+ hello:
2
+ message: Hello world
3
+ rodauth:
4
+ #account_expiration_error_flash: You cannot log into this account as it has expired
5
+ #active_sessions_error_flash: This session has been logged out
6
+ #add_recovery_codes_button: Add Authentication Recovery Codes
7
+ #add_recovery_codes_error_flash: Unable to add recovery codes
8
+ #add_recovery_codes_heading: "<h2>Add Additional Recovery Codes</h2>"
9
+ #add_recovery_codes_page_title: Authentication Recovery Codes
10
+ #already_an_account_with_this_login_message: already an account with this login
11
+ #attempt_to_create_unverified_account_error_flash: The account you tried to create is currently awaiting verification
12
+ #attempt_to_login_to_unverified_account_error_flash: The account you tried to login with is currently awaiting verification
13
+ #change_login_button: Change Login
14
+ #change_login_error_flash: There was an error changing your login
15
+ #change_login_needs_verification_notice_flash: An email has been sent to you with a link to verify your login change
16
+ #change_login_notice_flash: Your login has been changed
17
+ #change_login_page_title: Change Login
18
+ #change_password_button: Change Password
19
+ #change_password_error_flash: There was an error changing your password
20
+ #change_password_notice_flash: Your password has been changed
21
+ #change_password_page_title: Change Password
22
+ #close_account_button: Close Account
23
+ #close_account_error_flash: There was an error closing your account
24
+ #close_account_notice_flash: Your account has been closed
25
+ #close_account_page_title: Close Account
26
+ #confirm_password_button: Confirm Password
27
+ #confirm_password_error_flash: There was an error confirming your password
28
+ #confirm_password_link_text: Enter Password
29
+ #confirm_password_notice_flash: Your password has been confirmed
30
+ #confirm_password_page_title: Confirm Password
31
+ #contains_null_byte_message: contains null byte
32
+ create_account_button: Create Account
33
+ #create_account_error_flash: There was an error creating your account
34
+ #create_account_link_text: Create a New Account
35
+ #create_account_notice_flash: Your account has been created
36
+ #create_account_page_title: Create Account
37
+ #email_auth_email_recently_sent_error_flash: An email has recently been sent to you with a link to login
38
+ #email_auth_email_sent_notice_flash: An email has been sent to you with a link to login to your account
39
+ #email_auth_email_subject: Login Link
40
+ #email_auth_error_flash: There was an error logging you in
41
+ #email_auth_page_title: Login
42
+ #email_auth_request_button: Send Login Link Via Email
43
+ #email_auth_request_error_flash: There was an error requesting an email link to authenticate
44
+ #email_subject_prefix: ''
45
+ #expired_jwt_access_token_message: expired JWT access token
46
+ #global_logout_label: Logout all Logged In Sessions?
47
+ #input_field_label_suffix: ''
48
+ #invalid_jwt_format_error_message: invalid JWT format or claim in Authorization header
49
+ #invalid_password_message: invalid password
50
+ #invalid_recovery_code_error_flash: Error authenticating via recovery code
51
+ #invalid_recovery_code_message: Invalid recovery code
52
+ #json_non_post_error_message: non-POST method used in JSON API
53
+ #json_not_accepted_error_message: Unsupported Accept header. Must accept "application/json" or compatible content type
54
+ #jwt_refresh_invalid_token_message: invalid JWT refresh token
55
+ #jwt_refresh_without_access_token_message: no JWT access token provided during refresh
56
+ #login_button: Login
57
+ #login_confirm_label: Confirm %{login_label}
58
+ #login_does_not_meet_requirements_message: invalid login, does not meet requirements
59
+ #login_error_flash: There was an error logging in
60
+ #login_form_footer_links_heading: <h2 class="rodauth-login-form-footer-links-heading">Other Options</h2>
61
+ #login_label: Login
62
+ #login_lockout_error_flash: This account is currently locked out and cannot be logged in to
63
+ #login_not_valid_email_message: not a valid email address
64
+ #login_notice_flash: You have been logged in
65
+ #login_page_title: Login
66
+ #login_too_long_message: maximum %{login_maximum_length} characters
67
+ #login_too_many_bytes_message: maximum %{login_maximum_bytes} bytes
68
+ #login_too_short_message: minimum %{login_minimum_length} characters
69
+ #logins_do_not_match_message: logins do not match
70
+ #logout_button: Logout
71
+ #logout_notice_flash: You have been logged out
72
+ #logout_page_title: Logout
73
+ #multi_phase_login_page_title: Login
74
+ #need_password_notice_flash: Login recognized, please enter your password
75
+ #new_password_label: New Password
76
+ #no_current_sms_code_error_flash: No current SMS code for this account
77
+ #no_matching_email_auth_key_error_flash: 'There was an error logging you in: invalid email authentication key'
78
+ #no_matching_login_message: no matching login
79
+ #no_matching_reset_password_key_error_flash: 'There was an error resetting your password: invalid or expired password reset key'
80
+ #no_matching_unlock_account_key_error_flash: 'There was an error unlocking your account: invalid or expired unlock account key'
81
+ #no_matching_verify_account_key_error_flash: 'There was an error verifying your account: invalid verify account key'
82
+ #no_matching_verify_login_change_key_error_flash: 'There was an error verifying your login change: invalid verify login change key'
83
+ #non_json_request_error_message: Only JSON format requests are allowed
84
+ #otp_already_setup_error_flash: You have already setup TOTP authentication
85
+ #otp_auth_button: Authenticate Using TOTP
86
+ #otp_auth_error_flash: Error logging in via TOTP authentication
87
+ #otp_auth_form_footer: ''
88
+ #otp_auth_label: Authentication Code
89
+ #otp_auth_link_text: Authenticate Using TOTP
90
+ #otp_auth_page_title: Enter Authentication Code
91
+ #otp_disable_button: Disable TOTP Authentication
92
+ #otp_disable_error_flash: Error disabling TOTP authentication
93
+ #otp_disable_link_text: Disable TOTP Authentication
94
+ #otp_disable_notice_flash: TOTP authentication has been disabled
95
+ #otp_disable_page_title: Disable TOTP Authentication
96
+ #otp_disabled_email_subject: TOTP Authentication Disabled
97
+ #otp_invalid_auth_code_message: Invalid authentication code
98
+ #otp_invalid_secret_message: invalid secret
99
+ #otp_locked_out_email_subject: TOTP Authentication Locked Out
100
+ #otp_lockout_error_flash: TOTP authentication code use locked out due to numerous failures
101
+ #otp_provisioning_uri_label: Provisioning URL
102
+ #otp_secret_label: Secret
103
+ #otp_setup_button: Setup TOTP Authentication
104
+ #otp_setup_email_subject: TOTP Authentication Setup
105
+ #otp_setup_error_flash: Error setting up TOTP authentication
106
+ #otp_setup_link_text: Setup TOTP Authentication
107
+ #otp_setup_notice_flash: TOTP authentication is now setup
108
+ #otp_setup_page_title: Setup TOTP Authentication
109
+ #otp_unlock_auth_deadline_passed_error_flash: Deadline past for unlocking TOTP authentication
110
+ #otp_unlock_auth_failure_error_flash: TOTP invalid authentication
111
+ #otp_unlock_auth_not_yet_available_error_flash: TOTP unlock attempt not yet available
112
+ #otp_unlock_auth_success_notice_flash: TOTP successful authentication, more successful authentication needed to unlock
113
+ #otp_unlock_button: Authenticate Using TOTP to Unlock
114
+ #otp_unlock_consecutive_successes_label: Consecutive successful authentications
115
+ #otp_unlock_failed_email_subject: TOTP Authentication Unlocking Failed
116
+ #otp_unlock_form_footer: ''
117
+ #otp_unlock_next_auth_attempt_label: Can attempt next authentication after
118
+ #otp_unlock_next_auth_attempt_refresh_label: Page will automatically refresh when authentication is possible.
119
+ #otp_unlock_next_auth_deadline_label: Deadline for next authentication
120
+ #otp_unlock_not_available_page_title: Must Wait to Unlock TOTP Authentication
121
+ #otp_unlock_not_locked_out_error_flash: TOTP authentication is not currently locked out
122
+ #otp_unlock_page_title: Unlock TOTP Authentication
123
+ #otp_unlock_required_consecutive_successes_label: Required consecutive successful authentications to unlock
124
+ #otp_unlocked_email_subject: TOTP Authentication Unlocked
125
+ #otp_unlocked_notice_flash: TOTP authentication unlocked
126
+ #password_authentication_required_error_flash: You need to confirm your password before continuing
127
+ #password_changed_email_subject: Password Changed
128
+ #password_confirm_label: Confirm %{password_label}
129
+ #password_does_not_meet_requirements_message: invalid password, does not meet requirements
130
+ #password_expiration_error_flash: Your password has expired and needs to be changed
131
+ #password_in_dictionary_message: is a word in a dictionary
132
+ #password_invalid_pattern_message: includes common character sequence
133
+ #password_is_one_of_the_most_common_message: is one of the most common passwords
134
+ #password_label: Password
135
+ #password_not_changeable_yet_error_flash: Your password cannot be changed yet
136
+ #password_not_enough_character_groups_message: does not include uppercase letters, lowercase letters, and numbers
137
+ #password_same_as_previous_password_message: same as previous password
138
+ #password_too_many_repeating_characters_message: contains too many of the same character in a row
139
+ #password_too_long_message: maximum %{password_maximum_length} characters
140
+ #password_too_many_bytes_message: maximum %{password_maximum_bytes} bytes
141
+ #password_too_short_message: minimum %{password_minimum_length} characters
142
+ #passwords_do_not_match_message: passwords do not match
143
+ #recovery_auth_button: Authenticate via Recovery Code
144
+ #recovery_auth_link_text: Authenticate Using Recovery Code
145
+ #recovery_auth_page_title: Enter Authentication Recovery Code
146
+ #recovery_codes_added_notice_flash: Additional authentication recovery codes have been added
147
+ #recovery_codes_label: Recovery Code
148
+ #recovery_codes_link_text: View Authentication Recovery Codes
149
+ #recovery_codes_page_title: View Authentication Recovery Codes
150
+ #remember_button: Change Remember Setting
151
+ #remember_disable_label: Disable Remember Me
152
+ #remember_error_flash: There was an error updating your remember setting
153
+ #remember_forget_label: Forget Me
154
+ #remember_notice_flash: Your remember setting has been updated
155
+ #remember_page_title: Change Remember Setting
156
+ #remember_remember_label: Remember Me
157
+ #require_login_error_flash: Please login to continue
158
+ #resend_verify_account_page_title: Resend Verification Email
159
+ #reset_password_button: Reset Password
160
+ #reset_password_email_recently_sent_error_flash: An email has recently been sent to you with a link to reset your password
161
+ #reset_password_email_sent_notice_flash: An email has been sent to you with a link to reset the password for your account
162
+ #reset_password_email_subject: Reset Password
163
+ #reset_password_error_flash: There was an error resetting your password
164
+ #reset_password_explanatory_text: "<p>If you have forgotten your password, you can request a password reset:</p>"
165
+ #reset_password_notice_flash: Your password has been reset
166
+ #reset_password_notify_email_subject: Password Reset Completed
167
+ #reset_password_page_title: Reset Password
168
+ #reset_password_request_button: Request Password Reset
169
+ #reset_password_request_error_flash: There was an error requesting a password reset
170
+ #reset_password_request_link_text: Forgot Password?
171
+ #reset_password_request_page_title: Request Password Reset
172
+ #same_as_current_login_message: same as current login
173
+ #same_as_existing_password_message: invalid password, same as current password
174
+ #session_expiration_error_flash: This session has expired, please login again
175
+ #single_session_error_flash: This session has been logged out as another session has become active
176
+ #sms_already_setup_error_flash: SMS authentication has already been setup
177
+ #sms_auth_button: Authenticate via SMS Code
178
+ #sms_auth_link_text: Authenticate Using SMS Code
179
+ #sms_auth_page_title: Authenticate via SMS Code
180
+ #sms_code_label: SMS Code
181
+ #sms_confirm_button: Confirm SMS Backup Number
182
+ #sms_confirm_notice_flash: SMS authentication has been setup
183
+ #sms_confirm_page_title: Confirm SMS Backup Number
184
+ #sms_disable_button: Disable Backup SMS Authentication
185
+ #sms_disable_error_flash: Error disabling SMS authentication
186
+ #sms_disable_link_text: Disable SMS Authentication
187
+ #sms_disable_notice_flash: SMS authentication has been disabled
188
+ #sms_disable_page_title: Disable Backup SMS Authentication
189
+ #sms_invalid_code_error_flash: Error authenticating via SMS code
190
+ #sms_invalid_code_message: invalid SMS code
191
+ #sms_invalid_confirmation_code_error_flash: Invalid or out of date SMS confirmation code used, must setup SMS authentication again
192
+ #sms_invalid_phone_message: invalid SMS phone number
193
+ #sms_lockout_error_flash: SMS authentication has been locked out
194
+ #sms_needs_confirmation_error_flash: SMS authentication needs confirmation
195
+ #sms_not_setup_error_flash: SMS authentication has not been setup yet
196
+ #sms_phone_label: Phone Number
197
+ #sms_request_button: Send SMS Code
198
+ #sms_request_notice_flash: SMS authentication code has been sent
199
+ #sms_request_page_title: Send SMS Code
200
+ #sms_setup_button: Setup SMS Backup Number
201
+ #sms_setup_error_flash: Error setting up SMS authentication
202
+ #sms_setup_link_text: Setup Backup SMS Authentication
203
+ #sms_setup_page_title: Setup SMS Backup Number
204
+ #strftime_format: "%F %T"
205
+ #two_factor_already_authenticated_error_flash: You have already been multifactor authenticated
206
+ #two_factor_auth_notice_flash: You have been multifactor authenticated
207
+ #two_factor_auth_page_title: Authenticate Using Additional Factor
208
+ #two_factor_disable_button: Remove All Multifactor Authentication Methods
209
+ #two_factor_disable_error_flash: Unable to remove all multifactor authentication methods
210
+ #two_factor_disable_link_text: Remove All Multifactor Authentication Methods
211
+ #two_factor_disable_notice_flash: All multifactor authentication methods have been disabled
212
+ #two_factor_disable_page_title: Remove All Multifactor Authentication Methods
213
+ #two_factor_manage_page_title: Manage Multifactor Authentication
214
+ #two_factor_need_authentication_error_flash: You need to authenticate via an additional factor before continuing
215
+ #two_factor_not_setup_error_flash: This account has not been setup for multifactor authentication
216
+ #two_factor_remove_heading: "<h2>Remove Multifactor Authentication</h2>"
217
+ #two_factor_setup_heading: "<h2>Setup Multifactor Authentication</h2>"
218
+ #unlock_account_button: Unlock Account
219
+ #unlock_account_email_recently_sent_error_flash: An email has recently been sent to you with a link to unlock the account
220
+ #unlock_account_email_subject: Unlock Account
221
+ #unlock_account_error_flash: There was an error unlocking your account
222
+ #unlock_account_explanatory_text: "<p>This account is currently locked out. You can unlock the account:</p>"
223
+ #unlock_account_notice_flash: Your account has been unlocked
224
+ #unlock_account_page_title: Unlock Account
225
+ #unlock_account_request_button: Request Account Unlock
226
+ #unlock_account_request_explanatory_text: "<p>This account is currently locked out. You can request that the account be unlocked:</p>"
227
+ #unlock_account_request_notice_flash: An email has been sent to you with a link to unlock your account
228
+ #unlock_account_request_page_title: Request Account Unlock
229
+ #unverified_account_message: unverified account, please verify account before logging in
230
+ #unverified_change_login_error_flash: Please verify this account before changing the login
231
+ #verify_account_button: Verify Account
232
+ #verify_account_email_recently_sent_error_flash: An email has recently been sent to you with a link to verify your account
233
+ #verify_account_email_sent_notice_flash: An email has been sent to you with a link to verify your account
234
+ #verify_account_email_subject: Verify Account
235
+ #verify_account_error_flash: Unable to verify account
236
+ #verify_account_notice_flash: Your account has been verified
237
+ #verify_account_page_title: Verify Account
238
+ #verify_account_resend_button: Send Verification Email Again
239
+ #verify_account_resend_error_flash: Unable to resend verify account email
240
+ #verify_account_resend_explanatory_text: "<p>If you no longer have the email to verify the account, you can request that it be resent to you:</p>"
241
+ #verify_account_resend_link_text: Resend Verify Account Information
242
+ #verify_login_change_button: Verify Login Change
243
+ #verify_login_change_duplicate_account_error_flash: Unable to change login as there is already an account with the new login
244
+ #verify_login_change_email_subject: Verify Login Change
245
+ #verify_login_change_error_flash: Unable to verify login change
246
+ #verify_login_change_notice_flash: Your login change has been verified
247
+ #verify_login_change_page_title: Verify Login Change
248
+ #view_recovery_codes_button: View Authentication Recovery Codes
249
+ #view_recovery_codes_error_flash: Unable to view recovery codes
250
+ #webauthn_auth_button: Authenticate Using WebAuthn
251
+ #webauthn_auth_error_flash: Error authenticating using WebAuthn
252
+ #webauthn_auth_link_text: Authenticate Using WebAuthn
253
+ #webauthn_auth_page_title: Authenticate Using WebAuthn
254
+ #webauthn_authenticator_added_email_subject: WebAuthn Authenticator Added
255
+ #webauthn_authenticator_removed_email_subject: WebAuthn Authenticator Removed
256
+ #webauthn_duplicate_webauthn_id_message: attempt to insert duplicate webauthn id
257
+ #webauthn_invalid_auth_param_message: invalid webauthn authentication param
258
+ #webauthn_invalid_remove_param_message: must select valid webauthn authenticator to remove
259
+ #webauthn_invalid_setup_param_message: invalid webauthn setup param
260
+ #webauthn_invalid_sign_count_message: webauthn credential has invalid sign count
261
+ #webauthn_invalid_webauthn_id_message: no webauthn key with given id found
262
+ #webauthn_login_error_flash: There was an error authenticating via WebAuthn
263
+ #webauthn_not_setup_error_flash: This account has not been setup for WebAuthn authentication
264
+ #webauthn_remove_button: Remove WebAuthn Authenticator
265
+ #webauthn_remove_error_flash: Error removing WebAuthn authenticator
266
+ #webauthn_remove_link_text: Remove WebAuthn Authenticator
267
+ #webauthn_remove_notice_flash: WebAuthn authenticator has been removed
268
+ #webauthn_remove_page_title: Remove WebAuthn Authenticator
269
+ #webauthn_setup_button: Setup WebAuthn Authentication
270
+ #webauthn_setup_error_flash: Error setting up WebAuthn authentication
271
+ #webauthn_setup_link_text: Setup WebAuthn Authentication
272
+ #webauthn_setup_notice_flash: WebAuthn authentication is now setup
273
+ #webauthn_setup_page_title: Setup WebAuthn Authentication
@@ -0,0 +1,2 @@
1
+ foo:
2
+ bar: baz pt-br