padrino-admin 0.9.10 → 0.9.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/README.rdoc +1 -1
  2. data/Rakefile +4 -53
  3. data/lib/padrino-admin/access_control.rb +11 -21
  4. data/lib/padrino-admin/generators/admin_app.rb +1 -1
  5. data/lib/padrino-admin/generators/orm.rb +5 -5
  6. data/lib/padrino-admin/generators/templates/account/activerecord.rb.tt +3 -1
  7. data/lib/padrino-admin/generators/templates/account/couchrest.rb.tt +13 -6
  8. data/lib/padrino-admin/generators/templates/account/datamapper.rb.tt +22 -19
  9. data/lib/padrino-admin/generators/templates/account/mongoid.rb.tt +4 -2
  10. data/lib/padrino-admin/generators/templates/account/mongomapper.rb.tt +3 -1
  11. data/lib/padrino-admin/generators/templates/account/sequel.rb.tt +9 -6
  12. data/lib/padrino-admin/generators/templates/app/app.rb +23 -25
  13. data/lib/padrino-admin/generators/templates/app/controllers/base.rb +1 -1
  14. data/lib/padrino-admin/helpers/authentication_helpers.rb +2 -2
  15. data/lib/padrino-admin/locale/admin/cz.yml +16 -0
  16. data/lib/padrino-admin/locale/admin/es.yml +16 -0
  17. data/lib/padrino-admin/locale/admin/tr.yml +16 -0
  18. data/lib/padrino-admin/locale/admin/uk.yml +16 -0
  19. data/lib/padrino-admin/locale/orm/cz.yml +26 -0
  20. data/lib/padrino-admin/locale/orm/da.yml +9 -9
  21. data/lib/padrino-admin/locale/orm/de.yml +15 -15
  22. data/lib/padrino-admin/locale/orm/en.yml +9 -9
  23. data/lib/padrino-admin/locale/orm/es.yml +26 -0
  24. data/lib/padrino-admin/locale/orm/fr.yml +9 -9
  25. data/lib/padrino-admin/locale/orm/it.yml +9 -9
  26. data/lib/padrino-admin/locale/orm/pt_br.yml +9 -9
  27. data/lib/padrino-admin/locale/orm/ru.yml +9 -9
  28. data/lib/padrino-admin/locale/orm/tr.yml +26 -0
  29. data/lib/padrino-admin/locale/orm/uk.yml +26 -0
  30. data/lib/padrino-admin.rb +2 -7
  31. data/padrino-admin.gemspec +17 -128
  32. data/test/fixtures/data_mapper.rb +11 -9
  33. data/test/generators/test_admin_app_generator.rb +1 -1
  34. data/test/generators/test_admin_page_generator.rb +2 -2
  35. data/test/helper.rb +4 -4
  36. data/test/test_admin_application.rb +8 -8
  37. metadata +79 -42
data/README.rdoc CHANGED
@@ -49,7 +49,7 @@ For an ecommerce website, usually certain actions require permissions and authen
49
49
  by the admin access control features:
50
50
 
51
51
  class EcommerceSite < Padrino::Application
52
- enable :authentication
52
+ register Padrino::Admin::AccessControl
53
53
  enable :store_location
54
54
  set :login_page, "/login"
55
55
 
data/Rakefile CHANGED
@@ -1,54 +1,5 @@
1
- require 'rubygems'
2
- require 'rake'
3
- require File.expand_path("../../padrino-core/lib/padrino-core/version.rb", __FILE__)
4
-
5
- begin
6
- require 'jeweler'
7
- Jeweler::Tasks.new do |gem|
8
- gem.name = "padrino-admin"
9
- gem.summary = "Admin Dashboard for Padrino"
10
- gem.description = "Admin View for Padrino applications"
11
- gem.email = "padrinorb@gmail.com"
12
- gem.homepage = "http://github.com/padrino/padrino-framework/tree/master/padrino-admin"
13
- gem.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
14
- gem.rubyforge_project = 'padrino-admin'
15
- gem.version = Padrino.version
16
- gem.add_runtime_dependency "padrino-core", "= #{Padrino.version}"
17
- gem.add_runtime_dependency "padrino-gen", "= #{Padrino.version}"
18
- gem.add_runtime_dependency "padrino-helpers", "= #{Padrino.version}"
19
- gem.add_development_dependency "haml", ">= 2.2.1"
20
- gem.add_development_dependency "shoulda", ">= 0"
21
- gem.add_development_dependency "mocha", ">= 0.9.7"
22
- gem.add_development_dependency "rack-test", ">= 0.5.0"
23
- gem.add_development_dependency "webrat", ">= 0.5.1"
24
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
25
- end
26
- Jeweler::GemcutterTasks.new
27
- Jeweler::RubyforgeTasks.new { |r| r.doc_task = :none }
28
- rescue LoadError
29
- puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
30
- end
31
-
32
- require 'rake/testtask'
33
- Rake::TestTask.new(:test) do |test|
34
- test.libs << 'test'
1
+ # coding:utf-8
2
+ RAKE_ROOT = __FILE__
35
3
 
36
- test.pattern = 'test/**/test_*.rb'
37
- test.verbose = true
38
- end
39
-
40
- begin
41
- require 'rcov/rcovtask'
42
- Rcov::RcovTask.new do |rcov|
43
- rcov.libs << 'test'
44
- rcov.pattern = 'test/**/test_*.rb'
45
- rcov.verbose = true
46
- rcov.rcov_opts << ['--exclude /Gems/1.8/gems/,padrino-core,padrino-cache,padrino-gen,padrino-helpers,padrino-mailer']
47
- end
48
- rescue LoadError
49
- task :rcov do
50
- abort "RCov is not available. In order to run rcov, you must: sudo gem install relevance-rcov"
51
- end
52
- end
53
-
54
- task :default => :test
4
+ require 'rubygems'
5
+ require File.expand_path(File.dirname(__FILE__) + '/../gem_rake_helper')
@@ -9,34 +9,24 @@ module Padrino
9
9
  ##
10
10
  # Method used by Padrino::Application when we register the extension
11
11
  #
12
- def self.registered(app)
13
- app.set :session_id, "_padrino_#{File.basename(Padrino.root)}_#{app.app_name}".to_sym
14
- app.enable :sessions
15
- app.helpers Padrino::Admin::Helpers::AuthenticationHelpers
16
- app.helpers Padrino::Admin::Helpers::ViewHelpers
17
- app.before { login_required }
18
- end
19
-
20
- module ClassMethods #:nodoc:
21
- def inherited(base)
22
- unless base.respond_to?(:access_control)
23
- base.send(:cattr_accessor, :access_control)
24
- base.send(:access_control=, Padrino::Admin::AccessControl::Base.new)
25
- end
26
- super(base)
27
- base.class_eval { class << self; alias_method_chain :reload!, :access_control; end }
28
- end
29
-
30
- def reload_with_access_control!
31
- self.access_control = Padrino::Admin::AccessControl::Base.new
32
- reload_without_access_control!
12
+ class << self
13
+ def registered(app)
14
+ app.set :session_id, "_padrino_#{File.basename(Padrino.root)}_#{app.app_name}".to_sym
15
+ app.enable :sessions
16
+ app.helpers Padrino::Admin::Helpers::AuthenticationHelpers
17
+ app.helpers Padrino::Admin::Helpers::ViewHelpers
18
+ app.before { login_required }
19
+ app.send(:cattr_accessor, :access_control)
20
+ app.send(:access_control=, Padrino::Admin::AccessControl::Base.new)
33
21
  end
22
+ alias :included :registered
34
23
  end
35
24
 
36
25
  class Base
37
26
  def initialize #:nodoc:
38
27
  @roles, @authorizations, @project_modules = [], [], []
39
28
  end
29
+
40
30
  ##
41
31
  # We map project modules for a given role or roles
42
32
  #
@@ -9,7 +9,7 @@ module Padrino
9
9
  # Define the source template root and themes
10
10
  def self.source_root; File.expand_path(File.dirname(__FILE__)); end
11
11
  def self.banner; "padrino-gen admin"; end
12
- def self.themes; Dir[File.dirname(__FILE__) + "/templates/assets/stylesheets/themes/*"].map { |t| File.basename(t) }; end
12
+ def self.themes; Dir[File.dirname(__FILE__) + "/templates/assets/stylesheets/themes/*"].map { |t| File.basename(t) }.sort; end
13
13
 
14
14
  # Include related modules
15
15
  include Thor::Actions
@@ -33,11 +33,11 @@ module Padrino
33
33
  def columns
34
34
  @columns ||= case orm
35
35
  when :activerecord then @klass.columns
36
- when :datamapper then @klass.properties
36
+ when :datamapper then @klass.properties.map { |p| Column.new(p.name, p.primitive || p.type) }
37
37
  when :couchrest then @klass.properties
38
38
  when :mongoid then @klass.fields.values
39
39
  when :mongomapper then @klass.keys.values.reject { |key| key.name == "_id" } # On MongoMapper keys are an hash
40
- when :sequel then @klass.db_schema.map { |k,v| Column.new(k, v[:type]) }
40
+ when :sequel then @klass.db_schema.map { |k,v| v[:type] = :text if v[:db_type] =~ /^text/i; Column.new(k, v[:type]) }
41
41
  else raise OrmError, "Adapter #{orm} is not yet supported!"
42
42
  end
43
43
  end
@@ -59,7 +59,7 @@ module Padrino
59
59
  case orm
60
60
  when :activerecord, :mongomapper, :mongoid then "#{klass_name}.find(#{params})"
61
61
  when :datamapper, :couchrest then "#{klass_name}.get(#{params})"
62
- when :sequel then "#{klass_name}.filter(#{params}).first"
62
+ when :sequel then "#{klass_name}[#{params}]"
63
63
  else raise OrmError, "Adapter #{orm} is not yet supported!"
64
64
  end
65
65
  end
@@ -83,7 +83,7 @@ module Padrino
83
83
  case orm
84
84
  when :activerecord, :mongomapper, :mongoid, :couchrest then "@#{name_singular}.update_attributes(#{params})"
85
85
  when :datamapper then "@#{name_singular}.update(#{params})"
86
- when :sequel then "(@#{name_singular}.update(#{params}) rescue false)"
86
+ when :sequel then "@#{name_singular}.modified! && @#{name_singular}.update(#{params})"
87
87
  else raise OrmError, "Adapter #{orm} is not yet supported!"
88
88
  end
89
89
  end
@@ -94,4 +94,4 @@ module Padrino
94
94
  end # Orm
95
95
  end # Generators
96
96
  end # Admin
97
- end # Padrino
97
+ end # Padrino
@@ -1,3 +1,5 @@
1
+ require 'digest/sha1'
2
+
1
3
  class Account < ActiveRecord::Base
2
4
  attr_accessor :password
3
5
 
@@ -24,7 +26,7 @@ class Account < ActiveRecord::Base
24
26
  end
25
27
 
26
28
  ##
27
- # This method is used for retrive the original password.
29
+ # This method is used to retrieve the original password.
28
30
  #
29
31
  def password_clean
30
32
  crypted_password.decrypt(salt)
@@ -1,3 +1,5 @@
1
+ require 'digest/sha1'
2
+
1
3
  class Account < CouchRest::ExtendedDocument
2
4
  include CouchRest::Validation
3
5
  use_database COUCHDB
@@ -40,14 +42,14 @@ class Account < CouchRest::ExtendedDocument
40
42
  end
41
43
 
42
44
  ##
43
- # This method is used for retrive the original password.
45
+ # This method is used to retrieve the original password.
44
46
  #
45
47
  def password_clean
46
48
  crypted_password.decrypt(salt)
47
49
  end
48
50
 
49
51
  ##
50
- # This method is used for retrive the first record by id without raise errors if not found.
52
+ # This method is used to retrieve the first record by id without raise errors if not found.
51
53
  #
52
54
  def self.find_by_id(id)
53
55
  id_array = self.by_id :key => id
@@ -57,7 +59,7 @@ class Account < CouchRest::ExtendedDocument
57
59
  private
58
60
  def generate_password
59
61
  return if password.blank?
60
- self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new_record?
62
+ self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if self.salt.blank?
61
63
  self.crypted_password = password.encrypt(self.salt)
62
64
  end
63
65
 
@@ -66,8 +68,13 @@ class Account < CouchRest::ExtendedDocument
66
68
  end
67
69
 
68
70
  def email_is_unique
69
- Account.by_email(:key => self.email, :limit => 1).empty? ||
70
- Account.by_email(:key => self.email, :limit => 1) == [self] ||
71
- [false, "Email has already been taken"]
71
+ account = Account.by_email(:key => self.email, :limit => 1)
72
+ return true if account.empty? # didn't find email in the database
73
+ account = account[0]
74
+ if self.has_key?("_id")
75
+ # there is an id, make sure updates are being applied to same account
76
+ return true if self["_id"] == account["_id"]
77
+ end
78
+ [false, "Email has already been taken"]
72
79
  end
73
80
  end
@@ -1,3 +1,5 @@
1
+ require 'digest/sha1'
2
+
1
3
  class Account
2
4
  include DataMapper::Resource
3
5
  include DataMapper::Validate
@@ -13,18 +15,15 @@ class Account
13
15
  property :role, String
14
16
 
15
17
  # Validations
16
- validates_present :email, :role
17
- validates_present :password, :if => :password_required
18
- validates_present :password_confirmation, :if => :password_required
19
- validates_length :password, :min => 4, :max => 40, :if => :password_required
20
- validates_is_confirmed :password, :if => :password_required
21
- validates_length :email, :min => 3, :max => 100
22
- validates_is_unique :email, :case_sensitive => false
23
- validates_format :email, :with => :email_address
24
- validates_format :role, :with => /[A-Za-z]/
25
-
26
- # Callbacks
27
- before :save, :generate_password
18
+ validates_presence_of :email, :role
19
+ validates_presence_of :password, :if => :password_required
20
+ validates_presence_of :password_confirmation, :if => :password_required
21
+ validates_length_of :password, :min => 4, :max => 40, :if => :password_required
22
+ validates_confirmation_of :password, :if => :password_required
23
+ validates_length_of :email, :min => 3, :max => 100
24
+ validates_uniqueness_of :email, :case_sensitive => false
25
+ validates_format_of :email, :with => :email_address
26
+ validates_format_of :role, :with => /[A-Za-z]/
28
27
 
29
28
  ##
30
29
  # This method is for authentication purpose
@@ -35,25 +34,29 @@ class Account
35
34
  end
36
35
 
37
36
  ##
38
- # This method is used from AuthenticationHelper
37
+ # This method is used by AuthenticationHelper
39
38
  #
40
39
  def self.find_by_id(id)
41
40
  get(id) rescue nil
42
41
  end
43
42
 
44
43
  ##
45
- # This method is used for retrive the original password.
44
+ # This method is used to retrieve the original password.
46
45
  #
47
46
  def password_clean
48
47
  crypted_password.decrypt(salt)
49
48
  end
50
49
 
50
+ ###
51
+ # Password setter generates salt and crypted_password
52
+ #
53
+ def password=(val)
54
+ return if val.blank?
55
+ attribute_set(:salt, Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--")) if new?
56
+ attribute_set(:crypted_password, val.encrypt(self.salt))
57
+ end
58
+
51
59
  private
52
- def generate_password
53
- return if password.blank?
54
- self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new?
55
- self.crypted_password = password.encrypt(self.salt)
56
- end
57
60
 
58
61
  def password_required
59
62
  crypted_password.blank? || !password.blank?
@@ -1,3 +1,5 @@
1
+ require 'digest/sha1'
2
+
1
3
  class Account
2
4
  include Mongoid::Document
3
5
  attr_accessor :password
@@ -33,14 +35,14 @@ class Account
33
35
  end
34
36
 
35
37
  ##
36
- # This method is used from AuthenticationHelper
38
+ # This method is used by AuthenticationHelper
37
39
  #
38
40
  def self.find_by_id(id)
39
41
  find(id) rescue nil
40
42
  end
41
43
 
42
44
  ##
43
- # This method is used for retrive the original password.
45
+ # This method is used to retrieve the original password.
44
46
  #
45
47
  def password_clean
46
48
  crypted_password.decrypt(salt)
@@ -1,3 +1,5 @@
1
+ require 'digest/sha1'
2
+
1
3
  class Account
2
4
  include MongoMapper::Document
3
5
  attr_accessor :password
@@ -33,7 +35,7 @@ class Account
33
35
  end
34
36
 
35
37
  ##
36
- # This method is used for retrive the original password.
38
+ # This method is used to retrieve the original password.
37
39
  #
38
40
  def password_clean
39
41
  crypted_password.decrypt(salt)
@@ -1,3 +1,5 @@
1
+ require 'digest/sha1'
2
+
1
3
  class Account < ::Sequel::Model
2
4
 
3
5
  plugin :validation_helpers
@@ -31,20 +33,21 @@ class Account < ::Sequel::Model
31
33
  end
32
34
 
33
35
  ##
34
- # This method is used for retrive the original password.
36
+ # Replace AR method
35
37
  #
36
- def password_clean
37
- crypted_password.decrypt(salt)
38
+ def self.find_by_id(id)
39
+ self[id] rescue nil
38
40
  end
39
41
 
40
42
  ##
41
- # Replace AR method
43
+ # This method is used to retrieve the original password.
42
44
  #
43
- def self.find_by_id(id)
44
- filter(:id => id).first
45
+ def password_clean
46
+ crypted_password.decrypt(salt)
45
47
  end
46
48
 
47
49
  private
50
+
48
51
  def generate_password
49
52
  return if password.blank?
50
53
  self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new?
@@ -1,31 +1,29 @@
1
1
  class Admin < Padrino::Application
2
- configure do
3
- ##
4
- # Application-specific configuration options
5
- #
6
- # set :raise_errors, true # Show exceptions (default for development)
7
- # set :public, "foo/bar" # Location for static assets (default root/public)
8
- # set :reload, false # Reload application files (default in development)
9
- # set :default_builder, "foo" # Set a custom form builder (default 'StandardFormBuilder')
10
- # set :locale_path, "bar" # Set path for I18n translations (default your_app/locales)
11
- # enable :sessions # Disabled by default
12
- # disable :flash # Disables rack-flash (enabled by default if sessions)
13
- # disable :padrino_helpers # Disables padrino markup helpers (enabled by default if present)
14
- # disable :padrino_mailer # Disables padrino mailer (enabled by default if present)
15
- # enable :authentication # Enable padrino-admin authentication (disabled by default)
16
- # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application)
17
- #
18
- enable :authentication
19
- disable :store_location
20
- set :login_page, "/admin/sessions/new"
2
+ register Padrino::Mailer
3
+ register Padrino::Helpers
4
+ register Padrino::Admin::AccessControl
21
5
 
22
- access_control.roles_for :any do |role|
23
- role.protect "/"
24
- role.allow "/sessions"
25
- end
6
+ ##
7
+ # Application configuration options
8
+ #
9
+ # set :raise_errors, true # Show exceptions (default for development)
10
+ # set :public, "foo/bar" # Location for static assets (default root/public)
11
+ # set :reload, false # Reload application files (default in development)
12
+ # set :default_builder, "foo" # Set a custom form builder (default 'StandardFormBuilder')
13
+ # set :locale_path, "bar" # Set path for I18n translations (default your_app/locales)
14
+ # enable :sessions # Disabled by default
15
+ # disable :flash # Disables rack-flash (enabled by default if sessions)
16
+ # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application)
17
+ #
26
18
 
27
- access_control.roles_for :admin do |role|
28
- end
19
+ set :login_page, "/admin/sessions/new"
20
+ disable :store_location
29
21
 
22
+ access_control.roles_for :any do |role|
23
+ role.protect "/"
24
+ role.allow "/sessions"
25
+ end
26
+
27
+ access_control.roles_for :admin do |role|
30
28
  end
31
29
  end
@@ -1,6 +1,6 @@
1
1
  Admin.controllers :base do
2
2
 
3
- get :index, :map => "(/)" do
3
+ get :index, :map => "/" do
4
4
  render "base/index"
5
5
  end
6
6
  end
@@ -94,9 +94,9 @@ module Padrino
94
94
  end
95
95
 
96
96
  def login_from_session
97
- Account.find_by_id(session[options.session_id]) if defined?(Account)
97
+ Account.find_by_id(session[settings.session_id]) if defined?(Account)
98
98
  end
99
99
  end # AuthenticationHelpers
100
100
  end # Helpers
101
101
  end # Admin
102
- end # Padrino
102
+ end # Padrino
@@ -0,0 +1,16 @@
1
+ en:
2
+ padrino:
3
+ admin:
4
+ save: Uložit
5
+ cancel: Storno
6
+ list: Výpis
7
+ edit: Editovat
8
+ new: Nový
9
+ show: Ukázat
10
+ delete: Smazat
11
+ confirm: Jste si jist/-a?
12
+ created_at: Vytvořen
13
+ all: Všichni
14
+ profile: Profil
15
+ settings: Nastavení
16
+ logout: Odhlásit
@@ -0,0 +1,16 @@
1
+ es:
2
+ padrino:
3
+ admin:
4
+ save: Guardar
5
+ cancel: Cancelar
6
+ list: Listar
7
+ edit: Editar
8
+ new: Nuevo
9
+ show: Mostrar
10
+ delete: Eliminar
11
+ confirm: ¿Estás seguro?
12
+ created_at: Creado el
13
+ all: Todos
14
+ profile: Perfil
15
+ settings: Configuración
16
+ logout: Cerrar sesión
@@ -0,0 +1,16 @@
1
+ tr:
2
+ padrino:
3
+ admin:
4
+ save: Kaydet
5
+ cancel: Vazgeç
6
+ list: Liste
7
+ edit: Değiştir
8
+ new: Yeni
9
+ show: Göster
10
+ delete: Sil
11
+ confirm: emin misiniz?
12
+ created_at: Oluşturuldu
13
+ all: Hepsi
14
+ profile: Profil
15
+ settings: Ayarlar
16
+ logout: Çıkış
@@ -0,0 +1,16 @@
1
+ uk:
2
+ padrino:
3
+ admin:
4
+ save: Зберегти
5
+ cancel: Скасувати
6
+ list: Список
7
+ edit: Змінити
8
+ new: Додати
9
+ show: Показати
10
+ delete: Видалити
11
+ confirm: Ви впевнені?
12
+ created_at: Додано
13
+ all: Всі
14
+ profile: Профіль
15
+ settings: Налаштування
16
+ logout: Вихід
@@ -0,0 +1,26 @@
1
+ en:
2
+ activemodel: &activemodel
3
+ errors:
4
+ messages:
5
+ inclusion: "není v seznamu povolených hodnot"
6
+ exclusion: "je vyhrazeno pro jiný účel"
7
+ invalid: "není platná hodnota"
8
+ confirmation: "nebylo potvrzeno"
9
+ accepted: "musí být potvrzeno"
10
+ empty: "nesmí být prázdný/é"
11
+ blank: "je povinná položka"
12
+ too_long: "je příliš dlouhá/ý (max. {{count}} znaků)"
13
+ too_short: "je příliš krátký/á (min. {{count}} znaků)"
14
+ wrong_length: "nemá správnou délku (očekáváno {{count}} znaků)"
15
+ taken: "již databáze obsahuje"
16
+ not_a_number: "není číslo"
17
+ greater_than: "musí být větší než {{count}}"
18
+ greater_than_or_equal_to: "musí být větší nebo rovno {{count}}"
19
+ equal_to: "musí být rovno {{count}}"
20
+ less_than: "musí být méně než {{count}}"
21
+ less_than_or_equal_to: "musí být méně nebo rovno {{count}}"
22
+ odd: "musí být liché číslo"
23
+ even: "musí být sudé číslo"
24
+ record_invalid: "Následující pole obsahují chybně vyplněné údaje: {{errors}}"
25
+ content_type: "nepodporovaný formát souboru"
26
+ activerecord: *activemodel
@@ -9,18 +9,18 @@ da:
9
9
  accepted: "skal accepteres"
10
10
  empty: "må ikke være tom"
11
11
  blank: "må ikke være blank"
12
- too_long: "er for lang (maksimum er {{count}} tegn)"
13
- too_short: "er for kort (minimum er {{count}} tegn)"
14
- wrong_length: "har ikke den rigtige længde (skal være på {{count}} tegn)"
12
+ too_long: "er for lang (maksimum er %{count} tegn)"
13
+ too_short: "er for kort (minimum er %{count} tegn)"
14
+ wrong_length: "har ikke den rigtige længde (skal være på %{count} tegn)"
15
15
  taken: "er allerede i brug"
16
16
  not_a_number: "er ikke et tal"
17
- greater_than: "skal være større end {{count}}"
18
- greater_than_or_equal_to: "skal være større end eller lig {{count}}"
19
- equal_to: "skal være lig {{count}}"
20
- less_than: "skal være mindre end {{count}}"
21
- less_than_or_equal_to: "skal være mindre end eller lig {{count}}"
17
+ greater_than: "skal være større end %{count}"
18
+ greater_than_or_equal_to: "skal være større end eller lig %{count}"
19
+ equal_to: "skal være lig %{count}"
20
+ less_than: "skal være mindre end %{count}"
21
+ less_than_or_equal_to: "skal være mindre end eller lig %{count}"
22
22
  odd: "skal være ulige"
23
23
  even: "skal være lige"
24
- record_invalid: "Valideringsfejl: {{errors}}"
24
+ record_invalid: "Valideringsfejl: %{errors}"
25
25
  content_type: "fileformatet er ikke understøttet"
26
26
  activerecord: *activemodel
@@ -4,23 +4,23 @@ de:
4
4
  messages:
5
5
  inclusion: "ist nicht in der Liste enthalten"
6
6
  exclusion: "ist reserviert"
7
- invalid: "ist ung¸ltig"
8
- confirmation: "entspricht nicht der Best‰tigung"
7
+ invalid: "ist ungültig"
8
+ confirmation: "entspricht nicht der Bestätigung"
9
9
  accepted: "muss akzeptiert werden"
10
10
  empty: "Darf nicht leer sein"
11
- blank: "Darf nicht nur Leerzeichen sein"
12
- too_long: "ist zu lang (Maximum ist {{count}} Zeichen)"
13
- too_short: "ist zu kurz (Minimum ist {{count}} Zeichen)"
14
- wrong_length: "ist ung¸ltiger L‰nge (soll {{count}} Zeichen sein)"
15
- taken: "has already been taken"
16
- not_a_number: "ist nicht eine Nummer"
17
- greater_than: "muss grˆfler sein als {{count}}"
18
- greater_than_or_equal_to: "muss grˆfler gleich sein als {{count}}"
19
- equal_to: "muss gleich sein als {{count}}"
20
- less_than: "muss weniger sein als {{count}}"
21
- less_than_or_equal_to: "muss weniger oder gleich sein als {{count}}"
11
+ blank: "Darf nicht nur Leerzeichen enthalten"
12
+ too_long: "ist zu lang (Maximum ist %{count} Zeichen)"
13
+ too_short: "ist zu kurz (Minimum ist %{count} Zeichen)"
14
+ wrong_length: "hat eine ungültige Länge (soll %{count} Zeichen sein)"
15
+ taken: "ist schon vergeben"
16
+ not_a_number: "ist keine Nummer"
17
+ greater_than: "muss größer als %{count} sein"
18
+ greater_than_or_equal_to: "muss größer oder gleich %{count} sein"
19
+ equal_to: "muss gleich %{count} sein"
20
+ less_than: "muss weniger als %{count} sein"
21
+ less_than_or_equal_to: "muss weniger oder gleich %{count} sein"
22
22
  odd: "muss ungerade sein"
23
23
  even: "muss gerade sein"
24
- record_invalid: "Validierung schlug fehl: {{errors}}"
25
- content_type: "Datei-Format wird nicht unterst¸tzt"
24
+ record_invalid: "Validierung schlug fehl: %{errors}"
25
+ content_type: "Datei-Format wird nicht unterstützt"
26
26
  activerecord: *activemodel
@@ -9,18 +9,18 @@ en:
9
9
  accepted: "must be accepted"
10
10
  empty: "can't be empty"
11
11
  blank: "can't be blank"
12
- too_long: "is too long (maximum is {{count}} characters)"
13
- too_short: "is too short (minimum is {{count}} characters)"
14
- wrong_length: "is the wrong length (should be {{count}} characters)"
12
+ too_long: "is too long (maximum is %{count} characters)"
13
+ too_short: "is too short (minimum is %{count} characters)"
14
+ wrong_length: "is the wrong length (should be %{count} characters)"
15
15
  taken: "has already been taken"
16
16
  not_a_number: "is not a number"
17
- greater_than: "must be greater than {{count}}"
18
- greater_than_or_equal_to: "must be greater than or equal to {{count}}"
19
- equal_to: "must be equal to {{count}}"
20
- less_than: "must be less than {{count}}"
21
- less_than_or_equal_to: "must be less than or equal to {{count}}"
17
+ greater_than: "must be greater than %{count}"
18
+ greater_than_or_equal_to: "must be greater than or equal to %{count}"
19
+ equal_to: "must be equal to %{count}"
20
+ less_than: "must be less than %{count}"
21
+ less_than_or_equal_to: "must be less than or equal to %{count}"
22
22
  odd: "must be odd"
23
23
  even: "must be even"
24
- record_invalid: "Validation failed: {{errors}}"
24
+ record_invalid: "Validation failed: %{errors}"
25
25
  content_type: "file format not supported"
26
26
  activerecord: *activemodel