devise-security 0.14.2 → 0.17.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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +125 -59
  3. data/app/controllers/devise/paranoid_verification_code_controller.rb +13 -1
  4. data/app/controllers/devise/password_expired_controller.rb +24 -6
  5. data/app/views/devise/paranoid_verification_code/show.html.erb +3 -3
  6. data/app/views/devise/password_expired/show.html.erb +5 -5
  7. data/config/locales/bg.yml +41 -0
  8. data/config/locales/by.yml +49 -0
  9. data/config/locales/cs.yml +41 -0
  10. data/config/locales/de.yml +15 -2
  11. data/config/locales/en.yml +15 -2
  12. data/config/locales/es.yml +10 -9
  13. data/config/locales/fa.yml +41 -0
  14. data/config/locales/fr.yml +1 -0
  15. data/config/locales/hi.yml +42 -0
  16. data/config/locales/it.yml +35 -4
  17. data/config/locales/ja.yml +2 -1
  18. data/config/locales/nl.yml +41 -0
  19. data/config/locales/pt.yml +41 -0
  20. data/config/locales/ru.yml +49 -0
  21. data/config/locales/tr.yml +1 -0
  22. data/config/locales/uk.yml +49 -0
  23. data/config/locales/zh_CN.yml +41 -0
  24. data/config/locales/zh_TW.yml +41 -0
  25. data/lib/devise-security/controllers/helpers.rb +59 -50
  26. data/lib/devise-security/hooks/password_expirable.rb +2 -0
  27. data/lib/devise-security/hooks/session_limitable.rb +21 -11
  28. data/lib/devise-security/models/database_authenticatable_patch.rb +15 -5
  29. data/lib/devise-security/models/password_archivable.rb +2 -2
  30. data/lib/devise-security/models/password_expirable.rb +5 -1
  31. data/lib/devise-security/models/secure_validatable.rb +56 -6
  32. data/lib/devise-security/models/session_limitable.rb +10 -1
  33. data/lib/devise-security/validators/password_complexity_validator.rb +53 -24
  34. data/lib/devise-security/version.rb +1 -1
  35. data/lib/devise-security.rb +13 -5
  36. data/lib/generators/devise_security/install_generator.rb +3 -3
  37. data/lib/generators/templates/{devise-security.rb → devise_security.rb} +6 -1
  38. data/test/controllers/test_paranoid_verification_code_controller.rb +68 -0
  39. data/test/controllers/test_password_expired_controller.rb +121 -19
  40. data/test/controllers/test_security_question_controller.rb +16 -40
  41. data/test/dummy/app/assets/config/manifest.js +3 -0
  42. data/test/dummy/app/controllers/overrides/paranoid_verification_code_controller.rb +7 -0
  43. data/test/dummy/app/controllers/overrides/password_expired_controller.rb +7 -0
  44. data/test/dummy/app/controllers/widgets_controller.rb +3 -0
  45. data/test/dummy/app/models/application_user_record.rb +2 -1
  46. data/test/dummy/app/models/mongoid/confirmable_fields.rb +2 -0
  47. data/test/dummy/app/models/mongoid/database_authenticable_fields.rb +4 -3
  48. data/test/dummy/app/models/mongoid/expirable_fields.rb +2 -0
  49. data/test/dummy/app/models/mongoid/lockable_fields.rb +2 -0
  50. data/test/dummy/app/models/mongoid/mappings.rb +4 -2
  51. data/test/dummy/app/models/mongoid/omniauthable_fields.rb +2 -0
  52. data/test/dummy/app/models/mongoid/paranoid_verification_fields.rb +2 -0
  53. data/test/dummy/app/models/mongoid/password_archivable_fields.rb +2 -0
  54. data/test/dummy/app/models/mongoid/password_expirable_fields.rb +2 -0
  55. data/test/dummy/app/models/mongoid/recoverable_fields.rb +2 -0
  56. data/test/dummy/app/models/mongoid/registerable_fields.rb +4 -2
  57. data/test/dummy/app/models/mongoid/rememberable_fields.rb +2 -0
  58. data/test/dummy/app/models/mongoid/secure_validatable_fields.rb +2 -0
  59. data/test/dummy/app/models/mongoid/security_questionable_fields.rb +2 -0
  60. data/test/dummy/app/models/mongoid/session_limitable_fields.rb +2 -0
  61. data/test/dummy/app/models/mongoid/timeoutable_fields.rb +2 -0
  62. data/test/dummy/app/models/mongoid/trackable_fields.rb +2 -0
  63. data/test/dummy/app/models/mongoid/validatable_fields.rb +2 -0
  64. data/test/dummy/app/models/paranoid_verification_user.rb +26 -0
  65. data/test/dummy/app/models/password_expired_user.rb +26 -0
  66. data/test/dummy/app/models/user.rb +1 -2
  67. data/test/dummy/app/models/widget.rb +1 -3
  68. data/test/dummy/app/mongoid/one_user.rb +5 -5
  69. data/test/dummy/app/mongoid/user_on_engine.rb +2 -2
  70. data/test/dummy/app/mongoid/user_on_main_app.rb +2 -2
  71. data/test/dummy/app/mongoid/user_with_validations.rb +3 -3
  72. data/test/dummy/app/mongoid/user_without_email.rb +3 -3
  73. data/test/dummy/config/application.rb +4 -4
  74. data/test/dummy/config/boot.rb +1 -1
  75. data/test/dummy/config/environment.rb +1 -1
  76. data/test/dummy/config/environments/test.rb +3 -13
  77. data/test/dummy/config/initializers/migration_class.rb +1 -8
  78. data/test/dummy/config/locales/en.yml +10 -0
  79. data/test/dummy/config/mongoid.yml +1 -1
  80. data/test/dummy/config/routes.rb +5 -3
  81. data/test/dummy/db/migrate/20120508165529_create_tables.rb +3 -3
  82. data/test/dummy/lib/shared_expirable_columns.rb +1 -0
  83. data/test/dummy/lib/shared_security_questions_fields.rb +1 -0
  84. data/test/dummy/lib/shared_user.rb +17 -6
  85. data/test/dummy/lib/shared_user_without_email.rb +2 -1
  86. data/test/dummy/lib/shared_user_without_omniauth.rb +12 -3
  87. data/test/dummy/lib/shared_verification_fields.rb +1 -0
  88. data/test/dummy/{app/models/.gitkeep → log/development.log} +0 -0
  89. data/test/dummy/log/test.log +101533 -0
  90. data/test/integration/test_password_expirable_workflow.rb +53 -0
  91. data/test/integration/test_session_limitable_workflow.rb +2 -0
  92. data/test/orm/active_record.rb +7 -4
  93. data/test/orm/mongoid.rb +2 -1
  94. data/test/support/integration_helpers.rb +15 -33
  95. data/test/support/mongoid.yml +1 -1
  96. data/test/test_compatibility.rb +2 -0
  97. data/test/test_complexity_validator.rb +250 -29
  98. data/test/test_database_authenticatable_patch.rb +146 -0
  99. data/test/test_helper.rb +12 -6
  100. data/test/test_install_generator.rb +12 -2
  101. data/test/test_paranoid_verification.rb +0 -1
  102. data/test/test_password_archivable.rb +34 -11
  103. data/test/test_password_expirable.rb +26 -26
  104. data/test/test_secure_validatable.rb +292 -50
  105. data/test/test_secure_validatable_overrides.rb +185 -0
  106. data/test/test_session_limitable.rb +27 -1
  107. data/test/tmp/config/initializers/devise_security.rb +49 -0
  108. data/test/tmp/config/locales/devise.security_extension.by.yml +49 -0
  109. data/test/tmp/config/locales/devise.security_extension.cs.yml +41 -0
  110. data/test/tmp/config/locales/devise.security_extension.de.yml +41 -0
  111. data/test/tmp/config/locales/devise.security_extension.en.yml +42 -0
  112. data/test/tmp/config/locales/devise.security_extension.es.yml +30 -0
  113. data/test/tmp/config/locales/devise.security_extension.fa.yml +41 -0
  114. data/test/tmp/config/locales/devise.security_extension.fr.yml +30 -0
  115. data/test/tmp/config/locales/devise.security_extension.hi.yml +42 -0
  116. data/test/tmp/config/locales/devise.security_extension.it.yml +41 -0
  117. data/test/tmp/config/locales/devise.security_extension.ja.yml +30 -0
  118. data/test/tmp/config/locales/devise.security_extension.nl.yml +41 -0
  119. data/test/tmp/config/locales/devise.security_extension.pt.yml +41 -0
  120. data/test/tmp/config/locales/devise.security_extension.ru.yml +49 -0
  121. data/test/tmp/config/locales/devise.security_extension.tr.yml +18 -0
  122. data/test/tmp/config/locales/devise.security_extension.uk.yml +49 -0
  123. data/test/tmp/config/locales/devise.security_extension.zh_CN.yml +41 -0
  124. data/test/tmp/config/locales/devise.security_extension.zh_TW.yml +41 -0
  125. metadata +168 -132
  126. data/.codeclimate.yml +0 -63
  127. data/.document +0 -5
  128. data/.gitignore +0 -43
  129. data/.mdlrc +0 -1
  130. data/.rubocop.yml +0 -64
  131. data/.ruby-version +0 -1
  132. data/.travis.yml +0 -39
  133. data/Appraisals +0 -35
  134. data/Gemfile +0 -10
  135. data/Rakefile +0 -27
  136. data/devise-security.gemspec +0 -50
  137. data/gemfiles/rails_4.2_stable.gemfile +0 -16
  138. data/gemfiles/rails_5.0_stable.gemfile +0 -15
  139. data/gemfiles/rails_5.1_stable.gemfile +0 -15
  140. data/gemfiles/rails_5.2_stable.gemfile +0 -15
  141. data/gemfiles/rails_6.0_beta.gemfile +0 -15
  142. data/lib/devise-security/orm/active_record.rb +0 -20
  143. data/lib/devise-security/schema.rb +0 -66
  144. data/test/dummy/app/models/secure_user.rb +0 -9
@@ -0,0 +1,30 @@
1
+ ja:
2
+ errors:
3
+ messages:
4
+ taken_in_past: 'は既に使われています。'
5
+ equal_to_current_password: 'は現在のパスワードと異なるものである必要があります。'
6
+ equal_to_email: 'メールとは異なる必要があります'
7
+ password_complexity:
8
+ digit:
9
+ one: は最低1つの数字を含む必要があります。
10
+ other: は最低%{count}つの数字を含む必要があります。
11
+ lower:
12
+ one: は最低1つの小文字英字を含む必要があります。
13
+ other: は最低%{count}つの小文字英字を含む必要があります。
14
+ symbol:
15
+ one: は最低1つの記号を含む必要があります。
16
+ other: は最低%{count}つの記号を含む必要があります。
17
+ upper:
18
+ one: は最低1つの大文字英字を含む必要があります。
19
+ other: は最低%{count}つの大文字英字を含む必要があります。
20
+ devise:
21
+ invalid_captcha: 'キャプチャ入力が不正です。'
22
+ invalid_security_question: 'セキュリティ質問に対する回答が不正です。'
23
+ paranoid_verify:
24
+ code_required: 'サポートチームに提供された認証コードを入力してください。'
25
+ password_expired:
26
+ updated: '新しいパスワードが保存されました。'
27
+ change_required: 'パスワードが期限切れです。パスワードを新しく設定してください。'
28
+ failure:
29
+ session_limited: '他のブラウザでログインされました。このブラウザで続ける場合は、もう一度サインインしてください。'
30
+ expired: '活動がなかったため、あなたのアカウントは期限切れとなりました。サイト管理者に連絡してください。'
@@ -0,0 +1,41 @@
1
+ nl:
2
+ errors:
3
+ messages:
4
+ taken_in_past: is eerder gebruikt.
5
+ equal_to_current_password: moet verschillen van het huidige wachtwoord.
6
+ equal_to_email: moet anders zijn dan de e-mail
7
+ password_complexity:
8
+ digit:
9
+ one: moet minimaal 1 cijfer bevatten
10
+ other: moet minimaal %{count} cijfers bevatten
11
+ lower:
12
+ one: moet minimaal 1 kleine letter bevatten
13
+ other: moet minimaal %{count} kleine letters bevatten
14
+ symbol:
15
+ one: moet minimaal 1 leesteken of symbool bevatten
16
+ other: moet minimaal %{count} leestekens of symbolen bevatten
17
+ upper:
18
+ one: moet minimaal 1 hoofdletter bevatten
19
+ other: moet minimaal %{count} hoofdletters bevatten
20
+ devise:
21
+ invalid_captcha: De captcha invoer was ongeldig.
22
+ invalid_security_question: Het antwoord op de beveiligingsvraag was niet correct.
23
+ paranoid_verify:
24
+ code_required: Voer de aangeleverde code in
25
+ paranoid_verification_code:
26
+ show:
27
+ submit_verification_code: Verstuur verificatie code
28
+ verification_code: Verificatie code
29
+ submit: Verstuur
30
+ password_expired:
31
+ updated: Het nieuwe wachtwoord is opgeslagen.
32
+ change_required: Het wachtwoord is verlopen. Vernieuw je wachtwoord.
33
+ show:
34
+ renew_your_password: Vernieuw je wachtwoord
35
+ current_password: Huidig wachtwoord
36
+ new_password: Nieuw wachtwoord
37
+ new_password_confirmation: Bevestig het nieuwe wachtwoord
38
+ change_my_password: Verander mijn wachtwoord
39
+ failure:
40
+ session_limited: Je login is in een andere browser gebruikt. Log hier opnieuw in.
41
+ expired: Je account is verlopen. Neem contact op met de site beheerder.
@@ -0,0 +1,41 @@
1
+ pt:
2
+ errors:
3
+ messages:
4
+ taken_in_past: 'foi usada anteriormente.'
5
+ equal_to_current_password: 'deve ser diferente da senha atual.'
6
+ equal_to_email: 'deve ser diferente do e-mail.'
7
+ password_complexity:
8
+ digit:
9
+ one: deve conter ao menos um dígito
10
+ other: deve conter ao menos %{count} dígitos
11
+ lower:
12
+ one: deve conter ao menos uma letra minúscula
13
+ other: deve conter ao menos %{count} letras minúsculas
14
+ symbol:
15
+ one: deve conter ao menos um símbolo
16
+ other: deve conter ao menos %{count} símbolos
17
+ upper:
18
+ one: deve conter ao menos uma letra maiúscula
19
+ other: deve conter ao menos %{count} letras maiúsculas
20
+ devise:
21
+ invalid_captcha: 'O captcha está errado.'
22
+ invalid_security_question: 'A resposta da pergunta de segurança está errada.'
23
+ paranoid_verify:
24
+ code_required: 'Por favor entre o código que a equipe de suporte enviou'
25
+ paranoid_verification_code:
26
+ show:
27
+ submit_verification_code: Enviar código de verificação
28
+ verification_code: Código de verificação
29
+ submit: Enviar
30
+ password_expired:
31
+ updated: 'A nova senha foi salva.'
32
+ change_required: 'Sua senha expirou. Renove sua senha por favor.'
33
+ show:
34
+ renew_your_password: Renove sua senha
35
+ current_password: Senha atual
36
+ new_password: Senha nova
37
+ new_password_confirmation: Confirmar senha nova
38
+ change_my_password: Mudar minha senha
39
+ failure:
40
+ session_limited: 'Seu login foi utilizado em outro local. Faça o login novamente para continuar.'
41
+ expired: 'Sua conta expirou por inatividade. Por favor contate o administrador do site.'
@@ -0,0 +1,49 @@
1
+ ru:
2
+ errors:
3
+ messages:
4
+ taken_in_past: 'уже ранее использовался.'
5
+ equal_to_current_password: 'должен отличаться от текущего пароля.'
6
+ equal_to_email: 'должно отличаться от адреса электронной почты.'
7
+ password_complexity:
8
+ digit:
9
+ one: 'должен содержать хотя бы одну цифру'
10
+ few: 'должен содержать хотя бы %{count} цифры'
11
+ many: 'должен содержать хотя бы %{count} цифр'
12
+ other: 'должен содержать хотя бы %{count} цифры'
13
+ lower:
14
+ one: 'должен содержать хотя бы одну строчную букву'
15
+ few: 'должен содержать хотя бы %{count} строчные буквы'
16
+ many: 'должен содержать хотя бы %{count} строчных букв'
17
+ other: 'должен содержать хотя бы %{count} строчных букв'
18
+ symbol:
19
+ one: 'должен содержать хотя бы один знак пунктуации или символ'
20
+ few: 'должен содержать хотя бы %{count} знака пунктуации или символа'
21
+ many: 'должен содержать хотя бы %{count} знаков пунктуации или символов'
22
+ other: 'должен содержать хотя бы %{count} знаков пунктуации или символов'
23
+ upper:
24
+ one: 'должен содержать хотя бы одну прописную букву'
25
+ few: 'должен содержать хотя бы %{count} прописные буквы'
26
+ many: 'должен содержать хотя бы %{count} прописных букв'
27
+ other: 'должен содержать хотя бы %{count} прописных букв'
28
+ devise:
29
+ invalid_captcha: 'Введен неправильный код капчи.'
30
+ invalid_security_question: 'Ответ на секретный вопрос был неверным.'
31
+ paranoid_verify:
32
+ code_required: 'Пожалуйста введите код, полученный от нашей команды поддержки'
33
+ paranoid_verification_code:
34
+ show:
35
+ submit_verification_code: Ввод кода подтверждения
36
+ verification_code: Код подверждения
37
+ submit: Отправить
38
+ password_expired:
39
+ updated: 'Ваш новый пароль сохранен.'
40
+ change_required: 'Ваш пароль устарел. Пожалуйста, установите новый.'
41
+ show:
42
+ renew_your_password: Смена пароля
43
+ current_password: Текущий пароль
44
+ new_password: Новый пароль
45
+ new_password_confirmation: Подтвердите новый пароль
46
+ change_my_password: Поменять пароль
47
+ failure:
48
+ session_limited: 'Ваши параметры входа используются в другом браузере. Пожалуйста, авторизуйтесь снова, чтобы продолжить в этом браузере.'
49
+ expired: 'Ваш аккаунт устарел из-за неактивности. Пожалуйста, свяжитесь с администратором.'
@@ -0,0 +1,18 @@
1
+ tr:
2
+ errors:
3
+ messages:
4
+ taken_in_past: "daha önce kullanıldı."
5
+ equal_to_current_password: "mevcut paroladan farklı olmalı."
6
+ equal_to_email: "e-postadan farklı olmalı."
7
+ password_format: "büyük, küçük harfler ve sayılar içermeli."
8
+ devise:
9
+ invalid_captcha: "Captcha hatalı."
10
+ invalid_security_question: "Güvenlik sorusunun cevabı yanlış."
11
+ paranoid_verify:
12
+ code_required: "Destek ekibimizden aldığınız kodu girin."
13
+ password_expired:
14
+ updated: "Yeni parolanız kaydedildi."
15
+ change_required: "Parolanızın geçerlilik süresi dolmuş. Lütfen parolanızı yenileyin."
16
+ failure:
17
+ session_limited: 'Hesabınıza başka bir tarayıcıdan giriş yapılmış. Lütfen devam etmek için yeniden giriş yapın.'
18
+ expired: 'Hesabınız aktif olarak kullanılmadığı için artık geçerli değil. Lütfen yönetici ile irtibata geçin.'
@@ -0,0 +1,49 @@
1
+ uk:
2
+ errors:
3
+ messages:
4
+ taken_in_past: 'раніше використовувався.'
5
+ equal_to_current_password: 'має відрізнятися від поточного паролю.'
6
+ equal_to_email: 'має відрізнятися від електронної пошти.'
7
+ password_complexity:
8
+ digit:
9
+ one: 'повинен включати хоча б одну цифру'
10
+ few: 'повинен включати хоча б %{count} цифри'
11
+ many: 'повинен включати хоча б %{count} цифр'
12
+ other: 'повинен включати хоча б %{count} цифри'
13
+ lower:
14
+ one: 'повинен включати хоча б одну малу букву'
15
+ few: 'повинен включати хоча б %{count} малі букви'
16
+ many: 'повинен включати хоча б %{count} малих букв'
17
+ other: 'повинен включати хоча б %{count} малі букви'
18
+ symbol:
19
+ one: 'повинен включати хоча б один розділовий знак або символ'
20
+ few: 'повинен включати хоча б %{count} розділові знаки або символи'
21
+ many: 'повинен включати хоча б %{count} розділових знаків або символів'
22
+ other: 'повинен включати хоча б %{count} розділові знаки або символи'
23
+ upper:
24
+ one: 'повинен включати хоча б одну прописну букву'
25
+ few: 'повинен включати хоча б %{count} прописні букви'
26
+ many: 'повинен включати хоча б %{count} прописних букв'
27
+ other: 'повинен включати хоча б %{count} прописні букви'
28
+ devise:
29
+ invalid_captcha: 'Введення капчі недійсне.'
30
+ invalid_security_question: 'Неправильна відповідь на секретне питання.'
31
+ paranoid_verify:
32
+ code_required: 'Введіть, будь ласка, код від нашої команди підтримки'
33
+ paranoid_verification_code:
34
+ show:
35
+ submit_verification_code: Відправити код підтвердження
36
+ verification_code: Код підтвердження
37
+ submit: Відправити
38
+ password_expired:
39
+ updated: 'Ваш новий пароль збережено.'
40
+ change_required: 'Ваш пароль застарілий. Будь ласка, оновіть пароль.'
41
+ show:
42
+ renew_your_password: Оновити свій пароль
43
+ current_password: Теперішній пароль
44
+ new_password: Новий пароль
45
+ new_password_confirmation: Підтвердити новий пароль
46
+ change_my_password: Змінити пароль
47
+ failure:
48
+ session_limited: 'Ваші облікові дані були використані в іншому браузері. Будь ласка, авторизуйтесь знову щоб продовжити в цьому браузері.'
49
+ expired: "Ваш аккаунт застарів через неактивність. Будь ласка, зв'яжіться з адміністратором."
@@ -0,0 +1,41 @@
1
+ zh_CN:
2
+ errors:
3
+ messages:
4
+ taken_in_past: '曾被使用过。'
5
+ equal_to_current_password: '必须与当前密码不同。'
6
+ equal_to_email: '必须与电子邮件地址不同。'
7
+ password_complexity:
8
+ digit:
9
+ one: 必须包含至少1个数字
10
+ other: 必须包含至少%{count}个数字
11
+ lower:
12
+ one: 必须包含至少1个小写字母
13
+ other: 必须包含至少%{count}个小写字母
14
+ symbol:
15
+ one: 必须包含至少1个特殊符号(!"#$%&'()*+,-./:;<=>?@[\]^_‘{|}~)
16
+ other: 必须包含至少%{count}个特殊符号(!"#$%&'()*+,-./:;<=>?@[\]^_‘{|}~)
17
+ upper:
18
+ one: 必须包含至少1个大写字母
19
+ other: 必须包含至少%{count}个大写字母
20
+ devise:
21
+ invalid_captcha: '验证码无效。'
22
+ invalid_security_question: '安全问题答案无效。'
23
+ paranoid_verify:
24
+ code_required: '请输入我们支持团队提供的代码'
25
+ paranoid_verification_code:
26
+ show:
27
+ submit_verification_code: 提交验证码
28
+ verification_code: 验证码
29
+ submit: 提交
30
+ password_expired:
31
+ updated: '你的新密码已保存。'
32
+ change_required: '你的密码已过期,请更新密码。'
33
+ show:
34
+ renew_your_password: 更新你的密码
35
+ current_password: 当前密码
36
+ new_password: 新密码
37
+ new_password_confirmation: 确认新密码
38
+ change_my_password: 更改密码
39
+ failure:
40
+ session_limited: '你的登录凭据已在另一个浏览器上被使用。请重新登录以在此浏览器继续。'
41
+ expired: '由于不活跃,你的账户已过期。请联系站点管理员。'
@@ -0,0 +1,41 @@
1
+ zh_TW:
2
+ errors:
3
+ messages:
4
+ taken_in_past: '曾被使用過。'
5
+ equal_to_current_password: '必須與目前密碼不同。'
6
+ equal_to_email: '必須與電子郵件地址不同。'
7
+ password_complexity:
8
+ digit:
9
+ one: 必須包含至少一個數字
10
+ other: 必須包含至少 %{count} 個數字
11
+ lower:
12
+ one: 必須包含至少一個小寫字母
13
+ other: 必須包含至少 %{count} 個小寫字母
14
+ symbol:
15
+ one: 必須包含至少一個特殊符號
16
+ other: 必須包含至少 %{count} 個特殊符號
17
+ upper:
18
+ one: 必須包含至少一個大寫字母
19
+ other: 必須包含至少 %{count} 個大寫字母
20
+ devise:
21
+ invalid_captcha: '輸入的驗證碼無效。'
22
+ invalid_security_question: '安全問題答案無效。'
23
+ paranoid_verify:
24
+ code_required: '請輸入由我們客服團隊提供的代碼'
25
+ paranoid_verification_code:
26
+ show:
27
+ submit_verification_code: 送出驗證碼
28
+ verification_code: 驗證碼
29
+ submit: 送出
30
+ password_expired:
31
+ updated: '你的新密碼已儲存'
32
+ change_required: '你的密碼已經過期,請更新密碼。'
33
+ show:
34
+ renew_your_password: 更新你的密碼
35
+ current_password: 目前密碼
36
+ new_password: 新密碼
37
+ new_password_confirmation: 確認新密碼
38
+ change_my_password: 更改我的密碼
39
+ failure:
40
+ session_limited: '你的登入憑證已在另一個瀏覽器上被使用,請重新登入以在此瀏覽器繼續使用。'
41
+ expired: '你的帳號因過久沒使用而已經過期,請洽網站管理員。'