spree 0.10.0.beta → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of spree might be problematic. Click here for more details.

Files changed (65) hide show
  1. data/README.markdown +36 -30
  2. data/app/controllers/admin/option_types_controller.rb +1 -1
  3. data/app/controllers/admin/payments_controller.rb +1 -1
  4. data/app/controllers/admin/products_controller.rb +4 -4
  5. data/app/controllers/admin/variants_controller.rb +2 -2
  6. data/app/controllers/checkouts_controller.rb +5 -11
  7. data/app/controllers/orders_controller.rb +10 -0
  8. data/app/controllers/user_sessions_controller.rb +16 -0
  9. data/app/models/product.rb +2 -1
  10. data/app/models/variant.rb +1 -1
  11. data/config/boot.rb +6 -6
  12. data/config/environment.rb +1 -1
  13. data/config/locales/cs-CZ.yml +12 -2
  14. data/config/locales/da.yml +12 -2
  15. data/config/locales/de-CH.yml +12 -2
  16. data/config/locales/de.yml +12 -2
  17. data/config/locales/en-AU.yml +12 -2
  18. data/config/locales/en-GB.yml +12 -2
  19. data/config/locales/en-US.yml +12 -2
  20. data/config/locales/es.yml +12 -2
  21. data/config/locales/fi.yml +12 -2
  22. data/config/locales/fr-FR.yml +12 -2
  23. data/config/locales/il.yml +12 -2
  24. data/config/locales/it.yml +12 -2
  25. data/config/locales/jp.yml +12 -2
  26. data/config/locales/mx.yml +12 -2
  27. data/config/locales/nb-NO.yml +12 -2
  28. data/config/locales/nl-BE.yml +12 -2
  29. data/config/locales/nl-NL.yml +12 -2
  30. data/config/locales/pl.yml +12 -2
  31. data/config/locales/pt-BR.yml +12 -2
  32. data/config/locales/pt-PT.yml +12 -2
  33. data/config/locales/ru-RU.yml +12 -2
  34. data/config/locales/th.yml +12 -2
  35. data/config/locales/vn.yml +12 -2
  36. data/db/migrate/20091021133257_charge_refactoring.rb +2 -2
  37. data/db/migrate/20100105132138_shipment_id_for_inventory_units.rb +4 -0
  38. data/db/schema.rb +1 -1
  39. data/lib/spree.rb +1 -1
  40. data/test/functional/admin/payments_controller_test.rb +7 -1
  41. data/test/integration/checkout_test.rb +59 -0
  42. data/test/test_helper.rb +1 -0
  43. data/test/unit/creditcard_test.rb +6 -0
  44. data/vendor/extensions/localization/app/controllers/locale_controller.rb +4 -1
  45. data/vendor/extensions/payment_gateway/lib/spree/payment_gateway.rb +1 -0
  46. data/vendor/extensions/theme_default/app/views/admin/option_types/selected.html.erb +1 -1
  47. data/vendor/extensions/theme_default/app/views/admin/orders/edit.html.erb +1 -0
  48. data/vendor/extensions/theme_default/app/views/admin/orders/new.html.erb +1 -0
  49. data/vendor/extensions/theme_default/app/views/admin/payments/_form.html.erb +1 -1
  50. data/vendor/extensions/theme_default/app/views/admin/payments/source_forms/_gateway.html.erb +2 -2
  51. data/vendor/extensions/theme_default/app/views/admin/products/_option_types.html.erb +1 -1
  52. data/vendor/extensions/theme_default/app/views/admin/shipments/edit.html.erb +1 -1
  53. data/vendor/extensions/theme_default/app/views/admin/shipments/index.html.erb +1 -1
  54. data/vendor/extensions/theme_default/app/views/admin/states/_state_list.html.erb +1 -1
  55. data/vendor/extensions/theme_default/app/views/admin/tax_categories/index.html.erb +1 -1
  56. data/vendor/extensions/theme_default/app/views/admin/zones/index.html.erb +1 -1
  57. data/vendor/extensions/theme_default/app/views/checkouts/_payment.html.erb +7 -11
  58. data/vendor/extensions/theme_default/app/views/checkouts/_summary.html.erb +9 -6
  59. data/vendor/extensions/theme_default/app/views/layouts/spree_application.html.erb +1 -1
  60. data/vendor/extensions/theme_default/app/views/shared/_login.html.erb +0 -1
  61. data/vendor/extensions/theme_default/app/views/users/_openid_identifier.html.erb +0 -1
  62. data/vendor/extensions/theme_default/public/javascripts/admin/orders/edit.js +1 -1
  63. data/vendor/extensions/theme_default/theme_default_extension.rb +0 -16
  64. data/vendor/plugins/resource_controller/lib/resource_controller/controller.rb +3 -3
  65. metadata +8 -9
@@ -5,42 +5,24 @@ Spree is a complete open source commerce solution for Ruby on Rails.
5
5
  It was developed by Sean Schofield under the original name of Rails
6
6
  Cart before changing its name to Spree.
7
7
 
8
- QUICK START
9
- ===========
10
-
11
- Running from sources (latest and greatest features)
12
- ---------------------------------------------------
13
-
14
- 1. Clone the git repo
15
-
16
- git clone git://github.com/railsdog/spree.git spree
8
+ Refer to the [Spree ecommerce project page](http://spreecommerce.com)
9
+ to learn more.
17
10
 
18
- 2. Create the necessary config/database.yml file
19
-
20
- 3. Install the gem dependencies
21
11
 
22
- rake gems:install
23
-
24
- 4. Bootstrap the database (run the migrations, create admin account, optionally load sample data.)
25
-
26
- rake db:bootstrap
27
-
28
- 5. Start the server
29
-
30
- script/server
12
+ QUICK START
13
+ ===========
31
14
 
32
15
  Running the Gem
33
16
  ---------------
34
17
 
35
- 1. Install spree Gem
36
-
37
- sudo gem install spree
18
+ 1. Install spree Gem (can take a while to install missing gem dependencies)
38
19
 
39
- **NOTE:** This may take a while. The gem currently includes a frozen version of Rails 2.0.2
20
+ (sudo) gem install spree
40
21
 
41
- 2. Create Spree Application
22
+ 2. Create Spree Application
42
23
 
43
24
  spree <app_name>
25
+ cd <app-name>
44
26
 
45
27
  3. Create your database and edit the _config/database.yml_ to taste.
46
28
 
@@ -50,21 +32,45 @@ Running the Gem
50
32
 
51
33
  4. Bootstrap
52
34
 
53
- cd <app-name>
54
35
  rake db:bootstrap
55
36
 
56
37
  5. Launch Application
57
38
 
58
39
  script/server
59
40
 
41
+
60
42
  Browse Store
61
43
  ------------
62
44
 
63
- http://localhost:xxxx/store
45
+ http://localhost:nnnn/store
64
46
 
65
47
  Browse Admin Interface
66
48
  ----------------------
67
49
 
68
- http://localhost:xxxx/admin
50
+ http://localhost:nnnn/admin
51
+
52
+
53
+
54
+ Running from edge sources (latest and greatest features)
55
+ --------------------------------------------------------
56
+
57
+ 1. Clone the git repo
58
+
59
+ git clone git://github.com/railsdog/spree.git spree
60
+ cd spree
61
+
62
+ 2. Create the necessary config/database.yml file
63
+
64
+ 3. Install the gem dependencies
65
+
66
+ (sudo) rake gems:install
67
+
68
+ 4. Bootstrap the database (run the migrations, create admin account, optionally load sample data.)
69
+
70
+ rake db:bootstrap
71
+
72
+ 5. Start the server
73
+
74
+ script/server
75
+
69
76
 
70
- Refer to the [Spree ecommerce project page](http://spreecommerce.com) to learn more about spree.
@@ -16,7 +16,7 @@ class Admin::OptionTypesController < Admin::BaseController
16
16
  def remove
17
17
  @product.option_types.delete(@option_type)
18
18
  @product.save
19
- flash[:notice] = "Succesfully removed option type."
19
+ flash[:notice] = I18n.t("notice_messages.option_type_removed")
20
20
  redirect_to selected_admin_product_option_types_url(@product)
21
21
  end
22
22
 
@@ -95,7 +95,7 @@ class Admin::PaymentsController < Admin::BaseController
95
95
  @object = model.new(object_params)
96
96
  @object.payable = parent_object.checkout
97
97
  @payment = @object
98
- if current_gateway.payment_profiles_supported? and params[:card].present? and params[:card] != 'new'
98
+ if @object.payment_method.is_a?(Gateway) and @object.payment_method.payment_profiles_supported? and params[:card].present? and params[:card] != 'new'
99
99
  @object.source = Creditcard.find_by_id(params[:card])
100
100
  end
101
101
  @object
@@ -38,9 +38,9 @@ class Admin::ProductsController < Admin::BaseController
38
38
  end
39
39
 
40
40
  if @product.save
41
- flash[:notice] = "Product has been deleted"
41
+ flash[:notice] = I18n.t("notice_messages.product_deleted")
42
42
  else
43
- flash[:notice] = "Product could not be deleted"
43
+ flash[:notice] = I18n.t("notice_messages.product_not_deleted")
44
44
  end
45
45
 
46
46
  respond_to do |format|
@@ -54,9 +54,9 @@ class Admin::ProductsController < Admin::BaseController
54
54
  @new = @product.duplicate
55
55
 
56
56
  if @new.save
57
- flash[:notice] = "Product has been cloned"
57
+ flash[:notice] = I18n.t("notice_messages.product_cloned")
58
58
  else
59
- flash[:notice] = "Product could not be cloned"
59
+ flash[:notice] = I18n.t("notice_messages.product_not_cloned")
60
60
  end
61
61
 
62
62
  redirect_to edit_admin_product_url(@new)
@@ -25,9 +25,9 @@ class Admin::VariantsController < Admin::BaseController
25
25
 
26
26
  @variant.deleted_at = Time.now()
27
27
  if @variant.save
28
- flash[:notice] = "Variant has been deleted"
28
+ flash[:notice] = I18n.t("notice_messages.variant_deleted")
29
29
  else
30
- flash[:notice] = "Variant could not be deleted"
30
+ flash[:notice] = I18n.t("notice_messages.variant_not_deleted")
31
31
  end
32
32
 
33
33
  respond_to do |format|
@@ -17,7 +17,7 @@ class CheckoutsController < Spree::BaseController
17
17
  # GET /checkout is invalid but we'll assume a bookmark or user error and just redirect to edit (assuming checkout is still in progress)
18
18
  show.wants.html { redirect_to edit_object_url }
19
19
 
20
- edit.before :edit_hooks, :set_user
20
+ edit.before :edit_hooks
21
21
  delivery.edit_hook :load_available_methods
22
22
  address.edit_hook :set_ip_address
23
23
  payment.edit_hook :load_available_payment_methods
@@ -30,7 +30,8 @@ class CheckoutsController < Spree::BaseController
30
30
  # call the edit hooks for the current step in case we experience validation failure and need to edit again
31
31
  edit_hooks
32
32
  @checkout.enable_validation_group(@checkout.state.to_sym)
33
-
33
+ @prev_state = @checkout.state
34
+
34
35
  before :update
35
36
 
36
37
  begin
@@ -77,7 +78,7 @@ class CheckoutsController < Spree::BaseController
77
78
  def object_params
78
79
  # For payment step, filter checkout parameters to produce the expected nested attributes for a single payment and its source, discarding attributes for payment methods other than the one selected
79
80
  if object.payment?
80
- if source_params = params.delete(:payment_source)[params[:checkout][:payments_attributes].first[:payment_method_id].underscore]
81
+ if params[:payment_source].present? && source_params = params.delete(:payment_source)[params[:checkout][:payments_attributes].first[:payment_method_id].underscore]
81
82
  params[:checkout][:payments_attributes].first[:source_attributes] = source_params
82
83
  end
83
84
  params[:checkout][:payments_attributes].first[:amount] = @order.total
@@ -98,7 +99,7 @@ class CheckoutsController < Spree::BaseController
98
99
  complete_order
99
100
  order_params = {:checkout_complete => true}
100
101
  session[:order_id] = nil
101
- flash[:commerce_tracking] = "Track Me in GA"
102
+ flash[:commerce_tracking] = I18n.t("notice_messages.track_me_in_GA")
102
103
  redirect_to order_url(@order, {:checkout_complete => true, :order_token => @order.token})
103
104
  end
104
105
 
@@ -206,13 +207,6 @@ class CheckoutsController < Spree::BaseController
206
207
  redirect_to register_order_checkout_url(parent_object)
207
208
  end
208
209
 
209
- def set_user
210
- if object.order.user.nil? && current_user
211
- object.order.user = current_user
212
- object.order.save
213
- end
214
- end
215
-
216
210
  def accurate_title
217
211
  I18n.t(:checkout)
218
212
  end
@@ -1,6 +1,7 @@
1
1
  class OrdersController < Spree::BaseController
2
2
  prepend_before_filter :reject_unknown_object, :only => [:show, :edit, :update, :checkout]
3
3
  before_filter :prevent_editing_complete_order, :only => [:edit, :update, :checkout]
4
+ before_filter :set_user
4
5
 
5
6
  ssl_required :show
6
7
 
@@ -76,6 +77,15 @@ class OrdersController < Spree::BaseController
76
77
  redirect_to object_url if @order.checkout_complete
77
78
  end
78
79
 
80
+ def set_user
81
+ if @order && @order.user != current_user
82
+ if @order.checkout
83
+ @order.checkout.update_attribute(:email, current_user && current_user.email)
84
+ end
85
+ @order.update_attribute(:user, current_user)
86
+ end
87
+ end
88
+
79
89
  def accurate_title
80
90
  I18n.t(:shopping_cart)
81
91
  end
@@ -23,6 +23,7 @@ class UserSessionsController < Spree::BaseController
23
23
 
24
24
  def destroy
25
25
  current_user_session.destroy
26
+ session.clear
26
27
  flash[:notice] = t("logged_out")
27
28
  redirect_to products_path
28
29
  end
@@ -46,6 +47,21 @@ class UserSessionsController < Spree::BaseController
46
47
  @user_session = UserSession.new(data)
47
48
  @user_session.save do |result|
48
49
  if result
50
+ # Should restore last uncompleted order and add current(guest) order to it, if exists.
51
+ order = @user_session.record.orders.last(:conditions => {:completed_at => nil})
52
+ if order
53
+ if (session[:order_token] && guest_order = Order.find_by_token(session[:order_token]))
54
+ guest_order.line_items.each do |line_item|
55
+ order.add_variant(line_item.variant, line_item.quantity)
56
+ end
57
+ order.save
58
+ session[:return_to].gsub!(guest_order.number, order.number) if session[:return_to]
59
+ guest_order.destroy
60
+ end
61
+ session[:order_token] = order.token
62
+ session[:order_id] = order.id
63
+ end
64
+
49
65
  respond_to do |format|
50
66
  format.html {
51
67
  flash[:notice] = t("logged_in_succesfully") unless session[:return_to]
@@ -33,7 +33,8 @@ class Product < ActiveRecord::Base
33
33
  :class_name => 'Variant',
34
34
  :conditions => ["variants.is_master = ? AND variants.deleted_at IS NULL", true]
35
35
 
36
- delegate_belongs_to :master, :sku, :price, :weight, :height, :width, :depth, :is_master, :cost_price
36
+ delegate_belongs_to :master, :sku, :price, :weight, :height, :width, :depth, :is_master
37
+ delegate_belongs_to :master, :cost_price if Variant.column_names.include? "cost_price"
37
38
 
38
39
  after_create :set_master_variant_defaults
39
40
  after_create :add_properties_and_option_types_from_prototype
@@ -9,7 +9,7 @@ class Variant < ActiveRecord::Base
9
9
 
10
10
  validate :check_price
11
11
  validates_presence_of :price
12
- validates_numericality_of :cost_price, :allow_nil => true
12
+ validates_numericality_of :cost_price, :allow_nil => true if Variant.column_names.include? "cost_price"
13
13
 
14
14
  before_save :touch_product
15
15
 
@@ -37,17 +37,17 @@ module Spree
37
37
  def load_rubygems
38
38
  require 'rubygems'
39
39
 
40
+ unless rubygems_version >= '1.3.5'
41
+ $stderr.puts %(Spree requires RubyGems >= 1.3.5 (you have #{rubygems_version}). Please `gem update --system` and try again.)
42
+ exit 1
43
+ end
44
+
40
45
  # Temporary workaround for annoying RubyGems warning. This can be removed once Rails 2.3.6 is released.
41
46
  # See http://railsdog.lighthouseapp.com/projects/31096-spree/tickets/1209
42
47
  Gem::Dependency.warned_version_requirement = true
43
48
 
44
- unless rubygems_version >= '1.3.6'
45
- $stderr.puts %(Spree requires RubyGems >= 1.3.6 (you have #{rubygems_version}). Please `gem update --system` and try again.)
46
- exit 1
47
- end
48
-
49
49
  rescue LoadError
50
- $stderr.puts %(Spree requires RubyGems >= 1.3.6. Please install RubyGems and try again: http://rubygems.rubyforge.org)
50
+ $stderr.puts %(Spree requires RubyGems >= 1.3.5. Please install RubyGems and try again: http://rubygems.rubyforge.org)
51
51
  exit 1
52
52
  end
53
53
 
@@ -5,7 +5,7 @@
5
5
  # ENV['RAILS_ENV'] ||= 'production'
6
6
 
7
7
  # Specifies gem version of Rails to use when vendor/rails is not present
8
- SPREE_GEM_VERSION = '0.10.0.beta' unless defined? SPREE_GEM_VERSION
8
+ SPREE_GEM_VERSION = '0.10.0' unless defined? SPREE_GEM_VERSION
9
9
 
10
10
  # Bootstrap the Rails environment, frameworks, and default configuration
11
11
  require File.join(File.dirname(__FILE__), 'boot')
@@ -515,6 +515,15 @@ cs-CZ:
515
515
  none_available: "Žádný dostupný"
516
516
  not: ne
517
517
  note: "Poznámka"
518
+ notice_messages:
519
+ option_type_removed: "Succesfully removed option type."
520
+ product_cloned: "Product has been cloned"
521
+ product_deleted: "Product has been deleted"
522
+ product_not_cloned: "Product could not be cloned"
523
+ product_not_deleted: "Product could not be deleted"
524
+ track_me_in_GA: "Track Me in GA"
525
+ variant_deleted: "Variant has been deleted"
526
+ variant_not_deleted: "Variant could not be deleted"
518
527
  on_hand: "Dostupný"
519
528
  operation: Operace
520
529
  option_Values: "Hodnoty volby"
@@ -609,12 +618,12 @@ cs-CZ:
609
618
  name: "Vzestupně podle názvu výrobku"
610
619
  ascend_by_updated_at:
611
620
  name: "Vzestupně podle data poslední změny"
612
- descend_by_popularity:
613
- name: "Řadit podle popularity, nejvíce populární na začátek"
614
621
  descend_by_master_price:
615
622
  name: "Sestupně podle základní ceny"
616
623
  descend_by_name:
617
624
  name: "Sestupně podle názvu výrobku"
625
+ descend_by_popularity:
626
+ name: "Řadit podle popularity, nejvíce populární na začátek"
618
627
  descend_by_updated_at:
619
628
  name: "Sestupně podle data poslední změny"
620
629
  in_name:
@@ -882,6 +891,7 @@ cs-CZ:
882
891
  use_as_shipping_address: "Použít jako doručovací adresu"
883
892
  use_billing_address: "Použít fakturační adresu"
884
893
  use_different_shipping_address: "Použít jinou doručovací adresu"
894
+ use_new_cc: "Use a new card"
885
895
  user: "Uživatel"
886
896
  user_account: "Uživatelský účet"
887
897
  user_created_successfully: "Uživatel byl úspěšně vytvořen"
@@ -515,6 +515,15 @@ da:
515
515
  none_available: "None Available"
516
516
  not: not
517
517
  note: Note
518
+ notice_messages:
519
+ option_type_removed: "Succesfully removed option type."
520
+ product_cloned: "Product has been cloned"
521
+ product_deleted: "Product has been deleted"
522
+ product_not_cloned: "Product could not be cloned"
523
+ product_not_deleted: "Product could not be deleted"
524
+ track_me_in_GA: "Track Me in GA"
525
+ variant_deleted: "Variant has been deleted"
526
+ variant_not_deleted: "Variant could not be deleted"
518
527
  on_hand: "On Hand"
519
528
  operation: Operation
520
529
  option_Values: "Option Values"
@@ -609,12 +618,12 @@ da:
609
618
  name: Ascend by product name
610
619
  ascend_by_updated_at:
611
620
  name: Ascend by actualization date
612
- descend_by_popularity:
613
- name: Sort by popularity(most popular first)
614
621
  descend_by_master_price:
615
622
  name: Descend by product master price
616
623
  descend_by_name:
617
624
  name: Descend by product name
625
+ descend_by_popularity:
626
+ name: Sort by popularity(most popular first)
618
627
  descend_by_updated_at:
619
628
  name: Descend by actualization date
620
629
  in_name:
@@ -882,6 +891,7 @@ da:
882
891
  use_as_shipping_address: Use as Shipping Address
883
892
  use_billing_address: Use Billing Address
884
893
  use_different_shipping_address: "Use Different Shipping Address"
894
+ use_new_cc: "Use a new card"
885
895
  user: User
886
896
  user_account: User Account
887
897
  user_created_successfully: "User created successfully"
@@ -515,6 +515,15 @@ de-CH:
515
515
  none_available: "keine verfügbar"
516
516
  not: not
517
517
  note: Note
518
+ notice_messages:
519
+ option_type_removed: "Succesfully removed option type."
520
+ product_cloned: "Product has been cloned"
521
+ product_deleted: "Product has been deleted"
522
+ product_not_cloned: "Product could not be cloned"
523
+ product_not_deleted: "Product could not be deleted"
524
+ track_me_in_GA: "Track Me in GA"
525
+ variant_deleted: "Variant has been deleted"
526
+ variant_not_deleted: "Variant could not be deleted"
518
527
  on_hand: "Auf Lager"
519
528
  operation: Operation
520
529
  option_Values: "Optionswerte"
@@ -609,12 +618,12 @@ de-CH:
609
618
  name: Ascend by product name
610
619
  ascend_by_updated_at:
611
620
  name: Ascend by actualization date
612
- descend_by_popularity:
613
- name: Sort by popularity(most popular first)
614
621
  descend_by_master_price:
615
622
  name: Descend by product master price
616
623
  descend_by_name:
617
624
  name: Descend by product name
625
+ descend_by_popularity:
626
+ name: Sort by popularity(most popular first)
618
627
  descend_by_updated_at:
619
628
  name: Descend by actualization date
620
629
  in_name:
@@ -882,6 +891,7 @@ de-CH:
882
891
  use_as_shipping_address: Use as Shipping Address
883
892
  use_billing_address: Use Billing Address
884
893
  use_different_shipping_address: "Andere Lieferaddresse verwenden"
894
+ use_new_cc: "Use a new card"
885
895
  user: Benutzer
886
896
  user_account: User Account
887
897
  user_created_successfully: "User created successfully"
@@ -515,6 +515,15 @@ de:
515
515
  none_available: "keine verfügbar"
516
516
  not: not
517
517
  note: Note
518
+ notice_messages:
519
+ option_type_removed: "Succesfully removed option type."
520
+ product_cloned: "Product has been cloned"
521
+ product_deleted: "Product has been deleted"
522
+ product_not_cloned: "Product could not be cloned"
523
+ product_not_deleted: "Product could not be deleted"
524
+ track_me_in_GA: "Track Me in GA"
525
+ variant_deleted: "Variant has been deleted"
526
+ variant_not_deleted: "Variant could not be deleted"
518
527
  on_hand: "Auf Lager"
519
528
  operation: Operation
520
529
  option_Values: "Options Werte"
@@ -609,12 +618,12 @@ de:
609
618
  name: "Aufsteigend nach Produktname"
610
619
  ascend_by_updated_at:
611
620
  name: "Aufsteigend nach Bearbeitungsdatum"
612
- descend_by_popularity:
613
- name: "Nach Beliebtheit sortieren (beliebteste zuerst)"
614
621
  descend_by_master_price:
615
622
  name: "Absteigend nach Grundpreis"
616
623
  descend_by_name:
617
624
  name: "Absteigend nach Produktname"
625
+ descend_by_popularity:
626
+ name: "Nach Beliebtheit sortieren (beliebteste zuerst)"
618
627
  descend_by_updated_at:
619
628
  name: "Absteigend nach Bearbeitungsdatum"
620
629
  in_name:
@@ -882,6 +891,7 @@ de:
882
891
  use_as_shipping_address: "Als Lieferadresse verwenden"
883
892
  use_billing_address: "Rechnungsadresse verwenden"
884
893
  use_different_shipping_address: "Andere Lieferaddresse verwenden"
894
+ use_new_cc: "Use a new card"
885
895
  user: Benutzer
886
896
  user_account: "Benutzerkonto"
887
897
  user_created_successfully: "Benutzer erfolgreich angelegt"