我的网站是多语言的,我有一个类似FB的按钮。我想用不同的语言发帖。
根据Facebook文档,如果我使用元标记og:locale和og:locale:alternate,则刮刀会通过参数“locale”和标题“X-Facebook-Locale”获取我的网站信息,但它是不发送任何内容。(https://developers.facebook.com/docs/beta/opengraph/internationalization/)。所以帖子总是以en_US结尾。
有人遇到同样的问题吗?
答案 0 :(得分:17)
我得到了这个工作。 The documentation不是很详细;这是细节。
以下是我的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" />
非常重要: The documentation似乎og:locale
应始终反映网页的“默认”区域设置。不是这种情况;这样做会阻止刮刀检索其他语言。 og_locale
必须反映网页的当前区域设置。换句话说,如果抓手(或用户)请求fr_CA
内容,请确保{{ 1}}在响应中设置为og_locale
。
使用fr_CA
指定所有可能的区域设置。这样,无论是刮刀要求og:locale:alternate
还是en_US
,它仍然知道两者都存在。
这是我要求Facebook刮刀重新处理我的页面:
fr_CA
以下是回复:
curl -d "id=https://apps.facebook.com/everydaybarilla/&scrape=true" https://graph.facebook.com
刮刀正确返回默认语言环境的数据,但根据the documentation,刮板似乎也应该刮掉备用语言环境;不是这种情况。显然,从上面的响应中可以看到备用语言环境,但它不会处理它们。
所以,这是我特意要求Facebook刮刀处理我的页面enfrançais:
{
"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"
}
}
这一次,我正确地从刮刀中看到了对我的服务器的两个请求。第二个请求将curl -d "id=https://apps.facebook.com/everydaybarilla/&scrape=true&locale=fr_CA" https://graph.facebook.com
标头和X-Facebook-Locale
网址参数正确设置为fb_locale
。 POST正确返回法语响应:
fr_CA
成功!
当然,经过所有这些努力,当我访问法国Facebook.com并发布此URL时,状态框将填充...包含英文数据。似乎Facebook自己的接口未配置为请求正确的区域设置。
所以即使付出了这些努力,似乎也没有任何成就(通过Facebook翻译应用程序翻译我的字符串也不起作用,所以我想我不应该感到惊讶)。
但它确实回答了这个问题。也许其他人可以确定为什么Facebook.com界面似乎没有请求正确的区域设置。
答案 1 :(得分:3)
Facebook的语言环境处理完全不一致
在打开图形区域设置几周后,我设法根据用户的区域设置发布更改文本的内容。但是对于链接,我仍然无法获得预期的结果。
以下是我的观察:
og:调试器中的语言环境默认显示我的实际facebook语言环境。单击og:locale:alternate链接可更改对象属性以及界面语言。我认为这是设计的。
“原始打开图形文档信息”部分,未将fb_locale附加到输入URL,显示默认数据。如果设置了fb_locale并且是大小写混合,则根据参数更改Raw Open Graph Document Information部分。 “对象属性”部分仍显示基于实际/选定区域设置的数据。 如果fb_locale是小写的,则返回'解析输入URL时出错,没有数据被删除。'
对于附加到调试器(而不是输入)URL的'locale'参数,情况也是如此。如果是大小写混合格式,则会更改“对象属性”部分和界面语言。但是,当我以小写形式传递它时,它什么都不做(返回默认/当前语言环境)
令人惊讶的是,图表api反向运行:
当我请求使用php sdk进行重新扫描时
仅当locale以小写形式传递时才更新内容,但是(!)在这种情况下,返回的响应没有locale:locale参数,如果是X-Facebook区域设置标头或fb_locale,则设置该参数参数存在。
响应中的所有数据都是默认语言环境。但是,更新了墙贴,并根据我的facebook区域设置正确显示文本。
如果语言环境以大小写混合格式传递 - 如文档所定义 - 请求返回'不支持的帖子请求'错误。 当使用php CURL函数而不是Facebook php SDK的api调用时,en_GB是一个例外,其中响应包含fb_locale和本地化(英语)内容,但是,对象属性/墙上的帖子不会更新,也不会更新en_GB。对于其他语言,将返回“不支持的帖子请求”。
当我使用对象的id(调试器页面底部的id - 通过查询'link_stat'表中的'comments_fbid'字段)而不是URL时:
对于大小写混合语言环境,响应包含所有语言环境的正确文本和fb_locale,但不会更新任何语言环境。 og:updated_time在调试器中没有变化,但它已在https://graph.facebook.com/[object ID]上更新
使用小写语言环境,结果与1.1中描述的相同。
在图表查询中,行为再次与上述相反: 当我尝试查询https://graph.facebook.com/[object ID]?locale = en_GB时, 使用混合大小写语言环境,它返回预期结果, 使用小写语言环境,它返回默认版本,不设置语言环境(仅限locale:alternate)标记。 :-o
图形api端点和调试器是否可能以不同方式处理区域设置,从而无法从两者获得相同的响应?
btw使用小写区域设置,我设法在Feed上设置了本地化的帖子,其中的文本根据用户的区域设置显示。
现在我的问题是所有链接都指向相同的规范URL而没有任何特定于语言环境的信息,因为 - 正如萨尔瓦多所说 - 这样会产生不同的对象。在这里看我的帖子: how to get the locale of a facebook user clicking on a localised object's link?
答案 2 :(得分: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参数。
答案 3 :(得分: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>
答案 4 :(得分:0)
我有同样的问题。
Like按钮仅向Facebook发送他自己的属性data-href="www.example.com/yourpage"
,而不是og元标记值。然后Fb将og meta标签刮到你的页面,然后从这些标签创建Wall帖子
所以实际上帖子总是以你的页面默认语言。
在用户语言中发布帖子的一个解决方案是:
?lang=userlanguage
添加到Like按钮userlanguage
的功能,并在相应的翻译中显示元标记og:title和og:description
(例如用php $ _GET)所以Fb会在用户语言中抓取你的页面并创建一个区域设置帖子。
很遗憾 Fb为每个不同的网址?lang=userlanguage1
,userlanguage2
创建一个对象...并且每个对象都有自己的粉丝列表。
因此,您网页的每个翻译都会有他的地方粉丝
: - (
类似的问题:Open Graph Localization