2009-12-24 59 views
0

澄清:合并MO文件的缓存策略,它将成为数组?

  • 我不使用gettext的PHP模块 /扩展,原因是因为我有对付没有包括gettext的服务器,我知道的PHP的gettext的但是这使得我必须使用多个库变得复杂。更进一步,我不想依赖于安装了必要的语言环境的用户,而有些服务器我不具有root访问权限来执行此操作。我也意识到一般情况下有很多地区的问题。
  • 必须支持PHP4。是的,它已经死了。是的,我讨厌它。但我没有选择。

我有解析通过每MSGID,msgstr等“服务器级”基于当前语言.mo gettext的文件(默认为烯),进行迭代,并且填充的阵列与MSGID的键/值和一类msgstr。

之后我有一个方法解析“应用程序级”.mo文件,并将它们合并在初始数组中,因此应用程序级别转换优先于服务器端通用转换。

因为我为我的字符串翻译使用合并数组,并且我不想读取每个页面上读取的.mo文件,所以我需要一些方法来实际缓存这个并使用缓存版本如果正在读取的页面与缓存版本具有相同的语言/区域设置。

所以,如果我去了我的网站,默认语言是英语,它会读取英文服务器/应用程序mo文件,合并它们,制作数组,缓存它。如果用户点击的下一页是英文,则会使用缓存版本。否则,如果是西班牙语,则再次合并,并使用西班牙语缓存版本。

所以基本上,我将如何去缓存语言/特定于语言环境的合并数组?我从来没有真正实现缓存自己,但我会假设我需要做的是serialize我的数组,然后将其写入应用程序级缓存目录,并将文件名保存为'translation - {$ locale} '其中$ locale类似于'en',然后使用逻辑来确定我的应用中的区域设置是什么,基于此来查看是否有可用的缓存版本 - 如果是,unserialize并且只是使用它?

这是通常它是如何完成的?我非常感谢代码示例。该阵列我有大约有200-300键/值对,只是一个二级多维数组:

array(
    'en' => array(
    'Hello' => '', 
), 
    'es' => array(
    'Hello' => 'Hola', 
) 
); 

回答

1

我不理解为什么要缓存的多语言数组?您是否需要在应用程序的单个请求(其php)中提供对> 1语言的支持?

无论如何,你说的很好 - 序列化数组,将其粘贴到缓存中并在将来检索。如果您缓存未命中,请重新计算该阵列。

然后将其写入到一个 应用程序级缓存目录, 保存的文件名,就像这样 “翻译 - {$区域}”,其中$区域 是像“恩”,然后用逻辑 以确定我的 应用中的区域设置是什么,基于此查看是否有可用的 缓存版本。

文件I/O速度不如内存访问速度快 - 如果您经历缓存此问题,我会建议查看memcache。

+0

memcached是不可行的,因为这个框架需要安装在各种类型的环境中,其中很多(99%)不会,也可能不会有memcached。 – 2009-12-24 16:08:05

+0

该应用程序支持不同的语言环境,某些站点具有德语,英语和法语翻译,这些语言环境/语言中的每一个均具有合并的服务器/客户端mo文件。 – 2009-12-24 16:08:56