modera / translations-bundle
Requires
- php: >=5.6
- doctrine/doctrine-bundle: ^1.6|^2.0
- doctrine/orm: ^2.5
- modera/languages-bundle: ~3.1|~4.0
- symfony/framework-bundle: ^3.4|^4.0
Requires (Dev)
- modera/foundation-bundle: ~3.1
- phake/phake: ^2.0
- phpunit/phpunit: ^5.5
- dev-master / 4.x-dev
- 3.x-dev
- v3.1.0
- v3.0.0
- 2.x-dev
- v2.57.0
- v2.56.0
- v2.55.0
- v2.54.0
- v2.53.0
- v2.52.2
- v2.52.1
- v2.52.0
- v2.51.1
- v2.51.0
- v2.0.50
- dev-sf3
- dev-crub_pagination_fetch_fix
- dev-direct-bundle-csrf
- dev-MPFE-1014-2
- dev-MPFE-1029
- dev-MPFE-1014
- dev-MPFE-1005
- dev-MPFE-1007
- dev-MPFE-1017
- dev-MPFE-963
- dev-MPFE-975
- dev-MPFE-977
This package is auto-updated.
Last update: 2024-08-29 03:31:28 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