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

سایت ترجمه با چند لایه داده حساس سر و کار دارد: متن مبدأ، متن مقصد، حافظه ترجمه (Translation Memory)، واژه‌نامه اصطلاحات، و داده هویتی مشتری. هر لایه نیازمند سطح دسترسی متفاوتی است. مدل نقش پیش‌فرض وردپرس، این تفکیک را نمی‌شناسد. بدون تنظیمات زبانی، خطر نشت متن مبدأ، افشای واژه‌نامه اختصاصی مشتری، و از دست رفتن مزیت رقابتی مترجم وجود دارد. راه‌حل عملی، تعریف نقش‌های سفارشی، جداسازی حافظه ترجمه، و ثبت دقیق نسخه‌های ترجمه است. این مقاله معماری کامل این حوزه را بررسی می‌کند.

در پروژه‌ای که برای یک آژانس ترجمه طراحی می‌کردم، نخستین بحران از یک نکته ظریف شروع شد: واژه‌نامه اختصاصی یک مشتری بزرگ، در حافظه ترجمه مشترک قرار گرفته بود و مترجم دیگری از آن استفاده کرده بود. آن تجربه نشان داد که در ترجمه حرفه‌ای، واژه‌نامه یک دارایی رقابتی است، نه یک فایل متنی ساده، و هر نقص در جداسازی آن، می‌تواند به از دست رفتن مشتری منجر شود.

چرا نقش‌های پیش‌فرض وردپرس کافی نیستند؟

وردپرس شش نقش پیش‌فرض دارد که حول مدیریت محتوا ساخته شده‌اند. در سایت ترجمه، این نقش‌ها با شکاف‌های زیر روبه‌رو می‌شوند:

  • نبود تفکیک پروژه ترجمه: هر مترجم باید فقط به پروژه‌های تخصیص‌یافته خودش دسترسی داشته باشد.
  • نبود حافظه ترجمه اختصاصی: حافظه ترجمه هر مشتری باید جدا باشد تا مزیت رقابتی حفظ شود.
  • نبود نسخه‌بندی ترجمه: هر ترجمه چندین نسخه دارد: پیش‌نویس، بازبینی، ویرایش نهایی.
  • ریسک نشت متن مبدأ: متن مبدأ ممکن است دارای حق نشر یا محرمانه باشد.

در سایت ترجمه، حافظه ترجمه یک دارایی رقابتی است، نه یک بانک داده عمومی.

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

نقش‌های ضروری در سایت ترجمه

مترجم (Translator)

دسترسی به پروژه‌های تخصیصی، استفاده از حافظه ترجمه پروژه، ثبت ترجمه، بدون دسترسی به پروژه‌های سایر مترجمان.

ویراستار (Translation Editor)

مشاهده ترجمه‌های تخصیصی، ثبت بازخورد، تأیید نهایی، بدون دسترسی به داده پرداخت.

مدیر پروژه (Project Manager)

تخصیص مترجم، مدیریت مهلت‌ها، ارتباط با مشتری، بدون دسترسی به محتوای ترجمه.

مشتری (Client)

دسترسی به ترجمه‌های خودش، مشاهده وضعیت پروژه، بدون دسترسی به حافظه ترجمه سایر مشتریان.

مدیر واژه‌نامه (Glossary Manager)

مدیریت واژه‌نامه اختصاصی هر مشتری، بدون دسترسی به متن ترجمه.

چالش‌های داده ترجمه

پیش از ورود به پیاده‌سازی، باید چالش‌های خاص این حوزه را دقیق بشناسیم.

۱. حافظه ترجمه (Translation Memory)

حافظه ترجمه یک بانک از جملات ترجمه‌شده است که برای افزایش سرعت و یکدستی استفاده می‌شود. این حافظه باید به‌ازای هر مشتری جدا باشد. برای مطالعه بیشتر، مطلب پیاده‌سازی درست Custom Post Type را ببینید.

۲. واژه‌نامه اصطلاحات

هر مشتری ممکن است واژه‌نامه اختصاصی داشته باشد که اصطلاحات خاص را تعریف می‌کند. این واژه‌نامه باید فقط در اختیار مترجمان همان مشتری باشد. برای مطالعه بیشتر، مطلب فیلدهای سفارشی ACF و کاربردهای واقعی آن را ببینید.

۳. نسخه‌بندی ترجمه

هر ترجمه چندین نسخه دارد که باید مستقل نگهداری شوند. برای مطالعه بیشتر، مطلب کار با User Meta در وردپرس را ببینید.

۴. حق نشر متن مبدأ

متن مبدأ ممکن است دارای حق نشر یا محرمانه باشد. دسترسی به آن باید محدود به مترجم تخصیصی باشد. برای مطالعه بیشتر، مطلب توابع وردپرس برای کار با فایل‌ها را ببینید.

۵. کیفیت ترجمه

کیفیت ترجمه باید قابل ارزیابی باشد. این نیازمند یک سیستم امتیازدهی و چرخه بازخورد است.

تنظیمات زبانی برای هر نقش

نقش دسترسی پروژه حافظه ترجمه واژه‌نامه
مترجم تخصیصی پروژه مربوطه مشتری مربوطه
ویراستار تخصیصی پروژه مربوطه مشتری مربوطه
مدیر پروژه مدیریت تخصیص خیر مدیریت
مشتری پروژه‌های خودش خودش خودش
مدیر واژه‌نامه خیر خیر مدیریت کامل

پیاده‌سازی با PHP

ابتدا CPT پروژه ترجمه را می‌سازیم. برای مطالعه بیشتر، مطلب پیاده‌سازی درست Custom Post Type را ببینید.

function wk_register_translation_project_cpt() {
    register_post_type('wk_translation_project', array(
        'label' => 'پروژه‌های ترجمه',
        'public' => false,
        'show_ui' => true,
        'capability_type' => 'wk_translation_project',
        'capabilities' => array(
            'read_post' => 'read_wk_translation_project',
            'edit_post' => 'edit_wk_translation_project',
            'edit_posts' => 'edit_wk_translation_projects',
            'edit_others_posts' => 'edit_others_wk_translation_projects',
        ),
        'map_meta_cap' => true,
        'supports' => array('title', 'author', 'custom-fields'),
    ));
}
add_action('init', 'wk_register_translation_project_cpt');

سپس نقش‌های سفارشی را می‌سازیم. برای درک بهتر هوک‌ها، مطلب هوک‌های وردپرس: قلب تپنده توسعه را ببینید.

function wk_register_translation_roles() {
    add_role('wk_translator', 'مترجم', array(
        'read' => true,
        'edit_wk_translation_projects' => true,
        'translate_wk_projects' => true,
        'use_wk_translation_memory' => true,
        'upload_files' => true,
    ));

    add_role('wk_translation_editor', 'ویراستار ترجمه', array(
        'read' => true,
        'edit_wk_translation_projects' => true,
        'edit_others_wk_translation_projects' => true,
        'write_wk_translation_feedback' => true,
        'approve_wk_translations' => true,
    ));

    add_role('wk_project_manager', 'مدیر پروژه ترجمه', array(
        'read' => true,
        'assign_wk_translators' => true,
        'manage_wk_deadlines' => true,
    ));

    add_role('wk_glossary_manager', 'مدیر واژه‌نامه', array(
        'read' => true,
        'manage_wk_glossaries' => true,
    ));
}
add_action('init', 'wk_register_translation_roles');

برای اعتبارسنجی و پاک‌سازی داده‌های ورودی، مطلب اعتبارسنجی داده‌ها در کدنویسی وردپرس و پاک‌سازی داده‌ها در کدنویسی وردپرس را ببینید.

حافظه ترجمه و واژه‌نامه

حافظه ترجمه باید به‌ازای هر مشتری جدا باشد و در User Meta یا یک CPT اختصاصی ذخیره شود:

function wk_save_translation_memory($client_id, $source, $target, $language_pair) {
    $tm_key = sprintf('wk_tm_%d_%s', $client_id, md5($language_pair));
    $tm = get_option($tm_key, array());
    $tm[md5($source)] = array(
        'source' => $source,
        'target' => $target,
        'language_pair' => $language_pair,
        'created_at' => current_time('mysql'),
    );
    update_option($tm_key, $tm);
}

function wk_lookup_translation_memory($client_id, $source, $language_pair) {
    $tm_key = sprintf('wk_tm_%d_%s', $client_id, md5($language_pair));
    $tm = get_option($tm_key, array());
    $hash = md5($source);
    return isset($tm[$hash]) ? $tm[$hash] : null;
}

نکته کلیدی: کلید حافظه ترجمه باید شامل شناسه مشتری باشد تا از نشت بین مشتریان جلوگیری شود. برای مطالعه بیشتر، مطلب کار با Options API در وردپرس را ببینید.

نسخه‌بندی ترجمه

هر نسخه از ترجمه باید مستقل و تغییرناپذیر باشد:

function wk_save_translation_version($project_id, $translator_id, $content, $stage) {
    if (!current_user_can('translate_wk_projects')) {
        return new WP_Error('forbidden', 'دسترسی غیرمجاز');
    }
    $version_id = wp_insert_post(array(
        'post_type' => 'wk_translation_version',
        'post_status' => 'publish',
        'post_author' => $translator_id,
        'post_title' => sprintf('نسخه %s', $stage),
        'post_content' => wp_kses_post($content),
    ));
    update_post_meta($version_id, 'wk_project_id', $project_id);
    update_post_meta($version_id, 'wk_version_stage', sanitize_key($stage));
    update_post_meta($version_id, 'wk_content_hash', hash('sha256', $content));
    update_post_meta($version_id, 'wk_created_at', current_time('mysql'));
    return $version_id;
}

برای مطالعه بیشتر درباره مدیریت موقت، مطلب ترنزینت وردپرس و کش هوشمند بدون افزونه را ببینید.

امنیت و حق نشر

سه لایه امنیتی ضروری است:

  1. جداسازی حافظه ترجمه به‌ازای هر مشتری با کلید اختصاصی.
  2. ثبت لاگ هر دسترسی به حافظه ترجمه و متن مبدأ.
  3. رمزنگاری متن مبدأ در صورت محرمانه بودن.

برای مطالعه بیشتر درباره کدنویسی امن، مطلب نوشتن کد PHP امن برای وردپرس را ببینید. برای Nonce، مطلب نانس وردپرس و امنیت فرم را ببینید. برای امن‌سازی نشست‌ها، مطلب امن‌سازی نشست‌های کاربری را ببینید.

مرجع فنی این حوزه در ویکی‌پدیا، مقاله Translation مرور خوبی از تاریخ و اصول ترجمه ارائه می‌دهد.

پرسش‌های پرتکرار درباره تنظیمات نقش ترجمه

آیا می‌توانم از نقش Author برای مترجم استفاده کنم؟

خیر. Author به همه پست‌های خودش دسترسی دارد، اما هیچ مکانیزمی برای تفکیک پروژه ترجمه وجود ندارد. باید نقش سفارشی با Capability اختصاصی بسازید.

چگونه حافظه ترجمه را بین مشتریان جدا کنم؟

با استفاده از کلید اختصاصی هر مشتری در Options API. هر مشتری یک Namespace جداگانه دارد.

آیا مشتری باید به حافظه ترجمه خودش دسترسی داشته باشد؟

بله، اما فقط به‌صورت خواندنی. مشتری نباید بتواند حافظه ترجمه را ویرایش کند تا یکپارچگی آن حفظ شود.

چگونه کیفیت ترجمه را ارزیابی کنم؟

با یک سیستم امتیازدهی چندمعیاری: دقت، روانی، اصطلاحات. هر امتیاز باید با شناسه ارزیاب و نسخه ترجمه متصل باشد.

آیا استفاده از ترجمه ماشینی مفید است؟

به‌عنوان پیش‌نویس اولیه، بله. اما باید توسط مترجم انسانی بازبینی شود. مطلب استفاده از ابزارهای هوش مصنوعی برای ترجمه را ببینید.

اشتباهات رایج

اشتباه پیامد راه‌حل
حافظه ترجمه مشترک نشت مزیت رقابتی مشتری Namespace جداگانه به‌ازای مشتری
نقش یکسان برای همه مترجمان دسترسی به پروژه‌های غیرمجاز Capability اختصاصی + تخصیص دینامیک
نبود نسخه‌بندی عدم امکان ردیابی تغییرات CPT اختصاصی برای نسخه‌ها
متن مبدأ بدون رمزنگاری نشت محتوای محرمانه رمزنگاری AES-256-GCM
نبود لاگ دسترسی عدم امکان ممیزی ثبت هر دسترسی در جدول اختصاصی

نگاه معماری در سطح سیستم‌های ترجمه

در سطح معماری، سایت ترجمه با یک چالش بنیادین روبه‌روست: حافظه ترجمه یک دارایی است که با هر پروژه ارزشمندتر می‌شود، اما همین ارزشمندی، خطر نشت را افزایش می‌دهد. هر مشتری باید مطمئن باشد که حافظه ترجمه او به مشتری دیگر منتقل نمی‌شود.

رویکرد پیشنهادی، معماری «Multi-Tenant Translation Memory» است. هر مشتری یک Tenant است که حافظه ترجمه، واژه‌نامه، و پروژه‌های خودش را دارد. جداسازی در سطح دیتابیس با Prefix اختصاصی یا در سطح Schema با جدول جداگانه انجام می‌شود.

نکته دوم، بحث «Translation Quality Score» است. هر ترجمه باید یک امتیاز کیفیت داشته باشد که بر اساس معیارهای مشخص محاسبه می‌شود. این امتیاز می‌تواند در انتخاب مترجم برای پروژه‌های بعدی استفاده شود.

نکته سوم، بحث «Terminology Governance» است. واژه‌نامه هر مشتری باید یک چرخه تأیید داشته باشد تا اصطلاحات جدید فقط پس از تأیید مدیر واژه‌نامه به حافظه اضافه شوند.

پیشنهادهای عملی برای پیاده‌سازی

سه توصیه عملی که در پروژه‌های واقعی مؤثر بوده‌اند:

  1. حافظه ترجمه را به‌ازای هر مشتری در یک Namespace جداگانه ذخیره کنید.
  2. هر نسخه از ترجمه را با Hash محتوا و امضای مترجم ثبت کنید.
  3. یک Endpoint عمومی برای تأیید اصالت ترجمه طراحی کنید تا در صورت اختلاف، قابل استناد باشد.

اگر این چالش‌ها را در یک پروژه واقعی تجربه کرده‌اید، برای ما جالب است بدانید کدام بخش بیشترین زمان را گرفت: جداسازی حافظه ترجمه، نسخه‌بندی، یا مدیریت واژه‌نامه. تجربه خود را در دیدگاه‌ها بنویسید.