mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-22 15:06:32 +00:00
2c06c9904b
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.
211 lines
12 KiB
TypeScript
211 lines
12 KiB
TypeScript
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;
|