Files
TREK/shared/src/i18n/vi/collection.ts
T
Maurice 2c06c9904b feat(collections): a list as a file, so it can leave the instance (#2198)
Sharing a list works between people on the same TREK. This is the other
case: giving one to somebody who runs their own, or keeping a copy. Export
sits beside Edit and Share in the list header and downloads the open list;
Import sits beside New list in the rail, reads a file, shows what is in it
and makes a new list of it. Desktop only, which the route already decides.

What travels is what somebody wrote down: the list's name, colour and
description, its labels, and each place with its address, coordinates,
notes, status, contact details, category name and labels. A file is dull
JSON on purpose, so it can be read and edited by a person.

What does not travel is everything that only means something on the instance
it came from. Ids of every kind, since the receiver issues its own and a
category crosses over by name. Star ratings and members, because a rating is
an opinion somebody gave the people on that list. Provenance into trips,
which points at rows the receiver cannot see. And an image path under
/uploads, which resolves on the sender's server: only an absolute https URL
survives.

A file is a stranger's JSON and is read as one. It is parsed in the browser
that chose it and never uploaded; the parsed list goes through the same
contract on both sides; and a link that is not http(s) arrives as nothing
rather than as an anchor. Strict where it must refuse, forgiving where it
can drop: a file that does not say what it is never reaches the importer,
while one unreadable place inside it is skipped and counted, and one bad
field on a good place costs that field alone.

An import is always a new list. Importing into an existing one would mean
deciding what happens to a place that is already there, and every answer to
that is a merge nobody asked for.
2026-09-11 14:58:34 +02:00

211 lines
12 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { TranslationStrings } from '../types';
const collection: TranslationStrings = {
'collections.saveNToList': 'Lưu {count} vào danh sách',
'collections.addedNToList': 'Đã lưu {count} vào {name}',
'collections.noOwnLists': 'Bạn chưa có danh sách nào',
'collections.saveToListHint': 'Các mục trùng lặp được bỏ qua tự động',
'collections.role.label': 'Vai trò',
'collections.role.viewer': 'Người xem',
'collections.role.editor': 'Người sửa',
'collections.role.admin': 'Quản trị',
'collections.picker.allLists': 'Tất cả danh sách',
'collections.select': 'Chọn',
'collections.selectAll': 'Chọn tất cả',
'collections.deselectAll': 'Bỏ chọn tất cả',
'collections.moveToList': 'Chuyển vào danh sách',
'collections.duplicateToList': 'Sao chép vào danh sách',
'collections.moveToListTitle': 'Chuyển {count} sang danh sách khác',
'collections.duplicateToListTitle': 'Sao chép {count} sang danh sách khác',
'collections.noOtherLists': 'Chưa có danh sách nào khác',
'collections.movedCount': 'Đã chuyển {count} địa điểm',
'collections.duplicatedCount': 'Đã sao chép {count} địa điểm',
'collections.placeCount': '{count} địa điểm',
'collections.category': 'Danh mục',
'collections.noCategory': 'Không có danh mục',
'collections.editListTitle': 'Chỉnh sửa danh sách',
'collections.coverImage': 'Ảnh bìa',
'collections.addCover': 'Thêm ảnh bìa',
'collections.changeCover': 'Đổi ảnh bìa',
'collections.description': 'Mô tả',
'collections.descriptionPlaceholder': 'Thêm mô tả…',
'collections.links': 'Liên kết',
'collections.linkLabel': 'Nhãn',
'collections.addLink': 'Thêm liên kết',
'collections.addDetails': 'Thêm chi tiết',
'collections.addPlace': 'Thêm địa điểm',
'collections.addPlaceSearch': 'Tìm địa điểm…',
'collections.addPlaceHint': 'Tìm để thêm địa điểm vào danh sách này',
'collections.importFromTrip': 'Nhập từ một chuyến đi',
'collections.importTitle': 'Nhập từ một chuyến đi',
'collections.importDoneTitle': 'Đã nhập xong',
'collections.importPickTripHint': 'Chọn một chuyến đi và mang các địa điểm của nó vào {name}.',
'collections.importNoTrips': 'Chưa có chuyến đi nào',
'collections.importPlacesCount': '{count} địa điểm',
'collections.importSearchPlaces': 'Tìm địa điểm…',
'collections.importOnlyNew': 'Chỉ cái mới',
'collections.importSelectAll': 'Chọn tất cả',
'collections.importClearSelection': 'Bỏ chọn',
'collections.importAlreadySaved': 'Đã lưu rồi',
'collections.importUnscheduled': 'Chưa xếp ngày',
'collections.importOnDay': 'Ngày {count}',
'collections.importSelectedCount': 'Đã chọn {count}',
'collections.importAction': 'Nhập {count}',
'collections.importEmptyTrip': 'Chuyến đi này chưa có địa điểm nào',
'collections.importNothingNew': 'Mọi thứ trong chuyến đi này đã có trong danh sách',
'collections.importDone': 'Đã thêm {count} địa điểm',
'collections.importDoneSkipped': '{count} đã có sẵn trong danh sách và được giữ nguyên',
'collections.importDoneClean': 'Giờ tất cả đều nằm trong {name}',
'collections.sort.default': 'Mặc định',
'collections.sort.nameAsc': 'Tên (A–Z)',
'collections.coordinates': 'Tọa độ',
'collections.showList': 'Hiện danh sách',
'collections.expandMap': 'Mở rộng bản đồ',
'collections.hero.mine': 'Bộ sưu tập của tôi',
'collections.hero.shared': 'Được chia sẻ với bạn',
'collections.hero.all': 'Thư viện của bạn',
'collections.title': 'Bộ sưu tập',
'collections.subtitle': 'Những địa điểm bạn đã lưu, sắp xếp thành danh sách',
'collections.newList': 'Danh sách mới',
'collections.create': 'Tạo',
'collections.editList': 'Đổi tên',
'collections.listMenu': 'Tùy chọn danh sách',
'collections.deleteList': 'Xóa danh sách',
'collections.deleteListConfirm':
'Thao tác này xóa vĩnh viễn danh sách và tất cả địa điểm đã lưu trong đó. Không thể hoàn tác.',
'collections.listName': 'Tên danh sách',
'collections.listNamePlaceholder': 'vd. Tokyo 2025',
'collections.listColor': 'Màu',
'collections.allSaved': 'Tất cả đã lưu',
'collections.shared': 'Được chia sẻ',
'collections.empty.title': 'Chưa có địa điểm nào',
'collections.empty.text': 'Lưu địa điểm từ bất kỳ chuyến đi nào để xây dựng danh sách này.',
'collections.empty.noMatchTitle': 'Không có kết quả',
'collections.empty.noMatchText': 'Không có địa điểm đã lưu nào khớp với bộ lọc hoặc tìm kiếm của bạn.',
'collections.empty.firstTitle': 'Bắt đầu bộ sưu tập đầu tiên của bạn',
'collections.empty.firstText': 'Tạo một danh sách để lưu những địa điểm bạn muốn ghi nhớ qua các chuyến đi.',
'collections.view.grid': 'Lưới',
'collections.view.list': 'Danh sách',
'collections.view.map': 'Bản đồ',
'collections.status.idea': 'Ý tưởng',
'collections.status.want': 'Muốn đến',
'collections.status.visited': 'Đã đến',
'collections.status.filterAll': 'Tất cả',
'collections.status.cycleHint': 'chạm để thay đổi',
'collections.markVisited': 'Đánh dấu đã đến',
'collections.markVisitedAll': 'Đã đến ở mọi danh sách',
'collections.markVisitedSelection': 'Đánh dấu đã đến trong danh sách của bạn',
'collections.markVisitedNone': 'Không có địa điểm nào trong số này được lưu vào danh sách',
'collections.markedVisited': 'Đã đánh dấu là đã đến',
'collections.markedVisitedTrip': 'Đã đánh dấu {count} địa điểm là đã đến',
'collections.copyToTrip': 'Sao chép vào chuyến đi',
'collections.copyToTripTitle': 'Sao chép vào chuyến đi',
'collections.copyN': 'Sao chép {count} vào chuyến đi',
'collections.copyToTripSearch': 'Tìm chuyến đi',
'collections.searchLists': 'Tìm danh sách',
'collections.copyToTripConfirm': 'Sao chép',
'collections.noTrips': 'Chưa có chuyến đi nào',
'collections.alreadyInTrip': 'Đã có trong chuyến đi này',
'collections.copied': 'Đã sao chép vào chuyến đi',
'collections.copiedCount': 'Đã sao chép {count} địa điểm',
'collections.skippedDuplicates': 'Đã bỏ qua {count} mục trùng lặp',
'collections.copyNothing': 'Không có gì để sao chép',
'collections.removeFromList': 'Xóa khỏi danh sách',
'collections.removeFromListConfirm': 'Xóa địa điểm này khỏi danh sách?',
'collections.removeFromCollection': 'Xóa khỏi Bộ sưu tập',
'collections.saved': 'Đã lưu vào {name}',
'collections.savedUndo': 'Hoàn tác',
'collections.viewInCollection': 'Xem',
'collections.duplicateWarning': 'Địa điểm này đã có trong danh sách',
'collections.search': 'Tìm địa điểm',
'collections.selectMode': 'Chọn',
'collections.selectedCount': 'Đã chọn {count}',
'collections.pickList': 'Lưu vào danh sách',
'collections.pickListPlaceholder': 'Chọn một danh sách',
'collections.addedToList': 'Đã thêm vào {name}',
'collections.removedFromList': 'Đã xóa khỏi {name}',
'collections.inLists': 'Trong danh sách của bạn',
'collections.otherLists': 'Thêm vào danh sách',
'collections.noListsYet': 'Tạo một danh sách trước để lưu địa điểm.',
'collections.removedFromAll': 'Đã xóa khỏi bộ sưu tập',
'collections.picker.title': 'Địa điểm đã lưu',
'collections.picker.showMore': 'Hiện thêm {count}',
'collections.picker.search': 'Tìm trong địa điểm đã lưu của bạn',
'collections.picker.empty': 'Không có địa điểm đã lưu nào để thêm',
'collections.picker.hint': 'Chọn một địa điểm từ bộ sưu tập của bạn',
'collections.picker.use': 'Dùng',
// Export / import a list as a file (#2198)
'collections.file.export': 'Xuất',
'collections.file.exportTitle': 'Tải danh sách này về dưới dạng tệp',
'collections.file.importButton': 'Nhập danh sách từ tệp',
'collections.file.importTitle': 'Nhập danh sách',
'collections.file.choose': 'Chọn tệp danh sách',
'collections.file.confirm': 'Nhập',
'collections.file.change': 'Đổi',
'collections.file.labelCount': '{count} nhãn',
'collections.file.hint':
'Các địa điểm sẽ vào một danh sách mới của bạn. Đánh giá, thành viên và ảnh đã tải lên không đi kèm.',
'collections.file.done': 'Đã nhập {count} địa điểm',
'collections.file.doneSkipped': 'Đã nhập {count} địa điểm, bỏ qua {skipped}',
'collections.file.errorTooLarge': 'Tệp này quá lớn để là một danh sách.',
'collections.file.errorUnreadable': 'Không đọc được tệp này.',
'collections.file.errorNotACollection': 'Đây không phải tệp danh sách của TREK.',
'collections.share.title': 'Chia sẻ danh sách',
'collections.share.titleNamed': 'Chia sẻ “{name}”',
'collections.share.button': 'Chia sẻ',
'collections.share.members': 'Thành viên',
'collections.share.owner': 'Chủ sở hữu',
'collections.share.you': 'bạn',
'collections.share.pending': 'lời mời đang chờ',
'collections.share.accepted': 'đã chấp nhận',
'collections.share.invite': 'Mời ai đó',
'collections.share.inviteUser': 'Chọn người dùng',
'collections.share.sendInvite': 'Gửi lời mời',
'collections.share.inviteHint': 'Người được mời có thể xem và chỉnh sửa danh sách này.',
'collections.share.noUsers': 'Không có người dùng nào để mời.',
'collections.share.memberHint': 'Chỉ chủ sở hữu danh sách mới có thể mời hoặc xóa người.',
'collections.share.cancel': 'Hủy',
'collections.share.leave': 'Rời khỏi danh sách',
'collections.share.leaveConfirm':
'Rời khỏi danh sách được chia sẻ này? Bạn sẽ mất quyền truy cập cho đến khi được mời lại.',
'collections.share.left': 'Bạn đã rời khỏi danh sách',
'collections.share.remove': 'Xóa',
'collections.invites.title': 'Lời mời',
'collections.invites.from': 'từ',
'collections.invites.accept': 'Chấp nhận',
'collections.invites.decline': 'Từ chối',
'collections.invites.received': 'Bạn có một lời mời danh sách mới',
'collections.invite.sent': 'Đã gửi lời mời',
'collections.invite.error': 'Không thể gửi lời mời',
'collections.invite.accepted': 'Đã chấp nhận lời mời',
'collections.invite.declined': 'Đã từ chối lời mời',
'collections.widget.title': 'Bộ sưu tập',
'collections.widget.empty': 'Chưa có địa điểm đã lưu',
'collections.widget.savedCount': 'Đã lưu {count}',
'collections.labels.title': 'Nhãn',
'collections.labels.manage': 'Quản lý nhãn',
'collections.labels.add': 'Thêm nhãn',
'collections.labels.name': 'Tên nhãn',
'collections.labels.namePlaceholder': 'vd. Berlin',
'collections.labels.assign': 'Gán nhãn',
'collections.labels.assignN': 'Thêm nhãn cho {count} địa điểm',
'collections.labels.assignedCount': 'Đã gán nhãn {count} địa điểm',
'collections.labels.empty': 'Chưa có nhãn nào',
'collections.labels.emptyHint': 'Tạo một nhãn trước để nhóm các địa điểm trong danh sách này.',
};
export default collection;