shoppe 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/shoppe/application.coffee +4 -0
  3. data/app/assets/stylesheets/shoppe/application.scss +3 -3
  4. data/app/controllers/shoppe/addresses_controller.rb +47 -0
  5. data/app/controllers/shoppe/customers_controller.rb +55 -0
  6. data/app/controllers/shoppe/orders_controller.rb +29 -0
  7. data/app/controllers/shoppe/product_category_localisations_controller.rb +58 -0
  8. data/app/controllers/shoppe/product_localisations_controller.rb +58 -0
  9. data/app/controllers/shoppe/products_controller.rb +1 -1
  10. data/app/models/shoppe/address.rb +44 -0
  11. data/app/models/shoppe/customer.rb +41 -0
  12. data/app/models/shoppe/order.rb +7 -0
  13. data/app/models/shoppe/product.rb +6 -3
  14. data/app/models/shoppe/product/variants.rb +1 -1
  15. data/app/models/shoppe/product_category.rb +3 -3
  16. data/app/views/shoppe/addresses/_form.html.haml +33 -0
  17. data/app/views/shoppe/addresses/edit.html.haml +5 -0
  18. data/app/views/shoppe/addresses/new.html.haml +5 -0
  19. data/app/views/shoppe/customers/_addresses.html.haml +20 -0
  20. data/app/views/shoppe/customers/_form.html.haml +30 -0
  21. data/app/views/shoppe/customers/_search_form.html.haml +13 -0
  22. data/app/views/shoppe/customers/edit.html.haml +5 -0
  23. data/app/views/shoppe/customers/index.html.haml +32 -0
  24. data/app/views/shoppe/customers/new.html.haml +5 -0
  25. data/app/views/shoppe/customers/show.html.haml +53 -0
  26. data/app/views/shoppe/orders/_form.html.haml +3 -0
  27. data/app/views/shoppe/product_categories/_form.html.haml +1 -2
  28. data/app/views/shoppe/product_categories/edit.html.haml +3 -1
  29. data/app/views/shoppe/product_categories/index.html.haml +7 -0
  30. data/app/views/shoppe/product_category_localisations/form.html.haml +29 -0
  31. data/app/views/shoppe/product_category_localisations/index.html.haml +26 -0
  32. data/app/views/shoppe/product_localisations/form.html.haml +32 -0
  33. data/app/views/shoppe/product_localisations/index.html.haml +26 -0
  34. data/app/views/shoppe/products/edit.html.haml +1 -0
  35. data/app/views/shoppe/variants/form.html.haml +3 -1
  36. data/config/locales/en.yml +82 -1
  37. data/config/routes.rb +10 -1
  38. data/db/migrate/20141013192427_create_shoppe_customers.rb +14 -0
  39. data/db/migrate/20141027215005_create_shoppe_addresses.rb +17 -0
  40. data/db/migrate/20150315215633_add_customer_to_shoppe_orders.rb +5 -0
  41. data/db/migrate/20150513171350_create_shoppe_product_category_translation_table.rb +17 -0
  42. data/db/migrate/20150519173350_create_shoppe_product_translation_table.rb +18 -0
  43. data/db/schema.rb +42 -1
  44. data/lib/shoppe.rb +1 -0
  45. data/lib/shoppe/default_navigation.rb +1 -0
  46. data/lib/shoppe/version.rb +1 -1
  47. metadata +41 -2
@@ -5,7 +5,7 @@ module Shoppe
5
5
  validate { errors.add :base, :can_belong_to_root if self.parent && self.parent.parent }
6
6
 
7
7
  # Variants of the product
8
- has_many :variants, -> { order(:default => :desc, :name => :asc) }, :class_name => 'Shoppe::Product', :foreign_key => 'parent_id', :dependent => :destroy
8
+ has_many :variants, :class_name => 'Shoppe::Product', :foreign_key => 'parent_id', :dependent => :destroy
9
9
 
10
10
  # The parent product (only applies to variants)
11
11
  belongs_to :parent, :class_name => 'Shoppe::Product', :foreign_key => 'parent_id'
@@ -23,15 +23,15 @@ module Shoppe
23
23
  validates :name, :presence => true
24
24
  validates :permalink, :presence => true, :uniqueness => {scope: :parent_id}, :permalink => true
25
25
 
26
- # All categories ordered by their name ascending
27
- scope :ordered, -> { order(:name) }
28
-
29
26
  # Root (no parent) product categories only
30
27
  scope :without_parent, -> { where(parent_id: nil) }
31
28
 
32
29
  # No descendents
33
30
  scope :except_descendants, ->(record) { where.not(id: (Array.new(record.descendants) << record).flatten) }
34
31
 
32
+ translates :name, :permalink, :description, :short_description
33
+ scope :ordered, -> { includes(:translations).order(:name) }
34
+
35
35
  # Set the permalink on callback
36
36
  before_validation :set_permalink, :set_ancestral_permalink
37
37
  after_save :set_child_permalinks
@@ -0,0 +1,33 @@
1
+ = form_for @address, url: [@customer, @address] do |f|
2
+ = f.error_messages
3
+
4
+ = field_set_tag "Address Information" do
5
+ %dl
6
+ %dt= f.label :address_type
7
+ %dd= f.select :address_type, Shoppe::Address::TYPES, {}, :class => "chosen"
8
+ .splitContainer
9
+ %dl.third
10
+ %dt= f.label :address1
11
+ %dd= f.text_field :address1, :class => "text"
12
+ %dl.third
13
+ %dt= f.label :address2
14
+ %dd= f.text_field :address2, :class => "text"
15
+ %dl.third
16
+ %dt= f.label :address3
17
+ %dd= f.text_field :address3, :class => "text"
18
+ .splitContainer
19
+ %dl.third
20
+ %dt= f.label :address4
21
+ %dd= f.text_field :address4, :class => "text"
22
+ %dl.third
23
+ %dt= f.label :postcode
24
+ %dd= f.text_field :postcode, :class => "text"
25
+ %dl.third
26
+ %dt= f.label :country_id
27
+ %dd= f.collection_select :country_id, Shoppe::Country.ordered, :id, :name, {:include_blank => true}, {:class => 'chosen', :data => { :placeholder => t('shoppe.orders.select_country')}}
28
+
29
+ %p.submit
30
+ - unless @address.new_record?
31
+ %span.right= link_to t('shoppe.delete'), [@customer, @address], :class => 'button purple', :method => :delete, :data => {:confirm => "Are you sure you wish to remove this address?"}
32
+ = f.submit :class => 'button green', data: {disable_with: (@address.new_record? ? "Creating Address..." : "Updating Address...")}
33
+ = link_to t('shoppe.cancel'), :customers, :class => 'button'
@@ -0,0 +1,5 @@
1
+ - @page_title = "Edit Address"
2
+ = content_for :header do
3
+ %p.buttons= link_to "Back to customer", @customer, :class => 'button'
4
+ %h2.users Edit Address
5
+ = render "form"
@@ -0,0 +1,5 @@
1
+ - @page_title = "New Address for #{@customer.name}"
2
+ = content_for :header do
3
+ %p.buttons= link_to "Back to customer", @customer, :class => 'button'
4
+ %h2.users New Address
5
+ = render "form"
@@ -0,0 +1,20 @@
1
+ .addresses
2
+ .table
3
+ %table.data
4
+ %thead
5
+ %tr
6
+ %th Type
7
+ %th Default
8
+ %th Address
9
+ %th
10
+ %tbody
11
+ - if @addresses.empty?
12
+ %tr.empty
13
+ %td{:colspan => 4} No addresses to display.
14
+ - else
15
+ - for address in @addresses
16
+ %tr
17
+ %td= address.address_type.capitalize
18
+ %td= boolean_tag address.default
19
+ %td= address.full_address
20
+ %td= link_to "Edit", edit_customer_address_path(@customer, address)
@@ -0,0 +1,30 @@
1
+ = form_for @customer do |f|
2
+ = f.error_messages
3
+
4
+ = field_set_tag "Customer Information" do
5
+ .splitContainer
6
+ %dl.third
7
+ %dt= f.label :first_name
8
+ %dd= f.text_field :first_name, :class => "text focus"
9
+ %dl.third
10
+ %dt= f.label :last_name
11
+ %dd= f.text_field :last_name, :class => "text"
12
+ %dl.third
13
+ %dt= f.label :company
14
+ %dd= f.text_field :company, :class => "text"
15
+ .splitContainer
16
+ %dl.third
17
+ %dt= f.label :email
18
+ %dd= f.text_field :email, :class => "text"
19
+ %dl.third
20
+ %dt= f.label :phone
21
+ %dd= f.text_field :phone, :class => "text"
22
+ %dl.third
23
+ %dt= f.label :mobile
24
+ %dd= f.text_field :mobile, :class => "text"
25
+
26
+ %p.submit
27
+ - unless @customer.new_record?
28
+ %span.right= link_to "Delete", @customer, :class => 'button purple', :method => :delete, :data => {:confirm => "Are you sure you wish to remove this product?"}
29
+ = f.submit :class => 'button green', data: {disable_with: (@customer.new_record? ? "Creating Customer..." : "Updating Customer...")}
30
+ = link_to "Cancel", :customers, :class => 'button'
@@ -0,0 +1,13 @@
1
+ .customerSearch{:style => action_name == 'search' ? "display:block" : ''}
2
+ = search_form_for @query, :url => search_customers_path, :html => { :method => :post } do |f|
3
+ %dl.left
4
+ %dt= f.label :first_name_or_last_name_or_company_cont, "First or Last Name"
5
+ %dd= f.text_field :first_name_or_last_name_or_company_cont
6
+ %dt= f.label :company_cont, "Company"
7
+ %dd= f.text_field :company_cont
8
+ %dl.right
9
+ %dt= f.label :email_cont, "Email Address"
10
+ %dd= f.text_field :email_cont
11
+ %dt= f.label :phone_cont, "Phone Number"
12
+ %dd= f.text_field :phone_cont
13
+ %dd= f.submit "Search", :class => 'button green button'
@@ -0,0 +1,5 @@
1
+ - @page_title = "Customers"
2
+ = content_for :header do
3
+ %p.buttons= link_to "Back to customer list", :customers, :class => 'button'
4
+ %h2.users Customers
5
+ = render "form"
@@ -0,0 +1,32 @@
1
+ - @page_title = "Customers"
2
+
3
+ = content_for :header do
4
+ %p.buttons
5
+ = link_to "New Customer", :new_customer, class: "button green"
6
+ = link_to "Search Customers", '#', class: 'button', rel: "searchCustomers"
7
+ %h2.users Customers
8
+
9
+ = render "search_form"
10
+
11
+ .table
12
+ %table.data
13
+ %thead
14
+ %tr
15
+ %th Name
16
+ %th Company
17
+ %th Email
18
+ %th Phone
19
+ %th Mobile
20
+ %tbody
21
+ - if @customers.empty?
22
+ %tr.empty
23
+ %td{colspan: 5} No customers to display.
24
+ - else
25
+ - for customer in @customers
26
+ %tr
27
+ %td= link_to customer.full_name, customer
28
+ %td= link_to customer.company, customer
29
+ %td= customer.email
30
+ %td= customer.phone
31
+ %td= customer.mobile
32
+ = paginate @customers
@@ -0,0 +1,5 @@
1
+ - @page_title = "Customers"
2
+ = content_for :header do
3
+ %p.buttons= link_to "Back to customer list", :customers, :class => 'button'
4
+ %h2.users Customers
5
+ = render "form"
@@ -0,0 +1,53 @@
1
+ - @page_title = "Customer - #{@customer.name}"
2
+ = content_for :header do
3
+ %p.buttons
4
+ = link_to "New Address", [:new, @customer, :address], class: "button"
5
+ = link_to "Edit", [:edit, @customer], class: "button"
6
+ %h2.users
7
+ Customer - #{@customer.name}
8
+
9
+ #customer
10
+ .details
11
+ .left
12
+ %dl
13
+ %dt Name
14
+ %dd= @customer.full_name
15
+ %dt Company
16
+ %dd= @customer.company.blank? ? '-' : @customer.company
17
+ .right
18
+ %dl
19
+ %dt Email Address
20
+ %dd= mail_to @customer.email
21
+ %dt Telephone
22
+ %dd= @customer.phone
23
+ %dt Mobile
24
+ %dd= @customer.mobile
25
+
26
+ = field_set_tag "Addresses", :class => 'padded' do
27
+ = render "addresses"
28
+
29
+ = field_set_tag t('shoppe.orders.orders'), :class => 'padded' do
30
+ .table
31
+ %table.data
32
+ %thead
33
+ %tr
34
+ %th= t('shoppe.orders.number')
35
+ %th= t('shoppe.orders.status')
36
+ %th= t('shoppe.orders.products')
37
+ %th= t('shoppe.orders.total')
38
+ %th= t('shoppe.orders.payment')
39
+ %tbody
40
+ - if @orders.empty?
41
+ %tr.empty
42
+ %td{:colspan => 6}= t('shoppe.orders.no_orders')
43
+ - else
44
+ - for order in @orders
45
+ %tr
46
+ %td= link_to order.number, order
47
+ %td= status_tag order.status
48
+ %td
49
+ %ul
50
+ - for item in order.order_items
51
+ %li #{item.quantity} x #{item.ordered_item.full_name}
52
+ %td= number_to_currency order.total
53
+ %td= boolean_tag order.paid_in_full?, nil, :true_text => number_to_currency(order.amount_paid), :false_text => number_to_currency(order.amount_paid)
@@ -1,4 +1,7 @@
1
1
  = field_set_tag t('shoppe.orders.billing_address') do
2
+ %dl
3
+ %dt= f.label :customer_id, t('shoppe.orders.customer')
4
+ %dd= f.collection_select :customer_id, Shoppe::Customer.ordered, :id, :name, {:include_blank => true}, {:data => {:placeholder => t('shoppe.orders.select_customer')}}
2
5
  .splitContainer
3
6
  %dl.third
4
7
  %dt= f.label :first_name, t('shoppe.orders.first_name')
@@ -47,5 +47,4 @@
47
47
  %p.submit
48
48
  - unless @product_category.new_record?
49
49
  %span.right= link_to t('shoppe.delete') , @product_category, :class => 'button purple', :method => :delete, :data => {:confirm => t('shoppe.product_category.delete_confirmation') }
50
- = f.submit t('shoppe.submit'), :class => 'button green'
51
- = link_to t('shoppe.cancel') , :product_categories, :class => 'button'
50
+ = f.submit t('shoppe.submit'), :class => 'button green'
@@ -1,6 +1,8 @@
1
1
  - @page_title = t('shoppe.product_category.product_categories')
2
2
  = content_for :header do
3
- %p.buttons= link_to t('shoppe.product_category.back_to_categories'), :product_categories, :class => 'button'
3
+ %p.buttons
4
+ = link_to t('shoppe.localisations.localisations') , [@product_category, :localisations], :class => 'button'
5
+ = link_to t('shoppe.product_category.back_to_categories'), :product_categories, :class => 'button'
4
6
  %h2.products= t('shoppe.product_category.product_categories')
5
7
  = render 'form'
6
8
 
@@ -9,6 +9,8 @@
9
9
  %thead
10
10
  %tr
11
11
  %th= t('shoppe.product_category.name')
12
+ - I18n.available_locales.each do |i|
13
+ %th
12
14
  %tbody
13
15
  - if @product_categories_without_parent.empty?
14
16
  %tr.empty
@@ -17,4 +19,9 @@
17
19
  - for cat in @product_categories_without_parent
18
20
  %tr
19
21
  %td= link_to cat.name, [:edit, cat]
22
+ - I18n.available_locales.each do |i|
23
+ - if cat.translations.where(locale: i).count >= 1
24
+ %td= link_to i, edit_product_category_localisation_path(cat, cat.translations.where(locale: i).first.id)
25
+ - else
26
+ %td= link_to i, new_product_category_localisation_path(cat, locale_field: i)
20
27
  = nested_product_category_rows(cat)
@@ -0,0 +1,29 @@
1
+ - @page_title = "#{t('shoppe.localisations.localisations')} - #{@product_category.name}"
2
+ = content_for :header do
3
+ %p.buttons= link_to t('shoppe.localisations.back_to_localisations'), [@product_category, :localisations], :class => 'button'
4
+ %h2.products= t('shoppe.localisations.localisations_of', name: @product_category.name)
5
+
6
+ - loc = @localisation.new_record? ? :en : @localisation.locale.to_sym
7
+ - Globalize.with_locale(loc) do
8
+ = form_for [@product_category, @localisation], :url => @localisation.new_record? ? product_category_localisations_path(@product_category) : product_category_localisation_path(@product_category, @localisation), :html => {:multipart => true} do |f|
9
+ = f.error_messages
10
+
11
+ = field_set_tag t('shoppe.product_category.category_details') do
12
+ .splitContainer
13
+ %dl.half
14
+ %dt= f.label :name, t('shoppe.product_category.name')
15
+ %dd= f.text_field :name, :class => 'focus text'
16
+ %dl.half
17
+ %dt= f.label :locale
18
+ %dd= f.select :locale, I18n.available_locales, {selected: @localisation.locale || params[:locale_field]}, {class: "chosen"}
19
+ %dl
20
+ %dt= f.label :permalink, t('shoppe.product_category.permalink')
21
+ %dd= f.text_field :permalink, :class => 'text'
22
+ %dl.cleared
23
+ %dt= f.label :description, t('shoppe.product_category.description')
24
+ %dd= f.text_area :description, :class => 'text'
25
+
26
+ %p.submit
27
+ - unless @localisation.new_record?
28
+ %span.right= link_to t('shoppe.delete'), product_category_localisation_path(@product_category, @localisation), :class => 'button purple', :method => :delete, :data => {:confirm => t('shoppe.localisations.delete_confirmation')}
29
+ = f.submit t('shoppe.localisations.save_localisation'), :class => 'button green'
@@ -0,0 +1,26 @@
1
+ - @page_title = "#{t('shoppe.localisations.localisations')} - #{@product_category.name}"
2
+
3
+ = content_for :header do
4
+ %p.buttons
5
+ = link_to t('shoppe.localisations.back'), product_categories_path, :class => 'button'
6
+ = link_to t('shoppe.localisations.new_localisation'), [:new, @product_category, :localisation], :class => 'button green'
7
+
8
+ %h2.products= t('shoppe.localisations.localisations_of', name: @product_category.name)
9
+
10
+ .table
11
+ %table.data
12
+ %thead
13
+ %tr
14
+ %th{:width => '20%'}= t('shoppe.localisations.language')
15
+ %th{:width => '50%'}= t('shoppe.products.name')
16
+ %th{:width => '15%'}= t('shoppe.products.permalink')
17
+ %tbody
18
+ - if @localisations.empty?
19
+ %tr.empty
20
+ %td{:colspan => 4}= t('shoppe.localisations.no_localisations')
21
+ - else
22
+ - for localisation in @localisations
23
+ %tr
24
+ %td= localisation.locale
25
+ %td= link_to localisation.name, edit_product_category_localisation_path(@product_category, localisation)
26
+ %td= localisation.permalink
@@ -0,0 +1,32 @@
1
+ - @page_title = "#{t('shoppe.localisations.localisations')} - #{@product.name}"
2
+ = content_for :header do
3
+ %p.buttons= link_to t('shoppe.localisations.back_to_localisations'), [@product, :localisations], :class => 'button'
4
+ %h2.products= t('shoppe.localisations.localisations_of', name: @product.name)
5
+
6
+ - loc = @localisation.new_record? ? :en : @localisation.locale.to_sym
7
+ - Globalize.with_locale(loc) do
8
+ = form_for [@product, @localisation], :url => @localisation.new_record? ? product_localisations_path(@product) : product_localisation_path(@product, @localisation), :html => {:multipart => true} do |f|
9
+ = f.error_messages
10
+
11
+ = field_set_tag t('shoppe.product.category_details') do
12
+ .splitContainer
13
+ %dl.half
14
+ %dt= f.label :name, t('shoppe.product.name')
15
+ %dd= f.text_field :name, :class => 'focus text'
16
+ %dl.half
17
+ %dt= f.label :locale
18
+ %dd= f.select :locale, I18n.available_locales, {}, {class: "chosen"}
19
+ %dl
20
+ %dt= f.label :permalink, t('shoppe.product.permalink')
21
+ %dd= f.text_field :permalink, :class => 'text'
22
+ %dl.cleared
23
+ %dt= f.label :description, t('shoppe.product.description')
24
+ %dd= f.text_area :description, :class => 'text'
25
+ %dl.cleared
26
+ %dt= f.label :short_description, t('shoppe.product.short_description')
27
+ %dd= f.text_area :short_description, :class => 'text'
28
+
29
+ %p.submit
30
+ - unless @localisation.new_record?
31
+ %span.right= link_to t('shoppe.delete'), product_localisation_path(@product, @localisation), :class => 'button purple', :method => :delete, :data => {:confirm => t('shoppe.localisations.delete_confirmation')}
32
+ = f.submit t('shoppe.localisations.save_localisation'), :class => 'button green'
@@ -0,0 +1,26 @@
1
+ - @page_title = "#{t('shoppe.localisations.localisations')} - #{@product.name}"
2
+
3
+ = content_for :header do
4
+ %p.buttons
5
+ = link_to t('shoppe.localisations.back'), [:edit, @product], :class => 'button'
6
+ = link_to t('shoppe.localisations.new_localisation'), [:new, @product, :localisation], :class => 'button green'
7
+
8
+ %h2.products= t('shoppe.localisations.localisations_of', name: @product.name)
9
+
10
+ .table
11
+ %table.data
12
+ %thead
13
+ %tr
14
+ %th{:width => '20%'}= t('shoppe.localisations.language')
15
+ %th{:width => '50%'}= t('shoppe.products.name')
16
+ %th{:width => '15%'}= t('shoppe.products.permalink')
17
+ %tbody
18
+ - if @localisations.empty?
19
+ %tr.empty
20
+ %td{:colspan => 4}= t('shoppe.localisations.no_localisations')
21
+ - else
22
+ - for localisation in @localisations
23
+ %tr
24
+ %td= localisation.locale
25
+ %td= link_to localisation.name, edit_product_localisation_path(@product, localisation)
26
+ %td= localisation.permalink
@@ -1,6 +1,7 @@
1
1
  - @page_title = t('shoppe.products.products')
2
2
  = content_for :header do
3
3
  %p.buttons
4
+ = link_to t('shoppe.localisations.localisations') , [@product, :localisations], :class => 'button'
4
5
  = link_to t('shoppe.products.variants') , [@product, :variants], :class => 'button'
5
6
  = link_to t('shoppe.products.stock_levels') , stock_level_adjustments_path(:item_id => @product.id, :item_type => @product.class), :class => 'button', :rel => 'dialog', :data => {:dialog_width => 700, :dialog_behavior => 'stockLevelAdjustments'}
6
7
  = link_to t('shoppe.products.back_to_products') , :products, :class => 'button'
@@ -1,6 +1,8 @@
1
1
  - @page_title = "#{t('shoppe.variants.variants')} - #{@product.name}"
2
2
  = content_for :header do
3
- %p.buttons= link_to t('shoppe.variants.back_to_variants'), [@product, :variants], :class => 'button'
3
+ %p.buttons
4
+ = link_to t('shoppe.localisations.localisations') , [@variant, :localisations], :class => 'button'
5
+ = link_to t('shoppe.variants.back_to_variants'), [@product, :variants], :class => 'button'
4
6
  %h2.products= t('shoppe.variants.variants_of', product:@product.name)
5
7
 
6
8
  = form_for [@product, @variant], :url => @variant.new_record? ? product_variants_path(@product) : product_variant_path(@product, @variant), :html => {:multipart => true} do |f|
@@ -185,6 +185,65 @@ en:
185
185
  edit: Edit
186
186
  import: Import
187
187
  remove: Remove
188
+
189
+ removed_it: "%{it} has been removed successfully"
190
+ save_settings: Save Settings
191
+ separate_delivery_address: Separate delivery address
192
+ service_available: Service will be available for use
193
+ service_default: Service will be used by default (if possible)
194
+ settings_title: Settings
195
+ settings_not_in_demo: You cannot make changes to settings in demo mode. Sorry about that.
196
+ set_prices: Set Prices
197
+ shoppe_back: Back to Shoppe
198
+ sku: SKU
199
+ status: Status
200
+ stock: Stock
201
+ stock_current: Current stock level is
202
+ stock_control: Stock Control
203
+ stock_control_enable: Enable stock control for this product?
204
+ stock_levels: Stock levels
205
+ stock_levels_for: Stock levels %{item}
206
+ stock_none: No stock
207
+ system_settings: System settings
208
+ tax_rate: Tax rate
209
+ tax_rate_apply_to: Apply to orders where the %{to} matches one of the countries below
210
+ tax_rate_delete_confirm: Are you sure you wish to remove this tax_rate?
211
+ tax_rate_details: Rate Details
212
+ tax_rate_new: New tax rate
213
+ tax_rate_note: Do NOT edit tax rates that are already in use.
214
+ Care should be taken when editing tax rates, as this may affect existing orders.
215
+ while creating a new tax rate, you must delete it and create a new one. When you delete a tax rate
216
+ it is not removed from the system, only deactivated, so existing orders stay unaffected.
217
+ tax_rates: Tax Rates
218
+ tax_rates_back: Back to tax rates
219
+ tax_none: No tax
220
+ telephone: Telephone
221
+ total: Total
222
+ total_weight: Total weight
223
+ tracking_url: Tracking URL
224
+ unknown: Unknown
225
+ updated_it: "%{it} has been updated successfully"
226
+ users: Users
227
+ users_back: Back to users
228
+ user_delete_confirm: Are you sure you wish to remove this user?
229
+ user_details: User Details
230
+ user: User
231
+ user_edit: Edit user
232
+ user_new: New User
233
+ user_not_in_demo: You cannot make changes to users in demo mode. Sorry about that.
234
+ user_not_yourself: You cannot remove yourself
235
+ variants: Variants
236
+ variants_back: Back to variants
237
+ variants_of: Variants of %{product}
238
+ variant_delete_confirm: Are you sure you wish to remove this variant?
239
+ variant_of: Variant of %{product}
240
+ variant_new: New variant
241
+ variant_save: Save Variant
242
+ value: Value
243
+ website_properties: Website Properties
244
+ weight: Weight
245
+ weight_allowance: Weight Allowance
246
+
188
247
  submit: Submit
189
248
 
190
249
  attachments:
@@ -318,6 +377,7 @@ en:
318
377
  order_rejected: Order Rejected
319
378
  order_shipped: Order Shipped
320
379
  ordered_products: Ordered products
380
+
321
381
  orders: Orders
322
382
  payment: Payment
323
383
  payment_remove_confirmation: Are you sure you wish to remove this payment?
@@ -339,6 +399,8 @@ en:
339
399
  search: Search
340
400
  search_orders: Search orders
341
401
  select_country: Select a country
402
+ customer: Customer
403
+ select_customer: Select a customer or leave blank
342
404
  separate_delivery_address: Separate delivery address
343
405
  ship_notice: Order has been shipped successfully
344
406
  sku: SKU
@@ -425,7 +487,7 @@ en:
425
487
  featured?: Featured?
426
488
  featured_info: If checked, this product will appear on your homepage
427
489
  import_products: Import products
428
- in_the_box: What's in the box?
490
+ in_the_box: "What's in the box?"
429
491
  name: Name
430
492
  new_product: New product
431
493
  no_products: No products to display.
@@ -601,8 +663,27 @@ en:
601
663
  destroy_notice: Payment has been removed successfully
602
664
  refund_notice: Refund has been processed successfully.
603
665
 
666
+ localisations:
667
+ localisations: Localisations
668
+ back: Back
669
+ back_to_localisations: Back
670
+ localisations_of: Localisations of %{name}
671
+ product_information: Product Information
672
+ locales: Locales
673
+ choose_locale: Please choose a locale
674
+ save_localisation: Save Localisation
675
+ new_localisation: New Localisation
676
+ edit_localisation: Edit Localisation
677
+ localisation_created: Localisation created successfully
678
+ localisation_updated: Localisation updated successfully
679
+ localisation_destroyed: Localisation destroyed successfully
680
+ language: Language
681
+ no_localisations: No localisations to display.
682
+ delete_confirmation: Are you sure?
683
+
604
684
  navigation:
605
685
  admin_primary:
686
+ customers: Customers
606
687
  orders: Orders
607
688
  products: Products
608
689
  product_categories: Product Categories