メッセージをローカライズする

このドキュメントでは、FCM ローカライズ フィールド(*_loc_key*_loc_args)を使用して、Android と iOS でユーザーの言語設定に自動的に適応する通知を配信する方法について説明します。これにより、サーバーは言語に依存しない単一のペイロードを送信し、翻訳をクライアント デバイスに委任できます。

FCM ローカライズの概要

アプリをローカライズするには、ユーザーのアプリ内の文字列リソース エントリに対応するキーを送信します。デバイスのオペレーティング システム(OS)は、動的引数の検索と挿入を処理します。

FCM フィールド 説明 クライアントのアクション
title_loc_key クライアント アプリの文字列リソース内のタイトル文字列のキー。 OS は、アプリのローカライズされたファイルで対応する文字列を見つけます。
body_loc_key クライアント アプリの文字列リソース内の本文文字列のキー。 OS は、アプリのローカライズされたファイルで対応する文字列を見つけます。
title_loc_args title_loc_key 文字列に代入される動的文字列値の配列。 OS は、これらの引数をローカライズされた文字列の形式指定子に挿入します。
body_loc_args body_loc_key 文字列に代入される動的文字列値の配列。 OS は、これらの引数をローカライズされた文字列の形式指定子に挿入します。

ステップ 1: アプリでローカライズされた文字列リソースを定義する

FCM のローカライズを開始するには、Android プロジェクトと iOS プロジェクトで必要な翻訳が利用可能であることを確認することが重要です。

Android の設定

文字列リソースを定義する: res/values/strings.xml にデフォルト言語の文字列を入力します。*_loc_args で渡す予定の動的な値には、形式指定子(%1$s%2$d など)を使用します。

デフォルト(res/values/strings.xml):

<resources>
    <string name="welcome_title">Welcome, %1$s!</string>
    <string name="new_message_body">You have %1$d new message(s) from %2$s.</string>
</resources>

翻訳を追加する: ISO 言語コード(例: values-fr(フランス語の場合)、values-es(スペイン語の場合)に設定し、キーを変換します。

フランス語(res/values-fr/strings.xml):

<resources>
    <string name="welcome_title">Bienvenue, %1$s!</string>
    <string name="new_message_body">Vous avez %1$d nouveau(x) message(s) de %2$s.</string>
</resources>

詳細については、次のドキュメントをご覧ください。

iOS の設定

文字列リソースを定義する: Localizable.strings ファイル(通常は Base.lproj フォルダまたは文字列カタログ)で基本文字列を定義します。動的な値には形式指定子(%@%ld など)を使用します。慣例として、キーは大文字で定義されることがよくあります。

デフォルト(英語 Localizable.strings):

"WELCOME_TITLE" = "Welcome, %@!";
"NEW_MESSAGE_BODY" = "You have %ld new message(s) from %@.";

翻訳を追加する: 言語固有の .lproj フォルダを作成(または String Catalog を使用してローカライズを追加)し、キーを翻訳します。

フランス語(fr.lproj/Localizable.strings):

"WELCOME_TITLE" = "Bienvenue, %@!";
"NEW_MESSAGE_BODY" = "Vous avez %ld nouveau(x) message(s) de %@.";

詳細については、次のドキュメントをご覧ください。

ステップ 2: FCM メッセージ ペイロードを構築する

FCM HTTP v1 API を使用して通知を送信する場合、サーバーはリソースキー(*_loc_key)と動的データ(*_loc_args)を文字列の配列として使用する単一のペイロードを構築します。

FCM HTTP v1 ペイロードの例

ローカライズ キーは、プラットフォーム固有のオーバーライド ブロック(android.notificationapns.payload.aps.alert)内に配置されます。

{
  "message": {
    "token": "DEVICE_REGISTRATION_TOKEN",

    "android": {
      "notification": {
        // Android keys match strings.xml resource names
        "title_loc_key": "welcome_title",
        "title_loc_args": ["Alice"],
        "body_loc_key": "new_message_body",
        "body_loc_args": ["3", "Bob"]
      }
    },

    "apns": {
      "payload": {
        "aps": {
          "alert": {
            // iOS uses 'title-loc-key' and 'loc-key' (for the body)
            "title-loc-key": "WELCOME_TITLE",
            "title-loc-args": ["Alice"],
            "loc-key": "NEW_MESSAGE_BODY",
            "loc-args": ["3", "Bob"]
          }
        }
      }
    }
  }
}

ペイロード引数に関する主な考慮事項

  • 順序が重要: *_loc_args 内の文字列は、文字列リソース ファイル内のプレースホルダで必要な順序と完全に一致している必要があります(例: %1$s%2$s)。

  • 文字列のみ: *_loc_args 配列内のすべての要素は、数値(例の "3" など)を表す場合でも、文字列である必要があります。クライアント OS の文字列フォーマッタは、フォーマット指定子(%ld または %1$d)に基づいて最終的な型変換を処理します。

ステップ 3: クライアントの処理と表示

デバイスが通知を受信すると、次の手順が自動的に行われます。

  1. 言語チェック: デバイスはユーザーのプライマリ ロケール(例:ドイツ語、イタリア語)。

  2. キーのルックアップ: OS は *_loc_key 値(welcome_title)を使用して、デバイスの言語 / 地域に対応する翻訳された文字列をアプリのリソース ファイルで検索します。

  3. 引数の挿入: OS は *_loc_args["Alice"])から配列を取得し、ロケールの書式設定ルール(句読点、単語の順序など)に従って、値をローカライズされた文字列に挿入します。

デバイスの言語 / 地域 title_loc_key: welcome_title title_loc_args: ["Alice"] 最終的なタイトルの表示
英語 "Welcome, %1$s!" Alice "Welcome, Alice!"
フランス語 "Bienvenue, %1$s!" Alice "Bienvenue, Alice!"
ドイツ語 "Willkommen, %1$s!" Alice "Willkommen, Alice!"

このプロセスにより、サーバーからの標準化されたペイロードを維持しながら、すべてのユーザーが言語設定に合わせたメッセージを正しい言語構造で受け取ることができます。

例: ローカライズ オプションを使用した通知メッセージ

次の送信リクエストの例は、クライアントがローカライズされたメッセージを表示できるように、ローカライズ オプションを含めて Tech トピックに通知を送信します。ユーザーのデバイスでの視覚効果の例を次に示します。

英語とスペイン語でテキストを表示する 2 台のデバイスのシンプルな図

Node.js

var topicName = 'industry-tech';

var message = {
  android: {
    ttl: 3600000,
    notification: {
      bodyLocKey: 'STOCK_NOTIFICATION_BODY',
      bodyLocArgs: ['FooCorp', '11.80', '835.67', '1.43']
    }
  },
  apns: {
    payload: {
      aps: {
        alert: {
          locKey: 'STOCK_NOTIFICATION_BODY',
          locArgs: ['FooCorp', '11.80', '835.67', '1.43']
        }
      }
    }
  },
  topic: topicName,
};

getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

REST

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message": {
    "topic":"Tech",
    "android": {
      "ttl":"3600s",
      "notification": {
        "body_loc_key": "STOCK_NOTIFICATION_BODY",
        "body_loc_args": ["FooCorp", "11.80", "835.67", "1.43"]
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "alert": {
            "loc-key": "STOCK_NOTIFICATION_BODY",
            "loc-args": ["FooCorp", "11.80", "835.67", "1.43"]
          }
        }
      }
    }
  }
}'

メッセージ本文のプラットフォーム固有のブロックで使用できるキーの詳細については、HTTP v1 のリファレンス ドキュメントAndroidNotificationApnsConfig をご覧ください。APNS でサポートされているキーについては、Apple の Payload Key Reference をご覧ください。