【Facebook】Graph APIでユーザ名のロケール指定して取得する | 稼働率99.9%

稼働率99.9%

春日井市でiPhoneアプリの開発を行っています。iPhoneを使い出してからそれに伴って開発環境もWindowsからMacへと移行しました。MacやiPhoneだけでなくIT全般について日々感じた事や思った事を備忘録として記録する事を目的としたブログです。

ロケールの指定


Facebookのユーザ名を取得するには、Graph APIを利用し以下のリクエストを投げます。
 http://graph.facebook.com/me
  または
  http://graph.facebook.com/fql?q=select first_name,last_name,name from user where uid=me()


ユーザ名を取得できるのですが、
「名前の言語別表示」ではなくデフォルト表示の名前が取得されます。 
(2012/03/18時点)
「名前の言語別表示」で設定しているユーザ名を取得するには、ロケールを指定する必要があります。
  http://graph.facebook.com/me&locale=ja_JP
  または、
  http://graph.facebook.com/fql?q=select first_name,last_name,name from user where uid=me()&locale=ja_JP

ロケールに指定できる言語は、InternationalizationのXMLを参照して下さい。


参考:
 
Internationalization

Graph API、REST API、FQL


この名前の言語問題は、下記のサイトでも言及されています。
FacebookのAPIの仕様変更 – ユーザ名は、どの言語で取得できるのか – | コーヒーサーバは香炉である
FacebookのAPIで日本語表記の名前を取得する - Heart-Driven-Blog #2
Facebook の Graph API (JS SDK) から取得する自分の名前を日本語にする - slowjet


当初、【楽勝】と思っていたのですが事はそれ程簡単ではありませんでした。
主な理由はFacebookのAPIを理解していなかった事が原因ですが、データへのアクセス方法が複数ある為に単純に何を使用すればいいのかピンと来なかった事もあります。
ユーザの情報を取得するのに「Graph API」、「REST API」、「FQL」とどれを使っても同じ結果が返ってきます。(厳密にはユーザ名の言語問題が絡みます。)
※少なくとも2012/03/18時点では、
「REST API」 は非推奨扱いになっているのでこれからアプリを作成するのであれば
「Graph API」 を使用すればいいかと思います。また、「FQL」は、
「Graph API」 の拡張にあたるので必要に応じて使用すればいいと思います。

どのようにユーザ名が使用されているのか

 設定したユーザ名がどのように使用されるのか調査した点を以下にまとめます。 
1.前提
 ここで言うデフォルトの名前と日本語名については以下のとおりです。

 母語が日本語の場合、デフォルトには英語での表記、言語別表示に日本語の表記を
 設定されているはずです。
 ※もちろんデフォルトに日本語名を設定している場合もありますので必ずこの限りで
  はありません。
 どちらが使用されるかは、
 1)自身の言語と閲覧したユーザの言語が同じ場合 ・・・ 言語別表示を優先
 2)自身の言語と閲覧したユーザの言語が異なる場合 ・・・ デフォルトを優先
 となります。
 上記の内容を確認する為に自身の言語設定を変更してみます。 
 1)日本語が母語になっているので表記される名前も言語別表示が表示されます。

001

 2)設定で言語を英語にした場合

002


 友達や検索されて表示される他人の名前で確認してみて下さい。
 この事を前提に各APIで取得される名前はどちらが優先されるのか確認します。
 Facebookではテストコンソールが用意されているのでそちらを利用します。
 ・REST API
 ・REST API FQL
 ・Graph API

2.REST API(users.getInfo、fql.query)で取得した場合

 上記のどちらも言語別表示の方が取得されています。これは、言語が日本語になっている為です。
 言語を英語にした場合は、デフォルトの方が取得されます。
 
3.Graph APIで取得した場合
 

 現状のGraph APIの仕様では、REST APIと異なりユーザの言語設定に関係なくデフォルトの名前になります。
 ただし、アクセストークンを未指定にすると言語別表示(日本語)の名前となります。
 よって、アプリ側にて強制的に言語別表示(日本語)の名前を取得した場合は、ロケールを指定します。

まとめ


・従来のREST APIで取得される名前は、自身の言語設定および閲覧ユーザの言語設定により優先する名前を判断していた。
・Graph APIで取得される名前は、言語設定に関係なくデフォルトの名前となる。
 ただし、ロケールを指定する事で開発者が意図した方の名前を取得が可能。

今回どうしてもどちらの表記の名前も取得したかったので試行錯誤した結果が以上となります。
ロケールを指定しまうと色々と問題があるので国内限定に限り以上のような事が可能なのかなと思います。