vladahejda/nettesimpletranslator

Nette (PHP 框架) 的翻译器。

v1.0.0 2015-06-05 07:29 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:05:43 UTC


README

NetteSimpleTranslator 是一个工具,可以基于 Nette 框架 简单地翻译您的 Web 应用。

您的应用已发布某种语言,例如英语。您需要做的是在数据库中填充翻译文本,并在应用中轻松标记需要翻译的部分,如下所示。

安装

{
	"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许可