Здравствуйте, я хочу сканировать HTML-файлы в Poedit, чтобы перевести текст там.
У меня есть код в HTML-файл, как это:
<a href="/test">_("translate me")</a>
и я хочу, чтобы Poedit отсканировал слово перевести меня так, как будто он сканирует PHP-файл без использования только PHP-кодов
чистый HTML.
Пожалуйста, дайте мне полезный ответ. Я действительно застрял, я не могу перевести мой шаблон.
Я пытался добавить .html
, .htm
в настройках Poedit и на самом деле он не читает мои слова,
Я спросил в сервисном центре Poedit по электронной почте, и они дали мне ответ «смена для себя».
Это сложная проблема. Основной ответ: «Poedit не будет анализировать строки внутри функций PHP, таких как _()
если они не в пределах <?php ?>
wrappers «. Вы правильно сделали, добавив * .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);
}
});
});
Других решений пока нет …