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

4
我有一系列的属性文件,用于展示不同语言的消息。
因此,根据当前的语言设置,消息可能会以英语、法语、德语等形式显示。
在我的数据库中,我有各种记录,而不是实际值,我将属性文件的键放入了其中,因此在使用该资料进行检索时,可以在相应的语言中显示消息。
例如,在我的数据库中可能有一个记录:
John | Smith | AQ | etc 其中,在相应的属性文件中,AQ 可以显示为 Doctor 或者 Arzt 等。
我的问题是,我需要偶尔按这些属性进行排序,但是在数据库中它们的值是代码,所以无法在数据库中进行排序。
这里,我得到了使用临时表和排序的建议,但是对于1个属性对我来说还好。
我正在寻找一种更通用的解决方案来处理多个属性文件,并尽可能避免在代码中进行检查:
例如,如果此查询按 X 排序,则创建此临时表 等等。
是否有一般的解决方案?
3个回答

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

好问题!

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

一般来说,我的建议是将域对象的本地字符串存储在数据库中 - 例如,如果你有一个产品数据库,并且需要存储产品名称,那显然是域的一部分;管理产品的人员也需要管理产品名称,并且你希望能够强制执行业务逻辑和引用完整性。

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

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

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


+1 这似乎很有帮助。我不熟悉Java的I18N功能,只是从SQL的角度回答。如果您想在Java中使用属性文件以便于使用,同时在数据库中进行高效排序,则可以通过编程将信息放入两个位置。即从属性文件中复制相关信息到数据库中,以便用于排序。 - dan1111
@NevilleK:在我看来,最好避免在Java中进行排序,因为我更喜欢分批从SQL服务器获取结果,而不是操作可能有数十万条记录。 - Jim
在数据库中排序确实更有效率,但是将资源文件与数据库中的内容同步的挑战非常麻烦,存在许多令人兴奋的故障模式......如果您要对大量记录进行排序,应该咬紧牙关,将所有内容移入数据库。 - Neville Kuyt

0
在应用程序启动时,您可以同步包含键、区域设置和实际消息的表。这些将是普通表,因此您可以在正常的SQL查询中访问它们。
但我建议始终在应用程序中执行您描述的排序,因为这似乎真的像应用程序逻辑。

  1. 实际的消息不在表格中,而是在属性文件中。
  2. 从我的角度来看,排序并不是应用程序的真正需求,因为我可能有成千上万条记录,我不想在应用程序中进行排序,而是从 SQL 服务器中获取“页面”结果。
- Jim
@Jim,同步化是指将属性文件中的值插入到表格中。 - SpaceTrucker
但我猜不是临时表。 - Jim
但是临时表只在一个连接会话中存在,对吧?那么这怎么工作呢? - Jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接