Email 使用gettext翻译较长的文本(视图和电子邮件模板)

Email 使用gettext翻译较长的文本(视图和电子邮件模板),email,templates,localization,gettext,longtext,Email,Templates,Localization,Gettext,Longtext,我正在开发一个多语言的PHPWeb应用程序,我有很长的(-ish)文本需要用gettext翻译。这些是电子邮件模板(通常很短,但仍有几行)和部分视图模板(较长的描述性文本块)。这些文本将包括一些简单的HTML(例如强调用粗体/斜体,可能是这里或那里的链接)。模板是捕获其输出的PHP脚本 问题是gettext在处理较长的文本时似乎非常笨拙。随着时间的推移,较长的文本通常比较短的文本有更多的更改-我可以更改msgid并确保在所有翻译中更新它(msgid较长时可能需要大量工作并且非常容易出错),或者我

我正在开发一个多语言的PHPWeb应用程序,我有很长的(-ish)文本需要用gettext翻译。这些是电子邮件模板(通常很短,但仍有几行)和部分视图模板(较长的描述性文本块)。这些文本将包括一些简单的HTML(例如强调用粗体/斜体,可能是这里或那里的链接)。模板是捕获其输出的PHP脚本

问题是gettext在处理较长的文本时似乎非常笨拙。随着时间的推移,较长的文本通常比较短的文本有更多的更改-我可以更改msgid并确保在所有翻译中更新它(msgid较长时可能需要大量工作并且非常容易出错),或者我可以保持msgid不变,只修改翻译(这会在模板中留下误导性的过时文本).此外,我还看到了反对将HTML包含在gettext字符串中的建议,但避免它会将一段自然的文本分割成许多块,这对翻译和重新组装来说将是一个更大的噩梦,我还看到了反对不必要地将gettext字符串分割成单独的MSGID的建议

我看到的另一种方法是对这些较长的文本完全忽略gettext,并在每个语言环境的外部子模板中分离这些块,只包括当前语言环境的块。缺点是我将gettext.po文件和位于完全不同位置的单独模板之间的翻译工作分离地点


由于此应用程序将在将来用作其他应用程序的起点,因此我正在尝试提出长期的最佳方法。我需要一些关于此类场景中最佳实践的建议。您是如何实施类似案例的?结果是什么可行?结果是什么坏主意?

gettext并不是真正设计的d用于翻译大块文本

fwiw我在gettext字符串中包含了基本的HTML(strong、a等),因为我相信我们的翻译人员知道他们在做什么(大部分是正确的),并且翻译会经过很好的测试

我尝试过把每一段文本分解成一个字符串的方法。如果文本中间有一段英语,看起来很奇怪。其中的一个字符串已经改变了,这意味着我们必须等待翻译,然后再发布一个新版本,这会减慢我们的速度。让翻译人员看到文本的哪一部分发生了变化。这种方法在我尝试过的一个应用程序中效果很好

将一些文本拆分到外部位置也很有效,但这会造成管理开销,而不仅仅是一个或两个.po文件,还有一大堆其他文本必须手动与英文版本进行比较并相应更新。如果您记得向翻译人员提供注释,说明翻译的位置和内容,这是可行的他的不同之处在于英文版本


我自己对这两种方法都不感兴趣。

以下是我在一个流量非常大的网站上使用的工作流程,该网站上有几十块样式文本内容,翻译成六种语言:

  • 选择一种基于文本的标记语言(我们使用)
  • 对于长字符串,请使用固定的消息ID,如“关于页面\介绍\标记”:
    • 描述文本的意图
    • 明确表示将以降价格式进行解释
  • 让我们的应用程序适当地呈现“*_markdown”字符串,确保只允许几个安全的HTML标记
  • 为翻译人员构建一个工具:
    • 向他们显示实时渲染的降价(有点像)
    • 让他们更容易看到现在权威的文本基础语言翻译(因为
      msgid
  • 教翻译人员如何使用新的工作流程
  • 此工作流的优点:

    • 消息ID不会一直更改
    • 因为翻译人员是以安全的高级语法进行编辑的,所以很难搞乱HTML
    • 非技术翻译人员发现,与HTML相比,用Markdown编写代码非常容易
    此工作流的缺点:

    • 具有静态不变的消息ID意味着文本中的更改需要在带外传输(无论如何,我们都会这样做,因为长文本可能会引起关于音调或强调的问题)
    我对我们网站的工作流程非常满意,我绝对会推荐它,并再次使用它。它花了几天时间才开始,但它很容易构建、训练和启动


    希望这对您有所帮助,祝您的项目好运。

    我刚刚遇到了这个特殊的问题,我相信我以一种优雅的方式解决了它

    问题:我们希望在PHP中使用Gettext,并使用主要语言字符串作为键翻译。但是,对于大块HTML(使用h1、h2、p、a等),我必须:

    • 为包含内容的每个标记创建翻译

    • 将带有标记的整个块放在一个翻译中
    这两种选择都不吸引我,所以我就是这么做的:

    • 将简单字符串(“OK”、“Add”、“Confirm”、“My Awesome App”)保留为常规的Gettext.po条目,原始文本作为键
    • 在标记中写入内容(大文本块),并将其保存在文件中。 示例文件为
      /homepage/content.md
      (主/源文本),
      /homepage/content.da DK.md
      /homepage/content.de-de.md

    • 编写一个类,用于获取内容文件(针对当前语言环境)并对其进行解析。然后,我像这样使用它:

    但是,动态大文本呢?简单。使用模板引擎。我决定,并在我的
    模板
    类中使用它

    我现在可以使用模板逻辑..w
    [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>