Merge pull request #472 from ichi1007/feature/add-i18n-japanese-key
feat(i18n): add Japanese locale and update translations for existing locales
This commit is contained in:
+23
-2
@@ -7,24 +7,45 @@ import commonEs from "../src/i18n/locales/es/common.json";
|
||||
import dialogsEs from "../src/i18n/locales/es/dialogs.json";
|
||||
import commonFr from "../src/i18n/locales/fr/common.json";
|
||||
import dialogsFr from "../src/i18n/locales/fr/dialogs.json";
|
||||
import commonJa from "../src/i18n/locales/ja-JP/common.json";
|
||||
import dialogsJa from "../src/i18n/locales/ja-JP/dialogs.json";
|
||||
import commonKo from "../src/i18n/locales/ko-KR/common.json";
|
||||
import dialogsKo from "../src/i18n/locales/ko-KR/dialogs.json";
|
||||
import commonTr from "../src/i18n/locales/tr/common.json";
|
||||
import dialogsTr from "../src/i18n/locales/tr/dialogs.json";
|
||||
import commonZh from "../src/i18n/locales/zh-CN/common.json";
|
||||
import dialogsZh from "../src/i18n/locales/zh-CN/dialogs.json";
|
||||
import commonZhTw from "../src/i18n/locales/zh-TW/common.json";
|
||||
import dialogsZhTw from "../src/i18n/locales/zh-TW/dialogs.json";
|
||||
|
||||
type Locale = "en" | "zh-CN" | "es" | "fr";
|
||||
type Locale = "en" | "zh-CN" | "zh-TW" | "es" | "fr" | "ja-JP" | "ko-KR" | "tr";
|
||||
type Namespace = "common" | "dialogs";
|
||||
type MessageMap = Record<string, unknown>;
|
||||
|
||||
const messages: Record<Locale, Record<Namespace, MessageMap>> = {
|
||||
en: { common: commonEn, dialogs: dialogsEn },
|
||||
"zh-CN": { common: commonZh, dialogs: dialogsZh },
|
||||
"zh-TW": { common: commonZhTw, dialogs: dialogsZhTw },
|
||||
es: { common: commonEs, dialogs: dialogsEs },
|
||||
fr: { common: commonFr, dialogs: dialogsFr },
|
||||
"ja-JP": { common: commonJa, dialogs: dialogsJa },
|
||||
"ko-KR": { common: commonKo, dialogs: dialogsKo },
|
||||
tr: { common: commonTr, dialogs: dialogsTr },
|
||||
};
|
||||
|
||||
let currentLocale: Locale = "en";
|
||||
|
||||
export function setMainLocale(locale: string) {
|
||||
if (locale === "en" || locale === "zh-CN" || locale === "es" || locale === "fr") {
|
||||
if (
|
||||
locale === "en" ||
|
||||
locale === "zh-CN" ||
|
||||
locale === "zh-TW" ||
|
||||
locale === "es" ||
|
||||
locale === "fr" ||
|
||||
locale === "ja-JP" ||
|
||||
locale === "ko-KR" ||
|
||||
locale === "tr"
|
||||
) {
|
||||
currentLocale = locale;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,10 +154,10 @@ export default function VideoEditor() {
|
||||
const nextSpeedIdRef = useRef(1);
|
||||
|
||||
const { shortcuts, isMac } = useShortcuts();
|
||||
const { locale, setLocale, t: rawT } = useI18n();
|
||||
const t = useScopedT("editor");
|
||||
const ts = useScopedT("settings");
|
||||
const availableLocales = getAvailableLocales();
|
||||
const { locale, setLocale } = useI18n();
|
||||
|
||||
const nextAnnotationIdRef = useRef(1);
|
||||
const nextAnnotationZIndexRef = useRef(1);
|
||||
@@ -362,7 +362,10 @@ export default function VideoEditor() {
|
||||
setLastSavedSnapshot(
|
||||
createProjectSnapshot(
|
||||
webcamSourcePath
|
||||
? { screenVideoPath: sourcePath, webcamVideoPath: webcamSourcePath }
|
||||
? {
|
||||
screenVideoPath: sourcePath,
|
||||
webcamVideoPath: webcamSourcePath,
|
||||
}
|
||||
: { screenVideoPath: sourcePath },
|
||||
INITIAL_EDITOR_STATE,
|
||||
),
|
||||
@@ -548,18 +551,18 @@ export default function VideoEditor() {
|
||||
}
|
||||
|
||||
if (!result.success) {
|
||||
toast.error(result.message || "Failed to load project");
|
||||
toast.error(result.message || t("project.failedToLoad"));
|
||||
return;
|
||||
}
|
||||
|
||||
const restored = await applyLoadedProject(result.project, result.path ?? null);
|
||||
if (!restored) {
|
||||
toast.error("Invalid project file format");
|
||||
toast.error(t("project.invalidFormat"));
|
||||
return;
|
||||
}
|
||||
|
||||
toast.success(`Project loaded from ${result.path}`);
|
||||
}, [applyLoadedProject]);
|
||||
toast.success(t("project.loadedFrom", { path: result.path ?? "" }));
|
||||
}, [applyLoadedProject, t]);
|
||||
|
||||
useEffect(() => {
|
||||
const removeLoadListener = window.electronAPI.onMenuLoadProject(handleLoadProject);
|
||||
@@ -962,7 +965,11 @@ export default function VideoEditor() {
|
||||
pushState((prev) => ({
|
||||
zoomRegions: prev.zoomRegions.map((region) =>
|
||||
region.id === id
|
||||
? { ...region, zoomInDurationMs: zoomIn, zoomOutDurationMs: zoomOut }
|
||||
? {
|
||||
...region,
|
||||
zoomInDurationMs: zoomIn,
|
||||
zoomOutDurationMs: zoomOut,
|
||||
}
|
||||
: region,
|
||||
),
|
||||
}));
|
||||
@@ -1296,17 +1303,22 @@ export default function VideoEditor() {
|
||||
const handleExportSaved = useCallback(
|
||||
(formatLabel: "GIF" | "Video", filePath: string) => {
|
||||
setExportedFilePath(filePath);
|
||||
toast.success(`${formatLabel} exported successfully`, {
|
||||
description: filePath,
|
||||
action: {
|
||||
label: "Show in Folder",
|
||||
onClick: () => {
|
||||
void handleShowExportedFile(filePath);
|
||||
toast.success(
|
||||
t("export.exportedSuccessfully", {
|
||||
format: formatLabel,
|
||||
}),
|
||||
{
|
||||
description: filePath,
|
||||
action: {
|
||||
label: rawT("common.actions.showInFolder"),
|
||||
onClick: () => {
|
||||
void handleShowExportedFile(filePath);
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
);
|
||||
},
|
||||
[handleShowExportedFile],
|
||||
[handleShowExportedFile, t, rawT],
|
||||
);
|
||||
|
||||
const handleSaveUnsavedExport = useCallback(async () => {
|
||||
@@ -1687,7 +1699,7 @@ export default function VideoEditor() {
|
||||
if (loading) {
|
||||
return (
|
||||
<div className="flex items-center justify-center h-screen bg-background">
|
||||
<div className="text-foreground">Loading video...</div>
|
||||
<div className="text-foreground">{t("loadingVideo")}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1701,7 +1713,7 @@ export default function VideoEditor() {
|
||||
onClick={handleLoadProject}
|
||||
className="px-3 py-1.5 rounded-md bg-[#34B27B] text-white text-sm hover:bg-[#34B27B]/90"
|
||||
>
|
||||
Load Project File
|
||||
{ts("project.load")}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,6 +2,7 @@ import type { Span } from "dnd-timeline";
|
||||
import { useItem, useTimelineContext } from "dnd-timeline";
|
||||
import { Gauge, MessageSquare, Scissors, ZoomIn } from "lucide-react";
|
||||
import { useMemo } from "react";
|
||||
import { useScopedT } from "@/contexts/I18nContext";
|
||||
import { cn } from "@/lib/utils";
|
||||
import {
|
||||
DEFAULT_ZOOM_IN_MS,
|
||||
@@ -59,6 +60,7 @@ export default function Item({
|
||||
children,
|
||||
onZoomDurationChange,
|
||||
}: ItemProps) {
|
||||
const t = useScopedT("timeline");
|
||||
const { pixelsToValue } = useTimelineContext();
|
||||
const { setNodeRef, attributes, listeners, itemStyle, itemContentStyle } = useItem({
|
||||
id,
|
||||
@@ -251,14 +253,14 @@ export default function Item({
|
||||
<>
|
||||
<Scissors className="w-3.5 h-3.5 shrink-0" />
|
||||
<span className="text-[11px] font-semibold tracking-tight whitespace-nowrap">
|
||||
Trim
|
||||
{t("labels.trim")}
|
||||
</span>
|
||||
</>
|
||||
) : isSpeed ? (
|
||||
<>
|
||||
<Gauge className="w-3.5 h-3.5 shrink-0" />
|
||||
<span className="text-[11px] font-semibold tracking-tight whitespace-nowrap">
|
||||
{speedValue !== undefined ? `${speedValue}×` : "Speed"}
|
||||
{speedValue !== undefined ? `${speedValue}×` : t("labels.speed")}
|
||||
</span>
|
||||
</>
|
||||
) : (
|
||||
|
||||
+10
-1
@@ -1,5 +1,14 @@
|
||||
export const DEFAULT_LOCALE = "en" as const;
|
||||
export const SUPPORTED_LOCALES = ["en", "zh-CN", "zh-TW", "es", "fr", "tr", "ko-KR"] as const;
|
||||
export const SUPPORTED_LOCALES = [
|
||||
"en",
|
||||
"zh-CN",
|
||||
"zh-TW",
|
||||
"es",
|
||||
"fr",
|
||||
"tr",
|
||||
"ko-KR",
|
||||
"ja-JP",
|
||||
] as const;
|
||||
export const I18N_NAMESPACES = [
|
||||
"common",
|
||||
"dialogs",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"open": "Open",
|
||||
"upload": "Upload",
|
||||
"export": "Export",
|
||||
"showInFolder": "Show in Folder",
|
||||
"file": "File",
|
||||
"edit": "Edit",
|
||||
"view": "View",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm"
|
||||
},
|
||||
"loadingVideo": "Loading video...",
|
||||
"errors": {
|
||||
"noVideoLoaded": "No video loaded",
|
||||
"videoNotReady": "Video not ready",
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
"labels": {
|
||||
"pan": "Pan",
|
||||
"zoom": "Zoom",
|
||||
"trim": "Trim",
|
||||
"speed": "Speed",
|
||||
"zoomItem": "Zoom {{index}}",
|
||||
"trimItem": "Trim {{index}}",
|
||||
"speedItem": "Speed {{index}}",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"open": "Abrir",
|
||||
"upload": "Subir",
|
||||
"export": "Exportar",
|
||||
"showInFolder": "Mostrar en carpeta",
|
||||
"file": "Archivo",
|
||||
"edit": "Editar",
|
||||
"view": "Vista",
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
"labels": {
|
||||
"pan": "Desplazar",
|
||||
"zoom": "Zoom",
|
||||
"trim": "Recortar",
|
||||
"speed": "Velocidad",
|
||||
"zoomItem": "Zoom {{index}}",
|
||||
"trimItem": "Recorte {{index}}",
|
||||
"speedItem": "Velocidad {{index}}",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"open": "Ouvrir",
|
||||
"upload": "Téléverser",
|
||||
"export": "Exporter",
|
||||
"showInFolder": "Afficher dans le dossier",
|
||||
"file": "Fichier",
|
||||
"edit": "Éditer",
|
||||
"view": "Affichage",
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
"labels": {
|
||||
"pan": "Panoramique",
|
||||
"zoom": "Zoom",
|
||||
"trim": "Couper",
|
||||
"speed": "Vitesse",
|
||||
"zoomItem": "Zoom {{index}}",
|
||||
"trimItem": "Coupe {{index}}",
|
||||
"speedItem": "Vitesse {{index}}",
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"actions": {
|
||||
"cancel": "キャンセル",
|
||||
"save": "保存",
|
||||
"delete": "削除",
|
||||
"close": "閉じる",
|
||||
"share": "共有",
|
||||
"done": "完了",
|
||||
"open": "開く",
|
||||
"upload": "アップロード",
|
||||
"export": "エクスポート",
|
||||
"showInFolder": "フォルダに表示",
|
||||
"file": "ファイル",
|
||||
"edit": "編集",
|
||||
"view": "表示",
|
||||
"window": "ウィンドウ",
|
||||
"quit": "終了",
|
||||
"stopRecording": "録画停止"
|
||||
},
|
||||
"playback": {
|
||||
"play": "再生",
|
||||
"pause": "一時停止",
|
||||
"fullscreen": "全画面表示",
|
||||
"exitFullscreen": "全画面表示を終了"
|
||||
},
|
||||
"locale": {
|
||||
"name": "日本語",
|
||||
"short": "JA"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"export": {
|
||||
"complete": "エクスポート完了",
|
||||
"yourFormatReady": "あなたの{{format}}が準備できました",
|
||||
"showInFolder": "フォルダで表示",
|
||||
"finalizingVideo": "ビデオのエクスポートを最終処理中...",
|
||||
"compilingGifProgress": "GIFをコンパイル中... {{progress}}%",
|
||||
"compilingGifWait": "GIFをコンパイル中... しばらくお待ちください",
|
||||
"takeMoment": "少々お待ちください...",
|
||||
"failed": "エクスポートに失敗しました",
|
||||
"tryAgain": "もう一度お試しください",
|
||||
"finalizingVideoTitle": "ビデオの最終処理",
|
||||
"compilingGif": "GIFをコンパイル中",
|
||||
"exportingFormat": "{{format}}をエクスポート中",
|
||||
"compiling": "コンパイル中",
|
||||
"renderingFrames": "フレームをレンダリング中",
|
||||
"processing": "処理中...",
|
||||
"finalizing": "最終処理中...",
|
||||
"compilingStatus": "コンパイル中...",
|
||||
"status": "ステータス",
|
||||
"format": "フォーマット",
|
||||
"frames": "フレーム",
|
||||
"cancelExport": "エクスポートをキャンセル",
|
||||
"savedSuccessfully": "{{format}}を正常に保存しました!"
|
||||
},
|
||||
"tutorial": {
|
||||
"triggerLabel": "トリミングの仕組み",
|
||||
"title": "トリミングの仕組み",
|
||||
"description": "動画の不要な部分を削除する方法について解説します。",
|
||||
"explanationBefore": "トリムツールは、動画から",
|
||||
"remove": "「削除したい部分」",
|
||||
"explanationMiddle": "を指定することで機能します。エクスポート時には、赤い枠で",
|
||||
"covered": "囲まれた部分",
|
||||
"explanationAfter": "がすべてカットされます。",
|
||||
"visualExample": "視覚的な例",
|
||||
"removed": "削除",
|
||||
"kept": "保持",
|
||||
"part1": "パート 1",
|
||||
"part2": "パート 2",
|
||||
"part3": "パート 3",
|
||||
"finalVideo": "完成動画",
|
||||
"step1Title": "1. 削除範囲を追加",
|
||||
"step1DescriptionBefore": "キーボードの",
|
||||
"step1DescriptionAfter": "、またはハサミのアイコンをクリックして、削除したい範囲を指定します。",
|
||||
|
||||
"step2Title": "2. 範囲を調整",
|
||||
"step2Description": "赤い領域の両端をドラッグして、削除したい範囲を正確に調整します。"
|
||||
},
|
||||
"unsavedChanges": {
|
||||
"title": "未保存の変更",
|
||||
"message": "未保存の変更があります。",
|
||||
"detail": "閉じる前にプロジェクトを保存しますか?",
|
||||
"saveAndClose": "保存して閉じる",
|
||||
"discardAndClose": "破棄して閉じる",
|
||||
"loadProject": "プロジェクトを読み込む…",
|
||||
"saveProject": "プロジェクトを保存…",
|
||||
"saveProjectAs": "プロジェクトを名前を付けて保存…"
|
||||
},
|
||||
"fileDialogs": {
|
||||
"saveGif": "エクスポートしたGIFを保存",
|
||||
"saveVideo": "エクスポートしたビデオを保存",
|
||||
"selectVideo": "ビデオファイルを選択",
|
||||
"saveProject": "OpenScreen プロジェクトを保存",
|
||||
"openProject": "OpenScreen プロジェクトを開く",
|
||||
"gifImage": "GIF 画像",
|
||||
"mp4Video": "MP4 ビデオ",
|
||||
"videoFiles": "ビデオファイル",
|
||||
"openscreenProject": "OpenScreen プロジェクト",
|
||||
"allFiles": "すべてのファイル"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"newRecording": {
|
||||
"title": "レコーダーに戻る",
|
||||
"description": "現在の作業内容が保存されました。",
|
||||
"cancel": "キャンセル",
|
||||
"confirm": "確認"
|
||||
},
|
||||
"loadingVideo": "ビデオを読み込み中...",
|
||||
"errors": {
|
||||
"noVideoLoaded": "ビデオが読み込まれていません",
|
||||
"videoNotReady": "ビデオが準備できていません",
|
||||
"unableToDetermineSourcePath": "ソースビデオのパスを特定できません",
|
||||
"failedToSaveGif": "GIFの保存に失敗しました",
|
||||
"gifExportFailed": "GIFのエクスポートに失敗しました",
|
||||
"failedToSaveVideo": "ビデオの保存に失敗しました",
|
||||
"exportFailed": "エクスポートに失敗しました",
|
||||
"exportFailedWithError": "エクスポートに失敗しました: {{error}}",
|
||||
"failedToSaveExport": "エクスポートの保存に失敗しました",
|
||||
"failedToSaveExportedVideo": "エクスポートしたビデオの保存に失敗しました",
|
||||
"failedToRevealInFolder": "フォルダの表示に失敗しました: {{error}}"
|
||||
},
|
||||
"export": {
|
||||
"canceled": "エクスポートがキャンセルされました",
|
||||
"exportedSuccessfully": "{{format}}を正常にエクスポートしました"
|
||||
},
|
||||
"project": {
|
||||
"saveCanceled": "プロジェクトの保存がキャンセルされました",
|
||||
"failedToSave": "プロジェクトの保存に失敗しました",
|
||||
"savedTo": "プロジェクトを保存しました: {{path}}",
|
||||
"failedToLoad": "プロジェクトの読み込みに失敗しました",
|
||||
"invalidFormat": "無効なプロジェクトファイル形式です",
|
||||
"loadedFrom": "プロジェクトを読み込みました: {{path}}"
|
||||
},
|
||||
"recording": {
|
||||
"failedCameraAccess": "カメラのアクセス要求に失敗しました。",
|
||||
"cameraBlocked": "カメラのアクセスがブロックされています。システム設定で有効にして、ウェブカメラを使用してください。",
|
||||
"systemAudioUnavailable": "システムオーディオが利用できません。システムオーディオなしで録画します。",
|
||||
"microphoneDenied": "マイクのアクセスが拒否されました。オーディオなしで録画を続行します。",
|
||||
"cameraDenied": "カメラのアクセスが拒否されました。ウェブカメラなしで録画を続行します。",
|
||||
"permissionDenied": "録画の権限が拒否されました。画面録画を許可してください。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"tooltips": {
|
||||
"hideHUD": "HUDを隠す",
|
||||
"closeApp": "アプリを閉じる",
|
||||
"restartRecording": "録画を再開",
|
||||
"cancelRecording": "録画をキャンセル",
|
||||
"pauseRecording": "録画を一時停止",
|
||||
"resumeRecording": "録画を再開",
|
||||
"openVideoFile": "ビデオファイルを開く",
|
||||
"openProject": "プロジェクトを開く"
|
||||
},
|
||||
"audio": {
|
||||
"enableSystemAudio": "システムオーディオを有効にする",
|
||||
"disableSystemAudio": "システムオーディオを無効にする",
|
||||
"enableMicrophone": "マイクを有効にする",
|
||||
"disableMicrophone": "マイクを無効にする",
|
||||
"defaultMicrophone": "デフォルトのマイク"
|
||||
},
|
||||
"webcam": {
|
||||
"enableWebcam": "ウェブカメラを有効にする",
|
||||
"disableWebcam": "ウェブカメラを無効にする",
|
||||
"defaultCamera": "デフォルトのカメラ",
|
||||
"searching": "検索中...",
|
||||
"noneFound": "カメラが見つかりません",
|
||||
"unavailable": "カメラが利用できません"
|
||||
},
|
||||
"sourceSelector": {
|
||||
"loading": "ソースを読み込み中...",
|
||||
"screens": "画面 ({{count}})",
|
||||
"windows": "ウィンドウ ({{count}})",
|
||||
"defaultSourceName": "画面"
|
||||
},
|
||||
"recording": {
|
||||
"selectSource": "録画するソースを選択してください"
|
||||
},
|
||||
"language": "言語",
|
||||
"systemLanguagePrompt": {
|
||||
"title": "システム言語を使用しますか?",
|
||||
"description": "システム言語として{{language}}が検出されました。OpenScreenを{{language}}に切り替えますか?",
|
||||
"switch": "{{language}}に切り替え",
|
||||
"keepDefault": "現在の言語を保持"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,183 @@
|
||||
{
|
||||
"zoom": {
|
||||
"level": "ズーム倍率",
|
||||
"selectRegion": "ズーム範囲を選択して調整",
|
||||
"deleteZoom": "ズームを削除",
|
||||
"focusMode": {
|
||||
"title": "フォーカスモード",
|
||||
"manual": "手動",
|
||||
"auto": "自動",
|
||||
"autoDescription": "カメラが録画中のカーソル位置に追従します"
|
||||
},
|
||||
"speed": {
|
||||
"title": "ズーム速度",
|
||||
"instant": "即時",
|
||||
"fast": "高速",
|
||||
"smooth": "滑らか",
|
||||
"lazy": "遅延"
|
||||
}
|
||||
},
|
||||
"speed": {
|
||||
"playbackSpeed": "再生速度",
|
||||
"selectRegion": "速度範囲を選択して調整",
|
||||
"deleteRegion": "速度範囲を削除",
|
||||
"customPlaybackSpeed": "カスタム再生速度",
|
||||
"maxSpeedError": "速度は16×を超えることはできません"
|
||||
},
|
||||
"trim": {
|
||||
"deleteRegion": "トリム範囲を削除"
|
||||
},
|
||||
"layout": {
|
||||
"title": "レイアウト",
|
||||
"preset": "プリセット",
|
||||
"selectPreset": "プリセットを選択",
|
||||
"pictureInPicture": "ピクチャーインピクチャー",
|
||||
"verticalStack": "縦積み",
|
||||
"dualFrame": "デュアルフレーム",
|
||||
"webcamShape": "カメラの形状",
|
||||
"webcamSize": "カメラのサイズ"
|
||||
},
|
||||
"effects": {
|
||||
"title": "ビデオ効果",
|
||||
"blurBg": "背景をぼかす",
|
||||
"motionBlur": "モーションブラー",
|
||||
"off": "オフ",
|
||||
"shadow": "影",
|
||||
"roundness": "丸み",
|
||||
"padding": "余白"
|
||||
},
|
||||
"background": {
|
||||
"title": "背景",
|
||||
"image": "画像",
|
||||
"color": "色",
|
||||
"gradient": "グラデーション",
|
||||
"uploadCustom": "カスタムをアップロード",
|
||||
"gradientLabel": "グラデーション {{index}}"
|
||||
},
|
||||
"crop": {
|
||||
"title": "クロップ",
|
||||
"cropVideo": "ビデオをクロップ",
|
||||
"dragInstruction": "各辺をドラッグしてクロップ範囲を調整",
|
||||
"ratio": "比率",
|
||||
"free": "自由",
|
||||
"done": "完了",
|
||||
"lockAspectRatio": "アスペクト比を固定",
|
||||
"unlockAspectRatio": "アスペクト比の固定を解除"
|
||||
},
|
||||
"exportFormat": {
|
||||
"mp4": "MP4",
|
||||
"gif": "GIF",
|
||||
"mp4Video": "MP4 ビデオ",
|
||||
"mp4Description": "高品質のビデオファイル",
|
||||
"gifAnimation": "GIF アニメーション",
|
||||
"gifDescription": "共有用のアニメーション画像"
|
||||
},
|
||||
"exportQuality": {
|
||||
"title": "エクスポート品質",
|
||||
"low": "低画質",
|
||||
"medium": "中画質",
|
||||
"high": "高画質"
|
||||
},
|
||||
"gifSettings": {
|
||||
"frameRate": "GIF フレームレート",
|
||||
"size": "GIF サイズ",
|
||||
"loop": "GIF をループする"
|
||||
},
|
||||
"project": {
|
||||
"save": "プロジェクトを保存",
|
||||
"load": "プロジェクトを読み込む"
|
||||
},
|
||||
"export": {
|
||||
"videoButton": "ビデオをエクスポート",
|
||||
"gifButton": "GIF をエクスポート",
|
||||
"chooseSaveLocation": "保存場所を選択"
|
||||
},
|
||||
"links": {
|
||||
"reportBug": "バグを報告",
|
||||
"starOnGithub": "GitHub でスターを付ける"
|
||||
},
|
||||
"imageUpload": {
|
||||
"invalidFileType": "無効なファイル形式",
|
||||
"jpgOnly": "JPG または JPEG 画像ファイルをアップロードしてください。",
|
||||
"uploadSuccess": "カスタム画像が正常にアップロードされました!",
|
||||
"failedToUpload": "画像のアップロードに失敗しました",
|
||||
"errorReading": "ファイルの読み取り中にエラーが発生しました。"
|
||||
},
|
||||
"annotation": {
|
||||
"title": "注釈設定",
|
||||
"active": "アクティブ",
|
||||
"typeText": "テキスト",
|
||||
"typeImage": "画像",
|
||||
"typeArrow": "矢印",
|
||||
"typeBlur": "ぼかし",
|
||||
"textContent": "テキスト内容",
|
||||
"textPlaceholder": "テキストを入力してください...",
|
||||
"fontStyle": "フォントスタイル",
|
||||
"selectStyle": "スタイルを選択",
|
||||
"size": "サイズ",
|
||||
"customFonts": "カスタムフォント",
|
||||
"textColor": "文字色",
|
||||
"background": "背景",
|
||||
"none": "なし",
|
||||
"color": "色",
|
||||
"clearBackground": "背景をクリア",
|
||||
"uploadImage": "画像をアップロード",
|
||||
"supportedFormats": "サポートされている形式: JPG, PNG, GIF, WebP",
|
||||
"arrowDirection": "矢印の方向",
|
||||
"strokeWidth": "線の太さ: {{width}}px",
|
||||
"arrowColor": "矢印の色",
|
||||
"blurType": "ぼかしの種類",
|
||||
"blurTypeBlur": "ぼかし",
|
||||
"blurTypeMosaic": "モザイクぼかし",
|
||||
"blurColor": "ぼかしの色",
|
||||
"blurColorWhite": "白",
|
||||
"blurColorBlack": "黒",
|
||||
"blurShape": "ぼかしの形状",
|
||||
"blurIntensity": "ぼかしの強さ",
|
||||
"mosaicBlockSize": "モザイクブロックのサイズ",
|
||||
"blurShapeRectangle": "長方形",
|
||||
"blurShapeOval": "楕円",
|
||||
"blurShapeFreehand": "自由形状",
|
||||
"deleteAnnotation": "注釈を削除",
|
||||
"shortcutsAndTips": "ショートカットとヒント",
|
||||
"tipMovePlayhead": "重なっている注釈セクションに再生ヘッドを移動し、項目を選択します。",
|
||||
"tipTabCycle": "Tabキーを使用して重なっている項目を順に切り替えます。",
|
||||
"tipShiftTabCycle": "Shift+Tabキーを使用して逆順に切り替えます。",
|
||||
"invalidImageType": "無効なファイル形式",
|
||||
"imageFormatsOnly": "JPG、PNG、GIF、またはWebP画像ファイルをアップロードしてください。",
|
||||
"imageUploadSuccess": "画像が正常にアップロードされました!",
|
||||
"failedImageUpload": "画像のアップロードに失敗しました"
|
||||
},
|
||||
"fontStyles": {
|
||||
"classic": "クラシック",
|
||||
"editor": "エディター",
|
||||
"strong": "ストロング",
|
||||
"typewriter": "タイプライター",
|
||||
"deco": "デコ",
|
||||
"simple": "シンプル",
|
||||
"modern": "モダン",
|
||||
"clean": "クリーン"
|
||||
},
|
||||
"customFont": {
|
||||
"dialogTitle": "Googleフォントを追加",
|
||||
"urlLabel": "GoogleフォントのインポートURL",
|
||||
"urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap",
|
||||
"urlHelp": "Googleフォントから取得: フォントを選択 → 「フォントを取得」をクリック → @import URLをコピー",
|
||||
"nameLabel": "表示名",
|
||||
"namePlaceholder": "マイカスタムフォント",
|
||||
"nameHelp": "フォントセレクターに表示される名前です",
|
||||
"addButton": "フォントを追加",
|
||||
"addingButton": "追加中...",
|
||||
"errorEmptyUrl": "GoogleフォントのインポートURLを入力してください",
|
||||
"errorInvalidUrl": "有効なGoogleフォントURLを入力してください",
|
||||
"errorEmptyName": "フォント名を入力してください",
|
||||
"errorExtractFailed": "URLからフォントファミリーを抽出できませんでした",
|
||||
"successMessage": "フォント \"{{fontName}}\" が正常に追加されました",
|
||||
"failedToAdd": "フォントの追加に失敗しました",
|
||||
"errorTimeout": "フォントの読み込みに時間がかかりすぎました。URLを確認して再試行してください。",
|
||||
"errorLoadFailed": "フォントを読み込めませんでした。GoogleフォントのURLが正しいことを確認してください。"
|
||||
},
|
||||
"language": {
|
||||
"title": "言語"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"title": "キーボードショートカット",
|
||||
"customize": "カスタマイズ",
|
||||
"configurable": "設定可能",
|
||||
"fixed": "固定",
|
||||
"pressKey": "キーを押してください…",
|
||||
"clickToChange": "クリックして変更",
|
||||
"pressEscToCancel": "Escキーを押してキャンセル",
|
||||
"helpText": "ショートカットをクリックして新しいキーの組み合わせを押します。Escキーを押してキャンセルします。",
|
||||
"resetToDefaults": "デフォルトにリセット",
|
||||
"alreadyUsedBy": "すでに {{action}} に使用されています",
|
||||
"swap": "入れ替え",
|
||||
"reservedShortcut": "このショートカットは \"{{label}}\" に予約されており、再割り当てできません。",
|
||||
"savedToast": "キーボードショートカットが保存されました",
|
||||
"resetToast": "デフォルトのショートカットにリセット — 保存をクリックして適用",
|
||||
"actions": {
|
||||
"addZoom": "ズームを追加",
|
||||
"addTrim": "トリムを追加",
|
||||
"addSpeed": "速度を追加",
|
||||
"addAnnotation": "注釈を追加",
|
||||
"addBlur": "ぼかしを追加",
|
||||
"addKeyframe": "キーフレームを追加",
|
||||
"deleteSelected": "選択を削除",
|
||||
"playPause": "再生 / 一時停止"
|
||||
},
|
||||
"fixedActions": {
|
||||
"undo": "元に戻す",
|
||||
"redo": "やり直す",
|
||||
"cycleAnnotationsForward": "注釈を順に切り替え",
|
||||
"cycleAnnotationsBackward": "注釈を逆順に切り替え",
|
||||
"deleteSelectedAlt": "選択を削除 (alt)",
|
||||
"panTimeline": "タイムラインをパン",
|
||||
"zoomTimeline": "タイムラインをズーム",
|
||||
"frameBack": "フレームを戻す",
|
||||
"frameForward": "フレームを進める"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"buttons": {
|
||||
"addZoom": "ズームを追加 (Z)",
|
||||
"suggestZooms": "カーソル位置からズームを提案",
|
||||
"addTrim": "トリムを追加 (T)",
|
||||
"addAnnotation": "注釈を追加 (A)",
|
||||
"addBlur": "ぼかしを追加 (B)",
|
||||
"addSpeed": "速度を追加 (S)"
|
||||
},
|
||||
"hints": {
|
||||
"pressZoom": "Zキーを押してズームを追加",
|
||||
"pressTrim": "Tキーを押してトリムを追加",
|
||||
"pressAnnotation": "Aキーを押して注釈を追加",
|
||||
"pressBlur": "Bキーを押してぼかしを追加",
|
||||
"pressSpeed": "Sキーを押して速度を追加"
|
||||
},
|
||||
"labels": {
|
||||
"pan": "移動",
|
||||
"zoom": "ズーム",
|
||||
"trim": "トリム",
|
||||
"speed": "速度",
|
||||
"zoomItem": "ズーム {{index}}",
|
||||
"trimItem": "トリム {{index}}",
|
||||
"speedItem": "速度 {{index}}",
|
||||
"annotationItem": "注釈",
|
||||
"blurItem": "ぼかし {{index}}",
|
||||
"imageItem": "画像",
|
||||
"emptyText": "空のテキスト"
|
||||
},
|
||||
"emptyState": {
|
||||
"noVideo": "ビデオが読み込まれていません",
|
||||
"dragAndDrop": "ビデオをドラッグアンドドロップして編集を開始してください"
|
||||
},
|
||||
"errors": {
|
||||
"cannotPlaceZoom": "ここにズームを配置できません",
|
||||
"zoomExistsAtLocation": "この場所にはすでにズームが存在するか、十分なスペースがありません。",
|
||||
"zoomSuggestionUnavailable": "ズームの自動提案機能が利用できません",
|
||||
"noCursorTelemetry": "カーソルの動きが記録されていません",
|
||||
"noCursorTelemetryDescription": "まず画面収録を行い、カーソルに基づく提案を生成してください。",
|
||||
"noUsableTelemetry": "使用可能なカーソルの動きデータがありません",
|
||||
"noUsableTelemetryDescription": "録画には十分なカーソルの動きデータが含まれていません。",
|
||||
"noDwellMoments": "カーソルが静止したポイントが見つかりません",
|
||||
"noDwellMomentsDescription": "強調したい操作の際に、カーソルを一時停止させて録画してみてください。",
|
||||
"noAutoZoomSlots": "自動ズームを適用できる箇所がありません",
|
||||
"noAutoZoomSlotsDescription": "検出された滞留ポイントが既存のズーム領域と重なっています。",
|
||||
"cannotPlaceTrim": "ここに切り取りを配置できません",
|
||||
"trimExistsAtLocation": "この場所にはすでに切り取りが存在するか、十分なスペースがありません。",
|
||||
"cannotPlaceSpeed": "ここに速度を配置できません",
|
||||
"speedExistsAtLocation": "この場所にはすでに速度が存在するか、十分なスペースがありません。"
|
||||
},
|
||||
"success": {
|
||||
"addedZoomSuggestions": "カーソルに基づくズーム提案を {{count}} 件追加しました",
|
||||
"addedZoomSuggestionsPlural": "カーソルに基づくズーム提案を {{count}} 件追加しました"
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
"open": "열기",
|
||||
"upload": "업로드",
|
||||
"export": "내보내기",
|
||||
"showInFolder": "폴더에 표시",
|
||||
"file": "파일",
|
||||
"edit": "편집",
|
||||
"view": "보기",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"cancel": "취소",
|
||||
"confirm": "확인"
|
||||
},
|
||||
"loadingVideo": "비디오 로드 중...",
|
||||
"errors": {
|
||||
"noVideoLoaded": "불러온 비디오가 없습니다",
|
||||
"videoNotReady": "비디오가 준비되지 않았습니다",
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
"labels": {
|
||||
"pan": "이동",
|
||||
"zoom": "줌",
|
||||
"trim": "트림",
|
||||
"speed": "속도",
|
||||
"zoomItem": "줌 {{index}}",
|
||||
"trimItem": "트림 {{index}}",
|
||||
"speedItem": "속도 {{index}}",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"open": "Aç",
|
||||
"upload": "Yükle",
|
||||
"export": "Dışa Aktar",
|
||||
"showInFolder": "Klasörde Göster",
|
||||
"file": "Dosya",
|
||||
"edit": "Düzenle",
|
||||
"view": "Görünüm",
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
"labels": {
|
||||
"pan": "Kaydır",
|
||||
"zoom": "Yakınlaştır",
|
||||
"trim": "Kırp",
|
||||
"speed": "Hız",
|
||||
"zoomItem": "Yakınlaştırma {{index}}",
|
||||
"trimItem": "Kırpma {{index}}",
|
||||
"speedItem": "Hız {{index}}",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"open": "打开",
|
||||
"upload": "上传",
|
||||
"export": "导出",
|
||||
"showInFolder": "在文件夹中显示",
|
||||
"file": "文件",
|
||||
"edit": "编辑",
|
||||
"view": "视图",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"cancel": "取消",
|
||||
"confirm": "确认"
|
||||
},
|
||||
"loadingVideo": "正在加载视频...",
|
||||
"errors": {
|
||||
"noVideoLoaded": "未加载视频",
|
||||
"videoNotReady": "视频未就绪",
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
"labels": {
|
||||
"pan": "平移",
|
||||
"zoom": "缩放",
|
||||
"trim": "剪辑",
|
||||
"speed": "速度",
|
||||
"zoomItem": "缩放 {{index}}",
|
||||
"trimItem": "剪辑 {{index}}",
|
||||
"speedItem": "速度 {{index}}",
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"open": "開啟",
|
||||
"upload": "上傳",
|
||||
"export": "匯出",
|
||||
"showInFolder": "在資料夾中顯示",
|
||||
"file": "檔案",
|
||||
"edit": "編輯",
|
||||
"view": "檢視",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"cancel": "取消",
|
||||
"confirm": "確認"
|
||||
},
|
||||
"loadingVideo": "正在載入影片...",
|
||||
"errors": {
|
||||
"noVideoLoaded": "未載入影片",
|
||||
"videoNotReady": "影片未就緒",
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
"labels": {
|
||||
"pan": "平移",
|
||||
"zoom": "縮放",
|
||||
"trim": "剪輯",
|
||||
"speed": "速度",
|
||||
"zoomItem": "縮放 {{index}}",
|
||||
"trimItem": "剪輯 {{index}}",
|
||||
"speedItem": "速度 {{index}}",
|
||||
|
||||
Reference in New Issue
Block a user