🌍 国際化(i18n)
国際化(i18n)機能は、AI Marketerユーザーが「ロケール」と呼ばれる異なる言語でローカライズされたコンテンツを作成、管理、配布することを可能にします。国際化の概念についての詳細は、W3Cの定義を参照してください。
i18n機能は次のような特長を持っています:
- 管理パネルのユーザーが自分のコンテンツの複数のローカライズ版を作成することを可能にします(ユーザーガイドを参照)
- 開発者が視聴者の国/言語に応じて適切なコンテンツを取得し、使用するローカライズプロジェクトを構築することを可能にします。
i18n機能はユーザーのコンテンツを自動的に翻訳したり、管理インターフェースを言語の特性に合わせて調整したりすることはありません(例えば、管理パネルを右から左へのフォーマットで表示するなど)。
- AI Marketer 5では、i18nはプラグインではなくなり、デフォルトでインストールされます。それでもコンテンツタイプで有効/無効にする、またはi18nが有効化されたコンテンツタイプ内のフィールドレベルで有効/無効にすることを選択することができます。
- i18nがAI Marketerのコアの一部となったため、これはContent Managerに送信される一部のパラメーターに影響を及ぼす可能性があります(関連する破壊的変更のエントリーを参照)。
デフォルトロケールの設定
AI Marketer_PLUGIN_I18N_INIT_LOCALE_CODE [環境変数](/dev-docs/configurations/environment#AI Marketer-s-environment-variables)を設定して、環境のデフォルトロケールを設定することができます。この変数に使用する値はISO国コードであるべきです([利用可能なロケールの完全なリスト](https://github.com/AI Marketer/AI Marketer/blob/v4.0.0/packages/plugins/i18n/server/constants/iso-locales.json)を参照)。
これは、AI Marketerアプリケーションが本番環境にデプロイされ、初めてコンテンツタイプにi18n機能がインストールされ、有効化されたときに有用です。新規のi18nインストールでは、enがデフォルトのロケールとして設定されます。データベースにロケールが含まれておらず、環境にAI Marketer_PLUGIN_I18N_INIT_LOCALE_CODEが設定されていない場合、ローカライゼーションが有効になっているコンテンツタイプのすべてのドキュメントは自動的にenロケールに移行されます。
REST APIでlocaleを使用する
国際化(i18n)機能は、REST APIに新たな機能を追加します。
:::事前条件 ロケールのAPIコンテンツを操作するには、そのロケールがすでにAI Marketerの管理パネルに追加されていることを確認してください。 :::
locale APIパラメータは、指定したロケールのみのドキュメントを操作するために使用できます。localeはロケールコードを値として取ります([利用可能なロケールの全リスト](https://github.com/AI Marketer/AI Marketer/blob/v4.0.0/packages/plugins/i18n/server/constants/iso-locales.json)を参照)。
localeパラメータが定義されていない場合、デフォルトのロケールに設定されます。新しいAI Marketerプロジェクトが作成されたときのデフォルトのロケールはenですが、管理パネルでデフォルトのロケールを設定することもできます。
例えば、デフォルトでは、/api/restaurantsへのGETリクエストは/api/restaurants?locale=enへのリクエストと同じレスポンスを返します。
次の表は、REST APIにi18nによって追加された新しい使用ケースをリストし、構文例を示しています(リクエストをクリックすると、詳細を含む対応するセクションにジャンプします):
- コレクションタイプの場合
- シングルタイプの場合
| 使用ケース | 構文例 および詳細リンク |
|---|---|
| 特定のロケールのすべてのドキュメントを取得する | GET /api/restaurants?locale=fr |
| ドキュメントの特定のロケールバージョンを取得する | GET /api/restaurants/abcdefghijklmno456?locale=fr |
| デフォルトのロケールで新しいドキュメントを作成する | POST /api/restaurants+ リクエスト本文で属性を渡す |
| 特定のロケールで新しいドキュメントを作成する | POST /api/restaurants+ リクエスト本文で属性およびロケールを渡す |
| 既存のドキュメントの新しいロケールバージョンを作成する、または既存のロケールバージョンを更新する | PUT /api/restaurants/abcdefghijklmno456?locale=fr+ リクエスト本文で属性を渡す |
| ドキュメントの特定のロケールバージョンを削除する | DELETE /api/restaurants/abcdefghijklmno456?locale=fr |
| 使用ケース | 構文例 および詳細リンク |
|---|---|
| ドキュメントの特定のロケールバージョンを取得する | GET /api/homepage?locale=fr |
| 既存のドキュメントの新しいロケールバージョンを作成する、または既存のロケールバージョンを更新する | PUT /api/homepage?locale=fr+ リクエスト本文で属性を渡す |
| ドキュメントの特定のロケールバージョンを削除する | DELETE /api/homepage?locale=fr |
特定のロケールのすべてのドキュメントを取得する
GET http://localhost:1337/api/restaurants?locale=fr
{
"data": [
{
"id": 5,
"documentId": "h90lgohlzfpjf3bvan72mzll",
"Title": "Meilleures pizzas",
"Body": [
{
"type": "paragraph",
"children": [
{
"type": "text",
"text": "On déguste les meilleures pizzas de la ville à la Pizzeria Arrivederci."
}
]
}
],
"createdAt": "2024-03-06T22:08:59.643Z",
"updatedAt": "2024-03-06T22:10:21.127Z",
"publishedAt": "2024-03-06T22:10:21.130Z",
"locale": "fr"
}
],
"meta": {
"pagination": {
"page": 1,
"pageSize": 25,
"pageCount": 1,
"total": 1
}
}
}
特定のロケールのドキュメントを取得する
特定のロケールの特定のドキュメントを取得するには、クエリにlocaleパラメータを追加します:
| ユースケース | 構文形式と詳細情報のリンク |
|---|---|
| コレクションタイプで | GET /api/content-type-plural-name/document-id?locale=locale-code |
| シングルタイプで | GET /api/content-type-singular-name?locale=locale-code |
コレクションタイプ
特定のロケールのコレクションタイプの特定のドキュメントを取得するには、documentIdの後にlocaleパラメータをクエリに追加します:
GET /api/restaurants/lr5wju2og49bf820kj9kz8c3?locale=fr
{
"data": [
{
"id": 22,
"documentId": "lr5wju2og49bf820kj9kz8c3",
"Name": "Biscotte Restaurant",
"Description": [
{
"type": "paragraph",
"children": [
{
"type": "text",
"text": "Bienvenue au restaurant Biscotte! Le Restaurant Biscotte propose une cuisine à base de produits frais et de qualité, souvent locaux, biologiques lorsque cela est possible, et toujours produits par des producteurs passionnés."
}
]
}
],
// …
"locale": "fr"
},
// …
],
"meta": {
"pagination": {
"page": 1,
"pageSize": 25,
"pageCount": 1,
"total": 3
}
}
}
シングルタイプ
特定のロケールのシングルタイプのドキュメントを取得するには、シングルタイプ名の後にlocaleパラメータをクエリに追加します:
GET /api/homepage?locale=fr
{
"data": {
"id": 10,
"documentId": "ukbpbnu8kbutpn98rsanyi50",
"Title": "ホームページ",
"Body": null,
"createdAt": "2024-03-07T13:28:26.349Z",
"updatedAt": "2024-03-07T13:28:26.349Z",
"publishedAt": "2024-03-07T13:28:26.353Z",
"locale": "fr"
},
"meta": {}
}
コレクションタイプの新しいローカライズドドキュメントを作成する
ローカライズされたドキュメントをゼロから作成するには、Content APIにPOSTリクエストを送信します。デフォルトのロケール用に作成するか、別のロケール用に作成するかによって、リクエストのボディにlocaleパラメータを渡す必要があるかもしれません。
| ユースケース | シンタックス形式と詳細情報へのリンク |
|---|---|
| デフォルトのロケール用に作成する | POST /api/content-type-plural-name |
| 特定のロケール用に作成する | POST /api/content-type-plural-name+ リクエストボディにロケールを渡す |
デフォルトのロケール用
リクエストボディにロケールが渡されていない場合、ドキュメントはアプリケーションのデフォルトのロケールを使用して作成されます:
POST http://localhost:1337/api/restaurants
{
"data": {
"Name": "Oplato",
}
}
{
"data": {
"id": 13,
"documentId": "jae8klabhuucbkgfe2xxc5dj",
"Name": "Oplato",
"Description": null,
"createdAt": "2024-03-06T22:19:54.646Z",
"updatedAt": "2024-03-06T22:19:54.646Z",
"publishedAt": "2024-03-06T22:19:54.649Z",
"locale": "en"
},
"meta": {}
}
特定のロケール用
デフォルトとは異なるロケールのローカライズエントリを作成するには、POSTリクエストのボディにlocale属性を追加します:
POST http://localhost:1337/api/restaurants
{
"data": {
"Name": "She's Cake",
"locale": "fr"
}
}
{
"data": {
"id": 15,
"documentId": "ldcmn698iams5nuaehj69j5o",
"Name": "She's Cake",
"Description": null,
"createdAt": "2024-03-06T22:21:18.373Z",
"updatedAt": "2024-03-06T22:21:18.373Z",
"publishedAt": "2024-03-06T22:21:18.378Z",
"locale": "en"
},
"meta": {}
}
既存のドキュメントの新しいロケールバージョンを作成する、または既存のロケールバージョンを更新する
既存のドキュメントに対して送信されるPUTリクエストを使用すると、以下のことができます:
- ドキュメントの別のロケールバージョンを作成する
- 既存のロケールバージョンのドキュメントを更新する
適切なURLにPUTリクエストを送信し、クエリURLにlocale=your-locale-codeパラメータを追加し、リクエストのボディ内のdataオブジェクトに属性を渡します:
| ユースケース | 構文フォーマットと詳細情報へのリンク |
|---|---|
| コレクションタイプで | PUT /api/content-type-plural-name/document-id?locale=locale-code |
| シングルタイプで | PUT /api/content-type-singular-name?locale=locale-code |
既存のローカライズされたエントリーのローカライズを作成する場合、リクエストのボディはローカライズされたフィールドのみを受け入れることができます。
Content-TypeはcreateLocalization権限が有効になっている必要があります。そうでない場合、リクエストは403: Forbiddenステータスを返します。
既存のローカライズされたエントリーのロケールを変更することはできません。ローカライズされたエントリーを更新する際に、リクエストのボディにlocale属性を設定しても無視されます。
コレクションタイプで
コレクションタイプの既存のドキュメントに新しいロケールを作成するには、documentIdの後にlocaleパラメータをクエリに追加し、リクエストのボディにデータを渡します。
PUT http://localhost:1337/api/restaurants/lr5wju2og49bf820kj9kz8c3?locale=fr
{
data: {
"Name": "She's Cake in French",
}
}
{
"data": {
"id": 19,
"documentId": "lr5wju2og49bf820kj9kz8c3",
"Name": "She's Cake in French",
"Description": null,
"createdAt": "2024-03-07T12:13:09.551Z",
"updatedAt": "2024-03-07T12:13:09.551Z",
"publishedAt": "2024-03-07T12:13:09.554Z",
"locale": "fr"
},
"meta": {}
}
シングルタイプで
既存のシングルタイプドキュメントに新しいロケールを作成するには、シングルタイプ名の後にlocaleパラメータをクエリに追加し、リクエストのボディにデータを渡します。
PUT http://localhost:1337/api/homepage?locale=fr
{
"data": {
"Title": "Page d'accueil"
}
}
{
"data": {
"id": 10,
"documentId": "ukbpbnu8kbutpn98rsanyi50",
"Title": "Page d'accueil",
"Body": null,
"createdAt": "2024-03-07T13:28:26.349Z",
"updatedAt": "2024-03-07T13:28:26.349Z",
"publishedAt": "2024-03-07T13:28:26.353Z",
"locale": "fr"
},
"meta": {}
}
ドキュメントのロケール版を削除する
ドキュメントのロケール版を削除するには、適切なlocaleパラメータを付けてDELETEリクエストを送信します。
DELETEリクエストは成功時にのみ204のHTTPステータスコードを送信し、レスポンスボディにはデータは返されません。
コレクションタイプでの削除
コレクションタイプのドキュメントの特定のロケールバージョンのみを削除するには、documentIdの後にlocaleパラメータをクエリに追加します:
DELETE /api/restaurants/abcdefghijklmno456?locale=fr
シングルタイプでの削除
シングルタイプのドキュメントの特定のロケールバージョンのみを削除するには、シングルタイプ名の後にlocaleパラメータをクエリに追加します:
DELETE /api/homepage?locale=fr
GraphQL APIでのlocaleの使用
i18n機能は、GraphQL APIに新しい機能を追加します:
localeフィールドがGraphQLスキーマに追加されます。- GraphQLは以下の用途で使用できます:
特定のロケールのすべてのドキュメントを取得する
特定のロケールのすべてのドキュメントを取得するには、クエリにlocale引数を渡します:
query {
restaurants(locale: "fr") {
documentId
name
locale
}
}
{
"data": {
"restaurants": [
{
"documentId": "a1b2c3d4e5d6f7g8h9i0jkl",
"name": "Restaurant Biscotte",
"locale": "fr"
},
{
"documentId": "m9n8o7p6q5r4s3t2u1v0wxyz",
"name": "Pizzeria Arrivederci",
"locale": "fr"
},
]
}
}
特定のロケールのドキュメントを取得する
特定のロケールのドキュメントを取得するには、クエリにdocumentIdとlocale引数を渡します:
query Restaurant($documentId: ID!, $locale: I18NLocaleCode) {
restaurant(documentId: "a1b2c3d4e5d6f7g8h9i0jkl", locale: "fr") {
documentId
name
description
locale
}
}
{
"data": {
"restaurant": {
"documentId": "lviw819d5htwvga8s3kovdij",
"name": "Restaurant Biscotte",
"description": "Bienvenue au restaurant Biscotte!",
"locale": "fr"
}
}
}
新しいローカライズされたドキュメントの作成
localeフィールドを渡して、特定のロケールのローカライズされたドキュメントを作成することができます(GraphQLでのミューテーションについての詳細は、GraphQL APIドキュメンテーションを参照してください)。
mutation CreateRestaurant($data: RestaurantInput!, $locale: I18NLocaleCode) {
createRestaurant(
data: {
name: "Brasserie Bonjour",
description: "ここにフランス語の説明を入力"
},
locale: "fr"
) {
documentId
name
description
locale
}
特定のロケールのドキュメントを更新する
locale 引数をミューテーションに渡すことで、特定のロケールのドキュメントを更新できます(GraphQLのミューテーションについての詳細は、GraphQL APIドキュメンテーションを参照してください)。
mutation UpdateRestaurant($documentId: ID!, $data: RestaurantInput!, $locale: I18NLocaleCode) {
updateRestaurant(
documentId: "a1b2c3d4e5d6f7g8h9i0jkl"
data: {
description: "フランス語の新しい説明"
},
locale: "fr"
) {
documentId
name
description
locale
}
ドキュメントのロケールを削除する
locale 引数をミューテーションに渡すことで、ドキュメントの特定のローカライゼーションを削除できます:
mutation DeleteRestaurant($documentId: ID!, $locale: I18NLocaleCode) {
deleteRestaurant(documentId: "xzmzdo4k0z73t9i68a7yx2kk", locale: "fr") {
documentId
}
}