3

安装了 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 中与此相关的任何更改?

4

1 回答 1

4

cookie 由 LanguageTool 设置,仅在请求中不存在或与请求中设置的不同时设置。

LanguageTool 通常只会查看那个 cookie 来决定使用什么语言。在正常的 Plone 使用中,您永远不会在 CSS 和 JS 资源上看到 Set-Cookie 标头。然而,LinguaPlone 将 LanguageTool 配置为查看更多信息,包括您尝试访问的 URL,以确定用于响应的语言。

安装 LinguaPlone 后,LanguageTool 所做的是为访问的每个资源确定正确的语言,因为这是确保整个 UI 语言一致的唯一方法。

cookie 通常已经在加载主页时设置(随后加载带有 cookie 集的 JS 和 CSS)。因此,在正常情况下,您的 CSS 和 JS 是完全可缓存的。您只看到 Set-Cookie 标头Cookie: I18N_LANGUAGE="en",因为请求中没有相应的标头。

如果您必须针对您的特定用例进行控制,您可以使用 monkeypatch Products.PloneLanguageTool.LanguageTool.LanguageTool.__call__,这是一个发布前遍历钩子,将触发每个请求的语言确定。我建议为此使用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']

请注意,补丁会在事后删除 cookie,除非set_language在当前请求中使用过。

对于 Plone 4.x,此行为没有待处理的更改。

于 2011-04-19T16:04:30.910 回答