spree 0.10.1 → 0.10.2

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 (37) hide show
  1. data/CHANGELOG +17 -0
  2. data/app/controllers/admin/images_controller.rb +26 -35
  3. data/app/controllers/checkouts_controller.rb +3 -1
  4. data/app/controllers/spree/base_controller.rb +4 -4
  5. data/app/helpers/checkouts_helper.rb +1 -0
  6. data/app/models/address.rb +1 -0
  7. data/app/models/checkout.rb +2 -1
  8. data/app/models/coupon.rb +0 -1
  9. data/app/models/product.rb +8 -1
  10. data/app/models/variant.rb +1 -1
  11. data/config/database.yml +27 -43
  12. data/config/environment.rb +1 -1
  13. data/config/environments/test.rb +2 -1
  14. data/config/initializers/workarounds_for_ruby19.rb +25 -0
  15. data/config/locales/vn.yml +36 -36
  16. data/db/migrate/20090923100315_add_count_on_hand_to_variants_and_products.rb +6 -0
  17. data/db/schema.rb +2 -1
  18. data/lib/spree.rb +1 -1
  19. data/lib/tasks/rspec.rake +0 -1
  20. data/public/javascripts/admin/checkouts/edit.js +17 -0
  21. data/public/stylesheets/admin/admin-tables.css +4 -0
  22. data/test/unit/checkout_test.rb +12 -0
  23. data/test/unit/creditcard_test.rb +4 -2
  24. data/vendor/extensions/overview_dashboard/app/controllers/admin/overview_controller.rb +12 -2
  25. data/vendor/extensions/overview_dashboard/public/javascripts/dashboard.js +2 -2
  26. data/vendor/extensions/payment_gateway/app/models/gateway/authorize_net_cim.rb +5 -3
  27. data/vendor/extensions/payment_gateway/lib/spree/payment_gateway.rb +1 -5
  28. data/vendor/extensions/theme_default/app/views/admin/product_groups/edit.html.erb +1 -1
  29. metadata +3 -11
  30. data/public/stylesheets/admin/edit-checkouts.css +0 -57
  31. data/public/stylesheets/bundle_admin.css +0 -484
  32. data/public/stylesheets/bundle_calendar_date_select.css +0 -137
  33. data/public/stylesheets/bundle_compiled.css +0 -459
  34. data/public/stylesheets/compiled/ie.css +0 -60
  35. data/public/stylesheets/compiled/print.css +0 -62
  36. data/public/stylesheets/compiled/screen.css +0 -1490
  37. data/vendor/extensions/theme_default/app/stylesheets/screen.css +0 -11
data/CHANGELOG CHANGED
@@ -1,3 +1,20 @@
1
+ == 0.10.2
2
+
3
+ * # - 1215 Update Vietnamese translation
4
+ * # - 1230 Product#recalculate_count_on_hand migration from 0.9.4 to 0.10.0
5
+ * # - 1234 Billing address not accepting UK state
6
+ * # - 1238 Should not create empty order in db for orders/new action
7
+ * # - 1240 Add test-unit to gem dependency
8
+ * # - 1249 Authorize.net CIM does not work with live account
9
+ * # - 1251 Skip confirmation step if payment profiles are not available
10
+ * # - 1253 Table variants doesn't exist when bootstrapping with extensions installed that modify the Variant model
11
+ * # - 1255 Products groups edit error
12
+ * # - 1257 Coupons do not recalculate credit after redeemed
13
+ * # - 1261 Type Error when Checkout
14
+ * # - 1263 Submitting a coupon during the checkout confirmation fails
15
+ * # - 1269 Orders Overview page breaks when there are no orders in the last 7 days
16
+ * # - 1276 Product Images not updating properly
17
+
1
18
  == 0.10.1
2
19
 
3
20
  * # - 1209 Ruby Gems Warning (reverted this fix - RubyGems 1.3.6 is now required again)
@@ -1,58 +1,49 @@
1
1
  class Admin::ImagesController < Admin::BaseController
2
2
  resource_controller
3
3
  before_filter :load_data
4
-
5
- new_action.response do |wants|
4
+
5
+ new_action.response do |wants|
6
6
  wants.html {render :action => :new, :layout => false}
7
7
  end
8
8
 
9
- create.response do |wants|
10
- wants.html {redirect_to admin_product_images_url(@product)}
9
+ create.response do |wants|
10
+ wants.html {redirect_to admin_product_images_url(@product)}
11
11
  end
12
12
 
13
- update.response do |wants|
14
- wants.html {redirect_to admin_product_images_url(@product)}
13
+ update.response do |wants|
14
+ wants.html {redirect_to admin_product_images_url(@product)}
15
15
  end
16
-
17
- create.before :create_before
18
- update.before :update_before
19
- destroy.before :destroy_before
16
+
17
+ create.before :set_viewable
18
+ update.before :set_viewable
19
+ destroy.before :destroy_before
20
20
 
21
21
  destroy.response do |wants|
22
22
  wants.html do
23
- render :text => ""
23
+ render :text => ""
24
24
  end
25
25
  end
26
26
 
27
27
  private
28
28
 
29
29
  def load_data
30
- @product = Product.find_by_permalink(params[:product_id])
31
- @variants = @product.variants.collect do |variant|
32
- [variant.options_text, variant.id ]
33
- end
34
- @variants.insert(0, [I18n.t("all"), "All"])
30
+ @product = Product.find_by_permalink(params[:product_id])
31
+ @variants = @product.variants.collect do |variant|
32
+ [variant.options_text, variant.id ]
33
+ end
34
+ @variants.insert(0, [I18n.t("all"), "All"])
35
35
  end
36
36
 
37
- def create_before
38
- if params[:image].has_key? :viewable_id
39
- if params[:image][:viewable_id] == "All"
40
- object.viewable_type = 'Product'
41
- object.viewable_id = @product.id
42
- else
43
- object.viewable_type = 'Variant'
44
- object.viewable_id = params[:image][:viewable_id]
45
- end
46
- else
47
- object.viewable_type = 'Product'
48
- object.viewable_id = @product.id
49
- end
50
- end
51
-
52
- def update_before
53
- if params[:image][:viewable_id] == "All"
54
- object.viewable_type = 'Product'
55
- object.viewable_id = @product.id
37
+ def set_viewable
38
+ if params[:image].has_key? :viewable_id
39
+ if params[:image][:viewable_id] == "All"
40
+ object.viewable = @product
41
+ else
42
+ object.viewable_type = 'Variant'
43
+ object.viewable_id = params[:image][:viewable_id]
44
+ end
45
+ else
46
+ object.viewable = @product
56
47
  end
57
48
  end
58
49
 
@@ -81,7 +81,9 @@ class CheckoutsController < Spree::BaseController
81
81
  if params[:payment_source].present? && source_params = params.delete(:payment_source)[params[:checkout][:payments_attributes].first[:payment_method_id].underscore]
82
82
  params[:checkout][:payments_attributes].first[:source_attributes] = source_params
83
83
  end
84
- params[:checkout][:payments_attributes].first[:amount] = @order.total
84
+ if (params[:checkout][:payments_attributes])
85
+ params[:checkout][:payments_attributes].first[:amount] = @order.total
86
+ end
85
87
  end
86
88
  params[:checkout]
87
89
  end
@@ -21,12 +21,12 @@ class Spree::BaseController < ActionController::Base
21
21
  # retrieve the order_id from the session and then load from the database (or return a new order if no
22
22
  # such id exists in the session)
23
23
  def find_order
24
- unless session[:order_id].blank?
24
+ if !session[:order_id].blank?
25
25
  @order = Order.find_or_create_by_id(session[:order_id])
26
+ elsif request.get?
27
+ @order = Order.new(:user => current_user)
26
28
  else
27
- @order = Order.new
28
- @order.user = current_user
29
- @order.save
29
+ @order = Order.create(:user => current_user)
30
30
  end
31
31
  session[:order_id] = @order.id
32
32
  session[:order_token] = @order.token
@@ -2,6 +2,7 @@ module CheckoutsHelper
2
2
 
3
3
  def checkout_progress
4
4
  steps = Checkout.state_names.reject { |n| n == "complete" }.map do |state|
5
+ next if state == "confirm" and not Gateway.current.payment_profiles_supported?
5
6
  text = t("checkout_steps.#{state}")
6
7
 
7
8
  css_classes = []
@@ -27,6 +27,7 @@ class Address < ActiveRecord::Base
27
27
  end
28
28
 
29
29
  def state_name_validate
30
+ country = country_id ? Country.find(country_id) : nil
30
31
  return if country.blank? || country.states.empty?
31
32
  if state_name.blank? || country.states.name_or_abbr_equals(state_name).empty?
32
33
  errors.add(:state, :invalid)
@@ -62,8 +62,9 @@ class Checkout < ActiveRecord::Base
62
62
  event :next do
63
63
  transition :to => 'delivery', :from => 'address'
64
64
  transition :to => 'payment', :from => 'delivery'
65
- transition :to => 'confirm', :from => 'payment'
65
+ transition :to => 'confirm', :from => 'payment', :if => Proc.new { Gateway.current and Gateway.current.payment_profiles_supported? }
66
66
  transition :to => 'complete', :from => 'confirm'
67
+ transition :to => 'complete', :from => 'payment'
67
68
  end
68
69
  end
69
70
  def self.state_names
@@ -21,7 +21,6 @@ class Coupon < ActiveRecord::Base
21
21
  order.save
22
22
  coupon_credits.create({
23
23
  :order => order,
24
- :amount => amount,
25
24
  :description => "#{I18n.t(:coupon)} (#{code})"
26
25
  })
27
26
  end
@@ -34,7 +34,7 @@ class Product < ActiveRecord::Base
34
34
  :conditions => ["variants.is_master = ? AND variants.deleted_at IS NULL", true]
35
35
 
36
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
+ delegate_belongs_to :master, :cost_price if Variant.table_exists? && Variant.column_names.include?("cost_price")
38
38
 
39
39
  after_create :set_master_variant_defaults
40
40
  after_create :add_properties_and_option_types_from_prototype
@@ -188,6 +188,13 @@ class Product < ActiveRecord::Base
188
188
  deleted_at
189
189
  end
190
190
 
191
+ # split variants list into hash which shows mapping of opt value onto matching variants
192
+ # eg categorise_variants_from_option(color) => {"red" -> [...], "blue" -> [...]}
193
+ def categorise_variants_from_option(opt_type)
194
+ return {} unless option_types.include?(opt_type)
195
+ variants.active.group_by {|v| v.option_values.detect {|o| o.option_type == opt_type} }
196
+ end
197
+
191
198
  private
192
199
 
193
200
  def recalculate_count_on_hand
@@ -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 if Variant.column_names.include? "cost_price"
12
+ validates_numericality_of :cost_price, :allow_nil => true if Variant.table_exists? && Variant.column_names.include?("cost_price")
13
13
 
14
14
  before_save :touch_product
15
15
 
@@ -1,57 +1,41 @@
1
- # Default database configuration
2
-
1
+ # gem install mysql -- --include=/usr/local/lib
2
+ # On Windows:
3
+ # There is no gem for Windows. Install mysql.so from RubyForApache.
4
+ # http://rubyforge.org/projects/rubyforapache
5
+ #
6
+ # And be sure to use new-style password hashing:
7
+ # http://dev.mysql.com/doc/refman/5.0/en/old-client.html
3
8
  development:
4
9
  adapter: mysql
5
- database: spree_dev
10
+ database: spree_development
6
11
  username: root
7
- password:
8
- host: localhost
9
-
10
- # development:
11
- # adapter: postgresql
12
- # database: spree_dev
13
- # username: spree
14
- # password: spree_dev
15
- # host: localhost
12
+ password:
13
+ host: localhost
16
14
 
17
15
  # development:
18
- # adapter: sqlite3
19
- # database: db/development.sqlite3
20
-
16
+ # adapter: postgresql
17
+ # database: spree_dev
18
+ # username: postgres
19
+ # password:
20
+ # host: localhost
21
+
22
+ # development:
23
+ # adapter: sqlite3
24
+ # database: db/development.sqlite3.db
25
+
26
+ # Warning: The database defined as 'test' will be erased and
27
+ # re-generated from your development database when you run 'rake'.
28
+ # Do not set this db to the same as development or production.
21
29
  test:
22
30
  adapter: mysql
23
31
  database: spree_test
24
32
  username: root
25
- password:
26
- host: localhost
27
-
28
- # test:
29
- # adapter: sqlite3
30
- # database: db/test.sqlite3
31
-
32
- # staging:
33
- # #adapter: sqlite3
34
- # #database: db/staging.sqlite3
35
- # adapter: mysql
36
- # database: spree_dev
37
- # username: spree
38
- # password: spree
39
- # host: localhost
40
-
41
- #test:
42
- # adapter: postgresql
43
- # database: spree_test
44
- # username: spree
45
- # password: spree_dev
46
- # host: localhost
47
-
48
- #test:
49
- # adapter: sqlite3
50
- # database: db/test.sqlite3
33
+ password:
34
+ host: localhost
51
35
 
52
36
  production:
53
37
  adapter: mysql
54
- database: spree
38
+ database: spree_development
55
39
  username: root
56
40
  password:
57
- host: localhost
41
+ host: localhost
@@ -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.1' unless defined? SPREE_GEM_VERSION
8
+ SPREE_GEM_VERSION = '0.10.2' 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')
@@ -22,4 +22,5 @@ config.action_mailer.delivery_method = :test
22
22
  config.action_controller.allow_forgery_protection = false
23
23
 
24
24
  config.gem "shoulda", :lib => "shoulda", :version => "2.10.2"
25
- config.gem "factory_girl", :lib => "factory_girl", :version => "1.2.3"
25
+ config.gem "factory_girl", :lib => "factory_girl", :version => "1.2.3"
26
+ config.gem 'test-unit', :lib => 'test/unit', :version => '~>2.0.5' if RUBY_VERSION.to_f >= 1.9
@@ -99,4 +99,29 @@ if RUBY_VERSION.to_f >= 1.9
99
99
  end
100
100
  end
101
101
 
102
+ module I18n
103
+ module Backend
104
+ class Simple
105
+ protected
106
+
107
+ def lookup(locale, key, scope = [])
108
+ return unless key
109
+ init_translations unless initialized?
110
+ keys = I18n.send(:normalize_translation_keys, locale, key, scope)
111
+ begin
112
+ keys.inject(translations) do |result, k|
113
+ if (x = result[k.to_sym]).nil?
114
+ return nil
115
+ else
116
+ x
117
+ end
118
+ end
119
+ rescue
120
+ return nil
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+
102
127
  end
@@ -24,12 +24,12 @@ vn:
24
24
  address1: Địa chỉ
25
25
  address2: "Địa chỉ (tiếp)"
26
26
  city: Thành phố
27
- country: "Country"
28
- first_name: "First Name"
29
- last_name: "Last Name"
27
+ country: "Quốc gia"
28
+ first_name: "Tên"
29
+ last_name: "Họ"
30
30
  phone: Điện thoại
31
- state: "State"
32
- zipcode: "Mã Zip"
31
+ state: "Bang"
32
+ zipcode: "Mã bưu điện"
33
33
  checkout:
34
34
  bill_address:
35
35
  address1: "Địa chỉ thanh toán"
@@ -38,7 +38,7 @@ vn:
38
38
  lastname: "Họ"
39
39
  phone: "Điện thoại"
40
40
  state: "Bang"
41
- zipcode: "Mã Zip"
41
+ zipcode: "Mã bưu điện"
42
42
  ship_address:
43
43
  address1: "Địa chỉ"
44
44
  city: "Thành phố"
@@ -82,14 +82,14 @@ vn:
82
82
  shipping_category: "Loại hình vận chuyển"
83
83
  tax_category: "Biểu thuế"
84
84
  product_group:
85
- name: "Name"
86
- product_count: "Product count"
87
- product_scopes: "Product scopes"
88
- products: "Products"
85
+ name: "Tên"
86
+ product_count: "Số lượng sản phẩm"
87
+ product_scopes: "Phạm vi sản phẩm"
88
+ products: "Sản phẩm"
89
89
  url: "URL"
90
90
  product_scope:
91
- arguments: "Arguments"
92
- description: "Description"
91
+ arguments: "Tham số"
92
+ description: "Chú thích"
93
93
  property:
94
94
  name: Tên
95
95
  presentation: Trình bày
@@ -213,7 +213,7 @@ vn:
213
213
  add_option_value: "Thêm giá trị của tùy chọn"
214
214
  add_product: "Thêm sản phẩm"
215
215
  add_product_properties: "Thêm đặc tính sản phẩm"
216
- add_scope: "Add a scope"
216
+ add_scope: "Thêm phạm vi"
217
217
  add_state: "Thêm bang"
218
218
  add_to_cart: "Mua hàng"
219
219
  add_zone: "Thêm vùng"
@@ -231,7 +231,7 @@ vn:
231
231
  allowed_ssl_in_production_mode: "SSL sẽ {{not}} được dùng trong sản xuất"
232
232
  already_registered: Đã đăng kí?
233
233
  alternative_phone: Điện thoại khác
234
- amount: Số lượng
234
+ amount: Giá trị
235
235
  analytics_trackers: Analytics Trackers
236
236
  are_you_sure: "Bạn có chắn chắn không?"
237
237
  are_you_sure_category: "Bạn có chắc bạn muốn xóa loại mặt hàng này không?"
@@ -243,7 +243,7 @@ vn:
243
243
  assign_taxons: "Ấn định đơn vị phân loại"
244
244
  authorization_failure: "Không được ủy quyền truy cập"
245
245
  authorized: Được ủy quyền
246
- available_on: "Có hàng vào"
246
+ available_on: "Có hàng vào ngày"
247
247
  available_taxons: "Đơn vị phân loại hiện có"
248
248
  awaiting_return: Đang đợi trả về
249
249
  back: Quay lại
@@ -251,7 +251,7 @@ vn:
251
251
  backordered: Đã đặt hàng trước
252
252
  backordering_is_allowed: "Đã đặt hàng trước {{not}} được cho phép"
253
253
  balance_due: "Tiền cần thanh toán"
254
- best_selling_products: "Sản phầm bán chạy nhất"
254
+ best_selling_products: "Sản phẩm bán chạy nhất"
255
255
  best_selling_taxons: "Đơn vị phân loại hàng bán chạy nhất"
256
256
  bill_address: "Địa chỉ thanh toán"
257
257
  billing: Thanh Toán
@@ -262,7 +262,7 @@ vn:
262
262
  cancel: Hủy
263
263
  canceled: Đã hủy
264
264
  cannot_create_returns: Không thể trả hàng vì đơn hàng chưa được gửi.
265
- capture: bắt
265
+ capture: Lấy tiền
266
266
  card_code: "Mã thẻ"
267
267
  card_details: "Thông tin thẻ"
268
268
  card_number: "Số thẻ"
@@ -281,12 +281,12 @@ vn:
281
281
  # keys correspond to Checkout state names:
282
282
  address: Địa chỉ
283
283
  complete: Hoàn tất
284
- confirm: Confirm
284
+ confirm: Xác nhận
285
285
  delivery: Vận chuyển
286
286
  payment: Thanh toán
287
287
  cheque: Séc
288
288
  city: Thành phố
289
- clone: Sao y
289
+ clone: Tạo bản sao
290
290
  code: Mã
291
291
  combine: Nhập vào
292
292
  comp_order: "Đơn hàng kép"
@@ -296,7 +296,7 @@ vn:
296
296
  configuration: Cấu hình
297
297
  configuration_options: "Tùy chọn cấu hình"
298
298
  configurations: Cấu hình
299
- configured: Configured
299
+ configured: Đã được cấu hình
300
300
  confirm: Xác nhận
301
301
  confirm_delete: "Xác nhận xóa"
302
302
  confirm_password: "Xác nhận mật khẩu"
@@ -330,7 +330,7 @@ vn:
330
330
  customer_details: "Thông tin khách hàng"
331
331
  customer_search: "Tìm kiếm khách hàng"
332
332
  date_created: Ngày tạo
333
- date_range: "Chuỗi ngày"
333
+ date_range: "Giới hạn ngày"
334
334
  debit: Nợ
335
335
  delete: Xóa
336
336
  depth: Sâu
@@ -345,7 +345,7 @@ vn:
345
345
  editing_option_types: "Sửa đổi Kiểu tùy chọn"
346
346
  editing_payment_method: Sửa đổi Phương thức Thanh toán
347
347
  editing_product: "Sửa đổi sản phẩm"
348
- editing_product_group: "Editing Product Group"
348
+ editing_product_group: "Sửa đổi Nhóm sản phẩm"
349
349
  editing_property: "Sửa đổi đặc tính"
350
350
  editing_prototype: "Sửa đổi nguyên mẫu"
351
351
  editing_shipping_category: "Sửa đổi loại chuyển phát"
@@ -377,7 +377,7 @@ vn:
377
377
  extensions: Gói mở rộng
378
378
  filename: Tên tệp tin
379
379
  final_confirmation: "Chứng thực cuối cùng"
380
- finalize: Finalize
380
+ finalize: Hoành thành
381
381
  finalized_payments: Thanh toán đã hoàn tất
382
382
  first_item: Món hàng đầu tiên giá
383
383
  first_name: "Tên"
@@ -428,9 +428,9 @@ vn:
428
428
  item: Món
429
429
  item_description: "Miêu tả món hàng"
430
430
  item_total: "Tổng số món"
431
- items: "Món"
431
+ items: "Số lượng"
432
432
  last_14_days: "14 ngày trước"
433
- last_5_orders: "5 đơn hàng cuối"
433
+ last_5_orders: "5 đơn hàng gần đây nhất"
434
434
  last_7_days: "7 ngày trước"
435
435
  last_month: "Tháng trước"
436
436
  last_name: "Họ"
@@ -532,7 +532,7 @@ vn:
532
532
  options: Tùy chọn
533
533
  or: hoặc
534
534
  ord_qty: "Số lượng"
535
- ord_total: "Tổng số"
535
+ ord_total: "Giá trị"
536
536
  order: Đơn hàng
537
537
  order_confirmation_note: ""
538
538
  order_date: "Ngày đặt hàng"
@@ -545,7 +545,7 @@ vn:
545
545
  order_processed_successfully: "Đơn đặt hàng của bạn đã được xử lý thành công"
546
546
  order_summary: Tóm tắt đơn đặt hàng
547
547
  order_sure_want_to: "Bạn có chắc bạn muốn {{event}} đơn hàng này?"
548
- order_total: "Tổng đơn hàng"
548
+ order_total: "Tổng giá sau thuế"
549
549
  order_total_message: "Tổng số tiền sẽ được rút từ thẻ của bạn là"
550
550
  order_updated: "Đơn hàng được cập nhật"
551
551
  orders: Đơn hàng
@@ -553,7 +553,7 @@ vn:
553
553
  out_of_stock: "Hết hàng"
554
554
  out_of_stock_products: "Sản phẩm đã hết hàng"
555
555
  over_paid: "Trả lố"
556
- overview: Tồng kết
556
+ overview: Tổng kết
557
557
  overview_welcome: "Chào mừng bạn đến với phần tổng quan, hiện không đủ thông tin để hiển thị Bảng điều khiển tổng quan.<br/><br/> Bảng điều khiển sẽ tự động hiện ra khi hệ thống đã thu thập đủ số liệu thông kê."
558
558
  page_only_viewable_when_logged_in: Trang này chỉ xem được sau khi đã đăng nhập
559
559
  page_only_viewable_when_logged_out: Trang này chỉ xem được sau khi đã đăng xuất
@@ -646,7 +646,7 @@ vn:
646
646
  sentence: tên hay từ khóa có chứa <em>%s</em>
647
647
  in_taxons:
648
648
  args:
649
- "taxon_names": "Tên Taxon"
649
+ "taxon_names": "Tên phân loại"
650
650
  description: "Tên đơn vị phân loại phải được tách ra với dấu phẩy hoặc chỗ trống (vd: adidas,shoes)"
651
651
  name: "Trong các đơn vị phân loại và tất cả đơn vị phân loại con"
652
652
  sentence: trong <em>%s</em> và tất cả hậu duệ của chúng
@@ -835,11 +835,11 @@ vn:
835
835
  state_setting_description: "Quản lý danh sách các bang và quận huyện của từng quốc gia."
836
836
  states: Bang
837
837
  status: Tình trạng
838
- stop: Tạm ngừng
838
+ stop: Kết thúc
839
839
  store: Cửa hàng
840
840
  street_address: "Địa chỉ"
841
841
  street_address_2: "Địa chỉ (tiếp)"
842
- subtotal: Tổng cộng
842
+ subtotal: Tổng giá trước thuế
843
843
  subtract: Trừ đi
844
844
  system: Hệ thống
845
845
  tax: Thuế
@@ -860,8 +860,8 @@ vn:
860
860
  taxonomy_tree_error: "Thay đồi theo yêu cầu không được chấp nhận và hệ cây đã quay trở về trạng thái như trước, xin hay thử lại lần nữa."
861
861
  taxonomy_tree_instruction: "* Nhấp chuột phải vào 1 phần tử con trong hệ cây để truy cập thực đơn để thêm, xóa và sắp xếp một phần tử con."
862
862
  taxons: Đơn vị phân loại
863
- test: "Test"
864
- test_mode: Test Mode
863
+ test: "Kiểm tra"
864
+ test_mode: Chế độ kiểm tra
865
865
  thank_you_for_your_order: "Cảm ơn đã mua hàng. Xin hãy in ra một bản của trang này để tiện cho việc chứng thực nếu cần."
866
866
  this_file_language: "tiếng Việt (VN)"
867
867
  this_month: "Tháng này"
@@ -869,7 +869,7 @@ vn:
869
869
  thumbnail: "Hình nhỏ"
870
870
  to_add_variants_you_must_first_define: "Để thêm biến thể, bạn phải định nghĩa trước"
871
871
  top_grossing_products: "Sản phẩm lãi nhiều nhất"
872
- total: Tổng
872
+ total: Giá trị
873
873
  tracking: Theo dõi
874
874
  transaction: Giao dịch
875
875
  transactions: Giao dịch
@@ -906,7 +906,7 @@ vn:
906
906
  vat: "VAT"
907
907
  version: Phiên bản
908
908
  view_shipping_options: "Xem các lựa chọn dịch vụ chuyển phát"
909
- void: Hết bảo hành
909
+ void: hiệu hóa
910
910
  website: Trang web
911
911
  weight: Khối lượng
912
912
  welcome_to_sample_store: "Chào mừng đến cửa hàng mẫu"
@@ -917,7 +917,7 @@ vn:
917
917
  year: "Năm"
918
918
  you_have_been_logged_out: "Bạn vừa đăng xuất."
919
919
  your_cart_is_empty: "Sọt hàng rỗng"
920
- zip: Zip
920
+ zip: Mã bưu điện
921
921
  zone: Vùng
922
922
  zone_based: "Dựa trên vùng"
923
923
  zone_setting_description: "Danh sách các quốc gia, bang hoặc vùng khác được dùng trong nhiều tính toán khác nhau."