gsferro / translation-solution-easy
A complete solution for simple and efficient i18n for Laravel
Requires
README
Uma solução robusta e fácil para i18n que contempla as 3 etapas básicas:
-
Tradução de termos (strings) fixos (views e controllers)
-
Crie o arquivo
resources/lang/pt-br.json
e coloque os termos fixos, que são usados em todos os lugares, como:- titulos das paginas
- breadcumb
- menu
- label ou _coluna de tabela
- frases / textos
- Escreva-os como forem ser usados em pt-br:
- ex:
{ "Nome": "Nome", "Email": "Email", "Nome Social": "Nome Social", "Termos de compromisso de uso": "Termos de compromisso de uso" }
- Para executar, utilize normalmente o método padrão do laravel:
- ex:
echo __("Nome Social"); # ou {{ __("Termos de compromisso de uso") }}
- Crie os arquivos em
resources/lang/pt-br/<arquivo>.php
somente quando o valor for sofrer alteração conforme utilização, faça parte de um componente ou for explícito alguma tradução em especial.- ex:
# crud-pessoa.php <?php return [ "index" => ":attribute recuperados(as) com sucesso", ]; // uso echo __("crud-pessoa.index", ["attribute" => "Pessoa"]);
- Observações relevantes:
-
Acaba sendo inicialmente trabalhoso encapsular todos os textos/termos e incrementar o arquivo json quando o projeto já está em curso
-
Ficará muito mais fácil quando o projeto nasce com essa filosofia
-
Reforce o princípio dentro do time de que em qualquer alteração, encapsular os textos/termos
-
Não utilize espaço no nome do index dentro dos arquivos php, use o separador
_
ou-
-
ATENÇÃO: não utilize array bidimensional, a exceção é o validation.php
-
- Para traduzir os arquivos, veja a sessão Tradução dos arquivos de langs usando command como é feito para o banco de dados
php artisan gsferro:translate-files
-
-
Gerenciamento do Langs
- Veja a sessão: Configurações de uso item 1, 2 e 5
- O locale ficará como prefixo na url, porém a langs padrão (pt-br), não é exibido
- A gerência é feita de forma automática pelo pacote, você só precisa incluir na view
@translationsolutioneasyFlags()
para o usuário fazer a troca - O pacote também verifica o browser do usuário para ajudar a setar o locate
- Ao fazer chamadas para alguma api que venha a ser feita, colocar no header do http
"accept-language" => "pt-BR,pt;q=0.8",
- O pacote olha primeiro para a base de dados e depois para o arquivo seguindo o padrão Iterator, nas próximas versões inverteremos, mas nada que irá modificar o seu uso.
-
Tradução do banco de dados
- Caso queira utilizar o Sqlite veja a sessão Use SQLite, no link é visto como configurar de forma simples com alguns passos rodando:
php artisan gsferro:configure-sqlite
- Na Sessão Tradução do Banco de Dados, é explicado como configurar o pacote para traduzir um ou múltiplas tabelas e colunas no arquivo
config/translationsolutioneasy
:php artisan gsferro:translate-tables
- Caso queira utilizar o Sqlite veja a sessão Use SQLite, no link é visto como configurar de forma simples com alguns passos rodando:
TODO
-
Traduzir automaticamente informações digitadas pelos usuários?
- se sim, usar Observer ou listener?
-
Ao traduzir automaticamente, ter a opção de uma verificação interna (PF / time) e/ou dos usuários do sistema poderem sugerir melhores traduções.
-
Dependências:
- https://github.com/spatie/laravel-translation-loader/tree/2.6.3
- https://github.com/mcamara/laravel-localization/
Versões
Instalação
composer require gsferro/translation-solution-easy php artisan vendor:publish --provider="Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider" php artisan vendor:publish --provider="Gsferro\TranslationSolutionEasy\Providers\TranslationSolutionEasyServiceProvider" --force
- Faz
mergeConfigFrom
no ServiceProvider colocando o locale deapp.php
comopt-br
-
TODO trocar configuração via command
Configurações de uso
-
No arquivo base de html deve ser colocado:
<html lang="{{ strtolower(str_replace('_', '-', app()->getLocale())) }}">
-
Para o fácil encapsulamento e visando os testes automatizados:
- Crie o arquivo
routes/withLacale.php
<?php if (app()->environment("testing")) { require "web.php"; } else { Route::prefix(LaravelLocalization::setLocale()) ->middleware(["localeSessionRedirect", "localizationRedirect", "localeViewPath"]) ->group(function () { require "web.php"; }); }
- Altere
RouteServiceProvider@mapWebRoutes
Route::middleware("web") ->namespace($this->namespace) ->group(base_path("routes/withLacale.php"));
- Para mais detalhes, veja a sessão Informações adicionais
- Crie o arquivo
-
Caso não opte por Use SQLite, execute no terminal:
php artisan migrate --path=database/migrations/translation
- Caso use uma outra conexão:
php artisan migrate --path=database/migrations/translation --database=<outra-conexão>
- Caso use uma outra conexão:
-
Acesse
config/laravellocalization
e sete quais linguas a sua aplicação irá dar suporte- default:
pt-br
en
- default:
-
Inclua a seleção para troca de idiomas
@translationsolutioneasyFlags()
- Ele precisa estar encapsulado pela tag
<ul>
- Talvez seja necessário ajustar o
public/vendor/gsferro/translationsolutioneasy/css/flags.css
dependendo de onde for colocado
Use SQLite
- Command para criar database
php artisan gsferro:configure-sqlite {--database= : Database name}
- Faz
mergeConfigFrom
no ServiceProvider mesclando a nova config emconfig/database
econfig/translationsolutioneasy
- Migrate
php artisan gsferro:configure-sqlite-migrate
- Caso queria deixar de usar o SQLite para usar outro SGBD, excluir arquivos de
vendor/gsferro/translation-solution-easy/config/sqlite
Tradução dos Arquivos
- Execute o comando via artisan, passe os paramentros caso queira rodar somente em um único arquivo ou lang
php artisan gsferro:translate-files [--file= : File name] [--lang= : Language] [--force : : default false, execute translate if no exists]
Tradução do Banco de Dados
-
Coloque em
config/translationsolutioneasy.translate-tables
as tabelas com o(s) campo(s) que deseja traduzir:- ex:
"translate-tables" => [ "paises" => "nome", // ou "servicos" => [ "nome", "descricao", "observacoes", ] ],
- Obs: Coloque somente as colunas que fazem sentido serem traduzidas. Colunas contendo datas e numero não fazem.
-
Nas Models:
- Coloque a interface
TranslationColumnsInterface
- Coloque a Trait
TranslationColumnsTrait
- Caso não tenha configurado o item 1 (inline), sete o atributo
public $translationColumns = ["<name-column1>", ...]
- Coloque a interface
-
Execute o comando via artisan, passe os paramentos caso queira rodar somente numa única tabela/coluna (inline)
php artisan gsferro:translate-tables [--table= : Table name] [--column= : Collumn name] [--lang= : Language] [--force : : default false, execute translate if no exists]
TODO
- Ter a opção de passar a model e pegar as informações direto dela, assim é viável fazer traduções em multiplas conexões de banco de dados.
Informações Adicionais / Importantes
-
Atenções ao escolher o SGBD que for usado para a tradução, dependendo da escolha será necessário alterar o migrate gerado ao publicar este pacote:
sqlite
:- Tem uma limitação de tamanho de
varchar
(string no migrate) de 500 caracteres usado no campokey
;
- Tem uma limitação de tamanho de
sql server
:- Não recomenda que seja usado o campo do tipo
text
, pois em alguma versão ele sera descontinuado, o limite atual do varchar é 8k;
- Não recomenda que seja usado o campo do tipo
- o campo
key
esta como string, ou seja, pela configuração do laravel, tera o length de 191, conforme o seu projeto, talvez seja necessário aumentar;
-
Option
--force
:- Add na v1.3.0, por default é false, ou seja, só ira buscar uma tradução caso não exista para a lingua escolhida, diminuindo substancialmente o tempo;
- Caso coloque como true, executara para todos, pode demorar horas dependendo do tamanho do arquivo ou tabela.
-
O limite para cada tradução é de 3k caracteres
-
Testing:
- ARCANEDEV/Localization#113 (working)
- https://github.com/mcamara/laravel-localization#testing (not working)
-
Cache das rotas:
-
Post not work:
-
Traduzir rotas:
Credits
License
Laravel Localization is an open-sourced laravel package licensed under the MIT license