Skip to content

Instantly share code, notes, and snippets.

@felds
Created May 16, 2012 15:06
Show Gist options
  • Save felds/2711044 to your computer and use it in GitHub Desktop.
Save felds/2711044 to your computer and use it in GitHub Desktop.
"Traduzindo" o sistema

Traduzindo o sistema

Antes de mais nada, é importante avisar que esta não é uma documentação detalhada e, por isso, não substitui a documentação oficial.

Padrões utilizados

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.

Traduzindo textos diversos (títulos, nomes de campos etc)

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.

Traduzindo mensagens de validação

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment