добавление языковых констант в компонент Joomla javascript

мой компонент включает файл сценария java:

$doc->addScript("/components/com_cam/js/cam.js");

у меня есть несколько сообщений на стороне клиента, которые я хотел бы добавить с языковыми константами, т. е.

<?php echo JText::_('COM_CAM_SEND_LABEL'); ?>

достаточно легко в вашем интерфейсном php-коде, как по умолчанию.php но как насчет сообщений внутри cam.js?

например, моя проверка jquery:

        messages: {
            cam: {
                required: "Enter a label",
                minlength: jQuery.format("At least {0} characters required!"),
                maxlength: jQuery.format("Maximum {0} characters allowed!")
            }
        }

какова наилучшая практика для этого?

2 ответов


В Joomla! 2.5 (с 1.6 я считаю) есть JText::script() что добавляет поддержку добавления языковых ключей к глобальному array() чтобы ваш Javascript мог получить к ним доступ.

во-первых, в вашем PHP вы можете позвонить JText::script('COM_MYCOMPONENT_MSG1'); для каждой строки вам нужно перевести в Javascript.

вы можете использовать встроенный Joomla.JText._('COM_MYCOMPONENT_MSG1') в вашем Javascript, чтобы получить его.

когда вы доберетесь до точки, где есть много строк для преобразования вы можете найти его проще просто разобрать файл javascript во время выполнения (in-efficient yada yada, но для back-end admin screens не такое уж большое дело).

/**
 * Parses a javascript file looking for JText keys and then loads them ready for use.
 *
 * @param   string  $jsFile  Path to the javascript file.
 *
 * @return bool
 */
public  static function loadJSLanguageKeys($jsFile)
{
    if (isset($jsFile))
    {
        $jsFile = JPATH_SITE . $jsFile;
    }
    else
    {
        return false;
    }

    if ($jsContents = file_get_contents($jsFile))
    {
        $languageKeys = array();
        preg_match_all('/Joomla\.JText\._\(\'(.*?)\'\)\)?/', $jsContents, $languageKeys);
        $languageKeys = $languageKeys[1];

        foreach ($languageKeys as $lkey)
        {
            JText::script($lkey);
        }
    }
}

создайте вспомогательную функцию для создания сообщений проверки и добавьте ее в head.

что-то вроде bellow, просто отредактируйте его в соответствии с вашими потребностями

$messages = '(function ($) {
    $.extend($.validator.messages, {
            cam: {
                required: "' . JText::_('COM_CAM_VALIDATION_REQUIRED') . '",
                minlength: jQuery.format("' . JText::_('COM_CAM_VALIDATION_MINIMUM') . '"),
                maxlength: jQuery.format("' . JText::_('COM_CAM_VALIDATION_MAXIMUM') . '")
            }
        });
}(jQuery));';

$doc = JFactory::getDocument();
$doc->addScriptDeclaration($messages);