vladahejda/livetranslator

用于 Nette(PHP 框架)的翻译器。

1.0.0-rc 2014-05-01 15:53 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:45:08 UTC


README

Latest Stable Version Total Downloads Montly Downloads Daily Downloads

Build Status

DEMO

LiveTranslator

LiveTranslator 是用于 Nette 框架 的工具。

LiveTranslator 通过调试栏中的面板让您轻松翻译您的文本,从而实现您网站的用户友好的本地化。与 Nette 2 兼容。

LiveTranslator 是从 NetteTranslator 分支出来的,使用了其稳健的部分(特别是 TranslationPanel)并对其他部分进行了修改,主要是保存翻译的地方。

安装

{
	"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 存储正在开发中。你可以编写自己的存储。见下文。

  • 我没有数据库

你可以将翻译存储到纯文本文件中。只需将以下服务添加到你的配置文件中,并选择持久性和可写入的(现有)目录

services:
	translatorStorage: LiveTranslator\Storage\File(%appDir%/../data/localization)
  • 我想将翻译保存在其他地方

查看接口 LiveTranslator\ITranslatorStorage 并实现它以编写你自己的存储。

然后添加存储到你的配置文件中作为服务。

2. 添加 LiveTranslator 和 Panel 服务

在你的配置文件中添加两个更多服务 LiveTranslator\TranslatorLiveTranslator\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')

面板将分离来自不同命名空间的全部文本。

现在,请享受吧。

作者

(按字母顺序排列)

新BSD许可证