[SP-pm] Site com vários idiomas

Lucas Moraes lucastiagodemoraes at gmail.com
Fri Sep 20 13:10:49 PDT 2013


Valeu Renato! Parabéns pela explicação :)
Ate mais.


Em 20 de setembro de 2013 15:00, Renato Santos <renato.cron em gmail.com>escreveu:

> Pronto!
>
> Esse é o plugin:
>
> https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm
>
> no banco, você precisa da tabela:
>
> CREATE TABLE lexicon
> (
>   id serial NOT NULL,
>   lang character varying(15) DEFAULT NULL::character varying,
>   lex character varying(255) DEFAULT NULL::character varying,
>   lex_key text,
>   lex_value text,
>   notes text,
>   user_id integer,
>   created_at timestamp without time zone NOT NULL DEFAULT now(),
>   origin_lang character varying NOT NULL DEFAULT 'pt-br'::character
> varying,
>   CONSTRAINT lexicon_pkey PRIMARY KEY (id)
> );
>
> Como ele usa a sub initialize_after_setup precisamos, para usa-lo,
> adicionar tambem isso daqui no Projeto.pm:
> https://github.com/AwareTI/Iota/blob/master/lib/Iota.pm#L82
>
> Isso faz o plugin carregar depois que os outros já foram carregados (o
> model já esta disponivel, por exemplo)
>
> adicionei um metodo para trocar a linguagem via cookie,
> https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L31
>
> depois disso, no inicio de todos os requests (se você usar chained, você
> não terá problemas com isso)
> eu tento encontrar o cookie, e se não for encontrado, eu tento procurar
> usando o *Accept-language *enviado pelo browser.
> https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L125
>
> se não encontrado, o padrão é 'pt-br', esta fixo.
>
> Depois eu envio o cookie na resposta, para salvar a preferencia:
> https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L156
>
>
> Depois disso, é só utilizar $c->loc($palavra_ou_frase)
>
> Isso automaticamente tenta encontrar a traducao no idioma atual (metodo
> set_lang($lang)
> https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Web.pm#L154
> )
>
> https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L92
>
> depois, se não encontrar, ele:
>
> pega os dados do usuario atual, se existir, ou salva com usando o
> "administrador de idiomas"
>
> https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L96
>
> pega a lista de todas os idiomas que é 'forçado' existir a tradução:
>
> https://github.com/AwareTI/Iota/blob/master/lib/CatalystX/Plugin/Lexicon.pm#L97
>
> para todas as linguas que é necessário existir a tradução, ele insere no
> banco caso não exista.
>
> Se o idioma que ele ta tentando inserir for igual ao idioma de escrita do
> usuário, ele salva sem "?" na frente,
> caso contrario, ele salva a palavra com "? $palavra", assim, depois para
> procurar quais palavras estão pendentes de tradução,
> pode-se fazer um select com WHERE lex_value like '? %'.
>
> 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:
>
> https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/Lexicon.pm#L42
>
> No admin, eu fiz um painel que mostra um aviso se tem palavras pendentes:
>
>
> {podem tentar usar a chave, não vai funcionar =p}
>
>
> Como o sistema já estava no ar, não podia utilizar lex_key normalizadas,
> então a chave é a palavra ou texto mesmo.
>
> 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.
>
> https://github.com/AwareTI/Iota/blob/master/lib/Iota/Controller/API.pm#L193
>
> bem feio, mas funciona legal!
>
>
> 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
> POST lexicons
> api_key: 123456
> lex=nova palavra
> lex=outra palavra
> lex=mais uma palavra
>
> e ai ele tenta inserir no banco, se elas não existem.
>
> Se alguem quiser olhar, fica no api.js aqui,
> https://github.com/AwareTI/Iota-Admin-Frontend/blob/master/js/
> dica: vai travar seu browser de tanto .js que tem ai =/
>
>
> 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.
>
> Ah, você precisa criar essa função "l" para a view!
> https://github.com/AwareTI/Iota/blob/master/lib/Iota/View/HTML.pm#L87
>
> e declarar ela para ser exportada
> https://github.com/AwareTI/Iota/blob/master/lib/Iota.pm#L68
>
> Espero ter ajudado.
> E as configurações:
> https://github.com/AwareTI/Iota/blob/master/iota.conf#L5
> admin_langs_id=id do usuario admin, ele que fica com o user_id se nao
> existir $c->user
> default_lang=lingua padrão
> forced_langs=linguas que sao obrigatorias a existir quando uma nova
> palavra é adicionada
> available_langs=linguas disponiveis
>
> antes de toda essa parte de precisar saber quem estava salvando qual
> palavra, eu estava utilizando o
> https://metacpan.org/module/Catalyst::Plugin::I18N::DBI#Why-does-the-database-user-needs-write-access-Or:-Whats-the-fail_with-function
>
> 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.
> quando eu fui procurar a causa, começou chegar lá no
> https://metacpan.org/source/TODDR/Locale-Maketext-1.23/lib/Locale/Maketext.pm#L498 e
> ai eu desisti!
>
>
>
>
>
>
> 2013/9/20 Lucas Moraes <lucastiagodemoraes em gmail.com>
>
>> Valeu Renato
>>
>>
>> Em 20 de setembro de 2013 07:24, Renato Santos <renato.cron em gmail.com>escreveu:
>>
>> Hahaha to no celular de novo!! Foi mal kk
>>>
>>> Ele tá no lib/CatalystX/Plugin/Lexicon
>>>
>>> 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)
>>>  On Sep 20, 2013 7:18 AM, "Lucas Moraes" <lucastiagodemoraes em gmail.com>
>>> wrote:
>>>
>>>> Eu perguntei novamente porque você escreveu isso: "To no celular,
>>>> daqui a pouco explico mais."
>>>> :)
>>>>
>>>>
>>>> Em 20 de setembro de 2013 07:15, Renato Santos <renato.cron em gmail.com>escreveu:
>>>>
>>>>> Tá lá no repositório do Iota. :-)
>>>>> On Sep 20, 2013 4:17 AM, "Lucas Moraes" <lucastiagodemoraes em gmail.com>
>>>>> wrote:
>>>>>
>>>>>> 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 :)
>>>>>> Valeu.
>>>>>>
>>>>>> =begin disclaimer
>>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>> =end disclaimer
>>>>>>
>>>>>>
>>>>> =begin disclaimer
>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>> =end disclaimer
>>>>>
>>>>>
>>>>
>>>> =begin disclaimer
>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>> =end disclaimer
>>>>
>>>>
>>> =begin disclaimer
>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>> =end disclaimer
>>>
>>>
>>
>> =begin disclaimer
>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>
>
> --
> Saravá,
> Renato CRON
> http://www.renatocron.com/blog/
> @renato_cron <http://twitter.com/#!/renato_cron>
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130920/0b926377/attachment.html>


More information about the SaoPaulo-pm mailing list