چند زبانی و ترجمه متن در وردپرس

از آنجایی که وردپرس یک سیستم شناخته شده و محبوب در جهان است، ایجاد پلاگین هایی که کاربران مختلف با زبان های متفاوت بتوانند به راحتی با آنها کار کنند بسیار مهم است. خوشبختانه وردپرس تمهیدات لازم جهت ترجمه و چند زبانه سازی پلاگین ها را فراهم کرده است و با رعایت نکات لازم در فرآیند توسعه پلاگین می توان آنها را چند زبانه ساخت. به طور کلی، فرآیند ترجمه در وردپرس توسط فراخوانی یک سری از توابع که به همین منظور ایجاد شده اند انجام می پذیرد. این توابع رشته متن های موجود هر پلاگین را دریافت و با توجه به زبان سایت، از فایل ترجمه مربوطه متن ترجمه معادل را یافته و جایگزین می کنند.

آماده سازی پلاگین برای ترجمه

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

برای بارگذاری فایل های ترجمه معمولا از هوک اکشن plugin_loaded استفاده می نماییم.

مثال:

<?php
add_action( 'plugins_loaded','bmpt_load_textdomain' );
 function bmpt_load_textdomain() {
	  load_plugin_textdomain( 'bmpt-my-plugin', false, plugin_basename( dirname( __FILE__ ) ) . '/languages/' );
	}
?>

در مثال فوق فایل ترجمه پلاگین در داخل پوشه پلاگین فعلی (پوشه با نام bmpt-my-plugin) و زیرپوشه languages قرار دارد.

ترجمه و نمایش متن

وردپرس توابع زیادی برای ترجمه متون مختلف دارد که هر یک دارای کاربردهای خاص خود هستند. این توابع از دامنه متن تعیین شده در زمان بارگذاری فایل ترجمه برای یافتن ترجمه متون استفاده می کنند.

تابع __

این تابع دو پارامتر می پذیرد. پارامتر اول متن مورد نظر برای ترجمه و پارامتر دوم دامنه متنی که باید در آن به دنبال ترجمه متن بگردد. توجه داشته باشید که این تابع به صورت دو آندرلاین است.

مثال:

< ?php
             
$text = __( 'WordPress is a wonderful publishing platform.', 'bmpt-my-plugin' );
             
? >

تابع e_

همانند تابع قبلی دو پارامتر ورودی متن مورد نظر و دامنه متن را به همان ترتیب می پذیرد اما متن ترجمه معادل در خروجی به نمایش در می آید. (e نام تابع برای echo است)

مثال:

< ?php
   //display translated text as output          
_e( 'WordPress is a wonderful publishing platform.', 'bmpt-my-plugin' );
             
? >

تابع __esc_attr

این تابع نیز همانند تابع __() دو پارامتر متن مورد نظر و دامنه متن را به عنوان ورودی می پذیرد و کاربرد آن برای ترجمه متون مرتبط با صفات المان های HTML است.

<?php
             

function bmpt_terms_of_service_link() {
    return ' < a href=”http://example.com/tos" title="' .
    esc_attr__( 'Visit the Terms of Service page', 'bmpt-my-plugin' ) . '" > ' .
    __( 'Terms of Service', 'bmpt-my-plugin' ) . ' < /a > ';
}
             
/* Display the output of the bmpt_terms_of_service_link() function. */
echo bmpt_terms_of_service_link();
             
? >

تابع esc_attr_e

عملکردی مشابه تابع esc_attr__() دارد با این تفاوت که ترجمه را نیز به نمایش در می آورد.

تابع __esc_html

معادل تابع esc_html برای ترجمه است.

تابع esc_html_e

عملکردی مشابه تابع esc_html__() دارد با این تفاوت که ترجمه را نیز به نمایش در می آورد.

< textarea name="bmpt-text" id="bmpt-text" > 
     < ?php esc_html_e( 'Please input a description.', 'bmpt-my-plugin' ); ? > 
 < /textarea >

تابع x_

این تابع امکان ایجاد چند ترجمه برای یک متن را فراهم می آورد. این تابع سه پارامتر ورودی می پذیرد. پارامتر اول متن مورد نظر، پارامتر دوم فرامتن و پارامتر سوم دامنه متن پلاگین. در حالتی که متنی دارای چند ترجمه باشد، از فرامتن برای شناسایی ترجمه استفاده می شود.

مثال:

<?php
/* "Post" as a noun. */
$post_as_noun = _x( 'Post', 'noun', 'bmpt-my-plugin' );
             
/* "Post" as a verb. */
$post_as_verb =_x( 'Post', 'verb', 'bmpt-my-plugin' );
?>

تابع ex_

عملکردی مشابه _x() دارد با این تفاوت که ترجمه را به نمایش در می آورد.

تابع n_

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

مثال:

<?php
$rating = '3';
 
$text = sprintf( _n( '%s star', '%s stars', $rating, 'bmpt-my-plugin' ), $rating );
?>

تابع nx_

عملکرد این تابع ترکیبی از عملکرد _n() و _x() است و برای ترجمه حالات جمع یا مفرد متن های یکسان با توجه به فرامتن آنها مورد استفاده قرار می گیرد.

<?php
             
function bmpt_list_post_tag_counts() {
             
    /* Get all post tags in a list. */
    $tags = get_terms( 'post_tag', array( 'orderby' = >  'name', 'order' = >  'ASC' ) );
             
    /* Open unordered list. */
    echo ' < ul > ';
             
    /* Loop through each post tag and display its post count and name. */
    foreach ( $tags as $tag ) {
        echo ' < li > ';
        printf(
            _nx(
                '%s post',
                '%s posts',
                $tag- > count,
                'post count',
                'boj-plugin'
            ),
            $tag- > count
        );
        echo ' < /li > ';
    }
             
    /* Close unordered list. */
    echo ' < /ul > ';
}
             
?>   

تابع n_noop_

این تابع آرایه ای از ترجمه حالات جمع و مفرد را برای وضعیتی که مقدار تعیین کننده جمع و مفرد مشخص نیست بر می گرداند. در آرایه خروجی این تابع با استفاده از کلیدهای singular و plural می توان به ترتیب به ترجمه مفرد و جمع دسترسی پیدا کرد. سه پارامتر ورودی این تابع شامل متن حالت مفرد به عنوان پارامتر اول، متن حالت جمع به عنوان پارامتر دوم و دامنه متن به عنوان پارامتر سوم می باشد.

مثال:

< ?php
             
function bmpt_count_posts_of_custom_types( $post_type = ‘video’ ) {
             
    /* Get a count of all posts of the given post type. */
    $all_posts = wp_count_posts( $post_type );
    /* Get the count of the published posts. */
    $count = $all_posts- > publish;
             
    /* Prepare an array of messages. */
    $bmpt_messages = array(
        'video' = >  _n_noop( 'You have %s video.', 'You have %s videos.' ),
        'music' = >  _n_noop( 'You have %s music file.', 'You have %s music files.' )
    );
             
    /* Get the message for the custom post type given. */
    $bmpt_message = $bmpt_messages[$post_type];
             
    /* Print the message for the custom post type given and its count. */
             
    printf( _n(
        $bmpt_message['singular'],
        $bmpt_message['plural'],
        $count
    ), $count );
}
             
?>   

استفاده از placeholder

در مثال های قبلی از نشانه هایی مانند %s و %1$s در متن های ترجمه استفاده کردیم. به این نشانه های placeholder گفته می شود. این نشانه ها امکان استفاده از متغیرها در متن را بدون نیاز به شکستن آنها به اجزا جدا از هم فراهم می آورند. برای استفاده از نشانه ها در ترجمه متون از توابع printf و sprintf کمک می گیریم. تابع printf پس از جایگذاری متغیرها در متن آن را نمایش می دهد اما تابع sprintf متن را برمی گرداند.

مثال:

<?php
function bmpt_get_blog_tagline() {
    return sprint(
        __( 'The tagline of your site is %s.', 'bmpt-my-plugin' ),
        get_bloginfo('description' )
    );
}
?>

در مثال فوق، توضیحات سایت در انتهای جمله به جای %s جایگذاری می شود.

ایجاد فایل ترجمه

اغلب برنامه های ترجمه از فایل هایی با پسوند .pot برای ایجاد فایل های ترجمه متون پلاگین ها (فایل هایی با پسوند .po و .mo) استفاده می کنند. فایل های po برای استفاده کاربران و مترجمان در جهت ترجمه متون استفاده می شود. در واقع مترجمان از طریق ابزارهای ترجمه تغییرات لازم را بر روی این فایل ها اعمال می کنند و پس از اتمام فرآیند ترجمه، فایل های mo که پلاگین ها از آنها برای ترجمه استفاده می کنند، ایجاد می شوند. شیوه نام گذاری این فایل ها به صورت $domain_name-$locale.po و $domain_name-$locale.mo است که $domain_name دامنه متن پلاگین (نام پوشه پلاگین) و $locale بیانگر زبان و کشور فایل ترجمه است. به عنوان مثال فایل های ترجمه پلاگین my-custom-plugin برای زبان انگلیسی به صورت my-custom-plugin-en_US.mo و my-custom-plugin-en_US.po و برای زبان فارسی به صورت my-custom-plugin-fa_IR.po و my-custom-plugin-fa_IR.mo خواهد بود.

برای ایجاد فایل های ترجمه نیاز به استفاده از یکی از ابزارهای ترجمه داریم. در اینترنت برنامه های زیادی برای ایجاد فایل های ترجمه وجود دارند که هر یک از روش خاصی برای این منظور استفاده می نمایند. یکی از برنامه های متداول poedit است.

برای ایجاد فایل ترجمه در برنامه poedit مراحل زیر را دنبال کنید:

1) از منو بالا بر روی File رفته و بر روی New کلیک کنید.

2) در پنجره باز شده زبان مورد نظر را انتخاب کنید.

3) از منوی بالا بر روی Catalog رفته و properties را انتخاب کنید.

4) در پنجره باز شده اطلاعات پروژه را در تب اول وارد کنید.

5) به تب سوم (Source Keywords) بروید. در این قسمت می توانید توابع ترجمه مورد استفاده در کدتان را با دکمه New Item وارد کنید. سپس بر روی OK کلیک کنید.

6) در منوی بالا بر روی File رفته و Save as را بزنید.

7) با توجه به قاعده نام گذاری که گفته شد، فایل pot را در پوشه languages پلاگین ایجاد کنید.

8) از منوی بالا مجدد به Catalog و بعد properties بروید.

9) در پنجره باز شده به تب دوم (Source Paths) بروید.

10) مقدار Base Path را برابر ../ قرار دهید.

11) بر روی دکمه New Item کلیک کنید و مقدار . را وارد کنید و بر روی OK کلیک کنید.

12) در پنجره پروژه بر روی Update کلیک کنید و سپس برای ذخیره تغییرات از منوی File بر روی Save کلیک کنید.

در برنامه poedit در صورتی که تغییرات در کدها ایجاد کردید که بر روی ترجمه متون تاثیرگذار است، از طریق منوی بالا به Catalog بروید و بر روی Update from source code کلیک کنید تا تغییرات در فایل ترجمه لحاظ شود. همچنین برای ایجاد فایل mo نیز می توانید پس از ذخیره سازی تغییرات، از منوی بالا به File رفته و بر روی Compile to MO کلیک کنید.

Related posts