feat(library & studio): add EXIF info bar, portrait frame panning, and multi-photo selection with Panorama/HDR context menu

This commit is contained in:
2026-10-07 10:44:59 +07:00
parent 7b836984fc
commit 3b4c49c41d
9 changed files with 196 additions and 49 deletions
+6 -4
View File
@@ -36,13 +36,13 @@ export const en: Dict = {
'drop.clear': 'Clear',
'drop.peeking': 'SHOWING THE ORIGINAL',
'drop.peekHint': 'Hold right-click or the \\ key to compare with the original',
'drop.compare': 'Compare with original picture',
'drop.keep': 'SAVE ORIGINAL',
'drop.compare': 'Compare',
'drop.keep': 'Save original',
'drop.keepHint': 'Save the untouched photo to the device photo library. A browser that cannot share files downloads it instead.',
'drop.demoLimit': 'Demo build: exports are capped at {px}px and carry a watermark.',
// The live viewfinder (see vi.ts for what the status line is for).
'cam.open': 'OPEN CAMERA',
'cam.open': 'Open camera',
'cam.shot': 'SHOOT',
'cam.flip': 'Switch front/back camera',
'cam.starting': 'Opening the camera…',
@@ -52,7 +52,7 @@ export const en: Dict = {
'cam.fail': 'The camera did not open.',
'cam.shotFail': 'The shot failed — try again.',
'hist.title': 'HISTOGRAM',
'hist.title': 'Histogram',
'hist.drag': 'Drag to move',
'hist.hide': 'Hide the histogram',
@@ -262,6 +262,8 @@ export const en: Dict = {
'lib.openExplorer': 'Open in window explorer',
'lib.openLocation': 'Open at location',
'lib.openStudio': 'Open in studio',
'lib.mergePanorama': 'Panorama Merge…',
'lib.mergeHdr': 'HDR Merge (Anti-ghosting)…',
'lib.copiedPath': 'Copied location to clipboard: {path}',
'lib.edited': 'edited',
'lib.size': '{mb} MB',
+7 -5
View File
@@ -45,15 +45,15 @@ export const vi = {
'drop.clear': 'Xoá ảnh',
'drop.peeking': 'ĐANG XEM ẢNH GỐC',
'drop.peekHint': 'Giữ chuột phải hoặc phím \\ để so ảnh gốc',
'drop.compare': 'So với ảnh gốc',
'drop.keep': 'LƯU ẢNH GỐC',
'drop.compare': 'So sánh',
'drop.keep': 'Lưu ảnh gốc',
'drop.keepHint': 'Lưu nguyên ảnh gốc chưa chỉnh vào thư viện ảnh của máy. Trình duyệt không chia sẻ được tệp thì ảnh sẽ được tải về.',
'drop.demoLimit': 'Bản demo: ảnh xuất ra tối đa {px}px và có watermark.',
// The live viewfinder. The status line is the one fact the user cannot see
// for themselves: the preview runs at its own resolution, and how fast the
// device grades it is what tells them the phone is keeping up.
'cam.open': 'MỞ CAMERA',
'cam.open': 'Mở camera',
'cam.shot': 'CHỤP',
'cam.flip': 'Đổi camera trước/sau',
'cam.starting': 'Đang mở camera…',
@@ -64,7 +64,7 @@ export const vi = {
'cam.shotFail': 'Chụp không thành công — thử lại.',
// The histogram overlay. 'HISTOGRAM' is the word Vietnamese photographers use.
'hist.title': 'HISTOGRAM',
'hist.title': 'Histogram',
'hist.drag': 'Kéo để di chuyển',
'hist.hide': 'Ẩn histogram',
@@ -274,7 +274,9 @@ export const vi = {
'lib.open': 'Mở trong studio',
'lib.openExplorer': 'Open in window explorer',
'lib.openLocation': 'Open at location',
'lib.openStudio': 'Open in studio',
'lib.openStudio': 'Mở trong studio',
'lib.mergePanorama': 'Ghép Panorama…',
'lib.mergeHdr': 'Ghép HDR (Chống nhòe)…',
'lib.copiedPath': 'Đã sao chép đường dẫn: {path}',
'lib.edited': 'đã chỉnh',
'lib.size': '{mb} MB',