Devo usar t () na descrição de um hook_menu?

11

Eu sempre usei t () para o título e descrição do hook_menus como este:

$items['some-path'] = array(
    'title' => t('My Page Title'),
    'description' => t('This is a description about what my page is for'),
    'page callback' => 'profile_user_page',
);

Isso faz sentido para mim, para que os usuários possam traduzir o título e a descrição em diferentes idiomas, se necessário.

No entanto, este comentário em uma revisão de módulo no DO diz:

Não, está errado, não faça isso - as descrições em hook_menu () nunca devem usar t ().

Qual o motivo disso e essa é realmente a melhor prática?

Além disso, se isso for verdade, não devemos usar t () também para o título?

Felix Eve
fonte
É evidente que esta não deve ser usado, em seguida, mas se você pesquisar na hook_menu página de ajuda para "description'=> t (" há 6 ocorrências tão claramente este é um erro comum!
Felix Eve
1
Comum ou não, não é uma desculpa;) E essas ocorrências estão nos comentários - as pessoas são livres para se enganarem por lá.
Mołot
1
@ Mołot Eles são livres para se enganarem por lá, no entanto, muitos usuários novos copiam e colam esse código, então isso continuará sendo um erro comum. Eu acho que alguém com privilégios de administrador no DO deve editar esses comentários para remover o t ().
Felix Eve
Você pode registrar um problema, se desejar.
Mołot
1
Boa sugestão. Feito .
Felix Eve

Respostas:

17

Consulte Strings em locais conhecidos: menus internos, permissões, mensagens de log e documentação da comunidade de arquivos .info :

O sistema de menus Drupal 6 e 7 armazena títulos e descrições de itens de menu em inglês. Isso permite que o sistema armazene em cache os dados, mas seja exibido para usuários que usam vários idiomas sob demanda. Para que isso funcione, você não deve usar t () no título ou na descrição dos itens de menu na sua implementação hook_menu (). Além disso, você deve tentar usar uma string literal (em vez de uma string dinâmica) para essas duas chaves, para que o extrator do modelo de conversão possa encontrar a string usada.

Ênfase minha.

Mołot
fonte
Eu acrescentaria: Só se title callbacknão está definido porque, por padrão title callbacké t()função
milkovsky
1
@milkovsky, se o retorno de chamada de título estiver definido, ele deve ser cuidado t()e você ainda não deve usá-lo hook menu()- você sabe, armazenando em cache.
Mołot 16/04
11

Se você vir a documentação dos argumentos hook_menu ..

  • "title": obrigatório. O título não traduzido do item de menu.
  • "título de retorno de chamada": Função para gerar o título; o padrão é t (). Se você precisar que apenas a sequência bruta seja impressa, defina-a como FALSE.
  • "title argument": argumentos a serem enviados para t () ou seu retorno de chamada personalizado, com a substituição do componente do caminho, conforme descrito acima.
  • "description": a descrição não traduzida do item de menu.

Por padrão, o retorno de chamada do título é a função t. Portanto, ele é sempre traduzido.

Anil Sagar
fonte
7

Desde Drupal 6 não é mais necessário.

Leia https://drupal.org/node/140311 . Citando que:

A partir do 6.x, o Drupal processa internamente a tradução de títulos e descrições de menus no idioma local do usuário. As descrições, se fornecidas, são sempre traduzidas com t (); não há como passar dados adicionais para a substituição de espaços reservados (em D5 e antes, passar substituições era uma prática desencorajada - com essa alteração, o sistema de menus impõe essa regra diretamente). Os títulos são traduzidos com t () por padrão, mas a substituição de sequência no estilo t () é possível através do uso da nova propriedade 'title argument'. Você também pode optar por substituir t () pelo seu retorno de chamada personalizado.

penyaskito
fonte
6

Você não deve usar t()em hook_menu()implementações porque t()é automaticamente chamado mais tarde e isso causaria conversão dupla.

Aram Boyajyan
fonte
* Observe que se você adicionar um title callbackno hook_menu, e se não estiver t, o retorno de chamada do título será responsável por converter a string.
precisa saber é o seguinte