Pergunta

Eu tenho um site ASP.Net que utiliza um banco de dados MySQL para o back-end. O site é um sistema de e-commerce Inglês, e nós estamos olhando para a possibilidade de traduzi-la em cerca de cinco outras línguas (francês, espanhol etc). Estaremos recebendo tradutores humanos para realizar a tradução -. Nós olhamos serviços automatizados, mas estes não são bons o suficiente

O texto estático no site (por exemplo, títulos, botões, etc.) podem facilmente ser servido em vários idiomas via construído em recursos de localização (resx etc) da Net.

A única coisa que eu não estou tão certo sobre isso a melhor forma de armazenar e recuperar o conteúdo multi-linguagem no banco de dados. Por exemplo, há uma mesa de produtos que inclui estes campos ...

  • productId (int)
  • categoryId (int)
  • título (varchar)
  • resumo (varchar)
  • descrição (texto)
  • recursos (texto)

O título, resumo, descrição e características texto precisaria estar disponível em todos os idiomas diferentes.

Aqui estão as duas opções que eu vim acima com ...

Criar campo adicional para cada idioma Por exemplo, poderíamos ter titleEn, titleFr, titleEs etc para todas as línguas, e repetir isso para todas as colunas de texto. Nós, então, adaptar o nosso código para usar o campo apropriado, dependendo do idioma selecionado. Isso sente-se um hacky pouco, e também levaria a algumas tabelas muito grandes. Além disso, se queríamos para adicionar idiomas adicionais no futuro seria demorado para adicionar ainda mais colunas.

Use uma tabela de pesquisa Poderíamos criar uma nova tabela com o seguinte formato ...

textId | languageId | content
-------------------------------
10     | EN         | Car
10     | FR         | Voiture
10     | ES         | Coche
11     | EN         | Bike
11     | FR         | Vélo

Nós, em seguida, adaptar a nossa tabela de produtos para referenciar o textId apropriado para o título, resumo, descrição e características em vez de ter o texto armazenado na tabela de produtos. Isso parece muito mais elegante, mas eu não consigo pensar em uma maneira simples de obter esses dados para fora do banco de dados e na página sem usar instruções SQL complexas. É claro que a adição de novos idiomas no futuro seria muito simples em comparação com a opção anterior.

Eu ficaria muito grato por todas as sugestões sobre a melhor maneira de conseguir isso! Existe alguma orientação "melhores práticas" para fora lá? Alguém já fez isso antes?

Foi útil?

Solução

No seu caso, eu recomendo usar duas tabelas:

Product
-------------------------------
ProductID  |  Price   |  Stock 
-------------------------------
10         |   10     |   15


ProductLoc
-----------------------------------------------
ProductID  | Lang   | Name      |  Description
-----------------------------------------------
 10        |  EN    | Bike      |  Excellent Bike 
 10        |  ES    | Bicicleta |  Excelente bici 

Desta forma, você pode usar:

SELECT * FROM 
Product LEFT JOIN ProductLoc ON Product.ProductID = ProductLoc.ProductID 
                               AND ProductLoc.Lang = @CurrentLang

(LEFT JOIN apenas no caso não há nenhum registro para o lang atual na tabela de ProductLoc)

Outras dicas

Não é boa idéia apenas para adicionar novas colunas à tabela existente. Será muito difícil para adicionar um novo idioma no recurso. A tabela de pesquisa é muito mais melhor, mas eu acho que você pode ter problema com o desempenho, porque o número de registros traduzidos.

Eu acho melhor solução é ter uma tabela compartilhada:

products: id, categoryid, 

e mesmas tabelas para cada idioma

products_en, products_de: product_id (fk), title, price, description, ...

Você só vai selecionar a partir da um comum e se juntar a mesa com seu idioma. A vantagem é que você pode localizar até mesmo o preço, categoria, ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top