CSV 转嵌套 JSON:一键生成多语言本地化配置文件

6次阅读

CSV 转嵌套 JSON:一键生成多语言本地化配置文件

本文提供一个轻量、可复用的 python 脚本,将含多语言字段(如 en、nl)的 csv 表格自动转换为按语言分组的嵌套 json 文件,支持任意新增语言列,无需手动修改逻辑。

本文提供一个轻量、可复用的 python 脚本,将含多语言字段(如 en、nl)的 csv 表格自动转换为按语言分组的嵌套 json 文件,支持任意新增语言列,无需手动修改逻辑。

在多语言网站或应用的本地化(i18n)实践中,常以 CSV 作为翻译内容的协作格式——结构清晰、便于编辑与版本管理。但运行时通常需加载结构化的嵌套 json,例如按 group(如 “global”、”menu”)组织,再嵌套 key → translation 映射。手动转换不仅低效,还极易因重复键或层级错误导致解析失败。

下面是一个健壮、零依赖的 Python 解决方案,它能自动识别所有非元数据列(即除 Group 和 Key 外的所有列)作为目标语言,并为每种语言生成符合要求的嵌套 JSON:

import csv import json  def csv_to_json(csv_file):     # 存储:{ 'EN': { 'global': { 'yes': 'yes', ... }, ... }, 'NL': { ... } }     data = {}      with open(csv_file, mode='r', encoding='utf-8') as file:         reader = csv.DictReader(file)         for row in reader:             group = row['Group'].lower()  # 统一小写,保证键名规范(如 Global → global)             key = row['Key']              # 遍历所有语言列(跳过 Group 和 Key)             for lang in row.keys():                 if lang not in ['Group', 'Key']:                     # 初始化语言顶层字典                     if lang not in data:                         data[lang] = {}                     # 初始化该语言下的 group 字典                     if group not in data[lang]:                         data[lang][group] = {}                     # 写入 key-value 映射                     data[lang][group][key] = row[lang]      # 为每种语言生成独立 JSON 文件     for lang, lang_data in data.items():         output_file = f"{lang}.json"         with open(output_file, mode='w', encoding='utf-8') as f:             json.dump(lang_data, f, indent=4, ensure_ascii=False)         print(f"✅ 已生成: {output_file}")  if __name__ == "__main__":     csv_file = "translations.csv"  # ✅ 替换为你实际的 CSV 文件名     csv_to_json(csv_file)

✅ 使用说明

  1. 将上述代码保存为 csv-to-json.py;
  2. 确保你的 CSV 文件(如 translations.csv)首行为 Group,Key,EN,NL,…,且无空行或乱码;
  3. 在终端执行:
    python3 csv-to-json.py

    即自动生成 EN.json、NL.json 等文件。

⚠️ 注意事项

  • 编码必须为 UTF-8:避免中文、荷兰语特殊字符(如 ë, ï)乱码;
  • 列名大小写敏感:脚本严格匹配 Group 和 Key;若 CSV 中为 group/key,请同步修改代码中的 ‘Group’ 和 ‘Key’;
  • 空值处理:若某单元格为空,对应 JSON 值将为 NULL;如需跳过空翻译,可在赋值前加 if row[lang].strip(): 判断;
  • 扩展性:新增语言列(如 FR, DE)无需改代码——脚本自动识别并生成 FR.json、DE.json。

? 输出示例(NL.json)

{     "global": {         "yes": "ja",         "no": "neen"     },     "menu": {         "openMenu": "Open menu",         "signUp": "Registreer"     } }

该方案兼顾简洁性与生产可用性:不依赖外部库(仅标准库)、逻辑清晰、易于维护,特别适合前端团队或本地化专员快速交付多语言资源。你只需维护一份 CSV,其余全部自动化——真正实现“改一次,全语言生效”。

text=ZqhQzanResources