我刚刚遇到了这个特殊的问题,我相信我以一种优雅的方式解决了它。
问题:我们想在 PHP 中使用 Gettext,并使用主要语言字符串作为键翻译。但是,对于大块 HTML(使用 h1、h2、p、a 等),我要么必须:
或者
这些选项都没有吸引我,所以这就是我所做的:
- 将简单字符串(“OK”、“Add”、“Confirm”、“My Awesome App”)保留为常规 Gettext .po 条目,以原始文本为键
在 Markdown 中写入内容(大文本块),并将它们保存在文件中。示例文件是/homepage/content.md
(主要/源文本)/homepage/content.da-DK.md
、、/homepage/content.de-DE.md
编写一个获取内容文件(针对当前语言环境)并解析它的类。然后我像这样使用它:
<?=Template::getContent("homepage/content")?>
但是,动态大文本呢?简单的。使用模板引擎。我决定使用Smarty,并在Template
课堂上使用它。
我现在可以在降价中使用模板逻辑.. !这有多厉害?!
然后是棘手的部分..
为了使内容看起来不错,有时您需要以不同的方式构建 HTML。考虑一个在其下方有 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>
恐怕我不能提供任何源代码,因为这是一个公司项目,但我希望你能明白。