xia*_*oyi 20 php gettext php-gettext
这是php手册中的一小段代码片段:
putenv('LC_ALL=zh_CN');
setlocale(LC_ALL, 'zh_CN');
bindtextdomain('domain', './locale');
textdomain('domain');
echo gettext('Hello');
Run Code Online (Sandbox Code Playgroud)
哪个会输出你在domain.mo文件中定义的,但问题是只要Apache正在运行,gettext()总是返回缓存的结果.
如果我改变的翻译你好到您好的domain.mo,它仍将输出你好.
但是,通过更改和新名称的domain参数可以解决此问题.像到.但是每次更新文件时编辑php文件真的很痛苦.bindtextdomain()textdomain()"domain""domain2".mo
有没有更好的方法来做这个,比如删除一些文件夹或调用一些PHP函数来完成这项工作?这样我就可以为此编写一个小脚本.
xia*_*oyi 14
每一个解决方案(1,2,3)建议更改domain摆脱缓存的问题,但是这会在内存中创建大量外的日期缓存.
所以我挖掘了gnu-gettext源代码,了解缓存策略的详细信息(bindtextdom.c:78.)
当bindtextdomain(domain, dirname)被调用时,它会检查是否domain存在于缓存中; 如果是这样,它将检查是否dirname与缓存中的那个相同.如果失败,它将强制对同一域进行缓存刷新,而不是在内存中创建新缓存.
修复非常简单,首先创建一个指向存储文件的locale文件夹的虚拟链接.mo:
cd locale
ln -s . nocache
Run Code Online (Sandbox Code Playgroud)
然后再添加一行 bindtextdomain()
bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');
Run Code Online (Sandbox Code Playgroud)
现在缓存每次都被强制刷新.
更新:
在某些情况下这个hack可能不起作用(无法弄清楚确切的条件.)这个解决方案不是你应该在生产环境中使用的东西,而只是那些需要在保持httpd运行的同时修复某些东西的人!
只要你可以,请从一开始就避免使用gettext,这真的很古老,应该被弃用.
Pra*_*n D 14
我clearstatcache();在翻译之后调用了函数messages.po,messages.mo并且在没有重启apache的情况下工作正常.加载每个更改我在任何语言文件中所做的.
好的,就我而言,我需要通过执行服务php5.6-fpm-sp restart来重新启动phpfpm。
如果您使用的是php-fpm,则必须重新启动phpfpm才能清除gettext的缓存,但重新启动apache2无效。
希望对别人有用。