fix: copy/paste notification

This commit is contained in:
Lorenzo Lancia
2026-04-24 17:39:33 +02:00
parent 80a3b1e4d3
commit dca91b4f86
10 changed files with 253 additions and 1432 deletions
-1248
View File
File diff suppressed because it is too large Load Diff
@@ -13,6 +13,7 @@ import {
} from "@/components/ui/dialog";
import { useI18n, useScopedT } from "@/contexts/I18nContext";
import { useShortcuts } from "@/contexts/ShortcutsContext";
import { useClipboardFeedback } from "@/hooks/useClipboardFeedback";
import { INITIAL_EDITOR_STATE, useEditorHistory } from "@/hooks/useEditorHistory";
import { type Locale } from "@/i18n/config";
import { getAvailableLocales, getLocaleName } from "@/i18n/loader";
@@ -166,6 +167,7 @@ export default function VideoEditor() {
const nextSpeedIdRef = useRef(1);
const { shortcuts, isMac } = useShortcuts();
const { notifyCopied, notifyPasted } = useClipboardFeedback();
const t = useScopedT("editor");
const ts = useScopedT("settings");
const tt = useScopedT("timeline");
@@ -1032,6 +1034,7 @@ export default function VideoEditor() {
const region = annotationOnlyRegions.find((item) => item.id === selectedAnnotationId);
if (region) {
setTimelineClipboard({ kind: "annotation", region: cloneAnnotationRegion(region) });
notifyCopied();
}
return;
}
@@ -1040,6 +1043,7 @@ export default function VideoEditor() {
const region = blurRegions.find((item) => item.id === selectedBlurId);
if (region) {
setTimelineClipboard({ kind: "blur", region: cloneAnnotationRegion(region) });
notifyCopied();
}
return;
}
@@ -1048,6 +1052,7 @@ export default function VideoEditor() {
const region = zoomRegions.find((item) => item.id === selectedZoomId);
if (region) {
setTimelineClipboard({ kind: "zoom", region: { ...region, focus: { ...region.focus } } });
notifyCopied();
}
return;
}
@@ -1056,6 +1061,7 @@ export default function VideoEditor() {
const region = trimRegions.find((item) => item.id === selectedTrimId);
if (region) {
setTimelineClipboard({ kind: "trim", region: { ...region } });
notifyCopied();
}
return;
}
@@ -1064,6 +1070,7 @@ export default function VideoEditor() {
const region = speedRegions.find((item) => item.id === selectedSpeedId);
if (region) {
setTimelineClipboard({ kind: "speed", region: { ...region } });
notifyCopied();
}
}
}, [
@@ -1077,6 +1084,7 @@ export default function VideoEditor() {
zoomRegions,
trimRegions,
speedRegions,
notifyCopied,
]);
const handlePasteTimelineItem = useCallback(() => {
@@ -1125,6 +1133,7 @@ export default function VideoEditor() {
config.pushRegion(config.createRegion(id));
clearTimelineSelection();
config.selectRegion(id);
notifyPasted();
return true;
}
@@ -1155,6 +1164,7 @@ export default function VideoEditor() {
setSelectedZoomId(null);
setSelectedTrimId(null);
setSelectedSpeedId(null);
notifyPasted();
return;
}
@@ -1230,6 +1240,7 @@ export default function VideoEditor() {
trimRegions,
speedRegions,
tt,
notifyPasted,
]);
const handleAnnotationDelete = useCallback(
+30
View File
@@ -0,0 +1,30 @@
import { useCallback } from "react";
import { toast } from "sonner";
import { useScopedT } from "@/contexts/I18nContext";
export type ClipboardAction = "copy" | "paste";
export function useClipboardFeedback() {
const t = useScopedT("timeline");
const notifyClipboardAction = useCallback(
(action: ClipboardAction) => {
toast.success(action === "copy" ? t("feedback.copied") : t("feedback.pasted"));
},
[t],
);
const notifyCopied = useCallback(() => {
notifyClipboardAction("copy");
}, [notifyClipboardAction]);
const notifyPasted = useCallback(() => {
notifyClipboardAction("paste");
}, [notifyClipboardAction]);
return {
notifyClipboardAction,
notifyCopied,
notifyPasted,
};
}
+4
View File
@@ -49,5 +49,9 @@
"success": {
"addedZoomSuggestions": "Added {{count}} cursor-based zoom suggestion",
"addedZoomSuggestionsPlural": "Added {{count}} cursor-based zoom suggestions"
},
"feedback": {
"copied": "Copied!",
"pasted": "Pasted!"
}
}
+21 -17
View File
@@ -3,16 +3,16 @@
"addZoom": "Agregar zoom (Z)",
"suggestZooms": "Sugerir zooms desde el cursor",
"addTrim": "Agregar recorte (T)",
"addAnnotation": "Agregar anotación (A)",
"addAnnotation": "Agregar anotación (A)",
"addSpeed": "Agregar velocidad (S)",
"addBlur": "Agregar desenfoque (B)"
},
"hints": {
"pressZoom": "Presiona Z para agregar zoom",
"pressTrim": "Presiona T para agregar recorte",
"pressAnnotation": "Presiona A para agregar anotación",
"pressAnnotation": "Presiona A para agregar anotación",
"pressSpeed": "Presiona S para agregar velocidad",
"pressBlur": "Presiona B para agregar una región de desenfoque"
"pressBlur": "Presiona B para agregar una región de desenfoque"
},
"labels": {
"pan": "Desplazar",
@@ -20,9 +20,9 @@
"zoomItem": "Zoom {{index}}",
"trimItem": "Recorte {{index}}",
"speedItem": "Velocidad {{index}}",
"annotationItem": "Anotación",
"annotationItem": "Anotación",
"imageItem": "Imagen",
"emptyText": "Texto vacío",
"emptyText": "Texto vacío",
"blurItem": "Desenfoque {{index}}"
},
"emptyState": {
@@ -30,24 +30,28 @@
"dragAndDrop": "Arrastra y suelta un video para comenzar a editar"
},
"errors": {
"cannotPlaceZoom": "No se puede colocar el zoom aquí",
"zoomExistsAtLocation": "Ya existe un zoom en esta ubicación o no hay suficiente espacio disponible.",
"zoomSuggestionUnavailable": "El controlador de sugerencias de zoom no está disponible",
"noCursorTelemetry": "No hay telemetría de cursor disponible",
"cannotPlaceZoom": "No se puede colocar el zoom aquí",
"zoomExistsAtLocation": "Ya existe un zoom en esta ubicación o no hay suficiente espacio disponible.",
"zoomSuggestionUnavailable": "El controlador de sugerencias de zoom no está disponible",
"noCursorTelemetry": "No hay telemetría de cursor disponible",
"noCursorTelemetryDescription": "Graba una captura de pantalla primero para generar sugerencias basadas en el cursor.",
"noUsableTelemetry": "No hay telemetría de cursor utilizable",
"noUsableTelemetryDescription": "La grabación no incluye suficientes datos de movimiento del cursor.",
"noUsableTelemetry": "No hay telemetría de cursor utilizable",
"noUsableTelemetryDescription": "La grabación no incluye suficientes datos de movimiento del cursor.",
"noDwellMoments": "No se encontraron momentos claros de pausa del cursor",
"noDwellMomentsDescription": "Intenta una grabación con pausas más lentas del cursor en acciones importantes.",
"noDwellMomentsDescription": "Intenta una grabación con pausas más lentas del cursor en acciones importantes.",
"noAutoZoomSlots": "No hay espacios de auto-zoom disponibles",
"noAutoZoomSlotsDescription": "Los puntos de pausa detectados se superponen con regiones de zoom existentes.",
"cannotPlaceTrim": "No se puede colocar el recorte aquí",
"trimExistsAtLocation": "Ya existe un recorte en esta ubicación o no hay suficiente espacio disponible.",
"cannotPlaceSpeed": "No se puede colocar la velocidad aquí",
"speedExistsAtLocation": "Ya existe una región de velocidad en esta ubicación o no hay suficiente espacio disponible."
"cannotPlaceTrim": "No se puede colocar el recorte aquí",
"trimExistsAtLocation": "Ya existe un recorte en esta ubicación o no hay suficiente espacio disponible.",
"cannotPlaceSpeed": "No se puede colocar la velocidad aquí",
"speedExistsAtLocation": "Ya existe una región de velocidad en esta ubicación o no hay suficiente espacio disponible."
},
"success": {
"addedZoomSuggestions": "Se agregó {{count}} sugerencia de zoom basada en el cursor",
"addedZoomSuggestions": "Se agregó {{count}} sugerencia de zoom basada en el cursor",
"addedZoomSuggestionsPlural": "Se agregaron {{count}} sugerencias de zoom basadas en el cursor"
},
"feedback": {
"copied": "Copied!",
"pasted": "Pasted!"
}
}
+18 -14
View File
@@ -1,7 +1,7 @@
{
"buttons": {
"addZoom": "Ajouter un zoom (Z)",
"suggestZooms": "Suggérer des zooms depuis le curseur",
"suggestZooms": "Suggérer des zooms depuis le curseur",
"addTrim": "Ajouter une coupe (T)",
"addAnnotation": "Ajouter une annotation (A)",
"addSpeed": "Ajouter une vitesse (S)",
@@ -26,28 +26,32 @@
"blurItem": "Flou {{index}}"
},
"emptyState": {
"noVideo": "Aucune vidéo chargée",
"dragAndDrop": "Glissez-déposez une vidéo pour commencer à éditer"
"noVideo": "Aucune vidéo chargée",
"dragAndDrop": "Glissez-déposez une vidéo pour commencer à éditer"
},
"errors": {
"cannotPlaceZoom": "Impossible de placer le zoom ici",
"zoomExistsAtLocation": "Un zoom existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant.",
"zoomExistsAtLocation": "Un zoom existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant.",
"zoomSuggestionUnavailable": "Gestionnaire de suggestions de zoom non disponible",
"noCursorTelemetry": "Aucune télémétrie de curseur disponible",
"noCursorTelemetryDescription": "Enregistrez d\u0027abord un screencast pour générer des suggestions basées sur le curseur.",
"noUsableTelemetry": "Aucune télémétrie de curseur utilisable",
"noUsableTelemetryDescription": "L\u0027enregistrement ne contient pas suffisamment de données de mouvement du curseur.",
"noDwellMoments": "Aucun moment de pause du curseur trouvé",
"noCursorTelemetry": "Aucune télémétrie de curseur disponible",
"noCursorTelemetryDescription": "Enregistrez d\u0027abord un screencast pour générer des suggestions basées sur le curseur.",
"noUsableTelemetry": "Aucune télémétrie de curseur utilisable",
"noUsableTelemetryDescription": "L\u0027enregistrement ne contient pas suffisamment de données de mouvement du curseur.",
"noDwellMoments": "Aucun moment de pause du curseur trouvé",
"noDwellMomentsDescription": "Essayez un enregistrement avec des pauses plus lentes du curseur sur les actions importantes.",
"noAutoZoomSlots": "Aucun emplacement de zoom automatique disponible",
"noAutoZoomSlotsDescription": "Les points de pause détectés chevauchent des régions de zoom existantes.",
"noAutoZoomSlotsDescription": "Les points de pause détectés chevauchent des régions de zoom existantes.",
"cannotPlaceTrim": "Impossible de placer la coupe ici",
"trimExistsAtLocation": "Une coupe existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant.",
"trimExistsAtLocation": "Une coupe existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant.",
"cannotPlaceSpeed": "Impossible de placer la vitesse ici",
"speedExistsAtLocation": "Une région de vitesse existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant."
"speedExistsAtLocation": "Une région de vitesse existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant."
},
"success": {
"addedZoomSuggestions": "{{count}} suggestion de zoom basée sur le curseur ajoutée",
"addedZoomSuggestionsPlural": "{{count}} suggestions de zoom basées sur le curseur ajoutées"
"addedZoomSuggestions": "{{count}} suggestion de zoom basée sur le curseur ajoutée",
"addedZoomSuggestionsPlural": "{{count}} suggestions de zoom basées sur le curseur ajoutées"
},
"feedback": {
"copied": "Copied!",
"pasted": "Pasted!"
}
}
+40 -36
View File
@@ -1,50 +1,54 @@
{
"buttons": {
"addZoom": "줌 추가 (Z)",
"suggestZooms": "커서 기반 줌 제안",
"addTrim": "트림 추가 (T)",
"addAnnotation": "주석 추가 (A)",
"addSpeed": "속도 추가 (S)"
"addZoom": "줌 추가 (Z)",
"suggestZooms": "커서 기반 줌 제안",
"addTrim": "트림 추가 (T)",
"addAnnotation": "주석 추가 (A)",
"addSpeed": "속도 추가 (S)"
},
"hints": {
"pressZoom": "Z를 눌러 줌 추가",
"pressTrim": "T를 눌러 트림 추가",
"pressAnnotation": "A를 눌러 주석 추가",
"pressSpeed": "S를 눌러 속도 추가"
"pressZoom": "Z를 눌러 줌 추가",
"pressTrim": "T를 눌러 트림 추가",
"pressAnnotation": "A를 눌러 주석 추가",
"pressSpeed": "S를 눌러 속도 추가"
},
"labels": {
"pan": "이동",
"zoom": "줌",
"zoomItem": "줌 {{index}}",
"trimItem": "트림 {{index}}",
"speedItem": "속도 {{index}}",
"annotationItem": "주석",
"imageItem": "이미지",
"emptyText": "빈 텍스트"
"pan": "이동",
"zoom": "줌",
"zoomItem": "줌 {{index}}",
"trimItem": "트림 {{index}}",
"speedItem": "속도 {{index}}",
"annotationItem": "주석",
"imageItem": "이미지",
"emptyText": "빈 텍스트"
},
"emptyState": {
"noVideo": "불러온 비디오 없음",
"dragAndDrop": "비디오를 드래그 앤 드롭해서 편집을 시작하세요"
"noVideo": "불러온 비디오 없음",
"dragAndDrop": "비디오를 드래그 앤 드롭해서 편집을 시작하세요"
},
"errors": {
"cannotPlaceZoom": "이 위치에 줌을 추가할 수 없습니다",
"zoomExistsAtLocation": "이 위치에 이미 줌이 있거나 공간이 부족합니다.",
"zoomSuggestionUnavailable": "줌 제안 기능을 사용할 수 없습니다",
"noCursorTelemetry": "커서 데이터가 없습니다",
"noCursorTelemetryDescription": "커서 기반 제안을 생성하려면 먼저 화면을 녹화해 주세요.",
"noUsableTelemetry": "사용 가능한 커서 데이터가 없습니다",
"noUsableTelemetryDescription": "녹화에 충분한 커서 이동 데이터가 포함되어 있지 않습니다.",
"noDwellMoments": "명확한 커서 정지 구간을 찾을 수 없습니다",
"noDwellMomentsDescription": "중요한 동작에서 커서를 천천히 멈추며 녹화해 보세요.",
"noAutoZoomSlots": "자동 줌 슬롯이 없습니다",
"noAutoZoomSlotsDescription": "감지된 정지 지점이 기존 줌 구간과 겹칩니다.",
"cannotPlaceTrim": "이 위치에 트림을 추가할 수 없습니다",
"trimExistsAtLocation": "이 위치에 이미 트림이 있거나 공간이 부족합니다.",
"cannotPlaceSpeed": "이 위치에 속도를 추가할 수 없습니다",
"speedExistsAtLocation": "이 위치에 이미 속도 구간이 있거나 공간이 부족합니다."
"cannotPlaceZoom": "이 위치에 줌을 추가할 수 없습니다",
"zoomExistsAtLocation": "이 위치에 이미 줌이 있거나 공간이 부족합니다.",
"zoomSuggestionUnavailable": "줌 제안 기능을 사용할 수 없습니다",
"noCursorTelemetry": "커서 데이터가 없습니다",
"noCursorTelemetryDescription": "커서 기반 제안을 생성하려면 먼저 화면을 녹화해 주세요.",
"noUsableTelemetry": "사용 가능한 커서 데이터가 없습니다",
"noUsableTelemetryDescription": "녹화에 충분한 커서 이동 데이터가 포함되어 있지 않습니다.",
"noDwellMoments": "명확한 커서 정지 구간을 찾을 수 없습니다",
"noDwellMomentsDescription": "중요한 동작에서 커서를 천천히 멈추며 녹화해 보세요.",
"noAutoZoomSlots": "자동 줌 슬롯이 없습니다",
"noAutoZoomSlotsDescription": "감지된 정지 지점이 기존 줌 구간과 겹칩니다.",
"cannotPlaceTrim": "이 위치에 트림을 추가할 수 없습니다",
"trimExistsAtLocation": "이 위치에 이미 트림이 있거나 공간이 부족합니다.",
"cannotPlaceSpeed": "이 위치에 속도를 추가할 수 없습니다",
"speedExistsAtLocation": "이 위치에 이미 속도 구간이 있거나 공간이 부족합니다."
},
"success": {
"addedZoomSuggestions": "커서 기반 줌 제안 {{count}}개가 추가되었습니다",
"addedZoomSuggestionsPlural": "커서 기반 줌 제안 {{count}}개가 추가되었습니다"
"addedZoomSuggestions": "커서 기반 줌 제안 {{count}}개가 추가되었습니다",
"addedZoomSuggestionsPlural": "커서 기반 줌 제안 {{count}}개가 추가되었습니다"
},
"feedback": {
"copied": "Copied!",
"pasted": "Pasted!"
}
}
+43 -39
View File
@@ -1,53 +1,57 @@
{
"buttons": {
"addZoom": "Yakınlaştırma Ekle (Z)",
"suggestZooms": "İmleçten Yakınlaştırma Öner",
"addTrim": "Kırpma Ekle (T)",
"addAnnotation": "Açıklama Ekle (A)",
"addSpeed": "Hız Ekle (S)",
"addBlur": "Bulanık ekle (B)"
"addZoom": "Yakınlaştırma Ekle (Z)",
"suggestZooms": "İmleçten Yakınlaştırma Öner",
"addTrim": "Kırpma Ekle (T)",
"addAnnotation": "Açıklama Ekle (A)",
"addSpeed": "Hız Ekle (S)",
"addBlur": "Bulanık ekle (B)"
},
"hints": {
"pressZoom": "Yakınlaştırma eklemek için Z tuşuna basın",
"pressTrim": "Kırpma eklemek için T tuşuna basın",
"pressAnnotation": "Açıklama eklemek için A tuşuna basın",
"pressSpeed": "Hız eklemek için S tuşuna basın",
"pressBlur": "Bulanık bölge eklemek için B tuşuna basın"
"pressZoom": "Yakınlaştırma eklemek için Z tuşuna basın",
"pressTrim": "Kırpma eklemek için T tuşuna basın",
"pressAnnotation": "Açıklama eklemek için A tuşuna basın",
"pressSpeed": "Hız eklemek için S tuşuna basın",
"pressBlur": "Bulanık bölge eklemek için B tuşuna basın"
},
"labels": {
"pan": "Kaydır",
"zoom": "Yakınlaştır",
"zoomItem": "Yakınlaştırma {{index}}",
"trimItem": "Kırpma {{index}}",
"speedItem": "Hız {{index}}",
"annotationItem": "Açıklama",
"imageItem": "Görüntü",
"emptyText": "Boş metin",
"blurItem": "Bulanık {{index}}"
"pan": "Kaydır",
"zoom": "Yakınlaştır",
"zoomItem": "Yakınlaştırma {{index}}",
"trimItem": "Kırpma {{index}}",
"speedItem": "Hız {{index}}",
"annotationItem": "Açıklama",
"imageItem": "Görüntü",
"emptyText": "BoÅŸ metin",
"blurItem": "Bulanık {{index}}"
},
"emptyState": {
"noVideo": "Video Yüklenmedi",
"dragAndDrop": "Düzenlemeye başlamak için bir video sürükleyip bırakın"
"noVideo": "Video Yüklenmedi",
"dragAndDrop": "Düzenlemeye başlamak için bir video sürükleyip bırakın"
},
"errors": {
"cannotPlaceZoom": "Buraya yakınlaştırma yerleştirilemiyor",
"zoomExistsAtLocation": "Bu konumda zaten bir yakınlaştırma var veya yeterli alan yok.",
"zoomSuggestionUnavailable": "Yakınlaştırma öneri işleyicisi kullanılamıyor",
"noCursorTelemetry": "İmleç telemetrisi mevcut değil",
"noCursorTelemetryDescription": "İmleç tabanlı öneriler oluşturmak için önce bir ekran kaydı yapın.",
"noUsableTelemetry": "Kullanılabilir imleç telemetrisi yok",
"noUsableTelemetryDescription": "Kayıt yeterli imleç hareketi verisi içermiyor.",
"noDwellMoments": "Belirgin imleç bekleme anları bulunamadı",
"noDwellMomentsDescription": "Önemli işlemlerde daha yavaş imleç duraklamaları olan bir kayıt deneyin.",
"noAutoZoomSlots": "Otomatik yakınlaştırma alanı yok",
"noAutoZoomSlotsDescription": "Algılanan bekleme noktaları mevcut yakınlaştırma bölgeleriyle çakışıyor.",
"cannotPlaceTrim": "Buraya kırpma yerleştirilemiyor",
"trimExistsAtLocation": "Bu konumda zaten bir kırpma var veya yeterli alan yok.",
"cannotPlaceSpeed": "Buraya hız yerleştirilemiyor",
"speedExistsAtLocation": "Bu konumda zaten bir hız bölgesi var veya yeterli alan yok."
"cannotPlaceZoom": "Buraya yakınlaştırma yerleştirilemiyor",
"zoomExistsAtLocation": "Bu konumda zaten bir yakınlaştırma var veya yeterli alan yok.",
"zoomSuggestionUnavailable": "Yakınlaştırma öneri işleyicisi kullanılamıyor",
"noCursorTelemetry": "İmleç telemetrisi mevcut değil",
"noCursorTelemetryDescription": "İmleç tabanlı öneriler oluşturmak için önce bir ekran kaydı yapın.",
"noUsableTelemetry": "Kullanılabilir imleç telemetrisi yok",
"noUsableTelemetryDescription": "Kayıt yeterli imleç hareketi verisi içermiyor.",
"noDwellMoments": "Belirgin imleç bekleme anları bulunamadı",
"noDwellMomentsDescription": "Önemli işlemlerde daha yavaş imleç duraklamaları olan bir kayıt deneyin.",
"noAutoZoomSlots": "Otomatik yakınlaştırma alanı yok",
"noAutoZoomSlotsDescription": "Algılanan bekleme noktaları mevcut yakınlaştırma bölgeleriyle çakışıyor.",
"cannotPlaceTrim": "Buraya kırpma yerleştirilemiyor",
"trimExistsAtLocation": "Bu konumda zaten bir kırpma var veya yeterli alan yok.",
"cannotPlaceSpeed": "Buraya hız yerleştirilemiyor",
"speedExistsAtLocation": "Bu konumda zaten bir hız bölgesi var veya yeterli alan yok."
},
"success": {
"addedZoomSuggestions": "{{count}} imleç tabanlı yakınlaştırma önerisi eklendi",
"addedZoomSuggestionsPlural": "{{count}} imleç tabanlı yakınlaştırma önerisi eklendi"
"addedZoomSuggestions": "{{count}} imleç tabanlı yakınlaştırma önerisi eklendi",
"addedZoomSuggestionsPlural": "{{count}} imleç tabanlı yakınlaştırma önerisi eklendi"
},
"feedback": {
"copied": "Copied!",
"pasted": "Pasted!"
}
}
+43 -39
View File
@@ -1,53 +1,57 @@
{
"buttons": {
"addZoom": "添加缩放 (Z)",
"suggestZooms": "根据光标建议缩放",
"addTrim": "添加剪辑 (T)",
"addAnnotation": "添加标注 (A)",
"addSpeed": "添加速度 (S)",
"addBlur": "添加模糊 (B)"
"addZoom": "添加缩放 (Z)",
"suggestZooms": "根据光标建议缩放",
"addTrim": "添加剪辑 (T)",
"addAnnotation": "添加标注 (A)",
"addSpeed": "添加速度 (S)",
"addBlur": "添加模糊 (B)"
},
"hints": {
"pressZoom": "按 Z 添加缩放",
"pressTrim": "按 T 添加剪辑",
"pressAnnotation": "按 A 添加标注",
"pressSpeed": "按 S 添加速度",
"pressBlur": "按 B 添加模糊区域"
"pressZoom": "按 Z 添加缩放",
"pressTrim": "按 T 添加剪辑",
"pressAnnotation": "按 A 添加标注",
"pressSpeed": "按 S 添加速度",
"pressBlur": "按 B 添加模糊区域"
},
"labels": {
"pan": "平移",
"zoom": "缩放",
"zoomItem": "缩放 {{index}}",
"trimItem": "剪辑 {{index}}",
"speedItem": "速度 {{index}}",
"annotationItem": "标注",
"imageItem": "图片",
"emptyText": "空文本",
"blurItem": "模糊 {{index}}"
"pan": "平移",
"zoom": "缩放",
"zoomItem": "缩放 {{index}}",
"trimItem": "剪辑 {{index}}",
"speedItem": "速度 {{index}}",
"annotationItem": "标注",
"imageItem": "图片",
"emptyText": "空文本",
"blurItem": "模糊 {{index}}"
},
"emptyState": {
"noVideo": "未加载视频",
"dragAndDrop": "拖放视频以开始编辑"
"noVideo": "未加载视频",
"dragAndDrop": "拖放视频以开始编辑"
},
"errors": {
"cannotPlaceZoom": "无法在此处放置缩放",
"zoomExistsAtLocation": "此位置已存在缩放或没有足够的空间。",
"zoomSuggestionUnavailable": "缩放建议处理器不可用",
"noCursorTelemetry": "无可用的光标遥测数据",
"noCursorTelemetryDescription": "请先录制一段屏幕录像以生成基于光标的建议。",
"noUsableTelemetry": "无可用的光标遥测数据",
"noUsableTelemetryDescription": "录制内容没有包含足够的光标移动数据。",
"noDwellMoments": "未找到明确的光标停留时刻",
"noDwellMomentsDescription": "请尝试在重要操作上进行较慢光标停留的录制。",
"noAutoZoomSlots": "无可用的自动缩放位置",
"noAutoZoomSlotsDescription": "检测到的停留点与现有缩放区域重叠。",
"cannotPlaceTrim": "无法在此处放置剪辑",
"trimExistsAtLocation": "此位置已存在剪辑或没有足够的空间。",
"cannotPlaceSpeed": "无法在此处放置速度",
"speedExistsAtLocation": "此位置已存在速度区域或没有足够的空间。"
"cannotPlaceZoom": "无法在此处放置缩放",
"zoomExistsAtLocation": "此位置已存在缩放或没有足够的空间。",
"zoomSuggestionUnavailable": "缩放建议处理器不可用",
"noCursorTelemetry": "无可用的光标遥测数据",
"noCursorTelemetryDescription": "请先录制一段屏幕录像以生成基于光标的建议。",
"noUsableTelemetry": "无可用的光标遥测数据",
"noUsableTelemetryDescription": "录制内容没有包含足够的光标移动数据。",
"noDwellMoments": "未找到明确的光标停留时刻",
"noDwellMomentsDescription": "请尝试在重要操作上进行较慢光标停留的录制。",
"noAutoZoomSlots": "无可用的自动缩放位置",
"noAutoZoomSlotsDescription": "检测到的停留点与现有缩放区域重叠。",
"cannotPlaceTrim": "无法在此处放置剪辑",
"trimExistsAtLocation": "此位置已存在剪辑或没有足够的空间。",
"cannotPlaceSpeed": "无法在此处放置速度",
"speedExistsAtLocation": "此位置已存在速度区域或没有足够的空间。"
},
"success": {
"addedZoomSuggestions": "已添加 {{count}} 个基于光标的缩放建议",
"addedZoomSuggestionsPlural": "已添加 {{count}} 个基于光标的缩放建议"
"addedZoomSuggestions": "已添加 {{count}} 个基于光标的缩放建议",
"addedZoomSuggestionsPlural": "已添加 {{count}} 个基于光标的缩放建议"
},
"feedback": {
"copied": "Copied!",
"pasted": "Pasted!"
}
}
+43 -39
View File
@@ -1,53 +1,57 @@
{
"buttons": {
"addZoom": "新增縮放 (Z)",
"suggestZooms": "根據游標建議縮放",
"addTrim": "新增剪輯 (T)",
"addAnnotation": "新增標註 (A)",
"addSpeed": "新增速度 (S)",
"addBlur": "新增模糊 (B)"
"addZoom": "新增縮放 (Z)",
"suggestZooms": "根據游標建議縮放",
"addTrim": "新增剪輯 (T)",
"addAnnotation": "新增標註 (A)",
"addSpeed": "新增速度 (S)",
"addBlur": "新增模糊 (B)"
},
"hints": {
"pressZoom": "按 Z 新增縮放",
"pressTrim": "按 T 新增剪輯",
"pressAnnotation": "按 A 新增標註",
"pressSpeed": "按 S 新增速度",
"pressBlur": "按 B 新增模糊區域"
"pressZoom": "按 Z 新增縮放",
"pressTrim": "按 T 新增剪輯",
"pressAnnotation": "按 A 新增標註",
"pressSpeed": "按 S 新增速度",
"pressBlur": "按 B 新增模糊區域"
},
"labels": {
"pan": "平移",
"zoom": "縮放",
"zoomItem": "縮放 {{index}}",
"trimItem": "剪輯 {{index}}",
"speedItem": "速度 {{index}}",
"annotationItem": "標註",
"imageItem": "圖片",
"emptyText": "空文字",
"blurItem": "模糊 {{index}}"
"pan": "平移",
"zoom": "縮放",
"zoomItem": "縮放 {{index}}",
"trimItem": "剪輯 {{index}}",
"speedItem": "速度 {{index}}",
"annotationItem": "標註",
"imageItem": "圖片",
"emptyText": "空文字",
"blurItem": "模糊 {{index}}"
},
"emptyState": {
"noVideo": "未載入影片",
"dragAndDrop": "拖放影片以開始編輯"
"noVideo": "未載入影片",
"dragAndDrop": "拖放影片以開始編輯"
},
"errors": {
"cannotPlaceZoom": "無法在此處放置縮放",
"zoomExistsAtLocation": "此位置已存在縮放或沒有足夠的空間。",
"zoomSuggestionUnavailable": "縮放建議處理器不可用",
"noCursorTelemetry": "無可用的游標遙測資料",
"noCursorTelemetryDescription": "請先錄製一段螢幕錄影以產生基於游標的建議。",
"noUsableTelemetry": "無可用的游標遙測資料",
"noUsableTelemetryDescription": "錄製內容沒有包含足夠的游標移動資料。",
"noDwellMoments": "未找到明確的游標停留時刻",
"noDwellMomentsDescription": "請嘗試在重要操作上進行較慢游標停留的錄製。",
"noAutoZoomSlots": "無可用的自動縮放位置",
"noAutoZoomSlotsDescription": "偵測到的停留點與現有縮放區域重疊。",
"cannotPlaceTrim": "無法在此處放置剪輯",
"trimExistsAtLocation": "此位置已存在剪輯或沒有足夠的空間。",
"cannotPlaceSpeed": "無法在此處放置速度",
"speedExistsAtLocation": "此位置已存在速度區域或沒有足夠的空間。"
"cannotPlaceZoom": "無法在此處放置縮放",
"zoomExistsAtLocation": "此位置已存在縮放或沒有足夠的空間。",
"zoomSuggestionUnavailable": "縮放建議處理器不可用",
"noCursorTelemetry": "無可用的游標遙測資料",
"noCursorTelemetryDescription": "請先錄製一段螢幕錄影以產生基於游標的建議。",
"noUsableTelemetry": "無可用的游標遙測資料",
"noUsableTelemetryDescription": "錄製內容沒有包含足夠的游標移動資料。",
"noDwellMoments": "未找到明確的游標停留時刻",
"noDwellMomentsDescription": "請嘗試在重要操作上進行較慢游標停留的錄製。",
"noAutoZoomSlots": "無可用的自動縮放位置",
"noAutoZoomSlotsDescription": "偵測到的停留點與現有縮放區域重疊。",
"cannotPlaceTrim": "無法在此處放置剪輯",
"trimExistsAtLocation": "此位置已存在剪輯或沒有足夠的空間。",
"cannotPlaceSpeed": "無法在此處放置速度",
"speedExistsAtLocation": "此位置已存在速度區域或沒有足夠的空間。"
},
"success": {
"addedZoomSuggestions": "已新增 {{count}} 個基於游標的縮放建議",
"addedZoomSuggestionsPlural": "已新增 {{count}} 個基於游標的縮放建議"
"addedZoomSuggestions": "已新增 {{count}} 個基於游標的縮放建議",
"addedZoomSuggestionsPlural": "已新增 {{count}} 個基於游標的縮放建議"
},
"feedback": {
"copied": "Copied!",
"pasted": "Pasted!"
}
}