[{"data":1,"prerenderedAt":652},["ShallowReactive",2],{"content-\u002Fplugins\u002Faio-epub-translate\u002Faio-epub-review":3,"children-\u002Fplugins\u002Faio-epub-translate\u002Faio-epub-review":651},{"id":4,"title":5,"author":6,"body":7,"budget_tier":6,"build_tags":6,"created":6,"description":642,"document_type":643,"extension":644,"game":6,"install":36,"investment_tier":6,"league":6,"meta":645,"navigation":646,"patch":6,"path":647,"plugin":24,"profit_per_hour":6,"ratings":6,"seo":648,"skills_count":6,"status":6,"stem":649,"strategy_tier":6,"tags":6,"updated":6,"version":6,"weight":6,"__hash__":650},"content\u002Fplugins\u002Faio-epub-translate\u002Faio-epub-review.md","aio-epub-review",null,{"type":8,"value":9,"toc":621},"minimark",[10,37,42,45,56,61,71,75,80,86,94,97,147,151,157,161,167,171,174,179,192,196,207,211,222,226,237,241,249,253,260,343,347,351,357,384,388,394,413,417,421,427,433,437,443,446,476,480,486,490,498,502,506,512,516,522,526,532,536,598],[11,12,13],"blockquote",{},[14,15,16,17,25,26,25,30,33,34],"p",{},"From plugin ",[18,19,21],"a",{"href":20},"\u002Fplugins\u002Faio-epub-translate",[22,23,24],"strong",{},"aio-epub-translate"," · ",[27,28,29],"code",{},"v4.0.0",[22,31,32],{},"Install:"," ",[27,35,36],{},"\u002Fplugin install aio-epub-translate@aiocean-plugins",[38,39,41],"h1",{"id":40},"epub-review-deep-literary-review","EPUB Review — Deep Literary Review",[14,43,44],{},"Đánh giá chất lượng dịch thuật ở mức văn học — không chỉ check cơ học (empty\u002Fshort) mà phân tích tone, fluency, consistency, style.",[11,46,47],{},[14,48,49,55],{},[22,50,51,52],{},"Khác với ",[27,53,54],{},"aio-epub-quality",": Quality skill check cơ học (empty, mixed language, too short). Review skill đọc và đánh giá CHẤT LƯỢNG VĂN HỌC bằng khả năng ngôn ngữ của Agent.",[57,58,60],"h2",{"id":59},"api-setup","API Setup",[62,63,69],"pre",{"className":64,"code":66,"language":67,"meta":68},[65],"language-python","import json, urllib.request, os\n\nBASE = \"https:\u002F\u002Fread-api.aiocean.dev\u002FListBooks.v1.BookService\"\nKEY = os.environ.get(\"AIO_EPUB_API_KEY\", \"duocnv\")\n\ndef api(method, body):\n    data = json.dumps(body).encode('utf-8')\n    req = urllib.request.Request(f\"{BASE}\u002F{method}\", data=data, headers={\n        \"Content-Type\": \"application\u002Fjson\",\n        \"X-License-Key\": KEY\n    })\n    with urllib.request.urlopen(req) as resp:\n        return json.loads(resp.read())\n","python","",[27,70,66],{"__ignoreMap":68},[57,72,74],{"id":73},"workflow","Workflow",[76,77,79],"h3",{"id":78},"_1-nạp-tiêu-chuẩn-đánh-giá","1. Nạp tiêu chuẩn đánh giá",[14,81,82,85],{},[22,83,84],{},"BƯỚC BẮT BUỘC"," — Đọc rubric trước khi review:",[62,87,92],{"className":88,"code":90,"language":91,"meta":68},[89],"language-bash","REFS=\"${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Faio-epub-vn-style\u002Freferences\"\necho \"$REFS\"\n","bash",[27,93,90],{"__ignoreMap":68},[14,95,96],{},"Đọc các file reference:",[98,99,100,113],"table",{},[101,102,103],"thead",{},[104,105,106,110],"tr",{},[107,108,109],"th",{},"File",[107,111,112],{},"Nội dung",[114,115,116,127,137],"tbody",{},[104,117,118,124],{},[119,120,121],"td",{},[27,122,123],{},"$REFS\u002Fquality-rubric.md",[119,125,126],{},"MQM\u002FATA framework, error classification, scoring",[104,128,129,134],{},[119,130,131],{},[27,132,133],{},"$REFS\u002Fcommon-errors.md",[119,135,136],{},"6 lỗi phổ biến cần phát hiện",[104,138,139,144],{},[119,140,141],{},[27,142,143],{},"$REFS\u002Ftranslation-principles.md",[119,145,146],{},"Tín-Đạt-Nhã criteria",[76,148,150],{"id":149},"_2-lấy-guideline-glossary","2. Lấy guideline + glossary",[62,152,155],{"className":153,"code":154,"language":67,"meta":68},[65],"# Book guideline — tiêu chuẩn đã đặt ra khi analyze\ngl = api(\"GetGuideline\", {\"bookId\": BOOK_ID})\nguideline = gl.get(\"guideline\", \"\")\n\n# Chapter context — glossary + previous chapter\ncontext = api(\"GetChapterContext\", {\n    \"bookId\": BOOK_ID,\n    \"filePath\": FILE_PATH\n})\nglossary = context.get(\"glossary\", [])\n",[27,156,154],{"__ignoreMap":68},[76,158,160],{"id":159},"_3-đọc-bản-gốc-bản-dịch","3. Đọc bản gốc + bản dịch",[62,162,165],{"className":163,"code":164,"language":67,"meta":68},[65],"page = api(\"GetPageJson\", {\n    \"bookId\": BOOK_ID,\n    \"filePath\": FILE_PATH,\n    \"size\": 0, \"offset\": 0\n})\ncontents = page[\"contents\"]\n\n# Hiển thị song song original ↔ translation\nfor item in contents:\n    original = item.get(\"contentText\", \"\")\n    translations = item.get(\"translations\", [])\n    translated = translations[0].get(\"contentText\", \"\") if translations else \"\"\n    content_id = item.get(\"contentId\", \"\")\n\n    if translated:\n        print(f\"[{content_id}]\")\n        print(f\"  EN: {original[:200]}\")\n        print(f\"  VI: {translated[:200]}\")\n        print()\n",[27,166,164],{"__ignoreMap":68},[76,168,170],{"id":169},"_4-agent-đánh-giá-tín-đạt-nhã","4. Agent đánh giá — Tín Đạt Nhã",[14,172,173],{},"Đọc từng cặp original\u002Ftranslation và đánh giá theo 5 tiêu chí:",[175,176,178],"h4",{"id":177},"a-tín-accuracy-35","A. Tín (Accuracy — 35%)",[180,181,182,186,189],"ul",{},[183,184,185],"li",{},"Nghĩa có đúng không? Có bỏ sót thông tin không?",[183,187,188],{},"Có thêm thông tin không có trong bản gốc không?",[183,190,191],{},"Tên riêng, số liệu, dữ kiện có chính xác không?",[175,193,195],{"id":194},"b-đạt-fluency-25","B. Đạt (Fluency — 25%)",[180,197,198,201,204],{},[183,199,200],{},"Đọc có tự nhiên bằng tiếng Việt không?",[183,202,203],{},"Có câu nào \"nghe tiếng Anh\" không? (calque, cấu trúc bị động lạm dụng)",[183,205,206],{},"Cấu trúc Đề-Thuyết có được áp dụng không?",[175,208,210],{"id":209},"c-nhã-style-20","C. Nhã (Style — 20%)",[180,212,213,216,219],{},[183,214,215],{},"Giọng văn có giữ đúng tone tác giả không?",[183,217,218],{},"Có đúng thể loại không? (self-help ≠ academic, fiction ≠ report)",[183,220,221],{},"Nhịp văn có mượt không? Có dùng từ láy, thành ngữ khi phù hợp?",[175,223,225],{"id":224},"d-nhất-quán-consistency-12","D. Nhất quán (Consistency — 12%)",[180,227,228,231,234],{},[183,229,230],{},"Đại từ nhân vật có đúng với guideline không?",[183,232,233],{},"Thuật ngữ có match glossary không?",[183,235,236],{},"Tone có nhất quán trong suốt chapter?",[175,238,240],{"id":239},"e-văn-hóa-cultural-fit-8","E. Văn hóa (Cultural fit — 8%)",[180,242,243,246],{},[183,244,245],{},"Ẩn dụ, idiom có được chuyển ngữ phù hợp không?",[183,247,248],{},"Có reference văn hóa cần localize không?",[76,250,252],{"id":251},"_5-phát-hiện-lỗi-cụ-thể","5. Phát hiện lỗi cụ thể",[14,254,255,256,259],{},"Tìm các pattern lỗi phổ biến (từ ",[27,257,258],{},"common-errors.md","):",[98,261,262,275],{},[101,263,264],{},[104,265,266,269,272],{},[107,267,268],{},"Lỗi",[107,270,271],{},"Ví dụ sai",[107,273,274],{},"Sửa thành",[114,276,277,288,299,310,321,332],{},[104,278,279,282,285],{},[119,280,281],{},"Calque (dịch sát từ)",[119,283,284],{},"\"Cô ấy đã có một thời gian khó khăn\"",[119,286,287],{},"\"Cô ấy đã trải qua quãng thời gian chật vật\"",[104,289,290,293,296],{},[119,291,292],{},"Lạm dụng bị động",[119,294,295],{},"\"Cuốn sách được viết bởi tác giả\"",[119,297,298],{},"\"Tác giả viết cuốn sách này\"",[104,300,301,304,307],{},[119,302,303],{},"Câu cứng cấu trúc Anh",[119,305,306],{},"\"Nó là quan trọng rằng...\"",[119,308,309],{},"\"Điều quan trọng là...\"",[104,311,312,315,318],{},[119,313,314],{},"Đại từ không nhất quán",[119,316,317],{},"\"anh ấy\" → \"hắn\" → \"anh ta\" (cùng nhân vật)",[119,319,320],{},"Chọn 1 và dùng xuyên suốt",[104,322,323,326,329],{},[119,324,325],{},"Từ sáo rỗng dịch thuật",[119,327,328],{},"\"Nói một cách khác\", \"Sự thật là...\"",[119,330,331],{},"Diễn đạt tự nhiên hơn",[104,333,334,337,340],{},[119,335,336],{},"Mất giọng tác giả",[119,338,339],{},"Sách conversational → dịch ra academic",[119,341,342],{},"Giữ đúng tone",[76,344,346],{"id":345},"_6-sửa-lỗi-trực-tiếp","6. Sửa lỗi trực tiếp",[175,348,350],{"id":349},"sửa-từng-bản-dịch-cụ-thể","Sửa từng bản dịch cụ thể:",[62,352,355],{"className":353,"code":354,"language":67,"meta":68},[65],"# Dùng translationId (từ GetPageJson → translations[].translationId)\nresult = api(\"EditTranslation\", {\n    \"bookId\": BOOK_ID,\n    \"filePath\": FILE_PATH,\n    \"translationId\": TRANSLATION_ID,\n    \"content\": \"Bản dịch đã sửa...\"\n})\n",[27,356,354],{"__ignoreMap":68},[11,358,359],{},[14,360,361,364,365,368,369,372,373,376,377,372,380,383],{},[22,362,363],{},"Chú ý",": ",[27,366,367],{},"EditTranslation"," dùng ",[27,370,371],{},"translationId"," + ",[27,374,375],{},"content",", KHÔNG phải ",[27,378,379],{},"contentId",[27,381,382],{},"translatedContent",".",[175,385,387],{"id":386},"sửa-nhiều-bản-dịch-cross-chapter-bulkedittranslation","Sửa nhiều bản dịch cross-chapter (BulkEditTranslation):",[62,389,392],{"className":390,"code":391,"language":67,"meta":68},[65],"result = api(\"BulkEditTranslation\", {\n    \"bookId\": BOOK_ID,\n    \"edits\": [\n        {\"filePath\": \"xhtml\u002Fch01.html\", \"contentId\": \"id-1\", \"translatedContent\": \"Bản dịch sửa 1\"},\n        {\"filePath\": \"xhtml\u002Fch05.html\", \"contentId\": \"id-2\", \"translatedContent\": \"Bản dịch sửa 2\"},\n        {\"filePath\": \"xhtml\u002Fch10.html\", \"contentId\": \"id-3\", \"translatedContent\": \"Bản dịch sửa 3\"}\n    ]\n})\nprint(f\"Updated: {result.get('updatedCount', 0)}, Failed: {result.get('failedCount', 0)}\")\n",[27,393,391],{"__ignoreMap":68},[11,395,396],{},[14,397,398,368,401,372,403,405,406,368,408,372,410,412],{},[27,399,400],{},"BulkEditTranslation",[27,402,379],{},[27,404,382],{}," (khác với ",[27,407,367],{},[27,409,371],{},[27,411,375],{},").",[76,414,416],{"id":415},"_7-cross-chapter-consistency-check","7. Cross-chapter Consistency Check",[175,418,420],{"id":419},"search-toàn-sách-cho-1-thuật-ngữ","Search toàn sách cho 1 thuật ngữ:",[62,422,425],{"className":423,"code":424,"language":67,"meta":68},[65],"# Tìm tất cả chỗ dùng \"self\" trong bản gốc\nresults = api(\"SearchTranslations\", {\n    \"bookId\": BOOK_ID,\n    \"query\": \"self\",\n    \"scope\": \"SEARCH_SCOPE_ORIGINAL\",\n    \"limit\": 50\n})\nprint(f\"Found {results['totalCount']} matches\")\nfor r in results.get(\"results\", []):\n    print(f\"  [{r['filePath']}] {r['contentId']}\")\n    print(f\"    EN: {r['originalText'][:100]}\")\n    print(f\"    VI: {r.get('translatedText', '(chưa dịch)')[:100]}\")\n",[27,426,424],{"__ignoreMap":68},[62,428,431],{"className":429,"code":430,"language":67,"meta":68},[65],"# Tìm thuật ngữ trong bản dịch — check consistency\nresults = api(\"SearchTranslations\", {\n    \"bookId\": BOOK_ID,\n    \"query\": \"bản ngã\",\n    \"scope\": \"SEARCH_SCOPE_TRANSLATION\",\n    \"limit\": 100\n})\n# So sánh: có chỗ nào dịch \"self\" thành \"bản thân\" thay vì \"bản ngã\"?\n",[27,432,430],{"__ignoreMap":68},[175,434,436],{"id":435},"batch-load-nhiều-chapters-để-review","Batch load nhiều chapters để review:",[62,438,441],{"className":439,"code":440,"language":67,"meta":68},[65],"# Dùng BatchGetPageJson — 1 call thay vì N calls\nbatch = api(\"BatchGetPageJson\", {\n    \"bookId\": BOOK_ID,\n    \"filePaths\": [\"xhtml\u002Fch01.html\", \"xhtml\u002Fch05.html\", \"xhtml\u002Fch10.html\"],\n    \"filter\": \"CONTENT_FILTER_TRANSLATED\"  # Chỉ lấy items đã dịch\n})\nfor ch in batch.get(\"chapters\", []):\n    print(f\"\\n=== {ch['filePath']} ({ch['totalItems']} items) ===\")\n    for item in ch[\"contents\"][:3]:\n        orig = item.get(\"contentText\", \"\")[:80]\n        trans = item[\"translations\"][0][\"contentText\"][:80] if item.get(\"translations\") else \"\"\n        print(f\"  EN: {orig}\")\n        print(f\"  VI: {trans}\")\n",[27,442,440],{"__ignoreMap":68},[14,444,445],{},"Agent kiểm tra across chapters:",[180,447,448,454,464,470],{},[183,449,450,453],{},[22,451,452],{},"Tên nhân vật",": cùng character có bị dịch khác nhau giữa các chapters?",[183,455,456,459,460,463],{},[22,457,458],{},"Thuật ngữ",": dùng ",[27,461,462],{},"SearchTranslations"," tìm term trong bản dịch — có nhất quán không?",[183,465,466,469],{},[22,467,468],{},"Tone shift",": chapter này formal, chapter kia informal bất ngờ?",[183,471,472,475],{},[22,473,474],{},"Đại từ drift",": \"anh\" ở chapter 1, \"anh ấy\" ở chapter 5, \"hắn\" ở chapter 10?",[175,477,479],{"id":478},"workflow-fix-consistency","Workflow fix consistency:",[62,481,484],{"className":482,"code":483,"language":67,"meta":68},[65],"# 1. Search tìm chỗ dịch sai\nresults = api(\"SearchTranslations\", {\n    \"bookId\": BOOK_ID,\n    \"query\": \"anh ấy\",  # thuật ngữ muốn thay\n    \"scope\": \"SEARCH_SCOPE_TRANSLATION\",\n    \"limit\": 100\n})\n\n# 2. Bulk edit tất cả\nedits = []\nfor r in results.get(\"results\", []):\n    new_text = r[\"translatedText\"].replace(\"anh ấy\", \"hắn\")\n    edits.append({\n        \"filePath\": r[\"filePath\"],\n        \"contentId\": r[\"contentId\"],\n        \"translatedContent\": new_text\n    })\n\nresult = api(\"BulkEditTranslation\", {\n    \"bookId\": BOOK_ID,\n    \"edits\": edits\n})\nprint(f\"Fixed {result.get('updatedCount', 0)} translations across chapters\")\n",[27,485,483],{"__ignoreMap":68},[76,487,489],{"id":488},"_8-output-quality-report","8. Output — Quality Report",[62,491,496],{"className":492,"code":494,"language":495},[493],"language-text","📊 Translation Review: Chapter 5 — \"The Power of Small Wins\"\n\nScore: 82\u002F100 (Good)\n  Tín (Accuracy):    90\u002F100 — 2 chỗ bỏ sót ý phụ\n  Đạt (Fluency):     78\u002F100 — 5 câu còn cứng theo cấu trúc Anh\n  Nhã (Style):       85\u002F100 — Tone đúng, nhưng thiếu từ láy\n  Nhất quán:         75\u002F100 — \"habit\" dịch 2 cách: \"thói quen\" & \"tập quán\"\n  Văn hóa:           88\u002F100 — OK\n\nIssues Found: 8\n  [FIXED] id-042: Calque \"có một thời gian khó khăn\" → \"trải qua quãng chật vật\"\n  [FIXED] id-067: Bị động \"được thực hiện bởi\" → \"do... thực hiện\"\n  [FIXED] id-089: Thuật ngữ \"tập quán\" → \"thói quen\" (match glossary)\n  [FLAG]  id-103: Câu dài 4 dòng, cần tách — cần human review\n  [FIXED] id-115: Đại từ \"anh ta\" → \"anh\" (match guideline)\n  ...\n\nFixes Applied: 5\u002F8\nNeeds Human Review: 3\n","text",[27,497,494],{"__ignoreMap":68},[57,499,501],{"id":500},"review-modes","Review Modes",[76,503,505],{"id":504},"single-chapter-review","Single Chapter Review",[62,507,510],{"className":508,"code":509,"language":495},[493],"Agent: review chapter 5 of book X\n→ Chạy steps 1-6 cho 1 chapter\n",[27,511,509],{"__ignoreMap":68},[76,513,515],{"id":514},"multi-chapter-consistency","Multi-chapter Consistency",[62,517,520],{"className":518,"code":519,"language":495},[493],"Agent: review chapters 1-10 for consistency\n→ Chạy steps 1-7, focus on cross-chapter issues\n",[27,521,519],{"__ignoreMap":68},[76,523,525],{"id":524},"full-book-review","Full Book Review",[62,527,530],{"className":528,"code":529,"language":495},[493],"Agent: review entire book X\n→ Sample every chapter, focus on consistency + overall quality\n→ Produce book-level report\n",[27,531,529],{"__ignoreMap":68},[57,533,535],{"id":534},"điều-hướng","Điều hướng",[98,537,538,548],{},[101,539,540],{},[104,541,542,545],{},[107,543,544],{},"Bạn muốn...",[107,546,547],{},"Dùng skill",[114,549,550,559,568,578,588],{},[104,551,552,555],{},[119,553,554],{},"Check cơ học trước (empty, mixed lang)",[119,556,557],{},[27,558,54],{},[104,560,561,564],{},[119,562,563],{},"Dịch lại chapter kém chất lượng",[119,565,566],{},[27,567,24],{},[104,569,570,573],{},[119,571,572],{},"Xem\u002Fupdate guideline",[119,574,575],{},[27,576,577],{},"aio-epub-manage",[104,579,580,583],{},[119,581,582],{},"Phân tích sách trước khi dịch",[119,584,585],{},[27,586,587],{},"aio-epub-analyze",[104,589,590,593],{},[119,591,592],{},"Xuất sách khi review xong",[119,594,595],{},[27,596,597],{},"aio-epub-export",[14,599,600,364,602,605,606,605,609,605,611,605,613,605,615,605,619],{},[22,601,74],{},[27,603,604],{},"aio-epub-setup"," → ",[27,607,608],{},"aio-epub-upload",[27,610,587],{},[27,612,24],{},[27,614,54],{},[22,616,617],{},[27,618,5],{},[27,620,597],{},{"title":68,"searchDepth":622,"depth":622,"links":623},2,[624,625,636,641],{"id":59,"depth":622,"text":60},{"id":73,"depth":622,"text":74,"children":626},[627,629,630,631,632,633,634,635],{"id":78,"depth":628,"text":79},3,{"id":149,"depth":628,"text":150},{"id":159,"depth":628,"text":160},{"id":169,"depth":628,"text":170},{"id":251,"depth":628,"text":252},{"id":345,"depth":628,"text":346},{"id":415,"depth":628,"text":416},{"id":488,"depth":628,"text":489},{"id":500,"depth":622,"text":501,"children":637},[638,639,640],{"id":504,"depth":628,"text":505},{"id":514,"depth":628,"text":515},{"id":524,"depth":628,"text":525},{"id":534,"depth":622,"text":535},"Deep literary review of translated EPUB chapters — evaluate translation quality, fix consistency issues, and check cross-chapter coherence.","skill","md",{},true,"\u002Fplugins\u002Faio-epub-translate\u002Faio-epub-review",{"title":5,"description":642},"plugins\u002Faio-epub-translate\u002Faio-epub-review","zFvj1-vrhT-b-ae0QzCQoG3FpeA9G7pXxSMR7zChODA",[],1779707416403]