odan / twig-translation

此包已被废弃,不再维护。作者建议使用symfony/twig-bridge包。

一个Twig翻译扩展

3.1.0 2020-12-25 19:04 UTC

README

一个Twig翻译扩展。

Latest Version on Packagist Software License Build Status Code Coverage Scrutinizer Code Quality Total Downloads

请先阅读此内容!

symfony/twig-bridge同样提供了一个Twig 3的TranslationExtension,用于使用trans过滤器翻译消息。因此,odan/twig-translation组件是多余的,并将很快被弃用。我强烈建议您使用symfony/twig-bridge的TranslationExtension。

在此处可以找到安装指南

要求

  • PHP 7.3+ 或 8.0+

安装

composer require odan/twig-translation

注册扩展

此示例使用symfony/translation组件

composer require symfony/translation 

注册Twig扩展

$loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
$twig = new \Twig\Environment($loader, array(
    'cache' => '/path/to/twig-cache',
));

$translator = new \Symfony\Component\Translation\Translator(
    'en_US',
    new MessageFormatter(new IdentityTranslator()),
    null
);

$translator->addLoader('mo', new MoFileLoader());

$twig->addExtension(new \Odan\Twig\TwigTranslationExtension($translator));

Slim 4集成

要安装symfony/translation组件,运行

composer require symfony/translation 

添加设置

// Locale settings
$settings['locale'] = [
    'path' => '/path/to/resources/locale',
    'cache' => '/path/to/locale-cache',
    'locale' => 'en_US',
    'domain' => 'messages',
    // Should be set to false in production
    'debug' => false,
];

添加新的容器定义

<?php

use Odan\Twig\TwigTranslationExtension;
use Psr\Container\ContainerInterface;
use Symfony\Component\Translation\Formatter\MessageFormatter;
use Symfony\Component\Translation\IdentityTranslator;
use Symfony\Component\Translation\Loader\MoFileLoader;
use Symfony\Component\Translation\Translator;

// ...

return [
    // ...

    Translator::class => function (ContainerInterface $container) {
        $settings = $container->get('settings')['locale'];

        $translator = new Translator(
            $settings['locale'],
            new MessageFormatter(new IdentityTranslator()),
            $settings['cache'],
            $settings['debug']
        );

        $translator->addLoader('mo', new MoFileLoader());

        // Optional: Inject the translator instance into the __() function
        // __($translator);

        return $translator;
    },

    Twig::class => function (ContainerInterface $container) {
        $twig = Twig::create('/path/to/templates', []);
    
        // Add extension
        $translator = $container->get(Translator::class);
        $twig->addExtension(new TwigTranslationExtension($translator));
    
        // Add more extension ...
    
        return $twig;
    },

];

创建全局翻译函数

此步骤是可选的,但如果您想在PHP中直接翻译消息,则建议您执行此操作。

创建文件src/Utility/translate.php并将以下内容复制/粘贴到其中

<?php

use Symfony\Contracts\Translation\TranslatorInterface;

/**
 * Translate text.
 *
 * @param string|TranslatorInterface $message The message being translated or the translator
 * @param string|int|float|bool ...$context The context arguments
 *
 * @return string The translated message
 */
function __($message, ...$context): string
{
    /** @var TranslatorInterface $translator */
    static $translator = null;
    if ($message instanceof TranslatorInterface) {
        $translator = $message;

        return '';
    }

    $translated = $translator->trans($message);
    if (!empty($context)) {
        $translated = vsprintf($translated, $context);
    }

    return $translated;
}

在composer.json中注册composer自动加载器

"autoload": {
    "files": [
        "src/Utility/translate.php"
    ]
},

运行:composer update

用法

翻译文本

{{ __('Yes') }}

带有占位符的文本翻译

{{ __('Hello: %s', username) }}

输出(取决于语言)

Hello admin

带有多个占位符的文本翻译

{{ __('First name: %s, Last name: %s', firstName, lastName) }}

输出(取决于语言)

First name: John, Last name: Doe

创建复数翻译

示例 1

{% if count > 1 %}
    {{ count }} {{ __('Users') }}
{% else %}
    {{ count }} {{ __('User') }}
{% endif %}

示例 2

{% if users|length > 1 %}
    {{ users|length }} {{ __('Users') }}
{% else %}
    {{ users|length }} {{ __('User') }}
{% endif %}

创建复杂的复数翻译

{% if not count %}
    {{ __('No users') }}
{% elseif count = 1 %}
    {{ count }} {{ __('User') }}
{% else %}
    {{ count }} {{ __('Users') }}
{% endif %}

使用Poedit解析

工作流程

  1. 解析所有twig文件(php bin/parse-twig.php
  2. 启动Poedit并打开.po文件
  3. 点击更新按钮以解析所有PHP和Twig缓存文件
  4. 翻译文本并保存文件。

Poedit设置

  • 启动Poedit并打开.po文件
  • 打开菜单:目录 > 属性...
  • 打开选项卡:源路径
    • 添加新路径并指向twig缓存
    • 路径必须是相对于基本路径的,例如:..\temp\twig-cache
  • 打开标签页:源关键字
    • 添加一个名为 __(两个下划线)的新关键字。
  • 点击 确定 按钮,并 更新 目录。

解析 Twig 文件

您需要迭代和编译所有您的 Twig 模板。编译步骤生成可以从 Poedit 解析的 PHP 缓存文件。此脚本仅是一个示例,必须根据您的个人环境进行修改。

Twig 设置

// Twig settings
$settings['twig'] = [
    'path' => '/path/to/twig/templates',
    // Should be set to true in production
    'cache_enabled' => true,
    'cache_path' => '/path/to/twig-cache', // <---
];

文件:bin/parse-twig.php

use Odan\Twig\TwigCompiler;
use Slim\App;
use Slim\Views\Twig;

// Bootstrap Slim application

/** @var ContainerInterface $container */
$container = (require __DIR__ . '/../config/bootstrap.php')->getContainer();

/** @var App $app */
$app = $container->get(App::class);

// Read twig settings
$settings = $container->get('settings')['twig'];
$cachePath = (string)$settings['cache_path'];

$twig = $container->get(Twig::class)->getEnvironment();

// Compile twig templates (*.twig) to PHP code
$compiler = new TwigCompiler($twig, $cachePath, true);
$compiler->compile();

echo "Done\n";

return 0;

要运行此脚本,请输入:php bin/parse-twig.php

类似库

symfony/twig-bridge 为 Twig 3+ 提供了 TranslationExtension

阅读更多

许可证

  • MIT