Как предоставить переводы для плагина WordPress TinyMCE?


Я знаю, что могу выполнить свои переводы на JavaScript, выполнив:

    $MyTranslations = array(
        'translation1' => __("Some String 1", "MyTranslations"),
        'translation2' => __("Some String 2", "MyTranslations")
    );
    wp_localize_script( 'jquery', 'my_translations', $MyTranslations );

Но, глядя на некоторые плагины WordPress TinyMCE, они используют такие вызовы:

{
title : ed.getLang('advlink.link_desc'),
...
}

Как WordPress переводит свои переводы на getLang()? Должен ли я делать это таким образом или я просто использую свой первый бит кода и получаю доступ к переменным напрямую, например:

{
title : my_translations.translation1,
...
}
Author: Scott, 2012-03-07

2 answers

Используйте фильтр 'mce_external_languages'. От wp-includes/class-wp-editor.php:

Следующий фильтр загружает внешние языковые файлы для плагинов TinyMCE. Он принимает ассоциативный массив 'plugin_name' => 'путь', где путь - это путь включения к файлу. Языковой файл должен иметь тот же формат, что и /tinymce/langs/wp-langs.php, и должен определять переменную $strings, которая содержит все переведенные строки. Если этот фильтр не используется, функция попытается загрузить {mce_locale}.js. Если это не будет найдено, en.js будет предпринята следующая попытка.

$mce_external_languages = apply_filters('mce_external_languages', array());

Я бы просто использовал копию wp-includes/js/tinymce/langs/wp-langs.php... и отбросил бы это лишнее mce_escape() в пользу оригинала esc_js().

Пример файла:

<?php # -*- coding: utf-8 -*-

$strings = 'tinyMCE.addI18n(
    {' . _WP_Editors::$mce_locale . '.extrastrings:
        {
            helloworld: "' . esc_js( __( 'Hello World', 'my_plugin_text_domain' ) ) . '",
            foobar: "' . esc_js( __( 'Foo Bar', 'my_plugin_text_domain' ) ) . '"
        }
    }
)';

В своем плагине вы просто используете:

add_filter( 'mce_external_languages', 'wpse_44785_add_tinymce_lang', 10, 1 );

function wpse_44785_add_tinymce_lang( $arr )
{
    $arr[] = 'full_path_to_lang_file.php';
    return $arr;
}

Для доступа к новым строкам в JavaScript используйте, например:

title : ed.getLang('extrastrings.helloworld')
 7
Author: fuxia, 2014-04-18 12:46:03

Ваш пример файла вызвал у меня ошибку (не определено. перед экстрастроками ). Поэтому я изменил код:

<?php # -*- coding: utf-8 -*-

$strings = 'tinyMCE.addI18n( "' . _WP_Editors::$mce_locale . '.extrastrings", {
    title: "' . esc_js( __( 'Shortcodes', 'm7' ) ) . '",
    popup_title: "' . esc_js( __( 'Шорткоды', 'm7' ) ) . '"
} )';
 1
Author: Maikal, 2013-09-13 22:51:01