h4kuna / gettext-latte
Requires
- h4kuna/latte-php-tokenizer: ^1.0
- latte/latte: ^2.0
- nette/application: ^2.0
- nette/caching: ^2.0
- nette/http: ^2.0
Requires (Dev)
- nette/bootstrap: ^2.0
- salamium/testinium: ^0.1
README
GettextLatte
是 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/latte 和 app,然后点击“更新目录”,更新目录后,不需要重启apache。
如果您在具有三个变位级别的语言中编写应用程序(而不是两个),例如捷克语,则必须有包含只针对复数的捷克语到捷克语的翻译的目录。
可下载目录
为您的翻译人员提供可下载的目录。
$this->translator->download('cs'); //Offers catalog download
运行测试
必须安装Composer。然后您只需执行脚本。
./tests/run-tests.sh