Desenvolvimento

6 mar, 2017

Trabalhando com internacionalização no Laravel

Publicidade

É comum a necessidade de se criar sites que possuam mais de um idioma, tudo isso devido a grande expansão das empresas e seus negócios. Os públicos-alvo desse produto, na maioria das vezes, se encontram espalhados por diversas regiões, falam línguas diferentes e precisam receber a informação e/ou serviço que é oferecido através da web.

Utilizando o Laravel para desenvolvimento de sites e aplicações web, conseguimos de maneira clara e fácil criar aplicações com multi-idiomas. A facilidade acontece devido ao framework já ter abstraído toda parte relativa ao problema, fornecendo uma solução onde, em poucos minutos, conseguimos ter um exemplo de uma aplicação em vários idiomas.

Instalação e configuração

Para iniciar, é necessário criar um projeto Laravel utilizando composer através do seguinte comando: composer create-project –prefer-dist laravel/laravel multiidioma.

Para esse artigo, foi executado um terminal em s.o linux, mas o comando irá funcionar para qualquer s.o que possuir o composer instalado.

Após o término da execução do comando, é possível rodar o projeto da seguinte maneira, entrando no diretório onde o projeto foi criado, como, por exemplo: cd var/www/html/multiidioma.

E estando dentro do diretório, podemos subir nossa aplicação utilizando um comando do Laravel em nosso terminal: php artisan serv.

Com o servidor executando com sucesso, podemos ver a seguinte mensagem no terminal: Laravel development server started: <http://127.0.0.1:8000.

Temos uma aplicação rodando no seguinte endereço  http://127.0.0.1:8000 ou  http://localhost:8000.

Criando a view e o diretório resources

No diretório resources é onde ficam organizadas as nossas views e todo conjunto de elementos pertinentes a elas, inclusive os elementos necessários para exibição de conteúdo a serem internacionalizados.

Iremos criar uma view idiomas.blade.php, a extensão blade é devido ao fato do Blade ser o gerenciador de templates nativo do Laravel.

Então, no diretório: multiidioma/resources/views/idiomas.blade.php.

O código para o arquivo idiomas.blade. php é:

<html>
    <head>
        <title>I18N Laravel</title>
    </head>
    <body>
        <h2>Trabalhando com ídiomas no Laravel</h2>
        <ul>
            <li>
                <a href="<?php echo url("idiomas/br"); ?>">Brasil</a>
            </li>
            <li>
                <a href="<?php echo url("idiomas/en"); ?>">Inglês</a>
            </li>
            <li>
                <a href="<?php echo url("idiomas/es"); ?>">Espanhol</a>
            </li>
        </ul>
    </body>
</html>

Criando a rotas HTTP

Com o arquivo criado, vamos criar uma rota HTTP que irá carregar essa view para que possamos, então, trabalhar com os idiomas de fato. Para criar uma rota no Laravel, é necessário alterar um arquivo que está localizado no seguinte diretório: multiidiomas/routes/web.php.

Inserimos o seguinte código nesse arquivo:

<?php
	use Illuminate\Http\Request;

	Route::get('/idiomas', function () {
    		return view('idiomas');
	});

Ao executar a aplicação rodando php artisan serv, teremos no seguinte endereço http://localhost:8000/idiomas o resultado mostrado na imagem:

Criando o conteúdo em diferentes idiomas

Com a view criada e sendo acessada, podemos nos atentar em conhecer o seguinte diretório: multiidiomas/resources/lang.

Ele é responsável por segregar e manter organizado os conteúdos que devem estar em vários idiomas. Por padrão, o Laravel já fornece o diretório resources/lang/en que organiza todo um conjunto de elementos no idioma inglês. No diretório resources/lang, iremos criar os seguintes sub-diretórios chamados br e es e, dentro de cada um, vamos criar um arquivo chamado conteudo.php. Esse arquivo irá retornar um array quando for chamado, esse array irá conter as informações a serem internacionalizadas.

Segue a estrutura de como os diretórios e os respectivos códigos podem ser organizados: multiidiomas/resources/lang/br/conteudo.php:

<?php

	return 	[
    			'mensagem' => 'Oĺá mundo'
		];

multiidiomas/resources/lang/en/conteudo.php:

<?php

	return 	[
			'mensagem' => 'Hola mundo'
		];

multiidiomas/resources/lang/es/conteudo.php:

<?php

	return 	[

    			'mensagem' => 'Hellow word'
		];

Para cada arquivo criado, apenas o valor do índice desse array deve variar de acordo com o idioma.

Alterando o arquivo de rotas

Para atingir o objetivo, o arquivo de rotas foi alterado ficando da seguinte forma:

<?php
	use Illuminate\Http\Request;

	Route::get('/idiomas', function () {
    		return view('idiomas');
	});
	Route::get('/idiomas/{idioma}', function (Request $request) {
   	 	$idioma = $request->route('idioma');
    		app()->setLocale($idioma);
    		$dados['mensagem'] = trans('conteudo.mensagem');
    		return view('idiomas', $dados);
	});

A segunda rota recebe um idioma como parâmetro, recuperando o valor dele e, em tempo de execução, utilizando o facede app() do Laravel, é possível setar a localização do idioma que a aplicação deve executar. Ao utilizar o helper trans(), ele traduz o conteúdo de acordo com os arquivos de idioma da aplicação, onde o conteúdo é o nome do arquivo criado nos diretórios lang, e a mensagem o índice do array a ser acessado; o helper trans() acessa o diretório conforme a configuração definida com app()->setLocale($idioma) e que pode ser recuperada através de app()->getLocale().

Com isso feito, setamos um array com um índice mensagem que será o conteúdo exibido nos três idiomas que foram criados.

Modificando a view para exibir o conteúdo

Por fim, o código da view alterado para receber a mensagem internacionalizada será:

<html>
    	<head>
        		<title>I18N Laravel</title>
    	</head>
    	<body>
        		<h2>Trabalhando com ídiomas no Laravel</h2>
        		<ul>
           			 <li>
                			<a href="<?php echo url("idiomas/br"); ?>">Brasil</a>
            		</li>
            		<li>
                			<a href="<?php echo url("idiomas/en"); ?>">Inglês</a>
            		</li>
            		<li>
                			<a href="<?php echo url("idiomas/es"); ?>">Espanhol</a>
            		</li>
        		</ul>
        		<?php
            		if(isset($mensagem))
                			echo $mensagem;
        		?>
    	</body>
</html>

Com isso, ao clicar sobre um dos links, o conteúdo a ser exibido será correspondente ao de cada arquivo de idioma criado em um dos diretórios br, en ou es.

Dessa maneira, é necessário apenas criar um novo diretório para cada novo idioma e agrupar todos os elementos que deseja internacionalizar, respeitando sempre o mesmo padrão para todos os idiomas.

Configurando localidade

O arquivo app.php que está localizado no diretório: config/app.php fornece uma forma de configurar a localização padrão e também a localização caso não encontre uma que tenha sido definida. Elas são mostradas na respectiva ordem logo abaixo:

‘locale’ => ‘br’,

‘fallback_locale’ => ‘br’,

Onde locale define a localização padrão da aplicação e a segunda fornece uma localidade padrão, caso a primeira não tenha sido definida.

Conclusão

Com o exemplo a seguir, é possível iniciar e amadurecer um projeto fornecendo o conteúdo em mais de um idioma utilizando Laravel. O framework facilita e, de forma rápida e organizada, permite a criação de conteúdos internacionalizados.

Pontos como trabalhar diretamente com arquivos php retornando um array torna mais direto o desenvolvimento sem precisar de arquivos externos. As facilidades trazidas pelos facades app() e o helper trans() deixam claro o objetivo do código em questão permitindo um fácil entendimento.