Antes de mais nada, é importante avisar que esta não é uma documentação detalhada e, por isso, não substitui a documentação oficial.
O ideal é que todos os textos estáticos (ou seja: que forem criados pelo usuário) sejam traduzíveis.
Esta é uma prática que parece sem sentido em sistemas com um único idioma, porém economiza muito tempo na hora de fazer alterações.
Como muitos dos textos de um sistema são reutilizados em várias telas, os arquivos de tradução promovem uma boa consistência, servindo como um “repositório de termos”, evitando que a mesma coisa receba vários nomes diferentes pelo sistema.
Além disso, também evita a substituição de texto em massa, que sempre traz problemas.
Vamos levar como exemplo este twig:
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<title>Título do sistema</title>
<h1>Lista de produtos</h1>
<div class="alert"><p>Produto inserido com sucesso</p></div>
<table>
<tr><th>Nome <th>Quantidade <th>Ações
<tr><td>Produto 1 <td>10 <td><a href="#">editar</a>
</table>
<p><a href="#">Criar um novo produto</a>
</html>
Partindo disso, devemos identificar os textos traduzíveis e aplicar neles o filtro trans
.
Além disso, para facilitar a organização dos termos, transformamos os textos em chaves, que não refletem o que está escrito, mas sim o que aquele texto representa (mais detalhes àfrente).
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<title>{{ 'title'|trans }}</title>
<h1>{{ 'product.list.title'|trans }}</h1>
<div class="alert"><p>{{ 'product.flash.new.success'|trans }}</p></div>
<table>
<tr>
<th>{{ 'product.field.name'|trans }}
<th>{{ 'product.field.quantity'|trans }}
<th>{{ 'product.list.actions'|trans }}
<tr>
<td>Produto 1
<td>10
<td><a href="#">{{ 'product.action.edit' }}</a>
</table>
<p><a href="#">{{ 'product.action.new' }}</a>
</html>
Como não foi definido nenhum catálogo de tradução, os termos serão pegos do catálogo padrão (messages).
O catálogo para o Português, então, ficaria assim:
title: Título do sistema
product:
list:
title: Lista de produtos
actions: Ações
action:
edit: Editar produto
new: Novo produto
field:
name: Nome
quantity: Quantidade
flash:
new:
success: Produto inserido com sucesso
Outra vantagem de usar a tradução como catálogo de termos é que ele é usado automaticamente em formulários.
Por exemplo, se quisermos que os campos do formulário de produtos também usem estes termos, é só passá-los como label
do campo na hora de criar o *Type
:
$builder
->add('name', null, array('label' => 'product.field.name'))
->add('quantity', null, array('label' => 'product.field.quantity'));
Ao usar uma decalaração do tipo {{ form_label(form.name) }}
, a tradução é utilizada automaticamente.
Para traduzir as mensagens de validação, o catálogo de tradução padrão é o validators
. Fora isso, o processo é muito parecido.
Configuram-se as mensagens na entidade como chaves semânticas seguindo o padrão nome_da_entidade.nome_da_propriedade.tipo de mensagem
.
<?php
// ...
/**
* @var string Name
* @Assert\NotBlank("product.name.blank")
* @Assert\MinLength(limit=3, message="product.name.short")
*/
protected $name;
?>
O catálogo deve ser organizado da seguinte maneira:
product:
name:
blank: O valor não deve estar em branco.
short: O nome deve ter, ao menos, {{ limit }} caracteres.
Ao ser exibido, as chaves serão automaticamente traduzidas para o “locale” padrão do usuário.
Para mais informações, visite a documentação oficial.