From 1e87e85ab7ae3f70e68f00db2aeb579f93258c7d Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Fri, 16 Oct 2026 15:46:37 -0700 Subject: [PATCH] i18n: Simplified Chinese translates status-bar and error messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Simplified Chinese catalog had 20 `@msg` rows, against 714 to 718 in each catalog listed in COMPLETE_MESSAGES, so with the interface in Simplified Chinese most status-bar and error messages showed in English. - zh-hans.tsv gains the 694 missing `@msg` rows in one block with a header comment on its conventions: no final 。 unless the English ends with a period, a space between Chinese and adjacent Latin text, numbers or placeholders, and 、 between list items. The rows use the catalog's existing terms (画板, 图稿, 编组, 描边, 色板, 实时上色, 图像描摹, 增效工具 ...). - zh-hans joins COMPLETE_MESSAGES, so complete_languages_translate_every_message and the narrower message tests fail when a zh-hans message row is missing, and a new message needs a zh-hans row. - The registry comment, docs/development.md (which also gains Greek, already in COMPLETE_MESSAGES), the zh-hans row of docs/localization-parity.md, and the interface-languages line of docs/target-app-parity.md (which also gains Czech, Greek, Hungarian, Swedish and Finnish) list Simplified Chinese among the languages that translate messages. --- crates/ui-egui/src/i18n/mod.rs | 4 +- crates/ui-egui/src/i18n/tests.rs | 2 +- crates/ui-egui/src/i18n/zh-hans.tsv | 700 ++++++++++++++++++++++++++++ docs/development.md | 2 +- docs/localization-parity.md | 2 +- docs/target-app-parity.md | 2 +- 6 files changed, 706 insertions(+), 6 deletions(-) diff --git a/crates/ui-egui/src/i18n/mod.rs b/crates/ui-egui/src/i18n/mod.rs index 9698fb82a..d5cc3a5a8 100644 --- a/crates/ui-egui/src/i18n/mod.rs +++ b/crates/ui-egui/src/i18n/mod.rs @@ -223,8 +223,8 @@ pub static LANGUAGES: [LangInfo; 23] = [ complete_menus: true, catalog: OnceLock::new(), }, - // Simplified Chinese in the vocabulary used in mainland China; `zh-CN`, `zh-SG`, `zh-Hans-*` and a - // bare `zh` resolve here (see `candidates`). + // Simplified Chinese in the vocabulary used in mainland China: the whole interface and the status + // and error messages; `zh-CN`, `zh-SG`, `zh-Hans-*` and a bare `zh` resolve here (see `candidates`). LangInfo { code: "zh-hans", name: "简体中文", diff --git a/crates/ui-egui/src/i18n/tests.rs b/crates/ui-egui/src/i18n/tests.rs index 3ab33db42..a17831fbe 100644 --- a/crates/ui-egui/src/i18n/tests.rs +++ b/crates/ui-egui/src/i18n/tests.rs @@ -1290,7 +1290,7 @@ fn select_key_param_error_is_translated() { } /// Languages whose catalogs cover every status and error message. -const COMPLETE_MESSAGES: &[&str] = &["cs", "de", "el", "es", "fr", "hu", "it", "ja", "ko", "pl", "pt-br", "ru", "sv", "uk", "vi", "fi"]; +const COMPLETE_MESSAGES: &[&str] = &["cs", "de", "el", "es", "fr", "hu", "it", "ja", "ko", "pl", "pt-br", "ru", "sv", "uk", "vi", "zh-hans", "fi"]; /// Crates whose error and status messages reach the status bar. const MESSAGE_CRATES: &[&str] = &["ui-egui", "engine", "doc", "format", "svg", "pdf", "eps", "text", "plugins", "metafile", "cad", "trace"]; diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index c1e8299d3..cdb7f3f12 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -3381,6 +3381,706 @@ imageTrace Outline 轮廓 Set: 集: Shortcut 快捷键 Use Default 使用默认值 +# Status and error messages (`@msg`), translated where the status bar shows them; the message itself +# stays English for agents and tests. `{_1}`, `{_2}` … stand for the `{}` of the format string, in order +# (`complete_languages_translate_every_message` lists any that are missing). Command ids, parameter +# names and values in backticks or code (`colorModel rgb`, `document.export`) stay as they are. +# Simplified Chinese: no final 。 unless the English ends with a period; a space between Chinese text and +# an adjacent Latin word, number or {placeholder}; 、 between the items of a list. +@msg `{key}` must be an array of these names: {_1} `{key}` 必须是由以下名称组成的数组:{_1} +@msg Reset {_1} 重置 {_1} +@msg Saving 正在保存 +@msg Saving {_1} 正在保存 {_1} +@msg Sent to {_1} 已发送到 {_1} +@msg `to` must be "corner" or "smooth" `to` 必须是 "corner" 或 "smooth" +@msg a layer couldn't be read 无法读取某个图层 +@msg it has more than one artboard 它有多个画板 +@msg its editing data has no layers 其编辑数据中没有图层 +@msg its editing data is damaged 其编辑数据已损坏 +@msg its type is to come in as outlines, which only its page has 其文字需要以轮廓导入,而只有其页面中包含这些轮廓 +@msg {_1} files {_1} 文件 +@msg A browser with WebGPU or WebGL2 is required. 需要支持 WebGPU 或 WebGL2 的浏览器。 +@msg Loading VectorCraft… 正在加载 VectorCraft… +@msg Reload the page to go on (changes not saved yet may be lost). 请重新加载页面以继续 (尚未保存的更改可能会丢失)。 +@msg The graphics were lost and couldn't be restarted. 图形已丢失,且无法重新启动。 +@msg The graphics were lost and have been restarted 图形已丢失,现已重新启动 +@msg VectorCraft failed to start: {e} VectorCraft 启动失败:{e} +@msg Your unsaved changes are kept in this browser: reload the page to get them back. 您未保存的更改保留在此浏览器中:重新加载页面即可找回。 +@msg The graphics processor tried first couldn't show the window, so VectorCraft started again on {summary} 首先尝试的图形处理器无法显示窗口,因此 VectorCraft 已在 {summary} 上重新启动 +@msg The last start of VectorCraft ended on {name} before its window appeared, so it started on {summary}. To try that graphics processor again, change Preferences › Performance › Graphics Processor or start with WGPU_BACKEND set VectorCraft 上次启动时在其窗口出现之前于 {name} 上终止,因此本次在 {summary} 上启动。要再次尝试该图形处理器,请更改“首选项 › 性能 › 图形处理器”,或在设置 WGPU_BACKEND 后启动 +@msg The last start of VectorCraft ended while it listed the graphics processors, so it started on {summary} with OpenGL alone. To try the other graphics backends again, change Preferences › Performance › Graphics Processor or start with WGPU_BACKEND set VectorCraft 上次启动时在列出图形处理器期间终止,因此本次仅使用 OpenGL 在 {summary} 上启动。要再次尝试其他图形后端,请更改“首选项 › 性能 › 图形处理器”,或在设置 WGPU_BACKEND 后启动 +@msg not a DXF drawing 不是 DXF 图纸 +@msg scale must be a number from {_1} to {_2}, not {s} 比例必须是 {_1} 到 {_2} 之间的数字,而不是 {s} +@msg the artboard to fit must be a positive size up to {_1} pt 要适合的画板尺寸必须为正数,且不超过 {_1} pt +@msg the drawing has no layout `{_1}` (it has {_2}) 图纸中没有布局 `{_1}` (它包含 {_2}) +@msg this is a DWG drawing, which can't be read: save it from the CAD app as an ASCII DXF and open that 这是 DWG 图纸,无法读取:请在 CAD 应用中将其保存为 ASCII DXF,然后打开该文件 +@msg at this scale the drawing is {w} × {h} pt, more than the canvas holds: choose a smaller scale or fit it to the artboard 按此比例,图纸为 {w} × {h} pt,超出画布的容量:请选择较小的比例,或使其适合画板 +@msg the scale is not a usable number 比例不是可用的数字 +@msg the drawing is too large to open 图纸过大,无法打开 +@msg scale must be a number from {_1} to {_2}, not {_3} 比例必须是 {_1} 到 {_2} 之间的数字,而不是 {_3} +@msg image '{key}' has no pixels and was left out 图像 '{key}' 没有像素,已略去 +@msg Embedded {n} image(s) 已嵌入 {n} 张图像 +@msg object {0} cannot have children 对象 {0} 不能包含子对象 +@msg range `{s}` is empty 范围 `{s}` 为空 +@msg range `{s}`: `{part}` names no number 范围 `{s}`:`{part}` 未指定数字 +@msg range `{s}`: `{part}` runs backwards 范围 `{s}`:`{part}` 的顺序颠倒 +@msg range `{s}`: `{t}` is not a number from 1 to {count} 范围 `{s}`:`{t}` 不是 1 到 {count} 之间的数字 +@msg not a graphic style library (format `{_1}`) 不是图形样式库 (格式为 `{_1}`) +@msg Show All Hidden Attributes: nothing is hidden 显示所有隐藏属性:没有隐藏任何内容 +@msg Expand: no brush strokes selected 扩展:未选择画笔描边 +@msg no brush named `{name}` 没有名为 `{name}` 的画笔 +@msg no brush selected 未选择画笔 +@msg no symbol instances selected 未选择符号实例 +@msg select a symbol instance 请选择一个符号实例 +@msg the art has no bounds 图稿没有边界 +@msg Image Trace: the traced image is missing 图像描摹:缺少所描摹的图像 +@msg Live Paint Merge: select a Live Paint group and the paths to add 实时上色合并:请选择一个实时上色组以及要添加的路径 +@msg Live Paint: select paths or compound paths 实时上色:请选择路径或复合路径 +@msg Live Paint: these paths are too degenerate to paint 实时上色:这些路径过于退化,无法上色 +@msg Shape Builder: no region under the pointer 形状生成器:指针下方没有区域 +@msg Shape Builder: select paths or compound paths 形状生成器:请选择路径或复合路径 +@msg image data `{_1}` is missing 缺少图像数据 `{_1}` +@msg no Live Paint edge near that point 该点附近没有实时上色边缘 +@msg no Live Paint face at that point 该点处没有实时上色表面 +@msg select a Live Paint group 请选择一个实时上色组 +@msg select an Image Trace object 请选择一个图像描摹对象 +@msg select objects, not layers 请选择对象,而不是图层 +@msg Blend colors: select at least three objects with filled colours 混合颜色:请至少选择三个填有颜色的对象 +@msg no saved themes 没有已保存的主题 +@msg `{keep}` is not a side of this axis `{keep}` 不是此轴的一侧 +@msg unknown side `{other}` (left|right|top|bottom) 未知的侧边 `{other}` (left|right|top|bottom) +@msg an object in perspective would leave the edited grid 透视中的对象将离开所编辑的网格 +@msg nothing to warp 没有可变形的内容 +@msg select an object in perspective 请选择透视中的对象 +@msg select the artwork to warp 请选择要变形的图稿 +@msg select the objects to transform in perspective 请选择要在透视中变换的对象 +@msg select type in perspective 请选择透视中的文字 +@msg the object has no geometry 该对象没有几何形状 +@msg the object has no stroke 该对象没有描边 +@msg the object is beyond the plane's horizon 该对象位于平面的地平线之外 +@msg the object isn't in perspective 该对象不在透视中 +@msg the object isn't on a perspective plane 该对象不在透视平面上 +@msg the object would cross the horizon of the perspective plane 该对象将越过透视平面的地平线 +@msg the objects would leave the grid 这些对象将离开网格 +@msg the pointer is beyond the plane's horizon 指针位于平面的地平线之外 +@msg the selection isn't in perspective 所选对象不在透视中 +@msg the stroke has no weight 描边没有粗细 +@msg {command} didn't create an object {command} 未创建对象 +@msg Make Guides: select paths 创建参考线:请选择路径 +@msg Release Guides: no guides 释放参考线:没有参考线 +@msg guides are locked 参考线已锁定 +@msg no saved selection recalled 未调出任何已保存的选区 +@msg no saved selections 没有已保存的选区 +@msg no such artboard 没有此画板 +@msg cannot split an open path at its end point 无法在开放路径的端点处拆分该路径 +@msg closing needs three anchors 闭合需要三个锚点 +@msg empty brush stroke 画笔描边为空 +@msg no such anchor 没有此锚点 +@msg no such segment 没有此线段 +@msg no such subpath 没有此子路径 +@msg object {id} is not a path 对象 {id} 不是路径 +@msg object {id} is not a selected top-level object 对象 {id} 不是选中的顶层对象 +@msg nothing to redo 没有可重做的操作 +@msg nothing to undo 没有可撤销的操作 +@msg Expand Appearance: the selection has a basic appearance 扩展外观:所选对象只有基本外观 +@msg select (or target) objects whose appearance isn't basic 请选择 (或定位) 外观不是基本外观的对象 +@msg {C}: no effect at index {from} {C}:索引 {from} 处没有效果 +@msg Expand: no gradient fills 扩展:没有渐变填色 +@msg Expand: nothing to expand 扩展:没有可扩展的内容 +@msg batch step {_1} (`{id}`) failed: {e} 批处理步骤 {_1} (`{id}`) 失败:{e} +@msg BMP files are RGB or grayscale: colorModel rgb or gray BMP 文件为 RGB 或灰度:colorModel rgb 或 gray +@msg Targa files are RGB: colorModel rgb Targa 文件为 RGB:colorModel rgb +@msg antiAlias `{id}`: none, art or type antiAlias `{id}`:none、art 或 type +@msg background {other}: transparent, white, black or a colour such as "#ff8800" background {other}:transparent、white、black 或颜色,例如 "#ff8800" +@msg no artboard {i} (0-based; the document has {count}) 没有画板 {i} (从 0 开始计数;文档有 {count} 个) +@msg no artboards named 未指定画板 +@msg the document has no artboard 文档没有画板 +@msg this format holds one artboard: export several as PDF or with document.exportForScreens 此格式只能包含一个画板:要导出多个画板,请导出为 PDF 或使用 document.exportForScreens +@msg this file was saved without PDF compatibility, and its editing data can't be read ({why}) 此文件保存时未启用 PDF 兼容性,且无法读取其编辑数据 ({why}) +@msg the export wrote no file 导出未写入任何文件 +@msg {_1} files can be opened but not written (see document.formats) {_1} 文件可以打开,但不能写入 (请参阅 document.formats) +@msg {path}: no file system here (pass dataBase64 to open; omit the path to get dataBase64) {path}:此处没有文件系统 (要打开文件,请传入 dataBase64;省略路径可获取 dataBase64) +@msg Save writes {_1}, not {_2}: use document.export for other formats 保存会写入 {_1},而不是 {_2}:其他格式请使用 document.export +@msg no changes since the last save 自上次保存以来没有更改 +@msg unknown format `{f}` (Save writes {_1}) 未知格式 `{f}` (保存会写入 {_1}) +@msg `svg` must be an object of SVG options (see document.formats) `svg` 必须是由 SVG 选项组成的对象 (请参阅 document.formats) +@msg no end record 没有结束记录 +@msg not a stored central record 中央目录记录不是未压缩 (stored) 方式 +@msg truncated 已截断 +@msg {name}: CRC mismatch {name}:CRC 不匹配 +@msg {name}: no local header {name}:没有本地文件头 +@msg Flatten Transparency: select objects to flatten 拼合透明度:请选择要拼合的对象 +@msg Flatten Transparency: {e} 拼合透明度:{e} +@msg balance must be between 0 and 100 平衡必须介于 0 到 100 之间 +@msg resolutions must be between 1 and 2400 ppi 分辨率必须介于 1 到 2400 ppi 之间 +@msg unknown preset `{name}` (high, medium, low or a saved one: see flattener.presets.list) 未知预设 `{name}` (high、medium、low 或已保存的预设:请参阅 flattener.presets.list) +@msg `at` must be [x, y] `at` 必须是 [x, y] +@msg `color` must be a colour `color` 必须是颜色 +@msg `freeform.points` must be an array `freeform.points` 必须是数组 +@msg `freeform.lines` must be an array `freeform.lines` 必须是数组 +@msg `{key}` must be a number `{key}` 必须是数字 +@msg a freeform gradient keeps at least one point 任意形状渐变至少保留一个点 +@msg freeform point {i} needs `at` [x, y] and a valid `color` 任意形状点 {i} 需要 `at` [x, y] 和有效的 `color` +@msg freeform line {i} must be an array of point indices 任意形状线 {i} 必须是由点索引组成的数组 +@msg no point {i} (the gradient has {_1}) 没有点 {i} (该渐变有 {_1} 个) +@msg no segment {segment} on line {line} 线 {line} 上没有线段 {segment} +@msg unknown freeform mode `{m}` (points, lines) 未知的任意形状模式 `{m}` (points、lines) +@msg `aspect` must be a number (%) `aspect` 必须是数字 (%) +@msg `gradient` must be an object `gradient` 必须是对象 +@msg `mode` applies to freeform gradients `mode` 仅适用于任意形状渐变 +@msg `stops` must be an array `stops` 必须是数组 +@msg `{k}` must be [x, y] `{k}` 必须是 [x, y] +@msg a gradient needs at least two stops 渐变至少需要两个色标 +@msg give both `start` and `end` [x, y] (or neither) 请同时给出 `start` 和 `end` [x, y] (或都不给出) +@msg stop {i} needs `offset` 色标 {i} 需要 `offset` +@msg stop {i} needs a valid `color` 色标 {i} 需要有效的 `color` +@msg stop {i}: `{k}` must be a number 色标 {i}:`{k}` 必须是数字 +@msg unknown gradient kind `{k}` (linear, radial, freeform) 未知的渐变类型 `{k}` (linear、radial、freeform) +@msg the art could not be sampled 无法对图稿取样 +@msg the art is too light for any dots 图稿太浅,无法生成任何网点 +@msg the document has no symbols 文档中没有符号 +@msg `{s}` is not a colour (#rrggbb or a preset name) `{s}` 不是颜色 (#rrggbb 或预设名称) +@msg a colour index is 0 to {_1}, not {n} 颜色索引应为 0 到 {_1},而不是 {n} +@msg a colour is an index, #rrggbb or a preset name, not {v} 颜色应为索引、#rrggbb 或预设名称,而不是 {v} +@msg a document needs at least one layer 文档至少需要一个图层 +@msg no artwork 没有图稿 +@msg no selection bounds 所选对象没有边界 +@msg the layer has no objects to clip by 该图层中没有可用于剪切的对象 +@msg the layer or group is locked 该图层或编组已锁定 +@msg the guide is on a hidden or locked layer 该参考线位于隐藏或锁定的图层上 +@msg the target layer is locked or hidden 目标图层已锁定或隐藏 +@msg the layer to flatten into is hidden 要拼合到的图层已隐藏 +@msg there are no objects to release 没有可释放的对象 +@msg no library `{id}` 没有库 `{id}` +@msg {path}: not a file {path}:不是文件 +@msg {path}: {e} {path}:{e} +@msg can't write .{ext} images 无法写入 .{ext} 图像 +@msg Replace Spine: select a blend and a path 替换混合轴:请选择一个混合对象和一条路径 +@msg nothing to wrap 没有可绕排的内容 +@msg select a blend 请选择一个混合对象 +@msg select a gradient mesh 请选择一个渐变网格 +@msg the object has no opacity mask 该对象没有不透明度蒙版 +@msg Convert to Artboards: selection has no area 转换为画板:所选对象没有面积 +@msg Convert to Shape: no rectangles or ellipses selected 转换为形状:未选择矩形或椭圆 +@msg image would be too large; lower the resolution 图像将过大;请降低分辨率 +@msg clipboard is empty 剪贴板为空 +@msg no anchor points selected 未选择锚点 +@msg select at least two objects 请至少选择两个对象 +@msg no saved presets 没有已保存的预设 +@msg compound paths can only contain paths 复合路径只能包含路径 +@msg no bounds 没有边界 +@msg no current layer 没有当前图层 +@msg no key object 没有关键对象 +@msg no previous transform 没有上一次变换 +@msg nothing to align 没有可对齐的内容 +@msg select a clip group 请选择一个剪切组 +@msg select two or more objects to distribute 请选择两个或更多要分布的对象 +@msg axis must be "vertical", "horizontal" or an angle in degrees, not `{v}` axis 必须是 "vertical"、"horizontal" 或以度为单位的角度,而不是 `{v}` +@msg give horizontal or vertical 请给出 horizontal 或 vertical +@msg selection has no bounds 所选对象没有边界 +@msg the top object must be a path, compound path or text object to use as a clipping mask 最上层对象必须是路径、复合路径或文本对象才能用作剪切蒙版 +@msg no target object has an opacity mask: select one or give `id` 没有目标对象带有不透明度蒙版:请选择一个,或给出 `id` +@msg the object already has an opacity mask 该对象已有不透明度蒙版 +@msg `{name}` is a process colour: tints apply to global and spot colours `{name}` 是印刷色:色调仅适用于全局色和专色 +@msg `{name}` isn't a colour swatch `{name}` 不是颜色色板 +@msg a document needs at least one artboard 文档至少需要一个画板 +@msg empty path 路径为空 +@msg join needs open paths 连接需要开放路径 +@msg path is already closed 路径已闭合 +@msg select paths to join 请选择要连接的路径 +@msg direct-select anchor points to cut at (not the end points of open paths) 请直接选择要在其处切割的锚点 (不能是开放路径的端点) +@msg select paths or anchor points 请选择路径或锚点 +@msg Divide Objects Below: select a path 分割下方对象:请选择一条路径 +@msg Divide Objects Below: select exactly one path 分割下方对象:请只选择一条路径 +@msg Offset Path: select paths 偏移路径:请选择路径 +@msg Offset Path: the offset leaves nothing of the selected paths (an inset larger than the shapes) 偏移路径:偏移后所选路径不剩任何部分 (内缩量大于形状) +@msg Outline Stroke: no stroked paths selected 轮廓化描边:未选择带描边的路径 +@msg Split Into Grid: select paths large enough for the grid 分割为网格:请选择足够大、可容纳网格的路径 +@msg empty cutter 切割对象为空 +@msg paths contain invalid coordinates 路径包含无效坐标 +@msg {label} produced an empty result {label} 生成了空结果 +@msg {label}: lost track of a shape's style {label}:丢失了某个形状的样式 +@msg {label}: select paths {label}:请选择路径 +@msg {label}: select paths, compound paths, groups or text {label}:请选择路径、复合路径、编组或文字 +@msg already editing a pattern 已在编辑图案 +@msg no pattern `{name}` 没有图案 `{name}` +@msg not in pattern editing mode 不在图案编辑模式中 +@msg pattern missing 缺少图案 +@msg select a repeat 请选择一个重复对象 +@msg select an Intertwine group 请选择一个交织组 +@msg select the art to repeat 请选择要重复的图稿 +@msg the document has no patterns 文档中没有图案 +@msg no artboard 没有画板 +@msg installing from a path is not available on the web; pass the module as `dataBase64` 在网页版中无法从路径安装;请以 `dataBase64` 传入模块 +@msg `{key}` must be `auto` or a language code such as `en` or `zh-hant` `{key}` 必须是 `auto` 或语言代码,例如 `en` 或 `zh-hant` +@msg `{key}` must be a #rrggbb colour `{key}` 必须是 #rrggbb 颜色 +@msg `{key}` must be a string `{key}` 必须是字符串 +@msg `{key}` must be a whole number `{key}` 必须是整数 +@msg `{key}` must be a whole number between {min} and {max} (got {x}) `{key}` 必须是介于 {min} 和 {max} 之间的整数 (实际为 {x}) +@msg `{key}` must be between {min} and {max} (got {x}) `{key}` 必须介于 {min} 和 {max} 之间 (实际为 {x}) +@msg `{key}` must be one of {_1} `{key}` 必须是 {_1} 之一 +@msg unknown preference `{key}` 未知首选项 `{key}` +@msg Data Recovery has nowhere to keep copies: set Preferences → File Handling → Data Recovery → Folder (recoveryFolder) 数据恢复没有可保存副本的位置:请设置“首选项 → 文件处理 → 数据恢复 → 文件夹” (recoveryFolder) +@msg `{area}` is no recovery area name `{area}` 不是恢复区域名称 +@msg `{name}` is no recovery entry name `{name}` 不是恢复条目名称 +@msg no clock to keep a heartbeat by 没有可用于维持心跳的时钟 +@msg no free recovery area 没有空闲的恢复区域 +@msg no native format 没有原生格式 +@msg nothing encoded 没有编码任何内容 +@msg recovery copy `{file}`: {e} 恢复副本 `{file}`:{e} +@msg {name}: no such recovery entry {name}:没有此恢复条目 +@msg Combine Slices: the slices have no bounds 组合切片:切片没有边界 +@msg Create from Guides: the document has no artboard 从参考线创建:文档没有画板 +@msg Create from Guides: the guides make more than {MAX_PIECES} slices 从参考线创建:参考线将生成超过 {MAX_PIECES} 个切片 +@msg Create from Selection: the selection has no area 从选区创建:所选对象没有面积 +@msg Release: no layer to put the rectangle in 释放:没有可放置矩形的图层 +@msg a slice size must be a positive number of points 切片尺寸必须是正数 (以点为单位) +@msg divide into 1 to {MAX_PIECES} slices 请划分为 1 到 {MAX_PIECES} 个切片 +@msg no slice selected 未选择切片 +@msg the document has no slices 文档中没有切片 +@msg no saved profiles 没有已保存的配置文件 +@msg select a stroke with a variable width 请选择一个宽度可变的描边 +@msg the selected stroke's profile is already listed as {_1} 所选描边的配置文件已列为 {_1} +@msg a graphic style named `{to}` already exists 名为 `{to}` 的图形样式已存在 +@msg no graphic style `{name}` 没有图形样式 `{name}` +@msg node {_1} is not text 节点 {_1} 不是文字 +@msg Text Wrap: select a wrap object 文本绕排:请选择一个绕排对象 +@msg layers can't be wrap objects 图层不能作为绕排对象 +@msg no threaded text selected 未选择串接文本 +@msg Create Outlines: select text objects 创建轮廓:请选择文本对象 +@msg paste unavailable 无法粘贴 +@msg Save for Web: the image is empty 存储为 Web 所用格式:图像为空 +@msg colorTable.{what}: `{h}` is not a colour such as "#ff8800" colorTable.{what}:`{h}` 不是颜色,例如 "#ff8800" +@msg colorTable.{what}: at most {MAX_TABLE} colours colorTable.{what}:最多 {MAX_TABLE} 种颜色 +@msg no artboard {i} (0-based; the document has {_1}) 没有画板 {i} (从 0 开始计数;文档有 {_1} 个) +@msg no selected slice in the image: select slices, or save all of them 图像中没有选中的切片:请选择切片,或全部保存 +@msg nothing to save: the document has no visible art 没有可保存的内容:文档中没有可见的图稿 +@msg percent must be above 0 and at most 6400, not {p} 百分比必须大于 0 且不超过 6400,而不是 {p} +@msg unknown preset `{name}` (see webExport.presets.list) 未知预设 `{name}` (请参阅 webExport.presets.list) +@msg width and height are at least 1 pixel 宽度和高度至少为 1 像素 +@msg `sampleSize` must be 1, 3 or 5 `sampleSize` 必须是 1、3 或 5 +@msg `{path}` must be a bool or an object of bools `{path}` 必须是布尔值或由布尔值组成的对象 +@msg cannot distort a zero-size bounding box 无法扭曲尺寸为零的定界框 +@msg nothing to distort 没有可扭曲的内容 +@msg unknown option `{path}.{k}` 未知选项 `{path}.{k}` +@msg command `{0}` is not available right now: {1} 命令 `{0}` 当前不可用:{1} +@msg internal error in `{cmd}`: {msg} (the document was left as it was before; please report this bug) `{cmd}` 中出现内部错误:{msg} (文档保持原样;请报告此错误) +@msg invalid parameters for `{cmd}`: {msg} `{cmd}` 的参数无效:{msg} +@msg no active document 没有活动文档 +@msg no interaction in progress 没有正在进行的交互 +@msg no such object {0} 没有对象 {0} +@msg result would exceed the canvas (coordinates out of range) 结果将超出画布 (坐标超出范围) +@msg objects can't be nested more than 32 deep 对象的嵌套不能超过 32 层 +@msg the SVG's elements are nested more than {0} deep SVG 的元素嵌套超过 {0} 层 +@msg unknown command `{0}` 未知命令 `{0}` +@msg `{what}` closes nothing `{what}` 没有可结束的内容 +@msg `{what}` closes something it didn't open `{what}` 结束了并非由它开始的内容 +@msg a path has too many points 某条路径的点过多 +@msg it ends inside a layer 它在图层内部结束 +@msg it has art outside its layers 它有位于图层之外的图稿 +@msg it has more than {MAX_NODES} objects 它包含超过 {MAX_NODES} 个对象 +@msg it has no layers 它没有图层 +@msg it has too many values in a row 它的一行中值过多 +@msg it has {_1}, which VectorCraft doesn't read from it yet 它包含 {_1},VectorCraft 尚不能从中读取 +@msg its objects are nested too deeply 其对象嵌套过深 +@msg its section ending with `%{end}` doesn't end 其以 `%{end}` 结束的部分没有结束 +@msg an image VectorCraft can't read was left out 已略去 VectorCraft 无法读取的图像 +@msg an image whose data is cut short was left out 已略去数据不完整的图像 +@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it 文件中未定义渐变“{name}”:已改用纯色代替 +@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet 带有多个填色或描边、效果或画笔的对象已按其绘制外观导入 ({_1}):其外观尚不可编辑 +@msg patterns nested too deeply are filled with mid-grey 嵌套过深的图案以中灰色填充 +@msg shadings of an unknown type were left out 已略去未知类型的着色 +@msg shadings whose functions are of an unknown type are filled with their middle colour 函数类型未知的着色以其中间颜色填充 +@msg the file's preview header points outside the file 文件的预览头指向文件之外 +@msg this PostScript file can't be read ({why}): save it as PDF or SVG in the app that made it 无法读取此 PostScript 文件 ({why}):请在创建它的应用中将其保存为 PDF 或 SVG +@msg this is not a PostScript file 这不是 PostScript 文件 +@msg a PostScript error ({name} in `{op}`) PostScript 错误 ({name},位于 `{op}`) +@msg a PostScript error ({name} in `{op}`), in {procs} PostScript 错误 ({name},位于 `{op}`),在 {procs} 中 +@msg a PostScript error ({name} in `{op}`: {at}) PostScript 错误 ({name},位于 `{op}`:{at}) +@msg a PostScript error ({name} in `{op}`: {at}), in {procs} PostScript 错误 ({name},位于 `{op}`:{at}),在 {procs} 中 +@msg a PostScript error ({name}) PostScript 错误 ({name}) +@msg it uses `{at}`, which VectorCraft's PostScript reader doesn't know 它使用了 `{at}`,VectorCraft 的 PostScript 读取器无法识别 +@msg the file was read up to an error ({why}): what follows it was left out 文件已读取到出错处 ({why}):其后的内容已略去 +@msg this file's PostScript couldn't be read ({why}): {what} 无法读取此文件的 PostScript ({why}):{what} +@msg it has no page 它没有页面 +@msg it has too many text objects 它的文本对象过多 +@msg it has too much text 它的文字过多 +@msg its editing data doesn't say where its art is 其编辑数据未说明其图稿的位置 +@msg its editing data doesn't say where its artboard is 其编辑数据未说明其画板的位置 +@msg its editing data is for a different page 其编辑数据属于另一个页面 +@msg its page has text, and its layers have no text objects to put it in 其页面中有文字,但其图层中没有可放置这些文字的文本对象 +@msg the art on them differs from the page's in {_1}% of it 其上的图稿与页面的图稿有 {_1}% 不同 +@msg the art on them differs from the page's in {_1}% of it: they come from its editing data all the same 其上的图稿与页面的图稿有 {_1}% 不同:它们仍从其编辑数据导入 +@msg the file's layers weren't read ({_1}): it comes in as its page, in one layer 未读取文件的图层 ({_1}):文件以其页面导入,位于一个图层中 +@msg the file's layers weren't read from its editing data ({_1}): they come from its PDF part 未从文件的编辑数据中读取图层 ({_1}):图层来自其 PDF 部分 +@msg its Windows metafile preview was opened instead, which may simplify the art 已改为打开其 Windows 图元文件预览,图稿可能会被简化 +@msg its preview was placed instead, at screen resolution 已改为以屏幕分辨率置入其预览 +@msg shadings of more than 4096 patches or triangles were left out 已略去超过 4096 个面片或三角形的着色 +@msg it uses `{at}`, which VectorCraft's PostScript reader doesn't know, in {procs} 它在 {procs} 中使用了 `{at}`,VectorCraft 的 PostScript 读取器无法识别 +@msg the export region is not finite 导出区域不是有限值 +@msg a page out of range 页面超出范围 +@msg a page's placement is not finite 页面的位置不是有限值 +@msg nothing to print 没有可打印的内容 +@msg page size {w} × {h} 页面尺寸 {w} × {h} +@msg the preview image is empty 预览图像为空 +@msg the thumbnail image is malformed 缩览图格式错误 +@msg can't encode the document: {0} 无法编码文档:{0} +@msg can't save version {0}: VectorCraft writes versions {MIN_VERSION} to {VERSION} 无法保存版本 {0}:VectorCraft 写入的版本为 {MIN_VERSION} 到 {VERSION} +@msg file version {0} is newer than this VectorCraft supports ({VERSION}) 文件版本 {0} 比此 VectorCraft 支持的版本 ({VERSION}) 更新 +@msg invalid image data for `{0}` `{0}` 的图像数据无效 +@msg not a VectorCraft file: {0} 不是 VectorCraft 文件:{0} +@msg the compressed file unpacks to more than {_1} MB 压缩文件解压后超过 {_1} MB +@msg version {0} files can't be compressed: only version {COMPRESSED_SINCE} and later open compressed files 版本 {0} 的文件不能压缩:只有版本 {COMPRESSED_SINCE} 及更高版本能打开压缩文件 +@msg a bitmap is empty 某个位图为空 +@msg a bitmap is too large to read 某个位图过大,无法读取 +@msg compressed (RLE) bitmaps can't be read yet 尚不能读取压缩 (RLE) 位图 +@msg the image's pixels don't match its size 图像的像素与其尺寸不符 +@msg {bpp}-bit bitmaps can't be read 无法读取 {bpp} 位位图 +@msg not an EMF or WMF file 不是 EMF 或 WMF 文件 +@msg its layers use {_1}, which aren't read yet 其图层使用了 {_1},尚不能读取 +@msg the EMF header is damaged EMF 文件头已损坏 +@msg damaged 已损坏 +@msg the WMF header is damaged WMF 文件头已损坏 +@msg the export region is empty 导出区域为空 +@msg a stream runs past the end 某个流超出了结尾 +@msg a stream's length is wrong 某个流的长度错误 +@msg a stream's length isn't a number 某个流的长度不是数字 +@msg bad stream length 流长度错误 +@msg PDF writer error: {0} PDF 写入器错误:{0} +@msg artboard {0} does not exist 画板 {0} 不存在 +@msg cannot read PDF: {0} 无法读取 PDF:{0} +@msg invalid PDF setting: {0} PDF 设置无效:{0} +@msg page {0} does not exist (the PDF has {1}) 页面 {0} 不存在 (该 PDF 有 {1} 页) +@msg the PDF has no pages 该 PDF 没有页面 +@msg the PDF is password-protected: give its password 该 PDF 受密码保护:请提供其密码 +@msg the PDF password is wrong PDF 密码错误 +@msg the file holds only a placeholder page, not its art (it was saved without PDF compatibility): save it again with PDF compatibility on, or as PDF or SVG 该文件只包含占位页面,不包含其图稿 (保存时未启用 PDF 兼容性):请在启用 PDF 兼容性后重新保存,或保存为 PDF 或 SVG +@msg this is a PostScript file (an .ai saved in an older format or without PDF compatibility, or an EPS file), not a PDF: File › Open and File › Place read it as EPS 这是 PostScript 文件 (以旧格式或未启用 PDF 兼容性保存的 .ai,或 EPS 文件),不是 PDF:“文件 › 打开”和“文件 › 置入”会将其作为 EPS 读取 +@msg unsupported: {0} 不支持:{0} +@msg a page is missing 缺少某个页面 +@msg a page tree kid isn't a reference 某个页面树子节点不是引用 +@msg a page tree node has no kids 某个页面树节点没有子节点 +@msg an object can't be read 无法读取某个对象 +@msg bad page tree 页面树错误 +@msg bad trailer 文件尾错误 +@msg no catalog 没有目录 +@msg no cross-reference table 没有交叉引用表 +@msg no pages 没有页面 +@msg no plug-in {0} is installed 未安装增效工具 {0} +@msg not a valid plug-in module: {0} 不是有效的增效工具模块:{0} +@msg plug-in ABI: {0} 增效工具 ABI:{0} +@msg plug-in exceeded its {0} 增效工具超出了其 {0} +@msg plug-in failed: {0} 增效工具失败:{0} +@msg plug-in manifest: {0} 增效工具清单:{0} +@msg plug-in output: {0} 增效工具输出:{0} +@msg plug-in parameters: {0} 增效工具参数:{0} +@msg plug-in trapped: {0} 增效工具运行时出错 (trap):{0} +@msg is not an image VectorCraft reads 不是 VectorCraft 可读取的图像 +@msg not found 未找到 +@msg SVG parse error: {0} SVG 解析错误:{0} +@msg decimals must be {_1}–{_2} (got {_3}) 小数位数必须为 {_1}–{_2} (实际为 {_3}) +@msg Exporting {_1} 正在导出 {_1} +@msg Exported {what} 已导出 {what} +@msg "{0}" is not a colour: write it as #rrggbb "{0}" 不是颜色:请写为 #rrggbb +@msg could not decode image: {0} 无法解码图像:{0} +@msg image is empty 图像为空 +@msg the image is {width} × {height} pixels, more than Image Trace takes ({max} megapixels) 图像为 {width} × {height} 像素,超出图像描摹的上限 ({max} 百万像素) +@msg this isn't a flat-colour logo ({_1}% of its solid areas match a few flat colours), so Flat Logo mode would turn its gradients into patches: use Color mode instead 这不是纯色标志 (其实色区域中只有 {_1}% 与少数几种纯色相符),因此“纯色标志”模式会把其中的渐变变成色块:请改用“颜色”模式 +@msg this trace would make more than {max} anchor points, more than the document can show smoothly: raise Noise, lower Paths or Colors, or pick a lower-fidelity preset 此描摹将生成超过 {max} 个锚点,超出文档可流畅显示的数量:请提高“杂色”,降低“路径”或“颜色”,或选择保真度较低的预设 +@msg internal error: {msg} (please report this bug) 内部错误:{msg} (请报告此错误) +@msg the background worker stopped 后台工作进程已停止 +@msg {_1} failed: {e} {_1} 失败:{e} +@msg {label}… {label}… +@msg no blend options 没有混合选项 +@msg bad color {v} 颜色 {v} 无效 +@msg the Color Picker is not open 拾色器未打开 +@msg the screen color sampler is already open 屏幕取色器已打开 +@msg this system has no screen color sampler 此系统没有屏幕取色器 +@msg Corners edits the corners of a path 转角用于编辑路径的转角 +@msg give corners of the path: anchors where its sides meet at an angle 请给出路径的转角:其各边以一定角度相交处的锚点 +@msg select one path, or give its `id` 请选择一条路径,或给出其 `id` +@msg the drawing is no longer loaded 该图纸已不再加载 +@msg No saved selections (Select → Save Selection…) 没有已保存的选区 (选择 → 保存选区…) +@msg effect {k} is `{_1}`, not `{id}` 效果 {k} 是 `{_1}`,而不是 `{id}` +@msg no effect at index {k} 索引 {k} 处没有效果 +@msg unknown effect `{id}` 未知效果 `{id}` +@msg `{id}` has no envelope dialog `{id}` 没有封套对话框 +@msg select an envelope 请选择一个封套 +@msg no format to export to 没有可导出的格式 +@msg nothing to export: the document has no visible art (or turn on Use Artboards) 没有可导出的内容:文档中没有可见的图稿 (或请打开“使用画板”) +@msg add a format to export 请添加要导出的格式 +@msg check an asset to export 请勾选要导出的资源 +@msg `{tool}` isn't a freehand tool `{tool}` 不是手绘工具 +@msg bad colour `{hex}` (#rrggbb) 颜色 `{hex}` 无效 (#rrggbb) +@msg no gradient stop or freeform point is selected 未选择渐变色标或任意形状点 +@msg no graphic style `{n}` 没有图形样式 `{n}` +@msg select two or more graphic styles to merge 请选择两个或更多要合并的图形样式 +@msg the PDF is no longer loaded 该 PDF 已不再加载 +@msg no such layer or object 没有此图层或对象 +@msg `{tool}` isn't a Liquify tool `{tool}` 不是液化工具 +@msg {_1} linked file(s) can't be read here: their previews show 此处无法读取 {_1} 个链接文件:显示的是其预览 +@msg {_1} linked image(s) changed on disk: Update Links shows the new versions 有 {_1} 个链接图像已在磁盘上更改:“更新链接”可显示新版本 +@msg pick a colour, gradient or pattern to save as a swatch 请选取要保存为色板的颜色、渐变或图案 +@msg Packaged {n} file(s) in {folder}{note} 已将 {n} 个文件打包到 {folder}{note} +@msg Packaged {n} file(s){note} 已打包 {n} 个文件{note} +@msg choose a location for the package 请为打包选择位置 +@msg missing `folder` 缺少 `folder` +@msg the package came back damaged 返回的打包文件已损坏 +@msg no preset editor 没有预设编辑器 +@msg no perspective grid preset named `{name}` 没有名为 `{name}` 的透视网格预设 +@msg no active perspective plane 没有活动的透视平面 +@msg plane must be left, right or ground plane 必须是 left、right 或 ground +@msg missing `id` (see plugin.list) 缺少 `id` (请参阅 plugin.list) +@msg no plug-in {id} is installed 未安装增效工具 {id} +@msg {_1} is a live effect (Effect › Plug-ins) {_1} 是实时效果 (效果 › 增效工具) +@msg a preset named `{_1}` exists 名为 `{_1}` 的预设已存在 +@msg no print preset named `{base}` 没有名为 `{base}` 的打印预设 +@msg no print preset named `{name}` 没有名为 `{name}` 的打印预设 +@msg no saved print preset named `{name}` ({DEFAULT_PRESET} is protected: start a new one from it) 没有名为 `{name}` 的已保存打印预设 ({DEFAULT_PRESET} 受保护:请以它为基础新建一个) +@msg print settings are not an object 打印设置不是对象 +@msg no colour group `{g}` 没有颜色组 `{g}` +@msg select artwork (or a colour group) to recolor 请选择要重新着色的图稿 (或颜色组) +@msg Downloaded {_1} file(s) 已下载 {_1} 个文件 +@msg Preview in Browser needs the desktop app (the web downloads files instead) “在浏览器中预览”需要桌面应用 (网页版会改为下载文件) +@msg no file system here 此处没有文件系统 +@msg nothing to preview 没有可预览的内容 +@msg Saved {n} files beside {path} 已在 {path} 旁保存 {n} 个文件 +@msg `{_1}` is no save command `{_1}` 不是保存命令 +@msg name the file 请为文件命名 +@msg unknown format 未知格式 +@msg PDF settings are not an object PDF 设置不是对象 +@msg no saved PDF preset named `{name}` (built-in presets are read-only: start a new one from them) 没有名为 `{name}` 的已保存 PDF 预设 (内置预设为只读:请以它们为基础新建一个) +@msg Saved to User Defined: {_1} 已保存到“用户定义”:{_1} +@msg choose a direction to divide in 请选择分割方向 +@msg choice must be "merge" or "add", not `{choice}` choice 必须是 "merge" 或 "add",而不是 `{choice}` +@msg `{name}` has no options `{name}` 没有选项 +@msg no swatch `{name}` 没有色板 `{name}` +@msg `{color}` is not a colour (#rrggbb or a preset name) `{color}` 不是颜色 (#rrggbb 或预设名称) +@msg give the path `id` and the width point `index` 请给出路径的 `id` 和宽度点的 `index` +@msg no such width point 没有此宽度点 +@msg onto must name a panel floating in another group onto 必须指定浮动在另一个组中的面板 +@msg below and above must name a panel floating in another group below 和 above 必须指定浮动在另一个组中的面板 +@msg give only one of onto, below and above onto、below 和 above 只能给出一个 +@msg column must be true or a number from 1 column 必须是 true 或从 1 开始的数字 +@msg unknown panel `{raw}` 未知面板 `{raw}` +@msg x and y must both be numbers x 和 y 都必须是数字 +@msg Downloaded {what} 已下载 {what} +@msg Exported {count} file(s) to {folder} 已将 {count} 个文件导出到 {folder} +@msg Imported {what}: {_1} 已导入 {what}:{_1} +@msg Installed plug-in {_1} 已安装增效工具 {_1} +@msg Opened with {_1} note(s): {_2} 已打开,有 {_1} 条注释:{_2} +@msg Saved {path} 已保存 {path} +@msg no app to open files here 此处没有可打开文件的应用 +@msg no data 没有数据 +@msg no document 没有文档 +@msg no file manager here 此处没有文件管理器 +@msg no revert command 没有恢复命令 +@msg the Save PDF dialog didn't open “保存 PDF”对话框未打开 +@msg the document has never been saved 该文档从未保存过 +@msg the export returned unreadable data 导出返回了无法读取的数据 +@msg {status} ({e}) {status} ({e}) +@msg Exported {what} with {_1} note(s): {first} 已导出 {what},有 {_1} 条注释:{first} +@msg Saved {path} with {_1} note(s): {first} 已保存 {path},有 {_1} 条注释:{first} +@msg Couldn't open {name}: {e} 无法打开 {name}:{e} +@msg Couldn't read {name}: {e} 无法读取 {name}:{e} +@msg Internal error: {msg} (please report this bug) 内部错误:{msg} (请报告此错误) +@msg Opened {url} 已打开 {url} +@msg No saved views (View → New View…) 没有已保存的视图 (视图 → 新建视图…) +@msg `command` must be a command whose menu item opens a dialog (see ui.menuDialog) `command` 必须是其菜单项会打开对话框的命令 (请参阅 ui.menuDialog) +@msg `mode` must be grayscale, rgb, hsb, cmyk or websafe `mode` 必须是 grayscale、rgb、hsb、cmyk 或 websafe +@msg `{key}` must be true or false `{key}` 必须是 true 或 false +@msg brightness must be dark|mediumDark|mediumLight|light brightness 必须是 dark|mediumDark|mediumLight|light +@msg index must be a number or first, previous, next or last index 必须是数字,或 first、previous、next 或 last +@msg index must be a number or first, previous, next or last, not `{other}` index 必须是数字,或 first、previous、next 或 last,而不是 `{other}` +@msg lang must be one of {_1} lang 必须是 {_1} 之一 +@msg missing `name` 缺少 `name` +@msg missing `tool` 缺少 `tool` +@msg missing index 缺少 index +@msg multiple windows land with M11.5 多窗口将在 M11.5 中提供 +@msg no PNG encoder 没有 PNG 编码器 +@msg no document open 没有打开的文档 +@msg no effect applied yet 尚未应用任何效果 +@msg no such perspective grid preset 没有此透视网格预设 +@msg no such recent file 没有此最近使用的文件 +@msg no such recent font 没有此最近使用的字体 +@msg no such saved selection 没有此已保存的选区 +@msg no such user library 没有此用户库 +@msg no such view 没有此视图 +@msg printing isn't available here 此处无法打印 +@msg select an image 请选择一个图像 +@msg the document has no artboards 文档没有画板 +@msg tool (a tool id) is required 需要 tool (工具 id) +@msg unknown tool `{t}` 未知工具 `{t}` +@msg no such action 没有此动作 +@msg choose a folder to export to 请选择要导出到的文件夹 +@msg the selection has no URL (or they differ) 所选对象没有 URL (或其 URL 各不相同) +@msg select some type first 请先选择一些文字 +@msg {_1} font families available 有 {_1} 个可用的字体系列 +@msg {_1} has no {_2} style {_1} 没有 {_2} 样式 +@msg Copied the CSS of {rules} object(s) 已复制 {rules} 个对象的 CSS +@msg Copied the script report 已复制脚本报告 +@msg Exported {path} 已导出 {path} +@msg no CSS to copy: select objects with CSS of their own 没有可复制的 CSS:请选择带有自身 CSS 的对象 +@msg unknown highlight `{h}` 未知的高亮显示 `{h}` +@msg unknown overprints `{o}` (preserve, simulate or discard) 未知的叠印方式 `{o}` (preserve、simulate 或 discard) +@msg unknown preset `{name}` (see flattener.presets.list) 未知预设 `{name}` (请参阅 flattener.presets.list) +@msg Select text or click into text with the Type tool to insert glyphs 请选择文字,或用文字工具在文字中单击,以插入字形 +@msg `library` is a library id or name (see {list}) `library` 是库 id 或名称 (请参阅 {list}) +@msg no library `{key}` (see {list}) 没有库 `{key}` (请参阅 {list}) +@msg select a linked image: an embedded one has no file 请选择链接的图像:嵌入的图像没有文件 +@msg {path} can't be found: relink it first 找不到 {path}:请先重新链接 +@msg Embedded {n} image(s); {missing} missing: relink them first 已嵌入 {n} 张图像;缺少 {missing} 张:请先重新链接 +@msg Relinked {_1} image(s) 已重新链接 {_1} 张图像 +@msg Relinked {n} image(s) 已重新链接 {n} 张图像 +@msg Relinked {n} image(s); not in that folder: {_1} 已重新链接 {n} 张图像;不在该文件夹中:{_1} +@msg Unembedded to {_1} 已取消嵌入到 {_1} +@msg Updated {_1} image(s) 已更新 {_1} 张图像 +@msg no swatch library `{l}` (see swatch.library.list) 没有色板库 `{l}` (请参阅 swatch.library.list) +@msg no user library folder here 此处没有用户库文件夹 +@msg Couldn't place {name}: the document it was dropped on was closed 无法置入 {name}:将它拖放到的文档已关闭 +@msg no files to place 没有要置入的文件 +@msg paths: give at least one file paths:请至少给出一个文件 +@msg Couldn't place {name}: {e} 无法置入 {name}:{e} +@msg no print service 没有打印服务 +@msg the print job has no data 打印作业没有数据 +@msg there are no printer settings to open here 此处没有可打开的打印机设置 +@msg Couldn't save recovery data: {e} 无法保存恢复数据:{e} +@msg Saved recovery data for {title} 已保存 {title} 的恢复数据 +@msg Discarded {_1} recovered document(s) 已丢弃 {_1} 个恢复的文档 +@msg Restored {_1} recovered document(s): save them to keep them 已还原 {_1} 个恢复的文档:请保存以保留它们 +@msg Saving recovery data for {_1} 正在保存 {_1} 的恢复数据 +@msg This shortcut file is in a form VectorCraft can't read. 此快捷键文件的格式 VectorCraft 无法读取。 +@msg bad shortcut 快捷键无效 +@msg can't parse shortcut `{c}` 无法解析快捷键 `{c}` +@msg can't parse shortcut `{s}` for `{k}` 无法解析 `{k}` 的快捷键 `{s}` +@msg no dialog open 没有打开的对话框 +@msg no file reader 没有文件读取器 +@msg no file writer 没有文件写入器 +@msg not a VectorCraft shortcut set (missing `overrides`) 不是 VectorCraft 快捷键组 (缺少 `overrides`) +@msg not a shortcut set: the text doesn't start with a slash name and an opening brace 不是快捷键组:文本不是以斜杠名称和左花括号开头 +@msg shortcut for `{k}` must be a string `{k}` 的快捷键必须是字符串 +@msg tool shortcuts must be a single key (optionally with Shift) 工具快捷键必须是单个键 (可带 Shift) +@msg unknown preset (one of {_1}) 未知预设 (应为 {_1} 之一) +@msg unknown tool or command `{key}` 未知工具或命令 `{key}` +@msg {_1} is already used by {_2} {_1} 已被 {_2} 使用 +@msg Couldn't copy to the system clipboard: {e} 无法复制到系统剪贴板:{e} +@msg Couldn't paste from the clipboard: {e} 无法从剪贴板粘贴:{e} +@msg nothing selected 未选择任何对象 +@msg the {tool} tool has no options {tool} 工具没有选项 +@msg unknown tool `{tool}` 未知工具 `{tool}` +@msg {tool} isn't in a toolbar group of several tools {tool} 不在包含多个工具的工具栏组中 +@msg no such document 没有此文档 +@msg {_1}: not saved, so not closed {_1}:未保存,因此未关闭 +@msg `{name}` is a built-in workspace; choose another name `{name}` 是内置工作区;请选择其他名称 +@msg `{to}` is not an available name `{to}` 不是可用的名称 +@msg no user workspace `{from}` 没有用户工作区 `{from}` +@msg unknown workspace (one of {_1}) 未知工作区 (应为 {_1} 之一) +@msg workspace name can't be empty 工作区名称不能为空 +@msg No fonts are missing in this document 此文档中没有缺失的字体 +@msg VectorCraft doesn't search other apps' or the system's folders: {path} VectorCraft 不会搜索其他应用或系统的文件夹:{path} +@msg VectorCraft doesn't search the Shared or Public folder in Users: {path} VectorCraft 不会搜索“用户”中的 Shared 或 Public 文件夹:{path} +@msg {path} is not a folder {path} 不是文件夹 +@msg the search couldn't start: try again in a moment 无法开始搜索:请稍后重试 +@msg searching a folder isn't available on the web 网页版无法搜索文件夹 +@msg every search thread stopped on an internal error (please report this bug) 所有搜索线程均因内部错误而停止 (请报告此错误) +@msg VectorCraft's Fonts folder isn't set here: the desktop app and vectorcraft-cli set it 此处未设置 VectorCraft 的字体文件夹:桌面应用和 vectorcraft-cli 会设置该文件夹 +@msg choose the font files to add 请选择要添加的字体文件 +@msg {n} font file(s) are now in {folder} {n} 个字体文件现已位于 {folder} +@msg {n} font file(s) are now in {folder}; {failed} couldn't be added: {reason} {n} 个字体文件现已位于 {folder};有 {failed} 个无法添加:{reason} +@msg {n} font(s) aren't available here: their text shows in another font 此处没有 {n} 种字体:使用它们的文字以其他字体显示 +@msg not a file 不是文件 +@msg not a font file 不是字体文件 +@msg that document is no longer open 该文档已不再打开 +@msg larger than 256 MB 大于 256 MB +@msg the files come to more than 1 GB: add fewer at a time 文件总计超过 1 GB:请每次少添加一些 +@msg every numbered name for it is taken in the Fonts folder 字体文件夹中所有带编号的名称均已被占用 +@msg every numbered name for {name} is taken in the document's folder 文档所在文件夹中 {name} 的所有带编号的名称均已被占用 +@msg No linked files to look for 没有要查找的链接文件 +@msg Relinked {n} image(s); {name} couldn't be relinked: {reason} 已重新链接 {n} 张图像;无法重新链接 {name}:{reason} +@msg `id` is the step reference {r}, which only `run` and `command_batch` resolve `id` 是步骤引用 {r},只有 `run` 和 `command_batch` 能解析它 +@msg `ids` must be an array of object ids, not {v} `ids` 必须是由对象 id 组成的数组,而不是 {v} +@msg `corners` must be an array of anchor indices, not {v} `corners` 必须是由锚点索引组成的数组,而不是 {v} +@msg `{text}`: step {i}'s result has no such value (write $$ for a literal $) `{text}`:步骤 {i} 的结果中没有此值 (要表示 $ 本身,请写 $$) +@msg `{text}`: there is no step {i} before this one (steps count from 0; write $$ for a literal $) `{text}`:此步骤之前没有步骤 {i} (步骤从 0 开始计数;要表示 $ 本身,请写 $$) +@msg object ids are non-negative integers, not {v} 对象 id 是非负整数,而不是 {v} +@msg automation filesystem access is not granted: read authority is absent: {path} 未授予自动化文件系统访问权限:缺少读取权限:{path} +@msg automation filesystem access is not granted: write authority is absent: {path} 未授予自动化文件系统访问权限:缺少写入权限:{path} +@msg automation path rejected: outside the read root {root}: {path} 已拒绝自动化路径:位于读取根目录 {root} 之外:{path} +@msg automation path rejected: outside the write root {root}: {path} 已拒绝自动化路径:位于写入根目录 {root} 之外:{path} +@msg automation path rejected: path is empty 已拒绝自动化路径:路径为空 +@msg automation path rejected: a link that leads nowhere: {path} 已拒绝自动化路径:链接指向不存在的位置:{path} +@msg automation path rejected: cannot resolve {path}: {e} 已拒绝自动化路径:无法解析 {path}:{e} +@msg automation path rejected: parent traversal below a folder that doesn't exist: {path} 已拒绝自动化路径:在不存在的文件夹下向上级遍历:{path} +@msg automation path rejected: reserved device names are not allowed: {path} 已拒绝自动化路径:不允许使用保留的设备名称:{path} +@msg Multichannel PSD files can't be read: save it in RGB, CMYK or Grayscale mode 无法读取多通道 PSD 文件:请以 RGB、CMYK 或灰度模式保存 +@msg not a PSD file 不是 PSD 文件 +@msg the PSD file has an unknown colour mode ({m}) PSD 文件的颜色模式未知 ({m}) +@msg the PSD file's image data uses an unknown compression ({m}) PSD 文件的图像数据使用了未知的压缩方式 ({m}) +@msg the PSD image is too large to read ({_1} × {_2} pixels) PSD 图像过大,无法读取 ({_1} × {_2} 像素) +@msg zipped 32-bit PSD image data with prediction can't be read 无法读取带预测的 ZIP 压缩 32 位 PSD 图像数据 +@msg {depth}-bit PSD files in this colour mode can't be read 无法读取此颜色模式下的 {depth} 位 PSD 文件 +@msg the PSD file is cut short PSD 文件不完整 +@msg the PSD file's header is damaged PSD 文件头已损坏 +@msg the PSD file's image data can't be read: {e} 无法读取 PSD 文件的图像数据:{e} +@msg Imported library {name} 已导入库 {name} +@msg invalid restored panel group 还原的面板组无效 +@msg Invalid panel layout; restored the default dock 面板布局无效;已还原默认停靠 +@msg action is required 需要 action +@msg anchor must name a registered panel anchor 必须指定已注册的面板 +@msg before must name a panel before 必须指定面板 +@msg docking action contains an unknown panel or an excessive split path 停靠操作包含未知面板或过长的拆分路径 +@msg group must be true or false group 必须是 true 或 false +@msg move requires a destination panel 移动需要目标面板 +@msg move requires an existing destination panel 移动需要现有的目标面板 +@msg onto must name a floating panel onto 必须指定浮动面板 +@msg panel group is empty 面板组为空 +@msg panel must name a registered panel panel 必须指定已注册的面板 +@msg saved panel layout is invalid; reset the workspace first 保存的面板布局无效;请先重置工作区 +@msg x and y must be provided together x 和 y 必须同时提供 +@msg zone must be a string zone 必须是字符串 +@msg zone must be tab, center, left, right, top or bottom zone 必须是 tab、center、left、right、top 或 bottom +@msg {key} must be a finite coordinate {key} 必须是有限坐标 +@msg invalid native panel set 原生面板集无效 +@msg missing panel layout 缺少面板布局 +@msg unsupported native docking operation 不支持的原生停靠操作 +@msg the compressed file unpacks to more than VectorCraft reads ({_1} MB of document, {_2} MB per image) 压缩文件解压后超出 VectorCraft 的读取上限 (文档 {_1} MB,每张图像 {_2} MB) +@msg the document is too large to save compressed ({0}): save it with Use Compression off 文档过大,无法压缩保存 ({0}):请关闭“使用压缩”后保存 +@msg the file stopped being read (please report this bug) 文件读取已中断 (请报告此错误) +@msg the image can't be read as a texture 无法将图像作为纹理读取 +@msg give a fraction `t` from 0 to 1 请给出 0 到 1 之间的比例 `t` +@msg give the path `id` 请给出路径的 `id` +@msg invalid stroke widths 描边宽度无效 +@msg object has no weighted stroke 对象没有带粗细的描边 +@msg Angles require two straight segments 角度需要两条直线段 +@msg Choose two different points 请选择两个不同的点 +@msg Choose two non-parallel straight segments 请选择两条不平行的直线段 +@msg Choose two nonzero angle arms 请选择两条长度不为零的角边 +@msg Dimension point is outside the canvas 尺寸标注点位于画布之外 +@msg Dimension size is outside its supported range 尺寸标注大小超出支持的范围 +@msg First measured segment no longer exists 第一条测量线段已不存在 +@msg Invalid dimension distance 尺寸标注距离无效 +@msg Invalid dimension font name 尺寸标注字体名称无效 +@msg Invalid drawing scale 图纸比例无效 +@msg Invalid real scale 实际比例无效 +@msg Measured anchor no longer exists 测量锚点已不存在 +@msg Measured segment no longer exists 测量线段已不存在 +@msg Non-finite dimension 尺寸标注不是有限值 +@msg Scale must be drawing:real, for example 1:10 比例必须为 图纸:实际,例如 1:10 +@msg Scale ratio must be between 1:1000000 and 1000000:1 比例必须介于 1:1000000 和 1000000:1 之间 +@msg Second measured segment no longer exists 第二条测量线段已不存在 +@msg Unknown dimension mode 未知的尺寸标注模式 +@msg Unknown dimension option {k} 未知的尺寸标注选项 {k} +@msg span must be "object" or "selection", got {v} span 必须是 "object" 或 "selection",实际为 {v} +@msg span: "selection" places a `gradient`, not a swatch span: "selection" 放置的是 `gradient`,而不是色板 +@msg span: "selection" places a gradient: give `gradient` span: "selection" 放置渐变:请给出 `gradient` +@msg span: "selection" places a linear or radial gradient, not a freeform one span: "selection" 放置线性或径向渐变,而不是任意形状渐变 +@msg span: "selection" places the gradient itself: leave out `start` and `end` (they already place it in document coordinates) span: "selection" 自行放置渐变:请省略 `start` 和 `end` (它们已按文档坐标放置渐变) +@msg Batch: {count} processed 批处理:已处理 {count} 个 +@msg Batch: {count} processed, {failed} failed 批处理:已处理 {count} 个,失败 {failed} 个 +@msg choose a destination folder 请选择目标文件夹 +@msg choose a source folder 请选择源文件夹 +@msg open a document with data sets 请打开包含数据集的文档 +@msg the action has no steps 该动作没有步骤 # Import Shortcut Set (Keyboard Shortcuts › Import…, File › Open of a .kys file) and its commands. Import Shortcut Set 导入快捷键组 Import Shortcut Set… 导入快捷键组… diff --git a/docs/development.md b/docs/development.md index 7627cbfb2..094f6f692 100644 --- a/docs/development.md +++ b/docs/development.md @@ -233,7 +233,7 @@ other `sv-*` locale resolve to it), Czech (`cs`, every menu label) and Brazilian control channel, MCP and tests read them) and are translated only where the status bar draws them (`i18n::msg`). `@msg` catalog rows hold a whole message or a template such as `Couldn't open {name}: {e}`; `{_1}`, `{_2}` … stand for the format string's `{}`, and the values in the - placeholders are translated in turn (the reason after `: {e}` is often a message too). Czech, German, Spanish, French, Hungarian, Italian, Japanese, Korean, Polish, Brazilian Portuguese, Russian, Swedish, Ukrainian, Vietnamese and Finnish cover every + placeholders are translated in turn (the reason after `: {e}` is often a message too). Czech, German, Greek, Spanish, French, Hungarian, Italian, Japanese, Korean, Polish, Brazilian Portuguese, Russian, Simplified Chinese, Swedish, Ukrainian, Vietnamese and Finnish cover every message literal the test scan finds (`complete_languages_translate_every_message`, languages listed in `COMPLETE_MESSAGES`): a new `Err("…")`, `Other(…)`, `#[error(…)]` or `status(…)` message needs a row in each of those catalogs (`VECTORCRAFT_I18N_DUMP_MESSAGES=messages.txt cargo test -p vectorcraft-ui-egui complete_languages_translate_every_message` lists them all). Other languages show messages in English diff --git a/docs/localization-parity.md b/docs/localization-parity.md index d44b53f02..e632aef62 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -24,7 +24,7 @@ Chinese by `imachus`). None is recorded as reviewed by a native speaker; the cat | Language | Code | UI strings translated | Dialogs / tooltips / messages | Script support | Native review | Status | To `full` (h) | |---|---|---|---|---|---|---|---| | English | `en` | source, 100% | all | Latin | — | full | — | -| Simplified Chinese (Mandarin) | `zh-hans` | 3,647 rows; menus, panels, dialogs complete (tests); 85% overall | messages in English (1 of 604) | CJK UI font from craft-fonts (BIZ UDPGothic) when embedded, else a system font; IME with marked text at the caret; vertical type partial ([type-parity.md](type-parity.md)) | no | partial | 2–3 | +| Simplified Chinese (Mandarin) | `zh-hans` | 4,761 rows, 714 of them `@msg` (counted 2026-10-16): menus, `tl!` literals and messages complete (tests) | all | CJK UI font from craft-fonts (BIZ UDPGothic) when embedded, else a system font; IME with marked text at the caret; vertical type partial ([type-parity.md](type-parity.md)) | no | full | — (review) | | Spanish | `es` | 4,009 / 4,020 (99.7%) | all (604 messages) | Latin | no | full | — (review) | | Hindi | `hi` | 0 | none | Devanagari: the document's text shapes (HarfRust), with tests of conjuncts, reph, pre-base matras, nukta forms and caret stops that run when an OpenType Devanagari font is installed, but the egui interface does no complex shaping | no | none | 20–30 | | Arabic | `ar` | 0 | none | document text: bidi layout and Paragraph Direction; interface: no right-to-left layout, no Arabic shaping in egui | no | none | 25–40 | diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index a3d40fa66..51e614bda 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -565,7 +565,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur For Auto Size area type in columns, the bisection for the frame's height runs on the lines of the one-column layout, and its result is checked with at most two layouts of the columns. When the text wraps around objects or does not fit the one-column layout, or when the check fails, the columns are laid out at every step of the bisection, as before. Typing at the start of a story of 50,000 characters in 2 columns took 1,670 ms a keystroke and now takes 292 ms (release build, `auto_height_in_columns_typing_timing`). An edit copies a thread's story only when it changes one of the thread's frames: with a story of 50,000 characters threaded through 8 frames with a style change at every word, moving another object took 7.8 ms and now takes 0.013 ms, and a frame of a drag took 7.2 ms and now takes 0.012 ms (release build, `threaded_story_edit_timing`). The Paragraph panel menu's Hyphenation… (`ui.hyphenation`, `text.setFormat {wordsLongerThan, afterFirst, beforeLast, hyphenLimit, hyphenationZone, hyphenateCapitalized}`) sets each paragraph's hyphenation limits: the shortest word that breaks, the fewest letters on each side of the hyphen, the most hyphenated lines in a row, a zone at the right edge where the Single-line Composer breaks before a word instead of hyphenating it, and whether capitalized words break. The defaults are words longer than 5 letters, 3 letters on each side, no limit or zone, and capitalized words hyphenated; paragraph styles and the native file keep the options. -- **Interface languages, vertical type:** Preferences ▸ User Interface (or VectorCraft ▸ Language on macOS) picks Automatic (the system locale) or a registered language, persisted as `interfaceLanguage`. Translations come from per-language catalogs (`i18n/*.tsv`): Traditional and Simplified Chinese, Japanese, German (every `de-*` locale), Spanish (neutral international Spanish, for every `es-*` locale), French (every `fr-*` locale), Italian (every `it-*` locale) Russian (every `ru-*` locale) and Ukrainian (every `uk-*` locale) cover the whole interface, Czech every menu label; German, Spanish, French, Italian, Japanese, Korean, Vietnamese, Polish, Brazilian Portuguese, Russian and Ukrainian also translate status-bar and error messages as they are shown (`@msg` templates, every message literal tested; the messages themselves stay English for agents); untranslated text stays English. Japanese and Chinese glyphs come from the craft-fonts build input (release builds) or the installed fonts, Czech, German, Spanish, French, Italian, Russian and Ukrainian ones from the bundled UI fonts. The web app follows the browser's languages (or `?lang=`). The Basic toolbar's Type button holds Vertical Type in its flyout. Vertical Type, Vertical Area Type and Vertical Type on a Path create vertical text (columns right to left, upright CJK glyphs and marks with `vert` alternates, Latin and longer numbers on their side, two- and three-digit numbers set as tate-chu-yoko in one em of the column (kept whole when justified), upright glyphs centred on the column (tracked or justified too), point type's anchor on the first column's centre line); kinsoku applies to horizontal and vertical Japanese (Paragraph panel › Kinsoku Set, `text.setFormat {kinsoku}`: Hard, the default, keeps closing marks, iteration marks, the prolonged sound mark and small kana off the line start and opening brackets off its end; Soft lets 々, ー and small kana start a line as JLREQ's level 3 rules do; None turns it off), and justified Japanese lines spread their room between characters (not inside Latin words); Paragraph panel › Mojikumi Set (shown with Preferences › Type › Show East Asian Options, `text.setFormat {mojikumi}`): None or Line-end Punctuation Half Width (new type's default, as in Illustrator; older documents and imported text keep None) shares one half-em space between consecutive punctuation, sets a closing mark ending a line half width and an opening bracket starting a line flush with its start (a paragraph's first line at its first-line indent, JIS X 4051's principle in JLREQ 3.1.5), and puts a quarter em between Japanese and Latin letters or digits; Paragraph panel menu › Top-to-Top / Bottom-to-Bottom Leading measures leading from em box top to top (area type's first line touches the frame) or from baseline to baseline (new type in a Japanese interface starts top to top, with em box centre character alignment, #432); Paragraph panel menu › Burasagari None / Regular / Force (`text.setFormat {burasagari: "none"|"standard"|"forced"}`) hangs an East Asian comma or full stop (、。,.、。) ending an area type line outside it, Regular (new type's default) when it doesn't fit and Force always (the rest of the line then fills the measure; closing brackets and Latin punctuation don't hang); Character panel menu › Character Alignment (with the East Asian options; `text.setFormat` or `text.setRangeStyle {charAlign}`) lines characters smaller than the largest on their line up on the Roman baseline, the em box top/right, centre or bottom/left, or the ICF (ideographic character face) top/right or bottom/left, from the font's BASE table or, without one, the average ink box of some ideographs and kana; Proportional Metrics (the same menu; `{proportionalMetrics}`) sets full-width glyphs on the font's proportional widths (OpenType `palt`) in horizontal type and upright glyphs on its proportional heights (`vpal`, shaped top to bottom; fonts without vertical metrics keep their cells) in vertical type, and Line-end Punctuation Half Width takes nothing more off the punctuation they re-spaced; Type ▸ Type Orientation switches existing text; caret, selection, hit testing and arrow keys follow the writing direction. Vertical text exports to PDF as real text and to SVG as outlines. The interface is available in Polish (`pl`): menus, panels, dialogs and messages, with one/few/many plurals; AI-drafted, native review pending (#1498). +- **Interface languages, vertical type:** Preferences ▸ User Interface (or VectorCraft ▸ Language on macOS) picks Automatic (the system locale) or a registered language, persisted as `interfaceLanguage`. Translations come from per-language catalogs (`i18n/*.tsv`): Traditional and Simplified Chinese, Japanese, German (every `de-*` locale), Spanish (neutral international Spanish, for every `es-*` locale), French (every `fr-*` locale), Italian (every `it-*` locale) Russian (every `ru-*` locale) and Ukrainian (every `uk-*` locale) cover the whole interface, Czech every menu label; Czech, German, Greek, Spanish, French, Hungarian, Italian, Japanese, Korean, Vietnamese, Polish, Brazilian Portuguese, Russian, Simplified Chinese, Swedish, Ukrainian and Finnish also translate status-bar and error messages as they are shown (`@msg` templates, every message literal tested; the messages themselves stay English for agents); untranslated text stays English. Japanese and Chinese glyphs come from the craft-fonts build input (release builds) or the installed fonts, Czech, German, Spanish, French, Italian, Russian and Ukrainian ones from the bundled UI fonts. The web app follows the browser's languages (or `?lang=`). The Basic toolbar's Type button holds Vertical Type in its flyout. Vertical Type, Vertical Area Type and Vertical Type on a Path create vertical text (columns right to left, upright CJK glyphs and marks with `vert` alternates, Latin and longer numbers on their side, two- and three-digit numbers set as tate-chu-yoko in one em of the column (kept whole when justified), upright glyphs centred on the column (tracked or justified too), point type's anchor on the first column's centre line); kinsoku applies to horizontal and vertical Japanese (Paragraph panel › Kinsoku Set, `text.setFormat {kinsoku}`: Hard, the default, keeps closing marks, iteration marks, the prolonged sound mark and small kana off the line start and opening brackets off its end; Soft lets 々, ー and small kana start a line as JLREQ's level 3 rules do; None turns it off), and justified Japanese lines spread their room between characters (not inside Latin words); Paragraph panel › Mojikumi Set (shown with Preferences › Type › Show East Asian Options, `text.setFormat {mojikumi}`): None or Line-end Punctuation Half Width (new type's default, as in Illustrator; older documents and imported text keep None) shares one half-em space between consecutive punctuation, sets a closing mark ending a line half width and an opening bracket starting a line flush with its start (a paragraph's first line at its first-line indent, JIS X 4051's principle in JLREQ 3.1.5), and puts a quarter em between Japanese and Latin letters or digits; Paragraph panel menu › Top-to-Top / Bottom-to-Bottom Leading measures leading from em box top to top (area type's first line touches the frame) or from baseline to baseline (new type in a Japanese interface starts top to top, with em box centre character alignment, #432); Paragraph panel menu › Burasagari None / Regular / Force (`text.setFormat {burasagari: "none"|"standard"|"forced"}`) hangs an East Asian comma or full stop (、。,.、。) ending an area type line outside it, Regular (new type's default) when it doesn't fit and Force always (the rest of the line then fills the measure; closing brackets and Latin punctuation don't hang); Character panel menu › Character Alignment (with the East Asian options; `text.setFormat` or `text.setRangeStyle {charAlign}`) lines characters smaller than the largest on their line up on the Roman baseline, the em box top/right, centre or bottom/left, or the ICF (ideographic character face) top/right or bottom/left, from the font's BASE table or, without one, the average ink box of some ideographs and kana; Proportional Metrics (the same menu; `{proportionalMetrics}`) sets full-width glyphs on the font's proportional widths (OpenType `palt`) in horizontal type and upright glyphs on its proportional heights (`vpal`, shaped top to bottom; fonts without vertical metrics keep their cells) in vertical type, and Line-end Punctuation Half Width takes nothing more off the punctuation they re-spaced; Type ▸ Type Orientation switches existing text; caret, selection, hit testing and arrow keys follow the writing direction. Vertical text exports to PDF as real text and to SVG as outlines. The interface is available in Polish (`pl`): menus, panels, dialogs and messages, with one/few/many plurals; AI-drafted, native review pending (#1498). - **Transparency:** opacity masks (clip/invert/disable/link), exported as SVG `` and PDF soft masks. The constant alpha soft mask that PDF and `.ai` export draw a CMYK page with transparency through is white, so applications that read every soft mask by its luminosity show the page too (#1359, part of #1286). Disable, Enable, Unlink and Link Opacity Mask and Opacity Mask Options (`transparency.setOpacityMask`) record no undo step when every mask they act on already has the flags they set. - **Image Trace, thin closed outlines:** generated `fit::snap_area_tests` verify nonzero interiors after straightening, opposite closed-boundary winding and Noise controls; see [quality notes](image-trace-quality.md#thin-closed-outlines-with-snap-curves-to-lines). Scores and hours unchanged; open-piece fitting is unchanged.