WPML

ユーザーがWPMLを使用してコンテンツを簡単に翻訳できるように、プラグインやテーマの文字列パッケージを作成する方法を学びます。

文字列パッケージとは、特定のコンテキストで「バンドル」された文字列のグループです。その目的は、各文字列を個別に翻訳する手間を省き、エンドユーザーがコンテンツをより効率的に翻訳できるようにすることです。

たとえば、文字列パッケージを使用する場合と使用しない場合で、ユーザーがカスタムユーザーフィールドをどのように翻訳するかを以下に示します。

文字列パッケージを使用しない場合

WPML → 翻訳 → 文字列での、個別の文字列としての4つのフィールド
WPML → 翻訳 → 文字列での、個別の文字列としての4つのフィールド

ユーザーは自動翻訳のオプションを使用できず、文字列を1つずつ翻訳する必要があります。

文字列パッケージを使用する場合

翻訳ダッシュボードでの、1つのパッケージとしての同じ4つのフィールド
翻訳ダッシュボードでの、1つのパッケージとしての同じ4つのフィールド

ユーザーは自動翻訳のオプションを使用して、複数の文字列を一度にまとめて翻訳できます。

このように、文字列パッケージを使用すると、ユーザーが複数のカスタムユーザーフィールドを一度に翻訳できるため、翻訳プロセスが簡素化されます。ユーザーに最適な翻訳エクスペリエンスを提供するには、以下の手順に従って独自の文字列パッケージを作成してください。

以下の手順で説明する文字列パッケージの完全な実装を確認したい場合は、使用したテストプラグインが含まれるこのGitHubリポジトリ (新しいタブで開く)をチェックしてください。

1. 翻訳可能なコンテンツの特定

最初のステップは、タイトル、ラベル、ユーザー生成コンテンツなど、ユーザーが翻訳したいコンテンツを特定することです。

2. パッケージの種類の宣言

次に、パッケージの種類を宣言する必要があります。このステップにより、WPMLはアクティブなプラグインに接続されている文字列パッケージを検出し、それらのパッケージのみを翻訳できるようになります。

比較として、このフィルターは、register_post_typesフィルターが投稿タイプに対して機能するのと同じように文字列パッケージに対して機能します。

パッケージの種類を宣言するには、wpml_active_string_package_kinds (新しいタブで開く)フィルターを使用します。

define( 'FOO_USER_FIELD_PACKAGE_KIND_TITLE', 'OTGS Foo User Fields' );

define( 'FOO_USER_FIELD_PACKAGE_KIND_SLUG', 'otgs-foo-user-fields' );

add_filter( 'wpml_active_string_package_kinds', function( $kinds ) {

   $kinds[ FOO_USER_FIELD_PACKAGE_KIND_SLUG ] = [

            'title'  => FOO_USER_FIELD_PACKAGE_KIND_TITLE,

            'slug'   => FOO_USER_FIELD_PACKAGE_KIND_SLUG,

            'plural' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,

    ];

    return $kinds;

} );
引数の定義

title – 種類のタイトル。パッケージの「kind」と同じにする必要があります。
plural – タイトルの複数形。
slug – 種類のスラッグ。パッケージの「kind_slug」と同じにする必要があります。

3. パッケージの作成と文字列の登録

次に、パッケージを作成し、wpml_register_string (新しいタブで開く)フックを使用してグループ化する文字列を登録する必要があります。

$userId = 123;

$user   = get_user_by( 'id', $userId );

$package = [

    'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

    'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

    'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

    'title'     => $user->display_name, // The title for the package entity inside the "kind" namespace.

];

$fooUserFields = get_option( 'otgs_foo_user_fields' );

foreach ( $fooUserFields as $fooUserField ) {

$fieldValue = get_user_meta( $userId, $fooUserField, true );

do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );

}
引数の定義

$kind – エンティティの名前空間ラベル(例:Gravity Form)。
$kind_slug – エンティティの名前空間スラッグ(例:gravity-form)。省略した場合は、「kind」のスラッグ版になります。
$name – 種類内におけるエンティティの一意の識別子。文字列(例:スラッグ)または整数(例:ID)を使用できます。
$title – 種類内におけるエンティティのタイトル。実際のエンティティのタイトルを使用することをお勧めします。

必須ではありませんが、次の2つの追加引数を含めることもできます。
$edit_link – オブジェクトを編集するためのURL。
$view_link – オブジェクトを表示するためのURL。

4. 翻訳の取得

最後に、フロントエンドに翻訳を表示するには、wpml_translate_string (新しいタブで開く)フックを使用する必要があります。

$userId = 123;

$user   = get_user_by( 'id', $userId );

$package = [

        'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

        'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

        'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

        'title'     => $user->display_name, // The title for the package entity inside the "kind" namespace.

];

$fooUserFields = get_option( 'otgs_foo_user_fields' );

$translatedFieldValues = [];

foreach ( $fooUserFields as $fooUserField ) {

    $fieldValue              = get_user_meta( $userId, $fooUserField, true );

    $translatedFieldValues[ $fooUserField ] = apply_filters( 'wpml_translate_string', $fieldValue, sanitize_key( $fooUserField ), $package );

}

文字列の更新と削除

ユーザーがコンテンツを更新するたびに、WPMLは新しい文字列と削除された文字列を識別できる必要があります。WPMLにこれらの変更を通知するには、登録コードを以下の2つの関数でラップします。

$userId = 123;

$package = [

        'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

        'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

        'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

        // The 'title' key is not not required in the "translate" context.

];

do_action( 'wpml_start_string_package_registration', $package );

$fooUserFields = get_option( 'otgs_foo_user_fields' );

foreach ( $fooUserFields as $fooUserField ) {

    $fieldValue = get_user_meta( $userId, $fooUserField, true );

    do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );

}

do_action( 'wpml_delete_unused_package_strings',$package );

文字列パッケージの削除

ユーザーがコンテンツを削除した場合は、関連する文字列パッケージも削除する必要があります。これには、関連するすべての文字列、翻訳、およびジョブが含まれます。このクリーンアップを行うことで、データベースに不要なデータが残らず、サイトの効率が維持されます。

文字列パッケージを削除するには、プラグインまたはテーマ内の適切なアクションにフックし、wpml_delete_package (新しいタブで開く)関数を呼び出します。

$userId = 123;

do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_SLUG );

追加リソース

  • WPML言語設定ファイル – プラグインやテーマでWPMLが翻訳すべきテキストを指定するファイル、wpml-config.xmlの使用に関するガイドです。
  • Multilingual Tools – 設定をテストし、WPMLとの互換性を確認するためのツールです。

執筆者:Amir