Seu Aplicativo em CakePHP 3 em Vários Idiomas

Em Inglês

Tradução do CakePHP usando o plugin localized

Para saber que idiomas o plugin suporta hoje acesse:

https://github.com/cakephp/localized/tree/master/src/Locale

Caso nos interesse um que não esteja na lista podemos simplesmente copiar um dos existentes e criar um novo.

Vou considerar que já instalou o aplicativo de acordo com etses dois tutoriais:
http://ribafs.org/portal/cakephp/plugins/cake-control/introducao
http://ribafs.org/portal/cakephp/plugins/cake-control/recursos-extras

Criar a pasta Locale em seu src e dentro dela a pasta pt_BR, assim:
control1/src/Locale/pt_BR

Configurar o locale default:
config/bootstrap.php

Caso queira alterar o idioma, ajuste na linha 150

//ini_set('intl.default_locale', Configure::read('App.defaultLocale'));
ini_set('intl.default_locale', 'pt_BR');

Copiar o arquivo do plugin
vendor/cakephp/localized/src/Locale/pt/cake.po

Para
src/Locale/pt_BR/default.po

Observe que o arquivo foi renomeado de cake.po para default.po

O aplicativo (Servidores) estava assim:

O código gerado já será mostrado traduzido, mas precisará de alguns ajustes.
Sempre que precisar traduzir algo adicione a string em default.po.

Depois de configurada a Internacionalização acesse novamente o aplicativo pelo navegador. e tecle F5.

Veja agora como está a mesma área anteriormente em inglês:

Caso não apareça Actions traduzido execute:

cd control1

bin/cake orm_cache clear

Se necessário limpe o cache do navegador também.

Observe que ele traduziu Actions, mas não traduziu New Servidore (singular na marra, pois o Cake entende como se fosse inglês), nem List Servidores, nem List Users nem New User. Ele tem a tradução para New e List  mas não para as duas palavras juntas. Para traduzir estes termos, basta editar o src/Locale/pt_BR;default.po e adicionar ao início assim:

Logo acima da linha
#: Controller/Scaffold.php:128

msgid "New Servidore"
msgstr "Novo Servidor"

msgid "List Servidores"
msgstr "Listar Servidores"

msgid "List Users"
msgstr "Listar Usuários"

msgid "New User"
msgstr "Novo Usuário"

Observe que msgid é a frase/palavra existente, que queremos traduzir e msgstr é a a nossa tradução.

Depois disso volte ao navegador e apenas tecle Ctrl+R para atualizar que já aparece traduzido:



Sempre que criar código manualmente para que fique traduzível use as strings assim

Ao invés de fazer assim
<h1>Ações</h1>

Faça assim:
<h1><?= __('Action') ?></h1>

Mas a string precisa existir no default.po.
Caso não exista, adicione.

Mesmo código gerado pelo Bake precisa de adicionar strings e frases, que não existem.

Não precisa regerar o código, o Cake pega a radução diretamente do default.po, caso exista.

Customização da view Tempalte/Customers/index.ctp

Fiz as seguintes customizações para traduzir:
                <th><?= $this->Paginator->sort(__('name')) ?></th>
                <th><?= $this->Paginator->sort(__('birthday')) ?></th>
                <th><?= $this->Paginator->sort(__('phone')) ?></th>
                <th><?= $this->Paginator->sort('user_id',['label'=>'Usuário']) ?></th>
                <th><?= $this->Paginator->sort(__('created')) ?></th>
                <th><?= $this->Paginator->sort(__('modified')) ?></th>

Também estou oferecendo o meu default.po com várias traduções para um demo do plugin.
Veja em docs/default.po


Veja como ficou após várias traduções, todas via default.po:


Alterando o Idioma


Depois de tudo configurado para voltar ao idioma default (en_US), basta editar
o config/bootstrap.php e deixar as duas linhas assim:

//ini_set('intl.default_locale', 'pt_BR');
ini_set('intl.default_locale', Configure::read('App.defaultLocale'));

Assim, voltando ao navegador e teclando F5 ele volta a mostrar em en_US.

 

Referências

http://book.cakephp.org/3.0/pt/core-libraries/internationalization-and-localization.html

 

Sugestões e colaborações serão sinceramente muoto bem vindas. :)

Felicidades!