2012-03-28 78 views
1

你们好吗?我试图让我的PHP脚本接受多种语言,并让管理员可以选择在脚本中更改短语短语两种语言的MySQL

因此,我发现很多人在数据库中存储短语,但是我的问题是每次打开一个页面时,是否需要从数据库中选择所有短语?或我必须做什么?

 Phrase      EN       FR 
     ----------------------------------------------------------------------- 
     err_no_page   There was an error.   il y avait une erreur. 
在每一页我需要使用也许短语

,什么是从数据库中获取他们完美的方法,无需用尽服务器。

提前致谢。

+0

我想看看gettext()和.po文件。 – Interrobang 2012-03-28 02:29:49

+0

@Interrobang我认为'gettext'不是多线程环境友好的。 – 2012-03-28 02:46:23

回答

2

你应该正常化您的数据库是这样的:

短语

ID DESCRIPTION 
---- ---------------- 
1  'err_no_page' 
2  'another phrase' 

译本

ID PHRASE_ID LANGUAGE_ID TRANSLATION 
-- --------- ----------- ------------------------- 
1  1   'en'   'There was an error.' 
2  1   'fr'   'il y avait une erreur.' 
3  2   'en'   'etc' 

然后,你可以选择直接在单一语言的所有翻译:

SELECT 
    p.description, t.translation 
FROM 
    phrases p 
    INNER JOIN translations t ON t.phrase_id = p.id 
WHERE 
    t.language_id = 'en' 

这样做的好处是您可以在不更改数据库结构的情况下轻松添加更多语言。

如果这些短语经常使用(因为它们可能位于Web应用程序中),那么当您的应用程序启动时,您应该考虑将它们一次读入某种类型的内存字典缓存中,而不是从数据库中检索它们为每个页面加载。

编辑

退房PHP模块memcache为实现缓存的可能方式。

+0

这很好,但可以每个页面调用40个短语? ** 40 SELECT **?或者我应该选择所有的英语短语,然后让程序决定?非常感谢你。 – 2012-03-28 02:39:02

+0

我明白你的意思了,但你能否提供关于字典缓存的提示?你的意思是XML吗? – 2012-03-28 02:44:19

+0

看看memcache PHP模块 - http://php.net/manual/en/book.memcache.php – 2012-03-28 02:50:44

0

我希望你一次不会在所有短语中显示网站。

因此,最好在网站上的某个位置更改语言,然后运行查询以按照选定的语言一次提取短语,而不是全选。