再会!
在 Spring Boot 中开发网站时,我想知道是否能胜任国际化。
我重新阅读了许多来自不同服务的不同解决方案,但没有找到满意的答案。
最好学习“最佳实践”并听取您关于实施的想法。对将消息存储在数据库中而不是将它们存储在 messages.properties 文件中的国际化感兴趣
关于我现在如何实现它:基于这篇文章 - https://medium.com/i18n-and-l10n-resources-for-developers/database-stored-messages-for-i18n-in-spring-boot -11dc2ee5c1f7
明显的优点:
- 数据以一对语言环境、键、内容存储在数据库中的一个表中。使用密钥和本地化,我们找到翻译并将其发送到前面。
缺点:
- 每个消息本地化组都需要自己独特的。键(我使用
UUID.randomUUID())。那些。Locale - ru Locale - en 他们有一个独特的。钥匙。例如主页标题 - 另一个问题是实体将必要的原语(例如,String)存储在实体本身中是没有意义的,但它们需要存储在转换表中。例如,对于 Page 实体,标题字符串变得不必要,因为该字符串的翻译包含在另一个表中。
这就提出了一个问题——如何正确地将翻译表(实体)与其他实体联系起来,这样就可以通过引用实体本身而不是翻译的本质来获得所需的翻译?
找到了一些解决方案:
- https://stackoverflow.com/questions/39704729/how-to-internationalize-a-hibernate-entity 在这里,在第一个选项中,建议存储 HashMap 而不是实体的原语。第二个答案建议链接 ManyToMany 表
- https://stackoverflow.com/questions/49916912/most-elegant-solution-for-internationalization-with-jpa-hibernate
- https://stackoverflow.com/questions/6350415/internationalization-with-hibernate
- https://stackoverflow.com/questions/49916912/most-elegant-solution-for-internationalization-with-jpa-hibernate 在这个选项中,建议为每个实体创建一个翻译表,这也不好。
- https://thoughts-on-java.org/localized-data-hibernate/ 还建议为每个实体创建一个单独的表
- https://github.com/deathman92/localized 我还发现了这样一个库(尽管它不起作用),借助它您可以使用本地化注释。
真的没有“现成的”解决方案或任何有效解决方案的选项吗?
提前感谢您的建议和回答!
这个解决方案是我几年前在网上找到的。
我在这个小项目中实现了支持多种语言的可能选项之一:链接到 GitHub。这段代码很久没有打开了。
这种方法的优点:
这是图表:
这个想法很简单:在表格中
language,我们写下我们希望在网站上使用的语言。我们将文本写入表中translation并指明它属于哪种语言(使用 .-relation 表中的 idlanguage。@ManyToOne)然后
translation我们可以将不同的表连接到表。屏幕截图中的示例说明了页面翻译的原始版本。id是写的,页面上要翻译的文本的名字和页面的名字。在辅助表的帮助下text_translation,我收集了给定文本(@OneToMany-relation)的所有翻译。因此,我对 Spring + Hibernate + JPA 进行了一些研究,并按如下方式实现了国际化:
工作演示项目 - https://github.com/azerphoenix/spring-i18n-demo
1)让我们创建实体:
- -语
- - 翻译
请注意,翻译和语言实体通过以下方式相互关联
@OneToMany & @ManyToOne语言的表格视图
语言表存储所有现有的(通过管理面板创建的)站点语言。如果您有固定数量的语言,那么您可以,例如,使用
@PostConstruct默认语言进行初始化(或者使用 data.sql 创建必要的记录)。例如,翻译的表格视图:
翻译表存储在模板、表单等中显示值所需的翻译。
让我们详细考虑一下。让我们创建一个 Post 实体来存储我们网站的文章。
发布实体:
还要注意 translationKey 行。创建翻译时,我们生成
UUID.randomUUID().toString();并将它们分配给一篇文章的所有翻译。由于我们通过
@OneToMany & @ManyToOne(参见上面的代码)将 Post 与 Language 实体连接起来,因此对于 Language 实体,我们添加:Post 实体的表视图(帖子):
注意最后一个 language_id 列。实际上,我们在一张表中创建了 3 条记录,它们的 language_id 不同。
仍然需要建立多语制。在数据库中存储记录的多语言的想法已经从这里用尽了: https ://medium.com/i18n-and-l10n-resources-for-developers/database-stored-messages-for-i18n-in- spring-boot-11dc2ee5c1f7
此类从翻译表中按键检索所需的翻译。
翻译资料库
语言库:
为了在控制器方法中获取文章的翻译,我们接受 locale 和 postSlug(或者,例如,translationKey),并相应地使用它们在数据库中查找文章并通过 Model 将其提供给客户端。代码示例:
如果您需要从翻译表中获取所有翻译(例如,将它们交给管理面板进行编辑),那么根据 SQL Pivot 原理,我们使用这样的 SQL 语句:
添加到 TranslationRepository:
注意实体 - TranslationProjection。TranslationProjection 是 Translation 实体的投影。其结构:
此 SQL 查询的表视图:
好吧,您肯定需要为语言添加配置。
因此,语言是通过
?lang=${locale}例如切换的,http://example.com/{postSlug}?lang=ru我不知道这个实现有多好......我只是将不同的想法组合成一堆......