saeven / zf2-circlical-trans
将Twig的{% trans %}与标准翻译器结合在一起的ZF3模块
Requires
- php: >=7.4
- ext-gettext: *
- kokspflanze/zfc-twig: ^4.0.0
- laminas/laminas-dependency-plugin: ^2.1
- laminas/laminas-mvc: @stable
- laminas/laminas-mvc-i18n: @stable
- laminas/laminas-servicemanager: @stable
- laminas/laminas-view: @stable
- symfony/twig-bridge: @stable
- twig/twig: ^3.0.1
Requires (Dev)
- codacy/coverage: ^1.0
- phpunit/phpunit: ^6@stable
This package is auto-updated.
Last update: 2024-09-20 14:40:34 UTC
README
魔法胶水,用于在使用ZfcTwig、MvcTranslator(例如,在控制器内部)和您的twig模板时创建预期的体验。使用非常简单!包含此包后,“trans”将在您的模板中可用。
新功能!此模块支持文本域!
灵感来源于ZfcTwig及其扩展项目https://github.com/twigphp/Twig-extensions
要求
安装
composer require "saeven/zf3-twig-trans"
配置
加载模块:application.config.php
确保您的模块的application.config.php中已加载这些模块
'ZfcTwig',
'CirclicalTwigTrans'
通过加载CirclicalTwigTrans,您将设置从'translator'到'MvcTranslator'的别名。如果您系统中已存在翻译器别名,请将其删除。
管理区域:您的Application的Module.php
假设您正在应用程序的引导中管理区域。例如,在您的Application模块的onBootstrap中
public function onBootstrap(MvcEvent $e) { $translator = $e->getApplication()->getServiceManager()->get('translator'); $translator ->setLocale( 'fr_CA' ) ->setFallbackLocale( 'en_US' ); }
适当的语言文件设置
gettext强加了特定的文件结构;模块的语言文件夹看起来如下
module/
Application/
language/
en_US/
LC_MESSAGES/
default.mo
default.po
errors.mo
errors.po
fr_CA/
LC_MESSAGES/
default.mo
default.po
errors.mo
errors.po
真正的关键文件是.mo文件。.po文件是源文件,用于使用msgfmt编译.mo文件。
命名法,default.mo,表示该文件包含'default'文本域的文本字符串。换句话说,文件名对于正确的功能至关重要。
您需要调整翻译器配置以支持此文件结构,这非常简单。每个模块
'translator' => [ 'translation_file_patterns' => [ [ 'locale' => 'en_US', 'type' => 'gettext', 'base_dir' => __DIR__ . '/../language', 'pattern' => '%s/LC_MESSAGES/default.mo', 'text_domain' => 'default', ], [ 'locale' => 'en_US', 'type' => 'gettext', 'base_dir' => __DIR__ . '/../language', 'pattern' => '%s/LC_MESSAGES/errors.mo', 'text_domain' => 'errors', ], ], ],
非常重要:Zend翻译器实现与gettext实现之间存在一个关键差异。Zend翻译器允许您为同一域使用多个.mo文件,但gettext不支持此行为。为确保Twig翻译和您的应用程序内翻译(例如,$translator->translate('foo')
)正常工作,您的域名必须是唯一的。一个好的做法是将域名命名为您的模块。
使用方法
包含的测试支持所有trans变体,并在模板内直接支持域覆盖。以下语法结构都有效
从'text-domain' 'errors'翻译'Sorry'
{% trans from "errors" %}Sorry{% endtrans %}
从'default'域翻译'Home'
{% trans %}Home{% endtrans %}
从'default'域翻译"A 404 error occurred"
{% trans "A 404 error occurred" %}
从'default'域进行复数翻译
{% set birds = 422 %} {% trans %} There is one bird {% plural birds %} There are {{ birds }} birds {% endtrans %}
从'errors'域进行复数翻译
{% set birds = 422 %} {% trans from "errors" %} There is one bird {% plural birds %} There are {{ birds }} birds {% endtrans %}
带有注释的翻译
{% trans %} Hello User! {% notes %} This is used in the greeting area. {% endtrans %}
控制器
在控制器中的使用方法没有变化。
/** @var Laminas\I18n\Translator\Translator $tr */ $tr = $sm->get('translator'); $tr->translate( 'Home' ); $tr->translate( 'Sorry', 'errors' ); $num = 422; sprintf( $tr->translatePlural( "There is one bird", "There are %d birds", 422 ), $num ); sprintf( $tr->translatePlural( "There is one bird", "There are %d birds", 422, 'errors' ), $num );
您可以通过使用ZF3骨架测试它,将"Home"翻译为"fr_CA",这将变为"Acceuil"(很好的测试)。
享受吧!
如果发现任何问题,请告诉我。我也在生产环境中使用此模块,所以绝对希望找出错误!