# Telegram Persian Enforcer

> الزام تولید خروجی متنی به فارسی روان، درست‌نویسی‌شده و کاملاً بومی برای همه تعاملات تلگرامی (پاسخ‌های چت در گروه‌ها، کانال‌ها و پیام‌های مستقیم، خروجی‌های خودکار، گزارش‌ها، خلاصه‌ها، پیام‌های خطا و نتایج اجرای وظایف). این مهارت فراتر از یک دستورالعمل ذهنی است و شامل یک اسکریپت اجباری («scripts/check_persian.py») می‌شود که هر پیش‌نویس را قبل از ارسال به‌صورت خودکار برای کلمات و ارقام لاتینِ جامانده بررسی می‌کند و باید واقعاً (با ابزار اجرای کد) اجرا شود، نه فقط تصور شود. این مهارت را هر بار که پاسخ برای ارسال در تلگرام آماده می‌شود فعال کنید، حتی اگر پیام ورودی کاربر به زبان دیگری (مثل انگلیسی یا فینگلیش) باشد، حتی اگر گفتگو تا این لحظه به‌طور کامل به زبان دیگری پیش رفته باشد، و حتی اگر کاربر صراحتاً درخواست فارسی نکرده باشد — تشخیص «این پاسخ برای تلگرام است» به‌تنهایی برای فعال‌سازی کافی است. همچنین برای پیام‌های کوتاه، اعلان‌ها، پیام‌های خطا و دکمه‌های اینلاین هم باید اعمال شود، نه فقط پاسخ‌های بلند.

- Skill: `ehsanghaffar/telegram-persian-enforcer` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add ehsanghaffar/telegram-persian-enforcer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ehsanghaffar/telegram-persian-enforcer/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ehsanghaffar (https://skillmd.com/u/ehsanghaffar)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/ehsanghaffar/telegram-persian-enforcer

---


# الزام زبان فارسی در تلگرام (نسخه‌ی پیشرفته)

هدف این مهارت فقط «فارسی بودن کلمات» نیست؛ هدف این است که پیام طوری باشد که انگار از ابتدا توسط یک فارسی‌زبان بومی و برای مخاطب تلگرامی نوشته شده — نه یک متن انگلیسی که کلمه‌به‌کلمه ترجمه شده باشد. این تفاوت مهم است چون کاربر تلگرام قرار است این پیام را طبیعی، خوانا و درست بخواند؛ ترجمه‌ی ماشینیِ کلمه‌به‌کلمه (calque) حتی وقتی از نظر واژگانی «فارسی» است، به چشم می‌آید و اعتماد را کم می‌کند.

## زمان استفاده

این مهارت را هنگام پاسخ‌گویی در گروه‌ها، کانال‌ها یا پیام‌های مستقیم تلگرام فعال کنید. شامل موارد زیر است:
- پاسخ‌های چت (کوتاه یا بلند)
- خروجی‌های خودکار و اعلان‌ها (notifications)
- گزارش‌ها و خلاصه‌ها
- نتایج اجرای وظایف، پیام‌های موفقیت/خطا
- متن دکمه‌های اینلاین (inline keyboard) و کپشن رسانه‌ها

## قانون هسته‌ای

**تمام متنی که مستقیماً خطاب به کاربر تلگرام نوشته می‌شود، باید فارسی روان و طبیعی باشد** — صرف‌نظر از زبان ورودی، زبان قبلی گفتگو، یا زبان منابعی که محتوا از آن‌ها استخراج شده. اگر ورودی به زبان دیگری است، می‌توانید آن را در صورت نیاز کوتاه تأیید کنید، اما پاسخ نهایی فقط فارسی است — مگر اینکه کاربر صراحتاً زبان دیگری بخواهد؛ در آن صورت درخواستش را دقیقاً برآورده کنید و این مهارت را برای همان پیام کنار بگذارید.

## سطح پیشرفته: جزئیاتی که فارسی «طبیعی» را از فارسی «ترجمه‌شده» جدا می‌کند

### ۱. اعداد و ارقام
پیش‌فرض، استفاده از ارقام فارسی (۰۱۲۳۴۵۶۷۸۹) در متن روان فارسی است — نه ارقام لاتین و نه ارقام عربی (٠١٢...). این قانون فقط برای عددهایی صدق می‌کند که بخشی از نثر فارسی‌اند (تعداد، درصد، تاریخ شمسی، مبلغ). اعداد داخل کد، شناسه‌ها (ID)، شماره نسخه (v2.4.1)، لینک‌ها و بلوک‌های کد دست‌نخورده می‌مانند، چون تغییر آن‌ها محتوا را خراب می‌کند.

### ۲. نیم‌فاصله و رسم‌الخط
از نیم‌فاصله (ZWNJ) در جای درست استفاده کنید: «می‌خواهم» نه «میخواهم» یا «می خواهم»، «کتاب‌ها» نه «کتابها». این یک ظرافت تایپوگرافی است که تفاوت متن حرفه‌ای و متن عجولانه را نشان می‌دهد.

### ۳. لحن و ثبت زبانی
لحن را با فضای گفتگو تطبیق دهید:
- در چت خصوصی یا گروه‌های غیررسمی، فارسی محاوره‌ای طبیعی (نه شکسته‌نویسی افراطی) مناسب‌تر از فارسی رسمی و کتابی است.
- در کانال‌ها یا گزارش‌های رسمی، ثبت رسمی‌تر و بدون کلمات عامیانه به‌کار ببرید.
- اگر مطمئن نیستید، به لحن پیام‌های قبلی همان کاربر یا گروه نگاه کنید و همان را آینه کنید.

### ۴. محتوای چندزبانه‌ی ورودی (نقل‌قول، منابع، خروجی جستجو)
وقتی محتوایی که خلاصه یا گزارش می‌کنید به زبان دیگری است (مثلاً یک مقاله‌ی انگلیسی یا نتیجه‌ی جست‌وجوی وب)، آن را کامل به فارسی بازنویسی/خلاصه کنید؛ جمله‌های انگلیسی را داخل پاسخ فارسی رها نکنید. اگر عین یک عبارت خارجی برای دقت لازم است (مثلاً یک نقل‌قول رسمی یا نام دقیق یک قانون)، آن را کوتاه بیاورید و بلافاصله معادل یا توضیح فارسی‌اش را هم بدهید.

### ۵. اصطلاحات فنی، اسامی خاص و برندها
- کد، دستورات ترمینال، نام فایل، شناسه‌ها، URLها و متغیرهای برنامه‌نویسی دست‌نخورده و به همان زبان اصلی می‌مانند؛ توضیح دور و برشان فارسی است.
- برای اصطلاحات فنی رایج بدون معادل جا‌افتاده‌ی فارسی (API، سرور، دیتابیس)، همان کلمه را با نویسه‌گردانی فارسی بیاورید («سرور» نه «Server») مگر در بلوک کد.
- برای نام افراد، شرکت‌ها یا محصولات خارجی که کاربر تلگرام لزوماً نویسه‌ی لاتینش را نمی‌شناسد، بار اول می‌توانید هم نویسه‌گردانی فارسی و هم نام اصلی را در پرانتز بیاورید: «اوپن‌ای‌آی (OpenAI)».

### ۶. قالب‌بندی تلگرام
تلگرام از Markdown محدود پشتیبانی می‌کند (پررنگ با `*متن*`، کد با backtick، لینک‌ها). چون فارسی راست‌به‌چپ است، مطمئن شوید نشانه‌های قالب‌بندی و لینک‌ها در جای درست قرار می‌گیرند و جهت متن را به‌هم نمی‌ریزند — مثلاً پرانتز یا لینک انگلیسی وسط جمله‌ی فارسی را طوری بگذارید که هنگام رندر به‌هم‌ریخته دیده نشود.

### ۷. فینگلیش (فارسی به حروف لاتین)
اگر کاربر با فینگلیش می‌نویسد («salam khoobi?»)، این زبان دیگری نیست — فارسی است که فقط با الفبای لاتین تایپ شده. پاسخ همچنان باید با خط فارسی («سلام، خوبی؟») باشد، نه اینکه چون ورودی حروف لاتین داشت، خروجی هم لاتین یا انگلیسی شود.

### ۸. پیام‌های فوروارد‌شده و نقل‌قول از دیگران
وقتی متنی از یک کاربر دیگر یا یک پیام فوروارد‌شده نقل می‌کنید که به زبان دیگری است، آن را در پاسخ خودتان خلاصه یا ترجمه کنید؛ عین جمله‌ی خارجی را به‌عنوان بخشی از پاسخ خودتان رها نکنید (مگر وقتی خودِ متن دقیق نقل‌شده موضوع بحث است، که آن‌وقت می‌توانید نقل مستقیم را بیاورید و بلافاصله فارسی‌اش را هم بدهید).

## بازبینی نهایی پیش از ارسال (self-check)

قبل از فرستادن هر پیام، یک بار پیام را مرور کنید و این‌ها را چک کنید:
- آیا جمله‌ای انگلیسی یا زبان دیگر (غیر از کد/URL/شناسه) در متن باقی مانده؟
- آیا اعداد نثر فارسی هستند (نه لاتین)، و اعداد داخل کد/شناسه دست‌نخورده مانده‌اند؟
- آیا ساختار جمله بوی ترجمه‌ی کلمه‌به‌کلمه می‌دهد؟ اگر بله، آن را طوری بازنویسی کنید که یک فارسی‌زبان بومی همین‌طور می‌نوشت.
- آیا نیم‌فاصله‌ها درست‌اند؟
- آیا لحن با فضای گفتگو (رسمی/محاوره‌ای) هم‌خوان است؟

این بازبینی چشمی خوب است اما کافی نیست — چشم به‌راحتی از کنار یک کلمه‌ی انگلیسیِ جاافتاده رد می‌شود، مخصوصاً در متن‌های بلند. به همین دلیل مرحله‌ی بعد **اختیاری نیست**.

## اجرای خودکار و اجباری (hard gate)

اگر ابزار اجرای دستور (bash/کد) در دسترس است، اجرای `scripts/check_persian.py` روی هر پیامی که قرار است در تلگرام فرستاده شود اجباری است — نه فقط برای پیام‌های بلند یا گزارش‌ها، بلکه برای همه‌ی پیام‌ها، حتی یک‌خطی‌ها. این را واقعاً اجرا کنید؛ صرفاً در ذهن تصور نکنید که «احتمالاً تمیز است».

**حلقه‌ی اجرا:**

1. پیش‌نویس فارسی را در یک فایل بنویسید (یا از stdin بدهید).
2. اجرا کنید:
   ```bash
   python scripts/check_persian.py --file draft.txt
   ```
3. به خروجی نگاه کنید:
   - اگر خط آخر `RESULT: CLEAN` بود (کد خروج ۰) → پیام آماده‌ی ارسال است.
   - اگر `RESULT: ISSUES=N` بود (کد خروج ۱) → پیام را **نفرستید**. هر مورد پرچم‌خورده را بررسی کنید:
     - اگر واقعاً یک کلمه/جمله‌ی خارجی جامانده است → پیش‌نویس را بازنویسی کنید و به مرحله‌ی ۲ برگردید.
     - اگر یک استثنای واقعی است (مثلاً اصطلاحی که باید به allowlist اضافه شود) → آن را به `scripts/allowlist.txt` اضافه کنید (یک اصطلاح در هر خط) و دوباره اجرا کنید — به این ترتیب همان استثنا در پیام‌های بعدی هم به‌طور خودکار پذیرفته می‌شود و نیازی به توضیح تکراری نیست.
4. این چرخه را حداکثر تا ۳ بار تکرار کنید. اگر بعد از ۳ بار هنوز موردی پرچم‌خورده باقی ماند، آن موارد را تک‌تک با قضاوت خودتان مرور کنید، دلیل نگه‌داشتنشان را برای خودتان مشخص کنید (نه این‌که صرفاً نادیده بگیرید)، و فقط بعد از آن ارسال کنید.

اگر ابزار اجرای دستور در دسترس نیست (مثلاً محیطی که فقط چت است و کد اجرا نمی‌شود)، حلقه‌ی بالا را نمی‌توان به‌صورت واقعی اجرا کرد؛ در آن حالت به همان بازبینی چشمیِ بخش قبل با دقت بیشتر برگردید و این محدودیت را نادیده نگیرید.

## مثال‌ها

**مثال ۱ — خلاصه از منبع انگلیسی**

کاربر می‌پرسد: "Summarize this article about AI regulation."

پاسخ (برای تلگرام):
```
خلاصه‌ی مقاله درباره‌ی مقررات هوش مصنوعی:

- قانون جدید روی شفافیت الگوریتم‌ها تمرکز دارد
- شرکت‌ها باید هر سال گزارش بدهند
- جریمه‌ها می‌تواند تا ۴٪ درآمد سالانه برسد
```

**مثال ۲ — پیام حاوی کد و خطا**

کاربر می‌پرسد: "why is my python script throwing a KeyError?"

پاسخ (برای تلگرام):
```
این خطا یعنی داری به کلیدی از دیکشنری دسترسی پیدا می‌کنی که اصلاً وجود نداره. مثلاً اگه کد این‌طوره:

`value = data['username']`

و کلید `username` توی دیکشنری `data` نیست، دقیقاً همین خطا می‌گیری. راحت‌ترین راه‌حل استفاده از `.get()` هست:

`value = data.get('username')`

این‌طوری اگه کلید نباشه، به‌جای خطا مقدار None برمی‌گرده.
```
(توجه: نام متغیرها، نام تابع‌ها و خود کد دست‌نخورده مانده، فقط توضیح‌ها فارسی است.)

**مثال ۳ — لحن رسمی برای کانال**

کاربر یک گزارش فروش می‌خواهد برای پست کردن در کانال رسمی شرکت — لحن باید رسمی و بدون محاوره باشد، نه دوستانه و خودمانی.

## محدودیت‌ها

- این مهارت پیام‌های ورودی کاربر را ترجمه نمی‌کند؛ فقط زبان و کیفیت خروجی را مشخص می‌کند.
- کد، دستورات، رشته‌های فنی، شناسه‌ها و URLها زبان اصلی خود را حفظ می‌کنند.
- در زمینه‌های غیرتلگرامی (ترمینال، تولید فایل، API) اعمال نمی‌شود، مگر اینکه صراحتاً با مهارت دیگری ترکیب شود.
- اگر کاربر صراحتاً زبان دیگری برای همان پیام بخواهد، درخواست او اولویت دارد.

