Ibexa DXP の多言語対応について

## 言語バージョン
Ibexa DXP は、コンテンツアイテムの複数の言語バージョン（翻訳）を作成する機能を提供します。翻訳はアイテムのバージョンごとに作成されるため、コンテンツのバージョンごとに異なる翻訳のセットを使用できます。

バージョンには常に少なくとも1つの翻訳があり、デフォルトでは初期/メイン翻訳です。さらにバージョンを追加できますが、以前に[グローバル翻訳リストに追加された言語](https://doc.ibexa.co/en/latest/multisite/languages/languages/#adding-available-languages)、つまりシステムで使用可能なすべての言語のリストに限ります。システム内の言語の最大数は62です。

同じコンテンツアイテムの異なる翻訳を個別に編集できます。これは、さまざまなユーザーが同時にさまざまな言語への翻訳に取り組むことができることを意味します。

ドラフトを含む各バージョンには、既存のすべての翻訳が含まれています。ただし、ドラフトの作業に時間がかかり、その間に他の翻訳が更新された場合でも、ドラフトを公開しても、後の変更が上書きされることはありません。

### 利用可能な言語の追加
多言語システムは、インストールで使用可能なすべての言語を含むグローバル翻訳リストに基づいて動作します。このリストには、管理画面の[「管理」パネルから言語を追加](https://doc.ibexa.co/projects/userguide/en/latest/translating_content/)できます。言語を追加した後は、必ずすべてのアセットをファイルシステムにダンプしてください。

```bash
yarn encore <environment>
# OR php bin/console ibexa:encore:compile
```

**次に、新しい言語を[サイトアクセス](https://doc.ibexa.co/en/latest/multisite/multisite/)設定に追加する必要があります。** これが完了すると、適切な権限を持つすべてのユーザーが、ユーザーインターフェイスでこれらの言語のコンテンツアイテムバージョンを作成できます。

### 翻訳可能および翻訳不可能なフィールド
言語バージョンは、コンテンツアイテムのフィールドの翻訳された値で構成されます。コンテンツタイプ定義では、すべてのフィールドが翻訳可能かどうかに設定されています。

Ibexa DXPは、どのフィールドを変換できるか、どのフィールドを変換できないかをそれ自体で決定しません。一部のフィールド値では、たとえば記事の本文など、翻訳の必要性が明白になる場合があります。その他の場合、たとえばテキスト、整数、または電子メールアドレスのない画像の場合、通常、翻訳は不要です。それにもかかわらず、Ibexa DXPを使用すると、フィールドタイプに関係なく、任意のフィールドを翻訳可能としてマークすることができます。意味をなさないフィールドの翻訳の可能性を除外するのはあなたの決定だけです。

フィールドに翻訳可能のフラグが設定されていない場合、新しい言語バージョンが作成されるときに、その値が初期/メイン翻訳からコピーされます。このコピーされた値は変更できません。フィールドが翻訳可能である場合、その値を新しい言語バージョンで手動で入力する必要があります。

たとえば、マラソンの出場者とその結果に関する情報を保存する必要があるとします。次のフィールドを使用して「出場者」コンテンツタイプを作成します：名前、写真、年齢、国籍、終了時間。他のフィールドに保存されている値は、競技者の説明に使用されている言語に関係なく同じであるため、国籍以外の翻訳を許可しても意味がありません。言い換えれば、名前、写真、年齢、終了時間は、たとえば英語とノルウェー語の両方で同じになります。

### アクセス制御
ユーザーまたはユーザーグループがコンテンツを翻訳できるかどうかを制御できます。これを行うには、コンテンツの作成または編集を許可するポリシーに[言語制限](https://doc.ibexa.co/en/latest/permissions/limitation_reference/#language-limitation)を追加します。この制限により、どのロールがシステム内のどの言語で機能できるかを定義できます。（パーミッションシステムの詳細については、[アクセス許可](https://doc.ibexa.co/en/latest/permissions/permissions/)を参照）。

さらに、コンテンツ/翻訳ポリシーを使用して、グローバル翻訳リストへのアクセスを制御することもできます。このポリシーにより、ユーザーはグローバル翻訳リストに言語を追加したり、グローバル翻訳リストから言語を削除したりできます。

## 翻訳を処理するための SiteAccesses の使用
それぞれが独自の言語のコンテンツを持つ完全に別個のバージョンのWebサイトが必要な場合は、 [サイトアクセスを使用](https://doc.ibexa.co/en/latest/multisite/languages/languages/#using-siteaccesses-for-handling-translations)できます。Webサイトへのアクセスに使用されるURIに応じて、構成設定で言語が設定された別のサイトが開きます。その後、すべてのコンテンツアイテムがこの言語で表示されます。

詳細については、[多言語 SiteAccesses](https://doc.ibexa.co/en/latest/multisite/set_up_translation_siteaccess/) を参照してください。

### 明示的な翻訳 SiteAccesses
構成は必須ではありませんが、どの SiteAccess が翻訳 SiteAccess と見なされるかを区別するのに役立ちます。

```yaml
ezplatform:
    siteaccess:
        default_siteaccess: eng
        list:
            - site
            - eng
            - fre
            - site_admin

        groups:
            frontend_group:
                - site
                - eng
                - fre

    # ...

    system:
        # Specifying which SiteAccesses are used for translation
        frontend_group:
            translation_siteaccesses: [fre, eng]
        eng:
            languages: [eng-GB]
        fre:
            languages: [fre-FR, eng-GB]
        site:
            languages: [eng-GB]
```

:::note
**Note**
最優先の言語は常にサイトアクセス言語リファレンスを使用します（上記の例では、サイトアクセス `fre` は `fre-FR`）。
:::

複数の翻訳サイトアクセスが同じ言語参照を共有する場合、最初に宣言されたサイトアクセスが常に適用されます。

### カスタムロケール構成
カスタムロケールを使用する必要がある場合、 `ibexa.yaml` で設定し、*変換マップ*に追加することができます。

```yaml
ezplatform:
    # Locale conversion map between eZ Publish format (e.g. fre-FR) to POSIX (e.g. fr_FR).
    # The key is the eZ Publish locale. Check locale.yaml in EzPublishCoreBundle to see natively supported locales.
    locale_conversion:
        eng-DE: en_DE
```

ロケール*変換マップ*の例は、[`ibexa/core` の `locale.yaml` にあります](https://github.com/ibexa/core/blob/main/src/bundle/Core/Resources/config/locale.yml)。


## より複雑な翻訳設定
サイトアクセスが設定（リポジトリ、コンテンツ設定など）を共有する場合がありますが、それらすべてが同じ`translation_siteaccesses` 設定を共有することは望ましくありません 。これは、たとえば、モバイルバージョンのWebサイトに個別のサイトアクセスを使用する場合に当てはまります。

解決策は、新しいグループを定義することです。

```yaml
ezplatform:
    siteaccess:
        default_siteaccess: eng
        list:
            - site
            - eng
            - fre
            - mobile_eng
            - mobile_fre
            - site_admin

        groups:
            # This group can be used for common front settings
            common_group:
                - site
                - eng
                - fre
                - mobile_eng
                - mobile_fre

            frontend_group:
                - site
                - eng
                - fre

            mobile_group:
                - mobile_eng
                - mobile_fre

    # ...

    system:
        # Translation SiteAccesses for regular frontend
        frontend_group:
            translation_siteaccesses: [fre, eng]

        # Translation SiteAccesses for mobile frontend
        mobile_group:
            translation_siteaccesses: [mobile_fre, mobile_eng]

        eng:
            languages: [eng-GB]
        fre:
            languages: [fre-FR, eng-GB]
        site:
            languages: [eng-GB]

        mobile_eng:
            languages: [eng-GB]
        mobile_fre:
            languages: [fre-FR, eng-GB]
```

### 暗黙的に*関連するサイトアクセス*を使用する
`translation_siteaccesses` 設定が指定されていない場合は、 代わりに暗黙的に*関連するサイトアクセス*が使用されます。サイトアクセスは、以下を共有する場合、*関連している*と見なされます。

* 同じリポジトリ
* 同じルート location_id （[マルチサイト](https://doc.ibexa.co/en/latest/multisite/multisite/)を参照）

### フォールバック言語と欠落している翻訳
異なる言語バージョンでサイトアクセスを設定する場合、各サイトアクセスのプリセット言語のリストを指定できます。このサイトアクセスを使用すると、システムはこのリストを調べます。コンテンツアイテムが最初の（優先された）言語で利用できない場合、リスト内の次の言語を使用しようとします。これのおかげで、翻訳が不足している場合にフォールバックすることができます。

デフォルトのコンテンツ可用性フラグをコンテンツタイプ（管理パネルで利用可能）に割り当てることもできます。このフラグが割り当てられると、このタイプのコンテンツアイテムは、現在のサイトアクセス用に構成された言語の言語バージョンがない場合でも使用できます。

優先言語のリストに言語が指定されておらず、それがコンテンツアイテムの最初の言語でない場合、この言語でのこのコンテンツのURLエイリアスは生成されないことに注意してください。