用poedit扫描html文件

时间:2015-10-15 09:51:35

标签: php html poedit

您好我想在Poedit中扫描html文件来翻译那里的文本。 我在html文件中有这样的代码:

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

我希望Poedit扫描单词翻译我就像扫描PHP文件而不使用PHP代码一样 纯HTML。

请给我有用的答案。我真的卡住了,我无法翻译我的模板。

我尝试在Poedit首选项中添加.html.htm,实际上它不会读取我的文字, 我在电子邮件中询问了Poedit服务中心,他们给了我一个自己的转变&#34;答案。

1 个答案:

答案 0 :(得分:0)

这是一个复杂的问题。基本答案是&#34; Poedit不会解析PHP函数内部的字符串,例如memory/usage,除非它们在_()包装器内#34;。您通过在扩展名列表中添加* .html来做正确的事情,但它仍然无法解析<?php ?>标记中未包含的字符串。

我的解决方案是将<?php ?>包装器放在文件中,即使它们不会被服务器解析或正确呈现,然后使用一些javascript来加载PHP标签。这允许Poedit在<?php ?>函数调用中解析字符串,同时在用户看到它们之前快速剥离丑陋的php标记。

下面是我今天解决这个问题的js代码(需要jQuery)。请注意,它没有经过全面测试,几乎肯定需要额外的工作。它目前仅支持少量元素类型,并且仅支持剥离_()_()函数。你必须提供你想要它的元素来剥离一个i18n类才能使它工作(完整的例子如下):

&#13;
&#13;
__()
&#13;
&#13;
&#13;

这将允许您将以下内容放入.html / .php文件中:

&#13;
&#13;
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);
        }
    });
});
&#13;
&#13;
&#13;

但是在js运行之后,用户只会看到:

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