如何翻译CSV文件

OpenL Team 2026/1/9

目录

CSV 看起来很简单,但翻译时很容易出错:列顺序错乱、引号破损、非拉丁字符乱码,或者 ID 被“翻译”成无法使用的内容。本指南将展示一种安全、实用的工作流程,用于在保留结构的前提下翻译 CSV 文件,并提供 QA 检查清单以及常见问题的修复方法。

如果你想要最简单的选项,请使用支持 CSV 的翻译工具(方法一),而不是将 CSV 文本复制到通用文本翻译器中。

在导入翻译后的文件之前,请按照本指南中的 QA 检查清单操作,以便及早发现列/编码问题。

为什么 CSV 翻译很棘手

CSV 是纯文本,但它包含结构规则:

  • 分隔符:通常是逗号(,),在某些地区也可能是分号(;)。
  • 引号:文本值可能被双引号(")包裹。值中的引号必须转义(通常为 "")。
  • 单元格内换行符:允许,但仅当该单元格被正确引用时。
  • 编码:你的文件可能是 UTF‑8、带 BOM 的 UTF‑8,或是旧版编码。
  • 混合数据类型:数字、日期、SKU、ID、URL 和占位符通常必须保持不变。

将 CSV 视为“纯文本”的翻译工具,可能会意外修改结构字符(分隔符/引号/换行符)或转换数据类型(日期/数字),导致导入失败。

开始前的准备

以下快速步骤可防止大多数 CSV 翻译损坏:

  1. 备份一份副本

    • 保存 file.csvfile.original.csv
    • 如果 CSV 包含客户数据,请在上传到任何地方之前移除或匿名化敏感字段。
  2. 识别“禁止翻译”字段 保持这些内容不变:

    • ID、键、SKU、订单号
    • URL、邮箱、文件路径
    • 占位符和变量({name}{{amount}}%s:count
    • 标签、枚举值、内部状态码(PAIDREFUNDED
    • 任何被代码调用的字段(API key、JSON 块、HTML 片段)
    • 如果不确定,请参见:/what-not-to-translate
  3. 确认分隔符、引号规则和行结束符

  4. 确认编码

    • 多语言内容建议优先使用 UTF‑8 编码。
    • 如果你将在 Windows 上用 Excel 打开翻译后的 CSV,可能需要使用 带 BOM 的 UTF‑8,以避免出现乱码。
    • BOM 相关背景知识:https://unicode.org/faq/utf_bom.html
  5. 可选但推荐:添加稳定的 row_id 对于需要重新导入或后续匹配的 CSV,建议添加唯一键列(如 row_id),以便验证行未被重新排序。

方法 1 — 支持 CSV 的在线翻译工具(推荐)

支持 CSV 的翻译工具会将 CSV 作为结构化数据处理,而不是“纯文本”,因此不容易破坏分隔符、引号或行/列布局。导入前务必执行 QA 检查清单。

中性选项对比

选项优势权衡最适用场景
OpenL CSV Translator Online专为 CSV 结构设计;上传/下载速度快基于上传的工作流;不适合敏感数据快速、可靠的 CSV 草稿
DeepL / Google Cloud / AWS Translate (API)可自动化;质量较好;适合批量流程需要工程支持 + 仔细处理 CSV需翻译大量文件的团队
CAT 工具(Smartling, Lokalise, Phrase 等)术语/QA、协作支持设置复杂且成本较高大规模产品/UI 本地化
表格公式(Sheets/Excel)无需额外工具容易自动格式化或破坏 CSV仅适用于小型、低风险文件

限制与说明

  • 请勿上传您无权共享的敏感数据。如有需要,请先导出经过清理的 CSV 文件。
  • 如果您的系统需要特定的表头名称,请不要翻译表头行。
  • 在导入翻译后的 CSV 之前,请务必执行 QA 检查清单。
  • 如果您使用的是在线工具,请在工具页面检查其上传限制和支持的格式。

操作步骤

  1. 打开工具

  2. 选择语言

    • 选择您的目标语言。
  3. 上传您的 CSV 文件

    • 上传或拖放您的 .csv 文件。
    • 如果您的 CSV 包含多个文本列,翻译器会在保持分隔符和引号安全的前提下翻译内容。
  4. 下载翻译后的 CSV 文件

    • 以清晰的文件名保存,例如 products_es.csv

获得更好结果的最佳实践

  • 仅翻译面向用户的列:产品标题、描述、UI 字符串、面向客户的备注。
  • 保持代码稳定:不要翻译 statustypeskucategory_idurlhandle

方法二 — Google Sheets 或 Excel

此流程可行,但更容易因操作失误而更改格式、分隔符或数据类型。

Google Sheets(适用于小文件)

  1. 导入 CSV

    • Google Sheets → 文件 → 导入 → 上传
    • 如果您的数据只显示在一列,请选择正确的分隔符(逗号或分号)。
  2. 保护“禁止翻译”列

    • 先将 ID 列格式设置为纯文本(如 SKU、订单号),以防止 00123 变为 123
  3. 仅翻译目标列

    • 列中使用 =GOOGLETRANSLATE(A2,"en","es"),然后复制 → 粘贴特殊 → 仅值
    • 不要对包含 URL、占位符、代码或公式的列运行翻译公式。
  4. 导出

    • 文件 → 下载 → 逗号分隔值 (.csv)(Google Sheets 导出为 UTF‑8)。

Excel(Windows)— 正确导入和导出 UTF‑8 的方法

Excel 是编码错误最常发生的地方。请按照以下步骤避免乱码和分隔符问题。

A) 导入 CSV 文件,避免字符乱码

  1. 数据 → 从文本/CSV
  2. 在导入对话框中:
    • 文件来源 / 编码:选择 65001: Unicode (UTF‑8)(不同版本措辞可能不同)
    • 分隔符:逗号(,)或分号(;),根据你的文件选择
  3. 点击 加载(如果需要强制将 ID 列设置为 文本,则选择 转换数据

B) 导出为 UTF‑8(以及何时使用 BOM)

  1. 文件 → 另存为
  2. 保存类型 中选择:
    • CSV UTF‑8(逗号分隔)(*.csv)(推荐用于多语言文本)
    • 如果下游系统不接受 BOM,可以使用脚本导出无 BOM 的 UTF‑8(参见“批量处理”),或用代码编辑器重新保存。

常见陷阱

  • 自动格式化:电子表格可能会将像 00123 这样的 ID 转换为 123
  • 日期转换2026-01-09 可能显示不同,导出时也不一致。
  • 分隔符变化:导出时可能会根据地区设置切换为 ;

如果你采用此方法,下面的 QA 部分为必读内容。

高级工作流 — 翻译表

如果你的 CSV 文件中既有“需翻译”又有“不需翻译”的数据,请创建一个单独的翻译表,确保翻译不会影响敏感字段。

步骤 1:创建翻译表

新建一个 CSV 文件(或工作表),格式如下:

row_idfieldsource_textcontexttranslated_text
101product_titleWireless MouseE-commerce product title无线鼠标
101product_descSilent clicks, 2-year batteryShort description静音点击,2年电池寿命
102product_titleUSB-C ChargerE-commerce product titleUSB-C 充电器
102product_descFast charging for phones and tabletsShort description手机和平板的快速充电
103product_titleStainless Steel Water BottleProduct title不锈钢水瓶
103product_descBPA-free, keeps drinks cold 24hShort description不含BPA,饮品保冷24小时
104product_titleNoise-Canceling HeadphonesProduct title降噪耳机
104product_descOver-ear, Bluetooth 5.3Short description头戴式,Bluetooth 5.3

步骤 2:仅翻译 source_text

source_text 列翻译为中文,并将结果填写到 translated_text 列中。(建议使用支持CSV的在线翻译工具,优于电子表格。)

步骤 3:映射回原数据

通过 row_id + field 进行关联,并将翻译后的文本写回原始数据集。这可以确保ID、价格和系统字段不会被翻译。

示例(Python + pandas)

import pandas as pd

# 原始数据(保持类型稳定;将ID视为字符串)
orig = pd.read_csv("products.csv", dtype=str, keep_default_na=False)

# 翻译表(翻译后)
tt = pd.read_csv("translation_table_es.csv", dtype=str, keep_default_na=False)

# 重塑为每个row_id一行(宽格式)
wide = (
  tt.pivot(index="row_id", columns="field", values="translated_text")
  .add_suffix("__translated")
  .reset_index()
)

merged = orig.merge(wide, on="row_id", how="left")

# 写回(示例字段)
merged["product_title"] = merged["product_title__translated"].where(
  merged["product_title__translated"].ne(""), merged["product_title"]
)
merged["product_desc"] = merged["product_desc__translated"].where(
  merged["product_desc__translated"].ne(""), merged["product_desc"]
)

merged.drop(columns=[c for c in merged.columns if c.endswith(“__translated”)], inplace=True) merged.to_csv(“products_es.csv”, index=False, encoding=“utf-8-sig”)


#### 示例(SQL join/update 模式)

```sql
-- translation_table(row_id, field, translated_text)
-- products(row_id, product_title, product_desc, ...)

UPDATE products p
SET product_title = t.translated_text
FROM translation_table t
WHERE p.row_id = t.row_id
  AND t.field = 'product_title'
  AND t.translated_text IS NOT NULL
  AND t.translated_text <> '';

批量处理(多个 CSV 文件)

如果你需要翻译许多 CSV 文件,请避免手动表格操作,使用可复用的流水线:

  1. 标准化输入

    • 统一为 UTF‑8 编码(如果你的导入工具需要,也可以使用带 BOM 的 UTF‑8)。
    • 确保每个文件都有稳定的主键(如 row_id / id)用于映射。
  2. 为每个文件生成翻译表

    • 只提取可翻译字段到 translation_table_<file>.csv
    • 如果你更喜欢所有文件合并为一个表,可以保留一个 source_file 列。
  3. 翻译表格

    • 使用 API 工作流或支持 CSV 的工具逐文件翻译。
  4. 结果回写并导出

    • row_id + field(如果使用了 source_file 也要加上)进行映射。
    • 按下游系统要求的编码格式导出。

最简起步循环(批量一致性处理多个文件):

for f in ./input/*.csv; do
  base="$(basename "$f" .csv)"
  # 1) 提取翻译表(根据你的 schema 实现)
  # 2) 翻译 translation_table_${base}.csv -> translation_table_${base}_translated.csv
  # 3) 回写并导出 ${base}_translated.csv
  echo "Processed: $base"
done

翻译后 QA 检查清单

下载翻译后的 CSV 后,在导入前请进行以下检查:

快速检查

  • 比较行数(macOS/Linux):wc -l file.original.csv file.translated.csv
  • 通过在纯文本编辑器中打开文件并确认分隔符是否一致,抽查分隔符的一致性。
  • 可选:使用 Python 验证列数是否一致:
python -c "import csv,sys; p=sys.argv[1]; r=list(csv.reader(open(p,newline='',encoding='utf-8'))); print('rows',len(r),'max_cols',max(len(x) for x in r))" file.translated.csv

如果遇到 Unicode 解码错误,请先将 CSV 转换为 UTF-8,或尝试使用 utf-8-sig

python -c "import csv,sys; p=sys.argv[1]; r=list(csv.reader(open(p,newline='',encoding='utf-8-sig'))); print('rows',len(r),'max_cols',max(len(x) for x in r))" file.translated.csv

结构检查

  • 行数未变:数据行数与原始文件一致。
  • 列数未变:每行的列数一致。
  • 分隔符未变:逗号或分号与导入工具保持一致。
  • 引号有效:包含逗号/换行符的字段保持正确引用。

数据完整性检查

  • ID 和键未变:比较 skuidrow_idhandle
  • URL/邮箱未变:没有多余空格,域名未被翻译。
  • 数字保持不变:价格、数量、小数点等数据未被更改。
  • 占位符保持不变{name}{{count}}%s:value 等占位符未被修改。

翻译质量检查

  • 术语一致:关键产品术语在各行翻译一致。
  • 长度限制遵守:界面标签不过长(应用程序尤为重要)。
  • 无混合语言残留:检查常见源语言词汇是否应被翻译。

常见 CSV 翻译问题排查

1) 翻译后列错位

症状

  • 导入工具提示“列数错误”
  • 数据出现在错误的表头下

可能原因

  • 翻译字段中包含未转义的引号("
  • 翻译字段中包含逗号/换行符但未正确加引号

解决方法

  • 确保 CSV 使用正确的引号规则(字段外部使用双引号,内部引号转义为 "")。
  • 使用支持 CSV 的工作流程进行重新翻译(而不是直接翻译原始 CSV 文本)。

2) 出现乱码(mojibake),如 ????é

可能原因

  • 导出/导入时编码错误(UTF‑8 与旧编码格式)

解决方法

  • UTF‑8 格式导出。
  • 如果在 Windows 上使用 Excel,尝试使用 带 BOM 的 UTF‑8
  • 避免手动复制/粘贴,因为这可能会改变编码。

3) 前导零消失(00123123

可能原因

  • 电子表格自动格式化(Excel/Sheets)

解决方法

  • 在编辑/导出前,将 ID 列设置为文本格式。
  • 优先使用不会更改数据类型的支持 CSV 的翻译流程。

4) 日期或小数格式发生变化

示例

  • 1,234.56 变为 1.234,56
  • 2026-01-09 变为 09/01/2026

解决方法

  • 不要翻译数字/日期列。
  • 保持值为机器可读格式;在 UI 层本地化显示格式,而不是在原始数据中。

5) 安全问题:CSV 注入(Excel 公式)

如果翻译后的单元格以 =+-@ 开头,在 Excel 中打开文件时可能会被当作公式执行。

解决方法

  • 对于将在电子表格中打开的 CSV,通过在前面加单引号(')或在导出时进行清理,来转义有风险的单元格。
  • 考虑在翻译/导入前,去除用户提供文本中的公式前缀字符。
  • 参考:https://owasp.org/www-community/attacks/CSV_Injection

常见问题解答

如何翻译 CSV 而不破坏列结构?

使用支持 CSV 的工作流程,并在导入前验证结构:

  • 使用支持 CSV 的方法进行翻译(方法 1)
  • 运行“快速检查”+ QA 检查表,确认行/列数量和引号有效性
  • 如果 CSV 混合了敏感字段和面向用户的文本,使用“高级工作流 — 翻译表”

我可以只翻译 CSV 中的一列吗?

可以。最安全的方法是创建一个翻译表(row_id + source_text + context),只翻译这一部分,然后再映射回原表。这样可以防止 ID 和数值字段被意外修改。

我应该翻译表头行吗?

这取决于你的使用场景:

  • 如果 CSV 供人类阅读(报告、导出),可以翻译表头。
  • 如果你的系统/导入工具需要特定字段名(电商导入、数据库、应用),则不要翻译表头。

我的 CSV 使用分号(;)而不是逗号,这可以吗?

可以,但要确保你的工具/导入程序始终使用相同的分隔符。许多欧洲地区默认使用分号。分隔符不一致是导致 CSV 导入失败的常见原因。

如何处理单元格中的多行文本(换行符)?

CSV 支持多行单元格,但必须正确加引号。如果你的翻译内容包含换行,强烈建议使用支持 CSV 的翻译工具,以避免行断裂。

工具

  • OpenL CSV Translator Online(示例支持 CSV 的工具): https://doc.openl.io/translate/csv
  • 针对 Excel 工作流: 另见“如何在线翻译 Excel”:/how-to-translate-excel-online
  • 针对 Markdown 内容: “如何翻译 Markdown”:/how-to-translate-markdown
  • 如果你需要关于哪些内容不应翻译的规则: “哪些内容不应翻译”:/what-not-to-translate

总结

为了安全翻译 CSV 文件,请保持结构(分隔符、引号、编码)不变,并保护“不可翻译”字段(ID、URL、占位符、数字)。优先使用支持 CSV 的工作流,导入前请用 QA 检查表进行核查。