Метатеги Facebook соскоблили с неработающим языком
Мой сайт является многоязычным, и у меня есть кнопка FB. Я хотел бы иметь похожие сообщения на разных языках.
Согласно документации на Facebook, если я использую метатег og: locale и og: locale: alternate, скребок получит информацию о моем сайте, передав параметр "locale" и заголовок "X-Facebook-Locale", но он не отправляя ни один. (https://developers.facebook.com/docs/beta/opengraph/internationalization/). Таким образом, сообщения заканчиваются всегда в en_US.
Кто-нибудь, имеющий такую же проблему?
Ответы
Ответ 1
Я получил эту работу. Документация не очень детализирована; вот подробности.
Вот мои локальные теги 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 обрабатывать мою страницу en français:
curl -d "id=https://apps.facebook.com/everydaybarilla/&scrape=true&locale=fr_CA" https://graph.facebook.com
На этот раз я правильно вижу два запроса на свой сервер из скребка. Второй запрос имеет как заголовок X-Facebook-Locale
, так и параметр URL fb_locale
, правильно установленный на 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, похоже, не запрашивают правильную локаль.
Ответ 2
Обработка локали в Facebook полностью противоречива
После борьбы с открытыми графическими локалями уже несколько недель мне удалось опубликовать контент с меняющимися текстами на основе пользовательской локали. Однако для ссылок я все еще не могу получить ожидаемые результаты.
Вот мои наблюдения:
og: locale в отладчике показывает по умолчанию, мой фактический языковой стандарт. Нажатие на og: locale: альтернативные ссылки изменяет свойства объекта, а также язык интерфейса. Я думаю, что это по дизайну.
Раздел "Информация об открытом графическом документе", без добавления fb_locale к URL-адресу ввода, показывает данные по умолчанию. Если fb_locale установлен, и в смешанном случае раздел Raw Open Graph Document Information изменяется в соответствии с параметром.
Раздел "Свойства объекта" по-прежнему показывает данные на основе фактического/выбранного языка.
Если fb_locale находится в нижнем регистре, он возвращает "URL-адрес для разбора входных данных, данные не были очищены".
То же самое верно для параметра 'locale', добавленного к URL-адресу отладчика (а не ввода). Если в формате смешанного фрейма, раздел "Свойства объекта" и язык интерфейса изменены. Тем не менее, он ничего не делает, когда я передаю его в нижнем регистре (возвращает значения по умолчанию/текущие локали)
Удивительно, что график api действует обратно:
-
когда я запрашиваю повторную очистку с помощью php sdk
-
содержимое обновляется только в том случае, если локаль передается в нижнем регистре, но (!) в этом случае возвращенный ответ не имеет параметра locale: locale, который устанавливается, если заголовок локали X-Facebook или fb_locale параметр присутствовал.
Все данные в ответе соответствуют языку по умолчанию. Тем не менее, стеновое сообщение обновляется, и текст отображается правильно в соответствии с моими настройками локали.
-
если локали передаются в смешанном формате - как определено в документации -, запрос возвращает ошибку неподдерживаемого почтового запроса.
При использовании функции php CURL вместо вызова api-сервера php для Windows php, en_GB является исключением, где ответ содержит fb_locale и локализованный (английский) контент, но, свойства объекта/сообщения на стене не обновляются, ни для en_GB. Для других языков возвращается "Неподдерживаемый почтовый запрос".
-
Когда я использую идентификатор объекта (идентификатор, найденный в нижней части страницы отладчика, путем запроса поля "comments_fbid" из таблицы "link_stat" ) вместо URL-адреса:
-
со смешанными локалями case, ответ содержит правильный текст и fb_locale для всех локалей, но ни один из них не обновляется. og: updated_time не изменяется в отладчике, но обновляется на https://graph.facebook.com/[object ID]
-
с нижестоящими локалями, результат будет таким же, как описано в 1.1.
-
В графических запросах поведение снова противоположно приведенному выше:
Когда я пытаюсь запросить https://graph.facebook.com/[object ID]? Locale = en_GB,
с неоднородными локалями, он возвращает ожидаемый результат,
с нижним регистром, он возвращает версию по умолчанию, не устанавливая теги locale (только locale: alternate).: -o
Возможно ли, что конечная точка графика api и отладчик по-разному обрабатывают локали, что делает невозможным получение одинакового ответа от обоих?
btw с нижестоящими локалями, мне удалось локализовать сообщения в фиде, где текст отображается на основе языкового стандарта uer.
Теперь моя проблема заключается в том, что все ссылки указывают на один и тот же канонический URL-адрес без какой-либо информации, относящейся к языку, потому что, как сказал Сальвадор, для этого будут созданы разные объекты. Смотрите мой пост здесь:
Как получить локаль пользователя facebook, щелкнув ссылку локализованного объекта?
Ответ 3
У меня были такие же проблемы, пока, наконец, не получилось работать, установив все значения локали в метатегах (og: locale и og: locale: alternate) в нижнем регистре.
Проверьте это:
http://developers.facebook.com/bugs/309825175774568?browse=search_5033cc14f42016961266549
После этого и повторного соскабливания, перейдя на Facebook и изменив языковые настройки на поддерживаемый язык, вы правильно отправите X-Facebook-Locale и fb_locale и произведете для меня желаемые результаты.
Btw: настройка локали пользователя на один, не указанный в og: locale: alternate не отправляет параметр header/get.
Ответ 4
Какой язык вы указали при загрузке 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>
Ответ 5
У меня та же проблема.
Кнопка "Like" отправляет Facebook только свой собственный атрибут data-href="www.example.com/yourpage"
, а не значения метатег. Впоследствии Fb сбрасывает метатеги на вашу страницу, и из них создается сообщение Wall.
Так что практически пост всегда находится на вашем языке по умолчанию.
Одним из решений для размещения сообщений в userlanguage является:
- Добавить
?lang=userlanguage
в URL-адрес данных href кнопки Like.
- Дайте вашей странице возможность получить
userlanguage
и отобразить метатеги og: title и og: description в соответствующем переводе
(например, с помощью php $_GET)
Итак, Fb очистит вашу страницу на пользовательском языке и создаст почтовую запись.
К сожалению Fb создать единый объект для каждого другого URL ?lang=userlanguage1
, userlanguage2
... и у каждого объекта есть список своих поклонников.
Поэтому каждый перевод вашей страницы будет иметь своих поклонников.
: - (
Аналогичный вопрос: Открытая локализация графики