<div dir="ltr">Pronto!<div><br></div><div>Esse é o plugin:</div><div><br></div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm">https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm</a><br>

</div><div><br></div><div>no banco, você precisa da tabela:</div><div><div><br></div><div><font face="courier new, monospace" size="1">CREATE TABLE lexicon</font></div><div><font face="courier new, monospace" size="1">(</font></div>

<div><font face="courier new, monospace" size="1">  id serial NOT NULL,</font></div><div><font face="courier new, monospace" size="1">  lang character varying(15) DEFAULT NULL::character varying,</font></div><div><font face="courier new, monospace" size="1">  lex character varying(255) DEFAULT NULL::character varying,</font></div>

<div><font face="courier new, monospace" size="1">  lex_key text,</font></div><div><font face="courier new, monospace" size="1">  lex_value text,</font></div><div><font face="courier new, monospace" size="1">  notes text,</font></div>

<div><font face="courier new, monospace" size="1">  user_id integer,</font></div><div><font face="courier new, monospace" size="1">  created_at timestamp without time zone NOT NULL DEFAULT now(),</font></div><div><font face="courier new, monospace" size="1">  origin_lang character varying NOT NULL DEFAULT 'pt-br'::character varying,</font></div>

<div><font face="courier new, monospace" size="1">  CONSTRAINT lexicon_pkey PRIMARY KEY (id)</font></div><div><font face="courier new, monospace" size="1">);</font></div></div><div><br></div><div>Como ele usa a sub <span style="color:rgb(153,0,0);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;font-weight:bold;line-height:18px;white-space:pre">initialize_after_setup </span>precisamos, para usa-lo, adicionar tambem isso daqui no Projeto.pm:</div>

<div><a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota.pm#L82">https://github.com/AwareTI/Iota/blob/master/lib/Iota.pm#L82</a><br></div><div><br></div><div>Isso faz o plugin carregar depois que os outros já foram carregados (o model já esta disponivel, por exemplo)</div>

<div><br></div><div>adicionei um metodo para trocar a linguagem via cookie,</div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L31">https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L31</a><br>

</div><div><br></div><div>depois disso, no inicio de todos os requests (se você usar chained, você não terá problemas com isso)</div><div>eu tento encontrar o cookie, e se não for encontrado, eu tento procurar usando o <b>Accept-language </b>enviado pelo browser. </div>

<div><a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L125">https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L125</a><br></div><div><br></div><div>se não encontrado, o padrão é 'pt-br', esta fixo. </div>

<div><br></div><div>Depois eu envio o cookie na resposta, para salvar a preferencia:</div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L156">https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L156</a><br>

</div><div><br></div><div><br></div><div>Depois disso, é só utilizar $c->loc($palavra_ou_frase)</div><div><br></div><div>Isso automaticamente tenta encontrar a traducao no idioma atual (metodo set_lang($lang) <a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L154">https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L154</a>)</div>

<div><a href="https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L92">https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L92</a><br></div><div><br></div><div>depois, se não encontrar, ele:</div>

<div><br></div><div>pega os dados do usuario atual, se existir, ou salva com usando o "administrador de idiomas" </div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L96">https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L96</a><br>

</div><div><br></div><div>pega a lista de todas os idiomas que é 'forçado' existir a tradução:</div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L97">https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L97</a><br>

</div><div><br></div><div>para todas as linguas que é necessário existir a tradução, ele insere no banco caso não exista.</div><div><br></div><div>Se o idioma que ele ta tentando inserir for igual ao idioma de escrita do usuário, ele salva sem "?" na frente,</div>

<div>caso contrario, ele salva a palavra com "? $palavra", assim, depois para procurar quais palavras estão pendentes de tradução, </div><div>pode-se fazer um select com WHERE lex_value like '? %'.</div>

<div><br></div><div>Existe uma view/controller com um form (precisa apenas a api_key como parametro) que lista todas as palavras pendentes para o usuário da api_key informada:</div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Lexicon.pm#L42">https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Lexicon.pm#L42</a><br>

</div><div><br></div><div>No admin, eu fiz um painel que mostra um aviso se tem palavras pendentes:</div><div><img src="http://i.imgur.com/CkHZCt7.png"><br></div><div><img src="http://i.imgur.com/UdwCO7t.png"><br></div><div>

{podem tentar usar a chave, não vai funcionar =p}</div><div><br></div><div><br></div><div>Como o sistema já estava no ar, não podia utilizar lex_key normalizadas, então a chave é a palavra ou texto mesmo.</div><div><br></div>

<div>Como também não temos tempo para alterar todos os endpoints que escrevem no banco, mandando 'adicionar' a palavra como pendente, fizemos isso em todos os POST's autenticados para a API, com algumas exceções.</div>

<div><br></div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/API.pm#L193">https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/API.pm#L193</a><br></div><div><br></div><div>bem feio, mas funciona legal! </div>

<div><br></div><div><br></div><div>Como o admin é feito em javascript, e tambem tinhas palavras que eram exibidas lá, e que já podiam estar salvas faz tempo, fiz um outro enpdoint que recebe algo como</div><div>POST lexicons </div>

<div>api_key: 123456</div><div>lex=nova palavra</div><div>lex=outra palavra</div><div>lex=mais uma palavra</div><div><br></div><div>e ai ele tenta inserir no banco, se elas não existem.</div><div><br></div><div>Se alguem quiser olhar, fica no api.js aqui, <a href="https://github.com/AwareTI/Iota-Admin-Frontend/blob/master/js/">https://github.com/AwareTI/Iota-Admin-Frontend/blob/master/js/</a></div>

<div>dica: vai travar seu browser de tanto .js que tem ai =/</div><div><br></div><div><br></div><div>Se todas suas views forem em renderizadas pelo servidor, você não precisa se preocupar, pois quando você fizer um [% l( texto ) %] você já vai salvar.</div>

<div><br></div><div>Ah, você precisa criar essa função "l" para a view!</div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota/View/HTML.pm#L87">https://github.com/AwareTI/Iota/blob/master/lib/Iota/View/HTML.pm#L87</a><br>

</div><div><br></div><div>e declarar ela para ser exportada</div><div><a href="https://github.com/AwareTI/Iota/blob/master/lib/Iota.pm#L68">https://github.com/AwareTI/Iota/blob/master/lib/Iota.pm#L68</a><br></div><div><br>

</div><div>Espero ter ajudado.</div><div>E as configurações:</div><div><a href="https://github.com/AwareTI/Iota/blob/master/iota.conf#L5">https://github.com/AwareTI/Iota/blob/master/iota.conf#L5</a><br></div><div><span style="color:rgb(51,51,51);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:18px;white-space:pre;background-color:rgb(255,255,204)">admin_langs_id=id do usuario admin, ele que fica com o user_id se nao existir $c->user</span></div>

<div><span style="color:rgb(51,51,51);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:18px;white-space:pre">default_lang=lingua padrão</span></div><div><span style="color:rgb(51,51,51);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:18px;white-space:pre">forced_langs=linguas que sao obrigatorias a existir quando uma nova palavra é adicionada</span><span style="color:rgb(51,51,51);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:18px;white-space:pre"><br>

</span></div><div><span style="color:rgb(51,51,51);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:18px;white-space:pre">available_langs=linguas disponiveis</span></div><div><span style="color:rgb(51,51,51);font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;line-height:18px;white-space:pre"><br>

</span></div><div>antes de toda essa parte de precisar saber quem estava salvando qual palavra, eu estava utilizando o <a href="https://metacpan.org/module/Catalyst::Plugin::I18N::DBI#Why-does-the-database-user-needs-write-access-Or:-Whats-the-fail_with-function">https://metacpan.org/module/Catalyst::Plugin::I18N::DBI#Why-does-the-database-user-needs-write-access-Or:-Whats-the-fail_with-function</a><br>

</div><div><br></div><div>porem, o prefetch que ele faz não funciona quando as lex_key tem acentuação, e isso pode ser um problema serio se você utiliza um sistema cheio de palavras.</div><div>quando eu fui procurar a causa, começou chegar lá no <a href="https://metacpan.org/source/TODDR/Locale-Maketext-1.23/lib/Locale/Maketext.pm#L498">https://metacpan.org/source/TODDR/Locale-Maketext-1.23/lib/Locale/Maketext.pm#L498</a> e ai eu desisti!</div>

<div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/9/20 Lucas Moraes <span dir="ltr"><<a href="mailto:lucastiagodemoraes@gmail.com" target="_blank">lucastiagodemoraes@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Valeu Renato</div><div class="gmail_extra"><br><br><div class="gmail_quote">Em 20 de setembro de 2013 07:24, Renato Santos <span dir="ltr"><<a href="mailto:renato.cron@gmail.com" target="_blank">renato.cron@gmail.com</a>></span> escreveu:<div>

<div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">Hahaha to no celular de novo!! Foi mal kk</p>
<p dir="ltr">Ele tá no lib/CatalystX/Plugin/Lexicon </p>
<p dir="ltr">A tabela é a mesma do catalyst plugin i18n dbic só que tem o campo "origin lang" she é o idioma que a key está escrita e o user-id que é quem escreveu (pois fica pendente pra ele traduzir depois) </p>


<div><div>

<div class="gmail_quote">On Sep 20, 2013 7:18 AM, "Lucas Moraes" <<a href="mailto:lucastiagodemoraes@gmail.com" target="_blank">lucastiagodemoraes@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div dir="ltr">Eu perguntei novamente porque você escreveu isso: "<span style="font-family:arial,sans-serif;font-size:13px">To no celular, daqui a pouco explico mais."</span><div><span style="font-family:arial,sans-serif;font-size:13px">:)</span></div>




</div><div class="gmail_extra"><br><br><div class="gmail_quote">Em 20 de setembro de 2013 07:15, Renato Santos <span dir="ltr"><<a href="mailto:renato.cron@gmail.com" target="_blank">renato.cron@gmail.com</a>></span> escreveu:<br>




<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">Tá lá no repositório do Iota. :-) </p>
<div class="gmail_quote"><div>On Sep 20, 2013 4:17 AM, "Lucas Moraes" <<a href="mailto:lucastiagodemoraes@gmail.com" target="_blank">lucastiagodemoraes@gmail.com</a>> wrote:<br type="attribution">
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>
<div dir="ltr">Vou esperar a resposta do Renato, mas estava pensando em fazer via banco de dados, depois é só fazer um select com dentro de sub begin :Private {}, aceito dica na modelagem das tabelas :)<div>Valeu.</div></div>






<br></div><div>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></div></blockquote></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div>
</div></div><br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div></div></div><br></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><span style="color:rgb(51,51,51);font-size:x-small">Saravá,</span></div><div><span style="color:rgb(51,51,51);font-size:x-small">Renato CRON</span></div>

<div><div style="text-align:right"><font size="1" color="#333333"><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a></font></div></div><div style="text-align:right"><font size="1" color="#333333"><a href="http://twitter.com/#!/renato_cron" target="_blank">@renato_cron</a></font></div>


</div>