{"id":978,"date":"2018-08-26T20:19:44","date_gmt":"2018-08-26T23:19:44","guid":{"rendered":"https:\/\/felipeelia.com.br\/?p=978"},"modified":"2019-02-15T18:39:09","modified_gmt":"2019-02-15T21:39:09","slug":"como-funciona-a-traducao-no-wordpress","status":"publish","type":"post","link":"https:\/\/felipeelia.com.br\/como-funciona-a-traducao-no-wordpress\/","title":{"rendered":"Como funciona a tradu\u00e7\u00e3o no WordPress"},"content":{"rendered":"\n

A inten\u00e7\u00e3o deste texto \u00e9 servir como introdu\u00e7\u00e3o \u00e0 tradu\u00e7\u00e3o no WordPress, facilitando o entendimento dos conceitos b\u00e1sicos envolvidos no processo. Nada substitui a documenta\u00e7\u00e3o oficial de internacionaliza\u00e7\u00e3o de temas<\/a> e plugins<\/a>. No momento a vers\u00e3o do WordPress \u00e9 a 4.9.8, ent\u00e3o se voc\u00ea est\u00e1 lendo isso no futuro e alguma coisa ficou desatualizada, voc\u00ea pode me avisar<\/a>.<\/p>\n\n\n\n

Al\u00e9m de tradu\u00e7\u00e3o, voc\u00ea vai encontrar dois termos importantes neste texto: internacionaliza\u00e7\u00e3o<\/strong> e localiza\u00e7\u00e3o<\/strong>. Internacionaliza\u00e7\u00e3o \u00e9 o processo de produzir um material, no nosso caso temas, plugins e o pr\u00f3prio WordPress, de forma que ele possa ser traduzido para v\u00e1rios grupos diferentes de pessoas. Localiza\u00e7\u00e3o \u00e9 o processo de transformar um material internacionalizado em algo de f\u00e1cil entendimento para pessoas de uma determinada cultura.<\/p>\n\n\n\n\n\n\n

Os dois conceitos s\u00e3o complementares: internacionaliza\u00e7\u00e3o \u00e9 um movimento “pra fora”<\/strong>, alcan\u00e7ando o maior n\u00famero poss\u00edvel de pessoas, e localiza\u00e7\u00e3o \u00e9 um movimento “pra dentro”<\/strong>, focando em um n\u00famero mais especializado de indiv\u00edduos.<\/p>\n\n\n\n

Em outros materiais voc\u00ea vai encontrar o termo internacionaliza\u00e7\u00e3o como i18n<\/em><\/strong>, porque existem 18 letras entre o i e o n da palavra em ingl\u00eas internationalization<\/em>. Da mesma forma localiza\u00e7\u00e3o tamb\u00e9m aparece com l10n<\/em><\/strong>, vindo de localization<\/em>.<\/p>\n\n\n\n

Por que<\/g> isso<\/g> \u00e9 importante?<\/h2>\n\n\n\n

\u00c9 f\u00e1cil deduzir porque o processo de localiza\u00e7\u00e3o \u00e9 importante quando voc\u00ea tem um tema ou plugin em ingl\u00eas e precisa dele em portugu\u00eas. \u00c9 o processo de internacionaliza\u00e7\u00e3o que muitas vezes \u00e9 dif\u00edcil de ser levado em considera\u00e7\u00e3o. Deixo aqui, ent\u00e3o, duas coisas para voc\u00ea pensar:<\/p>\n\n\n\n

  1. O core<\/em>, plugins e temas do reposit\u00f3rio s\u00e3o obrigatoriamente<\/em> em ingl\u00eas;<\/li>
  2. O esfor\u00e7o de deixar seu tema ou plugin traduz\u00edvel durante o desenvolvimento \u00e9 muito menor do que fazer isso depois que ele estiver pronto. Seu cliente pode at\u00e9 n\u00e3o querer o site em outro idioma hoje, mas ele pode mudar de ideia amanh\u00e3.<\/li><\/ol>\n\n\n\n

    O item 2 tamb\u00e9m est\u00e1 relacionado com a sua reputa\u00e7\u00e3o.<\/strong> Algu\u00e9m que pegar um c\u00f3digo legado seu pode pensar que voc\u00ea fez aquilo de maneira desleixada, ou pior, por n\u00e3o saber como isso funciona ou sequer que isso existia.<\/p>\n\n\n\n

    Se voc\u00ea pensou “eu n\u00e3o ligo pro que os outros pensam de mim”, eu vou respeitar isso. S\u00f3 prefiro n\u00e3o ter que manter um c\u00f3digo que voc\u00ea fez xD<\/p>\n\n\n\n

    Para o core<\/em> as strings sempre ser\u00e3o em ingl\u00eas, mas para projetos privados as strings originais, presentes no c\u00f3digo, podem estar em portugu\u00eas mesmo.<\/p>\n\n\n\n

    O b\u00e1sico do gettext<\/g><\/em><\/h2>\n\n\n\n

    O b\u00e1sico do gettext<\/em> que vamos precisar entender agora \u00e9 como os arquivos funcionam.<\/p>\n\n\n\n

    Arquivos .po<\/em><\/h3>\n\n\n\n

    Os arquivos .po<\/em> (PO de Portable Object<\/em>) s\u00e3o os arquivos edit\u00e1veis. S\u00e3o arquivos de texto, com as strings de origem, normalmente em ingl\u00eas, e as de destino, no nosso caso em portugu\u00eas, sendo um arquivo .po<\/em> por idioma. Embora eles sejam arquivos de texto aberto \u00e9 altamente recomendado edit\u00e1-los com programas espec\u00edficos como o PoEdit<\/a> e o OmegaT<\/a>. A Sheila Gomes<\/a>, minha refer\u00eancia de tradu\u00e7\u00e3o aqui no Brasil, oferece bastante material sobre o OmegaT<\/a>.<\/p>\n\n\n\n

    Voc\u00ea tamb\u00e9m pode traduzir atrav\u00e9s da pr\u00f3pria interface do WordPress com um plugin chamado Loco Translate<\/a>. Falei sobre ele em um meetup h\u00e1 dois anos, pode ser que os slides<\/a> ajudem em alguma coisa.<\/p>\n\n\n\n

    Al\u00e9m de todas essas, existe ainda a melhor forma de traduzir, que \u00e9 atrav\u00e9s da ferramenta oficial<\/a>. Pretendo fazer um outro texto falando s\u00f3 sobre isso, mas o importante aqui \u00e9 que para traduzir dessa forma voc\u00ea deve seguir o nosso Guia de tradu\u00e7\u00e3o<\/a>.<\/p>\n\n\n\n

    Arquivos .mo<\/em><\/h3>\n\n\n\n

    No fim das contas, s\u00e3o esses os arquivos que contam. MO, de Machine Object<\/em>, s\u00e3o arquivos bin\u00e1rios gerados a partir dos arquivos .po<\/em> e que s\u00e3o lidos pelo servidor.<\/p>\n\n\n\n

    Embora sejam eles os arquivos que realmente importem, sempre mantenha o par .po\/.mo<\/em><\/strong>. S\u00e3o arquivos extremamente leves e ter o .po<\/em> \u00e0 m\u00e3o para gerar um novo .mo<\/em> pode salvar a sua vida.<\/p>\n\n\n\n

    Promete que nunca vai separar os dois arquivos, n\u00e9?<\/p>\n\n\n\n

    Arquivos .pot<\/em><\/h3>\n\n\n\n

    Menos famoso, mas n\u00e3o menos importante, esse formato \u00e9 o modelo para gerar novos arquivos .po<\/em>, ou seja, se um plugin ou tema tem um arquivo .pot<\/em>, voc\u00ea pode criar um .po<\/em> a partir dele, sem ter que analisar o c\u00f3digo atr\u00e1s de chamadas para as fun\u00e7\u00f5es de tradu\u00e7\u00e3o. Nos arquivos .pot<\/em> s\u00f3 existem as strings originais.<\/p>\n\n\n\n

    Na pr\u00e1tica, como<\/g> isso<\/g> funciona?<\/h2>\n\n\n\n

    Como exemplo, vamos pensar dentro do loop, no tema, um link para a interna do post:<\/p>\n\n\n\n

    <a href=\"<?php the_permalink(); ?>\">Read More<\/a><\/code><\/pre>\n\n\n\n

    Para deix\u00e1-lo traduz\u00edvel, seria s\u00f3 usar:<\/p>\n\n\n\n

    <a href=\"<?php the_permalink(); ?>\"><?php _e( 'Read More', 'meu-tema' ); ?><\/a><\/code><\/pre>\n\n\n

    Viu o meu-tema<\/code> ali? Esse \u00e9 o text domain<\/em>.<\/p>\n\n\n

    Definindo o text domain<\/em><\/h3>\n\n\n

    O text domain<\/em>, ou o dom\u00ednio do texto, serve para agrupar as strings por tema ou plugin e separ\u00e1-los do core<\/em>, que usa default<\/code> como dom\u00ednio.<\/p>\n\n\n

    Na pr\u00e1tica o seu dom\u00ednio pode at\u00e9 ser qualquer texto, mas sempre use o slug do seu tema ou plugin<\/strong>. Para temas e plugins hospedados nos reposit\u00f3rios do WordPress isso \u00e9 ainda mais fundamental: se o text domain<\/em> n\u00e3o for igual ao plugin, por exemplo, ele n\u00e3o ser\u00e1 traduz\u00edvel pelo GlotPress.<\/p>\n\n\n\n

    Como esse \u00e9 um par\u00e2metro aceito por todas as fun\u00e7\u00f5es de tradu\u00e7\u00e3o, voc\u00ea pode se sentir tentado a usar uma constante ou uma vari\u00e1vel. N\u00e3o fa\u00e7a isso. Use sempre o formato de texto, assim voc\u00ea aumenta a compatibilidade do seu c\u00f3digo com algumas ferramentas de an\u00e1lise. <\/p>\n\n\n\n

    Fun\u00e7\u00f5es de tradu\u00e7\u00e3o no WordPress<\/h2>\n\n\n

    No exemplo vimos a fun\u00e7\u00e3o _e()<\/code>, que imprime uma string traduzida. Ela faz par com a fun\u00e7\u00e3o __()<\/code>, que n\u00e3o imprime, mas retorna uma string traduzida. Elas funcionam como as fun\u00e7\u00f5es printf<\/code> e sprintf<\/code>, nativas do PHP e que tamb\u00e9m ser\u00e3o \u00fateis daqui a pouco.<\/p>\n\n\n

    Os nomes das fun\u00e7\u00f5es de tradu\u00e7\u00e3o do WordPress seguem alguns padr\u00f5es:<\/p>\n\n\n

    Se a gente fosse crian\u00e7a, tudo seria resolvido com um monte de ifs<\/em>. Se o idioma do site \u00e9 ingl\u00eas imprime Read More<\/em>, se for portugu\u00eas imprime Leia mais<\/em>. O problema \u00e9 que pode aparecer a necessidade e traduzir pra espanhol e esses ifs<\/em> ficariam (ainda mais) bizarros. Para n\u00e3o ter esse problema, o WordPress usa o gettext<\/a>.<\/p>\n\n\n\n