2011-01-19 3 views
0

У меня возникла проблема с реализацией этого базового многоканального дизайна.Проблема с многоязычным дизайном таблиц

содержание Таблица

content_id bigint(20) NOT NULL, 
lang_id int(5) NOT NULL, 
word varchar (500) NOT NULL, 
created datatime, 

Теперь проблема с реализацией этого. Я предполагаю, что в приложении я объявляю каждое слово на странице с content_id как 1,2,3,4,5 ... где 1 = «Привет» 2 = «Добро пожаловать в xxxxx» и т. Д. Право? Поэтому проблема в том, что я даю «Hello» = 1 в коде. Итак, в таблице это так: 1, 23 (для английского), Привет.

Но теперь, если у меня есть испанская сессия, как я найду «Привет» в таблице? Потому что я жестко закодировал 1 в коде, чтобы быть «Hello», поэтому система всегда будет искать это и найти текст на английском языке. Единственная работа, которую я вижу, - это иметь отдельные таблицы на один язык?

ответ

1

Вам необходимо сделать lang_id и content_id составным первичным ключом. Вы будете в конечном итоге с данными, который выглядит следующим образом:

1   Hello   1 
1   Hola    2 
2   Thanks   1 
2   Gracias   2 
2   Danke   3 

Вы могли бы даже выйти перевод на английский язык в отдельную таблицу, чтобы сделать его проще для вас, как разработчик (так как вы говорите по-английски) .. .если вы знаете, что WordId 1, канонически, «Привет». Внешний ключ к языковой таблице, очевидно. Если вы это сделаете, вам может понадобиться и суррогатный ключ для первичного ключа ..., который упрощает обновления.

+0

Я бы рекомендовал НЕ использовать один язык в качестве вашего «стандартного» языка, который не переведен, но вместо этого использовать идентификаторы (они не должны быть численными!), Которые сопоставляют (вместе с идентификатором языка) запись на языке. Например, ваш Hello, который отображается на главной странице, может иметь идентификатор «homepage.greeting». – Paul

+0

Composite PK для базы данных, но мне все еще нужно ссылаться на него в коде, и насколько я знаю, мы не можем сделать это в коде? Я должен все еще объявить Hello = 1 в коде, если вы не говорите мне, что я могу объявить Hello = (1,1)? И эта схема работает для этой утилиты: «Если языковой перевод не найден, он по умолчанию использует английский для этого слова« – JonnyK

+0

Ну, дайте ему любое каноническое имя, которое вы хотите - моя точка зрения заключается в том, что вместо того, чтобы запрашивать значение для английского языка нужного вам значения языка, вы могли бы присоединиться к таблице, содержащей идентификатор, дружественный разработчику. –

Смежные вопросы