ترجمهٔ یک وبسایت به ده، بیست یا چهل زبان با یک هوش مصنوعی واحد سریع انجام میشود. دشوارتر این پرسش است که آیا میتوان به نتیجه اعتماد کرد. یک مدل زبانی منفرد گاهی واژه میسازد، نام محصولات را ترجمه میکند یا یک عدد را تغییر میدهد و خودش متوجه نمیشود. به همین دلیل برای Odoo 19 ماژولی نوشتهایم که در آن چند هوش مصنوعی و سرویس ترجمه روی یک متن کار میکنند، نتایج یکدیگر را بهصورت ناشناس ارزیابی میکنند و بر سر عبارتبندیای توافق میکنند که هم دقیق باشد و هم طبیعی به نظر برسد. آنچه یکتا نیست، برای تصمیمگیری به یک انسان سپرده میشود.
نام ماژول ai_translation_consensus است و بهصورت نرمافزار آزاد تحت مجوز AGPL-3 در GitHub در دسترس است:
github.com/Alex0176/odoo-ai-translation-consensus
ایده: بازبینی متقابل بهجای اعتماد
ماژول دو کار میتواند انجام دهد:
- ترجمه: تکمیل ترجمههای جاافتاده (یا منسوخ) هر فیلد قابلترجمه در Odoo، یعنی مقالههای وبلاگ، صفحات وب، منوها، محصولات و هر چیز دیگری که Odoo بهصورت چندزبانه ذخیره میکند. هوشهای مصنوعی در این کار فقط جملهٔ منفرد را نمیبینند، بلکه بلوکهای همسایه و بخشی از کل صفحه را نیز میبینند. به این ترتیب واژههای منفرد در بافت درست فهمیده میشوند.
- ویرایش و غلطگیری: بررسی متن به زبان خودش و پیشنهاد عبارتبندیها یا اصلاحات بهتر. متن اصلی همیشه یکی از نامزدهاست. اگر متن اصلی برنده شود، چیزی تغییر نمیکند.
هستهٔ کار بررسی متقابل است. هر هوش مصنوعی در قضاوت دربارهٔ متنهای دیگران خوب است، حتی اگر خودش گاهی خطا کند. ماژول از همین استفاده میکند: چند ارائهدهنده هر کدام یک نسخه مینویسند و همان ارائهدهندگان سپس همهٔ نسخهها را ارزیابی میکنند، بیآنکه بدانند از چه کسی هستند. ارائهدهنده نسخهٔ خودش را ارزیابی نمیکند.
یک پیشنهاد چگونه شکل میگیرد
- ترجمه. هر مترجم بهطور موازی یک نسخه مینویسد.
- بررسیهای ثابت. بدون هوش مصنوعی کنترل میشود که آیا تگهای HTML، موجودیتها، جانشینهایی مانند
%sیا{}، اعداد و پیوندها بدون تغییر ماندهاند یا نه. نسخهای که این را نقض کند هرگز نمیتواند برنده شود، هرچقدر هم روان به نظر برسد. - ارزیابی. نسخههای دیگر درهمآمیخته و ناشناس میشوند. هر ارزیاب برای هر کدام یک نمره برای دقت و یکی برای طبیعیبودن میدهد (1 تا 10)، یک مورد محبوب را نام میبرد و میتواند یک بهبود پیشنهاد کند.
- توافق. رتبهٔ یک نسخه برابر است با 0,5 × میانگین نمره + 5 × سهم آرای محبوب. توافق زمانی حاصل است که بهترین نسخه دستکم 60 % آرای محبوب و میانگین نمرهای دستکم 7,0 داشته باشد.
- دور دوم. بدون توافق، بهترین نسخهها همراه با پیشنهادهای بهبود ارزیابها یک بار دیگر وارد ارزیابی میشوند.
- انسان. اگر آنگاه هم یکتا نشود، پیشنهاد منتظر تصمیم میماند.
اگر فقط سرویسهای ترجمهٔ محض بدون قابلیت بررسی وجود داشته باشند (مثلاً DeepL)، یک نتیجه فقط زمانی توافقشده تلقی میشود که دستکم دو سرویس دقیقاً همان متن را تحویل داده باشند. در ویرایش و غلطگیری نتایج باید بهطور قابلتشخیص شبیه متن اصلی بمانند (شباهت دستکم 0,6، اعداد یکسان). مدلهای کوچک رایگان گاهی یک دسته را با متنهای جابهجاشده یا بیگانه پاسخ میدهند. چنین پاسخهایی بهجای رأیگیری رد میشوند. یک واژهنامه نامهای برند و اصطلاحات ثابت را نگه میدارد.
ارائهدهندگان: با کلید و بدون کلید
سرویسهای رایگان و پولی میتوانند در همان رأیگیری باشند. ماژول تنظیمات پیشفرضی برای بسیاری از ارائهدهندگان همراه دارد؛ همهٔ آنها پس از نصب خاموش هستند.
| نوع | ترجمه میکند | بررسی / اصلاح میکند | نمونهها |
|---|---|---|---|
| رابط سازگار با OpenAI | بله | بله | OpenAI, Mistral, DeepSeek, xAI, Groq, Together, OpenRouter, Cerebras, Qwen, Moonshot, GitHub Models, Hugging Face, Ollama, LM Studio, vLLM, llama.cpp |
| سازگار با OpenAI بدون کلید | بله | بله | Ollama روی سرور خودتان، Pollinations |
| Anthropic | بله | بله | Claude |
| Google Gemini, Cohere | بله | بله | |
| فرمان محلی | بله | بله | claude -p یا هر برنامهای که از stdin میخواند و پاسخ را خروجی میدهد |
| سرویسهای ترجمه | بله | خیر | DeepL, Google Translate, Azure Translator, LibreTranslate, MyMemory, Lingva |
کلید را وارد میکنید (یا نام یک متغیر محیطی که آن را دارد)، آزمون اتصال را میزنید و ارائهدهنده را روشن میکنید. نام مدلها در تنظیمات پیشفرض نقطهٔ شروع هستند؛ هر کس از آنها استفاده میکند باید آنها را با فهرست جاری ارائهدهنده مطابقت دهد. با دو یا چند ارائهدهنده یک بازبینی متقابل واقعی وجود دارد، با فقط یکی هیچکس کار او را بررسی نمیکند. دستیار به این موضوع اشاره میکند.
یک وبسایت کامل یکجا
یک دستیار شروع (منوی ترجمهٔ هوش مصنوعی ← از اینجا شروع کنید) گامها را توضیح میدهد و نخستین قاعده را ایجاد میکند. اگر ماژول website نصب باشد، ماژول پل ai_translation_consensus_website بهطور خودکار همراه میآید. این ماژول دامنهٔ «یک وبسایت کامل با همهٔ آنچه روی آن است» را میافزاید: وبسایت را انتخاب میکنید و محتواها را به شما پیشنهاد میدهد. ماژول همهٔ مدلهای دارای فیلد قابلترجمه را که به وبسایت تعلق دارند بررسی میکند (صفحات، منوها، وبلاگها، محصولات، رویدادها، انجمنها، دورهها و بیشتر) و برای هر نوع محتوا یک قاعده پیشنهاد میدهد، با زبانهای وبسایت بهعنوان مقصد.
- آنچه نصب نیست (انجمنها، دورهها، گالریها) نمایش داده نمیشود و بعداً، بهمحض نصب، اضافه میشود.
- مدلهای فروشگاه فقط زمانی پیشنهاد میشوند که وبسایت فروشگاه داشته باشد. فقط رکوردهای منتشرشده گرفته میشوند.
- مخاطبان، شرکتها، ارائهدهندگان پرداخت، فهرستهای قیمت، روشهای تحویل، برنامههای وفاداری و فیلترهای Snippet را ماژول عمداً ارائه نمیدهد.
- نامهای نشانی صفحات (
seo_name) ترجمه نمیشوند. - انواع ناخواسته را میتوان پیش از ایجاد حذف کرد.
ایجاد و جستوجو هزینهای ندارد: قاعده فقط فهرست میکند کدام متنها کار لازم دارند. فقط هنگام پردازش ارائهدهندگان فراخوانده میشوند و هزینه ایجاد میشود.
داشبورد، هزینهها و شروع خودکار
داشبورد برای هر قاعده نشان میدهد چند متن آمادهاند، منتظر تأیید یا یک انساناند، در صفاند یا ناموفق شدهاند. افزون بر این تفکیک بر اساس زبان و ارائهدهنده، هزینههای تاکنونی و هزینههای پیشرو، زمان باقیماندهٔ برآوردشده و کلید پردازش زمانبندیشده نمایش داده میشود.
اعداد در این تصویر دادهٔ نمونهاند و چیزی دربارهٔ هزینههای واقعی نمیگویند.
- هزینهها از آنچه ارائهدهندگان واقعاً گزارش میکنند محاسبه میشوند: توکنها (OpenAI, Anthropic, Gemini, Cohere) یا نویسهها (DeepL, Google, Azure). توکنها همیشه نشان داده میشوند، پول فقط زمانی که قیمت هر میلیون توکن (یا نویسه) را نزد ارائهدهنده وارد کرده باشید. تنظیمات پیشفرض قیمتی ندارند، چون قیمتها تغییر میکنند. سرویسهایی که توکن گزارش نمیکنند از طول متن برآورد میشوند و بهعنوان برآورد علامت میخورند.
- پیشبینی: میانگین هزینه و زمان کار برای هر متن ضرب در تعداد متنهای صفشده. این یک برآورد است که با نخستین دستهها بهتر میشود.
- شروع خودکار: قاعدههایی با گزینهٔ خودکار آغاز شود وقتی یک رکورد تغییر میکند در هر اجرای اقدام زمانبندیشده فقط رکوردهایی را جستوجو میکنند که از آخرین جستوجو تغییر کردهاند. با اقدام زمانبندیشدهٔ روشن، یک وبسایت ویرایششده بدون هیچ دخالتی دوباره ترجمه میشود.
- اعلام پایان: وقتی آخرین متن باز یک قاعده انجام شد، پیام «همه زبانها ترجمه شد» (در بازبینی: «همه متنها بررسی شد») یکبار در کانال AI Translation نمایش داده میشود.
تأیید توسط انسان
بهطور پیشفرض این ماژول بدون موافقت شما چیزی در رکوردهای شما نمینویسد. هر پیشنهاد، نسخهها، نویسندگان آنها، نمرهها و یادداشتهای بازبینان را نشان میدهد. میتوانید پیشنهاد را بپذیرید، نسخهای دیگر را انتخاب کنید، عبارت خودتان را تایپ کنید یا پیشنهاد را رد کنید.
متن و نام ارائهدهندگان در این تصویر برای نمایش محیط کاربری کاملاً ساختگی هستند.
هر کس به یک قاعده اعتماد دارد میتواند گزینهٔ پذیرش خودکار توافق را روشن کند. پیشنهادهای بدون توافق در این حالت هم منتظر یک انسان میمانند. هنگام پذیرش، ماژول یک بار دیگر بررسی میکند که متن مبدأ در این فاصله تغییر نکرده باشد، بررسیهای نشانهگذاری را دوباره انجام میدهد و بدون ردیابی و بدون اطلاعرسانی به دنبالکنندگان مینویسد.
امنیت و حفاظت از دادهها
- پس از نصب همهچیز خاموش است. ارائهدهندگان و اقدام زمانبندیشده غیرفعال هستند. بدون اقدام شما چیزی ارسال نمیشود.
- متنها از سرور شما خارج میشوند، بهمحض اینکه یک سرویس میزبانیشده درگیر باشد. یک قاعده را میتوان بهعنوان محرمانه علامت زد؛ در این صورت فقط ارائهدهندگانی متن را میبینند که بهعنوان اجراشونده روی زیرساخت خودتان مشخص شدهاند.
- کلیدها در فیلدی ذخیره میشوند که فقط مدیران میبینند، یا در یک متغیر محیطی که فقط نام آن ارجاع داده میشود. در پیامهای خطا پنهان میشوند و در هدرها ارسال میشوند. استثنا: کلید اختیاری MyMemory را در آنجا فقط میتوان بهصورت پارامتر پرسوجو ارسال کرد.
- فرمان محلی یک برنامه را اجرا میکند و به همین دلیل تا زمانی که پارامتر سیستمی
ai_translation_consensus.allow_commandرویTrueتنظیم نشود، مسدود است. فرمان بدون شل فراخوانی میشود و در یک پوشهٔ موقت خالی اجرا میشود. - تزریق پرامپت: دستورهای کار، متن را بهعنوان داده علامتگذاری میکنند. دستورالعملهای موجود در متنِ در حال ترجمه اجرا نمیشوند و نتیجهای که تگها یا جانشینها را نقض کند، کنار گذاشته میشود.
- سرویسهای رایگان محدودیت دارند. Pollinations بهصورت ناشناس فقط یک پاسخ در هر ۴۵ ثانیه مجاز میکند. گزینهٔ ارائهدهندهٔ
min_intervalاین فاصله را رعایت میکند و پاسخهای «لطفاً بعداً دوباره تلاش کنید» در نظر گرفته میشوند.
نصب
git clone https://github.com/Alex0176/odoo-ai-translation-consensus.git
ln -s /pfad/odoo-ai-translation-consensus/ai_translation_consensus /pfad/addons/
ln -s /pfad/odoo-ai-translation-consensus/ai_translation_consensus_website /pfad/addons/
odoo-bin -c odoo.conf -d <datenbank> -i ai_translation_consensus --stop-after-init
پیشنیازها Odoo 19 و بستهٔ پایتون requests هستند. یک ترجمهٔ آلمانی همراه ماژول است. ماژول پل ai_translation_consensus_website در صورت وجود website بهطور خودکار نصب میشود. پس از نصب باید سرویس Odoo دوباره راهاندازی شود، چون ماژول شامل کد پایتون است. هر کس سیستم عملیاتی دارد، ماژول را ابتدا روی یک نسخهٔ کپی از پایگاه داده نصب کند.
نخستین گامها: منوی KI-Übersetzung → Anbieter را باز کنید، سرویسها را آزمایش و روشن کنید، سپس Hier starten را بزنید و اولین قاعده را بسازید. با Nach Texten suchen پیشنهادها تولید میشوند و با Einen Stapel verarbeiten ارائهدهندگان فراخوانی میشوند. با یک قاعدهٔ کوچک شروع کنید، مثلاً یک نوشتهٔ وبلاگ و دو زبان، و پیش از آنکه یک وبسایت کامل را در صف بگذارید، نتیجه و هزینه را بررسی کنید.
محدودیتها
- کیفیت به مدلهایی بستگی دارد که روشن میکنید. بازبینی متقابل خطای مدلهای منفرد را کاهش میدهد، اما تضمینی نمیدهد. برای متنهای حقوقی یا حساس از نظر ایمنی، این ماژول جایگزین یک گویشور بومی نیست.
- هزینهها سریع رشد میکنند. هر متن به ازای هر مترجم یک فراخوانی، به ازای هر بازبین یک فراخوانی بررسی و در رأیگیریِ تقسیمشده یک دور دوم هزینه دارد. زمینهٔ صفحه ورودیِ هر فراخوانی را بزرگتر میکند. یک قاعده با ۴۵ زبان مقصد تعداد متنها را چند برابر میکند. اجراها را با Datensätze je Suchlauf، Neue Vorschläge je Suchlauf و Vorschläge je Cron-Lauf محدود کنید و مدلهای ارزان یا محلی را بهعنوان بازبین اضافه کنید.
- فقط فیلدهای دارای
translate=True. متن قالببندیشده بلوک به بلوک پردازش میشود (سازوکار term در Odoo). - قیمتها و نام مدلها تغییر میکنند. مقادیر پیشفرض فهرست قیمتِ بهروزشده نیستند.
- برای Odoo 19.0 Community ساخته شده است. نسخههای دیگر پشتیبانی نمیشوند.
پرسشهای متداول
آیا چیزی بدون موافقت من ترجمه یا بازنویسی میشود؟
خیر، تا زمانی که Einigung automatisch übernehmen را روشن نکنید. حتی در آن صورت هم فقط پیشنهادهای دارای توافق نوشته میشوند. ارائهدهندگان و اقدام زمانبندیشده پس از نصب خاموش هستند.
آیا برای ارائهدهندگان پولی به کلید نیاز دارم؟
فقط برای ارائهدهندگانی که کلید میخواهند. با Pollinations، MyMemory یا یک مدل محلی (برای مثال Ollama) بدون کلید هم میشود. سرویسهای رایگان اغلب محدود و کند هستند و برای یک وبسایت کامل معمولاً فقط بهعنوان مکمل مناسباند.
ترجمه چقدر هزینه دارد؟
این به ارائهدهنده، مدل، طول متن و تعداد زبانها بستگی دارد؛ به همین دلیل ماژول عدد ثابتی تعیین نمیکند. داشبورد مصرف و هزینه را نشان میدهد، بهشرط آنکه قیمتها را وارد کرده باشید، و هزینهٔ باقیماندهٔ متنهای در صف را برآورد میکند.
آیا میتوانم متنها را محرمانه نگه دارم؟
بله، با گزینهٔ قاعدهٔ Vertraulich. در این صورت فقط ارائهدهندگانی کار میکنند که بهعنوان اجراشونده روی زیرساخت خودتان علامتگذاری شدهاند، مثلاً یک Ollama محلی.
آیا این جایگزین ترجمهٔ داخلی خود Odoo میشود؟
خیر. ماژول از چندزبانگی Odoo استفاده میکند و در همان ترجمههایی مینویسد که در غیر این صورت دستی نگهداری میکنید.
تحت چه مجوزی است؟
تحت AGPL-3. خطاها و بهبودها را بهصورت Issue در مخزن GitHub با خوشحالی میپذیریم.
پشتیبانی از سوی Biricon IT Services
ما نصبهای Odoo را برای شرکتهای کوچک و متوسط پشتیبانی میکنیم: از راهاندازی و سفارشیسازی و مهاجرت تا بهرهبرداری جاری. اگر وبسایت Odoo خود را چندزبانه اداره میکنید، میخواهید ترجمهها را با هوش مصنوعی اطمینانبخش کنید یا ماژولی را با امنیت به نمونهٔ عملیاتی خود بیاورید، با کمال میل کمک میکنیم. دیگر توسعههای اختصاصی ما: بایگانی شرکت همراه با کاربران پورتال, شمارهٔ اسناد از پیشوند، سال و شمارنده و ثبت شرکتها و بررسی نشانی برای مشتریان اتریشی.
تاریخ: ۳ نوامبر ۲۰۲۶. نسخهٔ ماژول 19.0.1.0.0. تصاویر دادههای نمونهٔ ساختگی را نشان میدهند.