feat(i18n): add Persian (Farsi) locale (#159)

Add `fa` locale with full translation of all UI strings to Persian.
Register it in types.ts and index.tsx alongside existing locales.
This commit is contained in:
Amirreza Kimiyaei 2026-04-30 13:40:48 +03:30 committed by GitHub
parent 39c0399ded
commit 53722bb545
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 526 additions and 2 deletions

View file

@ -10,6 +10,7 @@ import {
type ReactNode,
} from 'react';
import { en } from './locales/en';
import { fa } from './locales/fa';
import { ptBR } from './locales/pt-BR';
import { ru } from './locales/ru';
import { zhCN } from './locales/zh-CN';
@ -27,6 +28,7 @@ const DICTS: Record<Locale, Dict> = {
'zh-TW': zhTW,
'pt-BR': ptBR,
'ru': ru,
'fa': fa,
};
const LS_KEY = 'open-design:locale';

View file

@ -0,0 +1,521 @@
import type { Dict } from '../types';
export const fa: Dict = {
'common.cancel': 'لغو',
'common.save': 'ذخیره',
'common.close': 'بستن',
'common.delete': 'حذف',
'common.rename': 'تغییر نام',
'common.preview': 'پیش‌نمایش',
'common.share': 'اشتراک‌گذاری',
'common.search': 'جستجو',
'common.searchEllipsis': 'جستجو…',
'common.loading': 'در حال بارگذاری…',
'common.all': 'همه',
'common.none': 'هیچ',
'common.default': 'پیش‌فرض',
'common.installed': 'نصب شده',
'common.notInstalled': 'نصب نشده',
'common.active': 'فعال',
'common.offline': 'آفلاین',
'common.selected': 'انتخاب شده',
'common.create': 'ایجاد',
'common.openPreview': 'باز کردن پیش‌نمایش',
'common.exitFullscreen': 'خروج از تمام صفحه',
'common.fullscreen': 'تمام صفحه',
'common.openInNewTab': 'باز کردن در تب جدید',
'common.exportPdf': 'صادرکردن به PDF',
'common.exportZip': 'دانلود به صورت .zip',
'common.exportHtml': 'صادرکردن به HTML مستقل',
'common.justNow': 'همین الان',
'common.minutesAgo': '{n} دقیقه پیش',
'common.hoursAgo': '{n} ساعت پیش',
'common.daysAgo': '{n} روز پیش',
'common.now': 'الان',
'common.minutesShort': '{n}د',
'common.hoursShort': '{n}س',
'common.daysShort': '{n}ر',
'common.untitled': 'بدون عنوان',
'app.brand': 'Open Design',
'app.brandPill': 'پیش‌نمایش تحقیقاتی',
'app.brandSubtitle': 'توسط Nexu Labs',
'app.welcomeLoading': 'در حال بارگذاری فضای کاری…',
'settings.welcomeKicker': 'خوش آمدید',
'settings.welcomeTitle': 'Open Design را راه‌اندازی کنید',
'settings.welcomeSubtitle':
'نحوه اجرای تولیدات را انتخاب کنید. می‌توانید هر زمان از دکمه تنظیمات در نوار بالا این را تغییر دهید.',
'settings.kicker': 'تنظیمات',
'settings.title': 'اجرا و مدل',
'settings.subtitle':
'بین یک CLI عامل کد محلی و Anthropic API (BYOK) انتخاب کنید. کلید API شما فقط در این مرورگر ذخیره می‌شود.',
'settings.modeAria': 'حالت اجرا',
'settings.modeDaemon': 'CLI محلی',
'settings.modeDaemonHelp': 'اجرا از طریق CLI عامل کد روی دستگاه شما',
'settings.modeDaemonOffline': 'Daemon در حال اجرا نیست',
'settings.modeDaemonOfflineMeta': 'daemon آفلاین',
'settings.modeDaemonInstalledMeta': '{count} نصب شده',
'settings.modeApi': 'Anthropic API',
'settings.modeApiMeta': 'BYOK',
'settings.codeAgent': 'عامل کد',
'settings.codeAgentHint':
'با اسکن PATH شما شناسایی شده. CLI مورد نظر برای جریان تولیدات را انتخاب کنید.',
'settings.rescan': '↻ اسکن مجدد',
'settings.rescanTitle': 'اسکن مجدد PATH',
'settings.noAgentsDetected':
'هنوز هیچ عاملی شناسایی نشده. یکی از Claude Code، Codex، Gemini CLI، OpenCode، Cursor Agent، Qwen یا GitHub Copilot CLI را نصب کنید، سپس روی اسکن مجدد کلیک کنید.',
'settings.apiSection': 'Anthropic API',
'settings.apiKey': 'کلید API',
'settings.showKey': 'نمایش کلید',
'settings.hideKey': 'پنهان کردن کلید',
'settings.show': 'نمایش',
'settings.hide': 'پنهان',
'settings.model': 'مدل',
'settings.baseUrl': 'آدرس پایه',
'settings.apiHint':
'فراخوانی‌ها مستقیماً از این مرورگر به آدرس پایه‌ای که تعیین کرده‌اید ارسال می‌شوند. بدون پراکسی. کلید هرگز localStorage را ترک نمی‌کند.',
'settings.skipForNow': 'فعلاً رد کنید',
'settings.getStarted': 'شروع کنید',
'settings.envConfigure': 'پیکربندی حالت اجرا',
'settings.localCli': 'CLI محلی',
'settings.anthropicApi': 'Anthropic API',
'settings.noAgentSelected': 'هیچ عاملی انتخاب نشده',
'settings.language': 'زبان',
'settings.languageHint': 'زبان رابط را تغییر دهید. در این مرورگر ذخیره می‌شود.',
'settings.modelPicker': 'مدل',
'settings.reasoningPicker': 'سطح استدلال',
'settings.modelPickerHint':
'هنگامی که CLI یک دستور `models` را ارائه می‌دهد از آن دریافت می‌شود. «پیش‌فرض» انتخاب را به پیکربندی خود CLI واگذار می‌کند؛ «سفارشی…» به شما امکان می‌دهد هر شناسه مدلی را که CLI می‌پذیرد تایپ کنید.',
'settings.modelCustom': 'سفارشی (در زیر تایپ کنید)…',
'settings.modelCustomLabel': 'شناسه مدل سفارشی',
'settings.modelCustomPlaceholder': 'مثلاً anthropic/claude-sonnet-4-6',
'entry.tabDesigns': 'طرح‌ها',
'entry.tabExamples': 'نمونه‌ها',
'entry.tabDesignSystems': 'سیستم‌های طراحی',
'entry.openSettingsTitle': 'تنظیمات',
'entry.openSettingsAria': 'باز کردن تنظیمات',
'entry.resizeAria': 'تغییر اندازه نوار کناری',
'entry.loadingWorkspace': 'در حال بارگذاری فضای کاری…',
'newproj.tabPrototype': 'نمونه اولیه',
'newproj.tabDeck': 'ارائه اسلاید',
'newproj.tabTemplate': 'از قالب',
'newproj.tabOther': 'سایر',
'newproj.titlePrototype': 'نمونه اولیه جدید',
'newproj.titleDeck': 'ارائه اسلاید جدید',
'newproj.titleTemplate': 'شروع از یک قالب',
'newproj.titleOther': 'پروژه جدید',
'newproj.namePlaceholder': 'نام پروژه',
'newproj.fidelityLabel': 'دقت',
'newproj.fidelityWireframe': 'وایرفریم',
'newproj.fidelityHigh': 'دقت بالا',
'newproj.toggleSpeakerNotes': 'استفاده از یادداشت‌های سخنران',
'newproj.toggleSpeakerNotesHint': 'متن کمتر روی اسلایدها — نکات صحبت را در یادداشت‌ها نگه دارید.',
'newproj.toggleAnimations': 'افزودن انیمیشن',
'newproj.toggleAnimationsHint':
'افزودن حرکت (ورود، هاور، انتقال) بر روی قالب.',
'newproj.templateLabel': 'قالب',
'newproj.noTemplatesTitle': 'هنوز هیچ قالبی وجود ندارد',
'newproj.noTemplatesBody':
'هر پروژه‌ای را باز کنید، سپس از منوی اشتراک‌گذاری در داخل نمایشگر فایل آن را به قالب تبدیل کنید. قالب‌ها اینجا نمایش داده می‌شوند.',
'newproj.savedTemplate': 'قالب ذخیره شده',
'newproj.fileSingular': 'فایل',
'newproj.filePlural': 'فایل',
'newproj.create': 'ایجاد',
'newproj.createFromTemplate': 'ایجاد از قالب',
'newproj.createDisabledTitle':
'ابتدا یک پروژه را به عنوان قالب ذخیره کنید (منوی اشتراک‌گذاری در داخل هر پروژه).',
'newproj.importClaudeZip': 'وارد کردن ZIP طراحی Claude',
'newproj.importClaudeZipTitle': 'وارد کردن یک فایل .zip صادر شده از Claude Design',
'newproj.importingClaudeZip': 'در حال وارد کردن…',
'newproj.privacyFooter': 'به طور پیش‌فرض فقط شما می‌توانید پروژه خود را ببینید.',
'newproj.designSystem': 'سیستم طراحی',
'newproj.dsNoneFreeform': 'هیچ — آزاد',
'newproj.dsNoneSubtitleEmpty': 'بدون توکن‌های سیستم، پالت خود را انتخاب کنید',
'newproj.dsNoneSubtitleSelected': 'از توکن‌های سیستم صرف نظر کنید. عامل پالت خود را انتخاب می‌کند.',
'newproj.dsCategoryFallback': 'سیستم طراحی',
'newproj.dsSearch': 'جستجوی سیستم‌های طراحی…',
'newproj.dsModeAria': 'حالت انتخاب',
'newproj.dsModeSingle': 'تکی',
'newproj.dsModeMulti': 'چندگانه',
'newproj.dsNoneTitle': 'هیچ — آزاد',
'newproj.dsNoneSub': 'از توکن‌های سیستم صرف نظر کنید. عامل پالت خود را انتخاب می‌کند.',
'newproj.dsEmpty': 'هیچ سیستم طراحی با «{query}» مطابقت ندارد.',
'newproj.dsFootSingular': 'فقط الهام‌بخش است.',
'newproj.dsFootPlural': 'فقط الهام‌بخش هستند.',
'newproj.dsFootClear': 'پاک کردن',
'newproj.dsBadgeDefault': 'پیش‌فرض',
'newproj.dsPrimaryFallback': 'اصلی',
'designs.subRecent': 'اخیر',
'designs.subYours': 'طرح‌های شما',
'designs.filterAria': 'فیلتر پروژه‌ها',
'designs.searchPlaceholder': 'جستجو…',
'designs.emptyNoProjects': 'هنوز هیچ پروژه‌ای وجود ندارد. یکی را از سمت چپ ایجاد کنید.',
'designs.emptyNoMatch': 'هیچ پروژه‌ای با جستجوی شما مطابقت ندارد.',
'designs.deleteTitle': 'حذف پروژه',
'designs.deleteConfirm': 'آیا «{name}» حذف شود؟',
'designs.cardFreeform': 'آزاد',
'examples.typeLabel': 'نوع',
'examples.scenarioLabel': 'سناریو',
'examples.modeAll': 'همه',
'examples.modePrototypeDesktop': 'نمونه اولیه · دسکتاپ',
'examples.modePrototypeMobile': 'نمونه اولیه · موبایل',
'examples.modeDeck': 'اسلایدها',
'examples.modeDocument': 'اسناد و قالب‌ها',
'examples.scenarioGeneral': 'عمومی',
'examples.scenarioEngineering': 'مهندسی',
'examples.scenarioProduct': 'محصول',
'examples.scenarioDesign': 'طراحی',
'examples.scenarioMarketing': 'بازاریابی',
'examples.scenarioSales': 'فروش',
'examples.scenarioFinance': 'مالی',
'examples.scenarioHr': 'منابع انسانی',
'examples.scenarioOperations': 'عملیات',
'examples.scenarioSupport': 'پشتیبانی',
'examples.scenarioLegal': 'حقوقی',
'examples.scenarioEducation': 'آموزش',
'examples.scenarioPersonal': 'شخصی',
'examples.emptyNoSkills': 'هیچ مهارتی موجود نیست. آیا daemon در حال اجرا است؟',
'examples.emptyNoMatch': 'هیچ نمونه‌ای با این فیلترها مطابقت ندارد.',
'examples.openPreview': '⤢ باز کردن پیش‌نمایش',
'examples.loadingPreview': 'در حال بارگذاری پیش‌نمایش…',
'examples.hoverPreview': 'برای پیش‌نمایش هاور کنید',
'examples.usePrompt': 'استفاده از این پرامپت',
'examples.previewModalTitle': 'باز کردن پیش‌نمایش کامل (modal)',
'examples.shareTitle': 'اشتراک‌گذاری این نمونه',
'examples.shareLoadFirst': 'ابتدا برای بارگذاری پیش‌نمایش هاور کنید',
'examples.shareMenu': 'اشتراک‌گذاری ▾',
'examples.exportPdfAllSlides': 'صادرکردن به PDF (همه اسلایدها)',
'examples.exportPptxLocked': 'صادرکردن به PPTX… (ابتدا قالب را باز کنید)',
'examples.tagSlideDeck': 'ارائه اسلاید',
'examples.tagTemplate': 'قالب',
'examples.tagDesignSystem': 'سیستم طراحی',
'examples.tagMobilePrototype': 'نمونه اولیه موبایل',
'examples.tagDesktopPrototype': 'نمونه اولیه دسکتاپ',
'examples.previewLabel': 'پیش‌نمایش',
'ds.searchPlaceholder': 'جستجوی سیستم‌های طراحی…',
'ds.emptyNoMatch': 'هیچ سیستم طراحی با جستجوی شما مطابقت ندارد.',
'ds.badgeDefault': 'پیش‌فرض',
'ds.preview': 'پیش‌نمایش',
'ds.previewTitle': 'پیش‌نمایش سیستم طراحی',
'ds.categoryAll': 'همه',
'ds.categoryUncategorized': 'دسته‌بندی نشده',
'ds.showcase': 'ویترین',
'ds.tokens': 'توکن‌ها',
'avatar.title': 'حساب و تنظیمات',
'avatar.localCli': 'CLI محلی',
'avatar.anthropicApi': 'Anthropic API',
'avatar.useLocal': 'استفاده از CLI محلی',
'avatar.useApi': 'استفاده از Anthropic API',
'avatar.codeAgent': 'عامل کد',
'avatar.rescan': 'اسکن مجدد PATH',
'avatar.settings': 'تنظیمات',
'avatar.backToProjects': 'بازگشت به پروژه‌ها',
'avatar.metaActive': 'فعال',
'avatar.metaOffline': 'آفلاین',
'avatar.metaSelected': 'انتخاب شده',
'avatar.noAgentSelected': 'هیچ عاملی انتخاب نشده',
'avatar.modelSection': 'مدل',
'avatar.modelLabel': 'مدل',
'avatar.reasoningLabel': 'استدلال',
'avatar.customSuffix': '(سفارشی)',
'project.backToProjects': 'بازگشت به پروژه‌ها',
'project.metaFreeform': 'آزاد',
'chat.tabChat': 'چت',
'chat.tabComments': 'نظرات',
'chat.commentsSoon': 'نظرات — به زودی',
'chat.conversationsTitle': 'مکالمات',
'chat.conversationsAria': 'تاریخچه مکالمات',
'chat.newConversation': 'مکالمه جدید',
'chat.newConversationsTitle': 'مکالمه جدید',
'chat.conversationsHeading': 'مکالمات',
'chat.new': 'جدید',
'chat.emptyConversations': 'هنوز هیچ مکالمه‌ای وجود ندارد.',
'chat.deleteConversation': 'حذف مکالمه',
'chat.deleteConversationConfirm':
'آیا «{title}» حذف شود؟ این کار پیام‌های آن را حذف می‌کند.',
'chat.untitledConversation': 'مکالمه بدون عنوان',
'chat.startTitle': 'یک مکالمه شروع کنید',
'chat.startHint':
'تصاویر را برای مرجع بصری رها کنید یا بچسبانید، یا @ را تایپ کنید تا یک فایل از این پروژه را ضمیمه کنید. یا یکی از این شروع‌کننده‌ها را امتحان کنید:',
'chat.fillInputTitle': 'برای پر کردن ورودی کلیک کنید',
'chat.jumpToLatest': 'رفتن به آخرین',
'chat.scrollToLatest': 'اسکرول به آخرین',
'chat.you': 'شما',
'chat.openFile': 'باز کردن {name}',
'chat.composerPlaceholder':
'طرح مورد نظر خود را توصیف کنید — تصاویر را بچسبانید یا رها کنید، یا @ برای مرجع فایل…',
'chat.composerHint':
'⌘/Ctrl + Enter برای ارسال · چسباندن تصاویر · @ برای مرجع فایل‌ها',
'chat.cliSettingsTitle': 'تنظیمات CLI و مدل',
'chat.cliSettingsAria': 'باز کردن تنظیمات CLI و مدل',
'chat.attachTitle': 'ضمیمه کردن فایل‌ها (یا چسباندن / رها کردن)',
'chat.attachAria': 'ضمیمه کردن فایل‌ها',
'chat.importTitle': 'وارد کردن منابع (به زودی)',
'chat.importLabel': 'وارد کردن',
'chat.importComingSoon': 'به زودی',
'chat.importSoon': 'به زودی',
'chat.importFig': 'آپلود فایل .fig',
'chat.importGitHub': 'اتصال به GitHub',
'chat.importWeb': 'گرفتن عنصر وب',
'chat.importFolder': 'لینک کردن پوشه کد',
'chat.importSkills': 'مهارت‌ها و سیستم‌های طراحی',
'chat.importProject': 'مرجع یک پروژه دیگر',
'chat.send': 'ارسال',
'chat.stop': 'توقف',
'chat.removeAria': 'حذف {name}',
'chat.example1Title': 'ارائه سردبیری',
'chat.example1Tag': 'مجله',
'chat.example1Prompt':
'یک ارائه سردبیری ۱۰ اسلایدی برای یک استودیو طراحی که در حال جمع‌آوری یک دور سرمایه‌گذاری اولیه است — چیدمان شبکه سوئیسی، عناوین سریف بزرگ با حروف تزئینی پررنگ، شماره‌های بخش با فونت monospace، فضای منفی سخاوتمندانه، و اسلایدهای تمام خون عکس که با اسلایدهای متن‌محور در هم تنیده شده‌اند. جلد، چشم‌انداز، بازار، محصول، کشش، تیم، درخواست، تماس.',
'chat.example2Title': 'داشبورد تحلیل SaaS',
'chat.example2Tag': 'داده',
'chat.example2Prompt':
'یک داشبورد تحلیل متراکم برای یک SaaS ابزار توسعه‌دهنده — نوار KPI با دلتاهای هفته به هفته، دو نمودار خط انباشته (MRR و فضاهای کاری فعال)، یک نقشه حرارتی جهانی از استفاده، یک شبکه ماندگاری کوهورت، یک جدول رهبری برترین مشتریان، و یک فید رویداد بلادرنگ. تم تاریک، اعداد جدولی monospace، تأکیدات sparkline.',
'chat.example3Title': 'گزارش سالانه اسکرول بلند',
'chat.example3Tag': 'سردبیری',
'chat.example3Prompt':
'یک گزارش سالانه تعاملی برای یک سازمان غیرانتفاعی آب و هوایی — چیدمان سردبیری اسکرول بلند که بلوک‌های نقل قول بزرگ، تصویرسازی‌های داده، عکاسی، دیوار اهداکنندگان و یک فراخوان به عمل نهایی را ترکیب می‌کند.',
'preview.shareMenu': 'اشتراک‌گذاری ▾',
'preview.openInNewTab': 'باز کردن در تب جدید',
'preview.exit': '⤓ خروج',
'preview.fullscreen': '⤢ تمام صفحه',
'preview.closeTitle': 'بستن (Esc)',
'preview.loading': 'در حال بارگذاری {label}…',
'misc.savedTemplate': 'قالب ذخیره شده',
'misc.primary': 'اصلی',
'misc.designSystem': 'سیستم طراحی',
'workspace.designFiles': 'فایل‌های طراحی',
'workspace.closeTab': 'بستن تب',
'workspace.deleteFileConfirm': 'آیا «{name}» از پوشه پروژه حذف شود؟',
'workspace.openFromDesignFiles': 'باز کردن یک فایل از',
'workspace.designFilesLink': 'فایل‌های طراحی',
'workspace.loadingSketch': 'در حال بارگذاری طرح…',
'designFiles.title': 'فایل‌های طراحی',
'designFiles.upload': 'آپلود فایل‌ها',
'designFiles.pasteText': 'چسباندن به عنوان فایل متنی',
'designFiles.newSketch': 'طرح جدید',
'designFiles.empty':
'هنوز هیچ چیزی اینجا نیست. فایل‌ها را رها کنید، یا یک طرح ایجاد کنید / متن بچسبانید.',
'designFiles.refresh': 'بازنشانی',
'designFiles.delete': 'حذف',
'designFiles.searchPlaceholder': 'جستجوی فایل‌ها…',
'designFiles.up': 'بالا',
'designFiles.back': 'بازگشت',
'designFiles.crumbs': 'پروژه',
'designFiles.rowMenu': 'منوی ردیف',
'designFiles.openInTab': 'باز کردن در تب',
'designFiles.download': 'دانلود',
'designFiles.dropTitle': '⤓ فایل‌ها را اینجا رها کنید',
'designFiles.dropDesc':
'تصاویر، اسناد، مراجع، لینک‌های Figma، یا پوشه‌ها — Claude از آن‌ها به عنوان زمینه استفاده خواهد کرد.',
'designFiles.upload.title': 'آپلود فایل‌ها',
'designFiles.paste.title': 'چسباندن متن به عنوان فایل',
'designFiles.upload.label': 'آپلود',
'designFiles.paste.label': 'چسباندن',
'designFiles.previewOpen': 'باز کردن',
'designFiles.previewClose': 'بستن پیش‌نمایش',
'designFiles.modified': 'ویرایش شده {time} · {size}',
'designFiles.weeksAgo': '{n} هفته پیش',
'designFiles.sectionPages': 'صفحات',
'designFiles.sectionScripts': 'اسکریپت‌ها',
'designFiles.sectionImages': 'تصاویر',
'designFiles.sectionSketches': 'طرح‌ها',
'designFiles.sectionOther': 'سایر',
'designFiles.kindHtml': 'صفحه HTML',
'designFiles.kindImage': 'تصویر',
'designFiles.kindSketch': 'طرح',
'designFiles.kindText': 'متن',
'designFiles.kindCode': 'اسکریپت',
'designFiles.kindPdf': 'PDF',
'designFiles.kindDocument': 'سند',
'designFiles.kindPresentation': 'ارائه',
'designFiles.kindSpreadsheet': 'صفحه گسترده',
'designFiles.kindBinary': 'باینری',
'pasteDialog.title': 'چسباندن متن',
'pasteDialog.hint': 'در پوشه پروژه ذخیره می‌شود. هر نامی انتخاب کنید.',
'pasteDialog.fileNameLabel': 'نام فایل',
'pasteDialog.namePlaceholder': 'notes.txt',
'pasteDialog.contentLabel': 'محتوا',
'pasteDialog.contentPlaceholder': 'هر چیزی را بچسبانید…',
'pasteDialog.save': 'ذخیره',
'pasteDialog.cancel': 'لغو',
'sketch.save': 'ذخیره طرح',
'sketch.cancel': 'لغو',
'sketch.saving': 'در حال ذخیره…',
'sketch.tooltipDirty': 'تغییرات ذخیره نشده',
'sketch.tooltipClean': 'ذخیره شد',
'fileViewer.empty': 'یک فایل را برای مشاهده انتخاب کنید.',
'fileViewer.loading': 'در حال بارگذاری…',
'fileViewer.exportPptx': 'صادرکردن به PPTX',
'fileViewer.openInNewTab': 'باز کردن در تب جدید',
'fileViewer.copyPath': 'کپی مسیر',
'fileViewer.copied': 'کپی شد!',
'fileViewer.share': 'اشتراک‌گذاری',
'fileViewer.binaryMeta': 'باینری · {size}',
'fileViewer.binaryNote':
'فایل باینری ({size} بایت). برای بررسی دانلود یا از دیسک باز کنید.',
'fileViewer.pdfMeta': 'PDF · {size}',
'fileViewer.documentMeta': 'سند',
'fileViewer.presentationMeta': 'ارائه',
'fileViewer.spreadsheetMeta': 'صفحه گسترده',
'fileViewer.previewUnavailable': 'پیش‌نمایش در دسترس نیست. برای بررسی فایل را دانلود یا باز کنید.',
'fileViewer.download': 'دانلود',
'fileViewer.open': 'باز کردن',
'fileViewer.imageMeta': 'تصویر · {size}',
'fileViewer.sketchMeta': 'طرح · {size}',
'fileViewer.reload': 'بارگذاری مجدد',
'fileViewer.reloadDisk': 'بارگذاری مجدد از دیسک',
'fileViewer.copy': 'کپی',
'fileViewer.copyTitle': 'کپی محتوای فایل',
'fileViewer.saveDisabled': 'ذخیره (نمایشگر فقط خواندنی)',
'fileViewer.save': 'ذخیره',
'fileViewer.preview': 'پیش‌نمایش',
'fileViewer.source': 'منبع',
'fileViewer.tweaks': 'تنظیمات جزئی',
'fileViewer.comment': 'نظر',
'fileViewer.edit': 'ویرایش',
'fileViewer.draw': 'رسم',
'fileViewer.zoomOut': 'کوچک‌نمایی',
'fileViewer.zoomIn': 'بزرگ‌نمایی',
'fileViewer.resetZoom': 'بازنشانی زوم',
'fileViewer.reloadAria': 'بارگذاری مجدد',
'fileViewer.previousSlide': 'اسلاید قبلی',
'fileViewer.nextSlide': 'اسلاید بعدی',
'fileViewer.slideNavAria': 'پیمایش اسلاید',
'fileViewer.present': 'ارائه',
'fileViewer.presentInTab': 'در این تب',
'fileViewer.presentFullscreen': 'تمام صفحه',
'fileViewer.presentNewTab': 'تب جدید',
'fileViewer.exitPresentation': 'خروج از ارائه',
'fileViewer.shareLabel': 'اشتراک‌گذاری',
'fileViewer.exportPdf': 'صادرکردن به PDF',
'fileViewer.exportPdfAllSlides': 'صادرکردن به PDF (همه اسلایدها)',
'fileViewer.exportPptxBusy': 'منتظر پایان نوبت فعلی باشید.',
'fileViewer.exportPptxHint':
'یک درخواست به عامل برای تبدیل این طرح به PPTX ارسال کنید.',
'fileViewer.exportPptxNa': 'صادرکردن PPTX اینجا در دسترس نیست.',
'fileViewer.exportZip': 'دانلود به صورت .zip',
'fileViewer.exportHtml': 'صادرکردن به HTML مستقل',
'fileViewer.saveAsTemplate': 'ذخیره به عنوان قالب…',
'fileViewer.savingTemplate': 'در حال ذخیره قالب…',
'fileViewer.savedTemplate': 'به عنوان «{name}» ذخیره شد',
'fileViewer.savedTemplateFail': 'ذخیره قالب ناموفق بود — دوباره امتحان کنید.',
'fileViewer.templateNamePrompt': 'نام قالب',
'fileViewer.templateNameDefault': 'قالب بدون عنوان',
'fileViewer.templateDescPrompt':
'توضیح کوتاه (اختیاری — چه چیزی این قالب را مفید می‌کند؟)',
'questionForm.submit': 'ارسال',
'questionForm.skip': 'رد کردن',
'questionForm.locked': 'پاسخ داده شده',
'conv.switch': 'تغییر مکالمه',
'conv.label': 'مکالمه',
'conv.heading': 'مکالمات',
'conv.new': '+ جدید',
'conv.empty': 'هنوز هیچ مکالمه‌ای وجود ندارد.',
'conv.untitled': 'مکالمه بدون عنوان',
'conv.renameTooltip': 'برای تغییر نام دوبار کلیک کنید',
'conv.delete': 'حذف مکالمه',
'conv.deleteConfirm': 'آیا «{title}» حذف شود؟ این کار پیام‌های آن را حذف می‌کند.',
'agentPicker.label': 'عامل',
'agentPicker.modeChoose': 'انتخاب حالت اجرا',
'agentPicker.localCli': 'CLI محلی',
'agentPicker.daemonOff': 'daemon خاموش',
'agentPicker.byok': 'Anthropic API · BYOK',
'agentPicker.selectAgent': 'انتخاب یک CLI عامل کد شناسایی شده',
'agentPicker.noAgents': 'هیچ عاملی در PATH وجود ندارد',
'agentPicker.notInstalled': 'نصب نشده',
'agentPicker.rescan': 'اسکن مجدد PATH محلی برای عامل‌ها',
'tool.openInTab': 'باز کردن {name} در یک تب',
'tool.open': 'باز کردن',
'tool.todos': 'وظایف',
'tool.write': 'نوشتن',
'tool.edit': 'ویرایش',
'tool.read': 'خواندن',
'tool.bash': 'Bash',
'tool.glob': 'Glob',
'tool.grep': 'Grep',
'tool.fetch': 'دریافت',
'tool.search': 'جستجو',
'tool.lines': '{n} خط',
'tool.changeSingular': 'تغییر',
'tool.changePlural': 'تغییرات',
'tool.in': 'در {path}',
'tool.hide': 'پنهان',
'tool.output': 'خروجی',
'tool.running': 'در حال اجرا…',
'tool.error': 'خطا',
'tool.done': 'انجام شد',
'assistant.role': 'دستیار',
'assistant.workingLabel': 'در حال کار',
'assistant.doneLabel': 'انجام شد',
'assistant.unfinishedLabel': 'با کار ناتمام متوقف شد',
'assistant.unfinishedSummary': '{n} وظیفه باقی مانده',
'assistant.unfinishedMore': '+{n} بیشتر',
'assistant.continueRemaining': 'ادامه وظایف باقی مانده',
'assistant.outTokens': '{n} خروجی',
'assistant.producedFiles': 'فایل‌های این نوبت',
'assistant.openFile': 'باز کردن',
'assistant.downloadFile': 'دانلود',
'assistant.thinking': 'در حال فکر کردن',
'assistant.systemReminder': 'یادآور سیستم',
'assistant.waitingFirstOutput': 'در انتظار اولین خروجی',
'assistant.statusBootingAgent': 'راه‌اندازی عامل',
'assistant.statusStarting': 'در حال شروع',
'assistant.statusRequesting': 'در حال ارسال درخواست',
'assistant.statusThinking': 'در حال فکر کردن',
'assistant.statusStreaming': 'در حال استریم',
'assistant.slowHint':
'بیشتر از حد معمول طول می‌کشد. فرم معمولاً در ۵ تا ۱۰ ثانیه نمایش داده می‌شود — می‌توانید متوقف کنید و عبارت را تغییر دهید.',
'assistant.verbEditing': 'در حال ویرایش',
'assistant.verbWriting': 'در حال نوشتن',
'assistant.verbReading': 'در حال خواندن',
'assistant.verbSearching': 'در حال جستجو',
'assistant.verbRunning': 'در حال اجرا',
'assistant.verbTodos': 'وظایف',
'assistant.verbFetching': 'در حال دریافت',
'assistant.verbCalling': 'در حال فراخوانی',
'qf.answered': 'پاسخ داده شده',
'qf.choose': 'انتخاب کنید…',
'qf.required': 'الزامی',
'qf.lockedSubmitted':
'پاسخ‌ها ارسال شدند — عامل از این‌ها برای بقیه جلسه استفاده می‌کند.',
'qf.lockedPrev': 'این فرم از یک نوبت قبلی است.',
'qf.hint':
'آنچه را که مناسب است انتخاب کنید. فیلدهای اختیاری که برایتان مهم نیست را رد کنید — عامل از پیش‌فرض‌های معقول استفاده خواهد کرد.',
'qf.submitDefault': 'ارسال پاسخ‌ها',
'qf.submitDisabledTitle': 'ابتدا فیلدهای الزامی را پر کنید',
'qf.submitTitle': 'ارسال پاسخ‌ها',
'qf.cardSelected': 'انتخاب شده',
'qf.cardRefs': 'مراجع:',
'qf.cardSampleText': 'روباه قهوه‌ای سریع · ۰۱۲۳',
'sketch.toolSelect': 'انتخاب (غیرفعال)',
'sketch.toolPen': 'قلم',
'sketch.toolText': 'متن',
'sketch.toolRect': 'مستطیل',
'sketch.toolArrow': 'فلش',
'sketch.toolEraser': 'پاک‌کن',
'sketch.color': 'رنگ',
'sketch.strokeSize': 'اندازه خط',
'sketch.undo': 'واگرد',
'sketch.clear': 'پاک کردن',
'sketch.close': 'بستن',
'sketch.textPrompt': 'متن:',
};

View file

@ -1,8 +1,8 @@
// Supported UI locales. Adding a new locale requires creating a new
// dictionary in `./locales/` and registering it in `./index.tsx`.
export type Locale = 'en' | 'zh-CN' | 'zh-TW' | 'pt-BR' | 'ru';
export type Locale = 'en' | 'zh-CN' | 'zh-TW' | 'pt-BR' | 'ru' | 'fa';
export const LOCALES: Locale[] = ['en', 'zh-CN', 'zh-TW', 'pt-BR', 'ru'];
export const LOCALES: Locale[] = ['en', 'zh-CN', 'zh-TW', 'pt-BR', 'ru', 'fa'];
export const LOCALE_LABEL: Record<Locale, string> = {
'en': 'English',
@ -10,6 +10,7 @@ export const LOCALE_LABEL: Record<Locale, string> = {
'zh-TW': '繁體中文',
'pt-BR': 'Português (Brasil)',
'ru': 'Русский',
'fa': 'فارسی',
};
// Translation dictionary shape — flat keys, dot-namespaced. We keep it