LIFF APIリファレンス

クライアントAPI

LIFF SDKのエラー

LIFF SDKのエラーはLIFFエラーオブジェクトで返されます。

LIFFエラーオブジェクト

プロパティ タイプ 説明
code String コード
message String メッセージ。定義されたメッセージが存在する場合に返されます。

エラー内容

コード メッセージ 説明
INIT_FAILED Failed to init LIFF SDK LIFF SDKのJavaScriptリソースをロードできませんでした。
INIT_FAILED Current environment is not supported. Please open it with LINE サポートされていない環境でLIFFアプリを開こうとしました。
INIT_FAILED Could not authenticate LIFF app JSON Webトークン(JWT)が無効または存在しません。LINEでLIFFを起動してください。また、JWTは必ず指定してください。
INVALID_ARGUMENT - 引数が無効です。
INTERNAL_ERROR - 内部エラーです。
THINGS_NO_LINKED_DEVICES There are no linked devices. デバイスがありません。
BLUETOOTH_CONNECT_FAILED Failed to connect to device. デバイスとの接続に失敗しました。
BLUETOOTH_ALREADY_CONNECTED The device is already connected. デバイスは接続済みです。
BLUETOOTH_CONNECTION_LOST The device has been disconnected. デバイスが接続されていません。
BLUETOOTH_UNSUPPORTED_OPERATION The operation is not supported on this characteristic. 指定したcharacteristicでは、指定した操作がサポートされていません。
BLUETOOTH_SERVICE_NOT_FOUND The service is not found in the GATT server. 指定したサービスが、GATTサーバーに存在しません。
BLUETOOTH_CHARACTERISTIC_NOT_FOUND The characteristic is not found in the service. 指定したcharacteristicが、サービスに存在しません。

エラーの例

{
  "code":"INIT_FAILED",
  "message":"Failed to init LIFF SDK"
}

liff.init()

LIFFアプリを初期化します。このメソッドを実行すると、LIFF SDKの他のメソッドを実行できるようになります。

構文

liff.init(successCallback, errorCallback)

引数

プロパティ タイプ 必須 説明
successCallback Function 必須 呼び出しの成功時にデータオブジェクトを返すコールバック
errorCallback Function 必須 呼び出しの失敗時にエラーオブジェクトを返すコールバック

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
liff.init(
  data => {
    // Now you can call LIFF API
    const userId = data.context.userId;
  },
  err => {
    // LIFF initialization failed
  }
);

戻り値

各種APIを呼び出すために必要な情報を含むデータオブジェクトを返します。

データオブジェクト
プロパティ タイプ 説明
language String LINEの言語設定
context.type String コンテキストのタイプ。LINE内でLIFFアプリが開かれた場所を示します。以下のいずれかの値が含まれます。
  • utou:1対1のチャット
  • room:トークルーム
  • group:グループ
  • none:トーク画面以外
context.viewType String LIFFアプリの画面サイズ。以下のいずれかの値が含まれます。
  • compact
  • tall
  • full
詳しくは、「LIFFアプリを追加する」を参照してください。
context.userId String ユーザーID。context.typeプロパティがnone以外の場合に含まれます。
context.utouId String 1対1チャットID。context.typeプロパティがutouの場合に含まれます。
context.roomId String トークルームID。context.typeプロパティがroomの場合に含まれます。
context.groupId String グループID。context.typeプロパティがgroupの場合に含まれます。

戻り値の例

{
  "language":"ja-JP",
  "context":{
    "userId":"U4af498...",
    "type":"group",
    "groupId":"Ca5637c...",
    "viewType":"full"
  }
}

liff.openWindow()

指定したURLをLINE内ブラウザまたは外部ブラウザで開きます。

構文

liff.openWindow(params)

引数

paramsオブジェクト
プロパティ タイプ 必須 説明
url String 必須 URL。絶対パスで指定します。
external Boolean 任意 外部ブラウザで開くかどうか。以下のどちらかの値を指定します。デフォルト値はfalseです。
  • true:URLを外部ブラウザで開きます。
  • false:LINE内のブラウザで開きます。

戻り値

なし

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
liff.openWindow({
  url:'https://example.com',
  external:true
});

liff.getAccessToken()

現在のユーザーのアクセストークンを取得します。

構文

liff.getAccessToken()

引数

なし

戻り値

現在のユーザーのアクセストークンを文字列値として返します。

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
const accessToken = liff.getAccessToken();
if(accessToken) {
  fetch('https://api...', {
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${accessToken}`
    },
    method: 'POST',
    body: 'a=1&b=2'
  })

liff.getProfile()

現在のユーザーのプロフィールを取得します。

構文

liff.getProfile()

引数

なし

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
liff.getProfile()
.then(profile => {
  const name = profile.displayName
})
.catch((err) => {
  console.log('error', err);
});

戻り値

ユーザーのプロフィール情報を含むPromiseオブジェクトを返します。

プロパティ タイプ 説明
userId String ユーザーID
displayName String 表示名
pictureUrl String 画像のURL。ユーザーが設定していない場合は返されません。
statusMessage String ステータスメッセージ。ユーザーが設定していない場合は返されません。

このメソッドは内部でaxiosを使用して、Social APIを呼び出します。エラー制御についてはaxiosのドキュメントと『Social APIリファレンス』の「ステータスコード」を参照してください。

戻り値の例

{
  "userId":"U4af4980629...",
  "displayName":"Brown",
  "pictureUrl":"https://example.com/abcdefghijklmn",
  "statusMessage":"Hello, LINE!"
}

liff.sendMessages()

ユーザーの代わりに、LIFFアプリが開かれているトーク画面にメッセージを送信します。

構文

liff.sendMessages(messages)

引数

プロパティ タイプ 必須 説明
messages Objectの配列 必須 メッセージオブジェクト
最大件数:5
Messaging APIの以下のタイプのメッセージを送信できます。

ボットのLINE公式アカウントが参加しているトークでメッセージが送信されると、LINEプラットフォームからボットサーバーにWebhookイベントが送信されます。liff.sendMessages()メソッドで画像、動画、および音声のメッセージが送信されると、結果として送信されるWebhookイベントのcontentProvider.typeプロパティの値はexternalになります。詳しくは、『Messaging APIリファレンス』の「メッセージイベント」を参照してください。

戻り値

メッセージの送信が成功した場合は、戻り値はありません。

このメソッドは内部でaxiosを使用して、LINEプラットフォームを呼び出します。エラー制御についてはaxiosのドキュメントと以下の「ステータスコード」を参照してください。

ステータスコード
ステータスコード 説明
400 メッセージが無効です。
401 認証に失敗しました。
403 アクセストークンに適切な権限がありません。

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
liff.sendMessages([
  {
    type:'text',
    text:'Hello, World!'
  }
])
.then(() => {
  console.log('message sent');
})
.catch((err) => {
  console.log('error', err);
});

liff.closeWindow()

LIFFアプリを閉じます。

構文

liff.closeWindow()

引数

なし

戻り値

なし

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
liff.closeWindow();

liff.initPlugins()

プラグインを有効化します。

たとえば、Bluetoothプラグインを有効化すると、Bluetoothプラグインが提供するクライアントAPI(liff.bluetooth.*)が使用できます。

構文

liff.initPlugins(pluginList: Array<String>): Promise<void>

引数

プロパティ タイプ 必須 説明
pluginNames Stringの配列 必須 プラグインの名前。以下のいずれかの値を指定します。
  • bluetooth

戻り値

プラグインの有効化が成功した場合は、戻り値はありません。

プラグインの有効化に失敗したときは、エラー情報を含むPromiseオブジェクトを返します。

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
liff.initPlugins(['bluetooth']).then(() => {
    liffCheckAvailablityAndDo(() => liffRequestDevice());
}).catch(error => {
    uiStatusError(makeErrorMsg(error), false);
});

liff.bluetooth.getAvailability()

Bluetoothプラグインが利用できるかどうかを確認します。このメソッドを実行すると、以下の内容が確認されます。

  • チャネルに追加したLIFFアプリのBluetoothサポートの有無

    注:チャネルに追加したLIFFアプリのBLE機能を有効にしていないと、Bluetoothプラグインは有効化できません。

  • スマートフォンのBluetooth設定

  • ユーザーがLINE Thingsの利用規約に同意していること

  • ユーザーがLINEをAndroidで使用している場合は、位置情報の取得権限

注:あらかじめliff.initPlugins()を使用して、Bluetoothプラグインを有効化してください。

構文

liff.bluetooth.getAvailability(): Promise<Boolean>

引数

なし

戻り値

Promiseオブジェクトが返されます。Promiseオブジェクトには、Bluetoothプラグインが利用できるかどうかを示すBooleanオブジェクトが含まれています。

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
liff.bluetooth.getAvailability().then(available => {
    alert('available?' + available);
});

liff.bluetooth.requestDevice()

連携済みのデバイスをスキャンし、情報を取得します。

フィルターを使って、アドバタイズメントパケットを受け入れるデバイスを制限できます。

注:あらかじめliff.initPlugins()を使用して、Bluetoothプラグインを有効化してください。

構文

liff.bluetooth.requestDevice(options?: RequestDeviceOptions): Promise<BluetoothDevice>;

引数

プロパティ タイプ 必須 説明
options Object 任意 フィルターを表すRequestDeviceOptionsオブジェクト。省略したときは、すべてのデバイスからのアドバタイズメントパケットを受け入れます。
データオブジェクト
RequestDeviceOptionsオブジェクト
プロパティ タイプ 必須 説明
filters Objectの配列 必須 LINEBluetoothRequestDeviceFilterオブジェクトの配列
LINEBluetoothRequestDeviceFilterオブジェクト
プロパティ タイプ 必須 説明
deviceId String 必須 アドバタイズメントパケットを受け入れるデバイスのデバイスID

戻り値

Promiseオブジェクトが返されます。Promiseオブジェクトには、デバイスの情報を示すBluetoothDeviceオブジェクトが含まれています。

データオブジェクト
BluetoothDeviceオブジェクト
プロパティ タイプ 必須 説明
id String 必須 デバイスID
name String 任意 デバイス名
gatt Object 任意 BluetoothRemoteGATTServerオブジェクト
watchingAdvertisements Boolean 必須 アドバタイズメントパケットの監視状況(※)
メソッド 戻り値 説明
watchAdvertisements Promise<void> アドバタイズメントパケットの受け入れを開始します。(※)
unwatchAdvertisements void アドバタイズメントパケットの受け入れを停止します。(※)
addEventListener void イベントリスナーを登録します。advertisementreceivedイベント(※)とgattserverdisconnectedイベントに、イベントリスナーを登録できます。
removeEventListener void 登録済みのイベントリスナーを削除します。advertisementreceivedイベント(※)とgattserverdisconnectedイベントに登録したイベントリスナーを削除できます。

※試験的に実装している機能です。これらの機能は予告なく変更、または停止される可能性があります。

BluetoothRemoteGATTServerオブジェクト

デバイスと通信するには、GATTサーバー(汎用アトリビュートプロファイルサーバー)を表すBluetoothRemoteGATTServerオブジェクトを使用します。

liff.bluetooth.requestDevice()実行後、Promiseが解決(resolve)すると、BluetoothDeviceオブジェクトのgattプロパティから、BluetoothRemoteGATTServerにアクセスできます。

プロパティ タイプ 必須 説明
device Object 必須 BluetoothDeviceオブジェクト
connected Boolean 必須 接続している場合はtrue。接続していない場合はfalse
メソッド 戻り値 説明
connect Promise<BluetoothRemoteGATTService> デバイスと接続します。
disconnect void デバイスのGATTサーバーから切断します。
getPrimaryService(serviceUUID: string) Promise<BluetoothRemoteGATTService> GATTサーバーのプライマリサービスを取得します。serviceUUIDには、128ビットのUUIDを指定します。
注:このメソッドはUUIDを検証しません。UUIDの検証は、characteristicの読み込み、書き込み、通知の開始、通知の停止を実行する際に行われます。
BluetoothRemoteGATTServiceオブジェクト

BluetoothRemoteGATTServiceオブジェクトは、characteristicを取得するためのオブジェクトです。

プロパティ タイプ 必須 説明
device Object 必須 BluetoothDeviceオブジェクト
uuid String 必須 GATT Service UUID
メソッド 戻り値 説明
getCharacteristic(characteristicUUID: string) Promise<BluetoothRemoteGATTCharacteristic> characteristicを取得します。characteristicUUIDには、128ビットのUUIDを指定します。
注:このメソッドはUUIDを検証しません。UUIDの検証は、characteristicの読み込み、書き込み、通知の開始、通知の停止を実行する際に行われます。

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
// アドバタイズメントパケットを受信するデバイスをフィルターしない場合
liff.bluetooth.requestDevice().then(device => {
    const listener = (e) => {
      device.removeEventListener('advertisementreceived', listener);
    };
    device.addEventListener('advertisementreceived', listener);

    device.watchAdvertisements();
}).catch(e => {
    console.log(e.code + ':' + e.message);
});

// アドバタイズメントパケットを受信するデバイスをフィルターする場合
liff.bluetooth.requestDevice({
        filters: [
            {
                deviceId: 't99137fe055dd4980b40f6ac526da7b0b' // ID of desired bluetooth device (BluetoothDevice.id)
            }
        ]
    }).then(device => {
    const listener = (e) => {
      device.removeEventListener('advertisementreceived', listener);
    };
    device.addEventListener('advertisementreceived', listener);

    device.watchAdvertisements();
}).catch(e => {
    console.log(e.code + ':' + e.message);
});
BluetoothRemoteGATTCharacteristicオブジェクト

BluetoothRemoteGATTCharacteristicオブジェクトは、デバイスのcharacteristicの読み込み、書き込み、通知の開始、通知の停止を実行するためのオブジェクトです。

プロパティ タイプ 必須 説明
service Object 任意 BluetoothRemoteGATTServiceオブジェクト
uuid String 必須 UUID
value Object 任意 DataViewオブジェクト
メソッド 戻り値 説明
readValue Promise<DataView> characteristicの値を読み取ります。
writeValue(value: BufferSource) Promise<void> characteristicに値を書き込みます。
startNotifications Promise<BluetoothRemoteGATTCharacteristic> characteristic変更の通知を開始します。
stopNotifications Promise<BluetoothRemoteGATTCharacteristic> characteristic変更の通知を停止します。
addEventListener void イベントリスナーを登録します。targetプロパティを含むcharacteristicvaluechangedイベントに、イベントリスナーを登録できます。
removeEventListener void 登録済みのイベントリスナーを削除します。characteristicvaluechangedイベントに登録したイベントリスナーを削除できます。

注:readValue()メソッド、writeValue()メソッド、startNotifications()メソッド、stopNotifications()メソッドは、UUIDとプロパティを検証します。存在しないUUIDやプロパティを指定した場合は、エラーが発生します。

イベント

advertisementreceivedイベント

アドバタイズメントパケットを受信すると、advertisementreceivedイベントが発生します。

注:advertisementreceivedイベントは、試験的に実装している機能です。この機能は予告なく変更、または停止される可能性があります。

プロパティ タイプ 必須 説明
device Object 必須 BluetoothDeviceオブジェクト
name String 任意 デバイス名
rssi Number 任意 RSSI
manufacturerData Object 任意 Map<Number, DataView>オブジェクト。会社識別コード(Company Identifier Code)をDataViewオブジェクトにマップしたデータです。

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
// LIFFアプリからcharacteristicの値を読み込み、書き込みする例
device.gatt
    .connect()
    .then(async () => {
        const service = await device.gatt.getPrimaryService(
            '01234567-0123-0123-0123-012345678901'
        );
        const characteristic = await service.getCharacteristic(
            '01234567-0123-0123-0123-012345678902'
        );
        const value = await characteristic.readValue();

        // suppose we know it is a string, we can decode it
        // here we use TextDecoder for simplicity, you should add a polyfill for compatibility
        const stringValue = new TextDecoder().decode(value);

        // to write string 'liff' into the characteristic
        // here we use TextEncoder for simplicity, you should add a polyfill for compatibility
        await characteristic.writeValue(new TextEncoder().encode('liff'));
    })
    .catch(e => {
        console.log(e.code + ':' + e.message);
    });

// デバイスからcharacteristicの値の変更を通知させる例
device.gatt.connect().then(async () => {
    const service = await device.gatt.getPrimaryService('01234567-0123-0123-0123-012345678901');
    const characteristic = await service.getCharacteristic('01234567-0123-0123-0123-012345678903');
    characteristic.addEventListener('characteristicvaluechanged', (e) => {
        // suppose we know it is a 16-bit integer value
        console.log('value changed to:' + e.target.value.getInt16();
    });

    await characteristic.startNotifications();
}).catch(e => {
    console.log(e.code + ':' + e.message);
});
gattserverdisconnectedイベント

さまざまな理由でBluetooth接続が切断されると、gattserverdisconnectedイベントが発生します。必ずイベントリスナーを登録してください。

characteristicvaluechangedイベント

characteristicが変更されると、characteristicvaluechangedイベントが発生します。

リクエストの例

// No sample code available
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
// gattserverdisconnectedイベントのイベントリスナーを登録する例
liff.bluetooth
    .requestDevice()
    .then(device => {
        device.addEventListener('gattserverdisconnected', () => {
            console.log('device gatt is disconnected');
        });

        window.gatt.connect();
    })
    .catch(e => {
        console.log(e.code + ':' + e.message);
    });

サーバーAPI

LIFFアプリを追加する

LIFFにアプリを追加します。1つのチャネルで最大30件のLIFFアプリを追加できます。

HTTPリクエスト

POST https://api.line.me/liff/v1/apps

リクエストヘッダー

リクエストヘッダー 説明
Authorization Bearer {channel access token}
Content-Type application/json

リクエストボディ

プロパティ タイプ 必須 説明
view.type String 必須 LIFFアプリの画面サイズ。以下のいずれかの値を指定します。
  • compact:デバイスの画面の高さの50%。
  • tall:デバイスの画面の高さの80%。
  • full:デバイスの画面の高さの100%。
view.url String 必須 LIFFアプリをデプロイしたサーバーのURL。URLスキームはhttpsである必要があります。
description String 任意 LIFFアプリの名前
features.ble Boolean 任意 LINE ThingsのためにBluetooth® Low Energyに対応させる場合はtrue。対応させない場合はfalse

リクエストの例

curl -X POST https://api.line.me/liff/v1/apps \
-H "Authorization: Bearer {channel access token}" \
-H "Content-Type: application/json" \
-d '{
  "view":{
    "type":"full",
    "url":"https://example.com/myservice"
  },
  "description": "Service Example",
  "features": {
    "ble": true
  }
}'
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
// No sample code available

レスポンス

ステータスコード200と以下のプロパティを含むJSONオブジェクトを返します。

プロパティ タイプ 説明
liffId String LIFFアプリID

エラーレスポンス

以下のいずれかのステータスコードを返します。

ステータスコード 説明
400 以下のどちらかです。
  • リクエストに無効な値が含まれています。
  • チャネルに追加できるLIFFアプリ数の上限に達しています。
401 認証に失敗しました。

レスポンスの例

{
  "liffId":"{liffId}"
}

LIFFアプリを更新する

LIFFアプリの設定を、部分的に更新します。

HTTPリクエスト

PUT https://api.line.me/liff/v1/apps/{liffId}

リクエストヘッダー

リクエストヘッダー 説明
Authorization Bearer {channel access token}
Content-Type application/json

パスパラメータ

パラメータ 説明
liffId 更新するLIFFアプリのID

リクエストボディ

プロパティ タイプ 必須 説明
view.type String 任意 LIFFアプリの画面サイズ。以下のいずれかの値を指定します。
  • compact:デバイスの画面の高さの50%。
  • tall:デバイスの画面の高さの80%。
  • full:デバイスの画面の高さの100%。
view.url String 任意 LIFFアプリのURL。URLスキームはhttpsである必要があります。
description String 任意 LIFFアプリの名前
features.ble Boolean 任意 LINE ThingsのためにBluetooth® Low Energyに対応させる場合はtrue。対応させない場合はfalse

注:リクエストボディに指定しなかったプロパティは変更されません。

レスポンス

ステータスコード200を返します。

エラーレスポンス

以下のいずれかのステータスコードを返します。

ステータスコード 説明
401 認証に失敗しました。
404 以下のどちらかです。
  • 指定したLIFFアプリは存在しません。
  • 指定したLIFFアプリは別のチャネルに属しています。

リクエストの例

curl -X PUT https://api.line.me/liff/v1/apps/{liffId} \
-H "Authorization: Bearer {channel access token}" \
-H "Content-Type: application/json" \
-d '{
  "view": {
    "url":"https://new.example.com"
  }
}'
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
// No sample code available

すべてのLIFFアプリを取得する

チャネルに登録されているすべてのLIFFアプリの情報を取得します。

HTTPリクエスト

GET https://api.line.me/liff/v1/apps

リクエストヘッダー

リクエストヘッダー 説明
Authorization Bearer {channel access token}

リクエストの例

curl -X GET https://api.line.me/liff/v1/apps \
-H "Authorization: Bearer {channel access token}"
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
// No sample code available

レスポンス

ステータスコード200と以下のプロパティを含むJSONオブジェクトを返します。

プロパティ タイプ 説明
apps Objectの配列 LIFFアプリオブジェクトの配列
LIFFアプリオブジェクト
プロパティ タイプ 説明
liffId String LIFFアプリID
view.type String LIFFアプリの画面サイズ。以下のいずれかの値が含まれます。
  • compact:デバイスの画面の高さの50%。
  • tall:デバイスの画面の高さの80%。
  • full:デバイスの画面の高さの100%。
view.url String LIFFアプリのURL
description String LIFFアプリの名前
features.ble Boolean LINE ThingsのためにBluetooth® Low Energyに対応している場合はtrue。対応しない場合はfalse

エラーレスポンス

以下のいずれかのステータスコードを返します。

ステータスコード 説明
401 認証に失敗しました。
404 チャネルにLIFFアプリがありません。

レスポンスの例

{
  "apps":[
    {
      "liffId":"{liffId}",
      "view":{
        "type":"full",
        "url":"https://example.com/myservice"
      },
      "description": "Happy New York"
    },
    {
      "liffId":"{liffId}",
      "view":{
        "type":"tall",
        "url":"https://example.com/myservice2"
      },
      "features": {
        "ble": true
      }
    }
  ]
}

LIFFアプリを削除する

LIFFアプリを削除します。

HTTPリクエスト

DELETE https://api.line.me/liff/v1/apps/{liffId}

リクエストヘッダー

リクエストヘッダー 説明
Authorization Bearer {channel access token}

パスパラメータ

パラメータ 説明
liffId 削除するLIFFアプリのID

レスポンス

ステータスコード200を返します。

エラーレスポンス

以下のいずれかのステータスコードを返します。

ステータスコード 説明
401 認証に失敗しました。
404 以下のどちらかです。
  • 指定したLIFFアプリは存在しません。
  • 指定したLIFFアプリは別のチャネルに属しています。

リクエストの例

curl -X DELETE https://api.line.me/liff/v1/apps/{liffId} \
-H "Authorization: Bearer {channel access token}"
// No sample code available
# No sample code available
// No sample code available
// No sample code available
# No sample code available
# No sample code available
// No sample code available

{{ $t("form.question.helpful") }}

{{ $t("form.question.detail") }}

{{ $t("form.question.improve") }}

{{ $t("form.info.start") }}{{ $t("form.info.link") }}{{ $t("form.info.end") }}


{{ $t("form.result.success") }}
{{ $t("form.result.error") }}
{{ $t("form.result.errorLink") }}