Как Вы локализуете базу данных управляемый веб-сайт

Вместо того, чтобы пытаться анализировать HTML с помощью регулярных выражений , как вы предложили, я решил вместо этого использовать класс DOMDocument.

function remove_domain($str, $domainsToRemove)
{
    $domainsToRemove = is_array($domainsToRemove) ? $domainsToRemove : array_slice(func_get_args(), 1);

    $dom = new DOMDocument;
    $dom->loadHTML("
{$str}
", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $anchors = $dom->getElementsByTagName('a'); // Code taken and modified from: http://php.net/manual/en/domnode.replacechild.php#50500 $i = $anchors->length - 1; while ($i > -1) { $anchor = $anchors->item($i); foreach ($domainsToRemove as $domain) { if (strpos($anchor->getAttribute('href'), $domain) !== false) { // $new = $dom->createElement('p', $anchor->textContent); $new = $dom->createTextNode($anchor->textContent); $anchor->parentNode->replaceChild($new, $anchor); } } $i--; } // Create HTML string, then remove the wrapping div. $html = $dom->saveHTML(); $html = substr($html, 5, strlen($html) - (strlen('
') + 1) - strlen('
')); return $html; }

Вы можете использовать приведенный выше код в следующих примерах.
Обратите внимание, как вы можете передать строку в качестве домена для удаления, или вы можете передать массив доменов, или вы можете воспользоваться func_get_args и передать бесконечное число параметров.

$str = <<fsdf
    fgddf
    domain 
googled
str;

// Example usage
remove_domain($str, 'domainurl.com');
remove_domain($str, 'domainurl.com', 'googlead.com');
remove_domain($str, ['domainurl.com', 'googlead.com']);

Во-первых, я сохранил вашу строку в переменной, но это только для того, чтобы я мог использовать ее для ответа; замените $str тем, откуда вы получите этот код.

Функция loadHTML принимает строку HTML, но требует одного дочернего элемента - поэтому я заключила строку в элемент div.

Цикл while будет перебирать элементы привязки, а затем заменять любые, которые соответствуют указанному домену, только содержимым тегов привязки.
Обратите внимание, я оставил в комментарии над этой строкой, которую вы можете использовать вместо. Это заменит элемент привязки тегом p, который будет иметь стиль по умолчанию display: block;, означающий, что ваш макет вряд ли будет поврежден. Однако, поскольку вы ожидаете вывод только текстовых узлов, я оставил это как опцию.

Живая демо

17
задан sontek 2 October 2008 в 00:11
поделиться

5 ответов

По-моему, локализование динамического контента (например, Ваш FAQ) должно быть сделано Вами в Вашей базе данных. В зависимости от того, как хранятся Ваши вопросы, я, вероятно, создал бы столбец "локали" и использование это при выборе вопросов о FAQ из базы данных. Я не уверен, масштабировалось ли это очень хорошо, когда Вы начали локализовать много таблиц.

Для статического содержания (например, сформируйте полевые маркировки, статический текст, значки, и т.д.), необходимо, вероятно, очень хорошо использовать основанные на файле ресурсы. Если бы Вы действительно хотели, однако, похоже, что не было бы супер трудно создать пользовательскую реализацию провайдера ресурсов, которая могла обработать это.

Вот некоторые ссылки по теме:

16
ответ дан 30 November 2019 в 13:46
поделиться

Для данного объекта в Вашей модели данных, разделение часть описания в локализованную таблицу со столбцом Id локали (LCID).

, Таким образом, таблица для продукта на самом деле не содержала бы описание продуктов или имя, но только его надежные значения (ProductId, EAN, NumberInStock, NextStockData, IsActive, IsPublished) и т.д.

, ProductDescription тогда содержит ProductId, Имя, Описание, LCID

2
ответ дан 30 November 2019 в 13:46
поделиться

Я живу в Канаде, таким образом, многоязычие является грандиозным предприятием. Я видел два подхода. Право преимущественной покупки должно хранить все локализованные данные для определенной записи в различной таблице, связанной с исходной таблицей первичным ключом и локалью. Вторая опция подобна первому, за исключением того, что для каждой локали, существует различная таблица с локалью как суффикс для имени таблицы.

Опция B

Item (ItemID, ...)
Item_ENUS (ItemID,....)
Item_ENGB (ItemID,....)
Item_FR (ItemID,....)

Опции A

Item (ItemID, ...)
ItemLocal (ItemID,LocaleID,....)

третья опция я думал недавний, который будет действительно хорош, если бы база данных поддерживала ее, то исходно должен был бы сохранить значения для всех местных жителей в том же поле. И если бы поле было создано как varchar-мультилокальное, то необходимо было бы получить доступ к нему путем передачи параметра для определения языка. Ничто как это не существует, поскольку я знаю это, но это - что-то, что я думаю, действительно сделал бы вещи намного легче, и намного больше жидкости.

2
ответ дан 30 November 2019 в 13:46
поделиться

В настоящее время перевод не что-то, что может быть сделано автоматически. Лучший способ состоит в том, чтобы заставить человека переводить и использовать методы Nick's для показа надлежащего языка.

0
ответ дан 30 November 2019 в 13:46
поделиться

Мы используем соединение файлов RESX и Опцию A ответа Kibbee. Мы создали простой инструмент для управления файлами RESX онлайн: http://blog.lavablast.com/post/2008/02/RESX-file-Web-Editor.aspx

0
ответ дан 30 November 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: