Not withstanding the other answers to similar questions on this site I came up with the following schema for multi-lingual support:
+---------------+
| PRODUCTS_B |
+---------------+
| product_id |
| product_code |
| ... |
+---------------+
|
|
+-------------------------+
| PRODUCTS_T | +---------------+
+-------------------------+ | LANGUAGES |
| product_id | +---------------+
| translation_language_id |----| language_id |
| product_name | | language_code |
| product_desc | +---------------+
| ... | | |
+-------------------------+ | |
| | |
| | |
+-------------------------+ | |
| PRODUCTS_L | | |
+-------------------------+ | |
| product_id | | |
| language_id |----------+ |
| translation_language_id |--------------+
+-------------------------+
LANGUAGES contains all the languages that you wish to support in your application, it has a primary key of language_id:
1 ENG
2 FRA
3 ITA
PRODUCTS_B contains the non-translatable attributes of each product, it has a primary key of product_id:
1 PROD/0A
A record would be inserted into PRODUCTS_T for each available translation, it has a compound primary key of product_id and translation_language_id:
1(PROD/0A) 1(ENG) Computer A programmable device
A record would be inserted into PRODUCTS_L for each supported language; indicating this was the translation to use; it has a compound primary key of product_id and language_id:
1(PROD/0A) 1(ENG) 1(ENG)
1(PROD/0A) 2(FRA) 1(ENG)
1(PROD/0A) 3(ITA) 1(ENG)
PRODCUTS_L should contain every value in the Cartesian Product of PRODUCTS_B and LANGUAGES.
As the translations became available the records in the PRODUCTS_T and PRODUCTS_L tables would be amended as appropriate:
1(PROD/01) 1(ENG) Computer A programmable device
1(PROD/0A) 2(FRA) Ordinateur Un dispositif programmable
1(PROD/0A) 1(ENG) 1(ENG)
1(PROD/0A) 2(FRA) 2(FRA)
1(PROD/0A) 3(ITA) 1(ENG)
And eventually:
1(PROD/01) 1(ENG) Computer A programmable device
1(PROD/0A) 2(FRA) Ordinateur Un dispositif programmable
1(PROD/01) 3(ITA) Computer Un dispositivo programmabile
1(PROD/0A) 1(ENG) 1(ENG)
1(PROD/0A) 2(FRA) 2(FRA)
1(PROD/0A) 3(ITA) 3(ITA)
I used this method as I did not have every translation available at the time the product information was to be inserted. It also indicated, when multiple but not all translations were available, which translation should be used for each language.