feat(i18n): externalize UI strings to YAML language packs

- string tables live in assets/i18n/<lang>.yaml, loaded at runtime
  (user pack dir ~/.oak/i18n, app bundle Resources/i18n, dev checkout)
  with the compiled-in English/Chinese tables as fallback
- new status.proxy.on/off keys; inspector.params copy no longer says
  "placeholder"; effect_library.group.builtin key
- bundle the packs as cargo-bundle resources; dev profile dep opt-level
  dropped to 1 for faster iteration builds
This commit is contained in:
2026-08-20 22:27:57 +08:00
parent 73bb686940
commit bf0416c50b
4 changed files with 1144 additions and 1165 deletions
+8 -1
View File
@@ -83,6 +83,10 @@ smallvec = "1"
# Editable-text widget (used by the file / export dialogs' path fields, the
# same gpui-elements crate gpui_widgets builds on).
gpui_elements = { path = "gpui/crates/gpui_elements" }
# UI string tables: YAML language packs under assets/i18n/, loaded at
# runtime (bundled with the app, user-extensible) with the compiled-in
# English table as the fallback.
serde_yaml = "0.9"
# M14 R3: the app is a PURE module-crate consumer — every engine call is a
# direct Rust call into the oak* rlibs (oaknode for the project graph,
@@ -150,6 +154,9 @@ copyright = "Copyright (C) 2026 Oak Team"
licenseFile = "LICENSE"
category = "Video"
icons = ["icons/icon.png"]
# The UI string tables (language packs); users can drop extra
# <lang>.yaml files into the installed i18n directory.
resources = ["assets/i18n"]
binaries = [
{ path = "oak-editor", main = true },
{ path = "oak-cli", main = false },
@@ -157,7 +164,7 @@ binaries = [
]
[profile.dev.package."*"]
opt-level = 3
opt-level = 1
[profile.dev]
opt-level = 1
+428
View File
@@ -0,0 +1,428 @@
# Oak Video Editor UI strings — English (en-US)
# Format: "i18n.key": "Translated text". Add new languages as new files named <lang>.yaml.
"menu.file": "File(F)"
"menu.edit": "Edit(E)"
"menu.view": "View(V)"
"menu.playback": "Playback(P)"
"menu.sequence": "Sequence(S)"
"menu.window": "Window(W)"
"menu.tools": "Tools(T)"
"menu.help": "Help(H)"
"menu.file.new": "New"
"menu.file.new_project": "New Project…"
"menu.file.new_sequence": "New Sequence…"
"menu.file.new_folder": "New Folder"
"menu.file.open_project": "Open Project File…"
"menu.file.open_library": "Open from Library…"
"menu.file.open_recent": "Open Recent"
"menu.file.clear_recent": "Clear Recent List"
"menu.file.project_manager": "Project Manager…"
"menu.file.import_footage": "Import Footage…"
"menu.file.export_project": "Export Project File…"
"menu.file.save_as": "Save As…"
"menu.file.revert": "Revert"
"menu.file.export_media": "Export Media…"
"menu.file.project_properties": "Project Properties…"
"menu.file.close": "Close Project"
"menu.file.quit": "Quit"
"menu.edit.undo": "Undo"
"menu.edit.redo": "Redo"
"menu.edit.cut": "Cut"
"menu.edit.copy": "Copy"
"menu.edit.paste": "Paste"
"menu.edit.paste_insert": "Paste Insert"
"menu.edit.duplicate": "Duplicate"
"menu.edit.rename": "Rename"
"menu.edit.delete": "Delete"
"menu.edit.ripple_delete": "Ripple Delete"
"menu.edit.split": "Split at Playhead"
"menu.edit.speed_duration": "Speed/Duration…"
"menu.edit.default_transition": "Set as Default Transition"
"menu.edit.link_unlink": "Link/Unlink"
"menu.edit.enable_disable": "Enable/Disable"
"menu.edit.nest": "Nest"
"menu.edit.select_all": "Select All"
"menu.edit.deselect_all": "Deselect All"
"menu.edit.insert": "Insert"
"menu.edit.overwrite": "Overwrite"
"menu.edit.ripple_to_in": "Ripple to In"
"menu.edit.ripple_to_out": "Ripple to Out"
"menu.edit.edit_to_in": "Edit to In"
"menu.edit.edit_to_out": "Edit to Out"
"menu.edit.nudge_left": "Nudge Left"
"menu.edit.nudge_right": "Nudge Right"
"menu.edit.move_in_to_playhead": "Move In Point to Playhead"
"menu.edit.move_out_to_playhead": "Move Out Point to Playhead"
"menu.edit.set_in_point": "Set In Point"
"menu.edit.set_out_point": "Set Out Point"
"menu.edit.reset_in": "Reset In Point"
"menu.edit.reset_out": "Reset Out Point"
"menu.edit.clear_in_out": "Clear In/Out"
"menu.edit.delete_in_out": "Delete In to Out"
"menu.edit.ripple_delete_in_out": "Ripple Delete In to Out"
"menu.edit.marker": "Add Marker"
"menu.view.theme": "Theme"
"menu.view.theme.dark": "Olive Dark"
"menu.view.theme.light": "Olive Light"
"menu.view.language": "Language"
"menu.view.language.en": "English"
"menu.view.language.zh": "简体中文"
"menu.view.zoom_in": "Zoom In"
"menu.view.zoom_out": "Zoom Out"
"menu.view.increase_track_height": "Increase Track Height"
"menu.view.decrease_track_height": "Decrease Track Height"
"menu.view.show_all": "Show All Tracks"
"menu.view.full_screen": "Full Screen"
"menu.view.full_screen_viewer": "Full Screen Viewer"
"menu.view.preferences": "Preferences…"
"menu.playback.play_pause": "Play/Pause"
"menu.playback.play_in_to_out": "Play In to Out"
"menu.playback.loop": "Loop"
"menu.playback.shuttle_left": "Shuttle Left"
"menu.playback.shuttle_stop": "Shuttle Stop"
"menu.playback.shuttle_right": "Shuttle Right"
"menu.playback.prev_frame": "Previous Frame"
"menu.playback.next_frame": "Next Frame"
"menu.playback.to_start": "Jump to Sequence Start"
"menu.playback.go_to_end": "Jump to Sequence End"
"menu.playback.prev_cut": "Go to Previous Cut"
"menu.playback.next_cut": "Go to Next Cut"
"menu.playback.go_to_in": "Go to In Point"
"menu.playback.go_to_out": "Go to Out Point"
"menu.sequence.add_video_track": "Add Video Track"
"menu.sequence.add_audio_track": "Add Audio Track"
"menu.sequence.remove_track": "Remove Selected Track"
"menu.sequence.remove_marker": "Remove Marker"
"menu.sequence.set_workarea": "Set Work Area"
"menu.sequence.clear_workarea": "Clear Work Area"
"menu.sequence.cache": "Render Cache"
"menu.sequence.cache_in_out": "Render Cache In to Out"
"menu.sequence.cache_clear": "Clear Render Cache"
"menu.sequence.settings": "Sequence Settings…"
"menu.window.project": "Project"
"menu.window.source_viewer": "Source Viewer"
"menu.window.program_viewer": "Program Viewer"
"menu.window.node_editor": "Node Editor"
"menu.window.inspector": "Inspector"
"menu.window.history": "History"
"menu.window.timeline": "Timeline"
"menu.window.effect_library": "Effect Library"
"menu.window.multicam": "Multi-Cam"
"menu.window.maximize_panel": "Maximize Panel"
"menu.window.reset_layout": "Reset Layout"
"menu.tools.pointer": "Pointer"
"menu.tools.track_select": "Track Select"
"menu.tools.edit": "Edit"
"menu.tools.ripple": "Ripple"
"menu.tools.rolling": "Rolling"
"menu.tools.razor_tool": "Razor"
"menu.tools.slip": "Slip"
"menu.tools.slide": "Slide"
"menu.tools.hand": "Hand"
"menu.tools.zoom_tool": "Zoom"
"menu.tools.transition": "Transition"
"menu.tools.add": "Add"
"menu.tools.record": "Record"
"menu.tools.addable.empty": "Empty Clip"
"menu.tools.addable.bars": "Color Bars"
"menu.tools.addable.shape": "Shape"
"menu.tools.addable.solid": "Solid"
"menu.tools.addable.title": "Title"
"menu.tools.addable.tone": "Test Tone"
"menu.tools.addable.subtitle": "Subtitle"
"menu.tools.snapping": "Snapping"
"menu.tools.use_proxy": "Use Proxy Media"
"menu.tools.proxy_settings": "Proxy Settings…"
"menu.help.action_search": "Search Actions…"
"menu.help.feedback": "Send Feedback…"
"menu.help.about": "About Oak…"
"shortcut.space": "Space"
"panel.project": "Project"
"panel.source_viewer": "Source Viewer"
"panel.program_viewer": "Program Viewer"
"panel.node_editor": "Node Editor"
"panel.inspector": "Inspector"
"panel.history": "History"
"panel.timeline": "Timeline"
"panel.effect_library": "Effect Library"
"panel.multicam": "Multi-Cam"
"multicam.no_multicam": "No multi-camera clip detected"
"multicam.switch_1": "Switch to Camera 1"
"multicam.switch_2": "Switch to Camera 2"
"multicam.switch_3": "Switch to Camera 3"
"multicam.switch_4": "Switch to Camera 4"
"multicam.switch_5": "Switch to Camera 5"
"multicam.switch_6": "Switch to Camera 6"
"multicam.switch_7": "Switch to Camera 7"
"multicam.switch_8": "Switch to Camera 8"
"multicam.switch_9": "Switch to Camera 9"
"effect_library.hint": "Double-click to add to the selected clip"
"effect_library.group.builtin": "Built-in"
"status.ready": "Ready"
"status.cache": "Cache: Enabled"
"status.proxy.on": "Proxy: On"
"status.proxy.off": "Proxy: Off"
"status.storage.written": "Library: written"
"status.storage.unbound": "Library: off"
"status.storage.error": "Library: write failed"
"status.untitled": "Untitled Project"
"status.backend": "Engine:"
"manager.title": "Project Manager"
"manager.new": "New Project"
"manager.new.default_name": "Untitled Project"
"manager.open": "Open"
"manager.rename": "Rename…"
"manager.rename.title": "Rename Project"
"manager.rename.label": "New name"
"manager.duplicate": "Duplicate"
"manager.delete": "Delete"
"manager.delete.title": "Delete Project"
"manager.delete.confirm": "Delete project \"{name}\" from the library? This cannot be undone."
"manager.import": "Import…"
"manager.import.title": "Import Project"
"manager.export": "Export…"
"manager.export.title": "Export Project"
"manager.col.name": "Name"
"manager.col.modified": "Modified"
"manager.col.duration": "Duration"
"manager.col.tracks": "Tracks"
"manager.col.clips": "Clips"
"manager.col.footage": "Footage"
"manager.empty": "No projects in the library yet."
"timeline.tool.select": "Select"
"timeline.tool.razor": "Razor"
"timeline.tool.ripple": "Ripple"
"timeline.tool.slip": "Slip"
"timeline.tool.roll": "Roll"
"timeline.tool.zoom": "Zoom"
"timeline.tool.slide": "Slide"
"timeline.tool.track_select": "Track Select"
"timeline.zoom": "Zoom"
"timeline.zoom_in": "Zoom In"
"timeline.zoom_out": "Zoom Out"
"timeline.track_height": "Track Height"
"timeline.snap": "Snap"
"timeline.add_video_track": "Add Video Track"
"timeline.add_audio_track": "Add Audio Track"
"bin.footage": "Footage"
"bin.music": "Music"
"history.command": "Command"
"history.empty": "No History"
"history.jump_here": "Jump to This Step"
"node.fit": "Fit"
"viewer.picture": "Picture"
"viewer.scopes": "Scopes"
"scope.histogram": "Histogram"
"scope.waveform": "Waveform"
"scope.vectorscope": "Vectorscope"
"viewer.in_point": "Set In Point"
"viewer.step_back": "Previous Frame"
"viewer.play": "Play"
"viewer.pause": "Pause"
"viewer.step_forward": "Next Frame"
"viewer.out_point": "Set Out Point"
"viewer.clear_range": "Clear In/Out Range"
"explorer.tree": "Tree"
"explorer.icons": "Icons"
"viewer.safe_frames": "Safe Frames"
"viewer.zoom": "Zoom"
"viewer.no_frame_source": "No frame source"
"effect_stack.empty": "No selection"
"effect_stack.add": "+ Add Effect"
"inspector.params": "No editable parameters"
"inspector.badge.openfx": "OpenFX"
"ofx.progress.title": "OpenFX Plugin Progress"
"ofx.color.hex": "Hex"
"ofx.color.ok": "OK"
"ofx.color.cancel": "Cancel"
"ofx.color.invalid": "Invalid hex color"
"dialog.cancel": "Cancel"
"dialog.close": "Close"
"file.open.title": "Open Project"
"file.import_footage.title": "Import Footage"
"preferences.title": "Preferences"
"preferences.section.general": "General"
"preferences.section.render": "Rendering"
"preferences.section.cache": "Cache"
"preferences.section.proxy": "Proxy"
"preferences.section.project": "Project"
"preferences.section.audio": "Audio"
"preferences.backend": "Renderer backend"
"preferences.hwdecode.enable": "Hardware-accelerated video decoding (VideoToolbox / VA-API / NVDEC / D3D11VA)"
"preferences.backend.placeholder": "Select a backend…"
"preferences.language": "Language"
"preferences.language.placeholder": "Select a language…"
"preferences.theme": "Theme"
"preferences.theme.dark": "Olive Dark"
"preferences.theme.light": "Olive Light"
"preferences.cache.dir": "Disk cache directory"
"preferences.cache.browse": "Browse…"
"preferences.proxy.enable": "Use proxy media"
"preferences.proxy.resolution": "Proxy resolution"
"preferences.proxy.full": "Full resolution"
"preferences.snapshot.interval": "Auto-save (snapshot) interval, seconds"
"preferences.transition.default": "Default transition length, seconds"
"preferences.audio.output": "Audio output device"
"preferences.audio.output.placeholder": "Select an output device…"
"preferences.audio.input": "Audio input device"
"preferences.audio.input.placeholder": "Select an input device…"
"preferences.audio.default": "System Default"
"preferences.hint": "The renderer backend applies to the render worker at the next launch; every other setting takes effect immediately and is saved on exit."
"preferences.tab.general": "General"
"preferences.tab.keyboard": "Keyboard"
"preferences.section.keyboard": "Keyboard"
"preferences.keyboard.search": "Search for action or shortcut"
"preferences.keyboard.action": "Action"
"preferences.keyboard.shortcut": "Shortcut"
"preferences.keyboard.click_to_edit": "Click to set shortcut…"
"preferences.keyboard.capturing": "Press keys… (Esc to cancel)"
"preferences.keyboard.unbound": "None"
"preferences.keyboard.import": "Import…"
"preferences.keyboard.export": "Export…"
"preferences.keyboard.reset_selected": "Reset Selected"
"preferences.keyboard.reset_all": "Reset All"
"preferences.keyboard.reset_all.confirm": "Are you sure you wish to reset all keyboard shortcuts to their defaults?"
"preferences.keyboard.conflict": "The shortcut is already bound to {action}; the binding has been moved."
"preferences.keyboard.cleared": "Shortcut cleared (action unbound)."
"preferences.keyboard.reset": "Shortcut reset to its default."
"preferences.keyboard.reset_all_done": "All shortcuts reset to their defaults."
"preferences.keyboard.imported": "Shortcuts imported successfully."
"preferences.keyboard.exported": "Shortcuts exported successfully."
"preferences.keyboard.import_failed": "Failed to open the file for reading."
"preferences.keyboard.export_failed": "Failed to open the file for writing."
"actionsearch.search_placeholder": "Search for action…"
"actionsearch.empty": "No matching actions"
"actionsearch.no_actions": "No actions available"
"export.title": "Export Sequence"
"export.format": "Format"
"export.format.placeholder": "Select a format…"
"export.path": "Output path"
"export.run": "Export"
"export.hint": "The sequence is exported through the oaktask export path; progress is shown in the dialog."
"export.progress.title": "Exporting"
"export.progress.label": "Rendering frames…"
"proxydialog.title": "Proxy Settings"
"proxydialog.footage_group": "Footage"
"proxydialog.no_footage": "No footage in the project"
"proxydialog.custom": "Use custom settings for footage"
"proxydialog.custom_suffix": " (custom settings)"
"proxydialog.global": "Global Proxy Settings"
"proxydialog.resolution": "Proxy Resolution"
"proxydialog.resolution.custom": "Custom size"
"proxydialog.resolution.half": "1/2 of source"
"proxydialog.resolution.quarter": "1/4 of source"
"proxydialog.resolution.eighth": "1/8 of source"
"proxydialog.width": "Proxy Width"
"proxydialog.height": "Proxy Height"
"proxydialog.crf": "Proxy CRF"
"proxydialog.preset": "Proxy Preset"
"proxydialog.include_audio": "Include audio in proxies"
"proxydialog.ffmpeg": "ffmpeg Executable"
"proxydialog.generate": "Generate Proxies"
"proxydialog.delete": "Delete Proxies"
"proxydialog.close": "Close"
"proxydialog.state.missing": "Missing"
"proxydialog.state.generating": "Generating"
"proxydialog.state.ready": "Ready"
"proxydialog.state.failed": "Failed"
"menu.color.label": "Color Label"
"menu.color.red": "Red"
"menu.color.maroon": "Maroon"
"menu.color.orange": "Orange"
"menu.color.brown": "Brown"
"menu.color.yellow": "Yellow"
"menu.color.oak": "Oak"
"menu.color.lime": "Lime"
"menu.color.green": "Green"
"menu.color.cyan": "Cyan"
"menu.color.teal": "Teal"
"menu.color.blue": "Blue"
"menu.color.navy": "Navy"
"menu.color.pink": "Pink"
"menu.color.purple": "Purple"
"menu.color.silver": "Silver"
"menu.color.gray": "Gray"
"menu.context.properties": "Properties"
"timeline.context.sync_source_time": "Synchronize by Source Time"
"timeline.context.sync_waveform": "Synchronize by Waveform"
"timeline.context.sync_waveform_speed": "Synchronize by Waveform (Adjust Speed)"
"timeline.context.cache": "Cache"
"timeline.context.auto_cache": "Auto-Cache"
"timeline.context.cache_all": "Cache All"
"timeline.context.cache_in_out": "Cache In/Out"
"timeline.context.cache_discard": "Discard"
"timeline.context.proxy": "Proxy"
"timeline.context.generate_proxy": "Generate Proxy"
"timeline.context.use_proxy": "Use Proxy"
"timeline.context.reveal_proxy": "Reveal Proxy"
"timeline.context.delete_proxy": "Delete Proxy"
"timeline.context.reveal_in_footage_viewer": "Reveal in Footage Viewer"
"timeline.context.reveal_in_project": "Reveal in Project"
"timeline.context.multicam": "Multi-Cam"
"timeline.context.use_audio_time_units": "Use Audio Time Units"
"timeline.context.show_thumbnails": "Show Thumbnails"
"timeline.context.thumbnails_off": "Disabled"
"timeline.context.thumbnails_at_in_points": "Only At In Points"
"timeline.context.thumbnails_on": "Enabled"
"timeline.context.show_waveforms": "Show Waveforms"
"timeline.context.add_video_track": "Add Video Track"
"timeline.context.add_audio_track": "Add Audio Track"
"timeline.context.delete_track": "Delete"
"timeline.context.delete_all_empty": "Delete All Empty"
"timeline.context.timecode_drop_frame": "Drop Frame"
"timeline.context.timecode_non_drop_frame": "Non-Drop Frame"
"timeline.context.timecode_seconds": "Seconds"
"timeline.context.timecode_frames": "Frames"
"timeline.context.timecode_milliseconds": "Milliseconds"
"node.category.output": "Output"
"node.category.effect": "Effect"
"node.category.generator": "Generator"
"node.category.input": "Input"
"node.category.math": "Math"
"node.category.color": "Color"
"node.category.distort": "Distort"
"node.category.filter": "Filter"
"node.category.keying": "Keying"
"node.category.openfx": "OpenFX"
"node.category.group": "Group"
"project.context.new": "New"
"project.context.reveal_in_finder": "Reveal in Finder"
"project.context.replace_footage": "Replace Footage"
"project.context.rename": "Rename"
"project.context.delete": "Delete"
"project.context.open_in_new_tab": "Open in New Tab"
"project.context.open_in_new_window": "Open in New Window"
"viewer.context.zoom": "Zoom"
"viewer.context.zoom_fit": "Fit"
"viewer.context.full_screen": "Full Screen"
"viewer.context.playback_resolution": "Playback Resolution"
"viewer.context.res_full": "Full"
"viewer.context.res_half": "1/2"
"viewer.context.res_quarter": "1/4"
"viewer.context.res_eighth": "1/8"
"viewer.context.safe_margins": "Safe Margins"
"viewer.context.safe_off": "Off"
"viewer.context.safe_on": "On"
"viewer.context.safe_custom": "Custom Aspect"
"viewer.context.stop_on_last": "Stop Playback On Last Frame"
"viewer.context.audio_waveform": "Audio Waveform"
"viewer.context.wf_automatic": "Automatically Show/Hide"
"viewer.context.wf_only": "Show Waveform Only"
"viewer.context.wf_both": "Show Both Viewer And Waveform"
"viewer.context.show_fps": "Show FPS"
"viewer.context.save_frame": "Save Frame As Image"
"node.context.group": "Group"
"node.context.ungroup": "Ungroup"
"node.context.open_in_viewer": "Open in Viewer"
"node.context.show_in_param_editor": "Show in Parameter Editor"
"node.context.smooth_edges": "Smooth Edges"
"node.context.direction": "Direction"
"node.context.dir_top_bottom": "Top to Bottom"
"node.context.dir_bottom_top": "Bottom to Top"
"node.context.dir_left_right": "Left to Right"
"node.context.dir_right_left": "Right to Left"
"node.context.add": "Add"
"inspector.context.enable": "Enable"
"inspector.context.disable": "Disable"
"inspector.context.remove": "Remove"
"inspector.context.rename": "Rename"
+428
View File
@@ -0,0 +1,428 @@
# Oak Video Editor UI strings — 简体中文 (zh-CN)
# Format: "i18n.key": "Translated text". Add new languages as new files named <lang>.yaml.
"menu.file": "文件(F)"
"menu.edit": "编辑(E)"
"menu.view": "视图(V)"
"menu.playback": "回放(P)"
"menu.sequence": "序列(S)"
"menu.window": "窗口(W)"
"menu.tools": "工具(T)"
"menu.help": "帮助(H)"
"menu.file.new": "新建"
"menu.file.new_project": "新建项目…"
"menu.file.new_sequence": "新建序列…"
"menu.file.new_folder": "新建文件夹"
"menu.file.open_project": "打开工程文件…"
"menu.file.open_library": "从库中打开…"
"menu.file.open_recent": "最近打开"
"menu.file.clear_recent": "清除最近列表"
"menu.file.project_manager": "项目管理器…"
"menu.file.import_footage": "导入素材…"
"menu.file.export_project": "导出工程文件…"
"menu.file.save_as": "另存为…"
"menu.file.revert": "还原"
"menu.file.export_media": "导出媒体…"
"menu.file.project_properties": "项目属性…"
"menu.file.close": "关闭项目"
"menu.file.quit": "退出"
"menu.edit.undo": "撤销"
"menu.edit.redo": "重做"
"menu.edit.cut": "剪切"
"menu.edit.copy": "复制"
"menu.edit.paste": "粘贴"
"menu.edit.paste_insert": "粘贴插入"
"menu.edit.duplicate": "创建副本"
"menu.edit.rename": "重命名"
"menu.edit.delete": "删除"
"menu.edit.ripple_delete": "波纹删除"
"menu.edit.split": "在播放头处分割"
"menu.edit.speed_duration": "速度/持续时间…"
"menu.edit.default_transition": "设为默认转场"
"menu.edit.link_unlink": "链接/取消链接"
"menu.edit.enable_disable": "启用/禁用"
"menu.edit.nest": "嵌套"
"menu.edit.select_all": "全选"
"menu.edit.deselect_all": "取消全选"
"menu.edit.insert": "插入"
"menu.edit.overwrite": "覆盖"
"menu.edit.ripple_to_in": "波纹修剪到入点"
"menu.edit.ripple_to_out": "波纹修剪到出点"
"menu.edit.edit_to_in": "编辑到入点"
"menu.edit.edit_to_out": "编辑到出点"
"menu.edit.nudge_left": "向左微调"
"menu.edit.nudge_right": "向右微调"
"menu.edit.move_in_to_playhead": "移动入点到播放头"
"menu.edit.move_out_to_playhead": "移动出点到播放头"
"menu.edit.set_in_point": "设置入点"
"menu.edit.set_out_point": "设置出点"
"menu.edit.reset_in": "重置入点"
"menu.edit.reset_out": "重置出点"
"menu.edit.clear_in_out": "清除入出点"
"menu.edit.delete_in_out": "删除入出点之间"
"menu.edit.ripple_delete_in_out": "波纹删除入出点之间"
"menu.edit.marker": "添加标记"
"menu.view.theme": "主题"
"menu.view.theme.dark": "Olive Dark"
"menu.view.theme.light": "Olive Light"
"menu.view.language": "语言"
"menu.view.language.en": "English"
"menu.view.language.zh": "简体中文"
"menu.view.zoom_in": "放大"
"menu.view.zoom_out": "缩小"
"menu.view.increase_track_height": "增加轨道高度"
"menu.view.decrease_track_height": "降低轨道高度"
"menu.view.show_all": "显示全部轨道"
"menu.view.full_screen": "全屏"
"menu.view.full_screen_viewer": "全屏查看器"
"menu.view.preferences": "偏好设置…"
"menu.playback.play_pause": "播放/暂停"
"menu.playback.play_in_to_out": "从入点播放到出点"
"menu.playback.loop": "循环播放"
"menu.playback.shuttle_left": "穿梭左"
"menu.playback.shuttle_stop": "穿梭停止"
"menu.playback.shuttle_right": "穿梭右"
"menu.playback.prev_frame": "上一帧"
"menu.playback.next_frame": "下一帧"
"menu.playback.to_start": "跳到序列起点"
"menu.playback.go_to_end": "跳到序列终点"
"menu.playback.prev_cut": "跳到上一剪辑点"
"menu.playback.next_cut": "跳到下一剪辑点"
"menu.playback.go_to_in": "跳到入点"
"menu.playback.go_to_out": "跳到出点"
"menu.sequence.add_video_track": "添加视频轨道"
"menu.sequence.add_audio_track": "添加音频轨道"
"menu.sequence.remove_track": "删除所选轨道"
"menu.sequence.remove_marker": "清除标记"
"menu.sequence.set_workarea": "设置工作区"
"menu.sequence.clear_workarea": "清除工作区"
"menu.sequence.cache": "渲染缓存"
"menu.sequence.cache_in_out": "渲染缓存入出点之间"
"menu.sequence.cache_clear": "清除渲染缓存"
"menu.sequence.settings": "序列设置…"
"menu.window.project": "项目"
"menu.window.source_viewer": "素材查看器"
"menu.window.program_viewer": "序列查看器"
"menu.window.node_editor": "节点编辑器"
"menu.window.inspector": "检查器"
"menu.window.history": "历史记录"
"menu.window.timeline": "时间线"
"menu.window.effect_library": "效果库"
"menu.window.multicam": "多机位"
"menu.window.maximize_panel": "最大化面板"
"menu.window.reset_layout": "重置布局"
"menu.tools.pointer": "指针"
"menu.tools.track_select": "轨道选择"
"menu.tools.edit": "编辑"
"menu.tools.ripple": "波纹"
"menu.tools.rolling": "滚动"
"menu.tools.razor_tool": "剃刀"
"menu.tools.slip": "滑移"
"menu.tools.slide": "滑动"
"menu.tools.hand": "抓手"
"menu.tools.zoom_tool": "缩放"
"menu.tools.transition": "转场"
"menu.tools.add": "添加"
"menu.tools.record": "录制"
"menu.tools.addable.empty": "空白片段"
"menu.tools.addable.bars": "彩条"
"menu.tools.addable.shape": "形状"
"menu.tools.addable.solid": "纯色"
"menu.tools.addable.title": "标题"
"menu.tools.addable.tone": "测试音"
"menu.tools.addable.subtitle": "字幕"
"menu.tools.snapping": "吸附"
"menu.tools.use_proxy": "使用代理媒体"
"menu.tools.proxy_settings": "代理设置…"
"menu.help.action_search": "搜索动作…"
"menu.help.feedback": "发送反馈…"
"menu.help.about": "关于 Oak…"
"shortcut.space": "空格"
"panel.project": "项目"
"panel.source_viewer": "素材查看器"
"panel.program_viewer": "序列查看器"
"panel.node_editor": "节点编辑器"
"panel.inspector": "检查器"
"panel.history": "历史记录"
"panel.timeline": "时间线"
"panel.effect_library": "效果库"
"panel.multicam": "多机位"
"multicam.no_multicam": "未检测到多机位片段"
"multicam.switch_1": "切换到机位 1"
"multicam.switch_2": "切换到机位 2"
"multicam.switch_3": "切换到机位 3"
"multicam.switch_4": "切换到机位 4"
"multicam.switch_5": "切换到机位 5"
"multicam.switch_6": "切换到机位 6"
"multicam.switch_7": "切换到机位 7"
"multicam.switch_8": "切换到机位 8"
"multicam.switch_9": "切换到机位 9"
"effect_library.hint": "双击添加到选中片段"
"effect_library.group.builtin": "内置"
"status.ready": "就绪"
"status.cache": "缓存:已启用"
"status.proxy.on": "代理:开"
"status.proxy.off": "代理:关"
"status.storage.written": "库:已写入"
"status.storage.unbound": "库:未启用"
"status.storage.error": "库:写入失败"
"status.untitled": "未命名项目"
"status.backend": "引擎:"
"manager.title": "项目管理器"
"manager.new": "新建项目"
"manager.new.default_name": "未命名项目"
"manager.open": "打开"
"manager.rename": "重命名…"
"manager.rename.title": "重命名工程"
"manager.rename.label": "新名称"
"manager.duplicate": "复制"
"manager.delete": "删除"
"manager.delete.title": "删除工程"
"manager.delete.confirm": "从库中删除工程“{name}”?此操作不可撤销。"
"manager.import": "导入…"
"manager.import.title": "导入工程"
"manager.export": "导出…"
"manager.export.title": "导出工程"
"manager.col.name": "名称"
"manager.col.modified": "修改时间"
"manager.col.duration": "时长"
"manager.col.tracks": "轨道"
"manager.col.clips": "片段"
"manager.col.footage": "素材"
"manager.empty": "库中还没有工程。"
"timeline.tool.select": "选择"
"timeline.tool.razor": "剃刀"
"timeline.tool.ripple": "波纹"
"timeline.tool.slip": "滑动"
"timeline.tool.roll": "滚动"
"timeline.tool.zoom": "缩放"
"timeline.tool.slide": "滑移"
"timeline.tool.track_select": "轨道选择"
"timeline.zoom": "缩放"
"timeline.zoom_in": "放大"
"timeline.zoom_out": "缩小"
"timeline.track_height": "轨道高"
"timeline.snap": "吸附"
"timeline.add_video_track": "新建视频轨"
"timeline.add_audio_track": "新建音频轨"
"bin.footage": "素材"
"bin.music": "音乐"
"history.command": "命令"
"history.empty": "暂无历史记录"
"history.jump_here": "跳转到此步骤"
"node.fit": "适配"
"viewer.picture": "画面"
"viewer.scopes": "示波器"
"scope.histogram": "直方图"
"scope.waveform": "波形图"
"scope.vectorscope": "矢量示波器"
"viewer.in_point": "设置入点"
"viewer.step_back": "上一帧"
"viewer.play": "播放"
"viewer.pause": "暂停"
"viewer.step_forward": "下一帧"
"viewer.out_point": "设置出点"
"viewer.clear_range": "清除入出点"
"explorer.tree": "树"
"explorer.icons": "图标"
"viewer.safe_frames": "安全框"
"viewer.zoom": "缩放"
"viewer.no_frame_source": "无帧源"
"effect_stack.empty": "未选择"
"effect_stack.add": "+ 添加效果"
"inspector.params": "没有可编辑的参数"
"inspector.badge.openfx": "OpenFX"
"ofx.progress.title": "OpenFX 插件进度"
"ofx.color.hex": "十六进制"
"ofx.color.ok": "确定"
"ofx.color.cancel": "取消"
"ofx.color.invalid": "无效的十六进制颜色"
"dialog.cancel": "取消"
"dialog.close": "关闭"
"file.open.title": "打开项目"
"file.import_footage.title": "导入素材"
"preferences.title": "偏好设置"
"preferences.section.general": "常规"
"preferences.section.render": "渲染"
"preferences.section.cache": "缓存"
"preferences.section.proxy": "代理"
"preferences.section.project": "项目"
"preferences.section.audio": "音频"
"preferences.backend": "渲染后端"
"preferences.hwdecode.enable": "硬件加速视频解码(VideoToolbox / VA-API / NVDEC / D3D11VA"
"preferences.backend.placeholder": "选择一个后端…"
"preferences.language": "语言"
"preferences.language.placeholder": "选择语言…"
"preferences.theme": "主题"
"preferences.theme.dark": "Olive Dark"
"preferences.theme.light": "Olive Light"
"preferences.cache.dir": "磁盘缓存目录"
"preferences.cache.browse": "浏览…"
"preferences.proxy.enable": "使用代理媒体"
"preferences.proxy.resolution": "代理分辨率"
"preferences.proxy.full": "原始分辨率"
"preferences.snapshot.interval": "自动保存(快照)间隔(秒)"
"preferences.transition.default": "默认过渡时长(秒)"
"preferences.audio.output": "音频输出设备"
"preferences.audio.output.placeholder": "选择输出设备…"
"preferences.audio.input": "音频输入设备"
"preferences.audio.input.placeholder": "选择输入设备…"
"preferences.audio.default": "系统默认"
"preferences.hint": "渲染后端在下次启动渲染工作进程时生效;其余设置立即生效,并在退出时保存。"
"preferences.tab.general": "常规"
"preferences.tab.keyboard": "键盘"
"preferences.section.keyboard": "键盘"
"preferences.keyboard.search": "搜索动作或快捷键"
"preferences.keyboard.action": "动作"
"preferences.keyboard.shortcut": "快捷键"
"preferences.keyboard.click_to_edit": "点击设置快捷键…"
"preferences.keyboard.capturing": "按下按键…(Esc 取消)"
"preferences.keyboard.unbound": "无"
"preferences.keyboard.import": "导入…"
"preferences.keyboard.export": "导出…"
"preferences.keyboard.reset_selected": "重置选中项"
"preferences.keyboard.reset_all": "重置全部"
"preferences.keyboard.reset_all.confirm": "确定要将所有键盘快捷键重置为默认值吗?"
"preferences.keyboard.conflict": "该快捷键已被 {action} 占用;绑定已转移。"
"preferences.keyboard.cleared": "快捷键已清除(动作已取消绑定)。"
"preferences.keyboard.reset": "快捷键已重置为默认值。"
"preferences.keyboard.reset_all_done": "所有快捷键已重置为默认值。"
"preferences.keyboard.imported": "快捷键导入成功。"
"preferences.keyboard.exported": "快捷键导出成功。"
"preferences.keyboard.import_failed": "无法打开文件读取。"
"preferences.keyboard.export_failed": "无法打开文件写入。"
"actionsearch.search_placeholder": "搜索动作…"
"actionsearch.empty": "无匹配动作"
"actionsearch.no_actions": "没有可用动作"
"export.title": "导出序列"
"export.format": "格式"
"export.format.placeholder": "选择格式…"
"export.path": "输出路径"
"export.run": "导出"
"export.hint": "序列通过 oaktask 导出路径导出;进度显示在对话框中。"
"export.progress.title": "正在导出"
"export.progress.label": "正在渲染帧…"
"proxydialog.title": "代理设置"
"proxydialog.footage_group": "素材"
"proxydialog.no_footage": "项目中没有素材"
"proxydialog.custom": "对素材使用自定义设置"
"proxydialog.custom_suffix": "(自定义设置)"
"proxydialog.global": "全局代理设置"
"proxydialog.resolution": "代理分辨率"
"proxydialog.resolution.custom": "自定义尺寸"
"proxydialog.resolution.half": "源分辨率的 1/2"
"proxydialog.resolution.quarter": "源分辨率的 1/4"
"proxydialog.resolution.eighth": "源分辨率的 1/8"
"proxydialog.width": "代理宽度"
"proxydialog.height": "代理高度"
"proxydialog.crf": "代理 CRF"
"proxydialog.preset": "代理预设"
"proxydialog.include_audio": "代理包含音频"
"proxydialog.ffmpeg": "ffmpeg 可执行文件"
"proxydialog.generate": "生成代理"
"proxydialog.delete": "删除代理"
"proxydialog.close": "关闭"
"proxydialog.state.missing": "缺失"
"proxydialog.state.generating": "生成中"
"proxydialog.state.ready": "就绪"
"proxydialog.state.failed": "失败"
"menu.color.label": "颜色标签"
"menu.color.red": "红色"
"menu.color.maroon": "紫褐色"
"menu.color.orange": "橙色"
"menu.color.brown": "棕色"
"menu.color.yellow": "黄色"
"menu.color.oak": "橄榄色"
"menu.color.lime": "黄绿色"
"menu.color.green": "绿色"
"menu.color.cyan": "青色"
"menu.color.teal": "蓝绿色"
"menu.color.blue": "蓝色"
"menu.color.navy": "深蓝色"
"menu.color.pink": "粉色"
"menu.color.purple": "紫色"
"menu.color.silver": "银色"
"menu.color.gray": "灰色"
"menu.context.properties": "属性"
"timeline.context.sync_source_time": "按源时间同步"
"timeline.context.sync_waveform": "按波形同步"
"timeline.context.sync_waveform_speed": "按波形同步(调整速度)"
"timeline.context.cache": "缓存"
"timeline.context.auto_cache": "自动缓存"
"timeline.context.cache_all": "缓存全部"
"timeline.context.cache_in_out": "缓存入点/出点"
"timeline.context.cache_discard": "丢弃"
"timeline.context.proxy": "代理"
"timeline.context.generate_proxy": "生成代理"
"timeline.context.use_proxy": "使用代理"
"timeline.context.reveal_proxy": "显示代理"
"timeline.context.delete_proxy": "删除代理"
"timeline.context.reveal_in_footage_viewer": "在素材查看器中显示"
"timeline.context.reveal_in_project": "在项目中显示"
"timeline.context.multicam": "多机位"
"timeline.context.use_audio_time_units": "使用音频时间单位"
"timeline.context.show_thumbnails": "显示缩略图"
"timeline.context.thumbnails_off": "关闭"
"timeline.context.thumbnails_at_in_points": "仅在入点"
"timeline.context.thumbnails_on": "开启"
"timeline.context.show_waveforms": "显示波形"
"timeline.context.add_video_track": "新建视频轨"
"timeline.context.add_audio_track": "新建音频轨"
"timeline.context.delete_track": "删除"
"timeline.context.delete_all_empty": "删除所有空轨道"
"timeline.context.timecode_drop_frame": "丢帧"
"timeline.context.timecode_non_drop_frame": "不丢帧"
"timeline.context.timecode_seconds": "秒"
"timeline.context.timecode_frames": "帧"
"timeline.context.timecode_milliseconds": "毫秒"
"node.category.output": "输出"
"node.category.effect": "效果"
"node.category.generator": "生成器"
"node.category.input": "输入"
"node.category.math": "数学"
"node.category.color": "颜色"
"node.category.distort": "变形"
"node.category.filter": "滤镜"
"node.category.keying": "抠像"
"node.category.openfx": "OpenFX"
"node.category.group": "组"
"project.context.new": "新建"
"project.context.reveal_in_finder": "在 Finder 中显示"
"project.context.replace_footage": "替换素材"
"project.context.rename": "重命名"
"project.context.delete": "删除"
"project.context.open_in_new_tab": "在新标签页中打开"
"project.context.open_in_new_window": "在新窗口中打开"
"viewer.context.zoom": "缩放"
"viewer.context.zoom_fit": "适合"
"viewer.context.full_screen": "全屏"
"viewer.context.playback_resolution": "播放分辨率"
"viewer.context.res_full": "完整"
"viewer.context.res_half": "1/2"
"viewer.context.res_quarter": "1/4"
"viewer.context.res_eighth": "1/8"
"viewer.context.safe_margins": "安全边距"
"viewer.context.safe_off": "关闭"
"viewer.context.safe_on": "开启"
"viewer.context.safe_custom": "自定义宽高比"
"viewer.context.stop_on_last": "在最后一帧停止播放"
"viewer.context.audio_waveform": "音频波形"
"viewer.context.wf_automatic": "自动显示/隐藏"
"viewer.context.wf_only": "仅显示波形"
"viewer.context.wf_both": "同时显示画面和波形"
"viewer.context.show_fps": "显示FPS"
"viewer.context.save_frame": "将帧另存为图像"
"node.context.group": "组合"
"node.context.ungroup": "取消组合"
"node.context.open_in_viewer": "在查看器中打开"
"node.context.show_in_param_editor": "在参数编辑器中显示"
"node.context.smooth_edges": "平滑边缘"
"node.context.direction": "方向"
"node.context.dir_top_bottom": "从上到下"
"node.context.dir_bottom_top": "从下到上"
"node.context.dir_left_right": "从左到右"
"node.context.dir_right_left": "从右到左"
"node.context.add": "添加"
"inspector.context.enable": "启用"
"inspector.context.disable": "禁用"
"inspector.context.remove": "移除"
"inspector.context.rename": "重命名"
+280 -1164
View File
File diff suppressed because it is too large Load Diff