odan / twig-translation
3.1.0
2020-12-25 19:04 UTC
Requires
- php: ^7.3 || ^8.0
- symfony/translation-contracts: ^2
- twig/twig: ^3.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2
- mikey179/vfsstream: ^1
- overtrue/phplint: ^2
- phpstan/phpstan: 0.*
- phpunit/phpunit: ^9
- squizlabs/php_codesniffer: ^3
- symfony/config: ^4 || ^5
- symfony/translation: ^4 || ^5
README
一个Twig翻译扩展。
请先阅读此内容!
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解析
工作流程
- 解析所有twig文件(
php bin/parse-twig.php
) - 启动Poedit并打开.po文件
- 点击
更新
按钮以解析所有PHP和Twig缓存文件 - 翻译文本并保存文件。
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