Sin un paquete de cadenas

Los usuarios tienen que traducir las cadenas una por una, sin la opción de traducción automática.
Aprenda a crear paquetes de cadenas para sus plugins y temas con el fin de ayudar a los usuarios a traducir contenido fácilmente con WPML.
Los paquetes de cadenas son grupos de cadenas «empaquetados» juntos en un contexto específico. Su propósito es ayudar a los usuarios finales a traducir el contenido de manera más eficiente al eliminar la necesidad de traducir cada cadena individualmente.
Por ejemplo, así es como los usuarios traducirían campos personalizados de usuario, con y sin un paquete de cadenas:
Como puede ver, los paquetes de cadenas simplifican el proceso de traducción al permitir a los usuarios traducir varios campos personalizados de usuario a la vez. Para ofrecer a sus usuarios la mejor experiencia de traducción, siga los pasos a continuación para crear sus propios paquetes de cadenas.
Si quiere ver la implementación completa del paquete de cadenas que cubrimos en los pasos a continuación, consulte este repositorio de GitHub (se abre en una pestaña nueva) que contiene el plugin de prueba que utilizamos.
El primer paso es identificar el contenido que los usuarios querrán traducir, como títulos, etiquetas y contenido generado por el usuario.
A continuación, debe declarar el tipo de paquete. Este paso ayuda a WPML a detectar qué paquetes de cadenas están conectados a los plugins activos, y a traducir solo esos paquetes.
A modo de comparación, este filtro funciona para los paquetes de cadenas al igual que el filtro register_post_types funciona para los tipos de contenido.
Para declarar un tipo de paquete, use el filtro wpml_active_string_package_kinds (se abre en una pestaña nueva):
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 – el título del tipo, debe ser el mismo que el tipo para los paquetes.plural – la forma plural del título.slug – el slug del tipo, debe ser el mismo que el kind_slug para los paquetes.
A continuación, debe crear un paquete y registrar las cadenas que va a agrupar usando el hook wpml_register_string (se abre en una pestaña nueva):
$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 – la etiqueta del espacio de nombres de la entidad (por ejemplo, Gravity Form).$kind_slug – el slug del espacio de nombres de la entidad (por ejemplo, gravity-form). Si falta, será una versión en formato slug del «tipo».$name – el identificador único de la entidad dentro del tipo, puede ser una cadena (por ejemplo, un slug) o un número entero (por ejemplo, un ID).$title – el título de la entidad dentro del tipo. Se recomienda usar el título de la entidad real.
Aunque no es necesario, también puede incluir dos argumentos adicionales:$edit_link – una URL para editar el objeto.$view_link – una URL para ver el objeto.
Por último, para mostrar las traducciones en el front-end, debe usar el hook wpml_translate_string (se abre en una pestaña nueva):
$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 );
}
Cada vez que los usuarios actualizan el contenido, WPML debe poder identificar las nuevas cadenas, así como las que se eliminaron. Para notificar a WPML de estos cambios, envuelva su código de registro con dos funciones:
wpml_start_string_package_registration (se abre en una pestaña nueva)wpml_delete_unused_package_strings (se abre en una pestaña nueva)
$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 );
Cuando los usuarios eliminan contenido, usted también debe eliminar su paquete de cadenas asociado. Esto incluye todas las cadenas, traducciones y trabajos relacionados. Al hacer esta limpieza, se asegura de que el sitio siga siendo eficiente sin que queden datos sobrantes que saturen la base de datos.
Para eliminar un paquete de cadenas, utilice un hook en una acción adecuada dentro de su plugin o tema y llame a la función wpml_delete_package (se abre en una pestaña nueva):
$userId = 123; do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_SLUG );