如何在数据库应用程序中最好地处理多种语言

时间:2012-10-25 09:10:45

标签: java sql database design-patterns internationalization

我有一系列属性文件,用于显示各种语言的消息 因此,根据当前的语言设置,可以用英语或法语或德语等显示消息 在我的数据库中,我有各种记录,而不是实际值,我已经放置了属性文件的键,以便在使用该数据检索记录时,我可以用相应的语言显示消息。
例如。我的数据库中可能有一条记录,如:

John| Smith| AQ| etc

相应属性文件中的AQ可以显示为DoctorArzt等。 我的问题是我需要通过这些属性进行排序,这些属性的数据库中的值虽然是代码,因此无法在数据库中进行排序。
here我得到了使用临时表和排序的建议,但对于1个属性,这对我来说没问题 我正在寻找一个更通用的解决方案来处理多个属性文件,并避免在可能的情况下检查代码:
例如if this query sorts on X create this temp table等 对此有一般的解决方案吗?

3 个答案:

答案 0 :(得分:4)

不是将语言信息存储在属性文件中,而是将其存储在数据库的表中。然后一切都可以轻松完成。

Records:
first | last  | messageid |
John  | Smith | 1         |

Messages:
messageid | language | message |
1         | English  | Mr.     |
1         | Spanish  | Sr.     |
2         | English  | Doctor  |
etc...

然后按本地语言按消息排序的查询将是这样的:

select first, last, message from records r
    inner join messages m on m.messageid = r.messageid
    where language = [your current language]
    order by message

答案 1 :(得分:1)

很棒的问题!

恕我直言,你想继续使用属性文件来本地化这种字符串 - 它允许你使用Java的内置IL8N功能,这可以节省你很多时间。

通常,我的建议是在域中存储域对象的本地字符串 - 例如,如果您有产品数据库,并且需要存储产品名称,那么这显然是域的一部分;管理产品的人员还需要管理产品名称,并且您希望能够实施业务逻辑和参照完整性。

您可能会认为这适用于您提供的示例 - 标题是“人”域的一部分,应该在数据库中进行管理。

对于用户界面元素 - 按钮上的文本,菜单项的名称 - 属性文件是绝对正确的。

如果您认为“标题”是用户界面的一部分,或者您因为已经建立了本地化过程而不想移动它,我的建议是使用Java而不是SQL进行排序;关于如何连接到数据库,有很多方法可以做到这一点。

答案 2 :(得分:0)

在应用程序启动时,您可以同步包含密钥,区域设置和实际消息的表。这些是普通的表,因此您可以在正常的SQL查询中访问它们。

但我建议你总是在应用程序中进行排序,因为这看起来很像应用程序逻辑。