2015-10-15 66 views
-2

你好我想在Poedit中掃描html文件來翻譯那裏的文本。 我有這樣的HTML文件中的代碼:在poedit中掃描html文件

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

,我想poEdit的掃描字像他掃描PHP文件,而無需使用PHP代碼只 純HTML翻譯我。

請給我有幫助的答案。我真的卡住了,我無法翻譯我的模板。

我試圖添加.html.htm在poEdit的喜好和實際它不讀我的話, 我問電子郵件poEdit的服務中心,他們給我一個答案「爲自己的轉變」。

回答

0

這是一個複雜的問題。基本答案是「Poedit不會解析PHP函數內部的字符串,例如_(),除非它們位於<?php ?>包裝內」。通過將* .html添加到擴展列表中,您做了正確的事情,但它仍然不會解析<?php ?>標記中未包含的字符串。

我的解決方案是將<?php ?>包裝放在文件中,即使它們不會被服務器解析或正確渲染,然後在加載時使用一些JavaScript去除PHP標籤。這允許Poedit解析函數調用中的字符串,同時在用戶看到它們之前快速地去除醜陋的php標籤。

下面是我今天放在一起解決這個問題的js代碼(需要jQuery)。請注意,它沒有完全測試,並且幾乎肯定需要額外的工作。它目前僅支持少數幾種元素類型,僅支持剝離_()__()函數。你必須給你希望它剝奪一類國際化,以便元素這個工作(以下完整的示例):

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>