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

ユーザーは自動翻訳のオプションを使用できず、文字列を1つずつ翻訳する必要があります。
ユーザーがWPMLを使用してコンテンツを簡単に翻訳できるように、プラグインやテーマの文字列パッケージを作成する方法を学びます。
文字列パッケージとは、特定のコンテキストで「バンドル」された文字列のグループです。その目的は、各文字列を個別に翻訳する手間を省き、エンドユーザーがコンテンツをより効率的に翻訳できるようにすることです。
たとえば、文字列パッケージを使用する場合と使用しない場合で、ユーザーがカスタムユーザーフィールドをどのように翻訳するかを以下に示します。
このように、文字列パッケージを使用すると、ユーザーが複数のカスタムユーザーフィールドを一度に翻訳できるため、翻訳プロセスが簡素化されます。ユーザーに最適な翻訳エクスペリエンスを提供するには、以下の手順に従って独自の文字列パッケージを作成してください。
以下の手順で説明する文字列パッケージの完全な実装を確認したい場合は、使用したテストプラグインが含まれるこのGitHubリポジトリ (新しいタブで開く)をチェックしてください。
最初のステップは、タイトル、ラベル、ユーザー生成コンテンツなど、ユーザーが翻訳したいコンテンツを特定することです。
次に、パッケージの種類を宣言する必要があります。このステップにより、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」と同じにする必要があります。
次に、パッケージを作成し、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。
最後に、フロントエンドに翻訳を表示するには、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 );