表' MySQL 驱动的多语言网站架构

发布于 2024-12-22 16:07:54 字数 456 浏览 1 评论 0原文

我正在开发多语言网站。尝试为此目的设计最佳的数据库模式。

在此处输入图像描述

如您所见,有 2 个表:langsmenu我的想法如下:

例如。让我们看一下从 MySQL 表生成多语言导航。在 PHP 后端,从数据库生成导航时

  • menu 表的行中获取所有数据
  • 左连接第二个表 - langs(通过 name 字段>菜单表) 并从定义语言的列中获取数据(例如 en、ru)

您认为这是最佳方式还是有更有效的解决方案?请给我与数据库相关的答案,而不是文件。 (例如 gettext,...等)

I'm working on multi-lang website. Trying to design optimal db schema for this purpose.

enter image description here

As you see, there are 2 tables: langs and menu. My idea is following:

For ex. lets take a look at multi-language navigation generation from MySQL table. In PHP backend, while generating navigation from database

  • Get all data from menu table's row
  • Left join second table - langs (by name field of menu table )
    and get data from defined language's column (for ex. en, ru)

How do you think, is it optimal way, or is there more efficient solution? Please, give me database related answers, not file. (for ex. gettext,... etc)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花开浅夏 2024-12-29 16:07:54

如果 langs 表包含一个 language 列,并且每个翻译占一行,那就更好了。这允许您稍后添加另一种语言,并且只需应用数据更改(而不需要重新编写查询)。

正如您已经暗示的那样,执行左连接并回退到直接保存在 menus 表中的默认语言也是一个好主意(在这种情况下,您不需要保存翻译)例如 langs 表中的 en,因为英语版本始终可用)。

您可能还需要考虑存储特定于国家/地区的翻译(例如,如果有多个西班牙语国家/地区的翻译可能不同),并遵循查找的后备策略:语言国家,<代码>语言,英语翻译。

It would be better if the langs table contained a language column, with one row for each translation. This allows you to add another language later and only have to apply data changes (rather than having to re-write queries).

As you've already implied, performing a left join and falling back to a default language held directly in the menus table is also a good idea (in which case, you don't need to hold a translation for e.g. en in the langs table, since the english version will always be available).

You may also want to consider storing country-specific translations (if, say, there are multiple spanish speaking countries where the translations can be different), and following a fallback strategy of finding: language-country, language, English translations.

泼猴你往哪里跑 2024-12-29 16:07:54

您可以像这样进一步规范化:

  • tokenname: id, token (例如,(1,程序),(2,菜单))
  • 本地化:id,
    tokenname_id, lang, text

引用字符串的表然后通过 tokenname.id 作为外键引用该字符串。

请注意,您将需要某种迷你模板语言来进行文本本地化。

You can normalize further like so:

  • tokenname: id, token (eg, (1, program), (2, menu))
  • localizations: id,
    tokenname_id, lang, text

Tables that reference strings then refer to the string by tokenname.id as a foreign key.

Note that you will need some kind of mini templating language for text localizations.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文