已安装 Plone 3.3.5、LinguaPlone 和 Products.CacheSetup。
为portal_css 和portal_javascript 文件设置的语言cookie
HTTP/1.1 200 OK
Server: Zope/(unreleased version, python 2.4.5, linux2) ZServer/1.1 Plone/3.3.5
Expires: Tue, 26 Apr 2011 10:42:56 GMT
Last-Modified: Tue, 19 Apr 2011 10:42:56 GMT
Cache-Control: max-age=604800
Content-Type: application/x-javascript;charset=utf-8
Set-Cookie: I18N_LANGUAGE="en"; Path=/
Content-Length: 192404
Date: Tue, 19 Apr 2011 10:42:56 GMT
X-Varnish: 452768899
Age: 0
Via: 1.1 varnish
Connection: keep-alive
Pituus: 192404 (188K) [application/x-javascript]
Tallennetaan kohteeseen ”tiny_mce-cachekey1974.js”
这可以防止缓存。我找到了一些与此相关的旧信息:
http://www.evax.fr/papers/nginx-varnish-and-multilingual-plone
1)为什么要这样设置?我假设默认情况下所有资源都是语言中立的,并且仅在特殊条件下才包含特定于语言的内容。
2)我该如何摆脱它?也许有比猴子修补更聪明的方法,但没有在任何地方记录。
3) Plone 4.x 中是否有与此相关的更改?
最佳答案
cookie 由 LanguageTool 设置,并且仅当请求中尚未存在或与请求中设置的内容不同时才设置。
LanguageTool 通常只会查看该 cookie 来决定使用哪种语言。在正常的 Plone 使用中,你永远不会在 CSS 和 JS 资源上看到 Set-Cookie header 。然而,LinguaPlone 将 LanguageTool 配置为查看更多信息,包括您尝试访问的 URL,以确定用于响应的语言。
安装 LinguaPlone 后,LanguageTool 的作用是确定访问的每个资源的正确语言,因为这是确保整个 UI 语言一致的唯一方法。
Cookie 通常已在加载主页时设置(随后使用设置的 Cookie 加载 JS 和 CSS)。因此,在正常情况下,您的 CSS 和 JS 是完全可缓存的。您只能看到 Set-Cookie header ,因为请求中没有相应的 Cookie: I18N_LANGUAGE="en"
header 。
如果您必须针对特定用例控制这一点,您可以使用monkeypatch Products.PloneLanguageTool.LanguageTool.LanguageTool.__call__
,这是一个将触发语言的发布前遍历钩子(Hook)对每一个请求的决心。我建议为此使用 Collective.monkeypatcher 。这是我在最近的一个项目中所做的,其中网站在整个树中使用混合语言集进行了迁移(我们必须在将来的某个时候解决这个问题):
配置.zcml:
<?xml version="1.0"?>
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:monkey="http://namespaces.plone.org/monkey"
>
<!-- other directives -->
<include package="collective.monkeypatcher" />
<monkey:patch
description="Patch LanguageTool before traverse hook to prevent setting
the language cookie"
class="Products.PloneLanguageTool.LanguageTool.LanguageTool"
original="__call__"
replacement=".patches.LanguageTool__call__"
preserveOriginal="true"
/>
</configure>
在 patch.py 模块中:
from ZPublisher.HTTPRequest import HTTPRequest
def LanguageTool__call__(self, container, req):
"""The __before_publishing_traverse__ hook.
Patched to *not* set the language cookie, as this breaks the site model.
"""
self._old___call__(container, req)
if not isinstance(req, HTTPRequest):
return None
response = req.response
if 'I18N_LANGUAGE' in response.cookies:
if 'set_language' in req.form:
return None
del response.cookies['I18N_LANGUAGE']
请注意,除非在当前请求中使用了 set_language
,否则补丁会在事后删除 cookie。
Plone 4.x 的此行为没有待更改。
关于caching - 为什么 Plone 3 在 CSS 和 JS 注册表文件中设置语言 cookie 以及如何摆脱它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5715216/