h4kuna/gettext-latte

此包已被弃用且不再维护。作者建议使用 symfony/translation 包。

Latte 模板 Gettext 翻译器

v1.3.4 2019-09-06 11:26 UTC

README

GettextLatte

Build Status Latest stable

是 Nette 框架 2.3 的本地化插件,该框架原生支持 gettext

启动条件

  • 启用 gettext 扩展
  • 服务器已安装语言,您可以使用命令 $ locale -a 检查
  • 您的应用程序使用 UTF-8 编码

在仓库中存在一个名为 locale 的目录,其中包含为您的项目准备的目录结构。在 example 文件夹中有文件,可以帮助您设置此翻译器。您可以使用您自己的语言编写应用程序,这里以英语为例,但也可能是捷克语、斯洛伐克语、德语等...

启动

克隆此仓库或使用 composer。

composer require h4kuna/gettext-latte

路由器保留语言。

/**
 * @return Nette\Application\IRouter
 */
public static function createRouter(\h4kuna\Gettext\GettextSetup $translator) {
    $router = new RouteList();
    $router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
    $router[] = new Route('[<lang ' . $translator->routerAccept() . '>/]<presenter>/<action>/[<id>/]', array(
        'presenter' => 'Homepage',
        'action' => 'default',
        'lang' => $translator->getDefault()
    ));

    return $router;
}

examples/config.neon

在 Mac 上,编码每次都表示为 'en_US.UTF-8',而 dojo 格式为 'en_US.utf8'。

extensions:
    gettextLatteExtension: h4kuna\Gettext\DI\GettextLatteExtension

gettextLatteExtension:
    langs:
        cs: cs_CZ.utf8
        sk: sk_SK.utf8
        en: en_US.utf8

安装新的宏到 latte 引擎中,使用原生的 gettext 函数别名 {_'' /, .../}{_n'', '', '' /, .../} 新的是 {_d'catalog', 'message'} 和复数 {_dn'catalog', 'message' /, .../}

运行服务和支持语言自动检测

尽快加载语言。

<?php
use Nette\Application\UI\Presenter;

abstract class BasePresenter extends Presenter {

    /** @persistent */
    public $lang;

    /** @var \h4kuna\Gettext\GettextSetup */
    protected $translator;

    /**
     * Inject translator
     * @param \h4kuna\Gettext\GettextSetup
     */
    public function injectTranslator(\h4kuna\Gettext\GettextSetup $translator) {
        $this->translator = $translator;
    }

    protected function startup() {
        parent::startup();
        $this->lang = $this->translator->setLanguage($this->lang);
    }
    
    /**
     * Or PHP 5.4+ ****************************************************************
     * *************************************************************************
     */
    use \h4kuna\Gettext\InjectTranslator;
}

安装翻译器后,请清空临时目录,否则您可能会遇到 "Call to undefined method Nette\Templating\FileTemplate::translate()" 错误。

如何在 PHP 文件中编写文本

在模板外使用 gettext。

<?php
echo gettext('Hi'); //or alias _
echo _('Hi');
echo ngettext('dog', 'dogs', 2);

echo sprintf(_('%s possible %s %s'), 'another', 'optional', 'params');

在模板中使用宏。参数数量不限。函数 sprintf 会自动添加。请参阅 examples/example.latte 中的示例。

模板中的宏翻译到 PHP
{_'Hi'}echo gettext('Hi');
{_'Today is %s', $date}echo sprintf(gettext('Today is %s'), $date);
在之前的版本中,变形是这样写的。
{_n'dog', 'dogs', $count}echo ngettext('dog', 'dogs', $count);
现在它已禁用,并按照以下方式编写.*(可以通过构造函数的第三个参数启用。)
{_n'dog', $count}echo ngettext('dog', 'dog', $count);
{_n'%s dog has email %s', $count, $email}echo sprintf(ngettext('%s dog has email %s', '%s dog has email %s', $count), $count, $email);
如果您需要变为负数,变量必须包含 abs。
{_n'today is %s degree temperature', $absTemperature}echo sprintf(ngettext('today is %s degree temperature', 'today is %s degree temperature', abs($absTemperature)), $absTemperature);
如果您有很多变量,并且替换第一个非翻译控制变量时,必须包含复数。
{_n'姓名:%s,%s岁', $name, $pluralYear}echo sprintf(ngettext('姓名:%s,%s岁', '姓名:%s,%s岁', $pluralYear), $name, $pluralYear);

* 因为在每次语言目录中,对于有超过2级变位的语言,都会定义变位。

让我们开始翻译

下载 PoEdit。在每次运行Poedit之前,您必须将所有模板编译为PHP并在temp目录中,因为这需要使用类似 examples/latte-compiler 的脚本。

打开 .po 文件。设置目录搜索 - 默认为 temp/cache/latteapp,然后点击“更新目录”,更新目录后,不需要重启apache

如果您在具有三个变位级别的语言中编写应用程序(而不是两个),例如捷克语,则必须有包含只针对复数的捷克语到捷克语的翻译的目录。

可下载目录

为您的翻译人员提供可下载的目录。

$this->translator->download('cs'); //Offers catalog download

运行测试

必须安装Composer。然后您只需执行脚本。

./tests/run-tests.sh