vladahejda / nettesimpletranslator
Nette (PHP 框架) 的翻译器。
Requires
- nette/database: ~2.3
- nette/utils: ~2.3
Requires (Dev)
- nette/application: ~2.3
- nette/bootstrap: ~2.3
- nette/robot-loader: ~2.3
- nette/tester: ~1.4
- tracy/tracy: ~2.3
This package is not auto-updated.
Last update: 2024-09-14 17:05:43 UTC
README
NetteSimpleTranslator 是一个工具,可以基于 Nette 框架 简单地翻译您的 Web 应用。
您的应用已发布某种语言,例如英语。您需要做的是在数据库中填充翻译文本,并在应用中轻松标记需要翻译的部分,如下所示。
安装
- 从 Github 下载: https://github.com/VladaHejda/NetteSimpleTranslator
- 或者更好的方法是使用 Composer
{ "require": { "vladahejda/nettesimpletranslator": "~1.0" } }
然后通过自动加载器加载类(composer autoloading 或 Nette RobotLoader)。
用法
要启动翻译器,请按照以下步骤操作
1. 准备存储
- 使用 Nette 数据库
在您的数据库中执行 src/Storage/NetteDatabase.createTable.sql
中的 SQL 脚本(或其 命名空间版本,见 使用命名空间)。
打开您的配置文件并添加服务
services:
translatorStorage: NetteSimpleTranslator\Storage\NetteDatabase(localization_text, localization)
您可以在 SQL 脚本中重命名表(在配置文件中使用相同的名称)。
- 我想在其他地方保存翻译
查看接口 NetteSimpleTranslator\ITranslatorStorage
并实现它以编写您自己的存储。
然后将其添加到您的配置文件中作为服务。
2. 添加 NetteSimpleTranslator 服务
在您的配置文件中添加服务 NetteSimpleTranslator\Translator
并定义默认语言(这是您的网站基本使用的语言)
services:
translator: NetteSimpleTranslator\Translator(en)
3. 设置您的 BasePresenter
注入 NetteSimpleTranslator,设置当前语言并将翻译器带入模板和表单中
class BasePresenter extends \Nette\Application\UI\Presenter { /** @var string @persistent */ public $language = 'en'; /** @var \NetteSimpleTranslator\Translator */ protected $translator; public function injectTranslator(\NetteSimpleTranslator\Translator $translator) { $this->translator = $translator; } public function startup() { parent::startup(); $this->translator->setCurrentLanguage($this->language); } protected function createTemplate() { $template = parent::createTemplate(); $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('text to translate')
,在 latte 中使用下划线宏 {_ 'text to translate'}
完成。创建链接以切换您的 $language
持久参数并查看翻译。
高级
如果您想完全使用翻译器,还有一些其他事情要做。
说明您使用的翻译器语言
调用函数 $translator->setAvailableLanguages()
并提供您网站可用的语言数组。然后设置表示器语言持久参数的名称($translator->setLanguageParameter()
)。
更好的方法是将其设置在配置中
translator:
class: NetteSimpleTranslator\Translator(en)
setup:
- setAvailableLanguages([en, de, fr])
- setLanguageParameter(language)
现在翻译器将能够自己识别当前语言。
使用 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));",
])
(要了解这一点,请参阅复数形式)
然后您甚至可以添加复数形式的翻译。您需要做的就是使用翻译数据库中的variant
列(如果您使用的是NetteDatabase存储)。
您还需要做的是将默认语言的复数形式以数组的形式提供给翻译器,并给出数量。例如:$translator->translate( array( 'There is %d apple', 'There is %d apples' ), 3 )
,或者在使用latte时:{_ ['There is %d apple', 'There is %d apples'], 3}
。
使用命名空间
当您的网站上有很多文本时,对其进行某种排序会很好。只需给翻译器一个命名空间,例如根据模块。 $translator->setNamespace('products')
现在,尽情享受吧。
在新BSD许可下