[SP-pm] Site com vários idiomas

Renato Santos renato.cron at gmail.com
Fri Sep 20 11:00:54 PDT 2013


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 at gmail.com>

> Valeu Renato
>
>
> Em 20 de setembro de 2013 07:24, Renato Santos <renato.cron at 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 at 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 at gmail.com>escreveu:
>>>
>>>> Tá lá no repositório do Iota. :-)
>>>> On Sep 20, 2013 4:17 AM, "Lucas Moraes" <lucastiagodemoraes at 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 at 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 at 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 at 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 at 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 at 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>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130920/25e951d3/attachment.html>


More information about the SaoPaulo-pm mailing list