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 <[email protected]> > Valeu Renato > > > Em 20 de setembro de 2013 07:24, Renato Santos > <[email protected]>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" <[email protected]> >> 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 >>> <[email protected]>escreveu: >>> >>>> Tá lá no repositório do Iota. :-) >>>> On Sep 20, 2013 4:17 AM, "Lucas Moraes" <[email protected]> >>>> 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: [email protected] >>>>> 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: [email protected] >>>> 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: [email protected] >>> 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: [email protected] >> 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: [email protected] > 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: [email protected] L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer
