2012-02-24 2 views
1

Id нравится программировать многоязычное приложение с игрой !. Я никогда не делал этого раньше, поэтому я искал некоторые советы, как это сделать на первом месте.модель базы данных internationlization play framework

Задача: позволяет предположить, что у меня есть простое приложение с вопросами и ответами. Представьте, что это похоже на опрос. В зависимости от языка, который пользователь выбирает, вопросы и ответы отображаются на правильном языке. Для лучшего unstanding модели будет выглядеть следующим образом:

вопрос: ид, questionString

ответ: идентификатор, fk_questionId, answerString, isRightBool

Как видим обычный 1: N отношение. Но как подойти теперь к поддержке нескольких языков?

  1. Идея будет дублировать всю базу данных ... эта идея кажется простой, но уродливой из-за дополнительных накладных расходов для последующих изменений ... было бы кошмаром, я думаю.
  2. дополнительные поля, такие как questionStringGerman, questionStringEnglish. Не нравится эта идея ...
  3. Дополнительная таблица для каждого класса моделей с соотношением 1: n. Например question_lang и answer_lang. Колумбы - это языки. Кажется, легче справиться.
  4. Один стол для всех переводов. Колумбы - это языки. Кажется, легче всего справиться с исправлениями.

Какой подход лучше всего подходит для динамического перевода. Возможно, я что-то пропустил. Был бы рад, если бы кто-то мог сказать мне, какой подход подходит к этой проблеме.

Thx заранее!

ответ

0

я лично следующим образом:

Table: Language 
Id, Name 

Table: Translation 
Id, UniqueName(IdxUnique), LanguageId(FK), TranslationText 

Table: Question 
Id, TranslationUniqueName(FK) 

Table: Answer 
Id, QuestionId(FK), IsRight, TranslationUniqueName(FK) 

Я разрываюсь между использованием Id для перевода и UniqueName (Key) - Id, вероятно, незначительно выгодно с точки зрения производительности, но с использованием Значимые Уникальный ключ делает разработку проще (например, установить что-то WelcomeText и позволить системе искать перевод гораздо чище, чем установка в 16)

кроме того, клавиши более переносимой, если вы добавление/удаление/дублирующие переводы , особенно в несколько экземпляров базы данных (разные среды).

В ответ на ваши комментарии к другому ответу, если язык не выбран, вы можете добавить весы в таблицу Language или связать LanguageId с учетной записью пользователя. Вы также можете (если хотите быть умным) попытаться угадать в зависимости от местоположения пользователя (но вы всегда должны дать им возможность изменить - ничего более раздражающего, чем перенаправление на google.es, когда вы находитесь в Испании).

В любом случае, ваш метод, чтобы сделать перевод должен сделать это для вас - например, ваше приложение просто делает GetTranslation('WelcomeText') - Ваш метод GetTranslation() может затем искать подходящий язык для использования и получить правильный string.

1

Я действительно сделал это один раз.

Мое решение было использовать три таблицы:

table1: QuestionID (QID, другие поля) TABLE2: вопросы (qqid, fk_qid, вопрос, languageSet, другие поля) Table3: ответы (идентификатор, fk_qqid, ответ, другие поля)

Таким образом, вы можете иметь столько языков, сколько хотите. каждый языковой вопрос будет рассматриваться как независимая запись. чтобы получить весь перевод для того же вопроса, qid questionId поможет вам получить набор.

+1

Thx для ответа. Как я вижу, вы просто кладете слой между вопросом и ответами. Дело в более сложной структуре, это приведет к появлению многих «слоев-объектов/наборов данных». U получает дополнительный объект/набор каждого ответа. Что делать, если у вас нет связанных с языком полей в ответе? как вес. У вас есть повторяющиеся записи, не так ли? Все еще думая о идее ура :) – whereismydipp

+0

, в этом случае у вас будет вес в общей таблице. очень похоже на концепцию oop. вам понадобится другая таблица table4 (id, fk_qqid, common_fields .....). правильно? – ligerdave

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