saeven/zf2-circlical-trans

将Twig的{% trans %}与标准翻译器结合在一起的ZF3模块

1.1.1 2021-09-01 14:44 UTC

This package is auto-updated.

Last update: 2024-09-20 14:40:34 UTC


README

Build Status Codacy Badge Codacy Badge Total Downloads

魔法胶水,用于在使用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"(很好的测试)。

享受吧!

如果发现任何问题,请告诉我。我也在生产环境中使用此模块,所以绝对希望找出错误!