Jump to content

Qual o melhor sistema para tradução de um site?


tiko165
 Share

Recommended Posts

Para vocês, qual o melhor sistema para tradução de um site??

É em ficheiros ".php";

Em ficheiros ".pot" (potfile);

Ou através de Base de dados?

Eu neste momento, tenho a tradução com ficheiros .php e funciona muito bem,

mas como tenho muita coisa para traduzir em cada ficheiro, não sei até que ponto os ficheiros php são recomendados.

Se alterar para uma BD, e criar as queries certas para tal, tornaria-se melhor??

Qual vocês recomendariam, ou fariam?

collectioneuro300px.png
Link to comment
Share on other sites

Acho que a resposta depende um bocadinho da dimensão do projecto e do número de pessoas na equipa. Por exemplo, acho que ficheiros php e base de dados são para esquecer se houver mais do que uma pessoa a traduzir, além que elevam o nível de conhecimentos necessário para traduzir a aplicação; idealmente, qualquer pessoa devia conseguir traduzir com 0 conhecimentos de desenvolvimento.

Não tenho muita experiência nesta área, mas já ponderaste ligar o sistema a um serviço de gestão de traduções? Há imensas possibilidades:

- Eu já usei o pootle e achei bastante simples http://pootle.translatehouse.org/ .

- OneSky - http://www.oneskyapp.com/

- crowdin - https://crowdin.com/

Link to comment
Share on other sites

Já utilizei ambos os sistemas e a minha preferência recai sobre o sistema de base de dados. Em termos de gestão e inclusive de rapidez (pelo que consegui testar) é melhor.

Em termos de gestão porque podes criar um backend que te permita a introdução de novas traduções e novas linguagens de forma muito rápida.

No que toca a regras a implementar, saliento o facto de não deveres - de todo - efectuar uma query por cada palavra/texto que apresentes numa página. O que deves fazer é construir uma query que te devolva todo o conteúdo de uma só vez para a página que está a ser visualizada.

Abaixo segue um exemplo minimalista do que costumo utilizar-

CREATE TABLE IF NOT EXISTS `translations` 
(
 `id` int(11) NOT NULL,
 `language_id` int(11) NOT NULL,
 `page` varchar(25) COLLATE utf8_bin DEFAULT NULL,
 `name` varchar(50) COLLATE utf8_bin NOT NULL,
 `content` text COLLATE utf8_bin NOT NULL,
 `active` tinyint(1) NOT NULL,
 `date_added` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Identificas na tabela de traduções a/as página/páginas a que se destinam as palavras/textos. Por exemplo, as meta-tags do cabeçalho HTML são comuns a todas as páginas. Quando assim é coloca-se a coluna page a nulo porque será posteriormente filtrado. Por outro lado, alguns textos apenas aparecem em páginas específicas, como por exemplo a página de registo (signup).

INSERT INTO `translations` (`id`, `language_id`, `page`, `name`, `content`, `active`, `date_added`) VALUES
(1, 1, NULL, 'meta_title', 'Welcome to Portugal-a-Programar', 1, '2015-11-16 11:00:00'),
(2, 2, NULL, 'meta_title', 'Bem vindo ao Portugal-a-Programar', 1, '2015-11-16 11:00:00'),
(3, 1, 'signup', 'accept_termsandconditions', 'I accept the terms and conditions', 1, '2015-11-16 11:00:00'),
(4, 2, 'signup', 'accept_termsandconditions', 'Eu aceito os termos e condições', 1, '2015-11-16 11:00:00');

Quando seleccionas as traduções deves filtrar pelas páginas que bem entenderes.

SELECT name, content 
FROM translations 
WHERE language_id = ? AND (page IN (?) OR page IS NULL) AND active = 1;

Podes passar tantas páginas quantas queiras. Isto é bom porque assim não tens de duplicar textos que te possam servir em várias páginas.

Como reparaste eu seleccionei os campos name e content mas o ideal é acederes ao índice name, que deve ser único, e obteres o valor do content. Deves então criar uma função que te permita isso e que te devolva o resultado para uma variável.

function getFormatedTranslations($translations)
{
  $formatedTranslations = array();

  foreach($translations as $translation)
     $formatedTranslations[$translation['name']] = $translation['content'];

  return $formatedTranslations;
}

Por fim tudo o que tens de fazer é chamar os resultados em pontos chave.

<label><?php echo $translation['accept_termsandconditions']; ?>
  <input type="checkbox" id="accept_termsandconditions"/>
</label>
Link to comment
Share on other sites

Acho que a resposta depende um bocadinho da dimensão do projecto e do número de pessoas na equipa. Por exemplo, acho que ficheiros php e base de dados são para esquecer se houver mais do que uma pessoa a traduzir, além que elevam o nível de conhecimentos necessário para traduzir a aplicação; idealmente, qualquer pessoa devia conseguir traduzir com 0 conhecimentos de desenvolvimento.

Não tenho muita experiência nesta área, mas já ponderaste ligar o sistema a um serviço de gestão de traduções? Há imensas possibilidades:

- Eu já usei o pootle e achei bastante simples http://pootle.translatehouse.org/ .

- OneSky - http://www.oneskyapp.com/

- crowdin - https://crowdin.com/

Não me compensa utilizar esses recursos.

Eu só conheço o "crowdin", e é pago.

Agora pergunto, vou pagar por algo em que sei desenvolver gratuitamente?

Já utilizei ambos os sistemas e a minha preferência recai sobre o sistema de base de dados. Em termos de gestão e inclusive de rapidez (pelo que consegui testar) é melhor.

Em termos de gestão porque podes criar um backend que te permita a introdução de novas traduções e novas linguagens de forma muito rápida.

No que toca a regras a implementar, saliento o facto de não deveres - de todo - efectuar uma query por cada palavra/texto que apresentes numa página. O que deves fazer é construir uma query que te devolva todo o conteúdo de uma só vez para a página que está a ser visualizada.

Eu a ideia de passar para a base de dados, já a tinha, até porque já tenho o trabalho pré-feito. É passar de um ficheiro para um mysql. Como disse, gostava de saber qual o mais fiavel e rapido.

Mas com as tuas dicas, já me retiras tempo a pensar e aperfeiçoar.

E como disseste acertadamente, eu nunca iria utilizar querys para cada palavra. Isso era gastar recursos desnecessários, e ocupar mais tempo no servidor.

collectioneuro300px.png
Link to comment
Share on other sites

Como disse, depende da especificação do projecto. Pagar por um serviço destes pode fazer sentido para uma equipa/empresa, não tinhas especificado que era um projecto individual.

Atenção que um bom sistema de traduções não é tão simples como o que o bioshock mostrou. Os verdadeiros problemas começam quando se tem que cruzar outro conteúdo da base de dados com as traduções, por exemplo fazer match de plurais/singulares, apresentar datas, construção gramatical em que por vezes tens que apresentar o conteúdo de uma variável antes de outra numa linguagem mas não na outra, etc.

Um exemplo típico é uma frase simples como "Olá <nome>, bem-vindo!" - como é que vais armazenar isto na base de dados? Tentar colocar "Olá" num record como "welcome_beginning" e ", bem-vindo!" noutro registo é uma maneira errada de o fazer, é muito difícil que estas regras sejam transversais a várias linguagens. (por exemplo, não terás casos em que o nome influenciará o sujeito da frase?)

Por outro lado, vais criar um sistema de parsing que te permite colocar algo como "Olá ${nome}, bem-vindo!" na base de dados e fazer a substituição em real-time?

Eu pensaria bem em todos os detalhes e, acima de tudo, não reinventava a roda. Isto é um problema comum, usa uma solução comum que seja robusta. Certamente que há alternativas gratuitas que fazem o que pretendes e vai-te poupar dores de cabeça no futuro.

PS: E estou só a considerar casos simples, em que o teu sistema vai ser traduzido em poucas linguagens e todas elas ocidentais. Se algum dia a aplicação crescer vais ter que substituir tudo, lembra-te que há linguagens em que se escreve da direita para a esquerda e até mesmo de cima para baixo.

Edited by Warrior
Link to comment
Share on other sites

Sim @Warrior, um dos pontos que me deixa com o pé a trás, é mesmo o que referiste:

Ter os plurais e singulares, e também

ter traduções em que é necessário ter variáveis no meio da tradução;

Vou ter que estudar muito bem qual o melhor ponto, e como posso resolver esses problemas com o meu próprio código,

mas a verdade é que gostava de tornar isto possível com o meu próprio sistema, e não ter que estar dependente de outras plataformas.

collectioneuro300px.png
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.