2012-02-24 69 views
1

编号喜欢用play!编程多语言应用程序。我从来没有这样做过,所以即时寻找一些建议如何做到第一位。数据库模型国际化播放框架

任务: 让我们假设我有一个简单的问题和答案的应用程序。想象它就像一个调查。根据一种语言,用户选择问题并以正确的语言显示答案。 对于unstanding模型更好会是什么样子:

问题:ID,questionString

答案:ID,fk_questionId,answerString,isRightBool

正如你看到一个通常的1:N的关系。但是现在如何处理多语言支持?

  1. 一个想法会重复整个数据库...这个想法看起来很简单但很丑,因为后来改变的额外开销......我猜会是一场噩梦。
  2. 其他字段like questionStringGerman,questionStringEnglish。不喜欢这个想法...
  3. 每个模型类与1:n关系的附加表。像question_lang和answer_lang一样。 Colums是语言。似乎更容易处理。
  4. 所有翻译的一张表。 Colums是语言。看起来最简单但很难处理纠正。

哪种方法最适合动态翻译。也许我想念一些东西。如果有人能告诉我这种方法是如何解决这个问题的话,会很高兴。

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)之间徘徊 - 编号可能是轻微的性能,但使用的术语有益一个有意义的唯一键使得开发变得更容易(如设置东西WelcomeText,并让系统查找翻译远比它设置为16清洁)

此外,键是更便携,如果您要添加/删除/复制翻译,特别是跨越多个数据库实例(不同的环境)。

回复您对其他答案的评论,对于未选择语言的情况,您可以在Language表中添加权重或将LanguageId与用户帐户相关联。你也可以(如果你想聪明)根据用户的位置尝试猜测(但是你应该总是给他们选择改变 - 没有什么比在西班牙被重定向到google.es更烦人)。

在任何情况下,你的方法做翻译应该为你做到这一点 - 例如,你的应用程序只是让一个GetTranslation('WelcomeText') - 那么你GetTranslation()方法可以查找相应的语言使用,并得到正确的string

1

我已经做了一次。

我的解决方案是使用三个表:

表1:questionId(QID,等领域) 表2:问题(qqid,fk_qid,问题,languageSet,等领域) 表3:答案(ID,fk_qqid,答案,其他字段)

这样,您可以拥有任意数量的语言。每个语言问题将被视为独立记录。为了获得同一问题的所有翻译,questionId的qid将帮助您获得该集合。

+1

Thx为答案。正如我所看到的,你只需在问题和答案之间加上一层。事情是在一个更复杂的结构,这将导致许多“层对象/数据集”。你得到一个额外的对象/每个答案。在答案中没有与语言相关的字段时该怎么办?像体重。你有重复的条目,对吧?仍然想着你的想法:) – whereismydipp 2012-02-24 02:27:13

+0

在这种情况下,你会在公共表中的重量。很像oop概念。你需要另一个表table4(id,fk_qqid,common_fields .....)。对? – ligerdave 2012-03-09 19:58:08