modera/translations-bundle

安装量: 6,149

依赖项: 4

建议者: 0

安全: 0

星标: 1

关注者: 9

分支: 1

开放问题: 0

类型:symfony-bundle

v3.1.0 2021-12-06 10:56 UTC

README

此Bundle定义了架构并提供工具,使将网站翻译成多种语言的过程变得更加容易。

此Bundle是为了简化本地化过程而开发的,为此它执行了以下操作

  • 定义了一个可扩展的架构,可以用来描述必须扫描哪些类型的文件以提取翻译标记,目前我们支持以下类型:twig模板、php文件。
  • 当提取出可发布的标记到数据库时。您可以使用您最喜欢的工具集来翻译它们(例如,一些CRUD生成器)
  • 当标记已被翻译后,您可以使用modera:translations:compile命令将标记从数据库中取出并重新编译成Symfony可以处理的物理文件。

安装

步骤1:下载Bundle

composer require modera/translations-bundle:4.x-dev

此命令要求您全局安装Composer,如Composer文档中的安装章节中所述。

步骤2:启用Bundle

此Bundle应该由Flex自动启用。如果您不使用Flex,您需要手动在项目的config/bundles.php文件中添加以下行来启用此Bundle

<?php
// config/bundles.php

return [
    // ...
    Modera\LanguagesBundle\ModeraLanguagesBundle::class => ['all' => true], // if you still don't have it
    Modera\TranslationsBundle\ModeraTranslationsBundle::class => ['all' => true],
];

步骤3:更新数据库

bin/console doctrine:schema:update --force

文档

此Bundle提供两个命令行任务

modera:translations:import

如您所猜测的那样,此任务用于将文件中的标记提取到数据库中。为了使此任务理解应从哪些文件中提取标记,您需要注册所谓的“翻译处理器”。在编写本文时,我们支持两种类型的处理器:“twig模板”和“php文件”。

要通知任务扫描Bundle的twig模板(资源/视图目录),您需要使用类似以下的服务定义

<!-- YourBundleName/Resources/config/services.xml -->
<services>
    <service parent="modera_translations.handling.template_translation_handler">

        <argument>YourBundleName</argument>

        <tag name="modera_translations.translation_handler" />
    </service>
</services>

如果您还想扫描Bundle的PHP文件,则可以使用类似以下的方法

<!-- YourBundleName/Resources/config/services.xml -->
<services>
    <service parent="modera_translations.handling.php_classes_translation_handler">

        <argument>YourBundleName</argument>

        <tag name="modera_translations.translation_handler" />
    </service>
</services>

现在,如果您运行modera:translations:import任务,则twig模板和位于YourBundleName内部的全部*.php文件都将被扫描,提取标记,并将其最终添加到数据库中。

当涉及到在twig模板中处理本地化时,并没有什么新东西,你只需使用Symfony提供的trans twig过滤器。但是,当你需要本地化PHP代码时,情况就变得更有趣了。默认情况下,你可以使用translator服务,但在使用它之前,你需要将其注入到你的服务中。即使你注入了它,Symfony也无法检测和从中提取标记,为了解决这个问题,我们创建了一个标准的Symfony ExtractorInterface实现 - Modera\TranslationsBundle\TokenExtraction\PhpClassTokenExtractor。这个类能够静态分析你的PHP文件并从中提取标记,为了使代码分析更加可靠,我们决定引入一个辅助工具,你应该使用它来翻译消息并将它们指定为翻译标记 - Modera\FoundationBundle\Translation\T。这个类提供了一个静态方法 - trans,其目的和方法签名与标准的Symfony的Symfony\Contracts\Translation\TranslatorInterface相对应。你可以使用这个方法来翻译消息,而无需在服务中事先导入翻译服务。你可能想知道这些方法是如何工作的 - 实质上,当ModeraTranslationsBundle由Symfony引导时,该bundle会将翻译服务注入到T类中,然后它将使用它来翻译你的消息。你可能已经有另一个问题 - 如果我的服务依赖于来自依赖注入容器的服务,我如何在单元测试中测试我的服务?答案是简单的 - 你像往常一样测试你的类,T足够智能,当它执行时没有访问自动注入的translator服务,它将只作为代理类,实际上不翻译你的消息。以下是一些如何使用T服务的方法示例

<?php

use Modera\TranslationsBundle\Helper\T;

T::trans('Hello');

T::trans('Hello, %name%', array('%name%' => $name'), 'greetings');

$domain = 'examples';
$longMessage = 'This way of defining long translation ';
$longMessage.= 'messages can be used.';
$longMessage.= 'For more details please see docblock for T class.';

T::trans($longMessage, array(), $domain);

现在,当你运行modera:translations:import命令时,这些标记将被提取

  • 你好
  • 你好,%name%
  • 定义长翻译消息的这种方式可以使用。有关更多详细信息,请参阅T类的docblock。

modera:translations:compile

一旦将翻译标记提取到数据库中,你可能希望将它们编译回物理文件,以便Symfony翻译机制能够检测它们并在翻译消息时使用它们。为此,你需要运行modera:translations:compile任务。在执行此任务时,它将把数据库中的所有翻译标记编译到应用程序的根Resources目录中。

许可

此bundle受MIT许可协议的约束。请参阅bundle中的完整许可协议:Resources/meta/LICENSE