Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Já postei em um fórum mas quero opiniões diferentes.
Estou querendo criar um site multi-línguas mas nunca fiz um do 0.
Minha dúvida é sobre o banco de dados. Qual a forma + prática de fazer isso?
Em cada tabela criar um id para idioma e repetir N vezes os dados?
Ex.:na tabela gravar
id: 1, idIdioma: 1, nome: Nome1, descricao: Descrição em português
id: 2, idIdioma: 2, nome: Nome1, descricao: Descrição em ingles
id: 3, idIdioma: 3, nome: Nome1, descricao: Descrição em espanhol
id: 4, idIdioma: 1, nome: Nome2, descricao: Descrição em português
id: 5, idIdioma: 2, nome: Nome2, descricao: Descrição em ingles
id: 6, idIdioma: 3, nome: Nome2, descricao: Descrição em espanhol
Ou um registro tendo os 3 idiomas?
id: 1, nome: Nome1, descricao: Descrição em português, Descrição em ingles, Descrição em espanhol
id: 2, nome: Nome2, descricao: Descrição em português, Descrição em ingles, Descrição em espanhol
Imagino que seria + prático a primeira opção. Estou certo?
E ir criando FKs nas demais tabelas.
>
Creio que com array fica bacana :P
Isso para parte estática, mas tenho conteudo no banco q tb devem ser traduzidos
Você pode criar uma tabela para cada lingua.
Não sei se é a certa, mas é como eu faria :P
Porém, isso depende do que você precisa traduzir...
Para seu caso, recomento que faça várias colunas com os variados idiomas
se for usar mais de 3 idiomas por exemplo, ficará bastante confuso colocar numa tabela só..
há vários meios de fazer isso.
uma técnica que uso é colocar numa base de dados diferente
exemplo
base_principal
tabela_pessoas
id
campo_nome
campo_descricao
outro_campo1
outro_campo2
base_idiomas
tabela_pessoas
id
pessoas_id (base_principal.tabela_pessoas)
idioma_codigo (baseado na tabela ISO639_1)
campo_nome
campo_descricao
tabela ISO639_1 -> http://www.w3schools.com/tags/ref_language_codes.asp
op motivo de colocar numa base diferente é que pode ter muitas tabelas para gravar os labels dos outros idiomas. Se manter tudo numa mesma base ficará bastante complicado de gerenciar.
mas esse ponto é questão de escolha.. não quer dizer que tem que seguir a risca desse modo..
Bom, você tem que lidar com 3 valores: Idioma, entrada, saída.
A mesma entrada participará de vários idiomas
Um mesmo idioma possuirá várias entradas
Há apenas uma saída para cada combinação idioma-entrada
Creio que tenhamos 3 entidades, assim, 3 tabelas: IDIOMA, ENTRADA, TRADUCAO
Existe a opção de se livrar da tabela ENTRADA mas, como a quantidade de repetições aumentará proporcionalmente à quantidade de idiomas, sugiro que a utilize para se beneficiar dos índices únicos numéricos.
Em IDIOMA, ganhamos a possibilidade de possivelmente, futuramente, etcmente adicionar informações como código de LOCALE, bandeirinha de país, abreviação e nome localizado.
-- -----------------------------------------------------
-- Table mydb.idioma
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`idioma` (
`id` TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT ,
`nome` VARCHAR(45) NULL ,
`nome_localizado` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `nome_UNIQUE` (`nome` ASC) )-- -----------------------------------------------------
-- Table mydb.entrada
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`entrada` (
`id` INT(4) UNSIGNED NOT NULL AUTO_INCREMENT ,
`nome` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `nome_UNIQUE` (`nome` ASC) )-- -----------------------------------------------------
-- Table mydb.traducao
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`traducao` (
`id` BIGINT(6) UNSIGNED NOT NULL AUTO_INCREMENT ,
`idioma` TINYINT(2) UNSIGNED NULL ,
`entrada` INT(4) UNSIGNED NULL ,
`traducao` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
INDEX `idioma` (`idioma` ASC) ,
INDEX `entrada` (`entrada` ASC) ,
UNIQUE INDEX `traducao` (`idioma` ASC, `entrada` ASC) ,
CONSTRAINT `idioma`
FOREIGN KEY (`idioma` )
REFERENCES `mydb`.`idioma` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `entrada`
FOREIGN KEY (`entrada` )
REFERENCES `mydb`.`entrada` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
Creio que com array fica bacana :P