diff --git a/public/intl/messages/vi-VN.json b/public/intl/messages/vi-VN.json index 250f7446..dab46ca8 100644 --- a/public/intl/messages/vi-VN.json +++ b/public/intl/messages/vi-VN.json @@ -23,12 +23,6 @@ "value": "Thêm" } ], - "label.add-board": [ - { - "type": 0, - "value": "Thêm bảng" - } - ], "label.add-description": [ { "type": 0, @@ -59,16 +53,10 @@ "value": "Quản trị" } ], - "label.affiliate": [ - { - "type": 0, - "value": "Liên kết" - } - ], "label.after": [ { "type": 0, - "value": "Sau" + "value": "Sau đó" } ], "label.all": [ @@ -89,24 +77,6 @@ "value": "Phân tích" } ], - "label.apply": [ - { - "type": 0, - "value": "Áp dụng" - } - ], - "label.attribution": [ - { - "type": 0, - "value": "Phân bổ" - } - ], - "label.attribution-description": [ - { - "type": 0, - "value": "Xem cách người dùng tương tác với tiếp thị của bạn và điều gì thúc đẩy chuyển đổi." - } - ], "label.average": [ { "type": 0, @@ -116,19 +86,13 @@ "label.back": [ { "type": 0, - "value": "Quay về" + "value": "Quay lại" } ], "label.before": [ { "type": 0, - "value": "Trước" - } - ], - "label.boards": [ - { - "type": 0, - "value": "Bảng" + "value": "Trước đó" } ], "label.bounce-rate": [ @@ -152,19 +116,13 @@ "label.browsers": [ { "type": 0, - "value": "Trình duyệt" - } - ], - "label.campaigns": [ - { - "type": 0, - "value": "Chiến dịch" + "value": "Các trình duyệt" } ], "label.cancel": [ { "type": 0, - "value": "Huỷ bỏ" + "value": "Hủy bỏ" } ], "label.change-password": [ @@ -173,16 +131,10 @@ "value": "Đổi mật khẩu" } ], - "label.channels": [ - { - "type": 0, - "value": "Kênh" - } - ], "label.cities": [ { "type": 0, - "value": "Thành phố" + "value": "Các thành phố" } ], "label.city": [ @@ -197,24 +149,12 @@ "value": "Xóa tất cả" } ], - "label.cohort": [ - { - "type": 0, - "value": "Nhóm người dùng" - } - ], "label.compare": [ { "type": 0, "value": "So sánh" } ], - "label.compare-dates": [ - { - "type": 0, - "value": "So sánh ngày" - } - ], "label.confirm": [ { "type": 0, @@ -233,36 +173,12 @@ "value": "Chứa" } ], - "label.content": [ - { - "type": 0, - "value": "Nội dung" - } - ], "label.continue": [ { "type": 0, "value": "Tiếp tục" } ], - "label.conversion": [ - { - "type": 0, - "value": "Chuyển đổi" - } - ], - "label.conversion-rate": [ - { - "type": 0, - "value": "Tỷ lệ chuyển đổi" - } - ], - "label.conversion-step": [ - { - "type": 0, - "value": "Bước chuyển đổi" - } - ], "label.count": [ { "type": 0, @@ -272,7 +188,7 @@ "label.countries": [ { "type": 0, - "value": "Quốc gia" + "value": "Các quốc gia" } ], "label.country": [ @@ -314,13 +230,7 @@ "label.created-by": [ { "type": 0, - "value": "Tạo bởi" - } - ], - "label.currency": [ - { - "type": 0, - "value": "Tiền tệ" + "value": "Được tạo bởi" } ], "label.current": [ @@ -338,7 +248,7 @@ "label.custom-range": [ { "type": 0, - "value": "Phạm vi ngày tuỳ chọn" + "value": "Phạm vi tùy chỉnh" } ], "label.dashboard": [ @@ -380,7 +290,7 @@ "label.delete": [ { "type": 0, - "value": "Xoá" + "value": "Xóa" } ], "label.delete-report": [ @@ -416,7 +326,7 @@ "label.desktop": [ { "type": 0, - "value": "Máy bàn" + "value": "Máy tính để bàn" } ], "label.details": [ @@ -434,25 +344,13 @@ "label.devices": [ { "type": 0, - "value": "Thiết bị" - } - ], - "label.direct": [ - { - "type": 0, - "value": "Trực tiếp" + "value": "Các thiết bị" } ], "label.dismiss": [ { "type": 0, - "value": "Loại trừ" - } - ], - "label.distinct-id": [ - { - "type": 0, - "value": "ID riêng biệt" + "value": "Bỏ qua" } ], "label.does-not-contain": [ @@ -461,18 +359,6 @@ "value": "Không chứa" } ], - "label.does-not-include": [ - { - "type": 0, - "value": "Không bao gồm" - } - ], - "label.doest-not-exist": [ - { - "type": 0, - "value": "Không tồn tại" - } - ], "label.domain": [ { "type": 0, @@ -482,7 +368,7 @@ "label.dropoff": [ { "type": 0, - "value": "Rời bỏ" + "value": "Tỷ lệ bỏ qua" } ], "label.edit": [ @@ -503,16 +389,10 @@ "value": "Chỉnh sửa thành viên" } ], - "label.email": [ - { - "type": 0, - "value": "Email" - } - ], "label.enable-share-url": [ { "type": 0, - "value": "Bật khả năng chia sẻ URL" + "value": "Bật chia sẻ URL" } ], "label.end-step": [ @@ -524,7 +404,7 @@ "label.entry": [ { "type": 0, - "value": "URL vào" + "value": "URL truy cập" } ], "label.event": [ @@ -539,22 +419,10 @@ "value": "Dữ liệu sự kiện" } ], - "label.event-name": [ - { - "type": 0, - "value": "Tên sự kiện" - } - ], "label.events": [ { "type": 0, - "value": "Sự kiện" - } - ], - "label.exists": [ - { - "type": 0, - "value": "Tồn tại" + "value": "Các sự kiện" } ], "label.exit": [ @@ -584,19 +452,19 @@ "label.filter": [ { "type": 0, - "value": "Bộ lọc" + "value": "Lọc" } ], "label.filter-combined": [ { "type": 0, - "value": "Kết hợp" + "value": "Kết hợp lọc" } ], "label.filter-raw": [ { "type": 0, - "value": "Gốc" + "value": "Lọc thô" } ], "label.filters": [ @@ -605,16 +473,10 @@ "value": "Bộ lọc" } ], - "label.first-click": [ - { - "type": 0, - "value": "Nhấp đầu tiên" - } - ], "label.first-seen": [ { "type": 0, - "value": "Lần đầu thấy" + "value": "Lần đầu tiên nhìn thấy" } ], "label.funnel": [ @@ -626,13 +488,7 @@ "label.funnel-description": [ { "type": 0, - "value": "Hiểu tỷ lệ chuyển đổi và rời bỏ của người dùng." - } - ], - "label.funnels": [ - { - "type": 0, - "value": "Phễu" + "value": "Tìm hiểu tỷ lệ chuyển đổi và bỏ qua của người dùng." } ], "label.goal": [ @@ -644,13 +500,13 @@ "label.goals": [ { "type": 0, - "value": "Mục tiêu" + "value": "Các mục tiêu" } ], "label.goals-description": [ { "type": 0, - "value": "Theo dõi mục tiêu lượt xem trang và sự kiện." + "value": "Theo dõi các mục tiêu của bạn cho lượt xem trang và sự kiện." } ], "label.greater-than": [ @@ -665,40 +521,28 @@ "value": "Lớn hơn hoặc bằng" } ], - "label.grouped": [ + "label.host": [ { "type": 0, - "value": "Nhóm lại" + "value": "Máy chủ" } ], - "label.hostname": [ + "label.hosts": [ { "type": 0, - "value": "Tên máy chủ" - } - ], - "label.includes": [ - { - "type": 0, - "value": "Bao gồm" - } - ], - "label.insight": [ - { - "type": 0, - "value": "Thông tin chi tiết" + "value": "Các máy chủ" } ], "label.insights": [ { "type": 0, - "value": "Insights" + "value": "Thông tin chi tiết" } ], "label.insights-description": [ { "type": 0, - "value": "Dive deeper into your data by using segments and filters." + "value": "Tìm hiểu sâu hơn về dữ liệu của bạn bằng cách sử dụng phân đoạn và bộ lọc." } ], "label.is": [ @@ -707,22 +551,16 @@ "value": "Là" } ], - "label.is-false": [ - { - "type": 0, - "value": "Sai" - } - ], "label.is-not": [ { "type": 0, - "value": "Không là" + "value": "Không phải là" } ], "label.is-not-set": [ { "type": 0, - "value": "Chưa đặt" + "value": "Chưa được đặt" } ], "label.is-set": [ @@ -731,12 +569,6 @@ "value": "Đã đặt" } ], - "label.is-true": [ - { - "type": 0, - "value": "Đúng" - } - ], "label.join": [ { "type": 0, @@ -758,13 +590,7 @@ "label.journey-description": [ { "type": 0, - "value": "Hiểu cách người dùng di chuyển qua website của bạn." - } - ], - "label.journeys": [ - { - "type": 0, - "value": "Hành trình" + "value": "Hiểu cách người dùng điều hướng qua website của bạn." } ], "label.language": [ @@ -776,19 +602,13 @@ "label.languages": [ { "type": 0, - "value": "Ngôn ngữ" + "value": "Các ngôn ngữ" } ], "label.laptop": [ { "type": 0, - "value": "Laptop" - } - ], - "label.last-click": [ - { - "type": 0, - "value": "Nhấp cuối cùng" + "value": "Máy tính xách tay" } ], "label.last-days": [ @@ -824,13 +644,13 @@ "label.last-seen": [ { "type": 0, - "value": "Lần cuối thấy" + "value": "Lần cuối cùng nhìn thấy" } ], "label.leave": [ { "type": 0, - "value": "Rời đi" + "value": "Rời khỏi" } ], "label.leave-team": [ @@ -851,12 +671,6 @@ "value": "Nhỏ hơn hoặc bằng" } ], - "label.links": [ - { - "type": 0, - "value": "Liên kết" - } - ], "label.login": [ { "type": 0, @@ -878,7 +692,7 @@ "label.manager": [ { "type": 0, - "value": "Quản lý viên" + "value": "Quản lý" } ], "label.max": [ @@ -887,18 +701,6 @@ "value": "Tối đa" } ], - "label.maximize": [ - { - "type": 0, - "value": "Mở rộng" - } - ], - "label.medium": [ - { - "type": 0, - "value": "Trung bình" - } - ], "label.member": [ { "type": 0, @@ -923,12 +725,6 @@ "value": "Di động" } ], - "label.model": [ - { - "type": 0, - "value": "Mô hình" - } - ], "label.more": [ { "type": 0, @@ -944,7 +740,7 @@ "label.my-websites": [ { "type": 0, - "value": "Website của tôi" + "value": "Các website của tôi" } ], "label.name": [ @@ -962,7 +758,7 @@ "label.none": [ { "type": 0, - "value": "Không có" + "value": "Không" } ], "label.number-of-records": [ @@ -981,7 +777,7 @@ "value": [ { "type": 0, - "value": "record" + "value": "bản ghi" } ] }, @@ -989,7 +785,7 @@ "value": [ { "type": 0, - "value": "records" + "value": "bản ghi" } ] } @@ -1005,52 +801,16 @@ "value": "OK" } ], - "label.online": [ - { - "type": 0, - "value": "Online" - } - ], - "label.organic-search": [ - { - "type": 0, - "value": "Tìm kiếm tự nhiên" - } - ], - "label.organic-shopping": [ - { - "type": 0, - "value": "Mua sắm tự nhiên" - } - ], - "label.organic-social": [ - { - "type": 0, - "value": "Mạng xã hội tự nhiên" - } - ], - "label.organic-video": [ - { - "type": 0, - "value": "Video tự nhiên" - } - ], "label.os": [ { "type": 0, - "value": "OS" - } - ], - "label.other": [ - { - "type": 0, - "value": "Khác" + "value": "Hệ điều hành" } ], "label.overview": [ { "type": 0, - "value": "Overview" + "value": "Tổng quan" } ], "label.owner": [ @@ -1059,16 +819,10 @@ "value": "Chủ sở hữu" } ], - "label.page": [ - { - "type": 0, - "value": "Trang" - } - ], "label.page-of": [ { "type": 0, - "value": "Page " + "value": "Trang " }, { "type": 1, @@ -1076,7 +830,7 @@ }, { "type": 0, - "value": " of " + "value": " trên " }, { "type": 1, @@ -1086,49 +840,19 @@ "label.page-views": [ { "type": 0, - "value": "Lượt xem" + "value": "Lượt xem trang" } ], "label.pageTitle": [ { "type": 0, - "value": "Page title" + "value": "Tiêu đề trang" } ], "label.pages": [ { "type": 0, - "value": "Trang" - } - ], - "label.paid-ads": [ - { - "type": 0, - "value": "Quảng cáo trả phí" - } - ], - "label.paid-search": [ - { - "type": 0, - "value": "Tìm kiếm trả phí" - } - ], - "label.paid-shopping": [ - { - "type": 0, - "value": "Mua sắm trả phí" - } - ], - "label.paid-social": [ - { - "type": 0, - "value": "Mạng xã hội trả phí" - } - ], - "label.paid-video": [ - { - "type": 0, - "value": "Video trả phí" + "value": "Các trang" } ], "label.password": [ @@ -1149,16 +873,10 @@ "value": "Các đường dẫn" } ], - "label.pixels": [ - { - "type": 0, - "value": "Pixel" - } - ], "label.powered-by": [ { "type": 0, - "value": "Bản quyền thuộc về " + "value": "Được cung cấp bởi " }, { "type": 1, @@ -1168,13 +886,13 @@ "label.previous": [ { "type": 0, - "value": "Trước đó" + "value": "Trước" } ], "label.previous-period": [ { "type": 0, - "value": "Giai đoạn trước" + "value": "Kỳ trước" } ], "label.previous-year": [ @@ -1204,19 +922,19 @@ "label.queries": [ { "type": 0, - "value": "Queries" + "value": "Truy vấn" } ], "label.query": [ { "type": 0, - "value": "Query" + "value": "Truy vấn" } ], "label.query-parameters": [ { "type": 0, - "value": "Query parameters" + "value": "Tham số truy vấn" } ], "label.realtime": [ @@ -1225,22 +943,16 @@ "value": "Thời gian thực" } ], - "label.referral": [ - { - "type": 0, - "value": "Giới thiệu" - } - ], "label.referrer": [ { "type": 0, - "value": "Referrer" + "value": "Nguồn giới thiệu" } ], "label.referrers": [ { "type": 0, - "value": "Liên kết giới thiệu" + "value": "Các nguồn giới thiệu" } ], "label.refresh": [ @@ -1252,43 +964,37 @@ "label.regenerate": [ { "type": 0, - "value": "Regenerate" + "value": "Tạo lại" } ], "label.region": [ { "type": 0, - "value": "Region" + "value": "Vùng" } ], "label.regions": [ { "type": 0, - "value": "Regions" - } - ], - "label.remaining": [ - { - "type": 0, - "value": "Còn lại" + "value": "Các vùng" } ], "label.remove": [ { "type": 0, - "value": "Remove" + "value": "Xóa" } ], "label.remove-member": [ { "type": 0, - "value": "Remove member" + "value": "Xóa thành viên" } ], "label.reports": [ { "type": 0, - "value": "Reports" + "value": "Báo cáo" } ], "label.required": [ @@ -1300,25 +1006,25 @@ "label.reset": [ { "type": 0, - "value": "Tái thiết lập" + "value": "Đặt lại" } ], "label.reset-website": [ { "type": 0, - "value": "Tái thiết lập thống kê" + "value": "Đặt lại thống kê website" } ], "label.retention": [ { "type": 0, - "value": "Retention" + "value": "Tỷ lệ giữ chân" } ], "label.retention-description": [ { "type": 0, - "value": "Measure your website stickiness by tracking how often users return." + "value": "Đo lường mức độ gắn bó của website bằng cách theo dõi tần suất người dùng quay lại." } ], "label.revenue": [ @@ -1330,19 +1036,25 @@ "label.revenue-description": [ { "type": 0, - "value": "Xem doanh thu của bạn theo thời gian." + "value": "Xem xét doanh thu của bạn theo thời gian." + } + ], + "label.revenue-property": [ + { + "type": 0, + "value": "Thuộc tính doanh thu" } ], "label.role": [ { "type": 0, - "value": "Role" + "value": "Vai trò" } ], "label.run-query": [ { "type": 0, - "value": "Run query" + "value": "Chạy truy vấn" } ], "label.save": [ @@ -1354,43 +1066,37 @@ "label.screens": [ { "type": 0, - "value": "Screens" + "value": "Màn hình" } ], "label.search": [ { "type": 0, - "value": "Search" + "value": "Tìm kiếm" } ], "label.select": [ { "type": 0, - "value": "Select" + "value": "Chọn" } ], "label.select-date": [ { "type": 0, - "value": "Select date" - } - ], - "label.select-filter": [ - { - "type": 0, - "value": "Chọn bộ lọc" + "value": "Chọn ngày" } ], "label.select-role": [ { "type": 0, - "value": "Select role" + "value": "Chọn vai trò" } ], "label.select-website": [ { "type": 0, - "value": "Select website" + "value": "Chọn website" } ], "label.session": [ @@ -1399,16 +1105,10 @@ "value": "Phiên" } ], - "label.session-data": [ - { - "type": 0, - "value": "Dữ liệu phiên" - } - ], "label.sessions": [ { "type": 0, - "value": "Sessions" + "value": "Các phiên" } ], "label.settings": [ @@ -1417,12 +1117,6 @@ "value": "Cài đặt" } ], - "label.share": [ - { - "type": 0, - "value": "Chia sẻ" - } - ], "label.share-url": [ { "type": 0, @@ -1432,37 +1126,25 @@ "label.single-day": [ { "type": 0, - "value": "Trong ngày" - } - ], - "label.sms": [ - { - "type": 0, - "value": "SMS" - } - ], - "label.sources": [ - { - "type": 0, - "value": "Nguồn" + "value": "Một ngày" } ], "label.start-step": [ { "type": 0, - "value": "Start Step" + "value": "Bước bắt đầu" } ], "label.steps": [ { "type": 0, - "value": "Steps" + "value": "Các bước" } ], "label.sum": [ { "type": 0, - "value": "Sum" + "value": "Tổng" } ], "label.tablet": [ @@ -1471,18 +1153,6 @@ "value": "Máy tính bảng" } ], - "label.tag": [ - { - "type": 0, - "value": "Thẻ" - } - ], - "label.tags": [ - { - "type": 0, - "value": "Các thẻ" - } - ], "label.team": [ { "type": 0, @@ -1516,43 +1186,31 @@ "label.team-owner": [ { "type": 0, - "value": "Chủ nhóm" - } - ], - "label.team-settings": [ - { - "type": 0, - "value": "Cài đặt nhóm" + "value": "Chủ sở hữu nhóm" } ], "label.team-view-only": [ { "type": 0, - "value": "Team view only" + "value": "Chỉ xem nhóm" } ], "label.team-websites": [ { "type": 0, - "value": "Team websites" + "value": "Các website của nhóm" } ], "label.teams": [ { "type": 0, - "value": "Teams" - } - ], - "label.terms": [ - { - "type": 0, - "value": "Điều khoản" + "value": "Các nhóm" } ], "label.theme": [ { "type": 0, - "value": "Giao diện" + "value": "Chủ đề" } ], "label.this-month": [ @@ -1582,7 +1240,7 @@ "label.title": [ { "type": 0, - "value": "Title" + "value": "Tiêu đề" } ], "label.today": [ @@ -1600,13 +1258,13 @@ "label.total": [ { "type": 0, - "value": "Total" + "value": "Tổng" } ], "label.total-records": [ { "type": 0, - "value": "Total records" + "value": "Tổng số bản ghi" } ], "label.tracking-code": [ @@ -1618,49 +1276,49 @@ "label.transactions": [ { "type": 0, - "value": "Transactions" + "value": "Giao dịch" } ], "label.transfer": [ { "type": 0, - "value": "Transfer" + "value": "Chuyển giao" } ], "label.transfer-website": [ { "type": 0, - "value": "Transfer website" + "value": "Chuyển giao website" } ], "label.true": [ { "type": 0, - "value": "True" + "value": "Đúng" } ], "label.type": [ { "type": 0, - "value": "Type" + "value": "Loại" } ], "label.unique": [ { "type": 0, - "value": "Unique" + "value": "Duy nhất" } ], "label.unique-visitors": [ { "type": 0, - "value": "Khách truy cập một lần" + "value": "Khách truy cập duy nhất" } ], "label.uniqueCustomers": [ { "type": 0, - "value": "Unique Customers" + "value": "Khách hàng duy nhất" } ], "label.unknown": [ @@ -1672,19 +1330,37 @@ "label.untitled": [ { "type": 0, - "value": "Untitled" + "value": "Không có tiêu đề" } ], "label.update": [ { "type": 0, - "value": "Update" + "value": "Cập nhật" + } + ], + "label.url": [ + { + "type": 0, + "value": "URL" + } + ], + "label.urls": [ + { + "type": 0, + "value": "Các URL" } ], "label.user": [ { "type": 0, - "value": "User" + "value": "Người dùng" + } + ], + "label.user-property": [ + { + "type": 0, + "value": "Thuộc tính người dùng" } ], "label.username": [ @@ -1696,7 +1372,7 @@ "label.users": [ { "type": 0, - "value": "Users" + "value": "Người dùng" } ], "label.utm": [ @@ -1708,19 +1384,19 @@ "label.utm-description": [ { "type": 0, - "value": "Track your campaigns through UTM parameters." + "value": "Theo dõi các chiến dịch của bạn thông qua các tham số UTM." } ], "label.value": [ { "type": 0, - "value": "Value" + "value": "Giá trị" } ], "label.view": [ { "type": 0, - "value": "View" + "value": "Xem" } ], "label.view-details": [ @@ -1732,37 +1408,37 @@ "label.view-only": [ { "type": 0, - "value": "View only" + "value": "Chỉ xem" } ], "label.views": [ { "type": 0, - "value": "Xem" + "value": "Lượt xem" } ], "label.views-per-visit": [ { "type": 0, - "value": "Views per visit" + "value": "Lượt xem trên mỗi lượt truy cập" } ], "label.visit-duration": [ { "type": 0, - "value": "Thời gian truy cập trung bình" + "value": "Thời lượng truy cập" } ], "label.visitors": [ { "type": 0, - "value": "Khách" + "value": "Khách truy cập" } ], "label.visits": [ { "type": 0, - "value": "Visits" + "value": "Lượt truy cập" } ], "label.website": [ @@ -1774,31 +1450,31 @@ "label.website-id": [ { "type": 0, - "value": "Website ID" + "value": "ID website" } ], "label.websites": [ { "type": 0, - "value": "Websites" + "value": "Các website" } ], "label.window": [ { "type": 0, - "value": "Window" + "value": "Cửa sổ" } ], "label.yesterday": [ { "type": 0, - "value": "Yesterday" + "value": "Hôm qua" } ], "message.action-confirmation": [ { "type": 0, - "value": "Type " + "value": "Nhập " }, { "type": 1, @@ -1806,7 +1482,7 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " vào ô bên dưới để xác nhận." } ], "message.active-users": [ @@ -1816,7 +1492,7 @@ }, { "type": 0, - "value": " hiện tại " + "value": " " }, { "offset": 0, @@ -1825,7 +1501,7 @@ "value": [ { "type": 0, - "value": "một" + "value": "người dùng" } ] }, @@ -1833,7 +1509,7 @@ "value": [ { "type": 0, - "value": "trên" + "value": "người dùng" } ] } @@ -1841,24 +1517,22 @@ "pluralType": "cardinal", "type": 6, "value": "x" - } - ], - "message.bad-request": [ + }, { "type": 0, - "value": "Bad request" + "value": " đang hoạt động" } ], "message.collected-data": [ { "type": 0, - "value": "Collected data" + "value": "Dữ liệu đã thu thập" } ], "message.confirm-delete": [ { "type": 0, - "value": "Bạn có chắc chắn muốn xoá " + "value": "Bạn có chắc chắn muốn xóa " }, { "type": 1, @@ -1872,7 +1546,7 @@ "message.confirm-leave": [ { "type": 0, - "value": "Are you sure you want to leave " + "value": "Bạn có chắc chắn muốn rời " }, { "type": 1, @@ -1886,7 +1560,7 @@ "message.confirm-remove": [ { "type": 0, - "value": "Are you sure you want to remove " + "value": "Bạn có chắc chắn muốn xóa " }, { "type": 1, @@ -1900,7 +1574,7 @@ "message.confirm-reset": [ { "type": 0, - "value": "Bạn có chắc chắn muốn tái thiết lập thống kê " + "value": "Bạn có chắc chắn muốn đặt lại thống kê " }, { "type": 1, @@ -1914,13 +1588,13 @@ "message.delete-team-warning": [ { "type": 0, - "value": "Deleting a team will also delete all team websites." + "value": "Việc xóa một nhóm cũng sẽ xóa tất cả các website của nhóm." } ], "message.delete-website-warning": [ { "type": 0, - "value": "Tất cả các dữ liệu liên quan cũng sẽ bị xoá." + "value": "Tất cả dữ liệu liên quan cũng sẽ bị xóa." } ], "message.error": [ @@ -1936,23 +1610,17 @@ }, { "type": 0, - "value": " on " + "value": " trên " }, { "type": 1, "value": "url" } ], - "message.forbidden": [ - { - "type": 0, - "value": "Forbidden" - } - ], "message.go-to-settings": [ { "type": 0, - "value": "Chuyển tới cài đặt" + "value": "Chuyển đến cài đặt" } ], "message.incorrect-username-password": [ @@ -1970,7 +1638,7 @@ "message.min-password-length": [ { "type": 0, - "value": "Minimum length of " + "value": "Độ dài tối thiểu " }, { "type": 1, @@ -1978,13 +1646,13 @@ }, { "type": 0, - "value": " characters" + "value": " ký tự" } ], "message.new-version-available": [ { "type": 0, - "value": "A new version of Umami " + "value": "Có phiên bản mới của Umami " }, { "type": 1, @@ -1992,7 +1660,7 @@ }, { "type": 0, - "value": " is available!" + "value": "!" } ], "message.no-data-available": [ @@ -2004,67 +1672,55 @@ "message.no-event-data": [ { "type": 0, - "value": "No event data is available." + "value": "Không có dữ liệu sự kiện." } ], "message.no-match-password": [ { "type": 0, - "value": "Mật khẩu không đồng nhất" + "value": "Mật khẩu không khớp" } ], "message.no-results-found": [ { "type": 0, - "value": "No results were found." + "value": "Không tìm thấy kết quả nào." } ], "message.no-team-websites": [ { "type": 0, - "value": "This team does not have any websites." + "value": "Nhóm này không có bất kỳ website nào." } ], "message.no-teams": [ { "type": 0, - "value": "You have not created any teams." + "value": "Bạn chưa tạo nhóm nào." } ], "message.no-users": [ { "type": 0, - "value": "There are no users." + "value": "Không có người dùng nào." } ], "message.no-websites-configured": [ { "type": 0, - "value": "Bạn chưa có bất cứ website nào." - } - ], - "message.not-found": [ - { - "type": 0, - "value": "Not found" - } - ], - "message.nothing-selected": [ - { - "type": 0, - "value": "Nothing selected." + "value": "Bạn chưa cấu hình bất kỳ website nào." } ], "message.page-not-found": [ { "type": 0, - "value": "Trang không tìm thấy." + "value": "Không tìm thấy trang." } ], "message.reset-website": [ { "type": 0, - "value": "To reset this website, type " + "value": "Để đặt lại website này, nhập " }, { "type": 1, @@ -2072,13 +1728,13 @@ }, { "type": 0, - "value": " in the box below to confirm." + "value": " vào ô bên dưới để xác nhận." } ], "message.reset-website-warning": [ { "type": 0, - "value": "Tất cả số liệu thống kê của website này sẽ bị xoá, nhưng mã theo dõi sẽ vẫn giữ nguyên." + "value": "Tất cả số liệu thống kê của website này sẽ bị xóa, nhưng mã theo dõi sẽ vẫn giữ nguyên." } ], "message.saved": [ @@ -2087,12 +1743,6 @@ "value": "Đã lưu thành công." } ], - "message.sever-error": [ - { - "type": 0, - "value": "Server error" - } - ], "message.share-url": [ { "type": 0, @@ -2110,19 +1760,19 @@ "message.team-already-member": [ { "type": 0, - "value": "You are already a member of the team." + "value": "Bạn đã là thành viên của nhóm." } ], "message.team-not-found": [ { "type": 0, - "value": "Team not found." + "value": "Không tìm thấy nhóm." } ], "message.team-websites-info": [ { "type": 0, - "value": "Websites can be viewed by anyone on the team." + "value": "Bất kỳ ai trong nhóm đều có thể xem các website." } ], "message.tracking-code": [ @@ -2134,43 +1784,37 @@ "message.transfer-team-website-to-user": [ { "type": 0, - "value": "Transfer this website to your account?" + "value": "Chuyển website này sang tài khoản của bạn?" } ], "message.transfer-user-website-to-team": [ { "type": 0, - "value": "Select the team to transfer this website to." + "value": "Chọn nhóm để chuyển website này đến." } ], "message.transfer-website": [ { "type": 0, - "value": "Transfer website ownership to your account or another team." + "value": "Chuyển quyền sở hữu website sang tài khoản của bạn hoặc một nhóm khác." } ], "message.triggered-event": [ { "type": 0, - "value": "Triggered event" - } - ], - "message.unauthorized": [ - { - "type": 0, - "value": "Unauthorized" + "value": "Sự kiện được kích hoạt" } ], "message.user-deleted": [ { "type": 0, - "value": "User deleted." + "value": "Người dùng đã bị xóa." } ], "message.viewed-page": [ { "type": 0, - "value": "Viewed page" + "value": "Đã xem trang" } ], "message.visitor-log": [ @@ -2184,7 +1828,7 @@ }, { "type": 0, - "value": " đang dùng " + "value": " đang sử dụng " }, { "type": 1, @@ -2206,5 +1850,11 @@ "type": 1, "value": "device" } + ], + "message.visitors-dropped-off": [ + { + "type": 0, + "value": "Khách truy cập đã rời đi" + } ] } diff --git a/src/app/(main)/SideNav.tsx b/src/app/(main)/SideNav.tsx index c9bc87af..53932bec 100644 --- a/src/app/(main)/SideNav.tsx +++ b/src/app/(main)/SideNav.tsx @@ -19,22 +19,22 @@ export function SideNav(props: any) { const links = [ { label: formatMessage(labels.websites), - href: '/websites', + href: renderUrl('/websites', false), icon: , }, { label: formatMessage(labels.boards), - href: '/boards', + href: renderUrl('/boards', false), icon: , }, { label: formatMessage(labels.links), - href: '/links', + href: renderUrl('/links', false), icon: , }, { label: formatMessage(labels.pixels), - href: '/pixels', + href: renderUrl('/pixels', false), icon: , }, { @@ -57,7 +57,7 @@ export function SideNav(props: any) { {links.map(({ href, label, icon }) => { return ( - + ); diff --git a/src/app/(main)/admin/teams/[teamId]/AdminTeamPage.tsx b/src/app/(main)/admin/teams/[teamId]/AdminTeamPage.tsx index 3edd1ed1..31134388 100644 --- a/src/app/(main)/admin/teams/[teamId]/AdminTeamPage.tsx +++ b/src/app/(main)/admin/teams/[teamId]/AdminTeamPage.tsx @@ -1,10 +1,11 @@ 'use client'; import { TeamDetails } from '@/app/(main)/teams/[teamId]/settings/team/TeamDetails'; +import { TeamProvider } from '@/app/(main)/teams/[teamId]/TeamProvider'; export function AdminTeamPage({ teamId }: { teamId: string }) { return ( - <> + - + ); } diff --git a/src/app/(main)/admin/teams/[teamId]/page.tsx b/src/app/(main)/admin/teams/[teamId]/page.tsx index 0dc9d538..95a0acb8 100644 --- a/src/app/(main)/admin/teams/[teamId]/page.tsx +++ b/src/app/(main)/admin/teams/[teamId]/page.tsx @@ -1,15 +1,10 @@ import { AdminTeamPage } from './AdminTeamPage'; -import { TeamProvider } from '@/app/(main)/teams/[teamId]/TeamProvider'; import { Metadata } from 'next'; export default async function ({ params }: { params: Promise<{ teamId: string }> }) { const { teamId } = await params; - return ( - - - - ); + return ; } export const metadata: Metadata = { diff --git a/src/app/(main)/admin/users/[userId]/page.tsx b/src/app/(main)/admin/users/[userId]/page.tsx index 5d0eea99..e573b14e 100644 --- a/src/app/(main)/admin/users/[userId]/page.tsx +++ b/src/app/(main)/admin/users/[userId]/page.tsx @@ -8,5 +8,5 @@ export default async function ({ params }: { params: Promise<{ userId: string }> } export const metadata: Metadata = { - title: 'Users', + title: 'User', }; diff --git a/src/app/(main)/admin/websites/[websiteId]/AdminWebsitePage.tsx b/src/app/(main)/admin/websites/[websiteId]/AdminWebsitePage.tsx new file mode 100644 index 00000000..637da839 --- /dev/null +++ b/src/app/(main)/admin/websites/[websiteId]/AdminWebsitePage.tsx @@ -0,0 +1,11 @@ +'use client'; +import { WebsiteSettings } from '@/app/(main)/settings/websites/[websiteId]/WebsiteSettings'; +import { WebsiteProvider } from '@/app/(main)/websites/[websiteId]/WebsiteProvider'; + +export function AdminWebsitePage({ websiteId }: { websiteId: string }) { + return ( + + + + ); +} diff --git a/src/app/(main)/admin/websites/[websiteId]/page.tsx b/src/app/(main)/admin/websites/[websiteId]/page.tsx new file mode 100644 index 00000000..ed10ec43 --- /dev/null +++ b/src/app/(main)/admin/websites/[websiteId]/page.tsx @@ -0,0 +1,12 @@ +import { AdminWebsitePage } from './AdminWebsitePage'; +import { Metadata } from 'next'; + +export default async function ({ params }: { params: Promise<{ websiteId: string }> }) { + const { websiteId } = await params; + + return ; +} + +export const metadata: Metadata = { + title: 'Website', +}; diff --git a/src/app/(main)/settings/teams/WebsiteTags.module.css b/src/app/(main)/settings/teams/WebsiteTags.module.css deleted file mode 100644 index 5ca7af51..00000000 --- a/src/app/(main)/settings/teams/WebsiteTags.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.filters { - display: flex; - justify-content: flex-start; - align-items: flex-start; -} - -.tag { - text-align: center; - margin-bottom: 10px; - margin-inline-end: 20px; -} diff --git a/src/app/(main)/settings/teams/WebsiteTags.tsx b/src/app/(main)/settings/teams/WebsiteTags.tsx deleted file mode 100644 index 784b50c1..00000000 --- a/src/app/(main)/settings/teams/WebsiteTags.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Button, Icon, Text } from '@umami/react-zen'; -import { Close } from '@/components/icons'; -import styles from './WebsiteTags.module.css'; - -export function WebsiteTags({ - items = [], - websites = [], - onClick, -}: { - items: any[]; - websites: any[]; - onClick: (e: Event) => void; -}) { - if (websites.length === 0) { - return null; - } - - return ( -
- {websites.map(websiteId => { - const website = items.find(a => a.id === websiteId); - - return ( -
- -
- ); - })} -
- ); -} diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteData.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteData.tsx index 767ffba0..d304562f 100644 --- a/src/app/(main)/settings/websites/[websiteId]/WebsiteData.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/WebsiteData.tsx @@ -19,19 +19,21 @@ export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: const { touch } = useModified(); const { teamId, renderUrl } = useNavigation(); const router = useRouter(); - const { data } = useUserTeamsQuery(user.id); + const { data: teams } = useUserTeamsQuery(user.id); + const canTransferWebsite = ( - !teamId && - data.filter(({ teamUser }) => - teamUser.find( - ({ role, userId }) => - [ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id, - ), - ) + (!teamId && + teams?.data?.filter(({ teamUser }) => + teamUser.find( + ({ role, userId }) => + [ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id, + ), + )) || + [] ).length > 0 || (teamId && - !!data + !!teams?.data ?.find(({ id }) => id === teamId) ?.teamUser.find(({ role, userId }) => role === ROLES.teamOwner && userId === user.id)); diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteShareForm.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteShareForm.tsx index 6a9bbbb7..dd3dcd26 100644 --- a/src/app/(main)/settings/websites/[websiteId]/WebsiteShareForm.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/WebsiteShareForm.tsx @@ -6,17 +6,13 @@ import { Switch, FormSubmitButton, Column, - Icon, - Grid, Label, useToast, - TooltipTrigger, - Tooltip, + Row, } from '@umami/react-zen'; import { useState } from 'react'; import { getRandomChars } from '@/lib/crypto'; import { useApi, useMessages, useModified } from '@/components/hooks'; -import { Refresh } from '@/components/icons'; const generateId = () => getRandomChars(16); @@ -70,24 +66,19 @@ export function WebsiteShareForm({ websiteId, shareId, onSave, onClose }: Websit {id && ( - - - - - {formatMessage(labels.regenerate)} - - + )} - - - - {formatMessage(labels.save)} - + + + {id && } + + + {onClose && } + + {formatMessage(labels.save)} + + diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteTransferForm.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteTransferForm.tsx index c101d4ba..1545f84d 100644 --- a/src/app/(main)/settings/websites/[websiteId]/WebsiteTransferForm.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/WebsiteTransferForm.tsx @@ -31,15 +31,16 @@ export function WebsiteTransferForm({ const { mutate, error } = useMutation({ mutationFn: (data: any) => post(`/websites/${websiteId}/transfer`, data), }); - const { result, query } = useUserTeamsQuery(user.id); + const { data: teams, isLoading } = useUserTeamsQuery(user.id); const isTeamWebsite = !!website?.teamId; - const items = result.data.filter(({ teamUser }) => - teamUser.find( - ({ role, userId }) => - [ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id, - ), - ); + const items = + teams?.data?.filter(({ teamUser }) => + teamUser.find( + ({ role, userId }) => + [ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id, + ), + ) || []; const handleSubmit = async () => { mutate( @@ -60,7 +61,7 @@ export function WebsiteTransferForm({ setTeamId(key as string); }; - if (query.isLoading) { + if (isLoading) { return ; } diff --git a/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx index e4500c96..d7782956 100644 --- a/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx +++ b/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx @@ -1,12 +1,15 @@ +import { useContext, useState } from 'react'; +import { Column, Tabs, TabList, Tab, TabPanel } from '@umami/react-zen'; import { TeamContext } from '@/app/(main)/teams/[teamId]/TeamProvider'; import { useLoginQuery, useMessages } from '@/components/hooks'; import { SectionHeader } from '@/components/common/SectionHeader'; import { ROLES } from '@/lib/constants'; -import { useContext, useState } from 'react'; -import { Column, Tabs, TabList, Tab, TabPanel } from '@umami/react-zen'; +import { Users } from '@/components/icons'; import { TeamLeaveButton } from '@/app/(main)/settings/teams/TeamLeaveButton'; import { TeamManage } from './TeamManage'; import { TeamEditForm } from './TeamEditForm'; +import { TeamWebsitesDataTable } from '@/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesDataTable'; +import { TeamMembersDataTable } from '@/app/(main)/teams/[teamId]/settings/members/TeamMembersDataTable'; export function TeamDetails({ teamId }: { teamId: string }) { const team = useContext(TeamContext); @@ -26,17 +29,25 @@ export function TeamDetails({ teamId }: { teamId: string }) { return ( - + }> {!isTeamOwner && } setTab(value)}> {formatMessage(labels.details)} + {formatMessage(labels.members)} + {formatMessage(labels.websites)} {isTeamOwner && {formatMessage(labels.manage)}} + + + + + + diff --git a/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx index 8ea3ddb9..fad603bb 100644 --- a/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx +++ b/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx @@ -6,6 +6,7 @@ import { TextField, Button, useToast, + Text, } from '@umami/react-zen'; import { getRandomChars } from '@/lib/crypto'; import { useContext } from 'react'; @@ -47,8 +48,7 @@ export function TeamEditForm({ teamId, allowEdit }: { teamId: string; allowEdit? label={formatMessage(labels.name)} rules={{ required: formatMessage(labels.required) }} > - {allowEdit && } - {!allowEdit && team?.name} + {allowEdit ? : {team?.name}} {!cloudMode && allowEdit && ( diff --git a/src/app/api/admin/users/route.ts b/src/app/api/admin/users/route.ts index 3cf116f7..d0d3fcbd 100644 --- a/src/app/api/admin/users/route.ts +++ b/src/app/api/admin/users/route.ts @@ -32,6 +32,9 @@ export async function GET(request: Request) { }, }, }, + omit: { + password: true, + }, orderBy: { createdAt: 'desc', }, diff --git a/src/components/common/SectionHeader.tsx b/src/components/common/SectionHeader.tsx index 752e0a5b..baaaa8b9 100644 --- a/src/components/common/SectionHeader.tsx +++ b/src/components/common/SectionHeader.tsx @@ -18,7 +18,7 @@ export function SectionHeader({ return ( - {icon && {icon}} + {icon && {icon}} {title && {title}} {description && {description}} diff --git a/src/components/hooks/queries/useTeamsQuery.ts b/src/components/hooks/queries/useTeamsQuery.ts index 205545ff..1e78db84 100644 --- a/src/components/hooks/queries/useTeamsQuery.ts +++ b/src/components/hooks/queries/useTeamsQuery.ts @@ -1,6 +1,6 @@ import { useApi } from '../useApi'; import { useModified } from '../useModified'; -import { usePagedQuery } from '@/components/hooks'; +import { usePagedQuery } from '../usePagedQuery'; import { ReactQueryOptions } from '@/lib/types'; export function useTeamsQuery(params?: Record, options?: ReactQueryOptions) { @@ -8,7 +8,7 @@ export function useTeamsQuery(params?: Record, options?: ReactQuery const { modified } = useModified(`teams`); return usePagedQuery({ - queryKey: ['websites', { modified, ...params }], + queryKey: ['teams:admin', { modified, ...params }], queryFn: pageParams => { return get(`/admin/teams`, { ...params, diff --git a/src/components/hooks/queries/useUsersQuery.ts b/src/components/hooks/queries/useUsersQuery.ts index 2723c6b1..03e66ce0 100644 --- a/src/components/hooks/queries/useUsersQuery.ts +++ b/src/components/hooks/queries/useUsersQuery.ts @@ -7,7 +7,7 @@ export function useUsersQuery() { const { modified } = useModified(`users`); return usePagedQuery({ - queryKey: ['users', { modified }], + queryKey: ['users:admin', { modified }], queryFn: (pageParams: any) => { return get('/admin/users', { ...pageParams, diff --git a/src/components/hooks/queries/useWebsitesQuery.ts b/src/components/hooks/queries/useWebsitesQuery.ts index d33ab77c..819b42a9 100644 --- a/src/components/hooks/queries/useWebsitesQuery.ts +++ b/src/components/hooks/queries/useWebsitesQuery.ts @@ -8,7 +8,7 @@ export function useWebsitesQuery(params?: Record, options?: ReactQu const { modified } = useModified(`websites`); return usePagedQuery({ - queryKey: ['websites', { modified, ...params }], + queryKey: ['websites:admin', { modified, ...params }], queryFn: pageParams => { return get(`/admin/websites`, { ...pageParams, diff --git a/src/index.ts b/src/index.ts index 2a077a12..b3d2de2a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,7 +24,6 @@ export * from '@/app/(main)/settings/teams/TeamsDataTable'; export * from '@/app/(main)/settings/teams/TeamsHeader'; export * from '@/app/(main)/settings/teams/TeamsJoinButton'; export * from '@/app/(main)/settings/teams/TeamsTable'; -export * from '@/app/(main)/settings/teams/WebsiteTags'; export * from '@/app/(main)/settings/websites/[websiteId]/WebsiteShareForm'; export * from '@/app/(main)/settings/websites/[websiteId]/WebsiteTrackingCode';