PHPackages                             vladahejda/nettesimpletranslator - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Localization &amp; i18n](/categories/localization)
4. /
5. vladahejda/nettesimpletranslator

ActiveLibrary[Localization &amp; i18n](/categories/localization)

vladahejda/nettesimpletranslator
================================

Translator for Nette (PHP framework).

v1.0.0(10y ago)0195[2 issues](https://github.com/VladaHejda/NetteSimpleTranslator/issues)BSD-3-ClausePHP

Since Jun 5Pushed 10y ago1 watchersCompare

[ Source](https://github.com/VladaHejda/NetteSimpleTranslator)[ Packagist](https://packagist.org/packages/vladahejda/nettesimpletranslator)[ RSS](/packages/vladahejda-nettesimpletranslator/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (7)Versions (2)Used By (0)

NetteSimpleTranslator
=====================

[](#nettesimpletranslator)

NetteSimpleTranslator is tool to simply translate your web apps based on [Nette Framework](http://nette.org/en/).

You have an app published in certain language, e.g. english. All you need to do is fullfill your database with translated texts and easily mark them in your app to translate, see below.

Installation
------------

[](#installation)

- Download from Github:
- or better use [Composer](http://getcomposer.org/doc/00-intro.md#declaring-dependencies):

```
{
	"require": {
		"vladahejda/nettesimpletranslator": "~1.0"
	}
}

```

Then load classes via autoloader ([composer autoloading](http://getcomposer.org/doc/01-basic-usage.md#autoloading)or Nette RobotLoader).

Usage
-----

[](#usage)

To launch the translator follow these steps:

### 1. prepare storage

[](#1-prepare-storage)

- **Using Nette Database**

Execute SQL script in [`src/Storage/NetteDatabase.createTable.sql`](/src/Storage/NetteDatabase.createTable.sql)(or its [namespaced version]((/src/Storage/NetteDatabase.createTable.namespaced.sql)), see [using namespaces](#using-namespaces)) at your database.

Open your configuration file and add service:

```
services:
	translatorStorage: NetteSimpleTranslator\Storage\NetteDatabase(localization_text, localization)

```

*You can rename tables in SQL script (use the same names in config file).*

- **I want to save translations elsewhere**

Look at the interface [`NetteSimpleTranslator\ITranslatorStorage`](/src/ITranslatorStorage.php) and implement it to write your own storage.

Then add storage into your configuration file as a service.

### 2. add NetteSimpleTranslator service

[](#2-add-nettesimpletranslator-service)

Into your config file add service `NetteSimpleTranslator\Translator` and define the default language (it is language which in your web is written basically):

```
services:
	translator: NetteSimpleTranslator\Translator(en)

```

### 3. set up your BasePresenter

[](#3-set-up-your-basepresenter)

Inject NetteSimpleTranslator, set current language and bring translator into template and forms:

```
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. mark texts for translation

[](#4-mark-texts-for-translation)

In presenters call `$this->translator->translate('text to translate')`, in latte use underscore macro `{_ 'text to translate'}`

Done. Make links to switch your `$language` persistent parameter and see the translations.

Advanced
--------

[](#advanced)

If you want to use your translator fully, there is some more stuff you would do.

### Say translator which languages you use

[](#say-translator-which-languages-you-use)

Call function `$translator->setAvailableLanguages()` and give the array of languages that your web is available in. Then set the name of presenter language persistent parameter (`$translator->setLanguageParameter()`).

Better way of this is setting it in config:

```
	translator:
		class: NetteSimpleTranslator\Translator(en)
		setup:
			- setAvailableLanguages([en, de, fr])
			- setLanguageParameter(language)

```

Translator will now recognize the current language itself.

### Use advantages of `sprintf`

[](#use-advantages-of-sprintf)

If you give more arguments to translate method, it will be handed to php function [sprintf](http://php.net/manual/en/function.sprintf.php).

That means that `$translator->translate('Call me %s.', 'Johan')` results in "Call me Johan", whereas "Johan" will not be translated.

It can be used in latte too.

### Translate plurals (1 apple → 2 apples)

[](#translate-plurals-1-apple--2-apples)

You can say what plural-form each language uses via `setAvailableLanguages`, this way:

```
	setup:
		- setAvailableLanguages([
			en: "nplurals=2; plural=(n==1) ? 0 : 1;",
			cz: "nplurals=3; plural=((n==1) ? 0 : (n>=2 && n
