अनुवाद
blume translate आपके लोकेल्स को एक AI एजेंट की मदद से भरता है — यह पता लगाता है कि हर भाषा में कौन-से पेज गायब या पुराने हैं, उन्हें उसी एजेंट CLI से अनुवाद करता है जो आपके पास पहले से है, और CI को एक ऐसा गेट देता है जो अनुवाद के पिछड़ जाने पर फेल हो जाता है।
एक बार i18n चालू हो जाने पर, किसी स्रोत पेज में किया गया हर संपादन चुपचाप उसके अनुवादों को पुराना कर देता है। blume translate इस चक्र को पूरा करता है: यह ठीक-ठीक गणना करता है कि हर लोकेल में कौन-से पेज गायब या बासी हैं, उन्हें एक स्थानीय एजेंट CLI के ज़रिए हेडलेस तरीके से अनुवाद करता है, और जो किया उसे एक कमिट किए गए लेजर में दर्ज करता है ताकि अगला रन — और CI — जान सके कि क्या मौजूदा है।
blume translate --claude
blume translate 3 item(s) · 2 locale(s) · Claude Code
✔ docs/guides/install.mdx → fr 24.2s $0.11
✔ docs/guides/install.mdx → de 22.8s $0.10
✔ meta titles (2) → de 4.1s $0.01
Translated 3 files into 2 locales · 1 adopted · 14 already up to date · 51.1s · $0.22
यह कैसे काम करता है
पाइपलाइन Blume के अधीन है; एजेंट सिर्फ़ टेक्स्ट का अनुवाद करता है। जिस भी फ़ाइल पर काम ज़रूरी है, उसके लिए Blume एक अनुवाद प्रॉम्प्ट बनाता है, एजेंट CLI को उसके फ़ाइल, शेल और वेब टूल्स बंद करके हेडलेस चलाता है, उत्तर की संरचना को मान्य करता है, और लक्ष्य फ़ाइल खुद लिखता है — --claude के साथ Claude Code, या --codex के साथ Codex। Blume के पास कोई API कुंजी नहीं होती और वह खुद किसी मॉडल को कॉल नहीं करता।
हर मान्य लेखन प्रोजेक्ट रूट में blume.translations.json में दर्ज होता है: हर स्रोत फ़ाइल और लोकेल के लिए, अनुवाद के समय स्रोत का एक हैश। इस फ़ाइल को कमिट करें। इसी से दोबारा चलाने पर “पहले से अनुवादित” और “अनुवादित, लेकिन उसके बाद स्रोत बदल गया” के बीच का अंतर पता चलता है — और यही CI गेट को संभव बनाता है।
लेजर हर पूरी हुई फ़ाइल के बाद फ़्लश किया जाता है, इसलिए किसी लंबे रन को रोकने (Ctrl+C) पर ज़्यादा से ज़्यादा वही अनुवाद खोते हैं जो चल रहे थे — अगला रन वहीं से उठा लेता है जहाँ आपने छोड़ा था। डिफ़ॉल्ट रूप से एक साथ 4 फ़ाइलें चलती हैं; अगर आपकी मशीन और एजेंट की रेट लिमिट अनुमति दें तो --concurrency से इसे बढ़ाएँ।
दोबारा चलाना इंक्रीमेंटल होता है: जो स्रोत अपने पिछले अनुवाद के बाद से नहीं बदला, उसे छोड़ दिया जाता है, इसलिए एक पेज संपादित करने के बाद blume translate चलाने पर हर लोकेल के लिए एक ही पेज का अनुवाद होता है। जब किसी बासी पेज का दोबारा अनुवाद होता है, तो एजेंट को मौजूदा अनुवाद दिखाया जाता है और उसके रजिस्टर, बोली और शब्दावली से मेल खाने को कहा जाता है — स्रोत में एक अनुच्छेद का संपादन अनुवाद में एक अनुच्छेद का ही अंतर पैदा करता है, शुरुआत से पुनर्लेखन नहीं।
पहले अनुवाद के पास मेल खाने के लिए कोई पूर्व उदाहरण नहीं होता, इसलिए यह चुनाव पहले ही लोकेल पर style से तय कर दें ({ code: "pt", label: "Português", style: "Brazilian Portuguese, informal você" })। यह मार्गदर्शन हर अनुवाद प्रॉम्प्ट के साथ जाता है, और जहाँ कोई मौजूदा अनुवाद इससे असहमत हो, वहाँ style की ही चलती है — इसलिए दोबारा अनुवाद पुराने पेजों को भी कॉन्फ़िगर की गई शैली की ओर ले जाता है।
क्या अनुवादित होता है
- पेज — डिफ़ॉल्ट लोकेल की
.md/.mdxफ़ाइलें। एजेंट गद्य और केवल मनुष्य को दिखने वाले फ्रंटमैटर मानों (title,description,sidebar.label,sidebar.badge,seo.title,seo.description) का अनुवाद करता है। लक्ष्य आपके पार्सर के अनुसार होते हैं:dirके तहतfr/guides/install.mdx,dotके तहतguides/install.fr.mdx। - फ़ोल्डर नेविगेशन शीर्षक —
dirपार्सर के तहत, हर लोकेल के लिए आवश्यकmeta.tsशीर्षक एक ही बैच कॉल में अनुवादित होते हैं, और उत्पन्न प्रति-लोकेलmeta.tsबाकी हर कुंजी (order,pages,icon,collapsed) को हूबहू कॉपी करता है ताकि उस लोकेल का साइडबार अपना क्रम बनाए रखे।
आपके हाथ से लिखे अनुवाद अपनाए जाते हैं, कभी अधिलेखित नहीं होते: जो अनुवाद मौजूद है पर जिसकी कोई लेजर प्रविष्टि नहीं है, उसे मौजूदा के रूप में चिह्नित कर छोड़ दिया जाता है। केवल --force उसका दोबारा अनुवाद करता है।
मान्यता जाँच
संरचना के लिए एजेंट पर कभी भरोसा नहीं किया जाता। लिखने से पहले, Blume हर उत्तर की जाँच करता है और फ़ाइल को स्रोत से फिर से बनाता है:
- फ्रंटमैटर स्रोत फ़ाइल के डेटा से पुनर्निर्मित होता है, जिसमें केवल छह अनुवाद-योग्य मान ऊपर से लगाए जाते हैं — एजेंट द्वारा गढ़ी गई कुंजियाँ हटा दी जाती हैं, हटाई गई कुंजियाँ बहाल कर दी जाती हैं, और
slug,icon,orderतथा तिथियाँ रचना के स्तर पर ही स्रोत के अनुरूप हूबहू रहती हैं। - कोड फ़ेंस की संख्या स्रोत से मेल खानी चाहिए, बॉडी खाली नहीं होनी चाहिए, और फ्रंटमैटर पार्स होना चाहिए।
जो उत्तर मान्यता जाँच में विफल होता है वह कुछ नहीं लिखता — उस आइटम को विफल बताया जाता है और रन आगे बढ़ जाता है। जो कुछ भी सफल हुआ वह लेजर में चिह्नित रहता है, इसलिए दोबारा चलाने पर केवल विफलताओं का ही पुनः प्रयास होता है।
CI को फेल कराना
blume translate --check केवल-पढ़ने वाला गेट है: यह हर गायब और बासी जोड़ी की रिपोर्ट देता है और अंतर होने पर नॉन-ज़ीरो के साथ बाहर निकलता है, बिना कोई एजेंट चलाए या कुछ लिखे।
blume translate --check # exit 1 when translations are missing or stale
blume translate --check --json # machine-readable drift report on stdout
- run: npx blume translate --check
JSON रिपोर्ट में वही diagnostics + summary आकार होता है जो blume validate --json, blume audit --json, और blume eval --json में है, जिसमें अंतर प्रति लोकेल समूहीकृत होता है। हाथ से लिखे (अनट्रैक किए गए) अनुवाद गेट को कभी विफल नहीं करते।
सीमाएँ
- मेटा शीर्षक अनुवाद केवल
dirपार्सर के लिए है —dotपार्सर में प्रति-लोकेलmeta.tsकी कोई व्यवस्था नहीं है। जोmeta.tsडिफ़ॉल्ट रूप से किसी फ़ंक्शन को एक्सपोर्ट करता है उसे चेतावनी के साथ छोड़ दिया जाता है; उस लोकेल की प्रति हाथ से लिखें। - रिमोट और CMS-आधारित स्रोत छोड़ दिए जाते हैं: अनुवाद लिखने के लिए कोई स्थानीय फ़ाइल ही नहीं होती।
- हेडर टैब लेबल कंटेंट में नहीं,
blume.config.tsमें रहते हैं — उन्हें वहीं प्रति-लोकेल लेबल मैप से स्थानीयकृत करें। - अनुवाद की गुणवत्ता एजेंट की है। आउटपुट की समीक्षा किसी भी अन्य योगदान की तरह करें — लेजर केवल ताज़गी की गारंटी देता है, प्रवाह की नहीं।
फ़्लैग
--claude/--codex— कौन-सा एजेंट CLI अनुवाद करता है। ठीक एक ज़रूरी है (--checkके साथ छोड़कर)।--check— अंतर की रिपोर्ट दें और नॉन-ज़ीरो के साथ बाहर निकलें, बिना कुछ लिखे।--concurrency <n>— समानांतर एजेंट सत्र। डिफ़ॉल्ट4, अधिकतम16।--locale <codes>— कॉमा से अलग किए गए लक्ष्य लोकेल (डिफ़ॉल्ट रूप से हर गैर-डिफ़ॉल्ट लोकेल)।--force— सब कुछ दोबारा अनुवाद करें, अद्यतन और हाथ से लिखी फ़ाइलों सहित।--timeout <seconds>— प्रति फ़ाइल एजेंट समय सीमा। डिफ़ॉल्ट600; यह सीमा अटके हुए एजेंट पकड़ने के लिए है, इसलिए बड़े पेजों को पूरा होने की गुंजाइश मिलती है।--json— दोनों मोड में रिपोर्ट को stdout पर JSON के रूप में दें।