CSV 파일을 번역하는 방법
TABLE OF CONTENTS
CSV는 단순해 보이지만, 번역 과정에서 열이 이동하거나, 따옴표가 깨지거나, 비라틴 문자가 깨지거나, ID가 쓸 수 없는 값으로 “번역”되는 등 문제가 빠르게 발생할 수 있습니다. 이 가이드에서는 구조를 유지하면서 CSV 파일을 안전하게 번역하는 실용적인 워크플로우와, QA 체크리스트 및 일반적인 문제에 대한 해결 방법을 제공합니다.
가장 간단한 방법을 원한다면, CSV‑인식 번역기(Method 1)를 사용하세요. CSV 텍스트를 일반 텍스트 번역기에 복사하는 것보다 안전합니다.
번역된 파일을 가져오기 전에, 이 가이드의 QA 체크리스트를 실행하여 열/인코딩 문제를 미리 발견하세요.
CSV 번역이 까다로운 이유
CSV는 일반 텍스트이지만, 다음과 같은 구조 규칙을 포함합니다:
- 구분자: 일반적으로 쉼표(
,)를 사용하지만, 일부 로케일에서는 세미콜론(;)을 사용합니다. - 따옴표: 텍스트 값은 큰따옴표(
")로 감싸질 수 있습니다. 값 내부의 따옴표는 반드시 이스케이프 처리해야 합니다(일반적으로""). - 셀 내부 줄바꿈: 허용되지만, 셀이 올바르게 따옴표로 감싸져 있어야 합니다.
- 인코딩: 파일이 UTF‑8, BOM이 포함된 UTF‑8, 또는 레거시 인코딩일 수 있습니다.
- 혼합 데이터 타입: 숫자, 날짜, SKU, ID, URL, 플레이스홀더 등은 대부분 변경하지 않아야 합니다.
CSV를 “단순 텍스트”로 처리하는 번역 도구는 구조 문자(구분자/따옴표/줄바꿈)를 실수로 수정하거나, 데이터 타입(날짜/숫자 등)을 변환하여 파일 가져오기가 깨질 수 있습니다.
시작하기 전에
다음의 빠른 단계로 대부분의 CSV 번역 오류를 예방할 수 있습니다:
-
백업 복사본 만들기
file.csv→file.original.csv로 저장하세요.- CSV에 고객 데이터가 포함되어 있다면, 업로드 전에 민감한 필드를 제거하거나 익명화하세요.
-
“번역하지 말아야 할” 필드 식별하기 다음 항목은 변경하지 마세요:
- ID, 키, SKU, 주문 번호
- URL, 이메일, 파일 경로
- 플레이스홀더 및 변수 (
{name},{{amount}},%s,:count) - 태그, 열거형 값, 내부 상태 코드 (
PAID,REFUNDED) - 코드에서 사용하는 모든 필드(API 키, JSON blob, HTML snippet)
- 확실하지 않다면, /what-not-to-translate를 참고하세요.
-
구분자, 인용 규칙, 줄 끝 확인
- CSV를 열었을 때 “한 열로만 보인다면”, 구분자가 잘못되었을 가능성이 높습니다.
- 일반적인 CSV는
,구분자와"인용 부호를 사용합니다 (RFC 4180 참고: https://www.rfc-editor.org/rfc/rfc4180).
-
인코딩 확인
- 다국어 콘텐츠에는 UTF‑8을 권장합니다.
- Windows의 Excel에서 번역된 CSV를 열 계획이라면, 글자가 깨지는 것을 방지하기 위해 UTF‑8 with BOM이 필요할 수 있습니다.
- BOM 배경: https://unicode.org/faq/utf_bom.html
-
선택 사항이지만 권장: 안정적인
row_id추가 나중에 CSV를 다시 가져오거나 매칭할 경우를 위해, 고유한 키 열(예:row_id)을 추가하여 행 순서가 변경되지 않았는지 확인할 수 있습니다.
방법 1 — CSV 인식 온라인 번역기(권장)
CSV 인식 번역기는 CSV를 “단순 텍스트”가 아닌 구조화된 데이터로 처리하므로, 구분자, 인용 부호, 행/열 레이아웃이 깨질 가능성이 적습니다. 가져오기 전에 항상 QA 체크리스트를 실행하세요.
중립적 옵션 비교
| 옵션 | 강점 | 단점 | 적합한 경우 |
|---|---|---|---|
| OpenL CSV Translator Online | CSV 구조에 최적화; 빠른 업로드/다운로드 | 업로드 기반 워크플로우; 민감한 데이터에는 부적합 | 빠르고 신뢰성 있는 CSV 초안 |
| DeepL / Google Cloud / AWS Translate (API) | 자동화 가능; 품질 우수; 배치 파이프라인에 적합 | 엔지니어링 및 CSV 세심한 처리 필요 | 여러 파일을 번역하는 팀 |
| CAT tools (Smartling, Lokalise, Phrase 등) | 용어/QA, 협업 지원 | 더 많은 설정 및 비용 | 대규모 제품/UI 현지화 |
| 스프레드시트 수식(Sheets/Excel) | 별도 도구 불필요 | CSV 자동 서식화 또는 손상 쉬움 | 소규모, 저위험 파일에만 적합 |
제한 사항 및 참고
- 공유가 허용되지 않은 민감한 데이터를 업로드하지 마세요. 필요하다면 먼저 민감 정보가 제거된 CSV를 내보내세요.
- 시스템에서 특정 헤더명이 필요하다면, 헤더 행을 번역하지 마세요.
- 번역된 CSV를 가져오기 전에 항상 QA 체크리스트를 실행하세요.
- 온라인 도구를 사용하는 경우, 해당 도구 페이지에서 업로드 제한 및 지원 형식을 확인하세요.
단계별 안내
-
도구 열기
-
언어 선택
- 대상 언어를 선택하세요.
-
CSV 업로드
.csv파일을 업로드하거나 드래그 앤 드롭하세요.- CSV에 여러 텍스트 열이 있는 경우, 번역기는 구분자와 인용부호를 안전하게 유지하면서 내용을 번역합니다.
-
번역된 CSV 다운로드
products_es.csv와 같이 명확한 이름으로 저장하세요.
더 나은 결과를 위한 모범 사례
- 사용자에게 노출되는 열만 번역: 제품명, 설명, UI 문자열, 고객 안내 문구 등.
- 코드는 변경하지 않기:
status,type,sku,category_id,url,handle등은 번역하지 마세요.
방법 2 — Google Sheets 또는 Excel
이 워크플로우도 사용할 수 있지만, 서식, 구분자 또는 데이터 유형이 실수로 변경될 수 있습니다.
Google Sheets (소형 파일)
-
CSV 가져오기
- Google Sheets → 파일 → 가져오기 → 업로드.
- 데이터가 한 열에만 표시된다면 올바른 구분자(쉼표 또는 세미콜론)를 선택하세요.
-
“번역 금지” 열 보호
- ID 열(SKU, 주문번호 등)은 먼저 텍스트 형식으로 지정하세요. (
00123→123변환 방지)
- ID 열(SKU, 주문번호 등)은 먼저 텍스트 형식으로 지정하세요. (
-
대상 열만 번역
- 새로운 열에
=GOOGLETRANSLATE(A2,"en","es")를 사용한 후, 복사 → 특수 붙여넣기 → 값만을 선택하세요. - URL, 플레이스홀더, 코드, 수식이 포함된 열에는 번역 수식을 사용하지 마세요.
- 새로운 열에
-
내보내기
- 파일 → 다운로드 → 쉼표로 구분된 값(.csv) (Google Sheets는 UTF‑8로 내보냅니다).
Excel (Windows) — UTF‑8을 올바르게 가져오고 내보내는 방법
Excel에서 인코딩 오류가 가장 자주 발생합니다. 다음 단계들을 따라 문자 깨짐과 구분자 문제를 방지하세요.
A) CSV를 문자 깨짐 없이 가져오기
- 데이터 → 텍스트/CSV에서
- 가져오기 대화상자에서:
- 파일 원본 / 인코딩: 65001: Unicode (UTF‑8) 선택 (버전에 따라 문구가 다를 수 있음)
- 구분자: 파일에 맞게 쉼표(
,) 또는 세미콜론(;) 선택
- 로드 클릭 (또는 ID 컬럼을 텍스트로 강제 지정해야 한다면 데이터 변환 클릭)
B) UTF‑8로 내보내기 (BOM 사용 시점)
- 파일 → 다른 이름으로 저장
- 파일 형식에서 다음을 선택:
- CSV UTF‑8 (쉼표로 구분) (*.csv) (다국어 텍스트에 권장)
- 다운스트림 시스템이 BOM을 거부한다면, 스크립트(“Batch Processing” 참고)로 BOM 없는 UTF‑8로 내보내거나 코드 에디터로 다시 저장하세요.
일반적인 실수
- 자동 서식 지정: 스프레드시트가
00123같은 ID를123으로 변환할 수 있습니다. - 날짜 변환:
2026-01-09가 다르게 표시되거나 내보내기 시 일관성이 없을 수 있습니다. - 구분자 변경: 내보내기가 로케일 설정에 따라
;로 바뀔 수 있습니다.
이 방법을 사용한다면, 아래 QA 섹션은 필수입니다.
고급 워크플로우 — 번역 테이블
CSV가 “번역”과 “번역하지 않음” 데이터가 혼합된 경우, 번역이 민감한 필드에 영향을 주지 않도록 별도의 번역 테이블을 만드세요.
1단계: 번역 테이블 만들기
다음과 같은 새 CSV(또는 시트)를 만드세요:
| row_id | field | source_text | context | translated_text |
|---|---|---|---|---|
| 101 | product_title | Wireless Mouse | E-commerce product title | 무선 마우스 |
| 101 | product_desc | Silent clicks, 2-year battery | Short description | 무소음 클릭, 2년 배터리 |
| 102 | product_title | USB-C Charger | E-commerce product title | USB-C 충전기 |
| 102 | product_desc | Fast charging for phones and tablets | Short description | 휴대폰 및 태블릿 고속 충전 |
| 103 | product_title | Stainless Steel Water Bottle | Product title | 스테인리스 스틸 물병 |
| 103 | product_desc | BPA-free, keeps drinks cold 24h | Short description | BPA 프리, 24시간 음료 냉각 유지 |
| 104 | product_title | Noise-Canceling Headphones | Product title | 노이즈 캔슬링 헤드폰 |
| 104 | product_desc | Over-ear, Bluetooth 5.3 | Short description | 오버이어, Bluetooth 5.3 |
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 파일을 번역해야 한다면, 수동 스프레드시트 작업을 피하고 반복 가능한 파이프라인을 사용하세요:
-
입력 표준화
- UTF‑8(또는 importer가 필요하다면 UTF‑8 with BOM)로 인코딩을 통일하세요.
- 매핑을 위한 안정적인 키(
row_id/id)가 모든 파일에 있는지 확인하세요.
-
파일별 번역 테이블 생성
- 번역 가능한 필드만
translation_table_<file>.csv로 추출하세요. - 모든 파일을 하나의 테이블로 합치려면
source_file컬럼을 유지하세요.
- 번역 가능한 필드만
-
테이블 번역
- API 워크플로우 또는 CSV 지원 도구를 사용해 파일별로 번역하세요.
-
결과 조인 및 내보내기
row_id + field(필요하다면source_file도 포함)로 매핑하세요.- 다운스트림 시스템에서 요구하는 인코딩으로 내보내세요.
최소한의 스타터 루프(여러 파일을 일관되게 처리):
for f in ./input/*.csv; do
base="$(basename "$f" .csv)"
# 1) 번역 테이블 추출 (스키마에 맞게 구현)
# 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
구조 점검
- 행 수 변동 없음: 원본과 동일한 데이터 행 수.
- 컬럼 수 변동 없음: 각 행의 컬럼 수가 동일함.
- 구분자 변동 없음: 콤마와 세미콜론이 importer와 일치함.
- 따옴표 유효성: 콤마/줄바꿈이 포함된 필드는 올바르게 따옴표로 감싸짐.
데이터 무결성 점검
- ID 및 키 변동 없음:
sku,id,row_id,handle비교. - URL/이메일 변동 없음: 공백 추가 없음, 도메인 번역 없음.
- 숫자 보존: 가격, 수량, 소수점 값이 동일함.
- 플레이스홀더 보존:
{name},{{count}},%s,:value가 그대로 유지됨.
번역 품질 점검
- 용어 일관성: 주요 제품 용어가 모든 행에서 동일하게 번역됨.
- 길이 제한 준수: UI 라벨이 너무 길지 않음(앱에 중요).
- 혼합 언어 잔여 없음: 번역되어야 할 일반적인 원본 단어가 남아있는지 스캔.
CSV 번역에서 흔히 발생하는 문제 해결
1) 번역 후 컬럼이 밀림
증상
- importer에서 “컬럼 수가 잘못되었습니다”라는 메시지 표시
- 값이 잘못된 헤더 아래에 표시됨
가능한 원인
- 번역된 필드에 이스케이프되지 않은 따옴표(
")가 포함되어 있음 - 번역된 필드에 쉼표/줄바꿈이 포함되어 있지만 올바르게 따옴표로 감싸지지 않음
해결 방법
- CSV가 올바른 따옴표 규칙(필드는 큰따옴표로 감싸고, 내부 따옴표는
""로 이스케이프)을 사용하는지 확인하세요. - 원시 CSV 텍스트를 번역하는 대신, CSV 인식 워크플로우로 다시 번역하세요.
2) ???? 또는 é와 같은 깨진 문자(모지바케)
가능한 원인
- 내보내기/가져오기 시 잘못된 인코딩(UTF‑8 vs 레거시)
해결 방법
- UTF‑8로 내보내세요.
- Windows의 Excel을 사용하는 경우, UTF‑8 with BOM을 시도하세요.
- 인코딩이 변경될 수 있는 수동 복사/붙여넣기를 피하세요.
3) 앞의 0이 사라짐 (00123 → 123)
가능한 원인
- 스프레드시트 자동 서식(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
FAQ
CSV의 열이 깨지지 않게 번역하려면 어떻게 해야 하나요?
CSV 인식 워크플로우를 사용하고, 가져오기 전에 구조를 확인하세요:
- CSV 인식 방법(Method 1)으로 번역하세요.
- “빠른 점검” 및 QA 체크리스트를 실행하여 행/열 수와 올바른 따옴표 사용을 확인하세요.
- CSV에 민감한 필드와 사용자 노출 텍스트가 혼합된 경우, “고급 워크플로우 — Translation Table”을 사용하세요.
CSV에서 한 열만 번역할 수 있나요?
네. 가장 안전한 방법은 번역 테이블(row_id + source_text + context)을 만들어 해당 부분만 번역한 후 다시 매핑하는 것입니다. 이렇게 하면 ID 및 숫자 필드가 실수로 변경되는 것을 방지할 수 있습니다.
헤더 행도 번역해야 하나요?
사용 목적에 따라 다릅니다:
- 헤더를 번역: CSV가 사람이 읽을 용도(보고서, 내보내기 등)라면 헤더를 번역하세요.
- 헤더를 번역하지 않음: 시스템/임포터가 특정 필드명을 기대하는 경우(e-commerce 임포트, 데이터베이스, 앱 등)에는 헤더를 번역하지 마세요.
내 CSV는 쉼표(,) 대신 세미콜론(;)을 사용합니다. 괜찮나요?
네, 하지만 사용하는 도구/임포터가 항상 동일한 구분자를 사용해야 합니다. 많은 유럽 로케일에서는 기본적으로 세미콜론을 사용합니다. 구분자 불일치는 CSV 임포트 실패의 흔한 원인입니다.
셀에 여러 줄(줄바꿈)이 있는 텍스트는 어떻게 처리하나요?
CSV에서 여러 줄이 있는 셀은 허용되지만, 반드시 올바르게 따옴표로 감싸야 합니다. 번역된 내용에 줄바꿈이 포함되어 있다면, 행이 깨지는 것을 방지하기 위해 CSV 인식 번역기 사용을 강력히 권장합니다.
Tools
- OpenL CSV Translator Online (예시 CSV 인식 도구): https://doc.openl.io/translate/csv
- Excel 워크플로우용: “How to Translate Excel Online”도 참고하세요: /how-to-translate-excel-online
- Markdown 콘텐츠용: “How to Translate Markdown”: /how-to-translate-markdown
- 변경하지 않아야 할 규칙이 필요한 경우: “What Not to Translate”: /what-not-to-translate
Summary
CSV 파일을 안전하게 번역하려면 구조(구분자, 따옴표, 인코딩)를 유지하고 “번역하지 않을” 필드(ID, URL, 플레이스홀더, 숫자 등)를 보호해야 합니다. CSV 인식 워크플로우를 우선 사용하고, 임포트 전에 QA 체크리스트로 검증하세요.


