Сканировать html файлы в poedit

Привет, я хочу сканировать html-файлы в Poedit, чтобы переводить туда текст. У меня есть такой код в html файле:

<a href="/test">_("translate me")</a>

и я хочу, чтобы Poedit сканировал слово, переводя меня так же, как он сканирует файл PHP, не используя коды PHP, только чистый html.

Пожалуйста, дайте мне полезный ответ. Я действительно застрял, я не могу перевести свой шаблон.

Я пытался добавить .html, .htm в настройках Poedit и на самом деле он не читает мои слова, я спросил сервисный центр Poedit по электронной почте, и они дают мне ответ "сдвиг для себя".


person kfir91    schedule 15.10.2015    source источник


Ответы (1)


Это сложная проблема. Основной ответ: «Poedit не будет анализировать строки внутри функций PHP, таких как _(), если они не находятся внутри <?php ?> оболочек». Вы поступили правильно, добавив *.html в список расширений, но он все равно не будет анализировать строки, не содержащиеся в тегах <?php ?>.

Мое решение состоит в том, чтобы поместить <?php ?> обертки в файл, даже если они не будут проанализированы сервером или отображаться правильно, а затем использовать некоторый javascript для удаления тегов PHP при загрузке. Это позволяет Poedit анализировать строки внутри вызовов функций _(), быстро удаляя уродливые теги php до того, как пользователь их увидит.

Ниже приведен код js, который я собрал для решения этой проблемы сегодня (требуется jQuery). Имейте в виду, что он не полностью протестирован и почти наверняка нуждается в дополнительной доработке. В настоящее время он поддерживает только небольшое количество типов элементов и поддерживает только удаление функций _() и __(). Вы должны указать элементы, которые вы хотите, чтобы он разделил класс i18n, чтобы это работало (полный пример ниже):

function _get_elem_translatable_string(elem) {
    // Get attr_name
    attr_name = _get_attr_name(elem);

    // Get current translatable value
    if (attr_name == 'html') {
        str = $(elem).html();
    }else{
        str = $(elem).attr(attr_name);
    }

    // Return
    return str;
}
function _set_elem_string(elem, str) {
    // Get attr_name
    attr_name = _get_attr_name(elem);
    
    // Update the element
    if (attr_name == 'html') {
        // Set html for 'normal' elements
        $(elem).html(str);
    }else if (attr_name == 'value') {
        // Set value for 'value' elements (typically a submit input)
        $(elem).val(str);
    }else{
        // Set attr value for other elements
        $(elem).attr(attr_name, str);
    }
}
function _get_attr_name(elem) {
    // Determine attr that will be affected based on tag type of elem
    if ($(elem).is('input') && ($(elem).attr('type') == 'text' || $(elem).attr('type') == 'password')) {
        attr_name = 'placeholder';
    }else if ($(elem).is('input') && $(elem).attr('type') == 'submit') {
        attr_name = 'value';
    }else{
        attr_name = 'html';
    }

    // Return
    return attr_name;
}
function _contains_php_gettext(str) {
    // bool: Is the string is a php tag containing a call to 'echo _()'?
    regexp = _php_regexp();
    if (str.match(regexp))
        return true;
}
function _strip_php_gettext(str) {
    // If the string is a php tag containing a call to 'echo _()', strip to PHP tag
    regexp = _php_regexp();
    if (str.match(regexp)) {
        // Detect if delimieter is apostrophe or quotation mark
        delim = (str.match(/echo[ \t]*_\('/) ? "'" : (str.match(/echo[ \t]*_\("/) ? '"' : ''));

        // Strip tag
        str = str.replace(regexp, "$2");

        // Strip escape chars
        if (delim == "'")
            str = str.replace(/\\'/, "'");
        if (delim == '"')
            str = str.replace(/\\"/, '"');
    }

    // Return
    return str;
}
function _php_regexp() {
    return /^<(!--)*\?php[ \t]*echo[ \t]*_\(['"](.*)['"]\)[ \t;]*\?[-]*>/i;
}

// Start when document ready
$(document).ready(function() {
    // Convert non-parsed PHP tags (for instance if this page is running on a server that does not run PHP)
    $('.i18n').each(function(i, elem) {
        // Get translatable string from elem
        str = _get_elem_translatable_string(elem);

        // Strip PHP, ITIS
        if (_contains_php_gettext(str)) {
            // Set
            _set_elem_string(elem, _strip_php_gettext(str), true, true);
        }
    });
});

Это позволит вам поместить в файл .html/.php следующее:

<a href="/test" class="i18n"><?php echo _("translate me"); ?></a>

Но после запуска js пользователь увидит только:

<a href="/test" class="i18n">translate me</a>

person Matt Rabe    schedule 04.11.2015