drupal的多语言机制讨论

由 samon127 于 周二, 2007-06-19 13:25 提交。

才用了不多久的drupal,drupal的多语言机制以前没有怎么留意,以为是把.po包保存在本地,然后转换成.mo包后用gettext来处理,但是今天一看不对,drupal居然是用数据库来储存.po包的数据,而且用了联立的方式来查询,效率如何保障?

wordpress里面直接用gettext处理的.mo包,joomla用了单表数据库,一种语言一个字段,phpmyadmin用了数组,个人感觉应该是phpmyadmin最快,但是管理不便。

有没有可能在模块里面独立一个locale文件夹,然后写入语言包数组,而不使用默认的多语言处理方式。

需要条件:
1、设计多语言数组结构及t()函数的调用方式。
2、po包转换为语言数组的函数。

gettext? 是file IO?

gettext? 是file IO? 還比inner join慢了點
內文也不支持multi-lang

joomla 的多語言....你有用過嗎?

phpmyadmin 算不上一個CMS

我不是說drupal 的多語言非常突出, 但我自己覺得已經比主流的cms 好多了
但的確是慢(數據庫), 但看來沒有一個新的機制可以做得更好....

Joetsui's blog

慢并不是主要的原因

慢并不是主要的原因,不公平才是主要的,大量的数据库检索完全就是耗费了非英语版本的处理的时间,还不如一个函数将英文全部处理成中文再使用。

gettext慢?能详细解释一下,或者提供一下参考资料吗?

joomla 的多語言我当然是用过才说的,数据库里面一行一行的。

phpmyadmin的话,我们讨论的不是CMS,而是多语言版本,为什么phpmyadmin的机制就不能是一种比现在drupal更好的机制呢?

phpmyadmin

phpmyadmin 的多語言是定好了多少個字段
介面不會改變的情況之下, 用array 的確最快
但drupal 的介面, menu, 新的模組都有新的翻譯, 就不適用了

gettext: http://www.php.net/manual/en/ref.gettext.php
OS dependent, 要求一個新的libc, 而且是一個file IO 過程, file IO vs Mysql
也令內文不能自動跳到多語言

joomla 的多語言機制並沒有內建在核心
不能對應些模組
也會用到inner join

Joetsui's blog

使用phpmyadmin类似array

使用phpmyadmin类似array的形式,其实也不并不是说一定要固定长度的,每个模块都可以定义很多的翻译条目,然后让drupal拼合到一个大的数组里面,这个无论哪里有新的翻译都是没有关系的。但是这样的效率无疑的最高的。

gettext,wordpress里面有专门的类处理的,PHP5.2也集成在核心了,从非效率方面来讲,应该是趋势,但是模块化和易操作的方面,还需要探索。

新看了s9y的多语言处理,是定义了一大堆的常量(也是module+hook的),和phpmyadmin思路一样,只要有模块作为命名空间,数组和常量都是可以在效率上有优势的。

drupal中数据库储存的可扩展性值得怀疑,而且,po包的制作,非常不利于小的语种。

phpmyadmin 的方法,

phpmyadmin 的方法, 如果每一次都要找一下模組有什麼要翻譯
內存一定不足, 現在用drupal 的pox 工具找出單一的模組要翻的己經要用8M+ 內存
即時找更加不可能
一個大數組的方法只能用於<200 字段

gettext 既然不成熟, 效率低, 就會放棄, 這是drupal 的做法
連tinymce 這麼普及都給放棄了可見一班

不要輕看常量用的內存
一個首頁可翻譯的地方絕對比你所想的多

建基於數據庫的翻譯的確值得懷疑, 但無可否認的是
未有一個方案是公認最好
而我自己覺得, drupal 的多語言又剛巧做得最徹底
加上輕易的對應各模組等等
才令我覺得已現在各系統的多語言之中
drupal 的"擴展性"最好

Joetsui's blog

数组大小感觉不成问

数组大小感觉不成问题,整个drupal的hook机制就是一个大大的N维数组,怎么也要有好几千项吧,PHP可不像C一样用的是静态内存,大小不是问题的。

其实无论定义了数组还是常量,都有很大的数据的定义是无效的,而数据库就没有这个问题。

多语言版本分两类:

1、需要根据环境或者用户选择来显示不同的语言,需要有语言的切换功能。

2、程序拥有多种需要不同语言的能力,但一次只显示一种语言,不需要语言的切换能力。

其实大部分开源程序,包括drupal都不需要在同一时间显示多种语言的,所以我的想法是写一个批量处理的工具,然后用po包里面的内容直接替换程序代码中t()函数的第一个参数(也就是英语部分)。觉得怎样?

hook 不是數組,

hook 不是數組, 是一堆function calls
只儲一個地址

其實多語言有很多時候是一個站
但是有很多不同國家的人看
需要多語言
的確不需要切換(一個用戶只會看一種語言吧)
但同一個意思卻要有多個相同意義但不同語言的字符

你的方法的確是最快
但不是多語言, 而是改成其他基本語言

Joetsui's blog

不是说hook就是数组,

不是说hook就是数组,是hook运行以后,页面显示之前,所有的数据都是用数组储存取来的,比方说一个node,一个form,一个menu等等,这里面就有几千项的东西,一个超级大的数组

一個用戶只會看一種語言的情况属于“根据环境或者用户选择”的情况,本站就属于这种情况,你可以选择英语,但是很多别的网站,尤其是CMS和BLOG系统来说,并不是非要给用户这个权限的,即使本站不提供选择英语界面的功能,我觉得也并不会影响用户的使用,反而是速度上的提升,服务器压力的减小,对网站更需要。

“但不是多語言, 而是改成其他基本語言”,如果可以从程序上解决,让网站的基本语言通过批量替换的方式随意的改来改去,我觉得是完全可以的,并没有脱离多语言的范畴。

有没有benchmark测试local

有没有benchmark测试locale查询到底有多慢?

--------------------------------------------------
非常大米:http://www.verydummy.com/
--------------------------------------------------

使用firefox的fasterfox简

使用firefox的fasterfox简单的比较了一个页面,是在本地,页面地址是admin/build/modules,英文界面在0.8-1.1秒左右显示完成,而且很稳定。中文页面在1.0-1.8秒左右,这个差别还是有的。

管理界面我不太关心

事实上我倒希望后台管理界面是英文的,看起来反倒容易些,没那么多歧义
如果是前台的话,哪个页面涉及的翻译比较多?frontpage的延迟有多少?node, forum页面又有多少?我的机器不行,哪位有条件做个ab stress测试,比较一下是否开启locale,是否使用drupal的page cache,匿名/登录用户等等的性能差异就好了。

一直都有评论说drupal的locale慢,但一直也没有看到比较完整的benchmark,比较好奇到底有多慢。

--------------------------------------------------
非常大米:http://www.verydummy.com/
--------------------------------------------------

用devel module, localhost

用devel module, localhost apache mysql, drupal5.1, firefox2.004 測試, 管理員登入(uid=1)
用首頁測試, 10個node

No cache
開啟locale, 英文(6個測試)
264queries
平均query 237.65ms
頁面1230.68ms

No cache
關閉locale, 英文(6個測試)
248queries
平均query 186.29ms
頁面1000ms

有一點比較特別的
沒有用cache, 但是locale 自己還是會用cache
所以去掉第一次測試結果

Joetsui's blog

哪些模块对性能影响

哪些模块对性能影响比较大?

www.j0575.com
http://www.j0575.com/user/7

沒有做過統計 你可以

沒有做過統計
你可以用devel 模組自己試一下

我的這個測試只是針對i18n 的

Joetsui's blog

續,

續, 用上一個全新的安裝
devel, localhost apache mysql, drupal5.1, firefox2.004
全部No cache, 全新安裝, 無node, 用 user/1 測試, 用管理者登入, 取五個測試平均

關locale, 英
14query
queries共10.182ms
頁面274.808ms

開locale, 英
15query
queries 共11.836ms
頁面262.244ms

開locale, 中繁84.35%
35queries
queries共31.798ms
頁面250.41

最後一個給參考
關locale, 英, 開profile, 加入一個single-line field city, user1 填入Hong Kong
18 query
query 共13.1ms
頁面391.634

還有一句, devel 和 locale 好像不是太合得來

Joetsui's blog

http://mel.melaxis.com

http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/

从这里面看来,数组不是快的,没有php5带着的gettext extension快。

http://www.litfuel.net/plush/?postid=84

再从这里看,可以确认使用数据库应该也是挺快的。

现在就是看,SQLite,MySQL,gettext extension这三个哪个更快了。

我瞎猜一下,gettext

我瞎猜一下,gettext extension是不是会有相当一部分shared host不支持,这可能也是drupal core的一个考虑。当然如果是contrib module就没有这个问题了,只支持php5.2好了:)
--------------------------------------------------
非常大米:http://www.verydummy.com/
--------------------------------------------------

多谢

初步来看,有时间的话我也重复一下。是不是也就是说locale的损失没有那么大?

非常大米

very fast t()

Drupal 6.x 有一个patch是如果只需要少量界面翻译的话,可以在settings.php里面手写要翻译的字串数组:

http://drupal.org/node/131061

--------------------------------------------------
非常大米:http://www.verydummy.com/
--------------------------------------------------

我现在都是翻译进模

我现在都是翻译进模块里的

我也是

一些小的模块,前台显示的字也不多我就直接在文件里翻译了,省事,还快,反正我也不需要多语言。

有一个cache的

有一个cache的

如果用gettext 对于硬盘是个考验

还有,如果想提高速度的话在locale.module里面的locale函数的$result = db_query("SELECT s.lid, t.translation FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid WHERE s.source = '%s' AND t.locale = '%s'", $string, $locale);
这句前面加上return $string;

这样速度提高很多,但是可能有小部分英文出现

Druap 性能测试,在访问量不大的情况下,使用locale对系统影响是很小的

#url 路径
#no cache,no apc,Locale
#no cache,no apc,no Locale (不使用本地化)
#no cache,apc,Locale (使用APC)

http://127.0.0.1/ads-view/
Executed 145 queries in 99.82 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 805.13 ms
Executed 137 queries in 81.86 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 772.99 ms.
Executed 143 queries in 104.94 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 392.05 ms.

http://127.0.0.1/ads-view/?q=tracker
Executed 60 queries in 36.45 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 777.65 ms.
Executed 56 queries in 32.36 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 765.94 ms.
Executed 58 queries in 41.98 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 342.57 ms.

http://127.0.0.1/ads-view/?q=node/add
Executed 25 queries in 18.79 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 681.18 ms.
Executed 17 queries in 11.42 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 634.7 ms.
Executed 23 queries in 21.58 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 226.67 ms.

http://127.0.0.1/ads-view/?q=/forum
Executed 44 queries in 32.11 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 687.06 ms.
Executed 36 queries in 26.2 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 652.87 ms.
Executed 42 queries in 37.4 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 260.86 ms.

http://127.0.0.1/ads-view/?q=forum/8
Executed 36 queries in 30.12 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 732.09 ms.
Executed 29 queries in 18.83 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 673.81 ms.
Executed 35 queries in 28.12 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 205.27 ms.

http://127.0.0.1/ads-view/?q=node/33
Executed 106 queries in 85.75 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 881.26 ms.
Executed 75 queries in 61.54 milliseconds. Queries taking longer than 5 ms and queries executed more than once, are highlighted. Page execution time was 823.43 ms.
---------------------------------------------
欢迎访问我的drupal网站http://web.srv.cn/drupal/。使用的模块有E-Commerce,Google Adsense,FlashVidie,Organic Groups.
---------------------------------------------

Good to know,

Good to know, thanks!
--------------------------------------------------
非常大米:http://www.verydummy.com/
--------------------------------------------------