i18n(vi): complete Vietnamese (100%) + add to picker

This commit is contained in:
SkateSpots 2026-10-08 17:17:35 +07:00
parent 69d04469f5
commit 09859bb7da
10 changed files with 9437 additions and 16 deletions

View file

@ -32,6 +32,7 @@ const languages: LanguageOption[] = [
{ code: 'ja', name: 'Japanese', nativeName: '日本語', flag: '🇯🇵' },
{ code: 'zh-CN', name: 'Chinese (Simplified)', nativeName: '简体中文', flag: '🇨🇳' },
{ code: 'zh-TW', name: 'Chinese (Traditional)', nativeName: '繁體中文', flag: '🇹🇼' },
{ code: 'vi', name: 'Vietnamese', nativeName: 'Tiếng Việt', flag: '🇻🇳' },
{ code: 'tr', name: 'Turkish', nativeName: 'Türkçe', flag: '🇹🇷' },
];

View file

@ -1,4 +1,290 @@
/** vi — batch 1. Filled by the translation pass; empty until then. */
const viBatch1 = {};
/** vi — batch 1. */
const viBatch1 = {
common: {
loading: "Đang tải...",
error: "Lỗi",
save: "Lưu",
cancel: "Hủy",
delete: "Xóa",
edit: "Sửa",
add: "Thêm",
remove: "Gỡ",
create: "Tạo",
submit: "Gửi",
close: "Đóng",
back: "Quay lại",
next: "Tiếp",
done: "Xong",
search: "Tìm kiếm",
filter: "Lọc",
sort: "Sắp xếp",
share: "Chia sẻ",
more: "Thêm",
copy: "Sao chép",
copied: "Đã sao chép!",
viewAll: "Xem tất cả",
seeMore: "Xem thêm",
showMore: "Hiện thêm",
showLess: "Thu gọn",
noResults: "Không tìm thấy kết quả",
tryAgain: "Thử lại",
learnMore: "Tìm hiểu thêm",
getStarted: "Bắt đầu",
yes: "Có",
no: "Không",
or: "hoặc",
and: "và",
free: "Miễn phí",
new: "Mới",
popular: "Phổ biến",
featured: "Nổi bật",
verified: "Đã xác minh",
sats: "sats",
clear: "Xóa",
clearFilters: "Xóa bộ lọc",
clearAll: "Xóa tất cả",
hide: "Ẩn",
undo: "Hoàn tác"
},
nav: {
home: "Trang chủ",
map: "Spots",
lab: "The Lab",
events: "Sự kiện",
crews: "Crews",
wallet: "Ví",
settings: "Cài đặt",
more: "Thêm",
rewards: "Phần thưởng",
stats: "Thống kê cộng đồng",
about: "Giới thiệu",
food: "Đồ ăn",
marketplace: "Chợ",
mints: "Mints",
appShop: "Cửa hàng ứng dụng",
diy: "DIY",
trades: "Chợ",
stash: "Stash",
collections: "Bộ sưu tập",
contacts: "Danh bạ",
messages: "Tin nhắn",
skaters: "Người trượt ván",
glossary: "Thuật ngữ",
riderCard: "Thẻ Rider",
supporters: "Người ủng hộ ⚡",
newsletter: "Bản tin",
viewProfile: "Xem hồ sơ",
leaderboards: "Bảng xếp hạng"
},
chromeUi: {
skipToContent: "Chuyển đến nội dung",
menu: "Menu",
inBadge: "In",
loggedIn: "Đã đăng nhập",
profile: "Hồ sơ",
logIn: "Đăng nhập",
logOut: "Đăng xuất",
notLoggedIn: "Chưa đăng nhập",
loggedOutPrompt: "Đăng nhập để thêm spot, zap skater và lưu mục yêu thích",
accounts: "Tài khoản",
addAnotherAccount: "Thêm tài khoản khác",
setStatus: "Đặt trạng thái",
setYourStatus: "Đặt trạng thái của bạn",
status: "Trạng thái",
addSpot: "Thêm Spot",
myData: "Dữ liệu của tôi",
myStash: "Stash của tôi",
myCollections: "Bộ sưu tập của tôi",
viewMyProfile: "Xem hồ sơ của tôi",
customizeNavBar: "Tùy chỉnh thanh điều hướng",
ecash: "Ecash",
madeWith: "Được tạo bằng",
forSkateCommunity: "cho cộng đồng trượt ván",
beta: "Beta",
license: "Giấy phép",
privacy: "Quyền riêng tư",
collaborators: "Cộng tác viên & Bạn bè",
notSponsoredBy: "Không được tài trợ bởi",
errorTitle: "Không thể tải nội dung này",
errorDescription: "Yêu cầu mạng thất bại. Kiểm tra kết nối và thử lại.",
tryAgain: "Thử lại",
weatherOn: "Bật thời tiết",
weatherOff: "Tắt thời tiết",
trustFilter: "Bộ lọc tin cậy",
filterByTrustLevel: "Lọc theo mức độ tin cậy",
trust: {
all: "Tất cả người dùng",
allDesc: "Hiển thị nội dung từ mọi người",
verified: "Đã xác minh",
verifiedDesc: "Bạn theo dõi họ hoặc họ đã được xác minh (tin cậy ≥90)",
trusted: "Đáng tin cậy",
trustedDesc: "Bạn của bạn bè hoặc đã xác minh NIP-05 (tin cậy ≥60)",
following: "Chỉ đang theo dõi",
followingDesc: "Chỉ hiển thị nội dung từ người bạn theo dõi",
followingShort: "Đang theo dõi"
},
sort: {
recent: "Gần đây nhất",
recentDesc: "Mới nhất trước",
trust: "Tin cậy cao nhất",
trustDesc: "Nhà sáng tạo đáng tin cậy nhất",
proximity: "Gần tôi nhất",
proximityDesc: "Địa điểm gần nhất",
popular: "Phổ biến nhất",
popularDesc: "Nhiều bình luận/cảm xúc nhất",
zaps: "Được Zap nhiều nhất",
zapsDesc: "Giá trị nhận được cao nhất"
},
spotType: {
street: "Đường phố",
transition: "Transition",
park: "Park",
plaza: "Quảng trường",
diy: "DIY",
bowl: "Bowl",
vert: "Vert",
indoor: "Trong nhà",
skatepark: "Skatepark",
miniramp: "Mini Ramp"
}
},
desktopNav: {
title: "Điều hướng máy tính",
desc: "Chọn các tab hiển thị trên thanh trên cùng và thứ tự của chúng. Các tab bị ẩn vẫn nằm trong menu “Thêm”.",
fixed: "Cố định",
shownInTopBar: "Hiển thị trên thanh trên cùng ({{count}})",
noExtraTabs: "Không có tab thêm nào được hiển thị — mọi thứ đều nằm trong menu “Thêm”. Thêm một số bên dưới.",
inMoreMenu: "Trong menu “Thêm” ({{count}})",
moveUp: "Di chuyển {{name}} lên",
moveDown: "Di chuyển {{name}} xuống",
hide: "Ẩn {{name}}",
moveToMore: "Chuyển vào menu Thêm",
show: "Hiện",
showInTopBar: "Hiện {{name}} trên thanh trên cùng",
showInTopBarTitle: "Hiện trên thanh trên cùng",
reset: "Đặt lại mặc định"
},
navSheet: {
title: "Tùy chỉnh thanh của bạn",
desc: "Chọn {{count}} tab bạn dùng nhiều nhất. Mọi thứ khác vẫn ở trong menu.",
preview: "Xem trước",
empty: "Trống",
order: "Thứ tự ({{done}}/{{total}})",
available: "Tab khả dụng",
full: "Thanh đã đầy — xóa một tab để thay",
moveUp: "Di chuyển {{name}} lên",
moveDown: "Di chuyển {{name}} xuống",
login: "Đăng nhập",
profile: "Hồ sơ",
reset: "Đặt lại",
done: "Xong"
},
pwa: {
installTitle: "Cài đặt SkateSpots",
installSubtitle: "Trải nghiệm ứng dụng đầy đủ",
addToHomeScreen: "Thêm vào Màn hình chính",
installApp: "Cài đặt ứng dụng",
maybeLater: "Để sau",
gotIt: "Đã hiểu!",
benefits: {
fast: "Nhanh như Lightning",
offline: "Hoạt động ngoại tuyến",
fullAccess: "Truy cập đầy đủ"
},
iosStep1: "Nhấn nút Chia sẻ",
iosStep1Hint: "ở cuối Safari",
iosStep2: "Cuộn và nhấn \"Thêm vào Màn hình chính\"",
iosStep2Hint: "trong menu chia sẻ",
iosStep3: "Nhấn \"Thêm\" để cài đặt",
iosStep3Hint: "Ứng dụng sẽ xuất hiện trên màn hình chính của bạn",
androidStep1: "Nhấn nút menu",
androidStep1Hint: "(ba dấu chấm) trong trình duyệt của bạn",
androidStep2: "Chọn \"Thêm vào Màn hình chính\"",
androidStep2Hint: "hoặc \"Cài đặt ứng dụng\"",
androidStep3: "Xác nhận để cài đặt",
androidStep3Hint: "Ứng dụng sẽ xuất hiện trên màn hình chính của bạn",
tagline: "Miễn phí • Hoạt động ngoại tuyến • Nhanh & đáng tin cậy"
},
home: {
tagline: "Do cộng đồng vận hành • Dựa trên Relay",
title: "SKATE SPOTS",
subtitle: "Khám phá Spots • Gặp gỡ • Học trick • Ủng hộ địa phương",
description: "Trượt ván thật diễn ra ngoài đời - công cụ này giúp bạn tìm thấy nó.",
betaWarning: "BETA - Đang xây dựng • Dùng với rủi ro của riêng bạn",
pwaHint: "Ứng dụng web tiến bộ - Cài đặt trên thiết bị của bạn",
exploreMap: "Khám phá bản đồ",
addSpot: "Thêm Spot",
globalSpots: "Spots toàn cầu",
openCommunity: "Cộng đồng mở",
lightningZaps: "Lightning Zaps",
featuredSpots: "Spots nổi bật",
featuredSpotsDesc: "Các spot trượt ván được cộng đồng xác minh từ khắp thế giới",
upcomingEvents: "Sự kiện sắp tới",
upcomingEventsDesc: "Cuộc thi, buổi gặp mặt và buổi trượt sắp diễn ra",
noSpotsYet: "Chưa tìm thấy spot nào",
noSpotsHint: "Hãy là người đầu tiên thêm một spot trượt ván!",
noEventsYet: "Không có sự kiện sắp tới",
noEventsHint: "Quay lại sau hoặc tạo một sự kiện!",
theLab: "The Lab",
theLabDesc: "Học trick, tìm huấn luyện viên và nâng cao trình độ trượt ván",
coaches: "Huấn luyện viên",
coachesDesc: "Học từ những skater giàu kinh nghiệm có thể giúp bạn tiến bộ",
filmers: "Người quay phim",
filmersDesc: "Kết nối với người quay phim để ghi lại những clip đẹp nhất của bạn",
findCoach: "Tìm huấn luyện viên",
becomeCoach: "Trở thành huấn luyện viên",
findFilmer: "Tìm người quay phim",
becomeFilmer: "Trở thành người quay phim",
viewAllSpots: "Xem tất cả Spots",
viewAllEvents: "Xem tất cả sự kiện",
createEvent: "Tạo sự kiện",
readyToShare: "Sẵn sàng chia sẻ?",
readyToShareDesc: "Giúp cộng đồng trượt ván phát triển bằng cách thêm những spot yêu thích của bạn. Mỗi địa điểm bạn chia sẻ giúp những skater khác khám phá địa điểm mới để trượt."
},
about: {
title: "Giới thiệu về SkateSpots",
subtitle: "Cộng đồng trượt ván phi tập trung",
whatIs: "SkateSpots là gì?",
whatIsDesc: "SkateSpots là nền tảng do cộng đồng vận hành để khám phá các địa điểm trượt ván trên toàn thế giới. Được xây dựng trên Nostr, nó trao cho skater quyền sở hữu thực sự đối với dữ liệu của họ.",
features: "Tính năng",
featuresDesc: "Tìm spot, tạo sự kiện, kết nối với huấn luyện viên và ủng hộ các cửa hàng trượt ván địa phương—tất cả ở một nơi.",
nostr: "Xây dựng trên Nostr",
nostrDesc: "Nostr là một giao thức mở, đơn giản cho phép giao tiếp toàn cầu thực sự chống kiểm duyệt. Tài khoản và dữ liệu của bạn thuộc về bạn.",
openSource: "Mã nguồn mở",
openSourceDesc: "SkateSpots hoàn toàn là mã nguồn mở. Hãy đóng góp, fork hoặc chạy phiên bản của riêng bạn.",
lightning: "Thanh toán Lightning",
lightningDesc: "Zap những skater, huấn luyện viên và nhà sáng tạo nội dung yêu thích của bạn bằng thanh toán Bitcoin Lightning."
},
faq: {
title: "Câu hỏi thường gặp",
subtitle: "Mọi điều bạn cần biết về SkateSpots",
whatIsNostr: "Nostr là gì?",
whatIsNostrAnswer: "Nostr là một giao thức mở cho mạng xã hội phi tập trung. Không giống các nền tảng truyền thống, bạn sở hữu dữ liệu và danh tính của mình.",
howToStart: "Làm thế nào để bắt đầu?",
howToStartAnswer: "Nhấn \"Đăng ký\" để tạo tài khoản Nostr mới, hoặc \"Đăng nhập\" nếu bạn đã có. Bạn có thể dùng tiện ích trình duyệt, ứng dụng di động hoặc khóa bí mật.",
whatAreZaps: "Zaps là gì?",
whatAreZapsAnswer: "Zaps là tiền tip Bitcoin Lightning bạn có thể gửi cho người dùng khác. Chúng là cách để thể hiện sự trân trọng với nội dung hay hoặc ủng hộ nhà sáng tạo.",
howToAddSpot: "Làm thế nào để thêm một spot?",
howToAddSpotAnswer: "Đăng nhập vào tài khoản, nhấn \"Thêm Spot\" và điền thông tin bao gồm vị trí, ảnh và mô tả.",
isItFree: "SkateSpots có miễn phí không?",
isItFreeAnswer: "Có! SkateSpots hoàn toàn miễn phí sử dụng. Bạn có thể tùy chọn gửi Zaps (tiền tip Bitcoin) cho người dùng khác.",
canIEditSpot: "Tôi có thể sửa hoặc xóa spot của mình không?",
canIEditSpotAnswer: "Có, bạn có thể sửa spot mình đã tạo. Do tính phi tập trung của Nostr, yêu cầu xóa sẽ được gửi đi nhưng một số relay có thể vẫn giữ dữ liệu."
},
onboarding: {
welcome: "Chào mừng đến với SkateSpots!",
welcomeDesc: "Hãy thiết lập chỉ trong vài bước.",
step1Title: "Tạo tài khoản của bạn",
step1Desc: "Khóa Nostr của bạn đang được tạo. Nó giống như một mật khẩu do bạn kiểm soát.",
step2Title: "Sao lưu khóa của bạn",
step2Desc: "Lưu cụm từ khôi phục ở nơi an toàn. Đây là cách duy nhất để khôi phục tài khoản của bạn!",
step3Title: "Thiết lập hồ sơ của bạn",
step3Desc: "Giới thiệu về bản thân với cộng đồng.",
step4Title: "Bạn đã sẵn sàng!",
step4Desc: "Bắt đầu khám phá spot, sự kiện và kết nối với các skater.",
skipForNow: "Bỏ qua lúc này",
continueToApp: "Tiếp tục đến ứng dụng"
}
};
export default viBatch1;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,908 @@
/** vi — batch 7. Filled by the translation pass; empty until then. */
const viBatch7 = {};
/** vi — batch 7. Translated from the English source. */
const viBatch7 = {
events: {
title: 'Sự kiện trượt ván',
createEvent: 'Tạo sự kiện',
editEvent: 'Chỉnh sửa sự kiện',
eventDetails: 'Chi tiết sự kiện',
eventName: 'Tên sự kiện',
eventType: 'Loại sự kiện',
date: 'Ngày',
time: 'Giờ',
startDate: 'Ngày bắt đầu',
endDate: 'Ngày kết thúc',
venue: 'Địa điểm',
organizer: 'Người tổ chức',
attendees: 'Người tham dự',
going: 'Sẽ tham gia',
interested: 'Quan tâm',
rsvp: 'RSVP',
ticketPrice: 'Giá vé',
freeEntry: 'Vào cửa miễn phí',
register: 'Đăng ký',
moreInfo: 'Thêm thông tin',
upcomingEvents: 'Sắp tới',
pastEvents: 'Đã qua',
noEvents: 'Không tìm thấy sự kiện',
findEvents: 'Tìm cuộc thi, demo, buổi trượt và hơn thế nữa',
searchPlaceholder: 'Tìm kiếm sự kiện...',
loginToCreate: 'Đăng nhập để tạo sự kiện',
noEventsMatch: 'Không có sự kiện sắp tới nào khớp với bộ lọc của bạn.',
noUpcoming: 'Không tìm thấy sự kiện sắp tới.',
noPast: 'Không tìm thấy sự kiện đã qua.',
types: {
contest: 'Cuộc thi',
session: 'Buổi trượt',
meetup: 'Gặp gỡ',
premiere: 'Công chiếu video',
workshop: 'Hội thảo',
demo: 'Demo',
jam: 'Jam',
},
},
wallet: {
title: 'Ví',
balance: 'Số dư',
send: 'Gửi',
receive: 'Nhận',
transactions: 'Giao dịch',
history: 'Lịch sử',
noTransactions: 'Chưa có giao dịch',
sendSats: 'Gửi Sats',
receiveSats: 'Nhận Sats',
amount: 'Số tiền',
recipient: 'Người nhận',
lightning: 'Lightning',
onChain: 'On-chain',
invoice: 'Hóa đơn',
address: 'Địa chỉ',
scanQR: 'Quét QR',
paste: 'Dán',
payInvoice: 'Thanh toán hóa đơn',
createInvoice: 'Tạo hóa đơn',
copied: 'Đã sao chép vào clipboard!',
insufficientFunds: 'Không đủ tiền',
paymentSent: 'Đã gửi thanh toán!',
paymentReceived: 'Đã nhận thanh toán!',
cashu: {
title: 'Ví Cashu',
tokens: 'Token',
mint: 'Mint',
mints: 'Mints',
manageMints: 'Quản lý Mints',
addMint: 'Thêm Mint',
removeMint: 'Xóa Mint',
defaultMint: 'Mint mặc định',
backup: 'Sao lưu',
restore: 'Khôi phục',
recoveryPhrase: 'Cụm từ khôi phục',
viewRecoveryPhrase: 'Xem cụm từ khôi phục',
seedWarning: 'Điều này giống như nsec Nostr của bạn - hãy giữ bí mật và sao lưu cẩn thận!',
},
},
spots: {
addSpot: 'Thêm Spot',
editSpot: 'Chỉnh sửa Spot',
spotDetails: 'Chi tiết Spot',
spotName: 'Tên Spot',
spotType: 'Loại Spot',
description: 'Mô tả',
location: 'Vị trí',
address: 'Địa chỉ',
photos: 'Ảnh',
addPhotos: 'Thêm ảnh',
obstacles: 'Chướng ngại vật',
features: 'Đặc điểm',
bustLevel: 'Mức độ bị đuổi',
bestTime: 'Thời điểm đẹp nhất',
tips: 'Mẹo',
reviews: 'Đánh giá',
addReview: 'Thêm đánh giá',
reportSpot: 'Báo cáo Spot',
directions: 'Chỉ đường',
shareSpot: 'Chia sẻ Spot',
createdBy: 'Tạo bởi',
lastUpdated: 'Cập nhật lần cuối',
types: {
park: 'Công viên trượt ván',
street: 'Spot đường phố',
diy: 'Spot DIY',
plaza: 'Quảng trường',
indoor: 'Trong nhà',
bowl: 'Bowl',
vert: 'Vert',
miniramp: 'Mini Ramp',
},
bustLevels: {
chill: 'Thoải mái',
moderate: 'Trung bình',
sketchy: 'Rủi ro',
heavy: 'Gay gắt',
},
},
settings: {
title: 'Cài đặt',
profile: 'Hồ sơ',
editProfile: 'Chỉnh sửa hồ sơ',
account: 'Tài khoản',
security: 'Bảo mật',
relays: 'Relay',
appearance: 'Giao diện',
language: 'Ngôn ngữ',
notifications: 'Thông báo',
privacy: 'Quyền riêng tư',
about: 'Giới thiệu',
help: 'Trợ giúp',
feedback: 'Phản hồi',
version: 'Phiên bản',
displayName: 'Tên hiển thị',
username: 'Tên người dùng',
bio: 'Tiểu sử',
website: 'Trang web',
lightningAddress: 'Địa chỉ Lightning',
profilePicture: 'Ảnh đại diện',
banner: 'Ảnh bìa',
saveProfile: 'Lưu hồ sơ',
backupKeys: 'Sao lưu khóa',
exportKeys: 'Xuất khóa',
secretKey: 'Khóa bí mật',
publicKey: 'Khóa công khai',
showSecretKey: 'Hiện khóa bí mật',
hideSecretKey: 'Ẩn khóa bí mật',
copyKey: 'Sao chép khóa',
keysBackedUp: 'Bạn đã xác nhận rằng khóa của mình được sao lưu an toàn.',
keysNotBackedUp: 'Hãy đảm bảo sao lưu cụm từ khôi phục hoặc khóa bí mật của bạn!',
selectLanguage: 'Chọn ngôn ngữ',
english: 'Tiếng Anh',
spanish: 'Tiếng Tây Ban Nha',
},
createSpot: {
title: 'Thêm một Spot trượt ván',
subtitle: 'Chia sẻ một Spot trượt ván với cộng đồng',
backToMap: 'Quay lại bản đồ',
namePlaceholder: 'ví dụ: Trường Trung học Hollywood',
descriptionPlaceholder: 'Mô tả Spot, chướng ngại vật, thời điểm trượt tốt nhất, thông tin an ninh, v.v.',
addressPlaceholder: 'ví dụ: 1521 N Highland Ave, Los Angeles, CA',
selectType: 'Chọn loại Spot',
selectBustLevel: 'Chọn mức độ bị đuổi',
uploadPhotos: 'Tải lên',
dragDrop: 'Kéo thả hoặc nhấp để tải lên',
maxPhotos: 'Tối đa 5 ảnh',
publishing: 'Đang đăng...',
success: 'Đã đăng Spot thành công!',
error: 'Không thể đăng Spot',
locationRequired: 'Vui lòng chọn một vị trí trên bản đồ',
useCurrentLocation: 'Dùng vị trí hiện tại của tôi',
pickOnMap: 'Chọn vị trí trên bản đồ',
loginToAdd: 'Bạn cần đăng nhập để thêm Spot trượt ván.',
locationLabel: 'Vị trí',
tapToPlace: 'Nhấp vào bản đồ để đặt ghim, hoặc kéo để điều chỉnh.',
manualCoords: 'Nhập tọa độ thủ công',
moreDetails: 'Thêm chi tiết (không bắt buộc)',
photoHint: 'cần có ảnh để đăng',
nameRequired: 'Vui lòng nhập tên cho Spot này.',
descriptionRequired: 'Vui lòng mô tả Spot này.',
addressRequired: 'Vui lòng thêm địa chỉ hoặc tên khu vực.',
photoRequired: 'Vui lòng thêm ít nhất một ảnh.',
draftTitle: 'Bạn có một bản nháp chưa lưu',
draftBody: 'Tiếp tục từ chỗ bạn dừng lại, hoặc hủy bỏ.',
draftResume: 'Tiếp tục',
draftDiscard: 'Hủy bản nháp',
requiredFields: 'Hãy cho chúng tôi biết về Spot này. Tất cả các trường có dấu * là bắt buộc.',
coordinates: 'Tọa độ',
latitudePlaceholder: 'Vĩ độ (ví dụ: 34.1012)',
longitudePlaceholder: 'Kinh độ (ví dụ: -118.3389)',
gettingLocation: 'Đang lấy vị trí...',
accessType: 'Loại truy cập',
publicTitle: 'Công khai - Mở cho mọi người',
publicDesc: 'Công viên trượt ván, quảng trường công cộng, Spot đường phố',
privateTitle: 'Tài sản riêng - Cần xin phép',
privateDesc: 'Ramp sân sau, đất riêng, Spot có cổng',
localsTitle: 'Hỏi người địa phương trước',
localsDesc: 'Tôn trọng Spot, đừng làm lộ nó',
contactInfo: 'Thông tin liên hệ',
contactPlaceholder: 'ví dụ: Số điện thoại, Instagram, email...',
contactHintPrivate: 'Mọi người nên liên hệ với bạn thế nào để xin phép?',
contactHintLocals: 'Mọi người nên liên hệ thế nào để hỏi về Spot?',
},
marketplace: {
title: 'Chợ',
subtitle: 'Mua, bán và trao đổi Gear trượt ván',
addListing: 'Thêm tin đăng',
condition: 'Tình trạng',
conditions: {
new: 'Mới',
likeNew: 'Như mới',
good: 'Tốt',
fair: 'Khá',
poor: 'Kém',
},
categories: {
all: 'Tất cả',
decks: 'Ván',
trucks: 'Trucks',
wheels: 'Bánh xe',
bearings: 'Vòng bi',
shoes: 'Giày',
clothing: 'Quần áo',
protection: 'Bảo hộ',
other: 'Khác',
},
priceRange: 'Khoảng giá',
location: 'Vị trí',
seller: 'Người bán',
contact: 'Liên hệ người bán',
makeOffer: 'Đưa ra đề nghị',
sold: 'Đã bán',
available: 'Còn hàng',
gear: 'Gear',
sellGear: 'Bán Gear',
wantToBuy: 'Muốn mua',
},
auth: {
login: 'Đăng nhập',
logout: 'Đăng xuất',
signUp: 'Đăng ký',
signUpTitle: 'Mới với Nostr?',
signUpDesc: 'Tạo tài khoản mới để bắt đầu. Miễn phí và mở.',
orLogIn: 'Hoặc đăng nhập',
loginWithExtension: 'Đăng nhập bằng Tiện ích mở rộng',
loginWithAmber: 'Đăng nhập bằng Amber (Android)',
loginWithKey: 'Khóa bí mật (nsec) hoặc Cụm từ khôi phục',
loginWithBunker: 'Đăng nhập bằng Nostr Connect',
bunkerUri: 'Chuỗi kết nối Bunker',
openAmber: 'Mở Amber',
connectToBunker: 'Kết nối với Bunker',
noExtension: 'Không phát hiện tiện ích mở rộng nào.',
extensionHelp: 'Thử dùng nút Đăng ký ở trên để tạo tài khoản mới, hoặc dùng các tab Amber, Khóa hoặc Bunker nếu bạn đã có thông tin đăng nhập.',
amberDesc: 'Amber là ứng dụng ký Nostr an toàn cho thiết bị Android. Nhấp vào nút bên dưới để mở Amber và cấp quyền truy cập.',
bunkerDesc: 'Truy cập tài khoản của bạn từ bất kỳ thiết bị nào bằng trình ký từ xa (bunker). Khóa của bạn vẫn an toàn trên máy chủ, không bao giờ lộ ra cho trang web.',
keyPlaceholder: 'nsec1... hoặc cụm từ khôi phục 12 từ của bạn',
keyHint: 'Bạn có thể dán khóa nsec hoặc cụm từ khôi phục 12 từ',
uploadKeyFile: 'Tải lên tệp khóa của bạn',
loggingIn: 'Đang đăng nhập...',
connecting: 'Đang kết nối...',
verifying: 'Đang xác minh...',
},
createEvent: {
title: 'Tạo một sự kiện',
subtitle: 'Tổ chức một sự kiện trượt ván cho cộng đồng',
backToEvents: 'Quay lại sự kiện',
namePlaceholder: 'ví dụ: Buổi trượt ván hè',
descriptionPlaceholder: 'Mô tả sự kiện, những gì sẽ diễn ra, luật lệ, giải thưởng, v.v.',
selectType: 'Chọn loại sự kiện',
venuePlaceholder: 'ví dụ: Skatepark Venice Beach, CA',
selectDate: 'Chọn ngày',
selectTime: 'Chọn giờ',
ticketPricePlaceholder: 'Để trống cho sự kiện miễn phí',
publishing: 'Đang đăng...',
success: 'Đã đăng sự kiện thành công!',
error: 'Không thể đăng sự kiện',
loginToCreate: 'Bạn cần đăng nhập để tạo sự kiện.',
requiredFields: 'Hãy cho chúng tôi biết về sự kiện này. Tất cả các trường có dấu * là bắt buộc.',
startDateTime: 'Ngày & Giờ bắt đầu',
endDateTime: 'Ngày & Giờ kết thúc (không bắt buộc)',
coordinatesOptional: 'Tọa độ (không bắt buộc)',
coverImage: 'Ảnh bìa',
uploadCover: 'Tải lên ảnh bìa',
nip05Recommended: 'Nên xác minh NIP-05',
nip05Desc: 'Thêm định danh NIP-05 vào hồ sơ của bạn để xác minh danh tính và tạo dựng niềm tin với người tham dự.',
addNip05: 'Thêm NIP-05 trong Cài đặt',
},
labPage: {
title: 'The Lab',
subtitle: 'Học kỹ thuật. Ghi lại khoảnh khắc. Kết nối với những Skater khác',
coachesTab: 'Huấn luyện',
filmersTab: 'Quay phim',
offerCoaching: 'CUNG CẤP HUẤN LUYỆN',
offerFilming: 'CUNG CẤP DỊCH VỤ QUAY PHIM',
loginToOffer: 'Đăng nhập để cung cấp dịch vụ',
whatToLearn: 'BẠN MUỐN HỌC GÌ?',
whatContent: 'BẠN MUỐN LOẠI NỘI DUNG NÀO?',
selectSkillsDesc: 'Chọn kỹ năng và chúng tôi sẽ ghép bạn với huấn luyện viên',
selectFilmingDesc: 'Chọn dịch vụ quay phim bạn đang tìm',
searchPlaceholder: 'Tìm theo tên, vị trí hoặc kỹ năng...',
noServicesYet: 'CHƯA CÓ DỊCH VỤ NÀO',
beFirstToOffer: 'Hãy là người đầu tiên cung cấp dịch vụ huấn luyện hoặc quay phim cho cộng đồng!',
skills: 'Kỹ năng',
rate: 'Giá',
perHour: '/giờ',
contact: 'Liên hệ',
viewProfile: 'Xem hồ sơ',
noProfilesYet: 'Chưa có hồ sơ nào',
beFirstCoach: 'Hãy là người đầu tiên đăng ký làm huấn luyện viên!',
beFirstFilmer: 'Hãy là người đầu tiên đăng ký làm filmer!',
yearsExperience: 'năm kinh nghiệm',
},
skills: {
kickflip: 'Kickflip',
heelflip: 'Heelflip',
ollie: 'Ollie',
treflip: '360 Flip',
shuvit: 'Shuvit',
hardflip: 'Hardflip',
varial: 'Varial',
nollie: 'Nollie',
fakie: 'Fakie',
switch: 'Switch',
grind: 'Grind',
slide: 'Slide',
manual: 'Manual',
transition: 'Transition',
bowl: 'Bowl',
vert: 'Vert',
street: 'Street',
flatground: 'Flatground',
},
lab: {
title: 'The Lab',
subtitle: 'Nâng tầm kỹ năng trượt ván của bạn',
coaches: 'Huấn luyện viên',
filmers: 'Filmer',
findCoach: 'Tìm huấn luyện viên',
becomeCoach: 'Trở thành huấn luyện viên',
findFilmer: 'Tìm filmer',
becomeFilmer: 'Trở thành filmer',
hourlyRate: 'Giá theo giờ',
experience: 'Kinh nghiệm',
specialties: 'Chuyên môn',
availability: 'Thời gian rảnh',
bookSession: 'Đặt buổi học',
contactCoach: 'Liên hệ huấn luyện viên',
noCoaches: 'Không tìm thấy huấn luyện viên trong khu vực của bạn',
noFilmers: 'Không tìm thấy filmer trong khu vực của bạn',
},
shops: {
title: 'Shop trượt ván',
addShop: 'Thêm Shop',
editShop: 'Chỉnh sửa Shop',
shopDetails: 'Chi tiết Shop',
shopName: 'Tên Shop',
hours: 'Giờ mở cửa',
phone: 'Điện thoại',
website: 'Trang web',
services: 'Dịch vụ',
brands: 'Thương hiệu',
supportLocal: 'Ủng hộ địa phương',
nip05: 'NIP-05 của Shop',
nip05Hint: 'Một định danh tùy chọn do bạn kiểm soát cho Shop này (ví dụ: shop@yourdomain.com), được xác minh với khóa của bạn. Thêm tối đa 5.',
},
becomeFilmer: {
title: 'Trở thành filmer',
subtitle: 'Ghi lại những clip đỉnh nhất cho cộng đồng',
bioPlaceholder: 'Cho chúng tôi biết về kinh nghiệm quay phim và thiết bị của bạn...',
specialtiesPlaceholder: 'ví dụ: mắt cá, ống kính dài, drone, dựng phim',
selectSpecialties: 'Chọn chuyên môn của bạn',
hourlyRate: 'Giá theo giờ (sats)',
ratePlaceholder: 'ví dụ: 5000',
locationPlaceholder: 'Thành phố hoặc khu vực của bạn',
portfolioUrl: 'URL portfolio',
portfolioPlaceholder: 'Liên kết đến tác phẩm của bạn (YouTube, Instagram, v.v.)',
publishing: 'Đang đăng hồ sơ...',
success: 'Đã tạo hồ sơ filmer!',
error: 'Không thể tạo hồ sơ',
},
food: {
title: 'Điểm ăn uống',
subtitle: 'Nạp năng lượng trước hoặc sau buổi trượt',
addFood: 'Thêm điểm ăn uống',
categories: {
all: 'Tất cả',
burgers: 'Burger',
pizza: 'Pizza',
tacos: 'Tacos',
coffee: 'Cà phê',
drinks: 'Đồ uống',
snacks: 'Đồ ăn vặt',
},
skaterFriendly: 'Thân thiện với skater',
nearSpots: 'Gần các Spot trượt ván',
},
profile: {
posts: 'Bài đăng',
spots: 'Spot',
events: 'Sự kiện',
following: 'Đang theo dõi',
followers: 'Người theo dõi',
editProfile: 'Chỉnh sửa hồ sơ',
follow: 'Theo dõi',
unfollow: 'Bỏ theo dõi',
noPostsYet: 'Chưa có bài đăng nào',
noBio: 'Chưa có tiểu sử',
zapProfile: 'Zap skater này',
},
becomeCoach: {
title: 'Trở thành huấn luyện viên',
subtitle: 'Chia sẻ kỹ năng của bạn và giúp các skater khác tiến bộ',
bioPlaceholder: 'Cho chúng tôi biết về nền tảng trượt ván và phong cách dạy của bạn...',
skillsPlaceholder: 'ví dụ: kickflip, heelflip, grind, bowl',
selectSkills: 'Chọn kỹ năng bạn có thể dạy',
hourlyRate: 'Giá theo giờ (sats)',
ratePlaceholder: 'ví dụ: 5000',
locationPlaceholder: 'Thành phố hoặc khu vực của bạn',
publishing: 'Đang đăng hồ sơ...',
success: 'Đã tạo hồ sơ huấn luyện viên!',
error: 'Không thể tạo hồ sơ',
},
weather: {
title: 'Thời tiết',
current: 'Điều kiện hiện tại',
forecast: 'Dự báo',
humidity: 'Độ ẩm',
wind: 'Gió',
feelsLike: 'Cảm giác như',
goodForSkating: 'Tốt để trượt ván!',
notIdeal: 'Điều kiện không lý tưởng',
allWeather: 'Mọi thời tiết',
goodWeather: 'Thời tiết tốt',
perfectWeather: 'Thời tiết hoàn hảo',
},
errors: {
somethingWentWrong: 'Đã xảy ra lỗi',
tryAgainLater: 'Vui lòng thử lại sau',
notFound: 'Không tìm thấy',
pageNotFound: 'Không tìm thấy trang',
unauthorized: 'Không được phép',
loginRequired: 'Vui lòng đăng nhập để tiếp tục',
networkError: 'Lỗi mạng',
checkConnection: 'Vui lòng kiểm tra kết nối internet của bạn',
invalidInput: 'Dữ liệu nhập không hợp lệ',
requiredField: 'Trường này là bắt buộc',
},
time: {
today: 'Hôm nay',
yesterday: 'Hôm qua',
tomorrow: 'Ngày mai',
thisWeek: 'Tuần này',
nextWeek: 'Tuần sau',
thisMonth: 'Tháng này',
justNow: 'Vừa xong',
minutesAgo: '{{count}} phút trước',
hoursAgo: '{{count}} giờ trước',
daysAgo: '{{count}} ngày trước',
},
spotDetail: {
postedBy: 'Đăng bởi',
getDirections: 'Chỉ đường',
reviews: 'Đánh giá',
noReviews: 'Chưa có đánh giá',
beFirstReview: 'Hãy là người đầu tiên đánh giá Spot này!',
writeReview: 'Viết đánh giá',
submitReview: 'Gửi đánh giá',
rating: 'Xếp hạng',
reviewPlaceholder: 'Chia sẻ trải nghiệm của bạn tại Spot này...',
relatedSpots: 'Spot gần đây',
},
eventDetail: {
organizedBy: 'Tổ chức bởi',
eventInfo: 'Thông tin sự kiện',
location: 'Địa điểm',
dateTime: 'Ngày & Giờ',
price: 'Giá',
attendeeCount: '{{count}} người tham gia',
interested: 'Quan tâm',
going: 'Sẽ tham gia',
notGoing: 'Không tham gia',
share: 'Chia sẻ sự kiện',
},
venueAccess: {
title: 'Thẻ ra vào',
desc: 'Phát một thẻ đã ký cho người trượt để họ chứng minh quyền ra vào tại cửa — họ xuất trình thẻ và bất kỳ ai cũng có thể quét QR để xác minh.',
active: '{{count}} đang hoạt động',
revoked: '{{count}} đã thu hồi',
issue: 'Phát một thẻ',
verifyHint: 'Được xác minh bằng cách quét — không cần ứng dụng hay tài khoản để kiểm tra.',
publicTitle: 'Thẻ ra vào',
publicDesc: 'Địa điểm này phát thẻ ra vào. Quét thẻ của người trượt tại cửa để xác minh.',
badge: 'Thẻ',
sellerHint: 'Địa điểm của người bán này phát thẻ ra vào',
},
zaps: {
zapButton: 'Zap',
sendZap: 'Gửi Zap',
zapAmount: 'Số lượng Zap',
customAmount: 'Số tiền tùy chỉnh',
addMessage: 'Thêm tin nhắn (không bắt buộc)',
sending: 'Đang gửi...',
sent: 'Đã gửi Zap!',
failed: 'Zap thất bại',
received: 'Bạn đã nhận được một Zap!',
},
rewards: {
title: 'Phần thưởng',
yourPoints: 'Điểm của bạn',
earnPoints: 'Kiếm điểm',
redeemPoints: 'Đổi điểm',
leaderboard: 'Bảng xếp hạng',
achievements: 'Thành tích',
dailyTasks: 'Nhiệm vụ hàng ngày',
weeklyTasks: 'Nhiệm vụ hàng tuần',
},
errorsUi: {
slammedTitle: 'Ngã đau',
slammedBody: 'Có gì đó làm màn hình này gặp trục trặc. Tài khoản và dữ liệu của bạn vẫn an toàn — hãy để chúng tôi giúp bạn lăn bánh trở lại.',
tryAgain: 'Thử lại',
reloadApp: 'Tải lại ứng dụng',
pageSlammedTitle: 'Trang này bị ngã',
pageSlammedBody: 'Có gì đó trên màn hình này gặp trục trặc. Tài khoản và dữ liệu của bạn vẫn an toàn. Thường thì tải lại nhanh là xong.',
reload: 'Tải lại',
goBack: 'Quay lại',
},
backup: {
title: 'Lưu đăng nhập của bạn',
subtitle: 'Chỉ mất 10 giây — làm một lần thôi',
message: 'Mã khôi phục của bạn là cách duy nhất để quay lại tài khoản. Hãy lưu nó và bạn có thể đăng nhập trên bất kỳ thiết bị nào.',
warning: 'Nếu mất, sẽ không có cách đặt lại — không email, không khôi phục mật khẩu.',
backupNow: 'Lưu ngay',
confirmed: 'Tôi đã lưu rồi',
remindLater: 'Để sau',
},
bootUi: {
ariaLoading: 'Đang tải SkateSpots',
ariaReady: 'SkateSpots sẵn sàng',
ready: 'Sẵn sàng',
statusWaking: 'Đang đánh thức mạng lưới',
statusTuning: 'Đang điều chỉnh Relay',
statusPulling: 'Đang kéo các Spot',
statusDropping: 'Đang hạ cánh',
},
footer: {
vibedWith: 'Làm với cảm hứng cùng',
poweredBy: 'Vận hành bởi',
openSource: 'Mã nguồn mở',
contribute: 'Đóng góp',
decentralized: 'Phi tập trung',
communityOwned: 'Cộng đồng sở hữu',
},
role: {
owner: 'Chủ sở hữu',
admin: 'Quản trị viên',
organiser: 'Người tổ chức',
verifiedOwner: 'Chủ sở hữu đã xác minh',
},
nfc: {
write: 'Ghi vào thẻ NFC',
written: 'Đã ghi thẻ',
writtenDesc: 'Chạm thẻ vào điện thoại để mở trang xác minh.',
failed: 'Không thể ghi thẻ',
},
collectionUi: {
namePlaceholder: 'Chuyến đi Barcelona 2024',
descriptionPlaceholder: 'Những Spot yêu thích của tôi từ chuyến đi Barcelona...',
},
toastsUi: {
followingSuccess: 'Theo dõi thành công',
followingSuccessDesc: 'Người dùng này giờ đã ở trong mạng lưới của bạn',
followFailed: 'Theo dõi thất bại',
unfollowSuccess: 'Bỏ theo dõi thành công',
unfollowSuccessDesc: 'Đã xóa khỏi mạng lưới của bạn',
unfollowFailed: 'Bỏ theo dõi thất bại',
reportThanks: 'Cảm ơn — đã gửi để xem xét',
reportFailed: 'Không thể gửi báo cáo',
savedOffline: 'Đã lưu ngoại tuyến',
savedOfflineDesc: 'Chúng tôi sẽ tự động đăng khi bạn online trở lại.',
cacheCleaned: 'Đã dọn bộ nhớ đệm',
cacheCleanedDesc: 'Đã xóa {{count}} Spot cũ khỏi bộ nhớ đệm',
cacheCleared: 'Đã xóa bộ nhớ đệm',
cacheClearedDesc: 'Tất cả Spot đã lưu trong bộ nhớ đệm đã được xóa',
backOnline: 'Đã online trở lại',
backOnlineDesc: 'Đã gửi {{count}} hành động đã lưu.',
postQueued: 'Bài đăng đã xếp hàng',
postQueuedDesc: 'Bài đăng của bạn sẽ được đăng khi bạn online trở lại',
invalidIdentifier: 'Định danh không hợp lệ. Dùng npub1..., user@domain.com, hoặc khóa công khai hex',
notASpotThanks: 'Cảm ơn — đã gửi để xem xét',
notASpotThanksDesc: 'Không có gì để giận: điều này đánh dấu ghim là lạc đề để mọi người tự quyết định.',
notASpotFailed: 'Không thể gửi báo cáo',
pleaseTryAgain: 'Vui lòng thử lại.',
relayUnreachable: 'Không thể kết nối với Relay nào — kiểm tra kết nối và thử lại.',
loginToReport: 'Đăng nhập để báo cáo Spot.',
zapLoginRequired: 'Cần đăng nhập',
zapLoginRequiredDesc: 'Bạn phải đăng nhập để gửi Zap.',
zapEventNotFound: 'Không tìm thấy sự kiện',
zapEventNotFoundDesc: 'Không thể tìm thấy sự kiện để Zap.',
zapAuthorNotFound: 'Không tìm thấy tác giả',
zapAuthorNotFoundDesc: 'Không thể tìm thấy tác giả của mục này.',
zapSuccess: 'Zap thành công!',
zapSuccessNwcDesc: 'Bạn đã gửi {{amount}} sats qua NWC cho tác giả.',
zapSuccessDesc: 'Bạn đã gửi {{amount}} sats cho tác giả.',
zapStatusUnknown: 'Không rõ trạng thái thanh toán',
zapStatusUnknownDesc: 'Ví của bạn có thể vẫn đang xử lý Zap này. Kiểm tra ví trước khi thử lại — đừng trả hai lần.',
zapNwcFailed: 'Thanh toán NWC thất bại',
zapWeblnFailed: 'Thanh toán WebLN thất bại',
zapFallingBack: '{{error}}. Đang chuyển sang các phương thức thanh toán khác...',
zapFailed: 'Zap thất bại',
zapUnknownNwcError: 'Lỗi NWC không xác định',
zapUnknownWeblnError: 'Lỗi WebLN không xác định',
nwcInvalidUri: 'URI NWC không hợp lệ',
nwcInvalidUriDesc: 'Vui lòng kiểm tra chuỗi kết nối và thử lại.',
nwcExists: 'Kết nối đã tồn tại',
nwcExistsDesc: 'Ví này đã được kết nối.',
nwcConnected: 'Đã kết nối ví',
nwcConnectedDesc: 'Đã kết nối thành công với {{alias}}.',
nwcFailed: 'Kết nối thất bại',
nwcFailedDesc: 'Không thể kết nối với ví: {{error}}',
nwcUnknownError: 'Đã xảy ra lỗi không xác định',
nwcDisconnected: 'Đã ngắt kết nối ví',
nwcDisconnectedDesc: 'Kết nối ví đã được gỡ bỏ.',
deleteApproveAmber: 'Phê duyệt trong Amber',
deleteApproveAmberDesc: 'Amber sẽ mở — nhấn Phê duyệt để xác nhận xóa.',
deleteCancelled: 'Đã hủy',
deleteCancelledDesc: 'Bạn đã từ chối yêu cầu trong Amber.',
deleteCouldntSign: 'Không thể ký',
deletePublishing: 'Bước 2/2: Đang đăng…',
deletePublishingDesc: 'Đang gửi yêu cầu xóa tới các Relay.',
deleteStuck: 'Kẹt ở bước ĐANG ĐĂNG',
deleteStuckDesc: 'Bước Relay thất bại: {{error}}. Nó đã được ký ổn; Relay không xác nhận.',
stashMerged: 'Đã gộp thay đổi từ thiết bị khác',
stashMergedDesc: 'Stash của bạn đã được chỉnh sửa ở nơi khác — cả hai bộ thay đổi đều được giữ lại.',
statusUpdated: 'Đã cập nhật trạng thái!',
statusUpdatedDesc: 'Trạng thái trượt ván của bạn giờ đã hiển thị với người khác.',
statusFailed: 'Không thể đặt trạng thái',
statusCleared: 'Đã xóa trạng thái',
statusClearedDesc: 'Trạng thái của bạn đã được gỡ bỏ.',
statusClearFailed: 'Không thể xóa trạng thái',
nutzapEnabled: 'Đã bật nhận Nutzap',
nutzapEnabledDesc: 'Giờ bạn có thể nhận Zap ecash!',
nutzapSetupFailed: 'Thiết lập thất bại',
nutzapUnavailable: 'Không thể gửi Nutzap',
tokenReceived: 'Đã nhận token',
tokenReceivedDesc: 'Đã đổi token Cashu thành công!',
receiveFailed: 'Nhận thất bại',
invalidAmount: 'Số tiền không hợp lệ',
invalidAmountDesc: 'Vui lòng nhập một số tiền hợp lệ',
tokenCreated: 'Đã tạo token',
sendFailed: 'Gửi thất bại',
mintAdded: 'Đã thêm Mint',
mintAddedDesc: 'Đã thêm và tin cậy Mint thành công',
mintAddFailed: 'Không thể thêm Mint',
mintRemoved: 'Đã xóa Mint',
mintRemoveFailed: 'Không thể xóa Mint',
paymentReceived: 'Đã nhận thanh toán',
paymentReceivedDesc: 'Đã nhận thành công {{amount}} sats!',
paymentSent: 'Đã gửi thanh toán',
paymentSentDesc: 'Thanh toán Lightning đã hoàn tất thành công',
loginRequired: 'Cần đăng nhập',
loginToFollowFounder: 'Vui lòng đăng nhập để theo dõi người sáng lập',
alreadyFollowing: 'Đã theo dõi rồi',
alreadyFollowingDesc: 'Bạn đã theo dõi {{name}} rồi!',
couldNotComplete: 'Không thể hoàn tất thao tác đó',
tryAgainLower: 'Thử lại.',
couldNotLoadProfile: 'Không thể tải hồ sơ',
couldNotLoadProfileDesc: 'Kiểm tra kết nối internet và thử tải lại.',
undone: 'Đã hoàn tác',
undoneDesc: 'Trở lại trung lập — không ẩn, không bảo chứng.',
confirmed: 'Đã xác nhận',
confirmedDesc: 'Đã bảo chứng — mục này rời khỏi hàng đợi.',
hiddenToast: 'Đã ẩn',
couldNotUndo: 'Không thể hoàn tác',
couldNotConfirm: 'Không thể xác nhận',
deleteFailed: 'Xóa thất bại',
somethingWentWrong: 'Đã xảy ra lỗi',
},
seoUi: {
becomeBuilderTitle: 'Trở thành thợ xây - SkateSpots',
becomeBuilderDesc: 'Đăng dịch vụ xây dựng ramp, công viên và DIY của bạn — bạn xây gì, vật liệu và quy mô.',
tradesTitle: 'Giao dịch của tôi — SkateSpots',
tradesDesc: 'Quản lý giao dịch trên chợ, xác nhận và uy tín của bạn.',
eventsTitle: 'Sự kiện & Tour trượt ván - SkateSpots',
eventsDesc: 'Khám phá các sự kiện, cuộc thi, tour và buổi trượt ván gần bạn.',
editShopDesc: 'Chỉnh sửa Shop trượt ván của bạn.',
createTourDesc: 'Tổ chức các tour trượt ván - tour khám phá điểm ẩn địa phương, road trip quốc gia, phiêu lưu quốc tế, hoặc các cuộc thi phá hoại kiểu KOTR.',
deckDesignerTitle: 'Thiết kế ván — SkateSpots DIY',
deckDesignerDesc: 'Thiết kế đường viền skateboard hoặc longboard, rồi xuất bản mẫu in 1:1, SVG hoặc DXF — bao gồm độ lõm, mũi ván, khoảng cách bánh và lỗ truck.',
createEventTitle: 'Tạo sự kiện trượt ván - SkateSpots',
createEventDesc: 'Tạo một sự kiện trượt ván mới cho cộng đồng.',
editTourDesc: 'Chỉnh sửa tour trượt ván của bạn — cập nhật điểm dừng, ngày và chi tiết.',
walletTitle: 'Ví - SkateSpots',
walletDesc: 'Kết nối ví Lightning để gửi Zap cho các skater và người tạo Spot.',
becomePhotographerTitle: 'Trở thành nhiếp ảnh gia - SkateSpots',
becomePhotographerDesc: 'Tạo hồ sơ nhiếp ảnh trượt ván của bạn — máy ảnh, ống kính, ánh sáng và dịch vụ.',
newsletterTitle: 'Bản tin - SkateSpots',
newsletterDesc: 'Bản tin hàng tuần từ cộng đồng SkateSpots. Cập nhật ứng dụng, Spot mới, sự kiện và những người giữ cho trượt ván luôn sống động.',
homeTitle: 'SkateSpots - Khám phá địa điểm trượt ván trên toàn thế giới',
zapLeaderboardTitle: 'Bảng xếp hạng Zap - SkateSpots',
zapLeaderboardDesc: 'Những Spot trượt ván được Zap nhiều nhất và các thành viên cộng đồng ủng hộ chúng.',
adminReviewTitle: 'Hàng đợi duyệt — SkateSpots',
gearSwapTitle: 'Trao đổi Gear - SkateSpots',
gearSwapDesc: 'Mua & bán Gear trượt ván đã qua sử dụng với các skater khác. Ván, trucks, bánh xe, giày và hơn thế nữa.',
donateTitle: 'Quyên góp — SkateSpots',
donateDesc: 'Ủng hộ SkateSpots — Lightning, on-chain riêng tư (thanh toán im lặng), hoặc tài trợ xây dựng trên Angor.',
verifyCardTitle: 'Xác minh — SkateSpots',
verifyCardDesc: 'Xác minh thẻ SkateSpots hoặc thẻ ra vào.',
mapTitle: 'Bản đồ Spot trượt ván - SkateSpots',
mapDesc: 'Khám phá các Spot trượt ván trên khắp thế giới trên bản đồ tương tác của chúng tôi.',
diyTitle: 'DIY — Tự làm của bạn | SkateSpots',
diyDesc: 'Hướng dẫn, công cụ mở và bản thiết kế để tự làm skateboard, ramp và Spot bê tông của riêng bạn — cùng những người và địa điểm để làm điều đó.',
appShopTitle: 'Shop ứng dụng — SkateSpots',
becomeSkaterTitle: 'Tham gia Danh bạ Skater - SkateSpots',
becomeSkaterDesc: 'Tạo hồ sơ skater của bạn để cộng đồng có thể tìm thấy bạn.',
marketplaceTitle: 'Chợ - SkateSpots',
marketplaceDesc: 'Mua và bán Gear trượt ván trên Plebeian Market phi tập trung.',
becomeEditorTitle: 'Trở thành biên tập viên video - SkateSpots',
becomeEditorDesc: 'Tạo hồ sơ biên tập viên video trượt ván của bạn trên SkateSpots.',
amberCallbackTitle: 'Đăng nhập bằng Amber - SkateSpots',
amberCallbackDesc: 'Hoàn tất đăng nhập Amber (NIP-55) của bạn.',
supportersTitle: 'Người ủng hộ - SkateSpots',
supportersDesc: 'Cộng đồng giữ cho SkateSpots tồn tại — người ủng hộ, cộng tác viên, đối tác và bạn bè.',
becomeCoachTitle: 'Trở thành huấn luyện viên - SkateSpots',
becomeCoachDesc: 'Tạo hồ sơ huấn luyện viên trượt ván của bạn.',
riderCardTitle: 'Thẻ Skater — SkateSpots',
riderCardDesc: 'Tạo Giấy phép Skater hoặc Thẻ ra vào công viên SkateSpots có thể in của bạn.',
editEventDesc: 'Chỉnh sửa sự kiện trượt ván của bạn.',
createShopTitle: 'Thêm Shop trượt ván - SkateSpots',
createShopDesc: 'Thêm Shop trượt ván của bạn vào cộng đồng.',
deckCostTitle: 'Máy tính chi phí ván — SkateSpots DIY',
deckCostDesc: 'Tính toán chi phí làm một tấm ván — nhân công, thiết bị, vật liệu, thời gian xử lý, đóng gói và lợi nhuận — và một giá bán hợp lý.',
pyramidTitle: 'Xếp hạng Pyramid - SkateSpots',
pyramidDesc: 'Những người đóng góp hàng đầu và lãnh đạo cộng đồng.',
foodTitle: 'Đồ ăn gần Spot - SkateSpots',
foodDesc: 'Tìm nhà hàng, quán cà phê và lựa chọn đồ ăn gần các Spot trượt ván.',
createListingTitle: 'Đăng bán Gear - SkateSpots',
createListingDesc: 'Đăng bán Gear trượt ván hoặc tìm Gear bạn muốn mua.',
becomeFilmerTitle: 'Trở thành filmer - SkateSpots',
becomeFilmerDesc: 'Tạo hồ sơ quay phim trượt ván của bạn.',
skatersTitle: 'Skater - SkateSpots',
skatersDesc: 'Khám phá các skater trong cộng đồng SkateSpots. Duyệt theo phong cách, tư thế, trình độ và vị trí.',
communityStatsTitle: 'Thống kê cộng đồng — SkateSpots',
communityStatsDesc: 'Số liệu cộng đồng trực tiếp của SkateSpots — Spot, sự kiện, huấn luyện viên, filmer, biên tập viên, tour và tăng trưởng theo thời gian. Lấy trực tiếp từ Nostr.',
labTitle: 'The Lab - SkateSpots',
labDesc: 'Tìm huấn luyện viên, filmer, nhiếp ảnh gia và biên tập viên video trượt ván.',
stashTitle: 'Stash của tôi - SkateSpots',
stashDesc: 'Quản lý kho Gear riêng tư của bạn. Theo dõi những gì bạn sở hữu, muốn bán hoặc trao đổi.',
bountyLeaderboardTitle: 'Lập bản đồ & Kiếm thưởng - SkateSpots',
bountyLeaderboardDesc: 'Lập bản đồ Spot trượt ván và Shop, kiếm Zap từ cộng đồng. Xem những người đóng góp hàng đầu.',
spotCollectionsTitle: 'Bộ sưu tập Spot của tôi - SkateSpots',
spotCollectionsDesc: 'Sắp xếp các Spot trượt ván yêu thích của bạn thành các bộ sưu tập cá nhân hóa',
mintsTitle: 'Cashu Mints — SkateSpots',
mintsDesc: 'Duyệt các Cashu mint, kiểm tra tình trạng và thêm một cái vào ví của bạn.',
},
miscUi: {
openingCamera: 'Đang mở camera…',
usePhoneCamera: 'Dùng camera điện thoại, rồi quay lại đây',
startingCamera: 'Đang khởi động camera...',
cameraAccessRequired: 'Cần quyền truy cập camera',
cameraAccessHint: 'Cho phép truy cập camera trong cài đặt trình duyệt, hoặc dùng trình chọn tệp bên dưới.',
cameraErrorTitle: 'Lỗi camera',
cameraErrorDesc: 'Không thể mở camera. Vui lòng kiểm tra quyền ứng dụng trong Cài đặt.',
cameraDeniedTitle: 'Quyền truy cập camera bị từ chối',
cameraDeniedDesc: 'Vui lòng cho phép truy cập camera trong cài đặt trình duyệt.',
uploadFromGallery: 'Tải lên từ thư viện',
uploading: 'Đang tải lên...',
usePhoto: 'Dùng ảnh',
earningPotential: 'Tiềm năng kiếm thưởng',
qualityExcellent: 'Xuất sắc!',
qualityGood: 'Tốt',
qualityBasic: 'Cơ bản',
qualityGettingStarted: 'Mới bắt đầu',
qualityLocationAdded: 'Đã thêm vị trí',
qualityOnePhoto: 'Ít nhất 1 ảnh',
qualityThreePhotos: '3+ ảnh',
qualityMoreAngles: 'Nhiều góc hơn = tốt hơn',
qualityDescription: 'Mô tả',
qualityDetailedDesc: 'Mô tả chi tiết (100+ ký tự)',
qualityContact: 'Thông tin liên hệ',
qualityPhoneOrWebsite: 'Điện thoại hoặc trang web',
qualityHours: 'Giờ mở cửa',
qualitySpotType: 'Đã chọn loại Spot',
failedToLoadComments: 'Không thể tải bình luận',
commentsTitle: 'Bình luận',
noCommentsYet: 'Chưa có bình luận nào',
beFirstComment: 'Hãy là người đầu tiên chia sẻ suy nghĩ của bạn!',
removeMember: 'Xóa thành viên',
whoIsThisFor: 'Hồ sơ này dành cho ai?',
individual: 'Cá nhân',
individualDesc: 'Một người',
collective: 'Tập thể',
collectiveDesc: 'Crew, studio hoặc công ty',
membersLabel: 'Thành viên',
dismissReport: 'Bỏ qua báo cáo',
reportedBy: 'báo cáo bởi',
completingLoginAmber: 'Đang hoàn tất đăng nhập bằng Amber...',
entityMembersHint: 'Thêm tài khoản Nostr của Crew bạn. Mỗi thành viên xác nhận Spot của riêng họ bằng khóa của mình — cho đến lúc đó họ hiển thị là “đang chờ”.',
entityVerifiedHint: 'Tư cách thành viên được xác minh theo từng thành viên — không ai có thể được thêm vào Crew của bạn mà không xác nhận từ tài khoản của chính họ.',
entityInvalidPubkey: 'Nhập npub, nprofile, hoặc khóa công khai hex 64 ký tự hợp lệ.',
entityAlreadyAdded: 'Thành viên đó đã được thêm rồi.',
offline: 'Ngoại tuyến',
connected: 'Đã kết nối',
offlineMode: 'Chế độ ngoại tuyến',
allFeaturesAvailable: 'Tất cả tính năng đều khả dụng',
browsingCachedSpots: 'Đang duyệt các Spot đã lưu đệm',
queuedActions: '{{count}} hành động đang chờ',
syncing: 'Đang đồng bộ',
publishingWhenStable: 'Sẽ đăng khi kết nối ổn định...',
willPublishOnline: 'Sẽ được đăng khi online trở lại',
availableOffline: 'Khả dụng ngoại tuyến:',
offlineBrowseSpots: 'Duyệt các Spot đã xem trước đó',
offlineViewDetails: 'Xem chi tiết Spot đã lưu đệm',
offlineKeepActing: 'Cứ tiếp tục — bài đăng, RSVP, tin đăng và tin nhắn sẽ được xếp hàng và gửi khi bạn kết nối lại',
},
sasquatchGuide: {
homeTitle: 'Chào mừng đến với SkateSpots! 🦧',
homeMessage: 'Yo, tôi là The Sasquatch. Người giữ ván, đường mòn và những chuyến đi hoang dã. Chào mừng đến với thế giới trượt ván hoang dã trên Nostr—không vest, không quảng cáo, chỉ có những skater tự vẽ con đường riêng. Ở đây, bạn sở hữu kỹ thuật của mình, dữ liệu của mình, và thậm chí kiếm Bitcoin khi để lại dấu ấn. Kết nối với các skater trong khu bạn hoặc trên khắp thế giới. Không luật lệ nào ngoài trượt ván, không dấu chân nào ngoài của bạn.',
homeQ1: 'Lên kế hoạch 3 ngày ở Barcelona cho tôi',
homeQ2: 'Tìm Spot cho người mới',
homeQ3: 'Có sự kiện nào sắp tới không?',
homeQ4: 'Thống kê cộng đồng',
homeQ5: 'Tìm huấn luyện viên gần tôi',
homeQ6: 'Có Gear để bán không?',
homeQ7: 'Nostr là gì?',
homeQ8: 'Cái này miễn phí không?',
homeLearnMore: 'Tìm hiểu thêm',
onboardingTitle: 'Bắt đầu 🚀',
onboardingMessage: 'Để tôi giúp bạn hiểu những điều cơ bản! Nostr là danh tính của bạn, Bitcoin Lightning cho phép bạn kiếm sats từ đóng góp, và Zap là tiền tip tức thì. Hỏi tôi bất cứ điều gì về cách bắt đầu!',
onboardingQ1: 'Làm sao để đăng nhập?',
onboardingQ2: 'Nostr là gì?',
onboardingQ3: 'Nostr hoạt động thế nào?',
onboardingQ4: 'Cashu là gì?',
onboardingQ5: 'Làm sao dùng ví Cashu?',
onboardingQ6: 'Mints là gì?',
onboardingQ7: 'Zap là gì?',
onboardingQ8: 'NWC là gì?',
onboardingStart: 'Bắt đầu khám phá',
onboardingLogin: 'Đăng nhập để bắt đầu',
labTitle: 'Chào mừng đến với The Lab! 🎓',
labMessage: 'Đây là nơi điều kỳ diệu xảy ra! Tìm huấn luyện viên có thể dạy bạn mọi thứ từ kickflip đến darkslide, hoặc kết nối với filmer để ghi lại những buổi trượt đỉnh nhất. Lọc theo kỹ năng, xem kinh nghiệm của họ và đặt buổi học. Nhớ nhé - ai cũng từng bắt đầu từ đâu đó!',
labQ1: 'Tìm huấn luyện viên',
labQ2: 'Tìm filmer',
labQ3: 'Tìm nhiếp ảnh gia',
labQ4: 'Tìm biên tập viên video',
labQ5: 'Tìm thợ xây ramp',
labQ6: 'The Lab là gì?',
labQ7: 'Builder là gì?',
labQ8: 'Làm sao để cung cấp dịch vụ huấn luyện?',
labLogin: 'Đăng nhập để cung cấp dịch vụ',
crewsTitle: 'Crew 🤘',
crewsMessage: 'Crew là gia đình trượt ván gắn với bản đồ của bạn — những người bạn trượt CÙNG, không phải người bạn thuê. Mỗi Crew có sân nhà trên bản đồ, Spot nhà, thành viên và tuyên ngôn. Thành viên xác nhận bằng khóa của chính họ, nên danh sách là chính danh. Hãy lập Crew của riêng bạn hoặc tìm những người bạn của mình!',
crewsQ1: 'Crew là gì?',
crewsQ2: 'Làm sao để lập Crew?',
crewsQ3: 'Crew khác gì The Lab?',
crewsQ4: 'Thành viên xác nhận thế nào?',
crewsQ5: 'Nostr là gì?',
crewsQ6: 'Zap hoạt động thế nào?',
crewsLogin: 'Đăng nhập để tạo Crew',
},
supportUi: {
keepMapFree: 'Giữ bản đồ miễn phí',
keepMapFreeDesc: 'Không quảng cáo, không theo dõi, không VC. Sats của bạn trả cho hosting, node AI và Relay.',
thankYou: 'Cảm ơn bạn! ⚡',
satsKeepMapFree: 'Sats của bạn giữ bản đồ miễn phí.',
keptFreeNext: 'Bạn vừa giữ SkateSpots miễn phí cho skater tiếp theo.',
scanToPay: 'Quét để thanh toán',
zapSkateSpots: 'Zap SkateSpots',
payQuietly: 'Thanh toán im lặng',
pickAmount: 'Chọn một số tiền',
enterAmount: 'Nhập số sats bạn muốn gửi.',
couldNotStartPayment: 'Không thể bắt đầu thanh toán.',
customAmountAria: 'Số tiền tùy chỉnh bằng sats',
commentPlaceholder: 'Nói gì đó (không bắt buộc — chỉ Zap công khai)',
publicZapTitle: 'Zap công khai kèm bình luận của bạn',
loginToZapTitle: 'Đăng nhập để gửi Zap công khai',
anonymousTitle: 'Ẩn danh — không đăng nhập, không lưu lại',
copyLightningTitle: 'Sao chép địa chỉ Lightning',
copiedSuffix: 'Đã sao chép {{label}}',
invoiceLabel: 'Hóa đơn',
addressLabel: 'Địa chỉ',
notAPurchase: 'Ủng hộ, không phải mua hàng — nó không mua gì và không có hoàn tiền. Hàng hóa và Sasquatch Pro là riêng biệt. Vị trí và danh tính của bạn không bao giờ liên quan đến một khoản thanh toán im lặng.',
},
statusUi: {
quickStatus: 'Trạng thái nhanh',
skating: 'Đang trượt',
skatingDesc: 'Đang trượt ván',
filming: 'Đang quay phim',
filmingDesc: 'Đang quay kỹ thuật',
lookingForSesh: 'Tìm bạn trượt chung',
lookingForSeshDesc: 'Muốn trượt cùng người khác',
coaching: 'Đang huấn luyện',
coachingDesc: 'Đang dạy/huấn luyện',
chilling: 'Đang thư giãn',
chillingDesc: 'Đang ở Spot chơi',
onMyWay: 'Đang trên đường tới',
onMyWayDesc: 'Đang tới một Spot',
takingABreak: 'Đang nghỉ',
takingABreakDesc: 'Nghỉ ngơi/bổ sung nước',
doneForToday: 'Xong cho hôm nay',
doneForTodayDesc: 'Đã trượt xong',
},
};
export default viBatch7;

View file

@ -1,4 +1,631 @@
/** vi — batch 8. Filled by the translation pass; empty until then. */
const viBatch8 = {};
/**
* Vietnamese (Tiếng Việt) — batch 8: hardcoded-string sweep namespaces
* (deckCostUi, becomeRolesUi, weatherUi, skaterLabelsUi, notifyUi,
* legacyMiscUi).
*
* Skate/brand vocabulary follows the Vietnamese conventions: Deck, Trucks,
* Wheels, Bearings, Griptape, Spot, Park, Bowl, Vert, Crew, Stash, The Lab,
* sats, Nostr, Lightning, brand names and trick names stay English.
* `{{placeholders}}` are preserved verbatim.
*/
const viBatch8 = {
deckCostUi: {
presetPrompt: 'Đặt tên cho preset này',
presetDefaultName: 'Preset {{n}}',
summaryCopied: 'Đã sao chép bản tóm tắt',
couldNotCopy: 'Không thể sao chép',
resetConfirm: 'Đặt lại mọi thứ về giá trị ví dụ?',
logoTooLarge: 'Logo quá lớn (tối đa 500 KB)',
loginToFill: 'Đăng nhập để điền từ hồ sơ Nostr của bạn',
filledFromProfile: 'Đã điền từ hồ sơ Nostr của bạn',
warnRetailBelowOne: 'Mức markup bán lẻ dưới 1× — bạn sẽ bán lỗ.',
warnWholesaleAboveRetail: 'Markup bán buôn phải thấp hơn markup bán lẻ.',
warnZeroBoards: '{{count}} hàng dùng 0 deck — chi phí của hàng đó bị bỏ qua.',
warnFixedNoBoards: 'Đã đặt chi phí cố định hàng tháng nhưng số deck/tháng là 0, nên chi phí vận hành bị bỏ qua.',
warnNoMaterials: 'Không có chi phí vật liệu — thêm ít nhất một vật liệu.',
warnEquipmentOverhead: 'Thiết bị + chi phí chung chiếm hơn 60% chi phí — mô hình này giả định sản lượng cao; hãy kiểm tra số deck của bạn.',
warnOneBoard: 'Một số thiết bị được dàn trải trên một deck duy nhất — hãy tăng số deck để phân bổ.',
templateStarterName: 'Khởi đầu sở thích',
templateStarterBlurb: 'Một vài hàng, không có chi phí cố định',
templateShopName: 'Cửa hàng nhỏ',
templateShopBlurb: 'Bảng đầy đủ với tiền thuê & chi phí chung',
currency: 'Tiền tệ',
noCurrencyMatches: 'Không có tiền tệ nào khớp.',
ratesUnavailable: 'Tỷ giá trực tiếp không khả dụng — chuyển đổi chỉ đổi nhãn.',
liveRates: 'tỷ giá BTC trực tiếp · đã gồm sats',
chipCost: 'giá vốn',
chipSell: 'bán',
chipTotal: 'tổng',
startFrom: 'Bắt đầu từ',
advancedToggleHint: 'Hiện tỷ lệ và phế liệu theo từng công đoạn, thiết lập lô, thuế và đường cong chi phí theo số lượng',
advanced: 'Nâng cao',
simple: 'Đơn giản',
sectionLabor: 'Nhân công',
sectionEquipment: 'Thiết bị',
sectionOperations: 'Chi phí vận hành',
sectionMaterials: 'Vật liệu',
sectionProcesses: 'Chi phí công đoạn',
sectionPackaging: 'Đóng gói',
sectionMargins: 'Biên lợi nhuận',
subtotalLoaded: '{{value}}/giờ đã gồm phụ phí',
subtotalPerBoard: '{{value}}/deck',
hourlyRate: 'Lương theo giờ ({{unit}})',
labourBurden: 'Phụ phí nhân công (×)',
loadedRate: 'Lương đã gồm phụ phí',
loadedRateHintBefore: 'Lương đã gồm phụ phí = lương × phụ phí (thuế và bảo hiểm người sử dụng lao động trên nhân công). Tiền thuê và hóa đơn nằm ở mục ',
loadedRateHintAfter: ' — đừng tính chúng ở cả hai nơi.',
colEquipment: 'Thiết bị',
colCostUnit: 'Chi phí ({{unit}})',
colCost: 'Chi phí',
colSetupH: 'Thiết lập (giờ)',
colLifetimeBoards: 'Deck trong vòng đời',
colPerBoard: 'Mỗi deck',
colMaterial: 'Vật liệu',
colOrderUnit: 'Đặt hàng ({{unit}})',
colShipUnit: 'Vận chuyển ({{unit}})',
colBoardsOrder: 'Deck / đơn hàng',
colOrderM: 'Đặt hàng (m)',
colUnloadM: 'Dỡ hàng (m)',
colOrder: 'Đặt hàng',
colShipping: 'Vận chuyển',
colOrderMin: 'Đặt hàng (phút)',
colUnloadMin: 'Dỡ hàng (phút)',
colProcess: 'Công đoạn',
colTimeM: 'Thời gian (phút)',
colBoardsRun: 'Deck / lần chạy',
colRateHr: 'Tỷ lệ/giờ (0 = cửa hàng)',
colRateHrShort: 'Tỷ lệ/giờ',
colScrapPct: 'Phế liệu %',
colTimeMin: 'Thời gian (phút)',
colPackaging: 'Đóng gói',
colTimeBoardM: 'Thời gian/deck (phút)',
colTimeBoardMin: 'Thời gian/deck (phút)',
colMaterialsBoardUnit: 'Vật liệu/deck ({{unit}})',
colMaterialsBoard: 'Vật liệu/deck',
equipmentPerBoard: 'Thiết bị mỗi deck:',
materialsPerBoard: 'Vật liệu mỗi deck:',
processesPerBoard: 'Công đoạn mỗi deck:',
packagingPerBoard: 'Đóng gói mỗi deck:',
perBoard: 'Mỗi deck:',
addEquipment: 'Thêm thiết bị',
addMaterial: 'Thêm vật liệu',
addProcess: 'Thêm công đoạn',
addPackagingStep: 'Thêm bước đóng gói',
duplicate: 'Nhân bản',
remove: 'Xóa',
boardsPerMonth: 'Deck / tháng',
rentPerMonth: 'Tiền thuê / tháng',
utilitiesPerMonth: 'Tiện ích / tháng',
subscriptionsPerMonth: 'Đăng ký / tháng',
markup: 'Markup (×)',
wholesaleMarkup: 'Markup bán buôn (×)',
scrapWaste: 'Phế liệu / hao hụt (%)',
quantityDecks: 'Số lượng (deck)',
targetMonthlyProfit: 'Lợi nhuận hàng tháng mục tiêu ({{unit}})',
costNoPackaging: 'Chi phí / deck (không đóng gói)',
costWithPackaging: 'Chi phí / deck (có đóng gói)',
batchSetupHours: 'Thiết lập lô (giờ / lần chạy)',
batchSetupCost: 'Chi phí thiết lập lô ({{unit}} / lần chạy)',
taxVat: 'Thuế / VAT (%)',
quoteTax: 'Thuế báo giá',
includedInPrice: 'Đã gồm trong giá',
addedOnTop: 'Cộng thêm vào',
setupPerBoard: 'Thiết lập / deck',
marginNoteBefore: 'Markup {{markup}}× ≈ ',
grossMargin: 'biên lợi nhuận gộp {{pct}}%',
marginNoteAfter: ' · hao hụt {{waste}}% được dàn trải trên các deck đạt chuẩn.',
sellingPriceNoPackaging: 'Giá bán · không đóng gói',
sellingPriceWithPackaging: 'Giá bán · có đóng gói',
profitPerDeck: 'Lợi nhuận / deck',
wholesalePerDeck: 'Bán buôn / deck',
orderTotalQty: 'Tổng đơn hàng ({{qty}})',
orderTotal: 'Tổng đơn hàng',
breakeven: 'Hòa vốn',
breakevenPerMonth: '{{count}}/tháng',
targetDecksHint: 'Để đạt {{amount}}/tháng trên chi phí cố định, hãy bán {{decks}} deck/tháng.',
priceIncludesTax: 'Giá đã gồm thuế {{pct}}%: {{amount}} trong tổng số.',
plusTax: 'Cộng thuế {{pct}}%: {{amount}} → tổng {{total}}.',
costVsQuantity: 'Chi phí theo số lượng (thiết lập được phân bổ)',
deckOne: 'deck',
deckOther: 'deck',
perDeckSuffix: '/ deck',
orderSuffix: 'đơn hàng {{amount}}',
shippingNotIncluded: 'Không bao gồm phí vận chuyển đến người mua.',
clientQuoteDetails: 'Chi tiết báo giá khách hàng (cho PDF)',
fillFromProfileTitle: 'Điền tên, website, NIP-05, Lightning và npub từ hồ sơ Nostr của bạn',
fillFromProfile: 'Điền từ hồ sơ',
businessName: 'Tên doanh nghiệp / cửa hàng',
email: 'Email',
phone: 'Điện thoại',
website: 'Website',
address: 'Địa chỉ',
quoteNumber: 'Báo giá #',
nextNumber: 'Số tiếp theo',
validDays: 'Hiệu lực (ngày)',
nip05: 'NIP-05',
lightningAddress: 'Địa chỉ Lightning',
nostrNpub: 'Nostr (npub)',
depositPct: 'Đặt cọc trả trước (%)',
deliveryTerms: 'Điều khoản giao hàng (Incoterm, tùy chọn)',
paymentMethods: 'Phương thức thanh toán',
paymentTerms: 'Điều khoản thanh toán',
paymentDetails: 'Chi tiết thanh toán',
notesTerms: 'Ghi chú / điều khoản',
changeLogo: 'Đổi logo',
addLogo: 'Thêm logo',
incotermNone: 'Không',
incotermExw: 'EXW — người mua đến lấy tại người bán',
incotermFca: 'FCA — giao cho hãng vận tải của người mua',
incotermDap: 'DAP — giao đến địa chỉ người mua',
incotermDdp: 'DDP — đã giao, đã trả thuế',
payMethodCash: 'Tiền mặt',
payMethodLightning: 'Lightning',
payMethodCashu: 'Cashu',
payMethodBank: 'Chuyển khoản ngân hàng',
payMethodCard: 'Thẻ',
payMethodOther: 'Khác',
listDeckAtPrice: 'Đăng bán deck ở mức giá này',
getItMade: 'Đặt làm — tìm thợ đóng',
savePreset: 'Lưu preset',
load: 'Tải',
export: 'Xuất',
import: 'Nhập',
reset: 'Đặt lại',
deletePreset: 'Xóa preset',
exportPdfFull: 'PDF — bảng đầy đủ',
exportPdfQuote: 'PDF — báo giá khách hàng',
exportPng: 'Ảnh PNG',
exportXlsx: 'Bảng tính XLSX',
exportCsv: 'CSV (bảng tính)',
exportMarkdown: 'Markdown',
exportJson: 'JSON (sao lưu)',
exportCopySummary: 'Sao chép tóm tắt',
},
becomeRolesUi: {
artist: {
seoTitle: 'Trở thành Nhà thiết kế / Nghệ sĩ - SkateSpots',
seoDescription: 'Đăng thiết kế & nghệ thuật skate của bạn — hình deck, logo, poster, merch và hơn thế.',
heading: 'Nhà thiết kế / Nghệ sĩ',
tagline: 'Hình deck, logo, poster, merch — đưa nghệ thuật của bạn vào giới skate',
noun: 'nghệ sĩ',
rateLabel: 'Mức giá',
portfolioLabel: 'Liên kết hồ sơ / Cửa hàng',
sectionWhatYouMake: 'Bạn tạo ra gì',
sectionMedium: 'Chất liệu',
sectionSoftwareTools: 'Phần mềm & Công cụ',
deliverablesPlaceholder: 'ví dụ: tệp sẵn sàng in, tệp nguồn, hình deck',
turnaroundPlaceholder: 'ví dụ: 3–5 ngày',
},
graffiti: {
seoTitle: 'Cung cấp Graffiti / Tranh tường - SkateSpots',
seoDescription: 'Đăng tác phẩm graffiti & tranh tường của bạn — piece, mural, nghệ thuật công viên skate và hơn thế.',
heading: 'Nghệ sĩ Graffiti / Tranh tường',
tagline: 'Piece, mural, nghệ thuật công viên skate — sơn giới skate',
noun: 'nghệ sĩ graffiti',
rateLabel: 'Mức giá',
portfolioLabel: 'Liên kết hồ sơ (IG, web)',
sectionStyle: 'Phong cách',
sectionMedium: 'Chất liệu',
sectionWorkContext: 'Bối cảnh làm việc',
crewLabel: 'Graffiti Crew',
crewPlaceholder: 'Crew viết của bạn (tùy chọn)',
crewHelper: 'Tách biệt với Crew skate của bạn — những writer bạn cùng vẽ.',
surfacesPlaceholder: 'ví dụ: bê tông, gạch, tường được phép',
maxSizePlaceholder: 'ví dụ: tối đa 10 m',
},
musician: {
seoTitle: 'Thêm hồ sơ âm nhạc - SkateSpots',
seoDescription: 'Trượt ván và làm nhạc? Đăng ban nhạc hoặc dự án solo của bạn — thể loại, nhạc cụ và liên kết.',
heading: 'Nhạc sĩ / Ban nhạc',
tagline: 'Trượt ván và làm nhạc? Nhận đặt biểu diễn cho demo, jam & after-party',
noun: 'nhạc sĩ',
rateLabel: 'Giá đặt biểu diễn',
portfolioLabel: 'Liên kết website / EPK',
sectionGenre: 'Thể loại',
sectionInstruments: 'Nhạc cụ & Vai trò',
actLabel: 'Loại hình biểu diễn',
actPlaceholder: 'solo / band / dj / producer',
spotifyLabel: 'Spotify',
spotifyPlaceholder: 'https://open.spotify.com/…',
bandcampLabel: 'Bandcamp',
bandcampPlaceholder: 'https://…bandcamp.com',
soundcloudLabel: 'SoundCloud',
soundcloudPlaceholder: 'https://soundcloud.com/…',
youtubeLabel: 'YouTube',
youtubePlaceholder: 'https://youtube.com/…',
setLengthPlaceholder: 'ví dụ: 30–45 phút',
techRiderPlaceholder: 'ví dụ: PA, mic, backline',
},
judge: {
seoTitle: 'Làm giám khảo sự kiện skate - SkateSpots',
seoDescription: 'Đăng bản thân là giám khảo sự kiện skate — Game of S.K.A.T.E., best trick jam, cuộc thi, am series và các chặng world tour. Được đặt để điều hành sự kiện công bằng, đáng tin.',
heading: 'Giám khảo sự kiện skate',
tagline: 'Từ Game of S.K.A.T.E. trên mặt phẳng đến World Destruction Tour — điều hành công bằng, đáng tin',
noun: 'giám khảo',
rateLabel: 'Giá theo ngày / Phí',
portfolioLabel: 'Liên kết kho kết quả / hồ sơ',
sectionEventFormats: 'Hình thức sự kiện',
sectionSpecialty: 'Chuyên môn',
sectionLevelCircuit: 'Cấp độ / Hệ thống',
eventsJudgedLabel: 'Số sự kiện đã chấm',
eventsJudgedPlaceholder: 'ví dụ: 40+ cuộc thi, 3 chặng World Tour',
eventsJudgedHelper: 'Các sự kiện, cuộc thi hoặc tour đáng chú ý bạn từng điều hành.',
travelPlaceholder: 'ví dụ: khu vực / toàn quốc / quốc tế',
certificationsPlaceholder: 'ví dụ: khóa chấm thi quốc gia',
},
organizer: {
seoTitle: 'Tổ chức sự kiện skate - SkateSpots',
seoDescription: 'Đăng bản thân là nhà tổ chức sự kiện skate — street jam, best trick, cuộc thi, meetup, demo và các chặng tour. Được khám phá và đặt để điều hành buổi chơi.',
heading: 'Nhà tổ chức sự kiện',
tagline: 'Jam, cuộc thi, meetup & demo — tổ chức buổi chơi và gắn kết cộng đồng',
noun: 'nhà tổ chức',
rateLabel: 'Phí / Ngân sách sự kiện',
portfolioLabel: 'Liên kết sự kiện đã qua / kết quả',
sectionEventTypes: 'Loại sự kiện',
sectionWhatYouHandle: 'Bạn phụ trách gì',
sectionScale: 'Quy mô',
eventsHostedLabel: 'Số sự kiện đã tổ chức',
eventsHostedPlaceholder: 'ví dụ: 25 jam, 3 cuộc thi thành phố',
eventsHostedHelper: 'Các sự kiện, cuộc thi hoặc meetup đáng chú ý bạn từng tổ chức.',
insurancePlaceholder: 'ví dụ: đã gồm bảo hiểm trách nhiệm công cộng',
permitsPlaceholder: 'ví dụ: đã xử lý giấy phép chính quyền',
},
tattoo: {
seoTitle: 'Trở thành nghệ sĩ xăm - SkateSpots',
seoDescription: 'Đăng tác phẩm xăm của bạn cho giới skate — phong cách, flash, custom và hơn thế.',
heading: 'Nghệ sĩ xăm',
tagline: 'Mực cho giới skate — flash, custom, fine line & hơn thế',
noun: 'nghệ sĩ xăm',
rateLabel: 'Mức giá / Theo giờ',
portfolioLabel: 'Liên kết hồ sơ (IG, web)',
sectionStyles: 'Phong cách',
sectionMethod: 'Phương pháp',
studioLabel: 'Studio / Tiệm',
studioPlaceholder: 'Tên studio (tùy chọn)',
booksOpenLabel: 'Đang nhận đặt lịch',
booksOpenHelper: 'Bạn hiện có nhận đặt lịch không?',
depositPlaceholder: 'ví dụ: 50 EUR không hoàn lại',
minimumPlaceholder: 'ví dụ: 80 EUR',
},
trainer: {
seoTitle: 'Trở thành Huấn luyện viên / Vật lý trị liệu - SkateSpots',
seoDescription: 'Giúp người trượt ván khỏe mạnh — sức mạnh, linh hoạt, phòng chấn thương và hồi phục.',
heading: 'Huấn luyện viên / Vật lý trị liệu',
tagline: 'Sức mạnh, linh hoạt, phòng chấn thương & hồi phục cho người trượt ván',
noun: 'huấn luyện viên',
rateLabel: 'Mức giá / Buổi',
portfolioLabel: 'Liên kết hồ sơ / đặt lịch',
sectionFocus: 'Trọng tâm',
sectionInjuries: 'Chấn thương bạn xử lý',
sectionCredentialsSetting: 'Bằng cấp & Bối cảnh',
credentialsPlaceholder: 'ví dụ: BSc Vật lý trị liệu, CSCS…',
credentialsHelper: 'Liệt kê bằng cấp thật — người trượt ván tin vào chứng chỉ có thể xác minh.',
remoteLabel: 'Từ xa / Trực tuyến',
remoteHelper: 'Bạn có cung cấp huấn luyện hoặc tư vấn trực tuyến không?',
modalitiesPlaceholder: 'ví dụ: thao tác tay, S&C, châm cứu khô',
},
barber: {
seoTitle: 'Trở thành Thợ cắt tóc / Nhà tạo mẫu tóc - SkateSpots',
seoDescription: 'Đăng tiệm cắt tóc hoặc ghế của bạn cho giới skate — cắt, fade, tỉa râu, nhuộm và hơn thế. Được người trượt ván đặt lịch.',
heading: 'Thợ cắt tóc / Nhà tạo mẫu tóc',
tagline: 'Cắt, fade & tỉa râu cho giới skate — tại tiệm hoặc di động',
noun: 'thợ cắt tóc',
rateLabel: 'Giá / Lần cắt',
portfolioLabel: 'Liên kết thư viện ảnh / IG',
sectionWhatYouOffer: 'Bạn cung cấp gì',
sectionSignatureStyles: 'Phong cách đặc trưng',
sectionSetting: 'Bối cảnh',
studioLabel: 'Tiệm / Studio',
studioPlaceholder: 'Tên tiệm hoặc studio (tùy chọn)',
booksOpenLabel: 'Đang nhận đặt lịch',
booksOpenHelper: 'Bạn hiện có nhận đặt lịch không?',
durationPlaceholder: 'ví dụ: 30–45 phút',
},
},
weatherUi: {
condition: {
clearSky: 'Trời quang',
mainlyClear: 'Chủ yếu quang',
partlyCloudy: 'Có mây một phần',
overcast: 'U ám',
foggy: 'Có sương mù',
depositingRimeFog: 'Sương mù đọng giá',
lightDrizzle: 'Mưa phùn nhẹ',
moderateDrizzle: 'Mưa phùn vừa',
denseDrizzle: 'Mưa phùn dày',
lightFreezingDrizzle: 'Mưa phùn đóng băng nhẹ',
denseFreezingDrizzle: 'Mưa phùn đóng băng dày',
slightRain: 'Mưa nhẹ',
moderateRain: 'Mưa vừa',
heavyRain: 'Mưa to',
lightFreezingRain: 'Mưa đóng băng nhẹ',
heavyFreezingRain: 'Mưa đóng băng lớn',
slightSnow: 'Tuyết nhẹ',
moderateSnow: 'Tuyết vừa',
heavySnow: 'Tuyết dày',
snowGrains: 'Hạt tuyết',
slightRainShowers: 'Mưa rào nhẹ',
moderateRainShowers: 'Mưa rào vừa',
violentRainShowers: 'Mưa rào dữ dội',
slightSnowShowers: 'Mưa tuyết nhẹ',
heavySnowShowers: 'Mưa tuyết dày',
thunderstorm: 'Giông bão',
thunderstormSlightHail: 'Giông bão kèm mưa đá nhẹ',
thunderstormHeavyHail: 'Giông bão kèm mưa đá lớn',
unknown: 'Không xác định',
},
aqi: {
good: 'Tốt',
moderate: 'Trung bình',
unhealthySensitive: 'Có hại cho nhóm nhạy cảm',
unhealthy: 'Có hại cho sức khỏe',
veryUnhealthy: 'Rất có hại cho sức khỏe',
hazardous: 'Nguy hiểm',
},
skateability: {
perfect: 'Hoàn hảo',
good: 'Tốt',
okay: 'Tạm được',
poor: 'Kém',
bad: 'Xấu',
unrideable: 'Không thể trượt',
},
reason: {
currentlyRaining: 'Đang mưa',
raining: 'Mưa',
snowing: 'Đang có tuyết',
thunderstorm: 'Giông bão',
freezingTemperature: 'Nhiệt độ đóng băng',
veryCold: 'Rất lạnh',
extremelyHot: 'Cực nóng',
veryHot: 'Rất nóng',
veryStrongWind: 'Gió rất mạnh',
strongWind: 'Gió mạnh',
moderateWind: 'Gió vừa',
veryUnhealthyAir: 'Không khí rất có hại cho sức khỏe',
unhealthyAir: 'Không khí có hại cho sức khỏe',
moderateAirQuality: 'Chất lượng không khí trung bình',
veryHumid: 'Rất ẩm',
humid: 'Ẩm',
extremeUv: 'Tia UV cực cao - hãy dùng kem chống nắng',
highUv: 'Tia UV cao - nên bảo vệ da',
perfectConditions: 'Điều kiện trượt hoàn hảo',
},
},
skaterLabelsUi: {
stance: {
regular: 'Regular',
goofy: 'Goofy',
},
style: {
street: 'Street',
park: 'Park',
vert: 'Vert',
transition: 'Transition',
bowl: 'Bowl',
cruising: 'Cruising',
downhill: 'Downhill',
freestyle: 'Freestyle',
ledges: 'Ledges',
stairs: 'Stairs',
diy: 'DIY',
},
level: {
grom: 'Grom',
intermediate: 'Intermediate',
advanced: 'Advanced',
ripper: 'Ripper',
},
sponsor: {
title: 'Nhà tài trợ chính',
gold: 'Gold',
silver: 'Silver',
partner: 'Đối tác',
},
},
notifyUi: {
activity: {
zappedWithAmount: 'Bạn được zap {{sats}} sats',
zapped: 'Bạn được zap',
liked: 'Có người thích bài đăng của bạn',
reposted: 'Có người đăng lại bài của bạn',
mentioned: 'Có người nhắc đến bạn',
replied: 'Có người trả lời bạn',
rsvp: 'Có người RSVP sự kiện của bạn',
eventUpdated: 'Sự kiện bạn sắp tham dự đã được cập nhật',
newActivity: 'Hoạt động mới',
tapToOpen: 'Nhấn để mở SkateSpots',
},
crew: {
inviteTitle: 'Lời mời vào Crew',
inviteBody: 'Bạn được mời vào {{crew}}',
addedTitle: 'Bạn đã được thêm vào một Crew',
addedBody: '{{crew}} — xác nhận để tham gia',
joinRequestTitle: 'Yêu cầu tham gia',
joinRequestBody: 'Có người muốn tham gia {{name}}',
},
dm: {
title: 'Tin nhắn trực tiếp mới',
body: 'Nhấn để đọc',
},
trade: {
confirm: 'Xác nhận giao dịch',
confirmed: 'Giao dịch đã được xác nhận',
newOffer: 'Đề nghị mới cho tin đăng của bạn',
counter: 'Đề nghị đối ứng',
accepted: 'Đề nghị đã được chấp nhận 🎉',
declined: 'Đề nghị đã bị từ chối',
withdrawn: 'Đề nghị đã được rút',
},
newsletter: {
drop: 'Bản tin SkateSpots mới',
},
summary: {
moreUpdates: '{{count}} cập nhật nữa',
openToCatchUp: 'Mở SkateSpots để xem',
},
},
legacyMiscUi: {
hostingGoing: '{{count}} người tham dự',
hostingInterested: '{{count}} người quan tâm',
hostingPostUpdate: 'Đăng cập nhật',
hostingEdit: 'Chỉnh sửa',
hostingLoginToSee: 'Đăng nhập để xem các sự kiện bạn đang tổ chức.',
hostingEmptyTitle: 'Bạn chưa tổ chức sự kiện nào',
hostingEmptyBody: 'Tổ chức một jam, cuộc thi hoặc buổi chơi. Tạo sự kiện để người trượt ván có thể RSVP, nhận cập nhật và ghé qua.',
hostingCreateEvent: 'Tạo sự kiện',
hostingUpcoming: 'Sắp tới · {{count}}',
hostingPast: 'Đã qua · {{count}}',
sponsorPartners: 'Đối tác',
sponsorTitleSponsor: 'Nhà tài trợ chính',
sponsorPlatformPartners: 'Đối tác nền tảng',
reportsUntitled: '(không có tiêu đề)',
reportsResolveFailed: 'Không thể xác minh sự kiện bị báo cáo (có thể đã bị xóa, hoặc báo cáo nhắm vào hồ sơ chứ không phải bài đăng).',
reportsLookAtIt: 'Xem thử',
reportsNoReports: 'Chưa có báo cáo nào. Hoặc mọi thứ đều ổn, hoặc chưa ai tìm thấy nút báo cáo.',
statusSetYourStatus: 'Đặt trạng thái',
statusSetDesc: 'Cho người khác biết bạn đang làm gì. Trạng thái sẽ hiển thị trên hồ sơ và tại các Spot được liên kết.',
statusClear: 'Xóa',
statusOrWriteOwn: 'Hoặc tự viết',
statusCustomPlaceholder: 'Bạn đang làm gì?',
statusLinkToSpot: 'Liên kết tới một Spot (tùy chọn)',
statusSpotSelected: 'Đã chọn Spot',
statusSearchSpots: 'Tìm Spot...',
statusNoSpotsFound: 'Không tìm thấy Spot nào.',
statusSelectSpot: 'Chọn một Spot',
statusAutoClearAfter: 'Tự động xóa sau: {{time}}',
statusExpMin: '{{count}} phút',
statusExpOneHour: '1 giờ',
statusExpHours: '{{count}} giờ',
statusExpOneDay: '1 ngày',
statusExpDays: '{{count}} ngày',
statusSlider15: '15 phút',
statusSlider1h: '1 giờ',
statusSlider4h: '4 giờ',
statusSlider24h: '24 giờ',
statusSetting: 'Đang đặt trạng thái...',
statusSet: 'Đặt trạng thái',
statusSomethingWrong: 'Đã xảy ra lỗi',
seoProfileTitle: 'Hồ sơ - SkateSpots',
seoViewProfile: 'Xem hồ sơ.',
bannerAlt: 'Banner',
openInCordn: 'Mở trong Cordn',
modHelp: 'Ẩn sẽ đăng org.skatespots.moderation / hidden; Xác nhận sẽ đăng … / verified; Hoàn tác sẽ đăng … / cleared (trở về trung lập). Cả ba đều là nhãn công khai, có thể đảo ngược — không có gì bị xóa khỏi relay.',
zapNoActiveMint: 'Không tìm thấy mint Cashu đang hoạt động.',
altProfile: 'Hồ sơ',
altCardPreview: 'Xem trước thẻ',
altCard: 'Thẻ',
altCaptured: 'Đã chụp',
ariaPrevPhoto: 'Ảnh trước',
ariaNextPhoto: 'Ảnh tiếp theo',
ariaCommentOptions: 'Tùy chọn bình luận',
ariaMessageConversation: 'Cuộc trò chuyện tin nhắn',
exportTitle: 'SkateSpots — Máy tính chi phí deck',
exportQuoteTitle: 'BÁO GIÁ',
exportPngTitle: 'Chi phí deck',
exportMarkdownTitle: 'Máy tính chi phí deck',
exportSectionLabor: 'Nhân công',
exportSectionEquipment: 'Thiết bị',
exportSectionOperations: 'Chi phí vận hành',
exportSectionMaterials: 'Vật liệu',
exportSectionProcesses: 'Chi phí công đoạn',
exportSectionPackaging: 'Đóng gói',
exportSectionResult: 'Kết quả',
exportLabelOperations: 'Vận hành',
exportLabelProcesses: 'Công đoạn',
exportKvHourlyRate: 'Lương theo giờ',
exportKvLabourBurden: 'Phụ phí nhân công',
exportKvLoadedRate: 'Lương đã gồm phụ phí',
exportKvEquipmentPerBoard: 'Thiết bị mỗi deck',
exportKvBoardsPerMonth: 'Deck / tháng',
exportKvRentPerMonth: 'Tiền thuê / tháng',
exportKvUtilitiesPerMonth: 'Tiện ích / tháng',
exportKvSubscriptionsPerMonth: 'Đăng ký / tháng',
exportKvPerBoard: 'Mỗi deck',
exportKvMaterialsPerBoard: 'Vật liệu mỗi deck',
exportKvProcessesPerBoard: 'Công đoạn mỗi deck',
exportKvPackagingPerBoard: 'Đóng gói mỗi deck',
exportKvMarkup: 'Markup',
exportMarkupValue: '{{markup}}× (≈ biên lợi nhuận gộp {{pct}}%)',
exportKvWasteEffective: 'Hao hụt (thực tế)',
exportKvCostNoPack: 'Chi phí / deck (không đóng gói)',
exportKvCostWithPack: 'Chi phí / deck (có đóng gói)',
exportKvBatchSetupPerBoard: 'Thiết lập lô / deck',
exportKvTax: 'Thuế ({{pct}}%)',
exportKvTaxIncluded: 'Thuế ({{pct}}%, đã gồm)',
exportKvSellingNoPack: 'Giá bán (không đóng gói)',
exportKvSellingWithPack: 'Giá bán (có đóng gói)',
exportShippingNote: 'Không bao gồm phí vận chuyển đến người mua.',
exportGeneratedBy: 'Được tạo bởi SkateSpots · skate-spots.org',
exportGeneratedWith: 'Được tạo với SkateSpots · skate-spots.org',
exportDetailSetup: '+ {{hours}} giờ thiết lập',
exportDetailBoards: '{{boards}} deck',
exportDetailShip: '+ {{amount}} vận chuyển',
exportDetailMinutes: '{{minutes}} phút',
exportDetailPerBoards: '/ {{boards}} deck',
exportDetailScrap: '{{pct}}% phế liệu',
exportDetailMaterials: '{{materials}} vật liệu',
exportQuoteRef: 'Mã {{ref}}',
exportQuoteLineItem: 'Deck trượt ván tùy chỉnh',
exportQuoteLineItemQty: 'Deck trượt ván tùy chỉnh × {{qty}}',
exportQuoteLineDesc: 'Đóng thủ công, hoàn thiện và đóng gói. Số lượng 1.',
exportQuoteLineDescQty: 'Đóng thủ công, hoàn thiện và đóng gói. {{price}} mỗi cái.',
exportQuoteSubtotal: 'Tạm tính',
exportQuoteSubtotalQty: 'Tạm tính ({{qty}} deck)',
exportQuoteTax: 'Thuế / VAT ({{pct}}%)',
exportQuoteTotal: 'Tổng cộng',
exportQuoteTotalQty: 'Tổng cộng ({{qty}} deck)',
exportQuoteIncludesTax: 'Đã gồm thuế {{pct}}% ({{amount}})',
exportQuoteDeposit: 'Đặt cọc trả ngay ({{pct}}%)',
exportQuoteBalance: 'Số còn lại khi hoàn thành',
exportQuotePayment: 'Thanh toán: {{value}}',
exportQuoteLightning: 'Lightning: {{value}}',
exportQuoteDetails: 'Chi tiết: {{value}}',
exportQuoteTerms: 'Điều khoản: {{value}}',
exportQuoteDelivery: 'Giao hàng: {{value}}',
exportQuoteValidUntil: 'Không bao gồm phí vận chuyển. Báo giá có hiệu lực đến {{date}}.',
exportPngSellingWith: 'GIÁ BÁN · CÓ ĐÓNG GÓI',
exportPngSellingNo: 'GIÁ BÁN · KHÔNG ĐÓNG GÓI',
exportPngCostWith: 'CHI PHÍ / DECK (CÓ ĐÓNG GÓI)',
exportPngDeposit: 'Đặt cọc {{pct}}%: {{amount}}',
exportXlsxSummary: 'Tóm tắt',
exportXlsxCurrency: 'Tiền tệ',
exportXlsxDate: 'Ngày',
exportXlsxOperationsPerBoard: 'Vận hành mỗi deck',
exportColCost: 'Chi phí',
exportColSetupH: 'Thiết lập (giờ)',
exportColBoards: 'Deck',
exportColPerBoard: 'Mỗi deck',
exportColMaterial: 'Vật liệu',
exportColOrderCost: 'Chi phí đặt hàng',
exportColShipping: 'Vận chuyển',
exportColOrderMin: 'Đặt hàng (phút)',
exportColUnloadMin: 'Dỡ hàng (phút)',
exportColProcess: 'Công đoạn',
exportColTimeMin: 'Thời gian (phút)',
exportColTimeBoardMin: 'Thời gian/deck (phút)',
exportColMaterialsBoard: 'Vật liệu/deck',
exportCopyTitle: 'Chi phí deck — {{currency}}',
exportCopyCostWith: 'Chi phí / deck (có đóng gói): {{amount}}',
exportCopySellingNo: 'Giá bán (không đóng gói): {{amount}}',
exportCopySellingWith: 'Giá bán (có đóng gói): {{amount}}',
exportCopyBreakdown: 'Thiết bị {{equipment}} · Vận hành {{operations}} · Vật liệu {{materials}} · Công đoạn {{processes}} · Đóng gói {{packaging}}',
exportMdHourlyRate: 'Lương theo giờ: {{value}}',
exportMdLabourBurden: 'Phụ phí nhân công: {{value}}',
exportMdLoadedRate: 'Lương đã gồm phụ phí: {{value}}',
exportMdBoardsPerMonth: 'Deck/tháng: {{value}}',
exportMdRent: 'Tiền thuê: {{value}}',
exportMdUtilities: 'Tiện ích: {{value}}',
exportMdSubscriptions: 'Đăng ký: {{value}}',
exportMdPerBoard: 'Mỗi deck: {{value}}',
exportMdMarkupWaste: 'Markup: {{markup}}× (≈ biên lợi nhuận gộp {{pct}}%) · Hao hụt: {{waste}}%',
exportMdCostNoPack: 'Chi phí/deck (không đóng gói): {{value}}',
exportMdCostWithPack: 'Chi phí/deck (có đóng gói): {{value}}',
exportMdBatchSetup: 'Thiết lập lô/deck: {{value}}',
exportMdSellingNo: 'Giá bán (không đóng gói): {{value}}',
exportMdSellingWith: 'Giá bán (có đóng gói): {{value}}',
exportMdDisclaimer: 'Không bao gồm phí vận chuyển đến người mua. Được tạo bởi SkateSpots.',
},
};
export default viBatch8;

View file

@ -38,6 +38,7 @@ const COMMON_LANGUAGES = [
{ code: 'ja', label: 'Japanese', flag: '🇯🇵' },
{ code: 'zh-CN', label: 'Chinese (Simplified)', flag: '🇨🇳' },
{ code: 'zh-TW', label: 'Chinese (Traditional)', flag: '🇹🇼' },
{ code: 'vi', label: 'Vietnamese', flag: '🇻🇳' },
{ code: 'tr', label: 'Turkish', flag: '🇹🇷' },
{ code: 'zh', label: 'Chinese', flag: '🇨🇳' },
];