PHP更好的做法是构建一个多语言站点

时间:2011-03-09 14:38:20

标签: php mysql

我有一个用两种语言建立的网站 包括两个基于浏览器语言的不同“词典”

在每个langXX.php中我有

define('SOME_STRING', 'Some string');
等等...但我讨厌现在这个解决方案,因为我不知道我是否在两个文件中都包含了一个新的定义...所以我试图移动包括mysql中的所有定义并构建一个像<的函数/ p>
translate('SOME_STRING', 'en'); // ouput 'Some string'

我正在转向mysql,因为id喜欢通过CMS直接管理翻译我会建立,我不想让网站管理员通过ftp和textmate ...

所以我的问题是,如果后一个解决方案我更好或者对于mysql来说太过紧张,无法对页面的每个文本元素进行查询..

PS。据我所知,即使osCommerce也使用了这种做法吗?

7 个答案:

答案 0 :(得分:4)

为什么不使用存储在数据库中的数据的文件缓存?您删除了一组可能代价高昂且重复的数据库调用,但可以保留CMS概述语言值的优势。

  • 将翻译存储在数据库中
  • 有一个从数据库值生成平面文件的过程
  • 每次发生翻译更新时重新启动此过程
  • 在任何前端翻译检索操作中使用平面文件。

答案 1 :(得分:1)

用于翻译网站文本元素的简单方法可以分解为这个简单的三表结构:

Language
--------
Id
Name    # English, French, etc
Code    # en-gb, fr, etc


# Text table stores content in the default language.

Text
----
Id
Content


# Translations relate to a language and an existing Text

Translation
-----------
FkText
FkLanguage
Content

这样,一个简单的查询就可以用任何语言获取所请求的内容,如果没有翻译,则会自动回退到默认语言。

答案 2 :(得分:1)

我不担心速度和压力。做有意义的事情然后解决这个问题以获得速度。

我有一个类似的设置,使用mysql来存储翻译。我决定将翻译存储在mysql中并检索它们并在我的管理界面上修改它们。当对该表进行任何修改时,我重写一个本地文件,其中包含从我的数据库中的所有翻译构建的翻译数组。它是构建数组所需的php代码的文本文件,我可以适当地包含它。

mysql结合我的CMS为我提供了一种输入翻译的好方法,并确保它们涵盖了我想要的所有语言。

答案 3 :(得分:0)

你最好只做一个查询来下载你想要的语言的整个字典,然后每次想要在页面中显示某些内容时循环显示。

假设您的词典中有500个短语,并且您希望在页面上显示30个“元素”。 您将执行单个查询,然后搜索字典以查找所需的元素。

比30个单独的mysql调用快得多。

答案 4 :(得分:0)

Wordpress使用:_e(“默认语言中的字符串”); 如果您通过set_locale()或sth指定语言。就像它会搜索文件中的翻译(或者在你的情况下是一个数据库)并输出这个翻译的文本。如果没有给出任何翻译,它会“按原样”打印出字符串。

认为这种变体有一些优点:

  • 默认语言为fallback
  • 添加语言而不更改代码
  • 在配置文件中设置首选语言

有关详细信息,请参阅https://codex.wordpress.org/I18n_for_WordPress_Developers。认为这是一个非常好的解决方案。

答案 5 :(得分:0)

您可以使用gettext或PHP中提供的任何internationalization API。

我喜欢gettext,因为它可以使用多种语言(C / C ++,PHP,Python ......),并且具有接近相同的API。

答案 6 :(得分:0)

本地化有两种情况:

  • 静态内容本地化。
  • 动态内容本地化。

第一个(我们将称之为“静态”)指的是用户界面的一部分内容(例如,表单标签,特定于语言环境的图标......等等)。

第二个是用户贡献的内容,应该为某些具体的语言环境/文化保存(称之为“动态”)。

静态将被缓存。它可以存储在数据库,XML文件或任何源和/或格式中。由于静态内容几次更改,因此无需访问本地化存储(数据库,XML或其他):只需将内容放入某个缓存并访问它。

动态内容不会被缓存,或者如果它被缓存,则必须在商店中的某些部分或全部内容发生更改时刷新它。

因此,在一天结束时,任何内容(甚至是静态或动态)都将从内容缓存中提供,以避免数据库连接和查询,显然,可以提高Web应用程序的性能。

如果每次需要加载某些本地化内容时它不查询数据库,那么您的第二个声明就没问题。