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 スクレイパーに私のページをen françaisで処理するよう具体的に依頼します。

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

今回は、スクレイパーからサーバーへの 2 つのリクエストが正しく表示されます。2 番目の要求では、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リンクをクリックすると、オブジェクトのプロパティとインターフェース言語が変更されます。仕様によるものだと思います。

入力URLにfb_localeが追加されていない「RawOpenGraphDocument Information」セクションには、デフォルトのデータが表示されます。fb_localeが設定されていて、大文字と小文字が混在している場合、Raw Open GraphDocumentInformationセクションはパラメーターに応じて変更されます。[オブジェクトのプロパティ]セクションには、実際の/選択されたロケールに基づくデータが引き続き表示されます。fb_localeが小文字の場合、「入力URLの解析中にエラーが発生しました。データはスクレイプされませんでした」を返します。

デバッガーの(入力ではなく)URLに追加された「locale」パラメーターについても同じことが言えます。大文字と小文字が混在する形式の場合は、[オブジェクトのプロパティ]セクションとインターフェイス言語が変更されます。ただし、小文字で渡すと何も起こりません(デフォルト/現在のロケールを返します)

驚いたことに、グラフAPIは逆に機能しています。

  1. phpSDKで再スクレイプをリクエストしたとき

    1. コンテンツは、ロケールが小文字で渡された場合にのみ更新されますが、この場合、返される応答には、X-Facebookロケールヘッダーまたはfb_localeパラメーターのいずれかが存在する場合に設定されるlocale:localeパラメーターがありません。

      応答のすべてのデータはデフォルトのロケールにあります。ただし、Facebookのロケール設定に従って、ウォールポストが更新され、テキストが正しく表示されます。

    2. ロケールが大文字と小文字が混在する形式で渡された場合(ドキュメントで定義されているように)、リクエストは「サポートされていないポストリクエスト」エラーを返します。Facebook phpSDKのapi呼び出しの代わりにphpCURL関数を使用する場合、en_GBは例外であり、応答にはfb_localeとローカライズされた(英語の)コンテンツも含まれますが、オブジェクトのプロパティ/ウォールポストは更新されません。en_GBの場合も同様です。他の言語の場合、「サポートされていないPOSTリクエスト」が返されます。

  2. URLの代わりにオブジェクトのID(デバッガーページの下部にあるID-「link_stat」テーブルの「comments_fbid」フィールドをクエリすることによって)を使用する場合:

    1. 大文字と小文字が混在するロケールでは、応答にはすべてのロケールの正しいテキストとfb_localeが含まれますが、いずれも更新されません。og:updated_timeはデバッガーでは変更されていませんが、https ://graph.facebook.com/[オブジェクトID]で更新されています。

    2. 小文字のロケールでは、結果は1.1で説明したものと同じです。

  3. グラフクエリでは、動作は上記とは逆になります。大文字と小文字が混在するロケールでhttps://graph.facebook.com/[object ID]?locale = en_GBをクエリしようとすると、期待される結果が返されます。小文字のロケールでは、ロケール(locale:alternateのみ)タグが設定されていないデフォルトバージョンを返します。:-o

グラフAPIエンドポイントとデバッガーがロケールを異なる方法で処理し、両方から同じ応答を取得することを不可能にする可能性はありますか?

ところで、小文字のロケールでは、フィードにローカライズされた投稿があり、テキストはuerのロケールに基づいて表示されます。

今私の問題は、すべてのリンクがロケール固有の情報なしで同じ正規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

私も同じ問題を抱えてる。

Like ボタンは Facebook に彼自身の属性のみを送信しdata-href="www.example.com/yourpage"、メタ タグの値は送信しません。その後、Fb は og メタ タグをページにスクレイピングし、これらからウォール ポストを作成します。
したがって、実際には、投稿は常にページのデフォルト言語で表示されます。

ユーザー言語で投稿する 1 つの解決策は次のとおりです。

  • ?lang=userlanguageいいねボタンのdata-href urlに追加
  • userlanguage適切な翻訳でメタタグ og:title および og:descriptionを取得および表示するページ機能を提供します(例: php $_GET を使用)。

したがって、Fb はユーザー言語でページをスクレイピングし、ロケール ポストを作成します。

残念ながら、Fb は異なる url ごとに 1 つのオブジェクトを作成します?lang=userlanguage1...userlanguage2そして、すべてのオブジェクトには独自のファン リストがあります。
したがって、あなたのページのすべての翻訳には、彼のロケール ファンがいます。
:-(


類似の質問: Open Graph Localization

于 2012-02-11T17:39:04.950 に答える
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 に答える