13

我的网站是多语言的,我有一个类似 FB 的按钮。我想有不同语言的类似帖子。

根据 Facebook 文档,如果我使用元标记 og:locale 和 og:locale:alternate,刮板将通过参数“locale”和标题“X-Facebook-Locale”获取我的站点信息,但它既不发送也不发送.(https://developers.facebook.com/docs/beta/opengraph/internationalization/)。所以帖子总是以 en_US 结尾。

有人有同样的问题吗?

4

5 回答 5

18

我得到了这个工作。文档不是很详细;这是详细信息。

这是我的 Open Graph 语言环境标签:

<meta property="og:locale" content="en_US" />
<meta property="og:locale:alternate" content="en_US" />
<meta property="og:locale:alternate" content="fr_CA" />

非常重要: 文档看起来og:locale应该始终反映页面的“默认”区域设置。不是这种情况; 这样做会阻止爬虫检索其他语言。og_locale必须反映页面的当前语言环境。换句话说,如果爬虫(或用户)请求fr_CA内容,请确保在响应og_locale中设置为。fr_CA

用 指定所有可能的语言环境og:locale:alternate。这样,无论刮板要求en_US还是fr_CA,它仍然知道两者都存在。

这是我要求 Facebook 刮板重新处理我的页面:

curl -d "id=https://apps.facebook.com/everydaybarilla/&scrape=true" https://graph.facebook.com

这是回应:

{
   "url": "http://apps.facebook.com/everydaybarilla/",
   "type": "website",
   "title": "Barilla\u2019s Every Day, Every Way Contest",
   "locale": {
      "locale": "en_us",
      "alternate": [
         "fr_ca"
      ]
   },
   "image": [
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/5.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/4.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/3.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/en-2.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/en-1.png"
      }
   ],
   "description": "Barilla Canada is whisking one lucky winner and a guest off to Italy on an 8-day Italian culinary adventure for 2 in the Barilla Every Day, Every Way Contest!",
   "site_name": "Barilla\u2019s Every Day, Every Way Contest",
   "updated_time": "2012-04-16T17:59:38+0000",
   "id": "10150594698421968",
   "application": {
      "id": "317271281656427",
      "name": "Barilla\u2019s Every Day, Every Way Contest",
      "url": "http://www.facebook.com/apps/application.php?id=317271281656427"
   }
}

刮板正确返回默认语言环境的数据,但根据文档,刮板似乎也应该刮掉备用语言环境;不是这种情况。从上面的响应中可以清楚地看出,它看到了备用语言环境,但它不处理它们。

所以,这是我专门要求 Facebook 抓取工具以法语方式处理我的页面:

curl -d "id=https://apps.facebook.com/everydaybarilla/&scrape=true&locale=fr_CA" https://graph.facebook.com

这一次,我正确地看到了从爬虫到我的服务器的两个请求。第二个请求的X-Facebook-Locale标头和fb_localeURL 参数都正确设置为fr_CA. 并且 POST 正确返回法语响应:

{
   "url": "http://apps.facebook.com/everydaybarilla/?fb_locale=fr_CA",
   "type": "website",
   "title": "Concours Tous les jours, de toutes les fa\u00e7ons de Barilla",
   "locale": {
      "locale": "fr_ca",
      "alternate": [
         "en_us",
         "fr_ca"
      ]
   },
   "image": [
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/5.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/4.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/3.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/fr-2.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/fr-1.png"
      }
   ],
   "description": "Un heureux gagnant et son invit\u00e9(e) partiront \u00e0 destination de l\u2019Italie pour une aventure culinaire de 8 jours pour 2 personnes (valeur au d\u00e9tail approximative de 15 000 $)!",
   "site_name": "Barilla\u2019s Every Day, Every Way Contest",
   "updated_time": "2012-04-16T18:11:27+0000",
   "id": "10150594698421968",
   "application": {
      "id": "317271281656427",
      "name": "Barilla\u2019s Every Day, Every Way Contest",
      "url": "http://www.facebook.com/apps/application.php?id=317271281656427"
   }
}

成功!

当然,经过所有这些努力,当我访问法语 Facebook.com 并发布此 URL 时,状态框已填充...... 英文数据。似乎 Facebook 自己的界面未配置为请求正确的语言环境。

所以即使付出了所有这些努力,似乎什么也没有完成(通过 Facebook 翻译应用程序翻译我的字符串也不起作用,所以我想我不应该感到惊讶)。

不过,它确实回答了这个问题。也许其他人可以确定为什么 Facebook.com 界面似乎没有请求正确的语言环境。

于 2012-04-16T18:54:20.607 回答
3

Facebook 的语言环境处理完全不一致

在与开放图形语言环境搏斗了数周之后,我设法发布了基于用户语言环境更改文本的内容。但是对于链接,我仍然无法获得预期的结果。

以下是我的观察:

调试器中的 og:locale 默认显示我实际的 facebook 语言环境。单击 og:locale:alternate 链接会更改对象属性以及界面语言。我认为这是设计使然。

'Raw Open Graph Document Information' 部分,没有 fb_locale 附加到输入 URL,显示默认数据。如果设置了 fb_locale 并且大小写混合,则 Raw Open Graph 文档信息部分根据参数进行更改。“对象属性”部分仍显示基于实际/选定区域设置的数据。如果 fb_locale 为小写,则返回“解析输入 URL 时出错,没有数据被抓取。”

附加到调试器(而不是输入)URL 的 'locale' 参数也是如此。如果它是混合大小写格式,则对象属性部分和界面语言会更改。但是,当我以小写形式传递它时它什么也不做(返回默认/当前语言环境)

令人惊讶的是,graph api 的作用相反:

  1. 当我请求使用 php sdk 重新刮擦时

    1. 仅当区域设置以小写形式传递时,内容才会更新,但是(!)在这种情况下,返回的响应没有 locale:locale 参数,如果存在 X-Facebook 区域设置标头或 fb_locale 参数,则设置该参数。

      响应中的所有数据都采用默认语言环境。但是,墙上的帖子已更新,并且根据我的 facebook 区域设置正确显示了文本。

    2. 如果语言环境以混合大小写格式传递 - 正如文档所定义的那样 - 请求返回“不支持的发布请求”错误。当使用 php CURL 函数而不是 Facebook php SDK 的 api 调用时,en_GB 是一个例外,其中响应包含 fb_locale 和本地化(英语)内容,但是,对象属性/墙贴没有更新,en_GB 也没有。对于其他语言,返回“未支持的发布请求”。

  2. 当我使用对象的 id(在调试器页面底部找到的 id - 通过从 'link_stat' 表中查询 'comments_fbid' 字段)而不是 URL 时:

    1. 对于混合大小写的语言环境,响应包含所有语言环境的正确文本和 fb_locale,但它们都没有更新。og:updated_time 在调试器中未更改,但在https://graph.facebook.com/[object ID]上已更新

    2. 使用小写语言环境,结果与 1.1 中描述的相同。

  3. 在图形查询中,行为再次与上述相反:当我尝试使用混合大小写的语言环境查询https://graph.facebook.com/[object ID]?locale=en_GB 时,它返回预期结果,对于小写语言环境,它返回没有设置语言环境(仅语言环境:备用)标签的默认版本。:-o

图形 api 端点和调试器是否有可能以不同的方式处理语言环境,从而无法从两者获得相同的响应?

顺便说一句,使用小写语言环境,我设法在提要上本地化了帖子,其中文本根据用户的语言环境显示。

现在我的问题是所有链接都指向相同的规范 URL,没有任何特定于区域设置的信息,因为 - 正如萨尔瓦多所说 - 这样做会创建不同的对象。在此处查看我的帖子: 如何获取 facebook 用户单击本地化对象链接的语言环境?

于 2013-02-24T23:24:17.360 回答
1

我遇到了同样的问题,直到最终通过将元标记(og:locale和og:locale:alternate)中的所有语言环境值设置为小写来使其工作。

看看这个:http: //developers.facebook.com/bugs/309825175774568 ?browse=search_5033cc14f42016961266549

在这样做并重新抓取之后,转到 Facebook 并将语言设置更改为支持的语言环境将正确发送 X-Facebook-Locale 和 fb_locale,并为我触发所需的结果。

顺便说一句:将用户语言环境设置为 og:locale:alternate 中未列出的语言环境不会发送 header/get 参数。

于 2012-08-21T18:21:24.760 回答
0

您在加载 Javascript SDK 时指定了什么语言?很容易忽略那个。

默认是 en_US,见 js.src 行

<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=127211380649475";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
于 2012-01-13T23:09:27.303 回答
0

我也有同样的问题。

Like 按钮只向 Facebook 发送他自己的属性data-href="www.example.com/yourpage",而不是 og 元标记值。然后 Fb 将 og 元标记刮到您的页面中,并从中创建 Wall 帖子。
所以实际上帖子总是使用你的页面默认语言。

以用户语言发布帖子的一种解决方案是:

  • 添加 ?lang=userlanguage到 Like 按钮的 data-href url
  • 让您的页面能够userlanguage在适当的翻译中获取和显示元标记 og:title 和 og:description(例如,使用 php $_GET)

因此,Facebook 会以用户语言抓取您的页面,并创建一个区域设置帖子。

不幸的是,Facebook 为每个不同的 url 创建了一个对象?lang=userlanguage1userlanguage2......每个对象都有自己的粉丝列表。
所以你页面的每一个翻译都会有他的语言环境粉丝。
:-(


类似问题:Open Graph Localization

于 2012-02-11T17:39:04.950 回答