У меня только что была эта конкретная проблема, и я думаю, что я решил ее элегантным способом.
Проблема: мы хотели использовать Gettext в PHP и использовать строки основного языка в качестве перевода ключей. Однако для больших блоков HTML (с h1, h2, p, a и т. Д.) Мне бы пришлось либо:
- Создать перевод для каждого тега с контентом.
или
- Поместите весь блок с тегами в один перевод.
Ни один из этих вариантов мне не понравился, поэтому я сделал следующее:
- Сохраняйте простые строки («OK», «Добавить», «Подтвердить», «My Awesome App») как обычные записи Gettext .po с исходным текстом в качестве ключа
Пишите содержимое (большие текстовые блоки) в уценке и сохраняйте их в файлах.
Файлы примеров: /homepage/content.md
(основной / исходный текст), /homepage/content.da-DK.md
, /homepage/content.de-DE.md
Напишите класс, который выбирает файлы содержимого (для текущей локали) и анализирует его. Затем я использовал это как:
<?=Template::getContent("homepage/content")?>
Однако как насчет динамического большого текста? Просто. Используйте шаблонизатор. Я выбрал Smarty и использовал его в своем Template
классе.
Теперь я могу использовать логику шаблонов .. в уценке! Как это круто?!
Затем наступила сложная часть ..
Чтобы контент выглядел хорошо, иногда вам нужно структурировать HTML по-другому. Рассмотрим область кампании с 3 «функциональными блоками» под ней. Простое решение: подготовьте файл для области кампании и один файл для каждого из 3 блоков.
Но я мог бы сделать лучше, чем это.
Я написал быстрый синтаксический анализатор блоков, чтобы записывать все содержимое в один файл, а затем отдельно обрабатывать каждый блок.
Файл примера:
[block campaign]
Buy this now!
=============
Blaaaah... And a smarty tag: {$cool}
[/block]
[block feature 1]
Feature 1
---------
asdasd you get it..
[/block]
[block feature 2] ...
И вот как я бы их отобразил в разметке:
<?php
// At the top of the document...
// Class handles locale. :)
$template = Template::getContent("homepage/content", [
"cool" => "Smarty variable! AWESOME!"
]);
?>
...
<title><?=_("My Awesome App")?></title>
...
<div class="hero">
<!-- Template data already processed! :) -->
<?=$template->renderBlock("campaign")?>
</div>
<div class="featurebox">
<?=$template->renderBlock("feature 1")?>
</div>
<div class="featurebox">
<?=$template->renderBlock("feature 2")?>
</div>
Боюсь, я не могу предоставить какой-либо исходный код, так как это было для проекта компании, но я надеюсь, что вы поняли.