# How to start developing multilanguage website with Nette Framework and Kdyby\Translation

Many people on Nette forum asked how to develop a multilingual website. This was my question as well and I'd like to share my solution with you. Filip Prochazka has developed [Kdyby\Translation](https://github.com/Kdyby/Translation), an adapter for Symfony\Transaltion for Nette Framework, and has lots of super truper small features which you will love.

Here is a four minute long videocast, an introduction to how easy it is to start using Kdyby\Translation.

<https://www.youtube.com/watch?v=FFOO5j-zpSU>

## Installation

1\) Install Nette web-project: `$ composer create-project nette/web-project`

2\) Install Kdyby/Translation: `$ composer require kdyby/translation`

## Configuration

in `config.neon` we will add an extension to enable Kdyby\Translation:

```
extensions:
        translation: Kdyby\Translation\DI\TranslationExtension
```

## Presenter

In our BasePresenter we will add the variables `$locale` and `$tranlator`. Using \[Dependency Injection | doc:di] mechanism we get an injected Kdyby\Translation\Translator service. (In my example, I don't use any BasePresenter, instead I only use the HomepagePresenter).

The variable `$locale` is [persistent](http://doc.nette.org/en/presenters#toc-persistentni-parametry) and will now be automatically held in the url.

```
{
        /** @persistent */
        public $locale;

        /** @var \Kdyby\Translation\Translator @inject */
        public $translator;
}
```

## Router

Update the original router definition in `RouterFactory.php`

```
$router[] = new Route('[<locale=en cs|en>/]<presenter>/<action>', "Homepage:default");
```

(In the video, locale defaults to cs.)

## Dictionaries

We will add the two files `ui.cs_CZ.neon` and `ui.en_US.neon` to the folder `app/lang`. Here `ui` is the name of our dictionary and `cs_CZ` is a combination of language and state. ([ISO\_639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) and [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1))

If we want a specific translation with localization, e.g. French speaking Canadians, we will use `fr_CA`.

> Keeping both the language and the country in the culture is necessary because you may have a different French translation for users from France, Belgium or Canada, and a different Spanish content for users from Spain or Mexico. The language is a code of two lowercase characters, according to the ISO 639-1 standard (for instance, en for English). The country is a code of two uppercase characters, according to the ISO 3166-1 standard (for instance, GB for Great Britain).

<http://symfony.com/legacy/doc/book/1_0/en/13-I18n-and-L10n>

## Dictionary content

The default syntax is Neon, you can read more about its amazing syntax [http://ne-on.org](http://ne-on.org/).

ui.cs\_CZ.neon

```
title: Vitejte
```

ui.en\_US.neon

```
title: Hello
```

## Template

In our template, we will use the macro `{_ ui.title}` for putting translated phrase.

## Profit

It's really easy to start.

For more information read the [official documentation for Kdyby\Translation](https://github.com/Kdyby/Translation/blob/master/docs/en/index.md).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.honzacerny.com/nette-framework/how-to-start-developing-multilanguage-website-with-nette-framework-and-kdyby-translation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
