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.
- data/CHANGELOG +17 -0
- data/app/controllers/admin/images_controller.rb +26 -35
- data/app/controllers/checkouts_controller.rb +3 -1
- data/app/controllers/spree/base_controller.rb +4 -4
- data/app/helpers/checkouts_helper.rb +1 -0
- data/app/models/address.rb +1 -0
- data/app/models/checkout.rb +2 -1
- data/app/models/coupon.rb +0 -1
- data/app/models/product.rb +8 -1
- data/app/models/variant.rb +1 -1
- data/config/database.yml +27 -43
- data/config/environment.rb +1 -1
- data/config/environments/test.rb +2 -1
- data/config/initializers/workarounds_for_ruby19.rb +25 -0
- data/config/locales/vn.yml +36 -36
- data/db/migrate/20090923100315_add_count_on_hand_to_variants_and_products.rb +6 -0
- data/db/schema.rb +2 -1
- data/lib/spree.rb +1 -1
- data/lib/tasks/rspec.rake +0 -1
- data/public/javascripts/admin/checkouts/edit.js +17 -0
- data/public/stylesheets/admin/admin-tables.css +4 -0
- data/test/unit/checkout_test.rb +12 -0
- data/test/unit/creditcard_test.rb +4 -2
- data/vendor/extensions/overview_dashboard/app/controllers/admin/overview_controller.rb +12 -2
- data/vendor/extensions/overview_dashboard/public/javascripts/dashboard.js +2 -2
- data/vendor/extensions/payment_gateway/app/models/gateway/authorize_net_cim.rb +5 -3
- data/vendor/extensions/payment_gateway/lib/spree/payment_gateway.rb +1 -5
- data/vendor/extensions/theme_default/app/views/admin/product_groups/edit.html.erb +1 -1
- metadata +3 -11
- data/public/stylesheets/admin/edit-checkouts.css +0 -57
- data/public/stylesheets/bundle_admin.css +0 -484
- data/public/stylesheets/bundle_calendar_date_select.css +0 -137
- data/public/stylesheets/bundle_compiled.css +0 -459
- data/public/stylesheets/compiled/ie.css +0 -60
- data/public/stylesheets/compiled/print.css +0 -62
- data/public/stylesheets/compiled/screen.css +0 -1490
- 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
|
-
|
4
|
+
|
5
|
+
new_action.response do |wants|
|
6
6
|
wants.html {render :action => :new, :layout => false}
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
create.response do |wants|
|
10
|
+
wants.html {redirect_to admin_product_images_url(@product)}
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
update.response do |wants|
|
14
|
+
wants.html {redirect_to admin_product_images_url(@product)}
|
15
15
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
23
|
+
render :text => ""
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
29
|
def load_data
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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]
|
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
|
-
|
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.
|
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
|
data/app/models/address.rb
CHANGED
@@ -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)
|
data/app/models/checkout.rb
CHANGED
@@ -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
|
data/app/models/coupon.rb
CHANGED
data/app/models/product.rb
CHANGED
@@ -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?
|
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
|
data/app/models/variant.rb
CHANGED
@@ -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?
|
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
|
|
data/config/database.yml
CHANGED
@@ -1,57 +1,41 @@
|
|
1
|
-
#
|
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:
|
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
|
-
#
|
19
|
-
#
|
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:
|
38
|
+
database: spree_development
|
55
39
|
username: root
|
56
40
|
password:
|
57
|
-
host: localhost
|
41
|
+
host: localhost
|
data/config/environment.rb
CHANGED
@@ -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.
|
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')
|
data/config/environments/test.rb
CHANGED
@@ -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
|
data/config/locales/vn.yml
CHANGED
@@ -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: "
|
28
|
-
first_name: "
|
29
|
-
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: "
|
32
|
-
zipcode: "Mã
|
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ã
|
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: "
|
86
|
-
product_count: "
|
87
|
-
product_scopes: "
|
88
|
-
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: "
|
92
|
-
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: "
|
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:
|
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
|
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:
|
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:
|
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:
|
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:
|
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: "
|
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: "
|
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:
|
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: "
|
431
|
+
items: "Số lượng"
|
432
432
|
last_14_days: "14 ngày trước"
|
433
|
-
last_5_orders: "5 đơn hàng
|
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: "
|
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
|
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:
|
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
|
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:
|
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
|
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: "
|
864
|
-
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:
|
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:
|
909
|
+
void: Vô 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:
|
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."
|