Add translation guide
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
---
|
||||
name: translation-review
|
||||
description: Review Chinese↔English translation pairs for quality issues — terminology errors, grammar, consistency, formatting. Works with CSV/XLSX files and writes edit suggestions in .dj format.
|
||||
---
|
||||
|
||||
# Translation Review
|
||||
|
||||
## When to use
|
||||
|
||||
- User has a CSV or XLSX file with `Chinese`/`English` (or similar) columns
|
||||
- User asks you to "find problems," "check translations," or "review localization"
|
||||
- User mentions `.dj` edit-suggestions files
|
||||
|
||||
## Workflow
|
||||
|
||||
### 1. Get the data into CSV
|
||||
|
||||
If the file is XLSX, have the user export to CSV (or use `openpyxl` if installed). CSV is easier and faster to process. The user may also provide XHTML — CSV is preferred.
|
||||
|
||||
### 2. Read the full file
|
||||
|
||||
Use `read_file` with offsets to get the complete CSV into context. Don't sample — issues repeat across rows and you need full coverage.
|
||||
|
||||
### 3. Write a systematic analysis script
|
||||
|
||||
Write a Python script to `/tmp/` and run it with `terminal: python3 /tmp/script.py`. Do NOT use heredocs (`<<'PYEOF'`) or `-c` — the terminal tool may block these. Always write to a temp file.
|
||||
|
||||
The script should:
|
||||
- Parse the CSV with `csv.DictReader`
|
||||
- Apply detection rules (regex-based) for each known issue category
|
||||
- Collect issues with: CSV row number, page context, CN text, EN text, problem description, suggested fix
|
||||
- Group/deduplicate identical issues across rows
|
||||
|
||||
Common detection categories for Chinese→English:
|
||||
- **Buddhist terminology**: 正念→mindfulness (not "righteous thoughts"), 布施→generosity (not "alms"), 胜解→resolute conviction, etc.
|
||||
- **Identity terms**: 学士/修士/胜士/智士 are practice stages, not "bachelor/monk/winner/wise man"
|
||||
- **Literal machine translations**: "Is we"→"if we", "hard drive" for 硬盘 (endurance), "Walk without letting go" for 行舍不放逸
|
||||
- **四摄法 terms**: 同事→"acting in harmony" (not "colleagues"), 爱语→"kind speech" (not "love words")
|
||||
- **Grammar**: subject-verb agreement, "have it been"→"has it been", unbalanced quotes
|
||||
- **Typos/formatting**: "AndroidAndroid", "IOS"→"iOS", unbalanced HTML tags, Chinese punctuation in English
|
||||
- **UI terminology**: "Suspended"→"Paused" for media, product name consistency
|
||||
- **Inconsistency**: same CN term translated differently across rows (e.g., "Bodhi Navigator" vs "Bodhi Navigation")
|
||||
|
||||
### 4. Deduplicate into unique issue categories
|
||||
|
||||
The same error pattern often repeats across many rows (e.g., "subversion" for 覆 appears in 6+ rows). Group these into single entries in the .dj file — one entry per unique problem, with a list of affected rows.
|
||||
|
||||
### 5. Write edit-suggestions.dj
|
||||
|
||||
Format:
|
||||
|
||||
```
|
||||
# 1
|
||||
|
||||
original: <Chinese text or key term>
|
||||
translated: <current English>
|
||||
|
||||
<Explanation of the problem and suggested fix.>
|
||||
|
||||
# 2
|
||||
...
|
||||
```
|
||||
|
||||
Each entry gets a `# N` header, `original:` and `translated:` fields, then a free-text explanation. End with suggested replacement text. Mention affected row numbers. For globally-wrong terms, note "Change globally."
|
||||
|
||||
Do NOT write one entry per CSV row — group by problem type.
|
||||
|
||||
### 6. Sanity check
|
||||
|
||||
Run a quick second pass to catch: empty English fields, Chinese characters leaking into English column, untranslated rows (CN == EN), trailing whitespace.
|
||||
|
||||
## Pitfalls
|
||||
|
||||
- **Don't use heredocs or `-c` for multi-line Python** — write to `/tmp/script.py` first, then `python3 /tmp/script.py`. The terminal tool may block heredocs as long-lived processes.
|
||||
- **Deduplicate aggressively** — 80+ raw issues may collapse to 20-25 unique categories. Writing one .dj entry per CSV row is useless noise.
|
||||
- **Buddhist terminology is technical** — don't guess. 正念 is mindfulness (sati), not "righteous thoughts." 唯识 is Yogācāra/Consciousness-Only, not "knowledge and view alone." When uncertain, flag for human review rather than confidently suggesting wrong fixes.
|
||||
- **Don't delete the comparison/对照 file** — translation projects keep these as intentional work artifacts.
|
||||
|
||||
## .dj file format reference
|
||||
|
||||
```
|
||||
# N
|
||||
|
||||
original: <source text>
|
||||
translated: <current translation>
|
||||
|
||||
<Free-text explanation and suggestion. Can be multiple paragraphs.>
|
||||
|
||||
# N+1
|
||||
...
|
||||
```
|
||||
|
||||
Entries may end with `{% TK %}` to mark "to check" items. The file lives alongside the source CSV/XLSX in the same directory.
|
||||
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Reference: reusable detection rules for Chinese→English translation review.
|
||||
Adapt the rules list for each project's domain vocabulary."""
|
||||
|
||||
import csv, re, sys
|
||||
|
||||
def review_csv(csv_path):
|
||||
rows = []
|
||||
with open(csv_path) as f:
|
||||
reader = csv.DictReader(f)
|
||||
for r in reader:
|
||||
rows.append((r.get('page', '') or '', r['Chinese'] or '', r['English'] or ''))
|
||||
|
||||
issues = []
|
||||
|
||||
def add(row_idx, cn, en, problem, suggestion):
|
||||
issues.append({
|
||||
'row': row_idx + 2,
|
||||
'page': rows[row_idx][0],
|
||||
'cn': cn, 'en': en,
|
||||
'problem': problem,
|
||||
'suggestion': suggestion
|
||||
})
|
||||
|
||||
for i, (page, cn, en) in enumerate(rows):
|
||||
if not cn or not en:
|
||||
continue
|
||||
|
||||
# ── Add project-specific detection rules below ──
|
||||
|
||||
# Example: "Is we" → machine translation artifact
|
||||
if re.search(r'\bIs we\b', en):
|
||||
add(i, cn, en,
|
||||
"'Is we' — literal MT of 是否/如果. Should be 'if we' or 'whether we'",
|
||||
re.sub(r'\bIs we\b', 'if we', en))
|
||||
|
||||
# Example: Chinese punctuation in English text
|
||||
if re.search(r'[,。;:!?、]', en):
|
||||
add(i, cn, en,
|
||||
"Chinese punctuation in English text",
|
||||
"[Replace with English punctuation]")
|
||||
|
||||
# Example: unbalanced HTML tags
|
||||
if en.count('<b>') != en.count('</b>'):
|
||||
add(i, cn, en,
|
||||
f"Unbalanced <b> tags (open={en.count('<b>')}, close={en.count('</b>')})",
|
||||
"[Balance tags]")
|
||||
|
||||
# Example: unbalanced double quotes
|
||||
if en.count('"') % 2 != 0:
|
||||
add(i, cn, en,
|
||||
f"Unbalanced quotes ({en.count(chr(34))} total)",
|
||||
"[Balance quotation marks]")
|
||||
|
||||
# Example: term inconsistency check
|
||||
# if re.search(r'TermA', en) and re.search(r'TermB', en) and ...
|
||||
|
||||
# ── Sanity checks ──
|
||||
for i, (page, cn, en) in enumerate(rows):
|
||||
if cn and not en:
|
||||
print(f"WARNING row {i+2}: CN present but EN empty: {cn[:80]}")
|
||||
cn_chars = re.findall(r'[\u4e00-\u9fff]', en)
|
||||
if cn_chars:
|
||||
print(f"WARNING row {i+2}: Chinese chars in EN: {cn_chars}")
|
||||
if cn and en and cn.strip() == en.strip():
|
||||
print(f"WARNING row {i+2}: CN==EN (untranslated): {cn[:60]}")
|
||||
|
||||
return issues
|
||||
|
||||
if __name__ == '__main__':
|
||||
issues = review_csv(sys.argv[1])
|
||||
print(f"Issues found: {len(issues)}")
|
||||
for iss in issues:
|
||||
print(f"\nCSV_ROW_{iss['row']} [{iss['page']}]")
|
||||
print(f" CN: {iss['cn'][:120]}")
|
||||
print(f" EN: {iss['en'][:120]}")
|
||||
print(f" PROBLEM: {iss['problem']}")
|
||||
print(f" SUGGEST: {iss['suggestion'][:150]}")
|
||||
Reference in New Issue
Block a user