Я пытаюсь создать способ разрешить членам переводить строки на другие языки. Здесь вы можете увидеть пример: ИСПЫТАНИЕ ПЕРЕВОДОВ
Кто-то рекомендовал, чтобы я использовал собственную функцию gettext () php для этого, вместо того, что я уже использую для загрузки языковых файлов, что и есть:
function loadLanguageFile($language, $file) { $temp = array(); $data = file_get_contents('./'.$language.'/'.$file.'.'.$language.'.php'); $codes = array ( '/(\'\s*\.\s*\$)(.+?)(\s*\.\s*\')/', '/(=\s*\$)(.+?)(\s*\.\s*\')/', '/(\'\s*\.\s*\$)(.+?)(;)/', '/(\[\')(.+?)(\'\])/', '/<\?php/s', '/\?>/s', '/<\?/s' ); $html = array ( '{$2}', '= \'{$2}', '{$2}\';', '[$2]', '', ); // Since we don't have the values for the vars. $data = preg_replace($codes, $html, $data); // We must change this because they are global. $data = str_replace('$txt', '$langEditor_txt', $data); $data = str_replace('$helptxt', '$langEditor_helptxt', $data); eval($data); if (isset($langEditor_txt)) { $temp['txt'] = $langEditor_txt; unset($GLOBALS['langEditor_txt']); } if (isset($langEditor_helptxt)) { $temp['helptxt'] = $langEditor_helptxt; unset($GLOBALS['langEditor_helptxt']); } return $temp; }
Строки содержатся в файле, который называется так: ManageDPModules.english.php DreamPortal.english.php и т. Д.
Эти файлы могут выглядеть следующим образом: при открытии в любом php-редакторе и могут иметь много из этих переменных $ txt:
<?php // Dream Portal (c) 2009-2010 Dream Portal Team // DreamPortal.english.php; @1.1 global $scripturl, $context; // General Strings $txt['forum'] = 'Forum'; $txt['dream_portal'] = 'Dream Portal'; $txt['dp_core_modules'] = 'Collapse or Expand this Module'; $txt['dp_who_forum'] = 'Viewing the forum index of <a href="' . $scripturl . '?action=forum">' . $context['forum_name'] . '</a>.'; $txt['dp_who_portal'] = 'Viewing the portal index of <a href="' . $scripturl . '">' . $context['forum_name'] . '</a>.'; $txt['dp_who_page'] = 'Viewing the page "<a href="' . $scripturl . '?page=%1$s">%2$s</a>".'; ?>
Для сохранения переводов я использую следующую функцию:
function langSave($lang, $file) { // We just don't get values from the form, they have to exist in the english files to be taken seriously. $default = loadLanguageFile('english', $file); if ($default['txt']) { foreach ($default['txt'] as $key=>$string) { if (isset($_REQUEST['txt'.$key]) && str_replace(' ', '', $_REQUEST['txt'.$key]) != '') { $data.='$txt[\''.$key.'\'] = \''.str_replace("'", "\'", $_REQUEST['txt'.$key]).'\';'."\n"; } } } if ($default['helptxt']) { foreach ($default['helptxt'] as $key=>$string) { if (isset($_REQUEST['helptxt'.$key]) && str_replace(' ', '', $_REQUEST['helptxt'.$key]) != '') { $data.='$helptxt[\''.$key.'\'] = \''.str_replace("'", "\'", $_REQUEST['helptxt'.$key]).'\';'."\n"; } } } if (isset($data)) { $codes = array (// '' . $test . ' '/(\{)(.+?)(\})/', '/(\'\' \. \$)(.+?)( \. \')/', '/(\' \. \$)(.+?)( \. \'\')/', '/(\[\')(.+?)(\'\])/', '/(\[)(.+?)(\])/', ); $html = array ( '\' . \$$2 . \'', '\$$2 . \'', '\' . \$$2', '[$2]', '[\'$2\']', ); // Convert the data back to normal. $data = preg_replace($codes, $html, $data); $data = '<?php'."\n".$data.'?>'; file_put_contents('./'.$lang.'/'.$file.'.'.$lang.'.php', $data); } languageHome(); }
Языковая функция:
function languageHome() { $languages = loadLanguageList(); echo ' Language List <table>'; foreach ($languages as $language) { echo ' <tr> <td> '.$language.' </td> <td> <a href="index.php?op=langView&lang='.$language.'">View</a> </td> </tr>'; } echo ' </table>'; }
Я не вижу, как gettext поможет. Невозможно обновить текстовый каталог без перезагрузки сервера каждый раз. Может быть, если кто-то может создать демо для меня?
Кроме того, хотелось бы, чтобы он поддерживал UTF-8. Данные должны быть согласованными.
Итак, что не так с этой реализацией? Зачем использовать gettext? Как его можно использовать для улучшения перевода для работы как с языковыми строками UTF-8, так и с языком UTF-8, чтобы он мог быть переведен.
EDIT: Обратите внимание, что файлы в конечном итоге должны быть переименованы в: ManageDPModules.[language].php
, DreamPortal.[language].php
и т. Д. И т. Д., Чтобы переводы работали. Итак, как каталоги помогут мне в этом отношении? Если вы хотите увидеть возможные END-RESULT Translations, вы можете скачать языковой пакет, расположенный здесь, и открыть языковые файлы .german.php, чтобы посмотреть, как он будет выглядеть после того, как участник отправит язык в файл по файлу. Отмечено, что некоторые из этих пакетов имеют строки UTF-8, а некоторые нет. Имя файла пакета сообщит вам об этом. Было бы неплохо, если бы я мог также поддержать его UTF-8, но это не является обязательным требованием. Обратите внимание: я не собираюсь создавать полные пакеты здесь. Я просто хочу создать языковой файл. [Language] .php со всеми переведенными строками внутри них (что мой код уже делает).
Хорошо, я предоставил ENTIRE файл index.php для этого, чтобы вы могли видеть, что именно он делает, когда выполняете переводы. Вот файл index.php для этого, и вам понадобятся некоторые файлы на английском языке: DreamPortal.english.php , ManageDPModules.english.php и DreamHelp.english-utf8.php . Теперь, чтобы увидеть это, вам нужно загрузить на сервер, index.php, создать несколько папок, где указан index.php, вызвать 1 английский и создать там папку для каждого дополнительного языка (я сделал 2 папки, испанский и французский), чем загрузить 3 языковых файла в английскую папку. Запустите index.php в своем браузере, и вы увидите, что он работает.
Теперь, как я мог использовать gettext для каталогов с этим SAME. Мне нужно включить онлайн-перевод файлов. Мне нужно создать PHP-файлы переводов в стиле SAME, которые имеют файлы .english.php с тем же PREFIX, что и раньше .english.php
, и мне нужно изменить язык в имени файла на тот же язык, определенный для имя папки. Онлайн-переводы – это единственный способ. Необходимость переводчика ТОЛЬКО для перевода строк. Они не должны сосредотачиваться на установке программ, их упаковке, переименовании файлов и т. Д. И т. Д. Это делает этот процесс настолько безболезненным, насколько это возможно, позволяя делать это онлайн. И я знаю, что есть способ сделать это и даже для поддержки UTF-8. Но я использую лучший метод, который я знаю как на данный момент. Но многие из вас МНОГО умнее в этом, чем я, поэтому я прошу помощи у вас, ребята.
Есть ли кто-нибудь, кто может показать мне лучший способ? Пример, подобный тому, который я дал вам в этом вопросе?
Мне нужно, чтобы переводы выполнялись ONLINE от переводчиков, а также хотели бы, чтобы он поддерживал файлы UTF-8, а также файлы без UTF-8. Мне нравится, как у меня есть настройка для ссылки, приведенной выше ( TRANSLATIONS TEST ), чтобы переводчик мог просто выполнять переводы онлайн и не беспокоиться ни о чем другом, и он автоматически создавал нужные файлы. Который будет совпадать с английским именем файла языка с именем папки (представляющим язык) после первого . (точка), и он должен иметь расширение .php (как в коде, который я использую в настоящее время). Поэтому в основном мне нужна адаптация текущего index.php для поддержки UTF-8 и не UTF-8 для всех или большинства языков, и ему сказали, что с помощью gettext () и файлов каталога это поможет.
Ищете модифицированную версию моего текущего index.php для использования gettext () таким образом, чтобы он поддерживал большинство, если не все, языков и переводов. REGEX, который я получил для preg_replace, не является полностью удовлетворительным, потому что он, кажется, помещает переднюю косую перед двойными кавычками при сохранении / отправке переводов. Поэтому, возможно, также потребуется улучшение на preg_replace.
Я представил полный пример с ACTUAL CODE bytheway. Я бы хотел, чтобы кто-то изменил этот пример, с КОДОМ, который я предоставил вместо USE GETTEXT, и поддерживаю UTF-8. Или на самом деле предоставить АКТУАЛЬНЫЙ МЕТОД, чтобы я сделал это сам. Не ищите кучу ссылок, которые я могу найти самостоятельно!
Спасибо!
Когда вам рекомендуется использовать gettext, на самом деле рекомендуется использовать gettext- like систему перевода. Ваш текущий код сложный из-за мнемонических текстовых указаний. И проблема, с которой вы столкнулись с регулярными выражениями для редактирования, вызвана путаницей переменных. Позвольте мне предложить альтернативный код для переходных целей.
Красота gettext заключается в использовании ненавязчивого API. Вызов функции _()
достаточно прост, чтобы полностью использоваться без добавления синтаксиса или раздувания кода. Он предпочитает такие вещи, как getTextTrans('ABBR_TXT_ID')
. Использование таких мнемонических текстовых идентификаторов является широко распространенной ошибкой; потому что на практике не часто повторяются слова и _("Raw english original text.")
. Однако, поскольку у вас уже есть мнемонические ключи, держите их, если это слишком много для изменения. Это всего лишь рекомендация.
Реальная проблема заключается в использовании встроенных выражений PHP для создания строк перевода. Именно поэтому регулярные выражения для вашего редактора переводов стали непрозрачными. Поэтому я настоятельно рекомендую использовать статические строки и предоставить заполнители. Функция перевода должна быть поручена с ее обработкой. (Не беспокойтесь о микрооптимизации здесь!) – Я бы использовал, например, {$url_xy}
заполнители стиля PHP / Smarty:
$txt['dp_who_forum'] = 'Viewing the forum index of <a href="{$scripturl}?action=forum">{$forum_name}</a>.';
И функция перевода, которая ищет глобальную таблицу-заполнитель или параметры ($ context) для замены:
function __($text, $params=array()) { global $txt, $txt_placeholders; if (isset($txt[$text])) { $text = $txt[$text]; } if (strpos($text, '{$')) { $params = array_merge($params, $txt_placeholders); $text= preg_replace("/\{\$(\w+)\}/e", "$params['$1']", $text); } return $text; }
Оптимизируемое. Но таким образом вы можете использовать статический мнемонический-> текстовый или английский-> текстовый набор трансляционных массивов. Вы используете только статические строки в текстовом редакторе-редакторе. Эти статические строки отображаются как-есть, и ваши переводчики редактируют текст на английском языке, но не в {$placeholders}
.
Следовательно, ваш код для функции перевода не будет нуждаться в каких-либо сложных регулярных выражениях (в этом случае они не являются полезными) для сопоставления строк и встроенных переменных PHP. Фактически гораздо более простая комбинация include()
и var_export()
теперь может занять свое место:
function langSave($lang, $file) { $txt = array(); include($file); // assuming it contains a simple $txt = array(... foreach ($txt as $key=>$string) { $txt[$key] = $_REQUEST["txt$key"]; } file_put_contents($file, "<?php\n\$txt =".var_export($txt,1).';?>'); }
Обработка файлов и многое другое нужно настраивать, конечно. Но все же это более простой подход.
И это также позволит вам перейти к одному из вариантов gettext как backend. Сохраните свою пользовательскую функцию-обертку __()
и используйте, например, Zend_Translate в качестве backend. Это позволяет вам использовать файлы перевода .php $ txt = array () (или, я думаю, так), или перейти к файлам .mo / .po gettext-style. Преимущество этого заключается в том, что есть богатая поддержка инструмента в отличие от доморощенных решений.
В любом случае, это то, как вы используете материал в своем основном приложении:
print "<a href='...'>" . __("link_text") . "</a>"; print __("dp_forum_link"); // uses eg $txt_placeholder["scripturl"] print __("dp_param_link", array("scripturl"=>"http://override..."));
Вначале было бы желательно перейти от клавиш short_txt к англо-английским> чужеродным текстам, но теоретически любой из бэкэндов из ответа dvbs будет применим. Теперь вы уже сказали, что родной gettext не является для вас вариантом (для PHP, не относящихся к fastcgi, сопротивление памяти является недостатком). Но PHP-возможности для встроенных функций INTL могут вам помочь. В частности, http://www.php.net/manual/en/class.messageformatter.php может быть более полезной, чем простая оболочка замены {$ var}, которую я вам дал. Но я никогда не использовал его, и я думаю, что Zend_Translate, скорее всего, более полезен. В частности, любой из этих бэкендов дает вам независимость от набора символов. Лично я бы просто придерживался UTF-8, несмотря ни на что. Но, например, файлы gettext .mo / .po могут иметь свою собственную кодировку.
Зачем изобретать колесо? Может быть, я не понимаю, но я уверен, что то, что вы пытаетесь сделать, было сделано раньше.
Просто используйте одно из многих существующих решений.
Вот о чем подумать, когда принимаете решения:
Вот некоторые (случайным образом упорядоченные):
Удачи!
Обновление: спасибо, Эль-Йобо. Я отметил это как вики сообщества, любой может отредактировать или ответить другим проектам, если найдет что-то еще.