XLSX 与 CSV 文件格式

往返工作簿的架构:每个区域性一个工作表、Daxlate 读回的列布局,以及决定某一行能否导入的规则。

最后更新:

Daxlate 把翻译导出为 XLSX(通过 ClosedXML)或 CSV(通过 CsvHelper)。带报表层的 文件会导出两张工作表,模型报表(或配对的 .model.csv.report.csv);只有模型的文件则只导出模型这一层。本页先详细说明模型工作表, 然后说明报表工作表。

模型工作表的布局 #

模型工作表名为 Model(较早版本只有单层时把它命名为 Translations)。它的行 结构是:

内容
1单元格 A1 中的架构版本标记(Daxlate/1.0,斜体,灰色)
2表头行,加粗,米色背景
3 及以后每个可翻译对象一行

表头行会冻结,这样译者滚动时列标题始终可见。前四列同样冻结,这样向右滚过各个 区域性列时,身份列依然可见。

#

最前面是四个固定的信息列:

说明
Object ID导入时的身份键。请勿编辑。
TypeTableColumnMeasureHierarchyLevel 之一。
Parent所属对象的名称(例如度量值所在的表)。
Name该对象在模型中的名称(默认区域性的标题)。

之后,模型中的每个区域性各占两列:

Caption ({culture})    Description ({culture})

模型默认区域性所在的列带底纹背景,这样一眼就能看出哪一列是事实来源。

这两列中哪些会被写出,取决于导出时网格的视图开关:标题只写标题列, 描述只写描述列,两者则都写。无论哪种模式,每个对象都会占一行,包括还没有 描述的对象。

Object ID 约定 #

Daxlate 用对象的种类和限定名组合出 ID:

种类形式示例
t.{Name}t.Sales
c.{Table}.{Name}c.Sales.Revenue
度量值m.{Table}.{Name}m.Sales.Total Revenue
层次结构h.{Table}.{Name}h.Date.Calendar
层次结构级别{HierarchyId}.l{Ordinal}h.Date.Calendar.l1

在模型中重命名对象会改变它的 ID。重新导入时,带有未知 Object ID 的行会在预览 对话框中以警告形式列出并被跳过;导入不会悄悄丢弃它们。

架构版本 #

XLSX 的单元格 A1(或 CSV 的第一行注释)承载架构版本。读取端会用明确的警告拒绝 主版本号更新的文件,并把缺失的标记按 1.0 处理,以兼容加入版本管理之前的导出。

当前标记是 Daxlate/1.0。新增列属于小版本变更(新列会被忽略并给出警告),破坏性 变更(例如换一套 Object ID 约定)属于大版本变更。

报表工作表 #

对带报表层的文件,第二张名为 Report 的工作表承载报表画布文字(视觉对象标题、 页眉、按钮、文本框)。它采用宽表、对译者友好的形式:每个文字元素一行,每种 语言一列 Value ({culture}),而不是模型工作表那种标题与描述成对的形式,这样译者 在一行里就能填完一条字符串的所有语言。导入会根据内容判断文件是模型工作表、报表 工作表还是双表工作簿,并应用对应的层。

在磁盘上,报表翻译作为按文件划分的伴随文件放在文件旁边,名为 {file}.daxlate.csv,也就是 Power BI 刷新时读取的那份实际生效的 CSV。模型翻译则 存在 .pbit 内部;要拿到它们的副本,请用导出。参见 翻译报表视觉对象

CSV 布局 #

CSV 采用同样的列布局,以逗号分隔。第 1 行以注释形式承载架构标记:

# Daxlate/1.0
Object ID,Type,Parent,Name,Caption (en-US),Description (en-US),Caption (fr-FR),Description (fr-FR)
t.Sales,Table,,Sales,Sales,,Ventes,
c.Sales.Revenue,Column,Sales,Revenue,Revenue,,Chiffre d'affaires,

带 BOM 的 UTF-8、CRLF 换行,以便在 Excel 中双击打开。

空单元格 #

空白单元格表示**“尚未翻译”,导入时会被原样保留;它不会清除已有的翻译。这与 XLIFF、gettext 以及主流翻译平台的做法一致,因此交回一份只做了一半的文件,永远 不会抹掉译者还没顾上的行。导入预览会报告跳过了多少个空白。要删除某条翻译,请在 网格中清空它,或从区域性**下拉菜单中移除该语言。完整的重新导入流程参见 Excel 往返