vladahejda / livetranslator
用于 Nette(PHP 框架)的翻译器。
Requires
- nette/nette: ~2.2
Requires (Dev)
- nette/tester: @dev
This package is not auto-updated.
Last update: 2024-09-14 14:45:08 UTC
README
LiveTranslator
LiveTranslator 是用于 Nette 框架 的工具。
LiveTranslator 通过调试栏中的面板让您轻松翻译您的文本,从而实现您网站的用户友好的本地化。与 Nette 2 兼容。
LiveTranslator 是从 NetteTranslator 分支出来的,使用了其稳健的部分(特别是 TranslationPanel)并对其他部分进行了修改,主要是保存翻译的地方。
安装
- 从 Github 下载: https://github.com/VladaHejda/LiveTranslator
- 或者更好的方法是使用 Composer
{ "require": { "vladahejda/livetranslator": "~1.0" }, "minimum-stability": "RC" }
然后通过自动加载器(composer autoloading 或 Nette RobotLoader)加载类。
使用方法
要启动翻译器,请按照以下步骤操作
1. 准备存储
- 我使用 Nette 数据库
在你的数据库中执行 LiveTranslator/Storage/NetteDatabase.createTable.sql
(或其命名空间版本,见 使用命名空间)中的 SQL 脚本。
打开你的配置文件并添加服务
services:
translatorStorage: LiveTranslator\Storage\NetteDatabase(localization_text, localization)
你可以在 SQL 脚本中重命名表(在配置文件中使用相同的名称)。
- 我使用 Dibi
Dibi 存储正在开发中。你可以编写自己的存储。见下文。
- 我没有数据库
你可以将翻译存储到纯文本文件中。只需将以下服务添加到你的配置文件中,并选择持久性和可写入的(现有)目录
services:
translatorStorage: LiveTranslator\Storage\File(%appDir%/../data/localization)
- 我想将翻译保存在其他地方
查看接口 LiveTranslator\ITranslatorStorage
并实现它以编写你自己的存储。
然后添加存储到你的配置文件中作为服务。
2. 添加 LiveTranslator 和 Panel 服务
在你的配置文件中添加两个更多服务 LiveTranslator\Translator
和 LiveTranslator\Panel
并定义默认语言(这是在您的网站上基本写入的语言)
nette:
debugger:
bar:
- LiveTranslator\Panel
services:
translator: LiveTranslator\Translator(en)
translatorPanel: LiveTranslator\Panel
3. 设置你的 BasePresenter
注入 LiveTranslator,设置当前语言并将翻译器传递给模板和表单
class BasePresenter extends \Nette\Application\UI\Presenter { /** @var string @persistent */ public $lang = 'en'; /** @var \LiveTranslator\Translator @inject */ public $translator; // since Nette 2.1 you can omit this method public function injectTranslator(\LiveTranslator\Translator $translator) { $this->translator = $translator; } public function startup() { parent::startup(); $this->translator->setCurrentLang($this->lang); } protected function createTemplate($class = NULL) { $template = parent::createTemplate($class); $template->setTranslator($this->translator); return $template; } // to have translated even forms add this method too protected function createComponent($name) { $component = parent::createComponent($name); if ($component instanceof \Nette\Forms\Form) { $component->setTranslator($this->translator); } return $component; } }
4. 标记要翻译的文本
在控制器中调用 $this->translator->translate('要翻译的文本')
,在 latte 中使用下划线宏 {_ '要翻译的文本'}
完成。在开发模式下查看你的调试栏。你可以看到“翻译”面板。浏览你的网站,文本将出现在面板中。切换语言并翻译!
高级
如果你想完全使用你的翻译器,你还需要做更多的事情。
说明你使用的翻译器语言
调用函数 $translator->setAvailableLanguages()
并提供您的网站可用的语言数组。然后设置控制器语言持久参数($translator->setPresenterLanguageParam()
)。
更好的方法是将其设置为配置
translator:
class: LiveTranslator\Translator(en)
setup:
- setAvailableLanguages([en, de, fr])
- setPresenterLanguageParam(lang)
现在你的面板将显示切换语言的链接!
使用 sprintf
的技巧
如果你给翻译方法提供了更多参数,它将被传递给 PHP 函数 sprintf。
这意味着 $translator->translate('Call me %s.', 'Johan')
的结果是 "Call me Johan",而 "Johan" 不会被翻译。
这也可以在 latte 中使用。
翻译复数形式(1 个苹果 → 2 个苹果)
您可以通过 setAvailableLanguages
来指定每种语言使用的复数形式,如下所示
setup:
- setAvailableLanguages([
en: "nplurals=2; plural=(n==1) ? 0 : 1;",
cz: "nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4 ? 1 : 2));",
])
(了解这些,请参阅 复数形式)
然后,面板将允许您翻译复数文本。您需要做的是以数组形式给翻译器提供默认语言的复数变体和数字。例如:$translator->translate(array('There is %d apple', 'There are %d apples'), 3)
或在 latte 中:{_ ['There is %d apple', 'There are %d apples'], 3}
。
使用命名空间
当您的网站上有很多文本时,对其进行分类排序会更好。例如,可以根据 模块 给翻译器指定命名空间。 $translator->setNamespace('products')
面板将分离来自不同命名空间的全部文本。
现在,请享受吧。
作者
(按字母顺序排列)
- Josef Kufner (jk@frozen-doe.net)
- Miroslav Paulík (https://github.com/castamir)
- Roman Sklenář (http://romansklenar.cz)
- Miroslav Smetana
- Jan Smitka
- Patrik Votoček (patrik@votocek.cz)
- Tomáš Votruba (tomas.vot@gmail.com)
- Václav Vrbka (gmvasek@php-info.cz)
- Vladislav Hejda
在 新BSD许可证 下