2015-05-08 2 views
3

В PHP, особенно в Wordpress, какая разница между __('string') и _x('string')?В чем разница между «двойным подчеркиванием» и «подчеркиванием x»?

Я читаю документацию Wordpress и смущен. Следующий хороший пример путаницы черпается из примера кода на Wordpress doc для register_post_type():

$labels = array(
    'name'    => _x('Books', 'post type general name', 'your-plugin-textdomain'), 
    'singular_name'  => _x('Book', 'post type singular name', 'your-plugin-textdomain'), 
    'menu_name'   => _x('Books', 'admin menu', 'your-plugin-textdomain'), 
    'name_admin_bar'  => _x('Book', 'add new on admin bar', 'your-plugin-textdomain'), 
    'add_new'   => _x('Add New', 'book', 'your-plugin-textdomain'), 
    'add_new_item'  => __('Add New Book', 'your-plugin-textdomain'), 
    'new_item'   => __('New Book', 'your-plugin-textdomain'), 
    'edit_item'   => __('Edit Book', 'your-plugin-textdomain'), 
    'view_item'   => __('View Book', 'your-plugin-textdomain'), 
    'all_items'   => __('All Books', 'your-plugin-textdomain'), 
    'search_items'  => __('Search Books', 'your-plugin-textdomain'), 
    'parent_item_colon' => __('Parent Books:', 'your-plugin-textdomain'), 
    'not_found'   => __('No books found.', 'your-plugin-textdomain'), 
    'not_found_in_trash' => __('No books found in Trash.', 'your-plugin-textdomain') 
); 
+0

См [ '_x()'] (https://codex.wordpress.org/Function_Reference/_x) и [ '__()'] (https: //codex.wordpress. org/Function_Reference/_2) → аргумент контекста. – mario

ответ

2

В WordPress, как _x() и __() являются функциями перевода. _x() позволяет определить контекст для перевода:

<?php _x($text, $context, $domain); ?> 

__() В то время как это не так:

<?php __($text, $domain); ?> 

Опция контекста является полезной для различных ситуаций, когда дословный перевод может не дает желаемый результат.

Поскольку строка «Read» сама по себе может иметь одно из нескольких значений на английском языке, предоставляется контекст, чтобы переводчики знали, что они должны поставлять короткий термин, который означает «Книги, которые я прочитал».

Некоторые другие примеры могут быть: "дата", "тип", "вправо", "листья" и т.д.

Источник: WordPress Codex

3

__(..) делает прямой перевод из строки А в строку B

_x(..) позволяет предоставить контекст. Например, скажем, у вас есть две строки на английском языке, которые означают одно и то же, но на другом языке может означать не одно и то же, тогда вы можете использовать _x для предоставления контекста, чтобы, хотя ваши строки были одинаковыми на английском, вы можете перевести их до 2 разных строк на другом языке.

Так как, например, в вашем вопросе у вас есть

__('All Books', 'your-plugin-textdomain'),

который использует __ потому, что автор должен подумать, «„Все книги“всегда будет означать„Все книги“в любом контексте, что этот термин используемый". Однако давайте рассмотрим USECASE для _x:

_x('Books', 'post type general name', 'your-plugin-textdomain')

Так вот автор имел в виду «,„Книги“является очень общий термин, в зависимости от контекста, в котором мы использовали термин„Книги“в нашем приложении, мы можем перевести этот термин по-разному »- и, следовательно, дополнительные параметры используются в качестве контекста. При переводе «Книги» на другой язык из вышеуказанной строки мы бы знали, что мы говорим о книгах в контексте текстового домена нашего плагина.

Источник: http://wpengineer.com/2237/whats-the-difference-between-__-_e-_x-and-_ex/

Смежные вопросы